1 /* 2 * 3 * Copyright (c) 2003 4 * John Maddock 5 * 6 * Use, modification and distribution are subject to the 7 * Boost Software License, Version 1.0. (See accompanying file 8 * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 9 * 10 */ 11 12 /* 13 * LOCATION: see http://www.boost.org for most recent version. 14 * FILE regex_traits.hpp 15 * VERSION see <boost/version.hpp> 16 * DESCRIPTION: Declares regular expression traits classes. 17 */ 18 19 #ifndef BOOST_REGEX_TRAITS_HPP_INCLUDED 20 #define BOOST_REGEX_TRAITS_HPP_INCLUDED 21 22 #ifndef BOOST_REGEX_CONFIG_HPP 23 #include <boost/regex/config.hpp> 24 #endif 25 #ifndef BOOST_REGEX_WORKAROUND_HPP 26 #include <boost/regex/v4/regex_workaround.hpp> 27 #endif 28 #ifndef BOOST_REGEX_SYNTAX_TYPE_HPP 29 #include <boost/regex/v4/syntax_type.hpp> 30 #endif 31 #ifndef BOOST_REGEX_ERROR_TYPE_HPP 32 #include <boost/regex/v4/error_type.hpp> 33 #endif 34 #ifndef BOOST_REGEX_TRAITS_DEFAULTS_HPP_INCLUDED 35 #include <boost/regex/v4/regex_traits_defaults.hpp> 36 #endif 37 #ifndef BOOST_NO_STD_LOCALE 38 # ifndef BOOST_CPP_REGEX_TRAITS_HPP_INCLUDED 39 # include <boost/regex/v4/cpp_regex_traits.hpp> 40 # endif 41 #endif 42 #if !BOOST_WORKAROUND(__BORLANDC__, < 0x560) 43 # ifndef BOOST_C_REGEX_TRAITS_HPP_INCLUDED 44 # include <boost/regex/v4/c_regex_traits.hpp> 45 # endif 46 #endif 47 #if defined(_WIN32) && !defined(BOOST_REGEX_NO_W32) 48 # ifndef BOOST_W32_REGEX_TRAITS_HPP_INCLUDED 49 # include <boost/regex/v4/w32_regex_traits.hpp> 50 # endif 51 #endif 52 #ifndef BOOST_REGEX_FWD_HPP_INCLUDED 53 #include <boost/regex_fwd.hpp> 54 #endif 55 56 #include "boost/mpl/has_xxx.hpp" 57 #include <boost/static_assert.hpp> 58 59 #ifdef BOOST_MSVC 60 #pragma warning(push) 61 #pragma warning(disable: 4103) 62 #endif 63 #ifdef BOOST_HAS_ABI_HEADERS 64 # include BOOST_ABI_PREFIX 65 #endif 66 #ifdef BOOST_MSVC 67 #pragma warning(pop) 68 #endif 69 70 namespace boost{ 71 72 template <class charT, class implementationT > 73 struct regex_traits : public implementationT 74 { regex_traitsboost::regex_traits75 regex_traits() : implementationT() {} 76 }; 77 78 // 79 // class regex_traits_wrapper. 80 // this is what our implementation will actually store; 81 // it provides default implementations of the "optional" 82 // interfaces that we support, in addition to the 83 // required "standard" ones: 84 // 85 namespace re_detail{ 86 #if !BOOST_WORKAROUND(__HP_aCC, < 60000) 87 BOOST_MPL_HAS_XXX_TRAIT_DEF(boost_extensions_tag) 88 #else 89 template<class T> 90 struct has_boost_extensions_tag 91 { 92 BOOST_STATIC_CONSTANT(bool, value = false); 93 }; 94 #endif 95 96 template <class BaseT> 97 struct default_wrapper : public BaseT 98 { 99 typedef typename BaseT::char_type char_type; error_stringboost::re_detail::default_wrapper100 std::string error_string(::boost::regex_constants::error_type e)const 101 { 102 return ::boost::re_detail::get_default_error_string(e); 103 } syntax_typeboost::re_detail::default_wrapper104 ::boost::regex_constants::syntax_type syntax_type(char_type c)const 105 { 106 return ((c & 0x7f) == c) ? get_default_syntax_type(static_cast<char>(c)) : ::boost::regex_constants::syntax_char; 107 } escape_syntax_typeboost::re_detail::default_wrapper108 ::boost::regex_constants::escape_syntax_type escape_syntax_type(char_type c)const 109 { 110 return ((c & 0x7f) == c) ? get_default_escape_syntax_type(static_cast<char>(c)) : ::boost::regex_constants::escape_type_identity; 111 } toiboost::re_detail::default_wrapper112 int toi(const char_type*& p1, const char_type* p2, int radix)const 113 { 114 return ::boost::re_detail::global_toi(p1, p2, radix, *this); 115 } translateboost::re_detail::default_wrapper116 char_type translate(char_type c, bool icase)const 117 { 118 return (icase ? this->translate_nocase(c) : this->translate(c)); 119 } translateboost::re_detail::default_wrapper120 char_type translate(char_type c)const 121 { 122 return BaseT::translate(c); 123 } tolowerboost::re_detail::default_wrapper124 char_type tolower(char_type c)const 125 { 126 return ::boost::re_detail::global_lower(c); 127 } toupperboost::re_detail::default_wrapper128 char_type toupper(char_type c)const 129 { 130 return ::boost::re_detail::global_upper(c); 131 } 132 }; 133 134 template <class BaseT, bool has_extensions> 135 struct compute_wrapper_base 136 { 137 typedef BaseT type; 138 }; 139 #if !BOOST_WORKAROUND(__HP_aCC, < 60000) 140 template <class BaseT> 141 struct compute_wrapper_base<BaseT, false> 142 { 143 typedef default_wrapper<BaseT> type; 144 }; 145 #else 146 template <> 147 struct compute_wrapper_base<c_regex_traits<char>, false> 148 { 149 typedef default_wrapper<c_regex_traits<char> > type; 150 }; 151 #ifndef BOOST_NO_WREGEX 152 template <> 153 struct compute_wrapper_base<c_regex_traits<wchar_t>, false> 154 { 155 typedef default_wrapper<c_regex_traits<wchar_t> > type; 156 }; 157 #endif 158 #endif 159 160 } // namespace re_detail 161 162 template <class BaseT> 163 struct regex_traits_wrapper 164 : public ::boost::re_detail::compute_wrapper_base< 165 BaseT, 166 ::boost::re_detail::has_boost_extensions_tag<BaseT>::value 167 >::type 168 { regex_traits_wrapperboost::regex_traits_wrapper169 regex_traits_wrapper(){} 170 private: 171 regex_traits_wrapper(const regex_traits_wrapper&); 172 regex_traits_wrapper& operator=(const regex_traits_wrapper&); 173 }; 174 175 } // namespace boost 176 177 #ifdef BOOST_MSVC 178 #pragma warning(push) 179 #pragma warning(disable: 4103) 180 #endif 181 #ifdef BOOST_HAS_ABI_HEADERS 182 # include BOOST_ABI_SUFFIX 183 #endif 184 #ifdef BOOST_MSVC 185 #pragma warning(pop) 186 #endif 187 188 #endif // include 189 190