summaryrefslogtreecommitdiff
path: root/boost/xpressive/traits/cpp_regex_traits.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/xpressive/traits/cpp_regex_traits.hpp')
-rw-r--r--boost/xpressive/traits/cpp_regex_traits.hpp16
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;