1 /*=============================================================================
2 Copyright (c) 2001-2011 Joel de Guzman
3 Copyright (c) 2001-2009 Daniel Nuffer
4 http://spirit.sourceforge.net/
6 Distributed under the Boost Software License, Version 1.0. (See accompanying
7 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
8 =============================================================================*/
9 #ifndef BOOST_SPIRIT_BASIC_CHSET_APRIL_17_2008
10 #define BOOST_SPIRIT_BASIC_CHSET_APRIL_17_2008
16 ///////////////////////////////////////////////////////////////////////////////
19 #include <boost/spirit/home/support/char_set/range_run.hpp>
21 namespace boost { namespace spirit { namespace support { namespace detail
23 ///////////////////////////////////////////////////////////////////////////
25 // basic_chset: basic character set implementation using range_run
27 ///////////////////////////////////////////////////////////////////////////
28 template <typename Char>
32 basic_chset(basic_chset const& arg_)
42 set(Char from, Char to)
44 rr.set(range<Char>(from, to));
50 rr.set(range<Char>(c, c));
54 clear(Char from, Char to)
56 rr.clear(range<Char>(from, to));
62 rr.clear(range<Char>(c, c));
76 (std::numeric_limits<Char>::min)(),
77 (std::numeric_limits<Char>::max)()
91 operator|=(basic_chset const& x)
93 typedef typename range_run<Char>::const_iterator const_iterator;
94 for (const_iterator iter = x.rr.begin(); iter != x.rr.end(); ++iter)
100 operator&=(basic_chset const& x)
104 (std::numeric_limits<Char>::min)(),
105 (std::numeric_limits<Char>::max)()
113 operator-=(basic_chset const& x)
115 typedef typename range_run<Char>::const_iterator const_iterator;
116 for (const_iterator iter = x.rr.begin(); iter != x.rr.end(); ++iter)
122 operator^=(basic_chset const& x)
131 private: range_run<Char> rr;
136 ///////////////////////////////////////////////////////////////////////////
138 // basic_chset: specializations for 8 bit chars using std::bitset
140 ///////////////////////////////////////////////////////////////////////////
141 template <typename Char>
142 struct basic_chset_8bit
144 basic_chset_8bit() {}
145 basic_chset_8bit(basic_chset_8bit const& arg_)
151 return bset.test((unsigned char)v);
155 set(Char from, Char to)
157 for (int i = from; i <= to; ++i)
158 bset.set((unsigned char)i);
164 bset.set((unsigned char)c);
168 clear(Char from, Char to)
170 for (int i = from; i <= to; ++i)
171 bset.reset((unsigned char)i);
177 bset.reset((unsigned char)c);
193 swap(basic_chset_8bit& x)
195 std::swap(bset, x.bset);
199 operator|=(basic_chset_8bit const& x)
206 operator&=(basic_chset_8bit const& x)
213 operator-=(basic_chset_8bit const& x)
220 operator^=(basic_chset_8bit const& x)
226 private: std::bitset<256> bset;
229 /////////////////////////////////
231 struct basic_chset<char>
232 : basic_chset_8bit<char> {};
234 /////////////////////////////////
236 struct basic_chset<signed char>
237 : basic_chset_8bit<signed char> {};
239 /////////////////////////////////
241 struct basic_chset<unsigned char>
242 : basic_chset_8bit<unsigned char> {};
244 #endif // #if (CHAR_BIT == 8)