diff options
Diffstat (limited to 'boost/xpressive/traits/cpp_regex_traits.hpp')
-rw-r--r-- | boost/xpressive/traits/cpp_regex_traits.hpp | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/boost/xpressive/traits/cpp_regex_traits.hpp b/boost/xpressive/traits/cpp_regex_traits.hpp index 5d5c7fd0b1..74a904cd12 100644 --- a/boost/xpressive/traits/cpp_regex_traits.hpp +++ b/boost/xpressive/traits/cpp_regex_traits.hpp @@ -20,10 +20,12 @@ #include <string> #include <locale> #include <sstream> +#include <climits> #include <boost/config.hpp> #include <boost/assert.hpp> #include <boost/integer.hpp> #include <boost/mpl/assert.hpp> +#include <boost/static_assert.hpp> #include <boost/detail/workaround.hpp> #include <boost/type_traits/is_same.hpp> #include <boost/xpressive/detail/detail_fwd.hpp> @@ -89,7 +91,7 @@ namespace detail template<umaskex_t In, umaskex_t Out = highest_bit, bool Done = (0 == (Out & In))> struct unused_mask { - BOOST_MPL_ASSERT_RELATION(1, !=, Out); + BOOST_STATIC_ASSERT(1 != Out); BOOST_STATIC_CONSTANT(umaskex_t, value = (unused_mask<In, (Out >> 1)>::value)); }; @@ -121,6 +123,8 @@ namespace detail umaskex_t const std_ctype_reserved = 0x8000; #elif defined(_CPPLIB_VER) && defined(BOOST_WINDOWS) umaskex_t const std_ctype_reserved = 0x8200; + #elif defined(_LIBCPP_VERSION) + umaskex_t const std_ctype_reserved = 0x8000; #else umaskex_t const std_ctype_reserved = 0; #endif @@ -205,6 +209,16 @@ namespace detail return true; } + // HACKHACK Cygwin and mingw have buggy ctype facets for wchar_t + #if defined(__CYGWIN__) || defined(__MINGW32_VERSION) + if (std::ctype_base::xdigit == ((std::ctype_base::mask)(umask_t)mask & std::ctype_base::xdigit)) + { + typename std::char_traits<Char>::int_type i = std::char_traits<Char>::to_int_type(ch); + if(UCHAR_MAX >= i && std::isxdigit(static_cast<int>(i))) + return true; + } + #endif + #else umaskex_t tmp = mask & ~non_std_ctype_masks; |