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 <ost/module_config.hh>
00031
00032
00033 namespace ost {
00034
00038 class DLLEXPORT_OST_BASE StringRef {
00039 public:
00040
00041 typedef char* iterator;
00042 typedef const char* const_iterator;
00043 typedef char value_type;
00044
00045 StringRef(const char* begin, size_t len): begin_(begin), end_(begin+len) { }
00046 StringRef(): begin_(NULL), end_(NULL) { }
00047
00048
00049 const char* begin() const { return begin_; }
00050 const char* end() const { return end_; }
00051 const char* data() const { return begin_; }
00052
00053 size_t size() const { return end_-begin_; }
00054 size_t length() const { return this->size(); }
00055
00056 char front() const
00057 {
00058 assert(!this->empty());
00059 return *begin_;
00060 }
00061
00062 const_iterator find(char p) const {
00063 const char* s=begin_;
00064 while (s!=end_) {
00065 if (*s==p) {
00066 return s;
00067 }
00068 ++s;
00069 }
00070 return s;
00071 }
00072 StringRef substr(size_t pos, size_t n=std::string::npos) const
00073 {
00074 if (n==std::string::npos) {
00075 assert(pos>=0 && begin_+pos<=end_);
00076 return StringRef(begin_+pos, this->length()-pos);
00077 } else {
00078 assert(pos>=0 && begin_+pos+n<=end_);
00079 return StringRef(begin_+pos, n);
00080 }
00081 }
00082 std::string str() const
00083 {
00084 return std::string(begin_, end_-begin_);
00085 }
00086 char back() const
00087 {
00088 assert(!this->empty());
00089 return *(end_-1);
00090 }
00091
00092 const char& operator[](int index) const { return begin_[index]; }
00093
00094 bool operator==(const StringRef& rhs) const {
00095 return this->length()==rhs.length() &&
00096 !memcmp(rhs.data(), this->data(), this->size());
00097 }
00098
00099 bool operator!=(const StringRef& rhs) const {
00100 return !this->operator==(rhs);
00101 }
00103 StringRef rtrim() const {
00104 const char* s=end_;
00105 while(--s>begin_ && isspace(*s)) {
00106 }
00107 return StringRef(begin_, s+1-begin_);
00108 }
00110 StringRef ltrim() const {
00111 const char* s=begin_;
00112 while(s<end_ && isspace(*s)) {
00113 ++s;
00114 }
00115 return StringRef(s, end_-s);
00116 }
00118 StringRef trim() const {
00119 return this->rtrim().ltrim();
00120 }
00121
00126 std::pair<bool, int> to_int() const;
00127
00132 std::pair<bool, float> to_float() const;
00133
00134 bool empty() const { return begin_==end_; }
00135
00136 private:
00137 const char* begin_;
00138 const char* end_;
00139
00140
00141 };
00142
00143
00144 DLLEXPORT_OST_BASE std::ostream& operator<<(std::ostream& stream, const StringRef& strref);
00145
00146 }
00147 #endif