acme
Foundational cross-platform layer of the ca2 framework
Loading...
Searching...
No Matches
tokenizer.h
1#pragma once
2
3
4class CLASS_DECL_ACME tokenizer :
5 public ::ansi_range
6{
7public:
8
9
10 using RANGE = ::ansi_range;
11 using const_iterator = RANGE::const_iterator;
12
13
14 const_iterator m_iterator;
15
16
17 tokenizer():m_iterator(nullptr) {}
18 tokenizer(const tokenizer & range) : ansi_range(range) {}
19 tokenizer(tokenizer && range) : ansi_range(::transfer(range)) { }
20 tokenizer(const ::const_ansi_range & range) :
21 RANGE(range), m_iterator(range.begin())
22 {}
23 ~tokenizer() {}
24
25
26 tokenizer & operator = (const tokenizer & tokenizer)
27 {
28
29 ::ansi_range::operator=(tokenizer);
30
31 return *this;
32
33 }
34
35
36 tokenizer & operator = (tokenizer && tokenizer)
37 {
38
39 ::ansi_range::operator=(::transfer(tokenizer));
40
41 return *this;
42
43 }
44
45
46 const_iterator find(const ::scoped_string & scopedstrSeparator) const
47 {
48
49 auto iterator = (*this)(m_iterator).find(scopedstrSeparator, ::comparison::comparison < ::ansi_character >());
50
51 return iterator;
52
53 }
54
55
56 ::string & substring(::string & str, character_count count)
57 {
58
59 str.assign(m_iterator, count);
60
61 return str;
62
63 }
64
65
66 ::string & substring(::string & str, const_iterator iterator)
67 {
68
69 str.assign(m_iterator, iterator);
70
71 return str;
72
73 }
74
75
76 ::string & substring(::string & str)
77 {
78
79 str.assign(m_iterator, m_end - m_iterator);
80
81 return str;
82
83 }
84
85
86 template < prototype_range RANGE >
87 RANGE & substring(RANGE & range, character_count count)
88 {
89
90 range.begin() = m_iterator;
91
92 range.end() = range.begin() + count;
93
94 return range;
95
96 }
97
98
99 template < prototype_range RANGE >
100 RANGE & substring(RANGE & range, const_iterator iterator)
101 {
102
103 range.begin() = m_iterator;
104
105 range.end() = iterator;
106
107 return range;
108
109 }
110
111
112 template < prototype_range RANGE >
113 RANGE & substring(RANGE & range)
114 {
115
116 range.begin() = m_iterator;
117
118 range.end() = this->end();
119
120 return range;
121
122 }
123
124
125 bool ReadLine(::string & str, bool bWithSeparator = false);
126 bool _01Read(::i32 & i);
127 bool _01Read(::u32 & user);
128 bool _01ReadHex(::i32 & i);
129 bool _01ReadHex(::u32 & user);
130
131 bool _01Read(::string & str);
132 bool ExtractFolderPath(const ::scoped_string & scopedstrFilePath);
133
134 void reset() { m_iterator = this->begin(); }
135
136 void reset(const ::const_ansi_range & range) { RANGE::operator = (range); reset(); }
137
138 bool get_next_token(::string & strToken, const ::scoped_string & scopedstrSeparator, bool bWithSeparator = false);
139
140 bool get_next_smallest_token(::string & strToken, const ::string_array_base & straSeparator, bool bWithSeparator = false);
141
142 bool get_next_token_ex(::string & strToken, const ::scoped_string & scopedstrSeparator, bool bWithSeparator = false, bool bSkipAdjacent = false);
143
144 bool _001GetNextToken(::string & strToken);
145
146 bool get_next_word(::string * pstrToken = nullptr);
147
148 character_count read(void* p, character_count s)
149 {
150
151 auto iRead = minimum(s, this->m_end - m_iterator);
152
153 ::memory_copy(p, m_iterator, iRead);
154
155 m_iterator += iRead;
156
157 return iRead;
158
159 }
160
161
162 template < prototype_range RANGE >
163 bool get_line(RANGE & rangeLine)
164 {
165
166 if (::is_end(m_iterator, this->end()))
167 {
168
169 return false;
170
171 }
172
173 const_iterator iteratorR = find("\r");
174
175 const_iterator iteratorN = find("\n");
176
177 if (::is_ok(iteratorR, this->end()))
178 {
179
180 if (::is_ok(iteratorN, this->end()))
181 {
182
183 if (iteratorR < iteratorN)
184 {
185
186 if (iteratorR + 1 == iteratorN)
187 {
188
189 substring(rangeLine, iteratorR);
190
191 m_iterator = iteratorN + 1;
192
193 }
194 else
195 {
196
197 substring(rangeLine, iteratorR);
198
199 m_iterator = iteratorR + 1;
200
201 }
202
203 }
204 else
205 {
206
207 // '\n' < '\r'
208
209 substring(rangeLine, iteratorN);
210
211 m_iterator = iteratorN + 1;
212
213 }
214
215 }
216 else
217 {
218
219 substring(rangeLine, iteratorR);
220
221 m_iterator = iteratorR + 1;
222
223 }
224
225 }
226 else if (::is_ok(iteratorN, this->end()))
227 {
228
229 substring(rangeLine, iteratorN);
230
231 m_iterator = iteratorN + 1;
232
233 }
234 else
235 {
236
237 substring(rangeLine);
238
239 m_iterator = end();
240
241 }
242
243 return true;
244
245 }
246
247 ::collection::count skip_word(::collection::count c);
248
249 ::string get_word();
250
251 bool get_word(::string & str);
252
253
254};
255
256
Definition range.h:223
Created by camilo on 2026-05-28 12:34 <3ThomasBorregaardSørensen!! Mummi!! Bilbo!!
Definition _.h:67
Definition std_iterator.h:49