3 #include "cppunit/cppunit_proxy.h"
5 #include <cds/algo/split_bitstring.h>
7 class Split_bitstrig : public CppUnitMini::TestCase
16 byte_order.ui = 0xFF000001;
18 return byte_order.ch != 0x01;
24 if ( is_big_endian() )
32 if ( is_big_endian() )
33 cut_small_be<uint16_t>();
35 cut_small_le<uint16_t>();
40 CPPUNIT_MSG("little-endian byte order");
42 typedef cds::algo::split_bitstring< size_t > split_bitstring;
44 size_t src = sizeof(src) == 8 ? 0xFEDCBA9876543210 : 0x76543210;
45 split_bitstring splitter(src);
49 CPPUNIT_ASSERT( !splitter.eos() );
50 CPPUNIT_ASSERT( splitter );
51 res = splitter.cut(sizeof(src) * 8);
52 CPPUNIT_ASSERT_EX( res == src, "src=" << src << ", result=" << res );
53 CPPUNIT_ASSERT( splitter.eos() );
54 CPPUNIT_ASSERT( !splitter );
55 CPPUNIT_ASSERT(splitter.safe_cut(sizeof(src) * 8) == 0 );
56 CPPUNIT_ASSERT( splitter.eos() );
57 CPPUNIT_ASSERT( !splitter );
59 CPPUNIT_ASSERT( !splitter.eos() );
60 CPPUNIT_ASSERT( splitter );
61 res = splitter.cut(sizeof(src) * 8);
62 CPPUNIT_ASSERT_EX( res == src, "src=" << src << ", result=" << res );
63 CPPUNIT_ASSERT( splitter.eos() );
64 CPPUNIT_ASSERT( !splitter );
65 CPPUNIT_ASSERT(splitter.safe_cut(sizeof(src) * 8) == 0 );
66 CPPUNIT_ASSERT( splitter.eos() );
67 CPPUNIT_ASSERT( !splitter );
71 for ( size_t i = 0; i < sizeof(size_t) * 2; ++i ) {
72 CPPUNIT_ASSERT( !splitter.eos() );
73 CPPUNIT_ASSERT( splitter );
74 CPPUNIT_ASSERT( splitter.cut( 4 ) == i );
76 CPPUNIT_ASSERT( splitter.eos() );
77 CPPUNIT_ASSERT( !splitter );
83 for ( size_t i = 0; i < sizeof(size_t) * 8; ++i ) {
84 CPPUNIT_ASSERT( !splitter.eos() );
85 CPPUNIT_ASSERT( splitter );
86 res = res + (splitter.cut( 1 ) << i);
88 CPPUNIT_ASSERT( splitter.eos() );
89 CPPUNIT_ASSERT( !splitter );
90 CPPUNIT_ASSERT( res == src );
95 for ( size_t k = 0; k < 100; ++k ) {
100 CPPUNIT_ASSERT( !splitter.eos() );
101 CPPUNIT_ASSERT( splitter );
102 int bits = rand() % 16;
103 res = res + ( splitter.safe_cut( bits ) << shift );
106 CPPUNIT_ASSERT( splitter.eos() );
107 CPPUNIT_ASSERT( !splitter );
108 CPPUNIT_ASSERT( res == src );
115 CPPUNIT_MSG("big-endian byte order");
117 typedef cds::algo::split_bitstring< size_t > split_bitstring;
119 size_t src = sizeof(src) == 8 ? 0xFEDCBA9876543210 : 0x76543210;
120 split_bitstring splitter(src);
124 CPPUNIT_ASSERT( !splitter.eos() );
125 CPPUNIT_ASSERT( splitter );
126 res = splitter.cut(sizeof(src) * 8);
127 CPPUNIT_ASSERT_EX( res == src, "src=" << src << ", result=" << res );
128 CPPUNIT_ASSERT( splitter.eos() );
129 CPPUNIT_ASSERT( !splitter );
130 CPPUNIT_ASSERT(splitter.safe_cut(sizeof(src) * 8) == 0 );
131 CPPUNIT_ASSERT( splitter.eos() );
132 CPPUNIT_ASSERT( !splitter );
134 CPPUNIT_ASSERT( !splitter.eos() );
135 CPPUNIT_ASSERT( splitter );
136 res = splitter.cut(sizeof(src) * 8);
137 CPPUNIT_ASSERT_EX( res == src, "src=" << src << ", result=" << res );
138 CPPUNIT_ASSERT( splitter.eos() );
139 CPPUNIT_ASSERT( !splitter );
140 CPPUNIT_ASSERT(splitter.safe_cut(sizeof(src) * 8) == 0 );
141 CPPUNIT_ASSERT( splitter.eos() );
142 CPPUNIT_ASSERT( !splitter );
144 // Cut each hex digit
146 for ( size_t i = 0; i < sizeof(size_t) * 2; ++i ) {
147 CPPUNIT_ASSERT( !splitter.eos() );
148 CPPUNIT_ASSERT( splitter );
149 CPPUNIT_ASSERT( splitter.cut( 4 ) == 0x0F - i );
151 CPPUNIT_ASSERT( splitter.eos() );
152 CPPUNIT_ASSERT( !splitter );
158 for ( size_t i = 0; i < sizeof(size_t) * 8; ++i ) {
159 CPPUNIT_ASSERT( !splitter.eos() );
160 CPPUNIT_ASSERT( splitter );
161 res = (res << 1) + splitter.cut( 1 );
163 CPPUNIT_ASSERT( splitter.eos() );
164 CPPUNIT_ASSERT( !splitter );
165 CPPUNIT_ASSERT( res == src );
170 for ( size_t k = 0; k < 100; ++k ) {
174 CPPUNIT_ASSERT( !splitter.eos() );
175 CPPUNIT_ASSERT( splitter );
176 int bits = rand() % 16;
177 res = (res << bits) + splitter.safe_cut( bits );
179 CPPUNIT_ASSERT( splitter.eos() );
180 CPPUNIT_ASSERT( !splitter );
181 CPPUNIT_ASSERT( res == src );
188 template <typename PartUInt>
191 CPPUNIT_MSG("little-endian byte order");
192 typedef PartUInt part_uint;
194 typedef cds::algo::split_bitstring< uint64_t, part_uint > split_bitstring;
196 uint64_t src = 0xFEDCBA9876543210;
197 split_bitstring splitter(src);
200 // Cut each hex digit
202 for ( size_t i = 0; i < sizeof(size_t) * 2; ++i ) {
203 CPPUNIT_ASSERT( !splitter.eos() );
204 CPPUNIT_ASSERT( splitter );
205 CPPUNIT_ASSERT( static_cast<size_t>(splitter.cut( 4 )) == i );
207 CPPUNIT_ASSERT( splitter.eos() );
208 CPPUNIT_ASSERT( !splitter );
214 for ( size_t i = 0; i < sizeof(size_t) * 8; ++i ) {
215 CPPUNIT_ASSERT( !splitter.eos() );
216 CPPUNIT_ASSERT( splitter );
217 res = res + ( static_cast<uint64_t>(splitter.cut( 1 )) << i);
219 CPPUNIT_ASSERT( splitter.eos() );
220 CPPUNIT_ASSERT( !splitter );
221 CPPUNIT_ASSERT( res == src );
226 for ( size_t k = 0; k < 100; ++k ) {
231 CPPUNIT_ASSERT( !splitter.eos() );
232 CPPUNIT_ASSERT( splitter );
233 int bits = rand() % 16;
234 res = res + ( static_cast<uint64_t>(splitter.safe_cut( bits )) << shift );
237 CPPUNIT_ASSERT( splitter.eos() );
238 CPPUNIT_ASSERT( !splitter );
239 CPPUNIT_ASSERT( res == src );
244 template <typename PartUInt>
247 CPPUNIT_MSG("big-endian byte order");
248 typedef PartUInt part_uint;
250 typedef cds::algo::split_bitstring< uint64_t, part_uint > split_bitstring;
252 uint64_t src = 0xFEDCBA9876543210;
253 split_bitstring splitter(src);
256 // Cut each hex digit
258 for ( size_t i = 0; i < sizeof(size_t) * 2; ++i ) {
259 CPPUNIT_ASSERT( !splitter.eos() );
260 CPPUNIT_ASSERT( splitter );
261 CPPUNIT_ASSERT( splitter.cut( 4 ) == 0x0F - i );
263 CPPUNIT_ASSERT( splitter.eos() );
264 CPPUNIT_ASSERT( !splitter );
270 for ( size_t i = 0; i < sizeof(size_t) * 8; ++i ) {
271 CPPUNIT_ASSERT( !splitter.eos() );
272 CPPUNIT_ASSERT( splitter );
273 res = (res << 1) + splitter.cut( 1 );
275 CPPUNIT_ASSERT( splitter.eos() );
276 CPPUNIT_ASSERT( !splitter );
277 CPPUNIT_ASSERT( res == src );
282 for ( size_t k = 0; k < 100; ++k ) {
286 CPPUNIT_ASSERT( !splitter.eos() );
287 CPPUNIT_ASSERT( splitter );
288 int bits = rand() % 16;
289 res = (res << bits) + splitter.safe_cut( bits );
291 CPPUNIT_ASSERT( splitter.eos() );
292 CPPUNIT_ASSERT( !splitter );
293 CPPUNIT_ASSERT( res == src );
299 CPPUNIT_TEST_SUITE(Split_bitstrig);
300 CPPUNIT_TEST(cut_uint)
301 CPPUNIT_TEST(cut_uint16)
302 CPPUNIT_TEST_SUITE_END();
305 CPPUNIT_TEST_SUITE_REGISTRATION(Split_bitstrig);