1 /*=============================================================================
2 Copyright (c) 2001-2003 Joel de Guzman
3 Copyright (c) 2001-2003 Daniel Nuffer
4 http://spirit.sourceforge.net/
6 Use, modification and distribution is subject to the Boost Software
7 License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
8 http://www.boost.org/LICENSE_1_0.txt)
9 =============================================================================*/
10 #ifndef BOOST_SPIRIT_CHSET_IPP
11 #define BOOST_SPIRIT_CHSET_IPP
13 ///////////////////////////////////////////////////////////////////////////////
14 #include <boost/limits.hpp>
15 #include <boost/spirit/home/classic/utility/chset.hpp>
17 ///////////////////////////////////////////////////////////////////////////////
18 namespace boost { namespace spirit {
20 BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
22 ///////////////////////////////////////////////////////////////////////////////
26 ///////////////////////////////////////////////////////////////////////////////
27 namespace utility { namespace impl {
28 template <typename CharT>
30 detach(boost::shared_ptr<basic_chset<CharT> >& ptr)
33 ptr = boost::shared_ptr<basic_chset<CharT> >
34 (new basic_chset<CharT>(*ptr));
37 template <typename CharT>
39 detach_clear(boost::shared_ptr<basic_chset<CharT> >& ptr)
44 ptr.reset(new basic_chset<CharT>());
47 template <typename CharT, typename CharT2>
48 void construct_chset(boost::shared_ptr<basic_chset<CharT> >& ptr,
49 CharT2 const* definition)
51 CharT2 ch = *definition++;
54 CharT2 next = *definition++;
74 //////////////////////////////////
76 #if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
78 template <typename CharT, typename FakeT>
79 void chset_negated_set(boost::shared_ptr<basic_chset<CharT> > &ptr, chlit<CharT> const &ch,
82 if(ch.ch != (std::numeric_limits<CharT>::min)()) {
83 ptr->set((std::numeric_limits<CharT>::min)(), ch.ch - 1);
85 if(ch.ch != (std::numeric_limits<CharT>::max)()) {
86 ptr->set(ch.ch + 1, (std::numeric_limits<CharT>::max)());
90 template <typename CharT, typename FakeT>
91 void chset_negated_set(boost::shared_ptr<basic_chset<CharT> > &ptr,
92 spirit::range<CharT> const &rng, FakeT)
94 if(rng.first != (std::numeric_limits<CharT>::min)()) {
95 ptr->set((std::numeric_limits<CharT>::min)(), rng.first - 1);
97 if(rng.last != (std::numeric_limits<CharT>::max)()) {
98 ptr->set(rng.last + 1, (std::numeric_limits<CharT>::max)());
102 #endif // BOOST_WORKAROUND(BOOST_MSVC, < 1300)
104 //////////////////////////////////
106 }} // namespace utility::impl
108 template <typename CharT>
109 inline chset<CharT>::chset()
110 : ptr(new basic_chset<CharT>()) {}
112 template <typename CharT>
113 inline chset<CharT>::chset(chset const& arg_)
114 : ptr(new basic_chset<CharT>(*arg_.ptr)) {}
116 template <typename CharT>
117 inline chset<CharT>::chset(CharT arg_)
118 : ptr(new basic_chset<CharT>())
121 template <typename CharT>
122 inline chset<CharT>::chset(anychar_parser /*arg*/)
123 : ptr(new basic_chset<CharT>())
126 (std::numeric_limits<CharT>::min)(),
127 (std::numeric_limits<CharT>::max)()
131 template <typename CharT>
132 inline chset<CharT>::chset(nothing_parser arg_)
133 : ptr(new basic_chset<CharT>()) {}
135 template <typename CharT>
136 inline chset<CharT>::chset(chlit<CharT> const& arg_)
137 : ptr(new basic_chset<CharT>())
138 { ptr->set(arg_.ch); }
140 template <typename CharT>
141 inline chset<CharT>::chset(range<CharT> const& arg_)
142 : ptr(new basic_chset<CharT>())
143 { ptr->set(arg_.first, arg_.last); }
145 #if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
147 template <typename CharT>
148 inline chset<CharT>::chset(negated_char_parser<chlit<CharT> > const& arg_)
149 : ptr(new basic_chset<CharT>())
154 template <typename CharT>
155 inline chset<CharT>::chset(negated_char_parser<range<CharT> > const& arg_)
156 : ptr(new basic_chset<CharT>())
161 #endif // !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
163 template <typename CharT>
164 inline chset<CharT>::~chset() {}
166 template <typename CharT>
168 chset<CharT>::operator=(chset const& rhs)
174 template <typename CharT>
176 chset<CharT>::operator=(CharT rhs)
178 utility::impl::detach_clear(ptr);
183 template <typename CharT>
185 chset<CharT>::operator=(anychar_parser rhs)
187 utility::impl::detach_clear(ptr);
189 (std::numeric_limits<CharT>::min)(),
190 (std::numeric_limits<CharT>::max)()
195 template <typename CharT>
197 chset<CharT>::operator=(nothing_parser rhs)
199 utility::impl::detach_clear(ptr);
203 template <typename CharT>
205 chset<CharT>::operator=(chlit<CharT> const& rhs)
207 utility::impl::detach_clear(ptr);
212 template <typename CharT>
214 chset<CharT>::operator=(range<CharT> const& rhs)
216 utility::impl::detach_clear(ptr);
217 ptr->set(rhs.first, rhs.last);
221 #if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
223 template <typename CharT>
225 chset<CharT>::operator=(negated_char_parser<chlit<CharT> > const& rhs)
227 utility::impl::detach_clear(ptr);
232 template <typename CharT>
234 chset<CharT>::operator=(negated_char_parser<range<CharT> > const& rhs)
236 utility::impl::detach_clear(ptr);
241 #endif // !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
243 template <typename CharT>
245 chset<CharT>::set(range<CharT> const& arg_)
247 utility::impl::detach(ptr);
248 ptr->set(arg_.first, arg_.last);
251 #if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
253 template <typename CharT>
255 chset<CharT>::set(negated_char_parser<chlit<CharT> > const& arg_)
257 utility::impl::detach(ptr);
259 if(arg_.positive.ch != (std::numeric_limits<CharT>::min)()) {
260 ptr->set((std::numeric_limits<CharT>::min)(), arg_.positive.ch - 1);
262 if(arg_.positive.ch != (std::numeric_limits<CharT>::max)()) {
263 ptr->set(arg_.positive.ch + 1, (std::numeric_limits<CharT>::max)());
267 template <typename CharT>
269 chset<CharT>::set(negated_char_parser<range<CharT> > const& arg_)
271 utility::impl::detach(ptr);
273 if(arg_.positive.first != (std::numeric_limits<CharT>::min)()) {
274 ptr->set((std::numeric_limits<CharT>::min)(), arg_.positive.first - 1);
276 if(arg_.positive.last != (std::numeric_limits<CharT>::max)()) {
277 ptr->set(arg_.positive.last + 1, (std::numeric_limits<CharT>::max)());
281 #endif // !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
283 template <typename CharT>
285 chset<CharT>::clear(range<CharT> const& arg_)
287 utility::impl::detach(ptr);
288 ptr->clear(arg_.first, arg_.last);
291 template <typename CharT>
293 chset<CharT>::clear(negated_char_parser<range<CharT> > const& arg_)
295 utility::impl::detach(ptr);
297 if(arg_.positive.first != (std::numeric_limits<CharT>::min)()) {
298 ptr->clear((std::numeric_limits<CharT>::min)(), arg_.positive.first - 1);
300 if(arg_.positive.last != (std::numeric_limits<CharT>::max)()) {
301 ptr->clear(arg_.positive.last + 1, (std::numeric_limits<CharT>::max)());
305 template <typename CharT>
307 chset<CharT>::test(CharT ch) const
308 { return ptr->test(ch); }
310 template <typename CharT>
312 chset<CharT>::inverse()
314 utility::impl::detach(ptr);
319 template <typename CharT>
321 chset<CharT>::swap(chset& x)
324 template <typename CharT>
326 chset<CharT>::operator|=(chset const& x)
328 utility::impl::detach(ptr);
333 template <typename CharT>
335 chset<CharT>::operator&=(chset const& x)
337 utility::impl::detach(ptr);
342 template <typename CharT>
344 chset<CharT>::operator-=(chset const& x)
346 utility::impl::detach(ptr);
351 template <typename CharT>
353 chset<CharT>::operator^=(chset const& x)
355 utility::impl::detach(ptr);
360 ///////////////////////////////////////////////////////////////////////////////
361 BOOST_SPIRIT_CLASSIC_NAMESPACE_END
363 }} // namespace boost::spirit