Chris@16
|
1 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
2 // regex_impl.hpp
|
Chris@16
|
3 //
|
Chris@16
|
4 // Copyright 2008 Eric Niebler. Distributed under the Boost
|
Chris@16
|
5 // Software License, Version 1.0. (See accompanying file
|
Chris@16
|
6 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
7
|
Chris@16
|
8 #ifndef BOOST_XPRESSIVE_DETAIL_CORE_REGEX_IMPL_HPP_EAN_10_04_2005
|
Chris@16
|
9 #define BOOST_XPRESSIVE_DETAIL_CORE_REGEX_IMPL_HPP_EAN_10_04_2005
|
Chris@16
|
10
|
Chris@16
|
11 // MS compatible compilers support #pragma once
|
Chris@101
|
12 #if defined(_MSC_VER)
|
Chris@16
|
13 # pragma once
|
Chris@16
|
14 #endif
|
Chris@16
|
15
|
Chris@16
|
16 #include <vector>
|
Chris@16
|
17 #include <boost/intrusive_ptr.hpp>
|
Chris@16
|
18 #include <boost/xpressive/regex_traits.hpp>
|
Chris@16
|
19 #include <boost/xpressive/detail/detail_fwd.hpp>
|
Chris@16
|
20 #include <boost/xpressive/detail/dynamic/matchable.hpp>
|
Chris@16
|
21 #include <boost/xpressive/detail/utility/tracking_ptr.hpp>
|
Chris@16
|
22 #include <boost/xpressive/detail/utility/counted_base.hpp>
|
Chris@16
|
23
|
Chris@16
|
24 namespace boost { namespace xpressive { namespace detail
|
Chris@16
|
25 {
|
Chris@16
|
26
|
Chris@16
|
27 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
28 // finder
|
Chris@16
|
29 template<typename BidiIter>
|
Chris@16
|
30 struct finder
|
Chris@16
|
31 : counted_base<finder<BidiIter> >
|
Chris@16
|
32 {
|
Chris@16
|
33 virtual ~finder() {}
|
Chris@16
|
34 virtual bool ok_for_partial_matches() const { return true; }
|
Chris@16
|
35 virtual bool operator ()(match_state<BidiIter> &state) const = 0;
|
Chris@16
|
36 };
|
Chris@16
|
37
|
Chris@16
|
38 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
39 // traits
|
Chris@16
|
40 template<typename Char>
|
Chris@16
|
41 struct traits
|
Chris@16
|
42 : counted_base<traits<Char> >
|
Chris@16
|
43 {
|
Chris@16
|
44 virtual ~traits() {}
|
Chris@16
|
45 virtual Char tolower(Char ch) const = 0;
|
Chris@16
|
46 virtual Char toupper(Char ch) const = 0;
|
Chris@16
|
47 virtual bool in_range(Char from, Char to, Char ch) const = 0;
|
Chris@16
|
48 virtual int value(Char ch, int radix) const = 0;
|
Chris@16
|
49 };
|
Chris@16
|
50
|
Chris@16
|
51 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
52 // named_mark
|
Chris@16
|
53 template<typename Char>
|
Chris@16
|
54 struct named_mark
|
Chris@16
|
55 {
|
Chris@16
|
56 typedef typename detail::string_type<Char>::type string_type;
|
Chris@16
|
57
|
Chris@16
|
58 named_mark(string_type name, std::size_t mark_nbr)
|
Chris@16
|
59 : name_(name)
|
Chris@16
|
60 , mark_nbr_(mark_nbr)
|
Chris@16
|
61 {}
|
Chris@16
|
62
|
Chris@16
|
63 string_type name_;
|
Chris@16
|
64 std::size_t mark_nbr_;
|
Chris@16
|
65 };
|
Chris@16
|
66
|
Chris@16
|
67 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
68 // traits_holder
|
Chris@16
|
69 template<typename Traits>
|
Chris@16
|
70 struct traits_holder
|
Chris@16
|
71 : traits<typename Traits::char_type>
|
Chris@16
|
72 {
|
Chris@16
|
73 typedef typename Traits::char_type char_type;
|
Chris@16
|
74
|
Chris@16
|
75 explicit traits_holder(Traits const &tr)
|
Chris@16
|
76 : traits_(tr)
|
Chris@16
|
77 {
|
Chris@16
|
78 }
|
Chris@16
|
79
|
Chris@16
|
80 Traits const &traits() const
|
Chris@16
|
81 {
|
Chris@16
|
82 return this->traits_;
|
Chris@16
|
83 }
|
Chris@16
|
84
|
Chris@16
|
85 char_type tolower(char_type ch) const
|
Chris@16
|
86 {
|
Chris@16
|
87 return this->tolower_(ch, typename Traits::version_tag());
|
Chris@16
|
88 }
|
Chris@16
|
89
|
Chris@16
|
90 char_type toupper(char_type ch) const
|
Chris@16
|
91 {
|
Chris@16
|
92 return this->toupper_(ch, typename Traits::version_tag());
|
Chris@16
|
93 }
|
Chris@16
|
94
|
Chris@16
|
95 int value(char_type ch, int radix) const
|
Chris@16
|
96 {
|
Chris@16
|
97 return this->traits_.value(ch, radix);
|
Chris@16
|
98 }
|
Chris@16
|
99
|
Chris@16
|
100 bool in_range(char_type from, char_type to, char_type ch) const
|
Chris@16
|
101 {
|
Chris@16
|
102 return this->traits_.in_range(from, to, ch);
|
Chris@16
|
103 }
|
Chris@16
|
104
|
Chris@16
|
105 private:
|
Chris@16
|
106 char_type tolower_(char_type ch, regex_traits_version_1_tag) const
|
Chris@16
|
107 {
|
Chris@16
|
108 return ch;
|
Chris@16
|
109 }
|
Chris@16
|
110
|
Chris@16
|
111 char_type toupper_(char_type ch, regex_traits_version_1_tag) const
|
Chris@16
|
112 {
|
Chris@16
|
113 return ch;
|
Chris@16
|
114 }
|
Chris@16
|
115
|
Chris@16
|
116 char_type tolower_(char_type ch, regex_traits_version_2_tag) const
|
Chris@16
|
117 {
|
Chris@16
|
118 return this->traits_.tolower(ch);
|
Chris@16
|
119 }
|
Chris@16
|
120
|
Chris@16
|
121 char_type toupper_(char_type ch, regex_traits_version_2_tag) const
|
Chris@16
|
122 {
|
Chris@16
|
123 return this->traits_.toupper(ch);
|
Chris@16
|
124 }
|
Chris@16
|
125
|
Chris@16
|
126 Traits traits_;
|
Chris@16
|
127 };
|
Chris@16
|
128
|
Chris@16
|
129 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
130 // regex_impl
|
Chris@16
|
131 //
|
Chris@16
|
132 template<typename BidiIter>
|
Chris@16
|
133 struct regex_impl
|
Chris@16
|
134 : enable_reference_tracking<regex_impl<BidiIter> >
|
Chris@16
|
135 {
|
Chris@16
|
136 typedef typename iterator_value<BidiIter>::type char_type;
|
Chris@16
|
137
|
Chris@16
|
138 regex_impl()
|
Chris@16
|
139 : enable_reference_tracking<regex_impl<BidiIter> >()
|
Chris@16
|
140 , xpr_()
|
Chris@16
|
141 , traits_()
|
Chris@16
|
142 , finder_()
|
Chris@16
|
143 , named_marks_()
|
Chris@16
|
144 , mark_count_(0)
|
Chris@16
|
145 , hidden_mark_count_(0)
|
Chris@16
|
146 {
|
Chris@16
|
147 #ifdef BOOST_XPRESSIVE_DEBUG_CYCLE_TEST
|
Chris@16
|
148 ++instances;
|
Chris@16
|
149 #endif
|
Chris@16
|
150 }
|
Chris@16
|
151
|
Chris@16
|
152 regex_impl(regex_impl<BidiIter> const &that)
|
Chris@16
|
153 : enable_reference_tracking<regex_impl<BidiIter> >(that)
|
Chris@16
|
154 , xpr_(that.xpr_)
|
Chris@16
|
155 , traits_(that.traits_)
|
Chris@16
|
156 , finder_(that.finder_)
|
Chris@16
|
157 , named_marks_(that.named_marks_)
|
Chris@16
|
158 , mark_count_(that.mark_count_)
|
Chris@16
|
159 , hidden_mark_count_(that.hidden_mark_count_)
|
Chris@16
|
160 {
|
Chris@16
|
161 #ifdef BOOST_XPRESSIVE_DEBUG_CYCLE_TEST
|
Chris@16
|
162 ++instances;
|
Chris@16
|
163 #endif
|
Chris@16
|
164 }
|
Chris@16
|
165
|
Chris@16
|
166 ~regex_impl()
|
Chris@16
|
167 {
|
Chris@16
|
168 #ifdef BOOST_XPRESSIVE_DEBUG_CYCLE_TEST
|
Chris@16
|
169 --instances;
|
Chris@16
|
170 #endif
|
Chris@16
|
171 }
|
Chris@16
|
172
|
Chris@16
|
173 void swap(regex_impl<BidiIter> &that)
|
Chris@16
|
174 {
|
Chris@16
|
175 enable_reference_tracking<regex_impl<BidiIter> >::swap(that);
|
Chris@16
|
176 this->xpr_.swap(that.xpr_);
|
Chris@16
|
177 this->traits_.swap(that.traits_);
|
Chris@16
|
178 this->finder_.swap(that.finder_);
|
Chris@16
|
179 this->named_marks_.swap(that.named_marks_);
|
Chris@16
|
180 std::swap(this->mark_count_, that.mark_count_);
|
Chris@16
|
181 std::swap(this->hidden_mark_count_, that.hidden_mark_count_);
|
Chris@16
|
182 }
|
Chris@16
|
183
|
Chris@16
|
184 intrusive_ptr<matchable_ex<BidiIter> const> xpr_;
|
Chris@16
|
185 intrusive_ptr<traits<char_type> const> traits_;
|
Chris@16
|
186 intrusive_ptr<finder<BidiIter> > finder_;
|
Chris@16
|
187 std::vector<named_mark<char_type> > named_marks_;
|
Chris@16
|
188 std::size_t mark_count_;
|
Chris@16
|
189 std::size_t hidden_mark_count_;
|
Chris@16
|
190
|
Chris@16
|
191 #ifdef BOOST_XPRESSIVE_DEBUG_CYCLE_TEST
|
Chris@16
|
192 static int instances;
|
Chris@16
|
193 #endif
|
Chris@16
|
194
|
Chris@16
|
195 private:
|
Chris@16
|
196 regex_impl &operator =(regex_impl const &);
|
Chris@16
|
197 };
|
Chris@16
|
198
|
Chris@16
|
199 template<typename BidiIter>
|
Chris@16
|
200 void swap(regex_impl<BidiIter> &left, regex_impl<BidiIter> &right)
|
Chris@16
|
201 {
|
Chris@16
|
202 left.swap(right);
|
Chris@16
|
203 }
|
Chris@16
|
204
|
Chris@16
|
205 #ifdef BOOST_XPRESSIVE_DEBUG_CYCLE_TEST
|
Chris@16
|
206 template<typename BidiIter>
|
Chris@16
|
207 int regex_impl<BidiIter>::instances = 0;
|
Chris@16
|
208 #endif
|
Chris@16
|
209
|
Chris@16
|
210 }}} // namespace boost::xpressive::detail
|
Chris@16
|
211
|
Chris@16
|
212 #endif
|