char_class.hpp 33 KB

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