00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef OST_STRING_REF_HH
00020 #define OST_STRING_REF_HH
00021
00022
00023
00024
00025 #include <ctype.h>
00026 #include <cassert>
00027 #include <iostream>
00028 #include <ost/base.hh>
00029 #include <string.h>
00030 #include <vector>
00031 #include <ost/module_config.hh>
00032
00033
00034 namespace ost {
00035
00039 class DLLEXPORT_OST_BASE StringRef {
00040 public:
00041
00042 typedef char* iterator;
00043 typedef const char* const_iterator;
00044 typedef char value_type;
00045
00046 StringRef(const char* begin, size_t len): begin_(begin), end_(begin+len) { }
00047 StringRef(): begin_(NULL), end_(NULL) { }
00048
00049
00050 const char* begin() const { return begin_; }
00051 const char* end() const { return end_; }
00052 const char* data() const { return begin_; }
00053
00054 size_t size() const { return end_-begin_; }
00055 size_t length() const { return this->size(); }
00056
00057 char front() const
00058 {
00059 assert(!this->empty());
00060 return *begin_;
00061 }
00062
00065 const_iterator find(char p) const {
00066 const char* s=begin_;
00067 while (s!=end_) {
00068 if (*s==p) {
00069 return s;
00070 }
00071 ++s;
00072 }
00073 return s;
00074 }
00075
00084 StringRef substr(size_t pos, size_t n=std::string::npos) const
00085 {
00086 if (n==std::string::npos) {
00087 assert(begin_+pos<=end_);
00088 return StringRef(begin_+pos, this->length()-pos);
00089 } else {
00090 assert(begin_+pos+n<=end_);
00091 return StringRef(begin_+pos, n);
00092 }
00093 }
00094 std::string str() const
00095 {
00096 return std::string(begin_, end_-begin_);
00097 }
00098 char back() const
00099 {
00100 assert(!this->empty());
00101 return *(end_-1);
00102 }
00103
00104 const char& operator[](int index) const { return begin_[index]; }
00105
00106 bool operator==(const StringRef& rhs) const {
00107 return this->length()==rhs.length() &&
00108 !memcmp(rhs.data(), this->data(), this->size());
00109 }
00110
00111 bool operator!=(const StringRef& rhs) const {
00112 return !this->operator==(rhs);
00113 }
00115 StringRef rtrim() const {
00116 const char* s=end_;
00117 while(--s>begin_ && isspace(*s)) {
00118 }
00119 return StringRef(begin_, s+1-begin_);
00120 }
00122 StringRef ltrim() const {
00123 const char* s=begin_;
00124 while(s<end_ && isspace(*s)) {
00125 ++s;
00126 }
00127 return StringRef(s, end_-s);
00128 }
00130 StringRef trim() const {
00131 return this->rtrim().ltrim();
00132 }
00133
00138 std::pair<bool, int> to_int() const;
00139
00144 std::pair<bool, float> to_float() const;
00145
00146 bool empty() const { return begin_==end_; }
00147
00149 std::vector<StringRef> split(char p) const;
00150
00152 std::vector<StringRef> split() const;
00153
00156 std::string str_no_whitespace() const;
00157 private:
00158 const char* begin_;
00159 const char* end_;
00160
00161 };
00162
00163
00164 DLLEXPORT_OST_BASE std::ostream& operator<<(std::ostream& stream, const StringRef& strref);
00165
00166 }
00167 #endif