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)
13 * LOCATION: see http://www.boost.org for most recent version.
14 * FILE regex_traits_defaults.hpp
15 * VERSION see <boost/version.hpp>
16 * DESCRIPTION: Declares API's for access to regex_traits default properties.
19 #ifndef BOOST_REGEX_TRAITS_DEFAULTS_HPP_INCLUDED
20 #define BOOST_REGEX_TRAITS_DEFAULTS_HPP_INCLUDED
24 #pragma warning(disable: 4103)
26 #ifdef BOOST_HAS_ABI_HEADERS
27 # include BOOST_ABI_PREFIX
33 #ifndef BOOST_REGEX_SYNTAX_TYPE_HPP
34 #include <boost/regex/v4/syntax_type.hpp>
36 #ifndef BOOST_REGEX_ERROR_TYPE_HPP
37 #include <boost/regex/v4/error_type.hpp>
40 #ifdef BOOST_NO_STDC_NAMESPACE
46 namespace boost{ namespace re_detail{
50 // helpers to suppress warnings:
52 template <class charT>
53 inline bool is_extended(charT c)
55 inline bool is_extended(char)
59 BOOST_REGEX_DECL const char* BOOST_REGEX_CALL get_default_syntax(regex_constants::syntax_type n);
60 BOOST_REGEX_DECL const char* BOOST_REGEX_CALL get_default_error_string(regex_constants::error_type n);
61 BOOST_REGEX_DECL regex_constants::syntax_type BOOST_REGEX_CALL get_default_syntax_type(char c);
62 BOOST_REGEX_DECL regex_constants::escape_syntax_type BOOST_REGEX_CALL get_default_escape_syntax_type(char c);
64 // is charT c a combining character?
65 BOOST_REGEX_DECL bool BOOST_REGEX_CALL is_combining_implementation(uint_least16_t s);
67 template <class charT>
68 inline bool is_combining(charT c)
70 return (c <= static_cast<charT>(0)) ? false : ((c >= static_cast<charT>((std::numeric_limits<uint_least16_t>::max)())) ? false : is_combining_implementation(static_cast<unsigned short>(c)));
73 inline bool is_combining<char>(char)
78 inline bool is_combining<signed char>(signed char)
83 inline bool is_combining<unsigned char>(unsigned char)
87 #ifndef __hpux // can't use WCHAR_MAX/MIN in pp-directives
90 inline bool is_combining<wchar_t>(wchar_t c)
92 return is_combining_implementation(static_cast<unsigned short>(c));
94 #elif !defined(__DECCXX) && !defined(__osf__) && !defined(__OSF__) && defined(WCHAR_MIN) && (WCHAR_MIN == 0) && !defined(BOOST_NO_INTRINSIC_WCHAR_T)
95 #if defined(WCHAR_MAX) && (WCHAR_MAX <= USHRT_MAX)
97 inline bool is_combining<wchar_t>(wchar_t c)
99 return is_combining_implementation(static_cast<unsigned short>(c));
103 inline bool is_combining<wchar_t>(wchar_t c)
105 return (c >= (std::numeric_limits<uint_least16_t>::max)()) ? false : is_combining_implementation(static_cast<unsigned short>(c));
112 // is a charT c a line separator?
114 template <class charT>
115 inline bool is_separator(charT c)
117 return BOOST_REGEX_MAKE_BOOL(
118 (c == static_cast<charT>('\n'))
119 || (c == static_cast<charT>('\r'))
120 || (c == static_cast<charT>('\f'))
121 || (static_cast<boost::uint16_t>(c) == 0x2028u)
122 || (static_cast<boost::uint16_t>(c) == 0x2029u)
123 || (static_cast<boost::uint16_t>(c) == 0x85u));
126 inline bool is_separator<char>(char c)
128 return BOOST_REGEX_MAKE_BOOL((c == '\n') || (c == '\r') || (c == '\f'));
132 // get a default collating element:
134 BOOST_REGEX_DECL std::string BOOST_REGEX_CALL lookup_default_collate_name(const std::string& name);
137 // get the state_id of a character clasification, the individual
138 // traits classes then transform that state_id into a bitmask:
140 template <class charT>
141 struct character_pointer_range
146 bool operator < (const character_pointer_range& r)const
148 return std::lexicographical_compare(p1, p2, r.p1, r.p2);
150 bool operator == (const character_pointer_range& r)const
152 // Not only do we check that the ranges are of equal size before
153 // calling std::equal, but there is no other algorithm available:
154 // not even a non-standard MS one. So forward to unchecked_equal
156 return ((p2 - p1) == (r.p2 - r.p1)) && re_detail::equal(p1, p2, r.p1);
159 template <class charT>
160 int get_default_class_id(const charT* p1, const charT* p2)
162 static const charT data[72] = {
163 'a', 'l', 'n', 'u', 'm',
164 'a', 'l', 'p', 'h', 'a',
165 'b', 'l', 'a', 'n', 'k',
166 'c', 'n', 't', 'r', 'l',
167 'd', 'i', 'g', 'i', 't',
168 'g', 'r', 'a', 'p', 'h',
169 'l', 'o', 'w', 'e', 'r',
170 'p', 'r', 'i', 'n', 't',
171 'p', 'u', 'n', 'c', 't',
172 's', 'p', 'a', 'c', 'e',
173 'u', 'n', 'i', 'c', 'o', 'd', 'e',
174 'u', 'p', 'p', 'e', 'r',
176 'x', 'd', 'i', 'g', 'i', 't',
179 static const character_pointer_range<charT> ranges[19] =
181 {data+0, data+5,}, // alnum
182 {data+5, data+10,}, // alpha
183 {data+10, data+15,}, // blank
184 {data+15, data+20,}, // cntrl
185 {data+20, data+21,}, // d
186 {data+20, data+25,}, // digit
187 {data+25, data+30,}, // graph
188 {data+30, data+31,}, // l
189 {data+30, data+35,}, // lower
190 {data+35, data+40,}, // print
191 {data+40, data+45,}, // punct
192 {data+45, data+46,}, // s
193 {data+45, data+50,}, // space
194 {data+57, data+58,}, // u
195 {data+50, data+57,}, // unicode
196 {data+57, data+62,}, // upper
197 {data+62, data+63,}, // w
198 {data+62, data+66,}, // word
199 {data+66, data+72,}, // xdigit
201 static const character_pointer_range<charT>* ranges_begin = ranges;
202 static const character_pointer_range<charT>* ranges_end = ranges + (sizeof(ranges)/sizeof(ranges[0]));
204 character_pointer_range<charT> t = { p1, p2, };
205 const character_pointer_range<charT>* p = std::lower_bound(ranges_begin, ranges_end, t);
206 if((p != ranges_end) && (t == *p))
207 return static_cast<int>(p - ranges);
214 template <class charT>
215 std::ptrdiff_t global_length(const charT* p)
217 std::ptrdiff_t n = 0;
226 inline std::ptrdiff_t global_length<char>(const char* p)
228 return (std::strlen)(p);
230 #ifndef BOOST_NO_WREGEX
232 inline std::ptrdiff_t global_length<wchar_t>(const wchar_t* p)
234 return (std::wcslen)(p);
237 template <class charT>
238 inline charT BOOST_REGEX_CALL global_lower(charT c)
242 template <class charT>
243 inline charT BOOST_REGEX_CALL global_upper(charT c)
248 BOOST_REGEX_DECL char BOOST_REGEX_CALL do_global_lower(char c);
249 BOOST_REGEX_DECL char BOOST_REGEX_CALL do_global_upper(char c);
250 #ifndef BOOST_NO_WREGEX
251 BOOST_REGEX_DECL wchar_t BOOST_REGEX_CALL do_global_lower(wchar_t c);
252 BOOST_REGEX_DECL wchar_t BOOST_REGEX_CALL do_global_upper(wchar_t c);
254 #ifdef BOOST_REGEX_HAS_OTHER_WCHAR_T
255 BOOST_REGEX_DECL unsigned short BOOST_REGEX_CALL do_global_lower(unsigned short c);
256 BOOST_REGEX_DECL unsigned short BOOST_REGEX_CALL do_global_upper(unsigned short c);
259 // This sucks: declare template specialisations of global_lower/global_upper
260 // that just forward to the non-template implementation functions. We do
261 // this because there is one compiler (Compaq Tru64 C++) that doesn't seem
262 // to differentiate between templates and non-template overloads....
263 // what's more, the primary template, plus all overloads have to be
264 // defined in the same translation unit (if one is inline they all must be)
265 // otherwise the "local template instantiation" compiler option can pick
266 // the wrong instantiation when linking:
268 template<> inline char BOOST_REGEX_CALL global_lower<char>(char c){ return do_global_lower(c); }
269 template<> inline char BOOST_REGEX_CALL global_upper<char>(char c){ return do_global_upper(c); }
270 #ifndef BOOST_NO_WREGEX
271 template<> inline wchar_t BOOST_REGEX_CALL global_lower<wchar_t>(wchar_t c){ return do_global_lower(c); }
272 template<> inline wchar_t BOOST_REGEX_CALL global_upper<wchar_t>(wchar_t c){ return do_global_upper(c); }
274 #ifdef BOOST_REGEX_HAS_OTHER_WCHAR_T
275 template<> inline unsigned short BOOST_REGEX_CALL global_lower<unsigned short>(unsigned short c){ return do_global_lower(c); }
276 template<> inline unsigned short BOOST_REGEX_CALL global_upper<unsigned short>(unsigned short c){ return do_global_upper(c); }
279 template <class charT>
280 int global_value(charT c)
282 static const charT zero = '0';
283 static const charT nine = '9';
284 static const charT a = 'a';
285 static const charT f = 'f';
286 static const charT A = 'A';
287 static const charT F = 'F';
290 if(c >= a) return 10 + (c - a);
292 if(c >= A) return 10 + (c - A);
293 if(c > nine) return -1;
294 if(c >= zero) return c - zero;
297 template <class charT, class traits>
298 int global_toi(const charT*& p1, const charT* p2, int radix, const traits& t)
300 (void)t; // warning suppression
301 int next_value = t.value(*p1, radix);
302 if((p1 == p2) || (next_value < 0) || (next_value >= radix))
307 next_value = t.value(*p1, radix);
308 if((next_value < 0) || (next_value >= radix))
311 result += next_value;
321 #pragma warning(push)
322 #pragma warning(disable: 4103)
324 #ifdef BOOST_HAS_ABI_HEADERS
325 # include BOOST_ABI_SUFFIX