Chris@16
|
1 /*=============================================================================
|
Chris@16
|
2 Copyright (c) 2001-2003 Joel de Guzman
|
Chris@16
|
3 Copyright (c) 2001-2003 Daniel Nuffer
|
Chris@16
|
4 http://spirit.sourceforge.net/
|
Chris@16
|
5
|
Chris@16
|
6 Use, modification and distribution is subject to the Boost Software
|
Chris@16
|
7 License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
8 http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
9 =============================================================================*/
|
Chris@16
|
10 #ifndef BOOST_SPIRIT_CHSET_IPP
|
Chris@16
|
11 #define BOOST_SPIRIT_CHSET_IPP
|
Chris@16
|
12
|
Chris@16
|
13 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
14 #include <boost/limits.hpp>
|
Chris@16
|
15 #include <boost/spirit/home/classic/utility/chset.hpp>
|
Chris@16
|
16
|
Chris@16
|
17 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
18 namespace boost { namespace spirit {
|
Chris@16
|
19
|
Chris@16
|
20 BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
|
Chris@16
|
21
|
Chris@16
|
22 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
23 //
|
Chris@16
|
24 // chset class
|
Chris@16
|
25 //
|
Chris@16
|
26 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
27 namespace utility { namespace impl {
|
Chris@16
|
28 template <typename CharT>
|
Chris@16
|
29 inline void
|
Chris@16
|
30 detach(boost::shared_ptr<basic_chset<CharT> >& ptr)
|
Chris@16
|
31 {
|
Chris@16
|
32 if (!ptr.unique())
|
Chris@16
|
33 ptr = boost::shared_ptr<basic_chset<CharT> >
|
Chris@16
|
34 (new basic_chset<CharT>(*ptr));
|
Chris@16
|
35 }
|
Chris@16
|
36
|
Chris@16
|
37 template <typename CharT>
|
Chris@16
|
38 inline void
|
Chris@16
|
39 detach_clear(boost::shared_ptr<basic_chset<CharT> >& ptr)
|
Chris@16
|
40 {
|
Chris@16
|
41 if (ptr.unique())
|
Chris@16
|
42 ptr->clear();
|
Chris@16
|
43 else
|
Chris@16
|
44 ptr.reset(new basic_chset<CharT>());
|
Chris@16
|
45 }
|
Chris@16
|
46
|
Chris@16
|
47 template <typename CharT, typename CharT2>
|
Chris@16
|
48 void construct_chset(boost::shared_ptr<basic_chset<CharT> >& ptr,
|
Chris@16
|
49 CharT2 const* definition)
|
Chris@16
|
50 {
|
Chris@16
|
51 CharT2 ch = *definition++;
|
Chris@16
|
52 while (ch)
|
Chris@16
|
53 {
|
Chris@16
|
54 CharT2 next = *definition++;
|
Chris@16
|
55 if (next == '-')
|
Chris@16
|
56 {
|
Chris@16
|
57 next = *definition++;
|
Chris@16
|
58 if (next == 0)
|
Chris@16
|
59 {
|
Chris@16
|
60 ptr->set(ch);
|
Chris@16
|
61 ptr->set('-');
|
Chris@16
|
62 break;
|
Chris@16
|
63 }
|
Chris@16
|
64 ptr->set(ch, next);
|
Chris@16
|
65 }
|
Chris@16
|
66 else
|
Chris@16
|
67 {
|
Chris@16
|
68 ptr->set(ch);
|
Chris@16
|
69 }
|
Chris@16
|
70 ch = next;
|
Chris@16
|
71 }
|
Chris@16
|
72 }
|
Chris@16
|
73
|
Chris@16
|
74 }} // namespace utility::impl
|
Chris@16
|
75
|
Chris@16
|
76 template <typename CharT>
|
Chris@16
|
77 inline chset<CharT>::chset()
|
Chris@16
|
78 : ptr(new basic_chset<CharT>()) {}
|
Chris@16
|
79
|
Chris@16
|
80 template <typename CharT>
|
Chris@16
|
81 inline chset<CharT>::chset(chset const& arg_)
|
Chris@16
|
82 : ptr(new basic_chset<CharT>(*arg_.ptr)) {}
|
Chris@16
|
83
|
Chris@16
|
84 template <typename CharT>
|
Chris@16
|
85 inline chset<CharT>::chset(CharT arg_)
|
Chris@16
|
86 : ptr(new basic_chset<CharT>())
|
Chris@16
|
87 { ptr->set(arg_); }
|
Chris@16
|
88
|
Chris@16
|
89 template <typename CharT>
|
Chris@16
|
90 inline chset<CharT>::chset(anychar_parser /*arg*/)
|
Chris@16
|
91 : ptr(new basic_chset<CharT>())
|
Chris@16
|
92 {
|
Chris@16
|
93 ptr->set(
|
Chris@16
|
94 (std::numeric_limits<CharT>::min)(),
|
Chris@16
|
95 (std::numeric_limits<CharT>::max)()
|
Chris@16
|
96 );
|
Chris@16
|
97 }
|
Chris@16
|
98
|
Chris@16
|
99 template <typename CharT>
|
Chris@16
|
100 inline chset<CharT>::chset(nothing_parser arg_)
|
Chris@16
|
101 : ptr(new basic_chset<CharT>()) {}
|
Chris@16
|
102
|
Chris@16
|
103 template <typename CharT>
|
Chris@16
|
104 inline chset<CharT>::chset(chlit<CharT> const& arg_)
|
Chris@16
|
105 : ptr(new basic_chset<CharT>())
|
Chris@16
|
106 { ptr->set(arg_.ch); }
|
Chris@16
|
107
|
Chris@16
|
108 template <typename CharT>
|
Chris@16
|
109 inline chset<CharT>::chset(range<CharT> const& arg_)
|
Chris@16
|
110 : ptr(new basic_chset<CharT>())
|
Chris@16
|
111 { ptr->set(arg_.first, arg_.last); }
|
Chris@16
|
112
|
Chris@16
|
113 template <typename CharT>
|
Chris@16
|
114 inline chset<CharT>::chset(negated_char_parser<chlit<CharT> > const& arg_)
|
Chris@16
|
115 : ptr(new basic_chset<CharT>())
|
Chris@16
|
116 {
|
Chris@16
|
117 set(arg_);
|
Chris@16
|
118 }
|
Chris@16
|
119
|
Chris@16
|
120 template <typename CharT>
|
Chris@16
|
121 inline chset<CharT>::chset(negated_char_parser<range<CharT> > const& arg_)
|
Chris@16
|
122 : ptr(new basic_chset<CharT>())
|
Chris@16
|
123 {
|
Chris@16
|
124 set(arg_);
|
Chris@16
|
125 }
|
Chris@16
|
126
|
Chris@16
|
127 template <typename CharT>
|
Chris@16
|
128 inline chset<CharT>::~chset() {}
|
Chris@16
|
129
|
Chris@16
|
130 template <typename CharT>
|
Chris@16
|
131 inline chset<CharT>&
|
Chris@16
|
132 chset<CharT>::operator=(chset const& rhs)
|
Chris@16
|
133 {
|
Chris@16
|
134 ptr = rhs.ptr;
|
Chris@16
|
135 return *this;
|
Chris@16
|
136 }
|
Chris@16
|
137
|
Chris@16
|
138 template <typename CharT>
|
Chris@16
|
139 inline chset<CharT>&
|
Chris@16
|
140 chset<CharT>::operator=(CharT rhs)
|
Chris@16
|
141 {
|
Chris@16
|
142 utility::impl::detach_clear(ptr);
|
Chris@16
|
143 ptr->set(rhs);
|
Chris@16
|
144 return *this;
|
Chris@16
|
145 }
|
Chris@16
|
146
|
Chris@16
|
147 template <typename CharT>
|
Chris@16
|
148 inline chset<CharT>&
|
Chris@16
|
149 chset<CharT>::operator=(anychar_parser rhs)
|
Chris@16
|
150 {
|
Chris@16
|
151 utility::impl::detach_clear(ptr);
|
Chris@16
|
152 ptr->set(
|
Chris@16
|
153 (std::numeric_limits<CharT>::min)(),
|
Chris@16
|
154 (std::numeric_limits<CharT>::max)()
|
Chris@16
|
155 );
|
Chris@16
|
156 return *this;
|
Chris@16
|
157 }
|
Chris@16
|
158
|
Chris@16
|
159 template <typename CharT>
|
Chris@16
|
160 inline chset<CharT>&
|
Chris@16
|
161 chset<CharT>::operator=(nothing_parser rhs)
|
Chris@16
|
162 {
|
Chris@16
|
163 utility::impl::detach_clear(ptr);
|
Chris@16
|
164 return *this;
|
Chris@16
|
165 }
|
Chris@16
|
166
|
Chris@16
|
167 template <typename CharT>
|
Chris@16
|
168 inline chset<CharT>&
|
Chris@16
|
169 chset<CharT>::operator=(chlit<CharT> const& rhs)
|
Chris@16
|
170 {
|
Chris@16
|
171 utility::impl::detach_clear(ptr);
|
Chris@16
|
172 ptr->set(rhs.ch);
|
Chris@16
|
173 return *this;
|
Chris@16
|
174 }
|
Chris@16
|
175
|
Chris@16
|
176 template <typename CharT>
|
Chris@16
|
177 inline chset<CharT>&
|
Chris@16
|
178 chset<CharT>::operator=(range<CharT> const& rhs)
|
Chris@16
|
179 {
|
Chris@16
|
180 utility::impl::detach_clear(ptr);
|
Chris@16
|
181 ptr->set(rhs.first, rhs.last);
|
Chris@16
|
182 return *this;
|
Chris@16
|
183 }
|
Chris@16
|
184
|
Chris@16
|
185 template <typename CharT>
|
Chris@16
|
186 inline chset<CharT>&
|
Chris@16
|
187 chset<CharT>::operator=(negated_char_parser<chlit<CharT> > const& rhs)
|
Chris@16
|
188 {
|
Chris@16
|
189 utility::impl::detach_clear(ptr);
|
Chris@16
|
190 set(rhs);
|
Chris@16
|
191 return *this;
|
Chris@16
|
192 }
|
Chris@16
|
193
|
Chris@16
|
194 template <typename CharT>
|
Chris@16
|
195 inline chset<CharT>&
|
Chris@16
|
196 chset<CharT>::operator=(negated_char_parser<range<CharT> > const& rhs)
|
Chris@16
|
197 {
|
Chris@16
|
198 utility::impl::detach_clear(ptr);
|
Chris@16
|
199 set(rhs);
|
Chris@16
|
200 return *this;
|
Chris@16
|
201 }
|
Chris@16
|
202
|
Chris@16
|
203 template <typename CharT>
|
Chris@16
|
204 inline void
|
Chris@16
|
205 chset<CharT>::set(range<CharT> const& arg_)
|
Chris@16
|
206 {
|
Chris@16
|
207 utility::impl::detach(ptr);
|
Chris@16
|
208 ptr->set(arg_.first, arg_.last);
|
Chris@16
|
209 }
|
Chris@16
|
210
|
Chris@16
|
211 template <typename CharT>
|
Chris@16
|
212 inline void
|
Chris@16
|
213 chset<CharT>::set(negated_char_parser<chlit<CharT> > const& arg_)
|
Chris@16
|
214 {
|
Chris@16
|
215 utility::impl::detach(ptr);
|
Chris@16
|
216
|
Chris@16
|
217 if(arg_.positive.ch != (std::numeric_limits<CharT>::min)()) {
|
Chris@16
|
218 ptr->set((std::numeric_limits<CharT>::min)(), arg_.positive.ch - 1);
|
Chris@16
|
219 }
|
Chris@16
|
220 if(arg_.positive.ch != (std::numeric_limits<CharT>::max)()) {
|
Chris@16
|
221 ptr->set(arg_.positive.ch + 1, (std::numeric_limits<CharT>::max)());
|
Chris@16
|
222 }
|
Chris@16
|
223 }
|
Chris@16
|
224
|
Chris@16
|
225 template <typename CharT>
|
Chris@16
|
226 inline void
|
Chris@16
|
227 chset<CharT>::set(negated_char_parser<range<CharT> > const& arg_)
|
Chris@16
|
228 {
|
Chris@16
|
229 utility::impl::detach(ptr);
|
Chris@16
|
230
|
Chris@16
|
231 if(arg_.positive.first != (std::numeric_limits<CharT>::min)()) {
|
Chris@16
|
232 ptr->set((std::numeric_limits<CharT>::min)(), arg_.positive.first - 1);
|
Chris@16
|
233 }
|
Chris@16
|
234 if(arg_.positive.last != (std::numeric_limits<CharT>::max)()) {
|
Chris@16
|
235 ptr->set(arg_.positive.last + 1, (std::numeric_limits<CharT>::max)());
|
Chris@16
|
236 }
|
Chris@16
|
237 }
|
Chris@16
|
238
|
Chris@16
|
239 template <typename CharT>
|
Chris@16
|
240 inline void
|
Chris@16
|
241 chset<CharT>::clear(range<CharT> const& arg_)
|
Chris@16
|
242 {
|
Chris@16
|
243 utility::impl::detach(ptr);
|
Chris@16
|
244 ptr->clear(arg_.first, arg_.last);
|
Chris@16
|
245 }
|
Chris@16
|
246
|
Chris@16
|
247 template <typename CharT>
|
Chris@16
|
248 inline void
|
Chris@16
|
249 chset<CharT>::clear(negated_char_parser<range<CharT> > const& arg_)
|
Chris@16
|
250 {
|
Chris@16
|
251 utility::impl::detach(ptr);
|
Chris@16
|
252
|
Chris@16
|
253 if(arg_.positive.first != (std::numeric_limits<CharT>::min)()) {
|
Chris@16
|
254 ptr->clear((std::numeric_limits<CharT>::min)(), arg_.positive.first - 1);
|
Chris@16
|
255 }
|
Chris@16
|
256 if(arg_.positive.last != (std::numeric_limits<CharT>::max)()) {
|
Chris@16
|
257 ptr->clear(arg_.positive.last + 1, (std::numeric_limits<CharT>::max)());
|
Chris@16
|
258 }
|
Chris@16
|
259 }
|
Chris@16
|
260
|
Chris@16
|
261 template <typename CharT>
|
Chris@16
|
262 inline bool
|
Chris@16
|
263 chset<CharT>::test(CharT ch) const
|
Chris@16
|
264 { return ptr->test(ch); }
|
Chris@16
|
265
|
Chris@16
|
266 template <typename CharT>
|
Chris@16
|
267 inline chset<CharT>&
|
Chris@16
|
268 chset<CharT>::inverse()
|
Chris@16
|
269 {
|
Chris@16
|
270 utility::impl::detach(ptr);
|
Chris@16
|
271 ptr->inverse();
|
Chris@16
|
272 return *this;
|
Chris@16
|
273 }
|
Chris@16
|
274
|
Chris@16
|
275 template <typename CharT>
|
Chris@16
|
276 inline void
|
Chris@16
|
277 chset<CharT>::swap(chset& x)
|
Chris@16
|
278 { ptr.swap(x.ptr); }
|
Chris@16
|
279
|
Chris@16
|
280 template <typename CharT>
|
Chris@16
|
281 inline chset<CharT>&
|
Chris@16
|
282 chset<CharT>::operator|=(chset const& x)
|
Chris@16
|
283 {
|
Chris@16
|
284 utility::impl::detach(ptr);
|
Chris@16
|
285 *ptr |= *x.ptr;
|
Chris@16
|
286 return *this;
|
Chris@16
|
287 }
|
Chris@16
|
288
|
Chris@16
|
289 template <typename CharT>
|
Chris@16
|
290 inline chset<CharT>&
|
Chris@16
|
291 chset<CharT>::operator&=(chset const& x)
|
Chris@16
|
292 {
|
Chris@16
|
293 utility::impl::detach(ptr);
|
Chris@16
|
294 *ptr &= *x.ptr;
|
Chris@16
|
295 return *this;
|
Chris@16
|
296 }
|
Chris@16
|
297
|
Chris@16
|
298 template <typename CharT>
|
Chris@16
|
299 inline chset<CharT>&
|
Chris@16
|
300 chset<CharT>::operator-=(chset const& x)
|
Chris@16
|
301 {
|
Chris@16
|
302 utility::impl::detach(ptr);
|
Chris@16
|
303 *ptr -= *x.ptr;
|
Chris@16
|
304 return *this;
|
Chris@16
|
305 }
|
Chris@16
|
306
|
Chris@16
|
307 template <typename CharT>
|
Chris@16
|
308 inline chset<CharT>&
|
Chris@16
|
309 chset<CharT>::operator^=(chset const& x)
|
Chris@16
|
310 {
|
Chris@16
|
311 utility::impl::detach(ptr);
|
Chris@16
|
312 *ptr ^= *x.ptr;
|
Chris@16
|
313 return *this;
|
Chris@16
|
314 }
|
Chris@16
|
315
|
Chris@16
|
316 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
317 BOOST_SPIRIT_CLASSIC_NAMESPACE_END
|
Chris@16
|
318
|
Chris@16
|
319 }} // namespace boost::spirit
|
Chris@16
|
320
|
Chris@16
|
321 #endif
|
Chris@16
|
322
|