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()
00149 { if (token) *token='\0'; delete [] token; }
00150
00154
00155 iterator(const iterator& i) :
00156 myTok(i.myTok),start(i.start),tokEnd(i.tokEnd),
00157 endp(i.endp),token(0) {}
00158
00162
00163 iterator &operator = (const iterator &i)
00164 {
00165 myTok = i.myTok;
00166 start = i.start; endp = i.endp; tokEnd = i.tokEnd;
00167 if ( token )
00168 delete [] token;
00169 token = 0;
00170 return *this;
00171 }
00172
00176 iterator &operator ++ () THROWS (NoSuchElementException);
00177
00186 const char* operator * () THROWS (NoSuchElementException);
00187
00194 inline char nextDelimiter() const
00195 {return (tokEnd) ? *tokEnd : '\0';}
00196
00201
00202 inline bool operator == (const iterator &other) const
00203 {return (endp == other.endp);}
00204
00209
00210 inline bool operator != (const iterator &other) const
00211 {return (endp != other.endp);}
00212 };
00213 private:
00214 friend class StringTokenizer::iterator;
00215 const char *str;
00216 const char *delim;
00217 bool skipAll, trim;
00218 iterator itEnd;
00219
00220 public:
00259 StringTokenizer (const char *str,
00260 const char *delim,
00261 bool skipAllDelim = false,
00262 bool trim = false);
00263
00273 StringTokenizer (const char *s);
00274
00278 iterator begin() const
00279 {return iterator(*this);}
00280
00285 void setDelimiters (const char *d)
00286 {delim = d;}
00287
00292 iterator begin(const char *d)
00293 {
00294 delim = d;
00295 return iterator(*this);
00296 }
00297
00301 const iterator& end() const
00302 {return itEnd;}
00303 };
00304
00305 #ifdef CCXX_NAMESPACES
00306 }
00307 #endif
00308
00309 #endif
00310