]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | /*============================================================================= |
2 | Copyright (c) 2001-2011 Joel de Guzman | |
3 | Copyright (c) 2001-2011 Hartmut Kaiser | |
4 | ||
5 | Distributed under the Boost Software License, Version 1.0. (See accompanying | |
6 | file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | |
7 | =============================================================================*/ | |
8 | #if !defined(BOOST_SPIRIT_CHAR_CLASS_NOVEMBER_10_2006_0907AM) | |
9 | #define BOOST_SPIRIT_CHAR_CLASS_NOVEMBER_10_2006_0907AM | |
10 | ||
11 | #if defined(_MSC_VER) | |
12 | #pragma once | |
13 | #endif | |
14 | ||
15 | #include <string> | |
16 | ||
17 | #include <boost/spirit/include/phoenix_limits.hpp> // needs to be included before proto | |
18 | #include <boost/proto/proto.hpp> | |
19 | #include <boost/config.hpp> | |
20 | #include <boost/mpl/bool.hpp> | |
21 | #include <boost/spirit/home/support/unused.hpp> | |
22 | #include <boost/spirit/home/support/detail/is_spirit_tag.hpp> | |
23 | #include <boost/type_traits/is_signed.hpp> | |
24 | #include <boost/type_traits/make_unsigned.hpp> | |
25 | #include <boost/type_traits/make_signed.hpp> | |
26 | ||
27 | #if defined(BOOST_MSVC) | |
28 | # pragma warning(push) | |
29 | # pragma warning(disable: 4127) // conditional expression is constant | |
30 | # pragma warning(disable: 4800) // 'int' : forcing value to bool 'true' or 'false' warning | |
31 | #endif | |
32 | ||
33 | namespace boost { namespace spirit { namespace detail | |
34 | { | |
35 | // Here's the thing... typical encodings (except ASCII) deal with unsigned | |
36 | // integers > 127. ASCII uses only 127. Yet, most char and wchar_t are signed. | |
37 | // Thus, a char with value > 127 is negative (e.g. char 233 is -23). When you | |
38 | // cast this to an unsigned int with 32 bits, you get 4294967273! | |
39 | // | |
40 | // The trick is to cast to an unsigned version of the source char first | |
41 | // before casting to the target. {P.S. Don't worry about the code, the | |
42 | // optimizer will optimize the if-else branches} | |
43 | ||
44 | template <typename TargetChar, typename SourceChar> | |
45 | TargetChar cast_char(SourceChar ch) | |
46 | { | |
47 | if (is_signed<TargetChar>::value != is_signed<SourceChar>::value) | |
48 | { | |
49 | if (is_signed<SourceChar>::value) | |
50 | { | |
51 | // source is signed, target is unsigned | |
52 | typedef typename make_unsigned<SourceChar>::type USourceChar; | |
53 | return TargetChar(USourceChar(ch)); | |
54 | } | |
55 | else | |
56 | { | |
57 | // source is unsigned, target is signed | |
58 | typedef typename make_signed<SourceChar>::type SSourceChar; | |
59 | return TargetChar(SSourceChar(ch)); | |
60 | } | |
61 | } | |
62 | else | |
63 | { | |
64 | // source and target has same signedness | |
65 | return TargetChar(ch); // just cast | |
66 | } | |
67 | } | |
68 | }}} | |
69 | ||
70 | namespace boost { namespace spirit { namespace tag | |
71 | { | |
72 | struct char_ { BOOST_SPIRIT_IS_TAG() }; | |
73 | struct string { BOOST_SPIRIT_IS_TAG() }; | |
74 | ||
75 | /////////////////////////////////////////////////////////////////////////// | |
76 | // classification tags | |
77 | struct alnum { BOOST_SPIRIT_IS_TAG() }; | |
78 | struct alpha { BOOST_SPIRIT_IS_TAG() }; | |
79 | struct digit { BOOST_SPIRIT_IS_TAG() }; | |
80 | struct xdigit { BOOST_SPIRIT_IS_TAG() }; | |
81 | struct cntrl { BOOST_SPIRIT_IS_TAG() }; | |
82 | struct graph { BOOST_SPIRIT_IS_TAG() }; | |
83 | struct print { BOOST_SPIRIT_IS_TAG() }; | |
84 | struct punct { BOOST_SPIRIT_IS_TAG() }; | |
85 | struct space { BOOST_SPIRIT_IS_TAG() }; | |
86 | struct blank { BOOST_SPIRIT_IS_TAG() }; | |
87 | ||
88 | /////////////////////////////////////////////////////////////////////////// | |
89 | // classification/conversion tags | |
90 | struct no_case { BOOST_SPIRIT_IS_TAG() }; | |
91 | struct lower { BOOST_SPIRIT_IS_TAG() }; | |
92 | struct upper { BOOST_SPIRIT_IS_TAG() }; | |
93 | struct lowernum { BOOST_SPIRIT_IS_TAG() }; | |
94 | struct uppernum { BOOST_SPIRIT_IS_TAG() }; | |
95 | struct ucs4 { BOOST_SPIRIT_IS_TAG() }; | |
96 | struct encoding { BOOST_SPIRIT_IS_TAG() }; | |
97 | ||
98 | #if defined(BOOST_SPIRIT_UNICODE) | |
99 | /////////////////////////////////////////////////////////////////////////// | |
100 | // Unicode Major Categories | |
101 | /////////////////////////////////////////////////////////////////////////// | |
102 | struct letter { BOOST_SPIRIT_IS_TAG() }; | |
103 | struct mark { BOOST_SPIRIT_IS_TAG() }; | |
104 | struct number { BOOST_SPIRIT_IS_TAG() }; | |
105 | struct separator { BOOST_SPIRIT_IS_TAG() }; | |
106 | struct other { BOOST_SPIRIT_IS_TAG() }; | |
107 | struct punctuation { BOOST_SPIRIT_IS_TAG() }; | |
108 | struct symbol { BOOST_SPIRIT_IS_TAG() }; | |
109 | ||
110 | /////////////////////////////////////////////////////////////////////////// | |
111 | // Unicode General Categories | |
112 | /////////////////////////////////////////////////////////////////////////// | |
113 | struct uppercase_letter { BOOST_SPIRIT_IS_TAG() }; | |
114 | struct lowercase_letter { BOOST_SPIRIT_IS_TAG() }; | |
115 | struct titlecase_letter { BOOST_SPIRIT_IS_TAG() }; | |
116 | struct modifier_letter { BOOST_SPIRIT_IS_TAG() }; | |
117 | struct other_letter { BOOST_SPIRIT_IS_TAG() }; | |
118 | ||
119 | struct nonspacing_mark { BOOST_SPIRIT_IS_TAG() }; | |
120 | struct enclosing_mark { BOOST_SPIRIT_IS_TAG() }; | |
121 | struct spacing_mark { BOOST_SPIRIT_IS_TAG() }; | |
122 | ||
123 | struct decimal_number { BOOST_SPIRIT_IS_TAG() }; | |
124 | struct letter_number { BOOST_SPIRIT_IS_TAG() }; | |
125 | struct other_number { BOOST_SPIRIT_IS_TAG() }; | |
126 | ||
127 | struct space_separator { BOOST_SPIRIT_IS_TAG() }; | |
128 | struct line_separator { BOOST_SPIRIT_IS_TAG() }; | |
129 | struct paragraph_separator { BOOST_SPIRIT_IS_TAG() }; | |
130 | ||
131 | struct control { BOOST_SPIRIT_IS_TAG() }; | |
132 | struct format { BOOST_SPIRIT_IS_TAG() }; | |
133 | struct private_use { BOOST_SPIRIT_IS_TAG() }; | |
134 | struct surrogate { BOOST_SPIRIT_IS_TAG() }; | |
135 | struct unassigned { BOOST_SPIRIT_IS_TAG() }; | |
136 | ||
137 | struct dash_punctuation { BOOST_SPIRIT_IS_TAG() }; | |
138 | struct open_punctuation { BOOST_SPIRIT_IS_TAG() }; | |
139 | struct close_punctuation { BOOST_SPIRIT_IS_TAG() }; | |
140 | struct connector_punctuation { BOOST_SPIRIT_IS_TAG() }; | |
141 | struct other_punctuation { BOOST_SPIRIT_IS_TAG() }; | |
142 | struct initial_punctuation { BOOST_SPIRIT_IS_TAG() }; | |
143 | struct final_punctuation { BOOST_SPIRIT_IS_TAG() }; | |
144 | ||
145 | struct math_symbol { BOOST_SPIRIT_IS_TAG() }; | |
146 | struct currency_symbol { BOOST_SPIRIT_IS_TAG() }; | |
147 | struct modifier_symbol { BOOST_SPIRIT_IS_TAG() }; | |
148 | struct other_symbol { BOOST_SPIRIT_IS_TAG() }; | |
149 | ||
150 | /////////////////////////////////////////////////////////////////////////// | |
151 | // Unicode Derived Categories | |
152 | /////////////////////////////////////////////////////////////////////////// | |
153 | struct alphabetic { BOOST_SPIRIT_IS_TAG() }; | |
154 | struct uppercase { BOOST_SPIRIT_IS_TAG() }; | |
155 | struct lowercase { BOOST_SPIRIT_IS_TAG() }; | |
156 | struct white_space { BOOST_SPIRIT_IS_TAG() }; | |
157 | struct hex_digit { BOOST_SPIRIT_IS_TAG() }; | |
158 | struct noncharacter_code_point { BOOST_SPIRIT_IS_TAG() }; | |
159 | struct default_ignorable_code_point { BOOST_SPIRIT_IS_TAG() }; | |
160 | ||
161 | /////////////////////////////////////////////////////////////////////////// | |
162 | // Unicode Scripts | |
163 | /////////////////////////////////////////////////////////////////////////// | |
164 | struct arabic { BOOST_SPIRIT_IS_TAG() }; | |
165 | struct imperial_aramaic { BOOST_SPIRIT_IS_TAG() }; | |
166 | struct armenian { BOOST_SPIRIT_IS_TAG() }; | |
167 | struct avestan { BOOST_SPIRIT_IS_TAG() }; | |
168 | struct balinese { BOOST_SPIRIT_IS_TAG() }; | |
169 | struct bamum { BOOST_SPIRIT_IS_TAG() }; | |
170 | struct bengali { BOOST_SPIRIT_IS_TAG() }; | |
171 | struct bopomofo { BOOST_SPIRIT_IS_TAG() }; | |
172 | struct braille { BOOST_SPIRIT_IS_TAG() }; | |
173 | struct buginese { BOOST_SPIRIT_IS_TAG() }; | |
174 | struct buhid { BOOST_SPIRIT_IS_TAG() }; | |
175 | struct canadian_aboriginal { BOOST_SPIRIT_IS_TAG() }; | |
176 | struct carian { BOOST_SPIRIT_IS_TAG() }; | |
177 | struct cham { BOOST_SPIRIT_IS_TAG() }; | |
178 | struct cherokee { BOOST_SPIRIT_IS_TAG() }; | |
179 | struct coptic { BOOST_SPIRIT_IS_TAG() }; | |
180 | struct cypriot { BOOST_SPIRIT_IS_TAG() }; | |
181 | struct cyrillic { BOOST_SPIRIT_IS_TAG() }; | |
182 | struct devanagari { BOOST_SPIRIT_IS_TAG() }; | |
183 | struct deseret { BOOST_SPIRIT_IS_TAG() }; | |
184 | struct egyptian_hieroglyphs { BOOST_SPIRIT_IS_TAG() }; | |
185 | struct ethiopic { BOOST_SPIRIT_IS_TAG() }; | |
186 | struct georgian { BOOST_SPIRIT_IS_TAG() }; | |
187 | struct glagolitic { BOOST_SPIRIT_IS_TAG() }; | |
188 | struct gothic { BOOST_SPIRIT_IS_TAG() }; | |
189 | struct greek { BOOST_SPIRIT_IS_TAG() }; | |
190 | struct gujarati { BOOST_SPIRIT_IS_TAG() }; | |
191 | struct gurmukhi { BOOST_SPIRIT_IS_TAG() }; | |
192 | struct hangul { BOOST_SPIRIT_IS_TAG() }; | |
193 | struct han { BOOST_SPIRIT_IS_TAG() }; | |
194 | struct hanunoo { BOOST_SPIRIT_IS_TAG() }; | |
195 | struct hebrew { BOOST_SPIRIT_IS_TAG() }; | |
196 | struct hiragana { BOOST_SPIRIT_IS_TAG() }; | |
197 | struct katakana_or_hiragana { BOOST_SPIRIT_IS_TAG() }; | |
198 | struct old_italic { BOOST_SPIRIT_IS_TAG() }; | |
199 | struct javanese { BOOST_SPIRIT_IS_TAG() }; | |
200 | struct kayah_li { BOOST_SPIRIT_IS_TAG() }; | |
201 | struct katakana { BOOST_SPIRIT_IS_TAG() }; | |
202 | struct kharoshthi { BOOST_SPIRIT_IS_TAG() }; | |
203 | struct khmer { BOOST_SPIRIT_IS_TAG() }; | |
204 | struct kannada { BOOST_SPIRIT_IS_TAG() }; | |
205 | struct kaithi { BOOST_SPIRIT_IS_TAG() }; | |
206 | struct tai_tham { BOOST_SPIRIT_IS_TAG() }; | |
207 | struct lao { BOOST_SPIRIT_IS_TAG() }; | |
208 | struct latin { BOOST_SPIRIT_IS_TAG() }; | |
209 | struct lepcha { BOOST_SPIRIT_IS_TAG() }; | |
210 | struct limbu { BOOST_SPIRIT_IS_TAG() }; | |
211 | struct linear_b { BOOST_SPIRIT_IS_TAG() }; | |
212 | struct lisu { BOOST_SPIRIT_IS_TAG() }; | |
213 | struct lycian { BOOST_SPIRIT_IS_TAG() }; | |
214 | struct lydian { BOOST_SPIRIT_IS_TAG() }; | |
215 | struct malayalam { BOOST_SPIRIT_IS_TAG() }; | |
216 | struct mongolian { BOOST_SPIRIT_IS_TAG() }; | |
217 | struct meetei_mayek { BOOST_SPIRIT_IS_TAG() }; | |
218 | struct myanmar { BOOST_SPIRIT_IS_TAG() }; | |
219 | struct nko { BOOST_SPIRIT_IS_TAG() }; | |
220 | struct ogham { BOOST_SPIRIT_IS_TAG() }; | |
221 | struct ol_chiki { BOOST_SPIRIT_IS_TAG() }; | |
222 | struct old_turkic { BOOST_SPIRIT_IS_TAG() }; | |
223 | struct oriya { BOOST_SPIRIT_IS_TAG() }; | |
224 | struct osmanya { BOOST_SPIRIT_IS_TAG() }; | |
225 | struct phags_pa { BOOST_SPIRIT_IS_TAG() }; | |
226 | struct inscriptional_pahlavi { BOOST_SPIRIT_IS_TAG() }; | |
227 | struct phoenician { BOOST_SPIRIT_IS_TAG() }; | |
228 | struct inscriptional_parthian { BOOST_SPIRIT_IS_TAG() }; | |
229 | struct rejang { BOOST_SPIRIT_IS_TAG() }; | |
230 | struct runic { BOOST_SPIRIT_IS_TAG() }; | |
231 | struct samaritan { BOOST_SPIRIT_IS_TAG() }; | |
232 | struct old_south_arabian { BOOST_SPIRIT_IS_TAG() }; | |
233 | struct saurashtra { BOOST_SPIRIT_IS_TAG() }; | |
234 | struct shavian { BOOST_SPIRIT_IS_TAG() }; | |
235 | struct sinhala { BOOST_SPIRIT_IS_TAG() }; | |
236 | struct sundanese { BOOST_SPIRIT_IS_TAG() }; | |
237 | struct syloti_nagri { BOOST_SPIRIT_IS_TAG() }; | |
238 | struct syriac { BOOST_SPIRIT_IS_TAG() }; | |
239 | struct tagbanwa { BOOST_SPIRIT_IS_TAG() }; | |
240 | struct tai_le { BOOST_SPIRIT_IS_TAG() }; | |
241 | struct new_tai_lue { BOOST_SPIRIT_IS_TAG() }; | |
242 | struct tamil { BOOST_SPIRIT_IS_TAG() }; | |
243 | struct tai_viet { BOOST_SPIRIT_IS_TAG() }; | |
244 | struct telugu { BOOST_SPIRIT_IS_TAG() }; | |
245 | struct tifinagh { BOOST_SPIRIT_IS_TAG() }; | |
246 | struct tagalog { BOOST_SPIRIT_IS_TAG() }; | |
247 | struct thaana { BOOST_SPIRIT_IS_TAG() }; | |
248 | struct thai { BOOST_SPIRIT_IS_TAG() }; | |
249 | struct tibetan { BOOST_SPIRIT_IS_TAG() }; | |
250 | struct ugaritic { BOOST_SPIRIT_IS_TAG() }; | |
251 | struct vai { BOOST_SPIRIT_IS_TAG() }; | |
252 | struct old_persian { BOOST_SPIRIT_IS_TAG() }; | |
253 | struct cuneiform { BOOST_SPIRIT_IS_TAG() }; | |
254 | struct yi { BOOST_SPIRIT_IS_TAG() }; | |
255 | struct inherited { BOOST_SPIRIT_IS_TAG() }; | |
256 | struct common { BOOST_SPIRIT_IS_TAG() }; | |
257 | struct unknown { BOOST_SPIRIT_IS_TAG() }; | |
258 | #endif | |
259 | ||
260 | /////////////////////////////////////////////////////////////////////////// | |
261 | // This composite tag type encodes both the character | |
262 | // set and the specific char tag (used for classification | |
263 | // or conversion). char_code_base and char_encoding_base | |
264 | // can be used to test for modifier membership (see modifier.hpp) | |
265 | template <typename CharClass> | |
266 | struct char_code_base {}; | |
267 | ||
268 | template <typename CharEncoding> | |
269 | struct char_encoding_base {}; | |
270 | ||
271 | template <typename CharClass, typename CharEncoding> | |
272 | struct char_code | |
273 | : char_code_base<CharClass>, char_encoding_base<CharEncoding> | |
274 | { | |
275 | BOOST_SPIRIT_IS_TAG() | |
276 | typedef CharEncoding char_encoding; // e.g. ascii | |
277 | typedef CharClass char_class; // e.g. tag::alnum | |
278 | }; | |
279 | }}} | |
280 | ||
281 | namespace boost { namespace spirit { namespace char_class | |
282 | { | |
283 | /////////////////////////////////////////////////////////////////////////// | |
284 | // Test characters for classification | |
285 | template <typename CharEncoding> | |
286 | struct classify | |
287 | { | |
288 | typedef typename CharEncoding::char_type char_type; | |
289 | ||
290 | #define BOOST_SPIRIT_CLASSIFY(name, isname) \ | |
291 | template <typename Char> \ | |
292 | static bool \ | |
293 | is(tag::name, Char ch) \ | |
294 | { \ | |
295 | return CharEncoding::isname \ | |
296 | BOOST_PREVENT_MACRO_SUBSTITUTION \ | |
297 | (detail::cast_char<char_type>(ch)); \ | |
298 | } \ | |
299 | /***/ | |
300 | ||
301 | BOOST_SPIRIT_CLASSIFY(char_, ischar) | |
302 | BOOST_SPIRIT_CLASSIFY(alnum, isalnum) | |
303 | BOOST_SPIRIT_CLASSIFY(alpha, isalpha) | |
304 | BOOST_SPIRIT_CLASSIFY(digit, isdigit) | |
305 | BOOST_SPIRIT_CLASSIFY(xdigit, isxdigit) | |
306 | BOOST_SPIRIT_CLASSIFY(cntrl, iscntrl) | |
307 | BOOST_SPIRIT_CLASSIFY(graph, isgraph) | |
308 | BOOST_SPIRIT_CLASSIFY(lower, islower) | |
309 | BOOST_SPIRIT_CLASSIFY(print, isprint) | |
310 | BOOST_SPIRIT_CLASSIFY(punct, ispunct) | |
311 | BOOST_SPIRIT_CLASSIFY(space, isspace) | |
312 | BOOST_SPIRIT_CLASSIFY(blank, isblank) | |
313 | BOOST_SPIRIT_CLASSIFY(upper, isupper) | |
314 | ||
315 | #undef BOOST_SPIRIT_CLASSIFY | |
316 | ||
317 | template <typename Char> | |
318 | static bool | |
319 | is(tag::lowernum, Char ch) | |
320 | { | |
321 | return CharEncoding::islower(detail::cast_char<char_type>(ch)) || | |
322 | CharEncoding::isdigit(detail::cast_char<char_type>(ch)); | |
323 | } | |
324 | ||
325 | template <typename Char> | |
326 | static bool | |
327 | is(tag::uppernum, Char ch) | |
328 | { | |
329 | return CharEncoding::isupper(detail::cast_char<char_type>(ch)) || | |
330 | CharEncoding::isdigit(detail::cast_char<char_type>(ch)); | |
331 | } | |
332 | ||
333 | #if defined(BOOST_SPIRIT_UNICODE) | |
334 | ||
335 | #define BOOST_SPIRIT_UNICODE_CLASSIFY(name) \ | |
336 | template <typename Char> \ | |
337 | static bool \ | |
338 | is(tag::name, Char ch) \ | |
339 | { \ | |
340 | return CharEncoding::is_##name(detail::cast_char<char_type>(ch)); \ | |
341 | } \ | |
342 | /***/ | |
343 | ||
344 | /////////////////////////////////////////////////////////////////////////// | |
345 | // Unicode Major Categories | |
346 | /////////////////////////////////////////////////////////////////////////// | |
347 | BOOST_SPIRIT_UNICODE_CLASSIFY(letter) | |
348 | BOOST_SPIRIT_UNICODE_CLASSIFY(mark) | |
349 | BOOST_SPIRIT_UNICODE_CLASSIFY(number) | |
350 | BOOST_SPIRIT_UNICODE_CLASSIFY(separator) | |
351 | BOOST_SPIRIT_UNICODE_CLASSIFY(other) | |
352 | BOOST_SPIRIT_UNICODE_CLASSIFY(punctuation) | |
353 | BOOST_SPIRIT_UNICODE_CLASSIFY(symbol) | |
354 | ||
355 | /////////////////////////////////////////////////////////////////////////// | |
356 | // Unicode General Categories | |
357 | /////////////////////////////////////////////////////////////////////////// | |
358 | BOOST_SPIRIT_UNICODE_CLASSIFY(uppercase_letter) | |
359 | BOOST_SPIRIT_UNICODE_CLASSIFY(lowercase_letter) | |
360 | BOOST_SPIRIT_UNICODE_CLASSIFY(titlecase_letter) | |
361 | BOOST_SPIRIT_UNICODE_CLASSIFY(modifier_letter) | |
362 | BOOST_SPIRIT_UNICODE_CLASSIFY(other_letter) | |
363 | ||
364 | BOOST_SPIRIT_UNICODE_CLASSIFY(nonspacing_mark) | |
365 | BOOST_SPIRIT_UNICODE_CLASSIFY(enclosing_mark) | |
366 | BOOST_SPIRIT_UNICODE_CLASSIFY(spacing_mark) | |
367 | ||
368 | BOOST_SPIRIT_UNICODE_CLASSIFY(decimal_number) | |
369 | BOOST_SPIRIT_UNICODE_CLASSIFY(letter_number) | |
370 | BOOST_SPIRIT_UNICODE_CLASSIFY(other_number) | |
371 | ||
372 | BOOST_SPIRIT_UNICODE_CLASSIFY(space_separator) | |
373 | BOOST_SPIRIT_UNICODE_CLASSIFY(line_separator) | |
374 | BOOST_SPIRIT_UNICODE_CLASSIFY(paragraph_separator) | |
375 | ||
376 | BOOST_SPIRIT_UNICODE_CLASSIFY(control) | |
377 | BOOST_SPIRIT_UNICODE_CLASSIFY(format) | |
378 | BOOST_SPIRIT_UNICODE_CLASSIFY(private_use) | |
379 | BOOST_SPIRIT_UNICODE_CLASSIFY(surrogate) | |
380 | BOOST_SPIRIT_UNICODE_CLASSIFY(unassigned) | |
381 | ||
382 | BOOST_SPIRIT_UNICODE_CLASSIFY(dash_punctuation) | |
383 | BOOST_SPIRIT_UNICODE_CLASSIFY(open_punctuation) | |
384 | BOOST_SPIRIT_UNICODE_CLASSIFY(close_punctuation) | |
385 | BOOST_SPIRIT_UNICODE_CLASSIFY(connector_punctuation) | |
386 | BOOST_SPIRIT_UNICODE_CLASSIFY(other_punctuation) | |
387 | BOOST_SPIRIT_UNICODE_CLASSIFY(initial_punctuation) | |
388 | BOOST_SPIRIT_UNICODE_CLASSIFY(final_punctuation) | |
389 | ||
390 | BOOST_SPIRIT_UNICODE_CLASSIFY(math_symbol) | |
391 | BOOST_SPIRIT_UNICODE_CLASSIFY(currency_symbol) | |
392 | BOOST_SPIRIT_UNICODE_CLASSIFY(modifier_symbol) | |
393 | BOOST_SPIRIT_UNICODE_CLASSIFY(other_symbol) | |
394 | ||
395 | /////////////////////////////////////////////////////////////////////////// | |
396 | // Unicode Derived Categories | |
397 | /////////////////////////////////////////////////////////////////////////// | |
398 | BOOST_SPIRIT_UNICODE_CLASSIFY(alphabetic) | |
399 | BOOST_SPIRIT_UNICODE_CLASSIFY(uppercase) | |
400 | BOOST_SPIRIT_UNICODE_CLASSIFY(lowercase) | |
401 | BOOST_SPIRIT_UNICODE_CLASSIFY(white_space) | |
402 | BOOST_SPIRIT_UNICODE_CLASSIFY(hex_digit) | |
403 | BOOST_SPIRIT_UNICODE_CLASSIFY(noncharacter_code_point) | |
404 | BOOST_SPIRIT_UNICODE_CLASSIFY(default_ignorable_code_point) | |
405 | ||
406 | /////////////////////////////////////////////////////////////////////////// | |
407 | // Unicode Scripts | |
408 | /////////////////////////////////////////////////////////////////////////// | |
409 | BOOST_SPIRIT_UNICODE_CLASSIFY(arabic) | |
410 | BOOST_SPIRIT_UNICODE_CLASSIFY(imperial_aramaic) | |
411 | BOOST_SPIRIT_UNICODE_CLASSIFY(armenian) | |
412 | BOOST_SPIRIT_UNICODE_CLASSIFY(avestan) | |
413 | BOOST_SPIRIT_UNICODE_CLASSIFY(balinese) | |
414 | BOOST_SPIRIT_UNICODE_CLASSIFY(bamum) | |
415 | BOOST_SPIRIT_UNICODE_CLASSIFY(bengali) | |
416 | BOOST_SPIRIT_UNICODE_CLASSIFY(bopomofo) | |
417 | BOOST_SPIRIT_UNICODE_CLASSIFY(braille) | |
418 | BOOST_SPIRIT_UNICODE_CLASSIFY(buginese) | |
419 | BOOST_SPIRIT_UNICODE_CLASSIFY(buhid) | |
420 | BOOST_SPIRIT_UNICODE_CLASSIFY(canadian_aboriginal) | |
421 | BOOST_SPIRIT_UNICODE_CLASSIFY(carian) | |
422 | BOOST_SPIRIT_UNICODE_CLASSIFY(cham) | |
423 | BOOST_SPIRIT_UNICODE_CLASSIFY(cherokee) | |
424 | BOOST_SPIRIT_UNICODE_CLASSIFY(coptic) | |
425 | BOOST_SPIRIT_UNICODE_CLASSIFY(cypriot) | |
426 | BOOST_SPIRIT_UNICODE_CLASSIFY(cyrillic) | |
427 | BOOST_SPIRIT_UNICODE_CLASSIFY(devanagari) | |
428 | BOOST_SPIRIT_UNICODE_CLASSIFY(deseret) | |
429 | BOOST_SPIRIT_UNICODE_CLASSIFY(egyptian_hieroglyphs) | |
430 | BOOST_SPIRIT_UNICODE_CLASSIFY(ethiopic) | |
431 | BOOST_SPIRIT_UNICODE_CLASSIFY(georgian) | |
432 | BOOST_SPIRIT_UNICODE_CLASSIFY(glagolitic) | |
433 | BOOST_SPIRIT_UNICODE_CLASSIFY(gothic) | |
434 | BOOST_SPIRIT_UNICODE_CLASSIFY(greek) | |
435 | BOOST_SPIRIT_UNICODE_CLASSIFY(gujarati) | |
436 | BOOST_SPIRIT_UNICODE_CLASSIFY(gurmukhi) | |
437 | BOOST_SPIRIT_UNICODE_CLASSIFY(hangul) | |
438 | BOOST_SPIRIT_UNICODE_CLASSIFY(han) | |
439 | BOOST_SPIRIT_UNICODE_CLASSIFY(hanunoo) | |
440 | BOOST_SPIRIT_UNICODE_CLASSIFY(hebrew) | |
441 | BOOST_SPIRIT_UNICODE_CLASSIFY(hiragana) | |
442 | BOOST_SPIRIT_UNICODE_CLASSIFY(katakana_or_hiragana) | |
443 | BOOST_SPIRIT_UNICODE_CLASSIFY(old_italic) | |
444 | BOOST_SPIRIT_UNICODE_CLASSIFY(javanese) | |
445 | BOOST_SPIRIT_UNICODE_CLASSIFY(kayah_li) | |
446 | BOOST_SPIRIT_UNICODE_CLASSIFY(katakana) | |
447 | BOOST_SPIRIT_UNICODE_CLASSIFY(kharoshthi) | |
448 | BOOST_SPIRIT_UNICODE_CLASSIFY(khmer) | |
449 | BOOST_SPIRIT_UNICODE_CLASSIFY(kannada) | |
450 | BOOST_SPIRIT_UNICODE_CLASSIFY(kaithi) | |
451 | BOOST_SPIRIT_UNICODE_CLASSIFY(tai_tham) | |
452 | BOOST_SPIRIT_UNICODE_CLASSIFY(lao) | |
453 | BOOST_SPIRIT_UNICODE_CLASSIFY(latin) | |
454 | BOOST_SPIRIT_UNICODE_CLASSIFY(lepcha) | |
455 | BOOST_SPIRIT_UNICODE_CLASSIFY(limbu) | |
456 | BOOST_SPIRIT_UNICODE_CLASSIFY(linear_b) | |
457 | BOOST_SPIRIT_UNICODE_CLASSIFY(lisu) | |
458 | BOOST_SPIRIT_UNICODE_CLASSIFY(lycian) | |
459 | BOOST_SPIRIT_UNICODE_CLASSIFY(lydian) | |
460 | BOOST_SPIRIT_UNICODE_CLASSIFY(malayalam) | |
461 | BOOST_SPIRIT_UNICODE_CLASSIFY(mongolian) | |
462 | BOOST_SPIRIT_UNICODE_CLASSIFY(meetei_mayek) | |
463 | BOOST_SPIRIT_UNICODE_CLASSIFY(myanmar) | |
464 | BOOST_SPIRIT_UNICODE_CLASSIFY(nko) | |
465 | BOOST_SPIRIT_UNICODE_CLASSIFY(ogham) | |
466 | BOOST_SPIRIT_UNICODE_CLASSIFY(ol_chiki) | |
467 | BOOST_SPIRIT_UNICODE_CLASSIFY(old_turkic) | |
468 | BOOST_SPIRIT_UNICODE_CLASSIFY(oriya) | |
469 | BOOST_SPIRIT_UNICODE_CLASSIFY(osmanya) | |
470 | BOOST_SPIRIT_UNICODE_CLASSIFY(phags_pa) | |
471 | BOOST_SPIRIT_UNICODE_CLASSIFY(inscriptional_pahlavi) | |
472 | BOOST_SPIRIT_UNICODE_CLASSIFY(phoenician) | |
473 | BOOST_SPIRIT_UNICODE_CLASSIFY(inscriptional_parthian) | |
474 | BOOST_SPIRIT_UNICODE_CLASSIFY(rejang) | |
475 | BOOST_SPIRIT_UNICODE_CLASSIFY(runic) | |
476 | BOOST_SPIRIT_UNICODE_CLASSIFY(samaritan) | |
477 | BOOST_SPIRIT_UNICODE_CLASSIFY(old_south_arabian) | |
478 | BOOST_SPIRIT_UNICODE_CLASSIFY(saurashtra) | |
479 | BOOST_SPIRIT_UNICODE_CLASSIFY(shavian) | |
480 | BOOST_SPIRIT_UNICODE_CLASSIFY(sinhala) | |
481 | BOOST_SPIRIT_UNICODE_CLASSIFY(sundanese) | |
482 | BOOST_SPIRIT_UNICODE_CLASSIFY(syloti_nagri) | |
483 | BOOST_SPIRIT_UNICODE_CLASSIFY(syriac) | |
484 | BOOST_SPIRIT_UNICODE_CLASSIFY(tagbanwa) | |
485 | BOOST_SPIRIT_UNICODE_CLASSIFY(tai_le) | |
486 | BOOST_SPIRIT_UNICODE_CLASSIFY(new_tai_lue) | |
487 | BOOST_SPIRIT_UNICODE_CLASSIFY(tamil) | |
488 | BOOST_SPIRIT_UNICODE_CLASSIFY(tai_viet) | |
489 | BOOST_SPIRIT_UNICODE_CLASSIFY(telugu) | |
490 | BOOST_SPIRIT_UNICODE_CLASSIFY(tifinagh) | |
491 | BOOST_SPIRIT_UNICODE_CLASSIFY(tagalog) | |
492 | BOOST_SPIRIT_UNICODE_CLASSIFY(thaana) | |
493 | BOOST_SPIRIT_UNICODE_CLASSIFY(thai) | |
494 | BOOST_SPIRIT_UNICODE_CLASSIFY(tibetan) | |
495 | BOOST_SPIRIT_UNICODE_CLASSIFY(ugaritic) | |
496 | BOOST_SPIRIT_UNICODE_CLASSIFY(vai) | |
497 | BOOST_SPIRIT_UNICODE_CLASSIFY(old_persian) | |
498 | BOOST_SPIRIT_UNICODE_CLASSIFY(cuneiform) | |
499 | BOOST_SPIRIT_UNICODE_CLASSIFY(yi) | |
500 | BOOST_SPIRIT_UNICODE_CLASSIFY(inherited) | |
501 | BOOST_SPIRIT_UNICODE_CLASSIFY(common) | |
502 | BOOST_SPIRIT_UNICODE_CLASSIFY(unknown) | |
503 | ||
504 | #undef BOOST_SPIRIT_UNICODE_CLASSIFY | |
505 | #endif | |
506 | ||
507 | }; | |
508 | ||
509 | /////////////////////////////////////////////////////////////////////////// | |
510 | // Convert characters | |
511 | template <typename CharEncoding> | |
512 | struct convert | |
513 | { | |
514 | typedef typename CharEncoding::char_type char_type; | |
515 | ||
516 | template <typename Char> | |
517 | static Char | |
518 | to(tag::lower, Char ch) | |
519 | { | |
520 | return static_cast<Char>( | |
521 | CharEncoding::tolower(detail::cast_char<char_type>(ch))); | |
522 | } | |
523 | ||
524 | template <typename Char> | |
525 | static Char | |
526 | to(tag::upper, Char ch) | |
527 | { | |
528 | return static_cast<Char>( | |
529 | CharEncoding::toupper(detail::cast_char<char_type>(ch))); | |
530 | } | |
531 | ||
532 | template <typename Char> | |
533 | static Char | |
534 | to(tag::ucs4, Char ch) | |
535 | { | |
536 | return static_cast<Char>( | |
537 | CharEncoding::toucs4(detail::cast_char<char_type>(ch))); | |
538 | } | |
539 | ||
540 | template <typename Char> | |
541 | static Char | |
542 | to(unused_type, Char ch) | |
543 | { | |
544 | return ch; | |
545 | } | |
546 | }; | |
547 | ||
548 | /////////////////////////////////////////////////////////////////////////// | |
549 | // Info on character classification | |
550 | template <typename CharEncoding> | |
551 | struct what | |
552 | { | |
553 | #define BOOST_SPIRIT_CLASSIFY_WHAT(name, isname) \ | |
554 | static char const* is(tag::name) \ | |
555 | { \ | |
556 | return isname; \ | |
557 | } \ | |
558 | /***/ | |
559 | ||
560 | BOOST_SPIRIT_CLASSIFY_WHAT(char_, "char") | |
561 | BOOST_SPIRIT_CLASSIFY_WHAT(alnum, "alnum") | |
562 | BOOST_SPIRIT_CLASSIFY_WHAT(alpha, "alpha") | |
563 | BOOST_SPIRIT_CLASSIFY_WHAT(digit, "digit") | |
564 | BOOST_SPIRIT_CLASSIFY_WHAT(xdigit, "xdigit") | |
565 | BOOST_SPIRIT_CLASSIFY_WHAT(cntrl, "cntrl") | |
566 | BOOST_SPIRIT_CLASSIFY_WHAT(graph, "graph") | |
567 | BOOST_SPIRIT_CLASSIFY_WHAT(lower, "lower") | |
568 | BOOST_SPIRIT_CLASSIFY_WHAT(lowernum, "lowernum") | |
569 | BOOST_SPIRIT_CLASSIFY_WHAT(print, "print") | |
570 | BOOST_SPIRIT_CLASSIFY_WHAT(punct, "punct") | |
571 | BOOST_SPIRIT_CLASSIFY_WHAT(space, "space") | |
572 | BOOST_SPIRIT_CLASSIFY_WHAT(blank, "blank") | |
573 | BOOST_SPIRIT_CLASSIFY_WHAT(upper, "upper") | |
574 | BOOST_SPIRIT_CLASSIFY_WHAT(uppernum, "uppernum") | |
575 | BOOST_SPIRIT_CLASSIFY_WHAT(ucs4, "ucs4") | |
576 | ||
577 | #undef BOOST_SPIRIT_CLASSIFY_WHAT | |
578 | ||
579 | #if defined(BOOST_SPIRIT_UNICODE) | |
580 | ||
581 | #define BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(name) \ | |
582 | static char const* is(tag::name) \ | |
583 | { \ | |
584 | return BOOST_PP_STRINGIZE(name); \ | |
585 | } \ | |
586 | /***/ | |
587 | ||
588 | /////////////////////////////////////////////////////////////////////////// | |
589 | // Unicode Major Categories | |
590 | /////////////////////////////////////////////////////////////////////////// | |
591 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(letter) | |
592 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(mark) | |
593 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(number) | |
594 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(separator) | |
595 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(other) | |
596 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(punctuation) | |
597 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(symbol) | |
598 | ||
599 | /////////////////////////////////////////////////////////////////////////// | |
600 | // Unicode General Categories | |
601 | /////////////////////////////////////////////////////////////////////////// | |
602 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(uppercase_letter) | |
603 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(lowercase_letter) | |
604 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(titlecase_letter) | |
605 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(modifier_letter) | |
606 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(other_letter) | |
607 | ||
608 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(nonspacing_mark) | |
609 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(enclosing_mark) | |
610 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(spacing_mark) | |
611 | ||
612 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(decimal_number) | |
613 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(letter_number) | |
614 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(other_number) | |
615 | ||
616 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(space_separator) | |
617 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(line_separator) | |
618 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(paragraph_separator) | |
619 | ||
620 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(control) | |
621 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(format) | |
622 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(private_use) | |
623 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(surrogate) | |
624 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(unassigned) | |
625 | ||
626 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(dash_punctuation) | |
627 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(open_punctuation) | |
628 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(close_punctuation) | |
629 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(connector_punctuation) | |
630 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(other_punctuation) | |
631 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(initial_punctuation) | |
632 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(final_punctuation) | |
633 | ||
634 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(math_symbol) | |
635 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(currency_symbol) | |
636 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(modifier_symbol) | |
637 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(other_symbol) | |
638 | ||
639 | /////////////////////////////////////////////////////////////////////////// | |
640 | // Unicode Derived Categories | |
641 | /////////////////////////////////////////////////////////////////////////// | |
642 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(alphabetic) | |
643 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(uppercase) | |
644 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(lowercase) | |
645 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(white_space) | |
646 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(hex_digit) | |
647 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(noncharacter_code_point) | |
648 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(default_ignorable_code_point) | |
649 | ||
650 | /////////////////////////////////////////////////////////////////////////// | |
651 | // Unicode Scripts | |
652 | /////////////////////////////////////////////////////////////////////////// | |
653 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(arabic) | |
654 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(imperial_aramaic) | |
655 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(armenian) | |
656 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(avestan) | |
657 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(balinese) | |
658 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(bamum) | |
659 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(bengali) | |
660 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(bopomofo) | |
661 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(braille) | |
662 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(buginese) | |
663 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(buhid) | |
664 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(canadian_aboriginal) | |
665 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(carian) | |
666 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(cham) | |
667 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(cherokee) | |
668 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(coptic) | |
669 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(cypriot) | |
670 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(cyrillic) | |
671 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(devanagari) | |
672 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(deseret) | |
673 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(egyptian_hieroglyphs) | |
674 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(ethiopic) | |
675 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(georgian) | |
676 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(glagolitic) | |
677 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(gothic) | |
678 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(greek) | |
679 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(gujarati) | |
680 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(gurmukhi) | |
681 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(hangul) | |
682 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(han) | |
683 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(hanunoo) | |
684 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(hebrew) | |
685 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(hiragana) | |
686 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(katakana_or_hiragana) | |
687 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(old_italic) | |
688 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(javanese) | |
689 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(kayah_li) | |
690 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(katakana) | |
691 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(kharoshthi) | |
692 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(khmer) | |
693 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(kannada) | |
694 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(kaithi) | |
695 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tai_tham) | |
696 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(lao) | |
697 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(latin) | |
698 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(lepcha) | |
699 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(limbu) | |
700 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(linear_b) | |
701 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(lisu) | |
702 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(lycian) | |
703 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(lydian) | |
704 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(malayalam) | |
705 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(mongolian) | |
706 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(meetei_mayek) | |
707 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(myanmar) | |
708 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(nko) | |
709 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(ogham) | |
710 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(ol_chiki) | |
711 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(old_turkic) | |
712 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(oriya) | |
713 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(osmanya) | |
714 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(phags_pa) | |
715 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(inscriptional_pahlavi) | |
716 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(phoenician) | |
717 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(inscriptional_parthian) | |
718 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(rejang) | |
719 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(runic) | |
720 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(samaritan) | |
721 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(old_south_arabian) | |
722 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(saurashtra) | |
723 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(shavian) | |
724 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(sinhala) | |
725 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(sundanese) | |
726 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(syloti_nagri) | |
727 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(syriac) | |
728 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tagbanwa) | |
729 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tai_le) | |
730 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(new_tai_lue) | |
731 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tamil) | |
732 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tai_viet) | |
733 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(telugu) | |
734 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tifinagh) | |
735 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tagalog) | |
736 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(thaana) | |
737 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(thai) | |
738 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(tibetan) | |
739 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(ugaritic) | |
740 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(vai) | |
741 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(old_persian) | |
742 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(cuneiform) | |
743 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(yi) | |
744 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(inherited) | |
745 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(common) | |
746 | BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT(unknown) | |
747 | ||
748 | #undef BOOST_SPIRIT_UNICODE_CLASSIFY_WHAT | |
749 | #endif | |
750 | ||
751 | }; | |
752 | }}} | |
753 | ||
754 | namespace boost { namespace spirit { namespace traits | |
755 | { | |
756 | /////////////////////////////////////////////////////////////////////////// | |
757 | // This meta-function evaluates to mpl::true_ if the function | |
758 | // char_encoding::ischar() needs to be called to ensure correct matching. | |
759 | // This happens mainly if the character type returned from the underlying | |
760 | // iterator is larger than the character type of the used character | |
761 | // encoding. Additionally, this meta-function provides a customization | |
762 | // point for the lexer library to enforce this behavior while parsing | |
763 | // a token stream. | |
764 | template <typename Char, typename BaseChar> | |
765 | struct mustcheck_ischar | |
766 | : mpl::bool_<(sizeof(Char) > sizeof(BaseChar)) ? true : false> {}; | |
767 | ||
768 | /////////////////////////////////////////////////////////////////////////// | |
769 | // The following template calls char_encoding::ischar, if necessary | |
770 | template <typename CharParam, typename CharEncoding | |
771 | , bool MustCheck = mustcheck_ischar< | |
772 | CharParam, typename CharEncoding::char_type>::value> | |
773 | struct ischar | |
774 | { | |
775 | static bool call(CharParam) | |
776 | { | |
777 | return true; | |
778 | } | |
779 | }; | |
780 | ||
781 | template <typename CharParam, typename CharEncoding> | |
782 | struct ischar<CharParam, CharEncoding, true> | |
783 | { | |
784 | static bool call(CharParam const& ch) | |
785 | { | |
786 | return CharEncoding::ischar(int(ch)); | |
787 | } | |
788 | }; | |
789 | ||
790 | }}} | |
791 | ||
792 | #if defined(BOOST_MSVC) | |
793 | # pragma warning(pop) | |
794 | #endif | |
795 | ||
796 | #endif | |
797 | ||
798 |