Chris@16
|
1 /*=============================================================================
|
Chris@16
|
2 Copyright (c) 2001-2003 Joel de Guzman
|
Chris@16
|
3 Copyright (c) 2001-2003 Daniel Nuffer
|
Chris@16
|
4 http://spirit.sourceforge.net/
|
Chris@16
|
5
|
Chris@16
|
6 Use, modification and distribution is subject to the Boost Software
|
Chris@16
|
7 License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
8 http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
9 =============================================================================*/
|
Chris@16
|
10 #ifndef BOOST_XPRESSIVE_SPIRIT_BASIC_CHSET_IPP
|
Chris@16
|
11 #define BOOST_XPRESSIVE_SPIRIT_BASIC_CHSET_IPP
|
Chris@16
|
12
|
Chris@16
|
13 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
14 #include <bitset>
|
Chris@16
|
15 #include <boost/xpressive/detail/utility/chset/basic_chset.hpp>
|
Chris@16
|
16
|
Chris@16
|
17 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
18 namespace boost { namespace xpressive { namespace detail
|
Chris@16
|
19 {
|
Chris@16
|
20
|
Chris@16
|
21 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
22 //
|
Chris@16
|
23 // basic_chset: character set implementation
|
Chris@16
|
24 //
|
Chris@16
|
25 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
26 template<typename Char>
|
Chris@16
|
27 inline basic_chset<Char>::basic_chset()
|
Chris@16
|
28 {
|
Chris@16
|
29 }
|
Chris@16
|
30
|
Chris@16
|
31 //////////////////////////////////
|
Chris@16
|
32 template<typename Char>
|
Chris@16
|
33 inline basic_chset<Char>::basic_chset(basic_chset const &arg)
|
Chris@16
|
34 : rr_(arg.rr_)
|
Chris@16
|
35 {
|
Chris@16
|
36 }
|
Chris@16
|
37
|
Chris@16
|
38 //////////////////////////////////
|
Chris@16
|
39 template<typename Char>
|
Chris@16
|
40 inline bool basic_chset<Char>::empty() const
|
Chris@16
|
41 {
|
Chris@16
|
42 return this->rr_.empty();
|
Chris@16
|
43 }
|
Chris@16
|
44
|
Chris@16
|
45 //////////////////////////////////
|
Chris@16
|
46 template<typename Char>
|
Chris@16
|
47 template<typename Traits>
|
Chris@16
|
48 inline bool basic_chset<Char>::test(Char v, Traits const &, mpl::false_) const // case-sensitive
|
Chris@16
|
49 {
|
Chris@16
|
50 return this->rr_.test(v);
|
Chris@16
|
51 }
|
Chris@16
|
52
|
Chris@16
|
53 //////////////////////////////////
|
Chris@16
|
54 template<typename Char>
|
Chris@16
|
55 template<typename Traits>
|
Chris@16
|
56 inline bool basic_chset<Char>::test(Char v, Traits const &tr, mpl::true_) const // case-insensitive
|
Chris@16
|
57 {
|
Chris@16
|
58 return this->rr_.test(v, tr);
|
Chris@16
|
59 }
|
Chris@16
|
60
|
Chris@16
|
61 //////////////////////////////////
|
Chris@16
|
62 template<typename Char>
|
Chris@16
|
63 inline void basic_chset<Char>::set(Char from, Char to)
|
Chris@16
|
64 {
|
Chris@16
|
65 this->rr_.set(range<Char>(from, to));
|
Chris@16
|
66 }
|
Chris@16
|
67
|
Chris@16
|
68 //////////////////////////////////
|
Chris@16
|
69 template<typename Char>
|
Chris@16
|
70 template<typename Traits>
|
Chris@16
|
71 inline void basic_chset<Char>::set(Char from, Char to, Traits const &)
|
Chris@16
|
72 {
|
Chris@16
|
73 this->rr_.set(range<Char>(from, to));
|
Chris@16
|
74 }
|
Chris@16
|
75
|
Chris@16
|
76 //////////////////////////////////
|
Chris@16
|
77 template<typename Char>
|
Chris@16
|
78 inline void basic_chset<Char>::set(Char c)
|
Chris@16
|
79 {
|
Chris@16
|
80 this->rr_.set(range<Char>(c, c));
|
Chris@16
|
81 }
|
Chris@16
|
82
|
Chris@16
|
83 //////////////////////////////////
|
Chris@16
|
84 template<typename Char>
|
Chris@16
|
85 template<typename Traits>
|
Chris@16
|
86 inline void basic_chset<Char>::set(Char c, Traits const &)
|
Chris@16
|
87 {
|
Chris@16
|
88 this->rr_.set(range<Char>(c, c));
|
Chris@16
|
89 }
|
Chris@16
|
90
|
Chris@16
|
91 //////////////////////////////////
|
Chris@16
|
92 template<typename Char>
|
Chris@16
|
93 inline void basic_chset<Char>::clear(Char c)
|
Chris@16
|
94 {
|
Chris@16
|
95 this->rr_.clear(range<Char>(c, c));
|
Chris@16
|
96 }
|
Chris@16
|
97
|
Chris@16
|
98 //////////////////////////////////
|
Chris@16
|
99 template<typename Char>
|
Chris@16
|
100 template<typename Traits>
|
Chris@16
|
101 inline void basic_chset<Char>::clear(Char c, Traits const &)
|
Chris@16
|
102 {
|
Chris@16
|
103 this->rr_.clear(range<Char>(c, c));
|
Chris@16
|
104 }
|
Chris@16
|
105
|
Chris@16
|
106 //////////////////////////////////
|
Chris@16
|
107 template<typename Char>
|
Chris@16
|
108 inline void basic_chset<Char>::clear(Char from, Char to)
|
Chris@16
|
109 {
|
Chris@16
|
110 this->rr_.clear(range<Char>(from, to));
|
Chris@16
|
111 }
|
Chris@16
|
112
|
Chris@16
|
113 //////////////////////////////////
|
Chris@16
|
114 template<typename Char>
|
Chris@16
|
115 template<typename Traits>
|
Chris@16
|
116 inline void basic_chset<Char>::clear(Char from, Char to, Traits const &)
|
Chris@16
|
117 {
|
Chris@16
|
118 this->rr_.clear(range<Char>(from, to));
|
Chris@16
|
119 }
|
Chris@16
|
120
|
Chris@16
|
121 //////////////////////////////////
|
Chris@16
|
122 template<typename Char>
|
Chris@16
|
123 inline void basic_chset<Char>::clear()
|
Chris@16
|
124 {
|
Chris@16
|
125 this->rr_.clear();
|
Chris@16
|
126 }
|
Chris@16
|
127
|
Chris@16
|
128 /////////////////////////////////
|
Chris@16
|
129 template<typename Char>
|
Chris@16
|
130 inline void basic_chset<Char>::inverse()
|
Chris@16
|
131 {
|
Chris@16
|
132 // BUGBUG is this right? Does this handle icase correctly?
|
Chris@16
|
133 basic_chset<Char> inv;
|
Chris@16
|
134 inv.set((std::numeric_limits<Char>::min)(), (std::numeric_limits<Char>::max)());
|
Chris@16
|
135 inv -= *this;
|
Chris@16
|
136 this->swap(inv);
|
Chris@16
|
137 }
|
Chris@16
|
138
|
Chris@16
|
139 /////////////////////////////////
|
Chris@16
|
140 template<typename Char>
|
Chris@16
|
141 inline void basic_chset<Char>::swap(basic_chset<Char> &that)
|
Chris@16
|
142 {
|
Chris@16
|
143 this->rr_.swap(that.rr_);
|
Chris@16
|
144 }
|
Chris@16
|
145
|
Chris@16
|
146 /////////////////////////////////
|
Chris@16
|
147 template<typename Char>
|
Chris@16
|
148 inline basic_chset<Char> &
|
Chris@16
|
149 basic_chset<Char>::operator |=(basic_chset<Char> const &that)
|
Chris@16
|
150 {
|
Chris@16
|
151 typedef typename range_run<Char>::const_iterator const_iterator;
|
Chris@16
|
152 for(const_iterator iter = that.rr_.begin(); iter != that.rr_.end(); ++iter)
|
Chris@16
|
153 {
|
Chris@16
|
154 this->rr_.set(*iter);
|
Chris@16
|
155 }
|
Chris@16
|
156 return *this;
|
Chris@16
|
157 }
|
Chris@16
|
158
|
Chris@16
|
159 /////////////////////////////////
|
Chris@16
|
160 template<typename Char>
|
Chris@16
|
161 inline basic_chset<Char> &
|
Chris@16
|
162 basic_chset<Char>::operator &=(basic_chset<Char> const &that)
|
Chris@16
|
163 {
|
Chris@16
|
164 basic_chset<Char> inv;
|
Chris@16
|
165 inv.set((std::numeric_limits<Char>::min)(), (std::numeric_limits<Char>::max)());
|
Chris@16
|
166 inv -= that;
|
Chris@16
|
167 *this -= inv;
|
Chris@16
|
168 return *this;
|
Chris@16
|
169 }
|
Chris@16
|
170
|
Chris@16
|
171 /////////////////////////////////
|
Chris@16
|
172 template<typename Char>
|
Chris@16
|
173 inline basic_chset<Char> &
|
Chris@16
|
174 basic_chset<Char>::operator -=(basic_chset<Char> const &that)
|
Chris@16
|
175 {
|
Chris@16
|
176 typedef typename range_run<Char>::const_iterator const_iterator;
|
Chris@16
|
177 for(const_iterator iter = that.rr_.begin(); iter != that.rr_.end(); ++iter)
|
Chris@16
|
178 {
|
Chris@16
|
179 this->rr_.clear(*iter);
|
Chris@16
|
180 }
|
Chris@16
|
181 return *this;
|
Chris@16
|
182 }
|
Chris@16
|
183
|
Chris@16
|
184 /////////////////////////////////
|
Chris@16
|
185 template<typename Char>
|
Chris@16
|
186 inline basic_chset<Char> &
|
Chris@16
|
187 basic_chset<Char>::operator ^=(basic_chset<Char> const &that)
|
Chris@16
|
188 {
|
Chris@16
|
189 basic_chset bma = that;
|
Chris@16
|
190 bma -= *this;
|
Chris@16
|
191 *this -= that;
|
Chris@16
|
192 *this |= bma;
|
Chris@16
|
193 return *this;
|
Chris@16
|
194 }
|
Chris@16
|
195
|
Chris@16
|
196 #if(CHAR_BIT == 8)
|
Chris@16
|
197
|
Chris@16
|
198 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
199 //
|
Chris@16
|
200 // basic_chset: specializations for 8 bit chars using std::bitset
|
Chris@16
|
201 //
|
Chris@16
|
202 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
203 template<typename Char>
|
Chris@16
|
204 inline basic_chset_8bit<Char>::basic_chset_8bit()
|
Chris@16
|
205 {
|
Chris@16
|
206 }
|
Chris@16
|
207
|
Chris@16
|
208 /////////////////////////////////
|
Chris@16
|
209 template<typename Char>
|
Chris@16
|
210 inline basic_chset_8bit<Char>::basic_chset_8bit(basic_chset_8bit<Char> const &arg)
|
Chris@16
|
211 : bset_(arg.bset_)
|
Chris@16
|
212 {
|
Chris@16
|
213 }
|
Chris@16
|
214
|
Chris@16
|
215 /////////////////////////////////
|
Chris@16
|
216 template<typename Char>
|
Chris@16
|
217 inline bool basic_chset_8bit<Char>::empty() const
|
Chris@16
|
218 {
|
Chris@16
|
219 return !this->bset_.any();
|
Chris@16
|
220 }
|
Chris@16
|
221
|
Chris@16
|
222 /////////////////////////////////
|
Chris@16
|
223 template<typename Char>
|
Chris@16
|
224 template<typename Traits>
|
Chris@16
|
225 inline bool basic_chset_8bit<Char>::test(Char v, Traits const &, mpl::false_) const // case-sensitive
|
Chris@16
|
226 {
|
Chris@16
|
227 return this->bset_.test((unsigned char)v);
|
Chris@16
|
228 }
|
Chris@16
|
229
|
Chris@16
|
230 /////////////////////////////////
|
Chris@16
|
231 template<typename Char>
|
Chris@16
|
232 template<typename Traits>
|
Chris@16
|
233 inline bool basic_chset_8bit<Char>::test(Char v, Traits const &tr, mpl::true_) const // case-insensitive
|
Chris@16
|
234 {
|
Chris@16
|
235 return this->bset_.test((unsigned char)tr.translate_nocase(v));
|
Chris@16
|
236 }
|
Chris@16
|
237
|
Chris@16
|
238 /////////////////////////////////
|
Chris@16
|
239 template<typename Char>
|
Chris@16
|
240 inline void basic_chset_8bit<Char>::set(Char from, Char to)
|
Chris@16
|
241 {
|
Chris@16
|
242 for(int i = from; i <= to; ++i)
|
Chris@16
|
243 {
|
Chris@16
|
244 this->bset_.set((unsigned char)i);
|
Chris@16
|
245 }
|
Chris@16
|
246 }
|
Chris@16
|
247
|
Chris@16
|
248 /////////////////////////////////
|
Chris@16
|
249 template<typename Char>
|
Chris@16
|
250 template<typename Traits>
|
Chris@16
|
251 inline void basic_chset_8bit<Char>::set(Char from, Char to, Traits const &tr)
|
Chris@16
|
252 {
|
Chris@16
|
253 for(int i = from; i <= to; ++i)
|
Chris@16
|
254 {
|
Chris@16
|
255 this->bset_.set((unsigned char)tr.translate_nocase((Char)i));
|
Chris@16
|
256 }
|
Chris@16
|
257 }
|
Chris@16
|
258
|
Chris@16
|
259 /////////////////////////////////
|
Chris@16
|
260 template<typename Char>
|
Chris@16
|
261 inline void basic_chset_8bit<Char>::set(Char c)
|
Chris@16
|
262 {
|
Chris@16
|
263 this->bset_.set((unsigned char)c);
|
Chris@16
|
264 }
|
Chris@16
|
265
|
Chris@16
|
266 /////////////////////////////////
|
Chris@16
|
267 template<typename Char>
|
Chris@16
|
268 template<typename Traits>
|
Chris@16
|
269 inline void basic_chset_8bit<Char>::set(Char c, Traits const &tr)
|
Chris@16
|
270 {
|
Chris@16
|
271 this->bset_.set((unsigned char)tr.translate_nocase(c));
|
Chris@16
|
272 }
|
Chris@16
|
273
|
Chris@16
|
274 /////////////////////////////////
|
Chris@16
|
275 template<typename Char>
|
Chris@16
|
276 inline void basic_chset_8bit<Char>::clear(Char from, Char to)
|
Chris@16
|
277 {
|
Chris@16
|
278 for(int i = from; i <= to; ++i)
|
Chris@16
|
279 {
|
Chris@16
|
280 this->bset_.reset((unsigned char)i);
|
Chris@16
|
281 }
|
Chris@16
|
282 }
|
Chris@16
|
283
|
Chris@16
|
284 /////////////////////////////////
|
Chris@16
|
285 template<typename Char>
|
Chris@16
|
286 template<typename Traits>
|
Chris@16
|
287 inline void basic_chset_8bit<Char>::clear(Char from, Char to, Traits const &tr)
|
Chris@16
|
288 {
|
Chris@16
|
289 for(int i = from; i <= to; ++i)
|
Chris@16
|
290 {
|
Chris@16
|
291 this->bset_.reset((unsigned char)tr.translate_nocase((Char)i));
|
Chris@16
|
292 }
|
Chris@16
|
293 }
|
Chris@16
|
294
|
Chris@16
|
295 /////////////////////////////////
|
Chris@16
|
296 template<typename Char>
|
Chris@16
|
297 inline void basic_chset_8bit<Char>::clear(Char c)
|
Chris@16
|
298 {
|
Chris@16
|
299 this->bset_.reset((unsigned char)c);
|
Chris@16
|
300 }
|
Chris@16
|
301
|
Chris@16
|
302 /////////////////////////////////
|
Chris@16
|
303 template<typename Char>
|
Chris@16
|
304 template<typename Traits>
|
Chris@16
|
305 inline void basic_chset_8bit<Char>::clear(Char c, Traits const &tr)
|
Chris@16
|
306 {
|
Chris@16
|
307 this->bset_.reset((unsigned char)tr.tranlsate_nocase(c));
|
Chris@16
|
308 }
|
Chris@16
|
309
|
Chris@16
|
310 /////////////////////////////////
|
Chris@16
|
311 template<typename Char>
|
Chris@16
|
312 inline void basic_chset_8bit<Char>::clear()
|
Chris@16
|
313 {
|
Chris@16
|
314 this->bset_.reset();
|
Chris@16
|
315 }
|
Chris@16
|
316
|
Chris@16
|
317 /////////////////////////////////
|
Chris@16
|
318 template<typename Char>
|
Chris@16
|
319 inline void basic_chset_8bit<Char>::inverse()
|
Chris@16
|
320 {
|
Chris@16
|
321 this->bset_.flip();
|
Chris@16
|
322 }
|
Chris@16
|
323
|
Chris@16
|
324 /////////////////////////////////
|
Chris@16
|
325 template<typename Char>
|
Chris@16
|
326 inline void basic_chset_8bit<Char>::swap(basic_chset_8bit<Char> &that)
|
Chris@16
|
327 {
|
Chris@16
|
328 std::swap(this->bset_, that.bset_);
|
Chris@16
|
329 }
|
Chris@16
|
330
|
Chris@16
|
331 /////////////////////////////////
|
Chris@16
|
332 template<typename Char>
|
Chris@16
|
333 inline basic_chset_8bit<Char> &
|
Chris@16
|
334 basic_chset_8bit<Char>::operator |=(basic_chset_8bit<Char> const &that)
|
Chris@16
|
335 {
|
Chris@16
|
336 this->bset_ |= that.bset_;
|
Chris@16
|
337 return *this;
|
Chris@16
|
338 }
|
Chris@16
|
339
|
Chris@16
|
340 /////////////////////////////////
|
Chris@16
|
341 template<typename Char>
|
Chris@16
|
342 inline basic_chset_8bit<Char> &
|
Chris@16
|
343 basic_chset_8bit<Char>::operator &=(basic_chset_8bit<Char> const &that)
|
Chris@16
|
344 {
|
Chris@16
|
345 this->bset_ &= that.bset_;
|
Chris@16
|
346 return *this;
|
Chris@16
|
347 }
|
Chris@16
|
348
|
Chris@16
|
349 /////////////////////////////////
|
Chris@16
|
350 template<typename Char>
|
Chris@16
|
351 inline basic_chset_8bit<Char> &
|
Chris@16
|
352 basic_chset_8bit<Char>::operator -=(basic_chset_8bit<Char> const &that)
|
Chris@16
|
353 {
|
Chris@16
|
354 this->bset_ &= ~that.bset_;
|
Chris@16
|
355 return *this;
|
Chris@16
|
356 }
|
Chris@16
|
357
|
Chris@16
|
358 /////////////////////////////////
|
Chris@16
|
359 template<typename Char>
|
Chris@16
|
360 inline basic_chset_8bit<Char> &
|
Chris@16
|
361 basic_chset_8bit<Char>::operator ^=(basic_chset_8bit<Char> const &that)
|
Chris@16
|
362 {
|
Chris@16
|
363 this->bset_ ^= that.bset_;
|
Chris@16
|
364 return *this;
|
Chris@16
|
365 }
|
Chris@16
|
366
|
Chris@16
|
367 template<typename Char>
|
Chris@16
|
368 inline std::bitset<256> const &
|
Chris@16
|
369 basic_chset_8bit<Char>::base() const
|
Chris@16
|
370 {
|
Chris@16
|
371 return this->bset_;
|
Chris@16
|
372 }
|
Chris@16
|
373
|
Chris@16
|
374 #endif // if(CHAR_BIT == 8)
|
Chris@16
|
375
|
Chris@16
|
376
|
Chris@16
|
377 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
378 // helpers
|
Chris@16
|
379 template<typename Char, typename Traits>
|
Chris@16
|
380 inline void set_char(basic_chset<Char> &chset, Char ch, Traits const &tr, bool icase)
|
Chris@16
|
381 {
|
Chris@16
|
382 icase ? chset.set(ch, tr) : chset.set(ch);
|
Chris@16
|
383 }
|
Chris@16
|
384
|
Chris@16
|
385 template<typename Char, typename Traits>
|
Chris@16
|
386 inline void set_range(basic_chset<Char> &chset, Char from, Char to, Traits const &tr, bool icase)
|
Chris@16
|
387 {
|
Chris@16
|
388 icase ? chset.set(from, to, tr) : chset.set(from, to);
|
Chris@16
|
389 }
|
Chris@16
|
390
|
Chris@16
|
391 template<typename Char, typename Traits>
|
Chris@16
|
392 inline void set_class(basic_chset<Char> &chset, typename Traits::char_class_type char_class, bool no, Traits const &tr)
|
Chris@16
|
393 {
|
Chris@16
|
394 BOOST_MPL_ASSERT_RELATION(1, ==, sizeof(Char));
|
Chris@16
|
395 for(std::size_t i = 0; i <= UCHAR_MAX; ++i)
|
Chris@16
|
396 {
|
Chris@16
|
397 typedef typename std::char_traits<Char>::int_type int_type;
|
Chris@16
|
398 Char ch = std::char_traits<Char>::to_char_type(static_cast<int_type>(i));
|
Chris@16
|
399 if(no != tr.isctype(ch, char_class))
|
Chris@16
|
400 {
|
Chris@16
|
401 chset.set(ch);
|
Chris@16
|
402 }
|
Chris@16
|
403 }
|
Chris@16
|
404 }
|
Chris@16
|
405
|
Chris@16
|
406 }}} // namespace boost::xpressive::detail
|
Chris@16
|
407
|
Chris@16
|
408 #endif
|
Chris@16
|
409
|