123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- /*
- *
- * Copyright (c) 2016
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
- #include <boost/config.hpp>
- #ifndef BOOST_NO_CXX11_CHAR32_T
- #include <cstddef>
- namespace boost {
- std::size_t hash_value(char32_t const& c) { return c; }
- }
- #include <boost/regex.hpp>
- struct char32_traits
- {
- typedef char32_t char_type;
- typedef std::size_t size_type;
- typedef std::vector<char32_t> string_type;
- typedef int locale_type; // not used
- typedef unsigned char_class_type;
- static size_type length(const char32_t* p)
- {
- size_type result = 0;
- while(*p)
- {
- ++p;
- ++result;
- }
- return result;
- }
- static char_type translate(char_type c) { return c; }
- static char_type translate_nocase(char_type c) { return c; }
- static string_type transform(const char32_t* p1, const char32_t* p2)
- {
- return string_type(p1, p2);
- }
- static string_type transform_primary(const char32_t* p1, const char32_t* p2)
- {
- return string_type(p1, p2);
- }
- static char_class_type lookup_classname(const char32_t* p1, const char32_t* p2)
- {
- std::string s(p1, p2);
- return boost::c_regex_traits<char>::lookup_classname(s.c_str(), s.c_str() + s.length());
- return 0;
- }
- static string_type lookup_collatename(const char32_t* p1, const char32_t* p2)
- {
- return string_type(p1, p2);
- }
- static bool isctype(char_type c, char_class_type t)
- {
- if(c < 0xff)
- return boost::c_regex_traits<char>::isctype(c, t);
- return false;
- }
- static boost::intmax_t value(char_type c, int radix)
- {
- switch(radix)
- {
- case 8:
- if((c >= '0') && (c <= '7'))
- return c - '0';
- break;
- case 10:
- if((c >= '0') && (c <= '9'))
- return c - '0';
- break;
- case 16:
- if((c >= '0') && (c <= '9'))
- return c - '0';
- if((c >= 'a') && (c <= 'f'))
- return (c - 'a') + 10;
- if((c >= 'A') && (c <= 'F'))
- return (c - 'A') + 10;
- break;
- }
- return -1;
- }
- static locale_type imbue(locale_type) { return 0; }
- static locale_type getloc() { return 0; }
- };
- int main()
- {
- char32_t big_char[] = { 0xF, 0xFF, 0xFFF, 0xFFFF, 0xFFFFF, 0xFFFFFF, 0xFFFFFFF, 0xFFFFFFFF, 0 };
- boost::basic_regex<char32_t, char32_traits> e(U"\\x{F}\\x{FF}\\x{FFF}\\x{FFFF}\\x{FFFFF}\\x{FFFFFF}\\x{FFFFFFF}\\x{FFFFFFFF}");
- if(!regex_match(big_char, e))
- {
- return 1;
- }
- return 0;
- }
- #else
- int main() { return 0; }
- #endif
|