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
00039
00040
00046
#ifndef CCXX_TOKENIZER_H_
00047
#define CCXX_TOKENIZER_H_
00048
00049
#ifndef CCXX_MISSING_H_
00050
#include <cc++/missing.h>
00051
#endif
00052
00053
#ifndef CCXX_THREAD_H_
00054
#include <cc++/thread.h>
00055
#endif
00056
00057
#ifdef CCXX_NAMESPACES
00058
namespace ost {
00059
#endif
00060
00104
class __EXPORT StringTokenizer {
00105 public:
00111
static const char *
const SPACE;
00112
00122
00123
class NoSuchElementException { };
00124
00129
class __EXPORT iterator {
00130 friend class StringTokenizer;
00131
private:
00132
const StringTokenizer *myTok;
00133
const char *start;
00134
const char *tokEnd;
00135
const char *endp;
00136
char *token;
00137
00138
00139 iterator(
const StringTokenizer &tok,
const char *end)
00140 : myTok(&tok),tokEnd(0),endp(end),token(0) {}
00141
00142 iterator(
const StringTokenizer &tok)
00143 : myTok(&tok),tokEnd(0),endp(myTok->str-1),token(0) {
00144 ++(*this);
00145 }
00146
00147
public:
00148 iterator() : myTok(0),start(0),tokEnd(0),endp(0),token(0) {}
00149
00150
00151
virtual ~iterator() {
if (token) *token=
'\0';
delete [] token; }
00152
00156
00157 iterator(
const iterator& i) :
00158 myTok(i.myTok),start(i.start),tokEnd(i.tokEnd),
00159 endp(i.endp),token(0) {}
00160
00164
00165 iterator &operator = (
const iterator &i) {
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 }
00198
00203
00204
inline bool operator == (
const iterator &other)
const {
00205 return (endp == other.
endp);
00206 }
00207
00212
00213
inline bool operator != (
const iterator &other)
const {
00214 return (endp != other.
endp);
00215 }
00216 };
00217
private:
00218
friend class StringTokenizer::iterator;
00219
const char *str;
00220
const char *delim;
00221
bool skipAll, trim;
00222 iterator itEnd;
00223
00224
public:
00263 StringTokenizer (
const char *str,
00264
const char *delim,
00265
bool skipAllDelim =
false,
00266
bool trim =
false);
00267
00277 StringTokenizer (
const char *s);
00278
00282 iterator begin()
const {
00283 return iterator(*
this);
00284 }
00285
00290
void setDelimiters (
const char *d) {
00291 delim = d;
00292 }
00293
00298 iterator begin(
const char *d) {
00299 delim = d;
00300
return iterator(*
this);
00301 }
00302
00306
const iterator& end()
const {
return itEnd; }
00307 };
00308
00309
#ifdef CCXX_NAMESPACES
00310
}
00311
#endif
00312
00313
#endif
00314