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 //////////////////////////////////
|
Chris@16
|
75
|
Chris@16
|
76 #if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
|
Chris@16
|
77
|
Chris@16
|
78 template <typename CharT, typename FakeT>
|
Chris@16
|
79 void chset_negated_set(boost::shared_ptr<basic_chset<CharT> > &ptr, chlit<CharT> const &ch,
|
Chris@16
|
80 FakeT)
|
Chris@16
|
81 {
|
Chris@16
|
82 if(ch.ch != (std::numeric_limits<CharT>::min)()) {
|
Chris@16
|
83 ptr->set((std::numeric_limits<CharT>::min)(), ch.ch - 1);
|
Chris@16
|
84 }
|
Chris@16
|
85 if(ch.ch != (std::numeric_limits<CharT>::max)()) {
|
Chris@16
|
86 ptr->set(ch.ch + 1, (std::numeric_limits<CharT>::max)());
|
Chris@16
|
87 }
|
Chris@16
|
88 }
|
Chris@16
|
89
|
Chris@16
|
90 template <typename CharT, typename FakeT>
|
Chris@16
|
91 void chset_negated_set(boost::shared_ptr<basic_chset<CharT> > &ptr,
|
Chris@16
|
92 spirit::range<CharT> const &rng, FakeT)
|
Chris@16
|
93 {
|
Chris@16
|
94 if(rng.first != (std::numeric_limits<CharT>::min)()) {
|
Chris@16
|
95 ptr->set((std::numeric_limits<CharT>::min)(), rng.first - 1);
|
Chris@16
|
96 }
|
Chris@16
|
97 if(rng.last != (std::numeric_limits<CharT>::max)()) {
|
Chris@16
|
98 ptr->set(rng.last + 1, (std::numeric_limits<CharT>::max)());
|
Chris@16
|
99 }
|
Chris@16
|
100 }
|
Chris@16
|
101
|
Chris@16
|
102 #endif // BOOST_WORKAROUND(BOOST_MSVC, < 1300)
|
Chris@16
|
103
|
Chris@16
|
104 //////////////////////////////////
|
Chris@16
|
105
|
Chris@16
|
106 }} // namespace utility::impl
|
Chris@16
|
107
|
Chris@16
|
108 template <typename CharT>
|
Chris@16
|
109 inline chset<CharT>::chset()
|
Chris@16
|
110 : ptr(new basic_chset<CharT>()) {}
|
Chris@16
|
111
|
Chris@16
|
112 template <typename CharT>
|
Chris@16
|
113 inline chset<CharT>::chset(chset const& arg_)
|
Chris@16
|
114 : ptr(new basic_chset<CharT>(*arg_.ptr)) {}
|
Chris@16
|
115
|
Chris@16
|
116 template <typename CharT>
|
Chris@16
|
117 inline chset<CharT>::chset(CharT arg_)
|
Chris@16
|
118 : ptr(new basic_chset<CharT>())
|
Chris@16
|
119 { ptr->set(arg_); }
|
Chris@16
|
120
|
Chris@16
|
121 template <typename CharT>
|
Chris@16
|
122 inline chset<CharT>::chset(anychar_parser /*arg*/)
|
Chris@16
|
123 : ptr(new basic_chset<CharT>())
|
Chris@16
|
124 {
|
Chris@16
|
125 ptr->set(
|
Chris@16
|
126 (std::numeric_limits<CharT>::min)(),
|
Chris@16
|
127 (std::numeric_limits<CharT>::max)()
|
Chris@16
|
128 );
|
Chris@16
|
129 }
|
Chris@16
|
130
|
Chris@16
|
131 template <typename CharT>
|
Chris@16
|
132 inline chset<CharT>::chset(nothing_parser arg_)
|
Chris@16
|
133 : ptr(new basic_chset<CharT>()) {}
|
Chris@16
|
134
|
Chris@16
|
135 template <typename CharT>
|
Chris@16
|
136 inline chset<CharT>::chset(chlit<CharT> const& arg_)
|
Chris@16
|
137 : ptr(new basic_chset<CharT>())
|
Chris@16
|
138 { ptr->set(arg_.ch); }
|
Chris@16
|
139
|
Chris@16
|
140 template <typename CharT>
|
Chris@16
|
141 inline chset<CharT>::chset(range<CharT> const& arg_)
|
Chris@16
|
142 : ptr(new basic_chset<CharT>())
|
Chris@16
|
143 { ptr->set(arg_.first, arg_.last); }
|
Chris@16
|
144
|
Chris@16
|
145 #if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
|
Chris@16
|
146
|
Chris@16
|
147 template <typename CharT>
|
Chris@16
|
148 inline chset<CharT>::chset(negated_char_parser<chlit<CharT> > const& arg_)
|
Chris@16
|
149 : ptr(new basic_chset<CharT>())
|
Chris@16
|
150 {
|
Chris@16
|
151 set(arg_);
|
Chris@16
|
152 }
|
Chris@16
|
153
|
Chris@16
|
154 template <typename CharT>
|
Chris@16
|
155 inline chset<CharT>::chset(negated_char_parser<range<CharT> > const& arg_)
|
Chris@16
|
156 : ptr(new basic_chset<CharT>())
|
Chris@16
|
157 {
|
Chris@16
|
158 set(arg_);
|
Chris@16
|
159 }
|
Chris@16
|
160
|
Chris@16
|
161 #endif // !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
|
Chris@16
|
162
|
Chris@16
|
163 template <typename CharT>
|
Chris@16
|
164 inline chset<CharT>::~chset() {}
|
Chris@16
|
165
|
Chris@16
|
166 template <typename CharT>
|
Chris@16
|
167 inline chset<CharT>&
|
Chris@16
|
168 chset<CharT>::operator=(chset const& rhs)
|
Chris@16
|
169 {
|
Chris@16
|
170 ptr = rhs.ptr;
|
Chris@16
|
171 return *this;
|
Chris@16
|
172 }
|
Chris@16
|
173
|
Chris@16
|
174 template <typename CharT>
|
Chris@16
|
175 inline chset<CharT>&
|
Chris@16
|
176 chset<CharT>::operator=(CharT rhs)
|
Chris@16
|
177 {
|
Chris@16
|
178 utility::impl::detach_clear(ptr);
|
Chris@16
|
179 ptr->set(rhs);
|
Chris@16
|
180 return *this;
|
Chris@16
|
181 }
|
Chris@16
|
182
|
Chris@16
|
183 template <typename CharT>
|
Chris@16
|
184 inline chset<CharT>&
|
Chris@16
|
185 chset<CharT>::operator=(anychar_parser rhs)
|
Chris@16
|
186 {
|
Chris@16
|
187 utility::impl::detach_clear(ptr);
|
Chris@16
|
188 ptr->set(
|
Chris@16
|
189 (std::numeric_limits<CharT>::min)(),
|
Chris@16
|
190 (std::numeric_limits<CharT>::max)()
|
Chris@16
|
191 );
|
Chris@16
|
192 return *this;
|
Chris@16
|
193 }
|
Chris@16
|
194
|
Chris@16
|
195 template <typename CharT>
|
Chris@16
|
196 inline chset<CharT>&
|
Chris@16
|
197 chset<CharT>::operator=(nothing_parser rhs)
|
Chris@16
|
198 {
|
Chris@16
|
199 utility::impl::detach_clear(ptr);
|
Chris@16
|
200 return *this;
|
Chris@16
|
201 }
|
Chris@16
|
202
|
Chris@16
|
203 template <typename CharT>
|
Chris@16
|
204 inline chset<CharT>&
|
Chris@16
|
205 chset<CharT>::operator=(chlit<CharT> const& rhs)
|
Chris@16
|
206 {
|
Chris@16
|
207 utility::impl::detach_clear(ptr);
|
Chris@16
|
208 ptr->set(rhs.ch);
|
Chris@16
|
209 return *this;
|
Chris@16
|
210 }
|
Chris@16
|
211
|
Chris@16
|
212 template <typename CharT>
|
Chris@16
|
213 inline chset<CharT>&
|
Chris@16
|
214 chset<CharT>::operator=(range<CharT> const& rhs)
|
Chris@16
|
215 {
|
Chris@16
|
216 utility::impl::detach_clear(ptr);
|
Chris@16
|
217 ptr->set(rhs.first, rhs.last);
|
Chris@16
|
218 return *this;
|
Chris@16
|
219 }
|
Chris@16
|
220
|
Chris@16
|
221 #if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
|
Chris@16
|
222
|
Chris@16
|
223 template <typename CharT>
|
Chris@16
|
224 inline chset<CharT>&
|
Chris@16
|
225 chset<CharT>::operator=(negated_char_parser<chlit<CharT> > const& rhs)
|
Chris@16
|
226 {
|
Chris@16
|
227 utility::impl::detach_clear(ptr);
|
Chris@16
|
228 set(rhs);
|
Chris@16
|
229 return *this;
|
Chris@16
|
230 }
|
Chris@16
|
231
|
Chris@16
|
232 template <typename CharT>
|
Chris@16
|
233 inline chset<CharT>&
|
Chris@16
|
234 chset<CharT>::operator=(negated_char_parser<range<CharT> > const& rhs)
|
Chris@16
|
235 {
|
Chris@16
|
236 utility::impl::detach_clear(ptr);
|
Chris@16
|
237 set(rhs);
|
Chris@16
|
238 return *this;
|
Chris@16
|
239 }
|
Chris@16
|
240
|
Chris@16
|
241 #endif // !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
|
Chris@16
|
242
|
Chris@16
|
243 template <typename CharT>
|
Chris@16
|
244 inline void
|
Chris@16
|
245 chset<CharT>::set(range<CharT> const& arg_)
|
Chris@16
|
246 {
|
Chris@16
|
247 utility::impl::detach(ptr);
|
Chris@16
|
248 ptr->set(arg_.first, arg_.last);
|
Chris@16
|
249 }
|
Chris@16
|
250
|
Chris@16
|
251 #if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
|
Chris@16
|
252
|
Chris@16
|
253 template <typename CharT>
|
Chris@16
|
254 inline void
|
Chris@16
|
255 chset<CharT>::set(negated_char_parser<chlit<CharT> > const& arg_)
|
Chris@16
|
256 {
|
Chris@16
|
257 utility::impl::detach(ptr);
|
Chris@16
|
258
|
Chris@16
|
259 if(arg_.positive.ch != (std::numeric_limits<CharT>::min)()) {
|
Chris@16
|
260 ptr->set((std::numeric_limits<CharT>::min)(), arg_.positive.ch - 1);
|
Chris@16
|
261 }
|
Chris@16
|
262 if(arg_.positive.ch != (std::numeric_limits<CharT>::max)()) {
|
Chris@16
|
263 ptr->set(arg_.positive.ch + 1, (std::numeric_limits<CharT>::max)());
|
Chris@16
|
264 }
|
Chris@16
|
265 }
|
Chris@16
|
266
|
Chris@16
|
267 template <typename CharT>
|
Chris@16
|
268 inline void
|
Chris@16
|
269 chset<CharT>::set(negated_char_parser<range<CharT> > const& arg_)
|
Chris@16
|
270 {
|
Chris@16
|
271 utility::impl::detach(ptr);
|
Chris@16
|
272
|
Chris@16
|
273 if(arg_.positive.first != (std::numeric_limits<CharT>::min)()) {
|
Chris@16
|
274 ptr->set((std::numeric_limits<CharT>::min)(), arg_.positive.first - 1);
|
Chris@16
|
275 }
|
Chris@16
|
276 if(arg_.positive.last != (std::numeric_limits<CharT>::max)()) {
|
Chris@16
|
277 ptr->set(arg_.positive.last + 1, (std::numeric_limits<CharT>::max)());
|
Chris@16
|
278 }
|
Chris@16
|
279 }
|
Chris@16
|
280
|
Chris@16
|
281 #endif // !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
|
Chris@16
|
282
|
Chris@16
|
283 template <typename CharT>
|
Chris@16
|
284 inline void
|
Chris@16
|
285 chset<CharT>::clear(range<CharT> const& arg_)
|
Chris@16
|
286 {
|
Chris@16
|
287 utility::impl::detach(ptr);
|
Chris@16
|
288 ptr->clear(arg_.first, arg_.last);
|
Chris@16
|
289 }
|
Chris@16
|
290
|
Chris@16
|
291 template <typename CharT>
|
Chris@16
|
292 inline void
|
Chris@16
|
293 chset<CharT>::clear(negated_char_parser<range<CharT> > const& arg_)
|
Chris@16
|
294 {
|
Chris@16
|
295 utility::impl::detach(ptr);
|
Chris@16
|
296
|
Chris@16
|
297 if(arg_.positive.first != (std::numeric_limits<CharT>::min)()) {
|
Chris@16
|
298 ptr->clear((std::numeric_limits<CharT>::min)(), arg_.positive.first - 1);
|
Chris@16
|
299 }
|
Chris@16
|
300 if(arg_.positive.last != (std::numeric_limits<CharT>::max)()) {
|
Chris@16
|
301 ptr->clear(arg_.positive.last + 1, (std::numeric_limits<CharT>::max)());
|
Chris@16
|
302 }
|
Chris@16
|
303 }
|
Chris@16
|
304
|
Chris@16
|
305 template <typename CharT>
|
Chris@16
|
306 inline bool
|
Chris@16
|
307 chset<CharT>::test(CharT ch) const
|
Chris@16
|
308 { return ptr->test(ch); }
|
Chris@16
|
309
|
Chris@16
|
310 template <typename CharT>
|
Chris@16
|
311 inline chset<CharT>&
|
Chris@16
|
312 chset<CharT>::inverse()
|
Chris@16
|
313 {
|
Chris@16
|
314 utility::impl::detach(ptr);
|
Chris@16
|
315 ptr->inverse();
|
Chris@16
|
316 return *this;
|
Chris@16
|
317 }
|
Chris@16
|
318
|
Chris@16
|
319 template <typename CharT>
|
Chris@16
|
320 inline void
|
Chris@16
|
321 chset<CharT>::swap(chset& x)
|
Chris@16
|
322 { ptr.swap(x.ptr); }
|
Chris@16
|
323
|
Chris@16
|
324 template <typename CharT>
|
Chris@16
|
325 inline chset<CharT>&
|
Chris@16
|
326 chset<CharT>::operator|=(chset const& x)
|
Chris@16
|
327 {
|
Chris@16
|
328 utility::impl::detach(ptr);
|
Chris@16
|
329 *ptr |= *x.ptr;
|
Chris@16
|
330 return *this;
|
Chris@16
|
331 }
|
Chris@16
|
332
|
Chris@16
|
333 template <typename CharT>
|
Chris@16
|
334 inline chset<CharT>&
|
Chris@16
|
335 chset<CharT>::operator&=(chset const& x)
|
Chris@16
|
336 {
|
Chris@16
|
337 utility::impl::detach(ptr);
|
Chris@16
|
338 *ptr &= *x.ptr;
|
Chris@16
|
339 return *this;
|
Chris@16
|
340 }
|
Chris@16
|
341
|
Chris@16
|
342 template <typename CharT>
|
Chris@16
|
343 inline chset<CharT>&
|
Chris@16
|
344 chset<CharT>::operator-=(chset const& x)
|
Chris@16
|
345 {
|
Chris@16
|
346 utility::impl::detach(ptr);
|
Chris@16
|
347 *ptr -= *x.ptr;
|
Chris@16
|
348 return *this;
|
Chris@16
|
349 }
|
Chris@16
|
350
|
Chris@16
|
351 template <typename CharT>
|
Chris@16
|
352 inline chset<CharT>&
|
Chris@16
|
353 chset<CharT>::operator^=(chset const& x)
|
Chris@16
|
354 {
|
Chris@16
|
355 utility::impl::detach(ptr);
|
Chris@16
|
356 *ptr ^= *x.ptr;
|
Chris@16
|
357 return *this;
|
Chris@16
|
358 }
|
Chris@16
|
359
|
Chris@16
|
360 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
361 BOOST_SPIRIT_CLASSIC_NAMESPACE_END
|
Chris@16
|
362
|
Chris@16
|
363 }} // namespace boost::spirit
|
Chris@16
|
364
|
Chris@16
|
365 #endif
|
Chris@16
|
366
|