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
00038
00044 #ifndef CCXX_TOKENIZER_H_
00045 #define CCXX_TOKENIZER_H_
00046
00047 #ifndef CCXX_MISSING_H_
00048 #include <cc++/missing.h>
00049 #endif
00050
00051 #ifndef CCXX_THREAD_H_
00052 #include <cc++/thread.h>
00053 #endif
00054
00055 #ifdef CCXX_NAMESPACES
00056 namespace ost {
00057 #endif
00058
00102 class __EXPORT StringTokenizer {
00103 public:
00109 static const char * const SPACE;
00110
00120
00121 class NoSuchElementException { };
00122
00127 class __EXPORT iterator {
00128 friend class StringTokenizer;
00129 private:
00130 const StringTokenizer *myTok;
00131 const char *start;
00132 const char *tokEnd;
00133 const char *endp;
00134 char *token;
00135
00136
00137 iterator(const StringTokenizer &tok, const char *end)
00138 : myTok(&tok),tokEnd(0),endp(end),token(0) {}
00139
00140 iterator(const StringTokenizer &tok)
00141 : myTok(&tok),tokEnd(0),endp(myTok->str-1),token(0) {
00142 ++(*this);
00143 }
00144
00145 public:
00146 iterator() : myTok(0),start(0),tokEnd(0),endp(0),token(0) {}
00147
00148
00149 virtual ~iterator()
00150 { if (token) *token='\0'; delete [] token; }
00151
00155
00156 iterator(const iterator& i) :
00157 myTok(i.myTok),start(i.start),tokEnd(i.tokEnd),
00158 endp(i.endp),token(0) {}
00159
00163
00164 iterator &operator = (const iterator &i)
00165 {
00166 myTok = i.myTok;
00167 start = i.start; endp = i.endp; tokEnd = i.tokEnd;
00168 if ( token )
00169 delete [] token;
00170 token = 0;
00171 return *this;
00172 }
00173
00177 iterator &operator ++ () THROWS (NoSuchElementException);
00178
00187 const char* operator * () THROWS (NoSuchElementException);
00188
00195 inline char nextDelimiter() const
00196 {return (tokEnd) ? *tokEnd : '\0';}
00197
00202
00203 inline bool operator == (const iterator &other) const
00204 {return (endp == other.endp);}
00205
00210
00211 inline bool operator != (const iterator &other) const
00212 {return (endp != other.endp);}
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
00286 void setDelimiters (const char *d)
00287 {delim = d;}
00288
00293 iterator begin(const char *d)
00294 {
00295 delim = d;
00296 return iterator(*this);
00297 }
00298
00302 const iterator& end() const
00303 {return itEnd;}
00304 };
00305
00306 #ifdef CCXX_NAMESPACES
00307 }
00308 #endif
00309
00310 #endif
00311