Chris@16
|
1 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
2 /// \file regex_traits.hpp
|
Chris@16
|
3 /// Includes the C regex traits or the CPP regex traits header file depending on the
|
Chris@16
|
4 /// BOOST_XPRESSIVE_USE_C_TRAITS macro.
|
Chris@16
|
5 //
|
Chris@16
|
6 // Copyright 2008 Eric Niebler. Distributed under the Boost
|
Chris@16
|
7 // Software License, Version 1.0. (See accompanying file
|
Chris@16
|
8 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
9
|
Chris@16
|
10 #ifndef BOOST_XPRESSIVE_REGEX_TRAITS_HPP_EAN_10_04_2005
|
Chris@16
|
11 #define BOOST_XPRESSIVE_REGEX_TRAITS_HPP_EAN_10_04_2005
|
Chris@16
|
12
|
Chris@16
|
13 // MS compatible compilers support #pragma once
|
Chris@101
|
14 #if defined(_MSC_VER)
|
Chris@16
|
15 # pragma once
|
Chris@16
|
16 #endif
|
Chris@16
|
17
|
Chris@16
|
18 #include <boost/type_traits/is_convertible.hpp>
|
Chris@16
|
19 #include <boost/xpressive/detail/detail_fwd.hpp>
|
Chris@16
|
20
|
Chris@16
|
21 #ifdef BOOST_XPRESSIVE_USE_C_TRAITS
|
Chris@16
|
22 # include <boost/xpressive/traits/c_regex_traits.hpp>
|
Chris@16
|
23 #else
|
Chris@16
|
24 # include <boost/xpressive/traits/cpp_regex_traits.hpp>
|
Chris@16
|
25 #endif
|
Chris@16
|
26
|
Chris@16
|
27 namespace boost { namespace xpressive
|
Chris@16
|
28 {
|
Chris@16
|
29
|
Chris@16
|
30 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
31 // regex_traits_version_1_tag
|
Chris@16
|
32 /// Tag used to denote that a traits class conforms to the version 1 traits
|
Chris@16
|
33 /// interface.
|
Chris@16
|
34 struct regex_traits_version_1_tag
|
Chris@16
|
35 {
|
Chris@16
|
36 };
|
Chris@16
|
37
|
Chris@16
|
38 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
39 // regex_traits_version_2_tag
|
Chris@16
|
40 /// Tag used to denote that a traits class conforms to the version 2 traits
|
Chris@16
|
41 /// interface.
|
Chris@16
|
42 struct regex_traits_version_2_tag
|
Chris@16
|
43 : regex_traits_version_1_tag
|
Chris@16
|
44 {
|
Chris@16
|
45 };
|
Chris@16
|
46
|
Chris@16
|
47 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
48 // regex_traits_version_1_case_fold_tag DEPRECATED use has_fold_case trait
|
Chris@16
|
49 /// INTERNAL ONLY
|
Chris@16
|
50 ///
|
Chris@16
|
51 struct regex_traits_version_1_case_fold_tag
|
Chris@16
|
52 : regex_traits_version_1_tag
|
Chris@16
|
53 {
|
Chris@16
|
54 };
|
Chris@16
|
55
|
Chris@16
|
56 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
57 // has_fold_case
|
Chris@16
|
58 /// Trait used to denote that a traits class has the fold_case member function.
|
Chris@16
|
59 template<typename Traits>
|
Chris@16
|
60 struct has_fold_case
|
Chris@16
|
61 : is_convertible<
|
Chris@16
|
62 typename Traits::version_tag *
|
Chris@16
|
63 , regex_traits_version_1_case_fold_tag *
|
Chris@16
|
64 >
|
Chris@16
|
65 {
|
Chris@16
|
66 };
|
Chris@16
|
67
|
Chris@16
|
68 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
69 // regex_traits
|
Chris@16
|
70 /// Thin wrapper around the default regex_traits implementation, either
|
Chris@16
|
71 /// cpp_regex_traits or c_regex_traits
|
Chris@16
|
72 ///
|
Chris@16
|
73 template<typename Char, typename Impl>
|
Chris@16
|
74 struct regex_traits
|
Chris@16
|
75 : Impl
|
Chris@16
|
76 {
|
Chris@16
|
77 typedef typename Impl::locale_type locale_type;
|
Chris@16
|
78
|
Chris@16
|
79 regex_traits()
|
Chris@16
|
80 : Impl()
|
Chris@16
|
81 {
|
Chris@16
|
82 }
|
Chris@16
|
83
|
Chris@16
|
84 explicit regex_traits(locale_type const &loc)
|
Chris@16
|
85 : Impl(loc)
|
Chris@16
|
86 {
|
Chris@16
|
87 }
|
Chris@16
|
88 };
|
Chris@16
|
89
|
Chris@16
|
90 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
91 // lookup_classname
|
Chris@16
|
92 /// INTERNAL ONLY
|
Chris@16
|
93 template<typename Traits, std::size_t N>
|
Chris@16
|
94 inline typename Traits::char_class_type
|
Chris@16
|
95 lookup_classname(Traits const &traits, char const (&cname)[N], bool icase)
|
Chris@16
|
96 {
|
Chris@16
|
97 typename Traits::char_type name[N] = {0};
|
Chris@16
|
98 for(std::size_t j = 0; j < N-1; ++j)
|
Chris@16
|
99 {
|
Chris@16
|
100 name[j] = traits.widen(cname[j]);
|
Chris@16
|
101 }
|
Chris@16
|
102 return traits.lookup_classname(name, name + N - 1, icase);
|
Chris@16
|
103 }
|
Chris@16
|
104
|
Chris@16
|
105 }}
|
Chris@16
|
106
|
Chris@16
|
107 #endif
|