2 This file is a part of libcds - Concurrent Data Structures library
4 (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2017
6 Source code repo: http://github.com/khizmax/libcds/
7 Download: http://sourceforge.net/projects/libcds/files/
9 Redistribution and use in source and binary forms, with or without
10 modification, are permitted provided that the following conditions are met:
12 * Redistributions of source code must retain the above copyright notice, this
13 list of conditions and the following disclaimer.
15 * Redistributions in binary form must reproduce the above copyright notice,
16 this list of conditions and the following disclaimer in the documentation
17 and/or other materials provided with the distribution.
19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 #include <cds/algo/split_bitstring.h>
32 #include <gtest/gtest.h>
41 byte_order.ui = 0xFF000001;
43 return byte_order.ch != 0x01;
46 class Split_bitstrig : public ::testing::Test
51 typedef cds::algo::split_bitstring< size_t, 0, size_t > split_bitstring;
53 size_t src = sizeof(src) == 8 ? 0xFEDCBA9876543210 : 0x76543210;
54 split_bitstring splitter( src );
58 ASSERT_FALSE( splitter.eos() );
59 ASSERT_FALSE( !splitter );
60 res = splitter.cut( sizeof( src ) * 8 );
61 EXPECT_EQ( res, src );
62 ASSERT_TRUE( splitter.eos() );
63 ASSERT_TRUE( !splitter );
64 EXPECT_EQ( splitter.safe_cut( sizeof( src ) * 8 ), 0u );
65 ASSERT_TRUE( splitter.eos() );
66 ASSERT_TRUE( !splitter );
68 ASSERT_FALSE( splitter.eos() );
69 ASSERT_FALSE( !splitter );
70 res = splitter.cut( sizeof( src ) * 8 );
71 EXPECT_EQ( res, src );
72 ASSERT_TRUE( splitter.eos() );
73 ASSERT_TRUE( !splitter );
74 EXPECT_EQ( splitter.safe_cut( sizeof( src ) * 8 ), 0u );
75 ASSERT_TRUE( splitter.eos() );
76 ASSERT_TRUE( !splitter );
78 EXPECT_EQ( *splitter.source(), src );
79 EXPECT_EQ( splitter.rest_count(), 0u );
80 EXPECT_EQ( splitter.bit_offset(), sizeof( src ) * 8 );
84 for ( size_t i = 0; i < sizeof(size_t) * 2; ++i ) {
85 ASSERT_FALSE( splitter.eos());
86 ASSERT_FALSE( !splitter );
87 ASSERT_EQ( splitter.cut( 4 ), i );
89 ASSERT_TRUE( splitter.eos());
90 ASSERT_FALSE( splitter );
91 EXPECT_EQ( splitter.safe_cut( 8 ), 0u );
92 EXPECT_EQ( *splitter.source(), src );
93 EXPECT_EQ( splitter.rest_count(), 0u );
94 EXPECT_EQ( splitter.bit_offset(), sizeof( src ) * 8 );
99 EXPECT_EQ( *splitter.source(), src );
100 EXPECT_EQ( splitter.rest_count(), sizeof( src ) * 8 );
101 EXPECT_EQ( splitter.bit_offset(), 0u );
104 for ( size_t i = 0; i < sizeof(size_t) * 8; ++i ) {
105 ASSERT_FALSE( splitter.eos());
106 ASSERT_FALSE( !splitter );
107 res |= splitter.cut( 1 ) << i;
109 ASSERT_TRUE( splitter.eos());
110 ASSERT_TRUE( !splitter );
111 EXPECT_EQ( res, src );
113 EXPECT_EQ( splitter.safe_cut( 8 ), 0u );
114 EXPECT_EQ( *splitter.source(), src );
115 EXPECT_EQ( splitter.rest_count(), 0u );
116 EXPECT_EQ( splitter.bit_offset(), sizeof( src ) * 8 );
121 for ( size_t k = 0; k < 100; ++k ) {
123 EXPECT_EQ( *splitter.source(), src );
124 EXPECT_EQ( splitter.rest_count(), sizeof( src ) * 8 );
125 EXPECT_EQ( splitter.bit_offset(), 0u );
130 ASSERT_FALSE( splitter.eos());
131 ASSERT_FALSE( !splitter );
132 int bits = std::rand() % 16;
133 res |= splitter.safe_cut( bits ) << shift;
136 ASSERT_TRUE( splitter.eos());
137 ASSERT_TRUE( !splitter );
138 EXPECT_EQ( res, src );
140 EXPECT_EQ( splitter.safe_cut( 8 ), 0u );
141 EXPECT_EQ( *splitter.source(), src );
142 EXPECT_EQ( splitter.rest_count(), 0u );
143 EXPECT_EQ( splitter.bit_offset(), sizeof( src ) * 8 );
150 typedef cds::algo::split_bitstring< size_t, 0, size_t > split_bitstring;
152 size_t src = sizeof(src) == 8 ? 0xFEDCBA9876543210 : 0x76543210;
153 split_bitstring splitter( src );
157 ASSERT_FALSE( splitter.eos() );
158 ASSERT_FALSE( !splitter );
159 res = splitter.cut( sizeof( src ) * 8 );
160 ASSERT_EQ( res, src );
161 ASSERT_TRUE( splitter.eos() );
162 ASSERT_TRUE( !splitter );
163 EXPECT_EQ( splitter.safe_cut( sizeof( src ) * 8 ), 0u );
164 ASSERT_TRUE( splitter.eos() );
165 ASSERT_TRUE( !splitter );
167 ASSERT_FALSE( splitter.eos() );
168 ASSERT_FALSE( !splitter );
169 res = splitter.cut( sizeof( src ) * 8 );
170 EXPECT_EQ( res, src );
171 ASSERT_TRUE( splitter.eos() );
172 ASSERT_TRUE( !splitter );
173 EXPECT_EQ( splitter.safe_cut( sizeof( src ) * 8 ), 0u );
174 ASSERT_TRUE( splitter.eos() );
175 ASSERT_TRUE( !splitter );
177 EXPECT_EQ( *splitter.source(), src );
178 EXPECT_EQ( splitter.rest_count(), 0u );
179 EXPECT_EQ( splitter.bit_offset(), sizeof( src ) * 8 );
181 // Cut each hex digit
183 for ( size_t i = 0; i < sizeof(size_t) * 2; ++i ) {
184 ASSERT_FALSE( splitter.eos());
185 ASSERT_FALSE( !splitter );
186 EXPECT_EQ( splitter.cut( 4 ), 0x0F - i );
188 ASSERT_TRUE( splitter.eos());
189 ASSERT_TRUE( !splitter );
190 EXPECT_EQ( splitter.safe_cut( 8 ), 0u );
191 EXPECT_EQ( *splitter.source(), src );
192 EXPECT_EQ( splitter.rest_count(), 0u );
193 EXPECT_EQ( splitter.bit_offset(), sizeof( src ) * 8 );
198 EXPECT_EQ( *splitter.source(), src );
199 EXPECT_EQ( splitter.rest_count(), sizeof( src ) * 8 );
200 EXPECT_EQ( splitter.bit_offset(), 0u );
203 for ( size_t i = 0; i < sizeof(size_t) * 8; ++i ) {
204 ASSERT_FALSE( splitter.eos());
205 ASSERT_FALSE( !splitter );
206 res = ( res << 1 ) | ( splitter.cut( 1 ) );
208 ASSERT_TRUE( splitter.eos());
209 ASSERT_TRUE( !splitter );
210 EXPECT_EQ( res, src );
212 EXPECT_EQ( splitter.safe_cut( 8 ), 0u );
213 EXPECT_EQ( *splitter.source(), src );
214 EXPECT_EQ( splitter.rest_count(), 0u );
215 EXPECT_EQ( splitter.bit_offset(), sizeof( src ) * 8 );
220 for ( size_t k = 0; k < 100; ++k ) {
222 EXPECT_EQ( *splitter.source(), src );
223 EXPECT_EQ( splitter.rest_count(), sizeof( src ) * 8 );
224 EXPECT_EQ( splitter.bit_offset(), 0u );
228 ASSERT_FALSE( splitter.eos());
229 ASSERT_FALSE( !splitter );
230 unsigned bits = std::rand() % 16;
231 size_t shift = splitter.rest_count();
234 res = (res << shift) | splitter.safe_cut( bits );
236 ASSERT_TRUE( splitter.eos());
237 ASSERT_TRUE( !splitter );
238 EXPECT_EQ( res, src );
240 EXPECT_EQ( splitter.safe_cut( 8 ), 0u );
241 EXPECT_EQ( *splitter.source(), src );
242 EXPECT_EQ( splitter.rest_count(), 0u );
243 EXPECT_EQ( splitter.bit_offset(), sizeof( src ) * 8 );
248 template <typename PartUInt>
251 typedef PartUInt part_uint;
253 typedef cds::algo::split_bitstring< uint64_t, 0, part_uint > split_bitstring;
255 uint64_t src = 0xFEDCBA9876543210;
256 split_bitstring splitter(src);
259 EXPECT_EQ( *splitter.source(), src );
260 EXPECT_EQ( splitter.rest_count(), sizeof( src ) * 8 );
261 EXPECT_EQ( splitter.bit_offset(), 0u );
263 // Cut each hex digit
265 for ( size_t i = 0; i < sizeof(src) * 2; ++i ) {
266 ASSERT_FALSE( splitter.eos());
267 ASSERT_FALSE( !splitter );
268 EXPECT_EQ( static_cast<size_t>(splitter.cut( 4 )), i );
270 ASSERT_TRUE( splitter.eos());
271 ASSERT_TRUE( !splitter );
272 EXPECT_EQ( splitter.safe_cut( 8 ), 0u );
273 EXPECT_EQ( *splitter.source(), src );
274 EXPECT_EQ( splitter.rest_count(), 0u );
275 EXPECT_EQ( splitter.bit_offset(), sizeof( src ) * 8 );
280 EXPECT_EQ( *splitter.source(), src );
281 EXPECT_EQ( splitter.rest_count(), sizeof( src ) * 8 );
282 EXPECT_EQ( splitter.bit_offset(), 0u );
285 for ( size_t i = 0; i < sizeof(src) * 8; ++i ) {
286 ASSERT_FALSE( splitter.eos());
287 ASSERT_FALSE( !splitter );
288 res += static_cast<uint64_t>(splitter.cut( 1 )) << i;
290 ASSERT_TRUE( splitter.eos());
291 ASSERT_TRUE( !splitter );
292 EXPECT_EQ( res, src );
293 EXPECT_EQ( splitter.safe_cut( 8 ), 0u );
294 EXPECT_EQ( *splitter.source(), src );
295 EXPECT_EQ( splitter.rest_count(), 0u );
296 EXPECT_EQ( splitter.bit_offset(), sizeof( src ) * 8 );
301 for ( size_t k = 0; k < 100; ++k ) {
303 EXPECT_EQ( *splitter.source(), src );
304 EXPECT_EQ( splitter.rest_count(), sizeof( src ) * 8 );
305 EXPECT_EQ( splitter.bit_offset(), 0u );
310 ASSERT_FALSE( splitter.eos());
311 ASSERT_FALSE( !splitter );
312 int bits = std::rand() % 16;
313 res += static_cast<uint64_t>(splitter.safe_cut( bits )) << shift;
316 ASSERT_TRUE( splitter.eos());
317 ASSERT_TRUE( !splitter );
318 EXPECT_EQ( res, src );
319 EXPECT_EQ( splitter.safe_cut( 8 ), 0u );
320 EXPECT_EQ( *splitter.source(), src );
321 EXPECT_EQ( splitter.rest_count(), 0u );
322 EXPECT_EQ( splitter.bit_offset(), sizeof( src ) * 8 );
327 template <typename PartUInt>
330 typedef PartUInt part_uint;
332 typedef cds::algo::split_bitstring< uint64_t, 0, part_uint > split_bitstring;
334 uint64_t src = 0xFEDCBA9876543210;
335 split_bitstring splitter(src);
338 EXPECT_EQ( *splitter.source(), src );
339 EXPECT_EQ( splitter.rest_count(), sizeof( src ) * 8 );
340 EXPECT_EQ( splitter.bit_offset(), 0u );
342 // Cut each hex digit
344 for ( size_t i = 0; i < sizeof(size_t) * 2; ++i ) {
345 ASSERT_FALSE( splitter.eos());
346 ASSERT_FALSE( !splitter );
347 EXPECT_EQ( splitter.cut( 4 ), 0x0F - i );
349 ASSERT_TRUE( splitter.eos());
350 ASSERT_TRUE( !splitter );
355 EXPECT_EQ( *splitter.source(), src );
356 EXPECT_EQ( splitter.rest_count(), sizeof( src ) * 8 );
357 EXPECT_EQ( splitter.bit_offset(), 0u );
360 for ( size_t i = 0; i < sizeof(size_t) * 8; ++i ) {
361 ASSERT_FALSE( splitter.eos());
362 ASSERT_FALSE( !splitter );
363 res = (res << 1) + splitter.cut( 1 );
365 ASSERT_TRUE( splitter.eos());
366 ASSERT_TRUE( !splitter );
367 EXPECT_EQ( res, src );
368 EXPECT_EQ( splitter.safe_cut( 8 ), 0u );
369 EXPECT_EQ( *splitter.source(), src );
370 EXPECT_EQ( splitter.rest_count(), 0u );
371 EXPECT_EQ( splitter.bit_offset(), sizeof( src ) * 8 );
376 for ( size_t k = 0; k < 100; ++k ) {
378 EXPECT_EQ( *splitter.source(), src );
379 EXPECT_EQ( splitter.rest_count(), sizeof( src ) * 8 );
380 EXPECT_EQ( splitter.bit_offset(), 0u );
384 ASSERT_FALSE( splitter.eos());
385 ASSERT_FALSE( !splitter );
386 unsigned bits = std::rand() % 16;
387 size_t shift = splitter.rest_count();
390 res = ( res << shift ) | splitter.safe_cut( bits );
392 ASSERT_TRUE( splitter.eos());
393 ASSERT_TRUE( !splitter );
394 EXPECT_EQ( res, src );
395 EXPECT_EQ( splitter.safe_cut( 8 ), 0u );
396 EXPECT_EQ( *splitter.source(), src );
397 EXPECT_EQ( splitter.rest_count(), 0u );
398 EXPECT_EQ( splitter.bit_offset(), sizeof( src ) * 8 );
407 friend bool operator ==( int48 lhs, int48 rhs )
409 return lhs.n32 == rhs.n32 && lhs.n16 == rhs.n16;
412 uint64_t to64() const
414 # ifdef CDS_ARCH_LITTLE_ENDIAN
415 return ( static_cast<uint64_t>( n16 ) << 32 ) + n32;
417 return ( static_cast<uint64_t>( n32 ) << 16 ) + n16;
421 static constexpr size_t int48_size = 6;
426 src.n32 = 0x76543210;
431 #if CDS_BUILD_BITS == 64
433 typedef cds::algo::split_bitstring< int48, int48_size, size_t > split_bitstring;
434 split_bitstring splitter( src );
437 ASSERT_FALSE( splitter.eos() );
438 ASSERT_FALSE( !splitter );
439 res = splitter.cut( int48_size * 8 );
440 EXPECT_EQ( res, src.to64() );
441 ASSERT_TRUE( splitter.eos() );
442 ASSERT_TRUE( !splitter );
443 EXPECT_EQ( splitter.safe_cut( int48_size * 8 ), 0u );
444 ASSERT_TRUE( splitter.eos() );
445 ASSERT_TRUE( !splitter );
447 ASSERT_FALSE( splitter.eos() );
448 ASSERT_FALSE( !splitter );
449 res = splitter.cut( int48_size * 8 );
450 EXPECT_EQ( res, src.to64() );
451 ASSERT_TRUE( splitter.eos() );
452 ASSERT_TRUE( !splitter );
453 EXPECT_EQ( splitter.safe_cut( int48_size * 8 ), 0u );
454 ASSERT_TRUE( splitter.eos() );
455 ASSERT_TRUE( !splitter );
459 typedef cds::algo::split_bitstring< int48, int48_size, size_t > split_bitstring;
460 split_bitstring splitter( src );
462 EXPECT_EQ( splitter.source()->to64(), src.to64() );
463 EXPECT_EQ( splitter.rest_count(), int48_size * 8 );
464 EXPECT_EQ( splitter.bit_offset(), 0u );
466 // Cut each hex digit
468 for ( size_t i = 0; i < int48_size * 2; ++i ) {
469 ASSERT_FALSE( splitter.eos() );
470 ASSERT_FALSE( !splitter );
471 ASSERT_EQ( splitter.cut( 4 ), i );
473 ASSERT_TRUE( splitter.eos() );
474 ASSERT_FALSE( splitter );
475 EXPECT_EQ( splitter.safe_cut( 8 ), 0u );
476 EXPECT_EQ( splitter.source()->to64(), src.to64() );
477 EXPECT_EQ( splitter.rest_count(), 0u );
478 EXPECT_EQ( splitter.bit_offset(), int48_size * 8 );
483 EXPECT_EQ( splitter.source()->to64(), src.to64() );
484 EXPECT_EQ( splitter.rest_count(), int48_size * 8 );
485 EXPECT_EQ( splitter.bit_offset(), 0u );
488 for ( size_t i = 0; i < int48_size * 8; ++i ) {
489 ASSERT_FALSE( splitter.eos() );
490 ASSERT_FALSE( !splitter );
491 #if CDS_BUILD_BITS == 64
492 res |= splitter.cut( 1 ) << i;
494 res |= static_cast<decltype(res)>( splitter.cut( 1 )) << i;
497 ASSERT_TRUE( splitter.eos() );
498 ASSERT_TRUE( !splitter );
499 EXPECT_EQ( res, src.to64() );
500 EXPECT_EQ( splitter.safe_cut( 8 ), 0u );
501 EXPECT_EQ( splitter.source()->to64(), src.to64() );
502 EXPECT_EQ( splitter.rest_count(), 0u );
503 EXPECT_EQ( splitter.bit_offset(), int48_size * 8 );
508 for ( size_t k = 0; k < 100; ++k ) {
510 EXPECT_EQ( splitter.source()->to64(), src.to64() );
511 EXPECT_EQ( splitter.rest_count(), int48_size * 8 );
512 EXPECT_EQ( splitter.bit_offset(), 0u );
517 ASSERT_FALSE( splitter.eos() );
518 ASSERT_FALSE( !splitter );
519 int bits = std::rand() % 16;
520 #if CDS_BUILD_BITS == 64
521 res |= splitter.safe_cut( bits ) << shift;
523 res |= static_cast<decltype(res)>( splitter.safe_cut( bits )) << shift;
527 ASSERT_TRUE( splitter.eos() );
528 ASSERT_TRUE( !splitter );
529 EXPECT_EQ( res, src.to64() );
530 EXPECT_EQ( splitter.safe_cut( 8 ), 0u );
531 EXPECT_EQ( splitter.source()->to64(), src.to64() );
532 EXPECT_EQ( splitter.rest_count(), 0u );
533 EXPECT_EQ( splitter.bit_offset(), int48_size * 8 );
541 src.n32 = 0xBA987654;
546 #if CDS_BUILD_BITS == 64
548 typedef cds::algo::split_bitstring< int48, int48_size, size_t > split_bitstring;
549 split_bitstring splitter( src );
552 ASSERT_FALSE( splitter.eos() );
553 ASSERT_FALSE( !splitter );
554 res = splitter.cut( int48_size * 8 );
555 ASSERT_EQ( res, src.to64() );
556 ASSERT_TRUE( splitter.eos() );
557 ASSERT_TRUE( !splitter );
558 EXPECT_EQ( splitter.safe_cut( int48_size * 8 ), 0u );
559 ASSERT_TRUE( splitter.eos() );
560 ASSERT_TRUE( !splitter );
562 ASSERT_FALSE( splitter.eos() );
563 ASSERT_FALSE( !splitter );
564 res = splitter.cut( int48_size * 8 );
565 EXPECT_EQ( res, src.to64() );
566 ASSERT_TRUE( splitter.eos() );
567 ASSERT_TRUE( !splitter );
568 EXPECT_EQ( splitter.safe_cut( int48_size * 8 ), 0u );
569 ASSERT_TRUE( splitter.eos() );
570 ASSERT_TRUE( !splitter );
574 typedef cds::algo::split_bitstring< int48, int48_size, size_t > split_bitstring;
575 split_bitstring splitter( src );
577 EXPECT_EQ( splitter.source()->to64(), src.to64() );
578 EXPECT_EQ( splitter.rest_count(), int48_size * 8 );
579 EXPECT_EQ( splitter.bit_offset(), 0u );
581 // Cut each hex digit
583 for ( size_t i = 0; i < int48_size * 2; ++i ) {
584 ASSERT_FALSE( splitter.eos() );
585 ASSERT_FALSE( !splitter );
586 EXPECT_EQ( splitter.cut( 4 ), 0x0B - i );
588 ASSERT_TRUE( splitter.eos() );
589 ASSERT_TRUE( !splitter );
590 EXPECT_EQ( splitter.safe_cut( 8 ), 0u );
591 EXPECT_EQ( splitter.source()->to64(), src.to64() );
592 EXPECT_EQ( splitter.rest_count(), 0u );
593 EXPECT_EQ( splitter.bit_offset(), int48_size * 8 );
598 EXPECT_EQ( splitter.source()->to64(), src.to64() );
599 EXPECT_EQ( splitter.rest_count(), int48_size * 8 );
600 EXPECT_EQ( splitter.bit_offset(), 0u );
603 for ( size_t i = 0; i < int48_size * 8; ++i ) {
604 ASSERT_FALSE( splitter.eos() );
605 ASSERT_FALSE( !splitter );
606 #if CDS_BUILD_BITS == 64
607 res = ( res << 1 ) | ( splitter.cut( 1 ) );
609 res = ( res << 1 ) | static_cast<decltype(res)>( splitter.cut( 1 ) );
612 ASSERT_TRUE( splitter.eos() );
613 ASSERT_TRUE( !splitter );
614 EXPECT_EQ( res, src.to64() );
615 EXPECT_EQ( splitter.safe_cut( 8 ), 0u );
616 EXPECT_EQ( splitter.source()->to64(), src.to64() );
617 EXPECT_EQ( splitter.rest_count(), 0u );
618 EXPECT_EQ( splitter.bit_offset(), int48_size * 8 );
623 for ( size_t k = 0; k < 100; ++k ) {
625 EXPECT_EQ( splitter.source()->to64(), src.to64() );
626 EXPECT_EQ( splitter.rest_count(), int48_size * 8 );
627 EXPECT_EQ( splitter.bit_offset(), 0u );
631 ASSERT_FALSE( splitter.eos() );
632 ASSERT_FALSE( !splitter );
633 unsigned bits = std::rand() % 16;
634 size_t shift = splitter.rest_count();
637 #if CDS_BUILD_BITS == 64
638 res = ( res << shift ) | splitter.safe_cut( bits );
640 res = ( res << shift ) | static_cast<decltype(res)>( splitter.safe_cut( bits ));
643 ASSERT_TRUE( splitter.eos() );
644 ASSERT_TRUE( !splitter );
645 EXPECT_EQ( res, src.to64() );
646 EXPECT_EQ( splitter.safe_cut( 8 ), 0u );
647 EXPECT_EQ( splitter.source()->to64(), src.to64() );
648 EXPECT_EQ( splitter.rest_count(), 0u );
649 EXPECT_EQ( splitter.bit_offset(), int48_size * 8 );
656 size_t src = sizeof( src ) == 8 ? 0xFEDCBA9876543210 : 0x76543210;
658 typedef cds::algo::byte_splitter< size_t > splitter_type;
659 splitter_type splitter( src );
661 ASSERT_TRUE( !splitter.eos() );
662 EXPECT_EQ( *splitter.source(), src );
663 EXPECT_EQ( splitter.rest_count(), sizeof( src ) * 8 );
664 EXPECT_EQ( splitter.bit_offset(), 0u );
665 EXPECT_TRUE( splitter.is_correct( 8 ) );
666 EXPECT_FALSE( splitter.is_correct( 4 ) );
668 unsigned expected = 0x10;
669 for ( unsigned i = 0; i < splitter_type::c_bitstring_size; ++i ) {
670 auto part = splitter.cut( 8 );
671 EXPECT_EQ( part, expected );
675 ASSERT_TRUE( splitter.eos() );
676 EXPECT_EQ( splitter.safe_cut( 8 ), 0u );
677 EXPECT_EQ( *splitter.source(), src );
678 EXPECT_EQ( splitter.rest_count(), 0u );
679 EXPECT_EQ( splitter.bit_offset(), sizeof( src ) * 8 );
684 size_t src = sizeof( src ) == 8 ? 0xFEDCBA9876543210 : 0x76543210;
686 typedef cds::algo::byte_splitter< size_t > splitter_type;
687 splitter_type splitter( src );
689 ASSERT_TRUE( !splitter.eos() );
690 EXPECT_EQ( *splitter.source(), src );
691 EXPECT_EQ( splitter.rest_count(), sizeof( src ) * 8 );
692 EXPECT_EQ( splitter.bit_offset(), 0u );
693 EXPECT_TRUE( splitter.is_correct( 8 ) );
694 EXPECT_FALSE( splitter.is_correct( 4 ) );
696 unsigned expected = 0xFE;
697 for ( unsigned i = 0; i < splitter_type::c_bitstring_size; ++i ) {
698 auto part = splitter.cut( 8 );
699 EXPECT_EQ( part, expected );
703 ASSERT_TRUE( splitter.eos() );
704 EXPECT_EQ( splitter.safe_cut( 8 ), 0u );
705 EXPECT_EQ( *splitter.source(), src );
706 EXPECT_EQ( splitter.rest_count(), 0u );
707 EXPECT_EQ( splitter.bit_offset(), sizeof( src ) * 8 );
711 class Split_number: public ::testing::Test
714 template <typename Int>
715 void split( Int const n )
717 cds::algo::number_splitter< Int > splitter( n );
719 // split by hex digit
720 for ( unsigned count = 4; count < sizeof( Int ) * 8; count += 4 ) {
721 EXPECT_EQ( splitter.cut( 4 ), static_cast<Int>( count / 4 - 1 ));
725 for ( int i = 0; i < 100; ++i ) {
727 EXPECT_EQ( splitter.source(), n );
728 EXPECT_EQ( splitter.bit_offset(), 0u );
729 EXPECT_EQ( splitter.rest_count(), sizeof( Int ) * 8 );
734 while ( total < sizeof( Int ) * 8 ) {
735 unsigned count = std::rand() % 16;
737 unsigned shift = count;
738 if ( total + count > sizeof( Int ) * 8 )
739 shift = sizeof( Int ) * 8 - total;
741 result += splitter.safe_cut( count ) << total;
745 EXPECT_EQ( result, n );
747 EXPECT_EQ( splitter.bit_offset(), sizeof( Int ) * 8 );
748 EXPECT_EQ( splitter.rest_count(), 0u );
754 TEST_F( Split_bitstrig, cut_uint )
756 if ( is_big_endian())
762 TEST_F( Split_bitstrig, cut_uint16 )
764 if ( is_big_endian())
765 cut_small_be<uint16_t>();
767 cut_small_le<uint16_t>();
770 TEST_F( Split_bitstrig, cut_int48 )
772 if ( is_big_endian() )
778 TEST_F( Split_bitstrig, cut_byte )
780 if ( is_big_endian() )
786 TEST_F( Split_number, split_int )
788 split( (int)0x76543210 );
791 TEST_F( Split_number, split_uint )
793 split( (unsigned)0x76543210 );
796 TEST_F( Split_number, split_short )
798 split( (short int)0x3210 );
801 TEST_F( Split_number, split_ushort )
803 split( (unsigned short)0x3210 );
806 TEST_F( Split_number, split_long )
808 if ( sizeof( long ) == 8 )
809 split( (long)0xFEDCBA9876543210 );
811 split( (long)0x76543210 );
814 TEST_F( Split_number, split_ulong )
816 if ( sizeof( long ) == 8 )
817 split( (unsigned long)0xFEDCBA9876543210 );
819 split( (unsigned long)0x76543210 );
822 TEST_F( Split_number, split_int64 )
824 split( (int64_t)0xFEDCBA9876543210 );
827 TEST_F( Split_number, split_uint64 )
829 split( (uint64_t)0xFEDCBA9876543210 );