00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00043 #ifndef CCXX_TOKENIZER_H_
00044 #define CCXX_TOKENIZER_H_
00045
00046 #ifndef CCXX_MISSING_H_
00047 #include <cc++/missing.h>
00048 #endif
00049
00050 #ifndef CCXX_THREAD_H_
00051 #include <cc++/thread.h>
00052 #endif
00053
00054 #ifdef CCXX_NAMESPACES
00055 namespace ost {
00056 #endif
00057
00101 class __EXPORT StringTokenizer {
00102 public:
00108 static const char * const SPACE;
00109
00119
00120 class NoSuchElementException { };
00121
00126 class __EXPORT iterator {
00127 friend class StringTokenizer;
00128 private:
00129 const StringTokenizer *myTok;
00130 const char *start;
00131 const char *tokEnd;
00132 const char *endp;
00133 char *token;
00134
00135
00136 iterator(const StringTokenizer &tok, const char *end)
00137 : myTok(&tok),tokEnd(0),endp(end),token(0) {}
00138
00139 iterator(const StringTokenizer &tok)
00140 : myTok(&tok),tokEnd(0),endp(myTok->str-1),token(0) {
00141 ++(*this);
00142 }
00143
00144 public:
00145 iterator() : myTok(0),start(0),tokEnd(0),endp(0),token(0) {}
00146
00147
00148 virtual ~iterator() { if (token) *token='\0'; delete [] token; }
00149
00153
00154 iterator(const iterator& i) :
00155 myTok(i.myTok),start(i.start),tokEnd(i.tokEnd),
00156 endp(i.endp),token(0) {}
00157
00161
00162 iterator &operator = (const iterator &i) {
00163 myTok = i.myTok;
00164 start = i.start; endp = i.endp; tokEnd = i.tokEnd;
00165 if ( token )
00166 delete [] token;
00167 token = 0;
00168 return *this;
00169 }
00170
00174 iterator &operator ++ () THROWS (NoSuchElementException);
00175
00184 const char* operator * () THROWS (NoSuchElementException);
00185
00192 inline char nextDelimiter() const {
00193 return (tokEnd) ? *tokEnd : '\0';
00194 }
00195
00200
00201 inline bool operator == (const iterator &other) const {
00202 return (endp == other.endp);
00203 }
00204
00209
00210 inline bool operator != (const iterator &other) const {
00211 return (endp != other.endp);
00212 }
00213 };
00214 private:
00215 friend class StringTokenizer::iterator;
00216 const char *str;
00217 const char *delim;
00218 bool skipAll, trim;
00219 iterator itEnd;
00220
00221 public:
00260 StringTokenizer (const char *str,
00261 const char *delim,
00262 bool skipAllDelim = false,
00263 bool trim = false);
00264
00274 StringTokenizer (const char *s);
00275
00279 iterator begin() const {
00280 return iterator(*this);
00281 }
00282
00287 void setDelimiters (const char *d) {
00288 delim = d;
00289 }
00290
00295 iterator begin(const char *d) {
00296 delim = d;
00297 return iterator(*this);
00298 }
00299
00303 const iterator& end() const { return itEnd; }
00304 };
00305
00306 #ifdef CCXX_NAMESPACES
00307 }
00308 #endif
00309
00310 #endif
00311