00001 #ifndef TOKENITERATOR_H
00002 #define TOKENITERATOR_H
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 #if _MSC_VER > 1000
00031 #pragma once
00032 #endif // _MSC_VER > 1000
00033
00034 #include <iterator>
00035 #include <string>
00036
00037 template<class TFinder>
00038 class TokenIter : public std::iterator<std::input_iterator_tag,
00039 std::string>
00040 {
00041 public:
00042 static const char EndOfString;
00043 static const TokenIter<TFinder> EOS;
00044
00045 TokenIter() : start(&EndOfString), end(&EndOfString), length(0)
00046 {}
00047
00048 TokenIter(const char* str, TFinder finder = TFinder())
00049 : findToken(finder), end(str)
00050 { length = findToken(start, end); }
00051
00052 TokenIter(const std::string str, TFinder finder = TFinder())
00053 : findToken(finder), end(str.c_str())
00054 { length = findToken(start, end); }
00055
00056 TokenIter& operator=(const char* const str)
00057 { end = str; length = findToken(start, end); return *this; }
00058
00059 TokenIter& operator=(const std::string str)
00060 {
00061 end = str.c_str(); length = findToken(start, end);
00062 return *this;
00063 }
00064
00065 std::string operator*() const
00066 { return std::string(start, length); }
00067
00068 bool operator == (TokenIter rhs) const
00069 {
00070 bool retv(false);
00071 if (*start == *rhs.start)
00072 if (*start == EndOfString || start == rhs.start)
00073 retv = true;
00074 return retv;
00075 }
00076
00077 bool operator != (TokenIter rhs) const
00078 { return !operator==(rhs); }
00079
00080 TokenIter& operator ++ ()
00081 { length = findToken(start, end); return *this; }
00082
00083 TokenIter& operator ++ (int)
00084 {
00085 TokenIter retv(*this);
00086 length = findToken(start, end);
00087 return retv;
00088 }
00089
00090 private:
00091 TFinder findToken;
00092 const char* start;
00093 const char* end;
00094 size_t length;
00095 };
00096
00097
00098
00099 template<typename TFinder>
00100 const char TokenIter<TFinder>::EndOfString = '\0';
00101
00102
00103
00104
00105 template<typename TFinder>
00106 const TokenIter<TFinder> TokenIter<TFinder>::EOS;
00107
00108 #endif // #ifndef TOKENITERATOR_H
00109
00110