1 #ifndef UTIL_SPLITTER_H
2 #define UTIL_SPLITTER_H
5 #include "util_string.h"
10 uiterator t; // 区切り文字列先頭
11 uiterator u; // 区切り文字列末尾
14 Splitter (uiterator _begin, uiterator _end) {
18 virtual ~Splitter () {};
20 virtual bool isEnd () {
23 virtual uiterator begin () {
26 virtual uiterator end () {
29 virtual ustring pre () {
30 return ustring (b, t);
32 virtual size_t preSize () {
35 virtual uiterator matchBegin () {
38 virtual uiterator matchEnd () {
41 virtual uiterator eol () {
44 virtual void rewind (int i) {
52 virtual void shiftCursor () {
55 virtual bool next () = 0;
56 virtual bool nextSep () = 0;
59 class SplitterRe: public Splitter {
64 SplitterRe (const ustring& text, uregex& _re): Splitter (text.begin (), text.end ()) {
67 SplitterRe (uiterator _begin, uiterator _end, uregex& _re): Splitter (_begin, _end) {
70 virtual ~SplitterRe () {};
72 virtual bool next () {
75 if (usearch (b, e, m, *re)) {
87 virtual bool nextSep () {
90 if (usearch (b, e, m, *re)) {
103 virtual bool match (int index) {
104 return (t != u && m[index].matched);
106 virtual uiterator matchBegin () {
109 virtual uiterator matchEnd () {
112 virtual uiterator matchBegin (int index) {
113 return m[index].first;
115 virtual uiterator matchEnd (int index) {
116 return m[index].second;
118 virtual bool nextSearch () {
120 if (usearch (u, e, m, *re)) {
137 class SplitterCh: public Splitter {
141 SplitterCh (uiterator _begin, uiterator _end, int _ch): Splitter (_begin, _end) {
144 SplitterCh (const ustring& text, int _ch): Splitter (text.begin (), text.end ()) {
147 virtual ~SplitterCh () {};
149 virtual bool next () {
152 if (findChar (t, e, ch)) {
162 virtual bool nextSep () {
165 if (findChar (t, e, ch)) {
179 class SplitterChars: public Splitter {
183 SplitterChars (uiterator _begin, uiterator _end, const ustring& _pat): Splitter (_begin, _end) {
186 SplitterChars (const ustring& text, const ustring& _pat): Splitter (text.begin (), text.end ()) {
189 virtual ~SplitterChars () {};
191 virtual bool next () {
194 if (findChars (t, e, pattern)) {
204 virtual bool nextSep () {
207 if (findChars (t, e, pattern)) {
221 class SplitterFn: public Splitter {
223 bool (*fn) (uiterator&, uiterator, uiterator&);
225 SplitterFn (uiterator _begin, uiterator _end, bool (*_fn)(uiterator&, uiterator, uiterator&)): Splitter (_begin, _end) {
228 SplitterFn (const ustring& text, bool (*_fn)(uiterator&, uiterator, uiterator&)): Splitter (text.begin (), text.end ()) {
231 virtual ~SplitterFn () {};
233 virtual bool next () {
242 virtual bool nextSep () {
253 class SplitterNL: public Splitter {
255 SplitterNL (uiterator _begin, uiterator _end): Splitter (_begin, _end) {};
256 SplitterNL (const ustring& text): Splitter (text.begin (), text.end ()) {};
257 virtual ~SplitterNL () {};
259 virtual bool next () {
268 virtual bool nextSep () {
271 return findNL (t, e, u);
279 #endif /* UTIL_SPLITTER_H */