]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/spirit/test/qi/range_run.cpp
1 /*=============================================================================
2 Copyright (c) 2001-2011 Joel de Guzman
4 Distributed under the Boost Software License, Version 1.0. (See accompanying
5 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 ==============================================================================*/
9 #include <boost/detail/lightweight_test.hpp>
10 #include <boost/spirit/home/support/char_set/range_run.hpp>
11 #include <boost/random.hpp>
12 #include <boost/dynamic_bitset.hpp>
13 #include <boost/integer_traits.hpp>
15 #if defined(BOOST_MSVC)
16 # pragma warning(disable: 4800) // 'int' : forcing value to bool 'true' or 'false' warning
19 template <typename Char
>
22 if (sizeof(Char
) == sizeof(unsigned))
23 return; // don't do this test if we have a Char that's very big.
24 // the smaller chars will suffice for testing.
26 using boost::spirit::support::detail::range_run
;
27 using boost::spirit::support::detail::range
;
29 typedef boost::integer_traits
<Char
> integer_traits
;
30 Char
const const_min
= integer_traits::const_min
;
31 Char
const const_max
= integer_traits::const_max
;
32 unsigned bit_set_size
= unsigned(const_max
)-unsigned(const_min
)+1;
33 int const test_size
= 1000;
38 boost::uniform_int
<Char
> char_(min
, max
);
39 boost::variate_generator
<boost::mt19937
&, boost::uniform_int
<Char
> >
41 boost::uniform_int
<Char
> _1of10(1, 10);
42 boost::variate_generator
<boost::mt19937
&, boost::uniform_int
<Char
> >
43 on_or_off(rng
, _1of10
);
46 boost::dynamic_bitset
<unsigned> bset(bit_set_size
);
48 for (int i
= 0; i
< test_size
; ++i
)
50 range
<Char
> r
= range
<Char
>(gen(), gen());
52 std::swap(r
.first
, r
.last
);
54 bool set
= on_or_off() != 1;
59 for (int j
= r
.first
; j
<= int(r
.last
); ++j
)
60 bset
[j
-const_min
] = set
;
63 for (int i
= const_min
; i
<= int(const_max
); ++i
)
65 BOOST_TEST(rr
.test(static_cast<Char
>(i
)) == bset
[i
-const_min
]);
72 using boost::spirit::support::detail::range_run
;
73 using boost::spirit::support::detail::range
;
77 rr
.set(range
<char>('a', 'a'));
78 for (char c
= 0; c
< 127; ++c
)
80 BOOST_TEST((c
== 'a') == rr
.test(c
));
85 rr
.set(range
<char>('a', 'z'));
86 rr
.set(range
<char>('A', 'Z'));
87 rr
.clear(range
<char>('A', 'Z'));
88 for (char c
= 0; c
< 127; ++c
)
90 BOOST_TEST(bool(std::islower(c
)) == rr
.test(c
));
95 rr
.set(range
<char>(0, 0));
96 for (char c
= 0; c
< 127; ++c
)
98 BOOST_TEST((c
== 0) == rr
.test(c
));
100 rr
.set(range
<char>(0, 50));
101 for (char c
= 0; c
< 127; ++c
)
103 BOOST_TEST(((c
>= 0) && (c
<= 50)) == rr
.test(c
));
107 range_run
<unsigned char> rr
;
108 rr
.set(range
<unsigned char>(255, 255));
109 for (unsigned char c
= 0; c
< 255; ++c
)
111 BOOST_TEST((c
== 255) == rr
.test(c
));
113 rr
.set(range
<unsigned char>(250, 255));
114 for (unsigned char c
= 0; c
< 255; ++c
)
116 BOOST_TEST((c
>= 250) == rr
.test(c
));
121 rr
.set(range
<char>('a', 'z'));
122 rr
.set(range
<char>('A', 'Z'));
123 for (char c
= 0; c
< 127; ++c
)
125 BOOST_TEST(bool(std::isalpha(c
)) == rr
.test(c
));
130 rr
.set(range
<char>('a', 'z'));
131 rr
.set(range
<char>('A', 'Z'));
132 rr
.clear(range
<char>('J', 'j'));
133 for (char c
= 0; c
< 127; ++c
)
135 BOOST_TEST((bool(std::isalpha(c
)) && (c
< 'J' || c
> 'j')) == rr
.test(c
));
140 rr
.set(range
<char>(3, 3));
141 rr
.set(range
<char>(1, 5));
142 BOOST_TEST(rr
.test(5));
146 for (char c
= 0; c
< 127; ++c
)
150 rr
.set(range
<char>(c
, c
));
153 for (char c
= 0; c
< 127; ++c
)
155 BOOST_TEST(bool((c
& 1)) == rr
.test(c
));
157 rr
.clear(range
<char>(90, 105));
158 for (char c
= 0; c
< 127; ++c
)
160 BOOST_TEST((bool((c
& 1)) && (c
< 90 || c
> 105)) == rr
.test(c
));
165 rr
.set(range
<char>('c', 'e'));
166 rr
.set(range
<char>('g', 'i'));
167 rr
.set(range
<char>('d', 'k'));
168 for (char c
= 'a'; c
<= 'm'; ++c
)
170 BOOST_TEST((c
>= 'c' && c
<= 'k') == rr
.test(c
));
174 typedef boost::integer_traits
<char> traits
;
175 char const const_min
= traits::const_min
;
177 rr
.set(range
<char>(const_min
, const_min
+16));
178 rr
.clear(range
<char>(const_min
, const_min
+8));
179 BOOST_TEST(!rr
.test(const_min
));
180 BOOST_TEST(!rr
.test(const_min
+8));
181 BOOST_TEST(rr
.test(const_min
+9));
182 BOOST_TEST(rr
.test(const_min
+16));
183 BOOST_TEST(!rr
.test(const_min
+17));
187 acid_test
<signed char>();
188 acid_test
<unsigned char>();
189 acid_test
<wchar_t>();
191 acid_test
<signed short>();
192 acid_test
<unsigned short>();
195 return boost::report_errors();