@@ -80,4 +80,54 @@ TEST_CASE("pack unpack blocks") {
8080 }
8181}
8282
83+ TEST_CASE (" pack bits unpack blocks" ) {
84+ uint64_t value = 0xaa55aa55aa55aa55ULL ; // arbitrary starting value
85+ for (int m = 0 ; m < 10000 ; ++m) {
86+ for (uint8_t bits = 1 ; bits <= 63 ; ++bits) {
87+ const uint64_t mask = (1ULL << bits) - 1 ;
88+ std::vector<uint64_t > input (8 , 0 );
89+ for (int i = 0 ; i < 8 ; ++i) {
90+ input[i] = value & mask;
91+ value += IGOLDEN64;
92+ }
93+ std::vector<uint8_t > bytes (bits, 0 );
94+ uint8_t offset = 0 ;
95+ uint8_t * ptr = bytes.data ();
96+ for (int i = 0 ; i < 8 ; ++i) {
97+ offset = pack_bits (input[i], bits, ptr, offset);
98+ }
99+ std::vector<uint64_t > output (8 , 0 );
100+ unpack_bits_block8 (output.data (), bytes.data (), bits);
101+ for (int i = 0 ; i < 8 ; ++i) {
102+ REQUIRE (input[i] == output[i]);
103+ }
104+ }
105+ }
106+ }
107+
108+ TEST_CASE (" pack blocks unpack bits" ) {
109+ uint64_t value = 0xaa55aa55aa55aa55ULL ; // arbitrary starting value
110+ for (int m = 0 ; m < 10000 ; ++m) {
111+ for (uint8_t bits = 1 ; bits <= 63 ; ++bits) {
112+ const uint64_t mask = (1ULL << bits) - 1 ;
113+ std::vector<uint64_t > input (8 , 0 );
114+ for (int i = 0 ; i < 8 ; ++i) {
115+ input[i] = value & mask;
116+ value += IGOLDEN64;
117+ }
118+ std::vector<uint8_t > bytes (bits, 0 );
119+ pack_bits_block8 (input.data (), bytes.data (), bits);
120+ std::vector<uint64_t > output (8 , 0 );
121+ uint8_t offset = 0 ;
122+ const uint8_t * cptr = bytes.data ();
123+ for (int i = 0 ; i < 8 ; ++i) {
124+ offset = unpack_bits (output[i], bits, cptr, offset);
125+ }
126+ for (int i = 0 ; i < 8 ; ++i) {
127+ REQUIRE (input[i] == output[i]);
128+ }
129+ }
130+ }
131+ }
132+
83133} /* namespace datasketches */
0 commit comments