Aleph-w 3.0
A C++ Library for Data Structures and Algorithms
Loading...
Searching...
No Matches
bitarray.cc
Go to the documentation of this file.
1
2/*
3 Aleph_w
4
5 Data structures & Algorithms
6 version 2.0.0b
7 https://github.com/lrleon/Aleph-w
8
9 This file is part of Aleph-w library
10
11 Copyright (c) 2002-2026 Leandro Rabindranath Leon
12
13 Permission is hereby granted, free of charge, to any person obtaining a copy
14 of this software and associated documentation files (the "Software"), to deal
15 in the Software without restriction, including without limitation the rights
16 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
17 copies of the Software, and to permit persons to whom the Software is
18 furnished to do so, subject to the following conditions:
19
20 The above copyright notice and this permission notice shall be included in all
21 copies or substantial portions of the Software.
22
23 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
28 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29 SOFTWARE.
30*/
31
32
38#include <gtest/gtest.h>
39
40#include <bitArray.H>
41
42#include <cstdint>
43#include <limits>
44#include <random>
45#include <sstream>
46#include <string>
47#include <type_traits>
48#include <vector>
49
50using namespace Aleph;
51using namespace std;
52
53namespace {
54
55struct SavedBitArray
56{
57 size_t num_bytes = 0;
58 size_t num_bits = 0;
59 vector<int> bytes;
60};
61
62SavedBitArray save_and_parse(const BitArray &arr)
63{
64 ostringstream out;
65 arr.save(out);
66
67 istringstream in(out.str());
68 SavedBitArray parsed;
69 in >> parsed.num_bytes >> parsed.num_bits;
70 parsed.bytes.reserve(parsed.num_bytes);
71 for (size_t i = 0; i < parsed.num_bytes; ++i)
72 {
73 int value = 0;
74 in >> value;
75 parsed.bytes.push_back(value);
76 }
77 return parsed;
78}
79
80string bits_to_string(const vector<unsigned int> &bits)
81{
82 string out;
83 out.reserve(bits.size());
84 for (auto bit : bits)
85 out.push_back(bit ? '1' : '0');
86 return out;
87}
88
89template <typename U>
90string to_bit_string(U value, const size_t num_bits)
91{
92 string out;
93 out.reserve(num_bits);
94 for (size_t i = 0; i < num_bits; ++i)
95 {
96 const size_t shift = num_bits - i - 1;
97 const bool bit = ((value >> shift) & U(1)) != 0;
98 out.push_back(bit ? '1' : '0');
99 }
100 return out;
101}
102
103template <typename T>
104string expected_set_num_bits(const T value)
105{
106 using U = std::make_unsigned_t<T>;
107 const U u = static_cast<U>(value);
108 return to_bit_string(u, sizeof(T) * 8);
109}
110
112{
113 bernoulli_distribution dist(0.5);
115 bits.reserve(n);
116 for (size_t i = 0; i < n; ++i)
117 bits.push_back(dist(rng) ? 1u : 0u);
118 return bits;
119}
120
122{
123 BitArray arr(bits.size());
124 for (size_t i = 0; i < bits.size(); ++i)
125 if (bits[i])
126 arr.write_bit(i, 1);
127 return arr;
128}
129
131 const vector<unsigned int> &b)
132{
133 const size_t n = max(a.size(), b.size());
135 for (size_t i = 0; i < n; ++i)
136 {
137 const unsigned int lhs = i < a.size() ? a[i] : 0u;
138 const unsigned int rhs = i < b.size() ? b[i] : 0u;
139 out[i] = lhs | rhs;
140 }
141 return out;
142}
143
145 const vector<unsigned int> &b)
146{
147 const size_t n = min(a.size(), b.size());
149 for (size_t i = 0; i < n; ++i)
150 out[i] = a[i] & b[i];
151 return out;
152}
153
155{
156 BitArray empty;
157 EXPECT_EQ(empty.size(), 0u);
158 EXPECT_THROW((void) empty.read_bit(0), std::out_of_range);
159
160 BitArray a(10);
161 EXPECT_EQ(a.size(), 10u);
162 for (size_t i = 0; i < a.size(); ++i)
163 EXPECT_EQ(a.read_bit(i), 0);
164
165 BitArray ones(10, 1);
166 EXPECT_EQ(ones.size(), 10u);
167 EXPECT_EQ(ones.count_ones(), 10);
168 EXPECT_EQ(ones.count_zeros(), 0);
169 EXPECT_EQ(ones.get_bit_str(), string(10, '1'));
170}
171
173{
174 static_assert(sizeof(Byte) == 1);
175
176 Byte b;
177 EXPECT_EQ(b.get_int(), 0);
178 EXPECT_EQ(b.count_ones(), 0);
179 EXPECT_EQ(b.count_zeros(), 8);
180
181 b.write_bit(0, 1);
182 b.write_bit(2, 1);
183 EXPECT_EQ(b.get_int(), 0b00000101);
184 EXPECT_EQ(b.read_bit(0), 1u);
185 EXPECT_EQ(b.read_bit(1), 0u);
186 EXPECT_EQ(b.read_bit(2), 1u);
187
188 b.set_int(0xA5); // 1010'0101
189 EXPECT_EQ(b.get_int(), 0xA5);
190 EXPECT_EQ(b.read_bit(0), 1u);
191 EXPECT_EQ(b.read_bit(2), 1u);
192 EXPECT_EQ(b.read_bit(5), 1u);
193 EXPECT_EQ(b.read_bit(7), 1u);
194 EXPECT_EQ(b.count_ones(), 4);
195 EXPECT_EQ(b.count_zeros(), 4);
196}
197
199{
200 BitArray a;
201 a[0] = 1;
202 EXPECT_EQ(a.size(), 1u);
203 EXPECT_EQ(a.read_bit(0), 1);
204
205 a[10] = 1;
206 EXPECT_EQ(a.size(), 11u);
207 EXPECT_EQ(a.read_bit(0), 1);
208 EXPECT_EQ(a.read_bit(9), 0);
209 EXPECT_EQ(a.read_bit(10), 1);
210
211 BitArray sparse(40'000); // sized, but blocks not allocated
212 BitArray b;
213 EXPECT_NO_THROW(b[0] = sparse[0]);
214 EXPECT_EQ(b.size(), 1u);
215 EXPECT_EQ(b.read_bit(0), 0);
216
217 const BitArray c(1);
218 EXPECT_THROW((void) c[1], std::out_of_range);
219}
220
222{
223 BitArray a;
224
225 a.set_size(1);
226 {
227 const auto saved = save_and_parse(a);
228 EXPECT_EQ(saved.num_bytes, 1u);
229 EXPECT_EQ(saved.num_bits, 1u);
230 }
231
232 a.set_size(16);
233 {
234 const auto saved = save_and_parse(a);
235 EXPECT_EQ(saved.num_bytes, 2u);
236 EXPECT_EQ(saved.num_bits, 16u);
237 }
238
239 a.set_size(17);
240 {
241 const auto saved = save_and_parse(a);
242 EXPECT_EQ(saved.num_bytes, 3u);
243 EXPECT_EQ(saved.num_bits, 17u);
244 }
245}
246
248{
249 BitArray a;
250 a.reserve(9);
251 EXPECT_EQ(a.size(), 9u);
252
253 a.write(8, 1);
254 EXPECT_EQ(a.read(8), 1);
255 EXPECT_EQ(a.read_bit(8), 1);
256}
257
259{
260 BitArray a;
261 a.write_bit(40'000, 1);
262 EXPECT_EQ(a.size(), 40'001u);
263 EXPECT_EQ(a.read_bit(0), 0);
264 EXPECT_EQ(a.read_bit(1), 0);
265 EXPECT_EQ(a.read_bit(39'999), 0);
266 EXPECT_EQ(a.read_bit(40'000), 1);
267}
268
270{
271 BitArray a;
272 EXPECT_THROW(a.pop(), std::underflow_error);
273
274 a.push(1);
275 a.push(0);
276 a.push(1);
277 EXPECT_EQ(a.size(), 3u);
278 EXPECT_EQ(a.get_bit_str(), "101");
279
280 a.pop();
281 EXPECT_EQ(a.size(), 2u);
282 EXPECT_EQ(a.get_bit_str(), "10");
283 EXPECT_THROW((void) a.read_bit(2), std::out_of_range);
284
285 a.empty();
286 EXPECT_EQ(a.size(), 0u);
287}
288
290{
291 BitArray a;
292 a.set_bit_str("10110011");
293 a.write_bit(40'000, 1); // force sparse blocks
294
295 ostringstream out;
296 a.save(out);
297
298 istringstream in(out.str());
299 BitArray b;
300 b.load(in);
301
302 EXPECT_TRUE(a == b);
303 EXPECT_EQ(b.size(), a.size());
304 EXPECT_EQ(b.read_bit(40'000), 1);
305}
306
308{
309 BitArray a;
310 a.set_bit_str("10110011");
311
312 const auto saved = save_and_parse(a);
314 bytes.reserve(saved.num_bytes);
315 for (int value : saved.bytes)
316 bytes.push_back(static_cast<unsigned char>(value));
317
318 BitArray b;
319 b.load_from_array_of_chars(bytes.data(), saved.num_bits);
320 EXPECT_TRUE(a == b);
321}
322
324{
325 BitArray a;
326 a.set_bit_str("10110011");
327
328 BitArray left = a;
329 left.left_shift(2);
330 EXPECT_EQ(left.get_bit_str(), "11001100");
331
332 BitArray right = a;
333 right.right_shift(2);
334 EXPECT_EQ(right.get_bit_str(), "00101100");
335
336 BitArray dyn = a;
337 dyn.dyn_left_shift(2);
338 EXPECT_EQ(dyn.get_bit_str(), "1011001100");
339 dyn.dyn_right_shift(2);
340 EXPECT_EQ(dyn.get_bit_str(), a.get_bit_str());
341
342 BitArray too_much = a;
343 too_much.dyn_right_shift(1'000);
344 EXPECT_EQ(too_much.size(), 1u);
345 EXPECT_EQ(too_much.get_bit_str(), "0");
346}
347
349{
350 BitArray a;
351 a.set_bit_str("10110011");
352
353 BitArray left = a;
354 left.circular_left_shift(10); // 10 % 8 == 2
355 EXPECT_EQ(left.get_bit_str(), "11001110");
356
357 BitArray right = a;
358 right.circular_right_shift(10); // 10 % 8 == 2
359 EXPECT_EQ(right.get_bit_str(), "11101100");
360
361 BitArray empty;
364}
365
367{
368 BitArray a;
369 a.set_bit_str("10101");
370
371 BitArray b;
372 b.set_bit_str("00110011");
373
374 BitArray c = a | b;
375 EXPECT_EQ(c.get_bit_str(), "10111011");
376
377 BitArray d = a & b;
378 EXPECT_EQ(d.get_bit_str(), "00100");
379}
380
382{
384 rhs.set_size(16);
385 for (size_t i = 9; i < 16; ++i)
386 rhs.write_bit(i, 1);
387 rhs.set_size(9); // last byte still exists, but bits 9..15 are out of range
388
390 lhs.set_size(16);
391 lhs |= rhs;
392
393 for (size_t i = 9; i < 16; ++i)
394 EXPECT_EQ(lhs.read_bit(i), 0);
395}
396
398{
399 // num_bits is not multiple of 8; extra bits in last byte must not leak.
400 const unsigned char bytes[] = {0x00, 0xFF};
402 rhs.load_from_array_of_chars(bytes, 9);
403
405 lhs.set_size(16);
406 lhs |= rhs;
407
408 EXPECT_EQ(lhs.read_bit(8), 1);
409 for (size_t i = 9; i < 16; ++i)
410 EXPECT_EQ(lhs.read_bit(i), 0);
411}
412
414{
415 BitArray a;
416 a.set_size(16);
417 a.write_bit(8, 1);
418 for (size_t i = 9; i < 16; ++i)
419 a.write_bit(i, 1);
420
421 a.set_size(9);
422 EXPECT_EQ(a.read_bit(8), 1);
423
424 // Extend without set_size(), so intermediate bits must already be cleared.
425 a.write_bit(15, 0);
426 EXPECT_EQ(a.size(), 16u);
427 EXPECT_EQ(a.read_bit(8), 1);
428 for (size_t i = 9; i < 15; ++i)
429 EXPECT_EQ(a.read_bit(i), 0);
430}
431
433{
434 BitArray a;
435 a.set_bit_str("101");
436
437 auto it = a.get_it();
438 ASSERT_TRUE(it.has_curr());
439 EXPECT_EQ(it.get_curr(), 1u);
440 it.next();
441 EXPECT_EQ(it.get_curr(), 0u);
442 it.next();
443 EXPECT_EQ(it.get_curr(), 1u);
444 it.next();
445 EXPECT_FALSE(it.has_curr());
446 EXPECT_EQ(it.get_curr_ne(), 0u);
447
448 struct StopOnOne
449 {
450 int visited = 0;
451 bool operator()(int bit)
452 {
453 ++visited;
454 return bit == 0;
455 }
456 };
457
458 BitArray b;
459 b.set_bit_str("000100");
460 StopOnOne op;
461 const bool completed = b.traverse(op);
463 EXPECT_EQ(op.visited, 4);
464}
465
467{
470 EXPECT_EQ(it.get_curr_ne(), 0u);
471 EXPECT_THROW((void) it.get_curr(), std::overflow_error);
472 EXPECT_NO_THROW(it.end()); // should be a no-op and not crash
473 EXPECT_THROW(it.next(), std::overflow_error);
474 EXPECT_THROW(it.prev(), std::underflow_error);
475}
476
478{
479 BitArray empty;
480 auto it = empty.get_it();
482 EXPECT_EQ(it.get_curr_ne(), 0u);
483 EXPECT_THROW((void) it.get_curr(), std::overflow_error);
484 EXPECT_THROW(it.next(), std::overflow_error);
485
486 it.reset_last();
488 EXPECT_THROW(it.prev(), std::underflow_error);
489 EXPECT_NO_THROW(it.end());
490}
491
493{
494 BitArray a;
495
496 a.set_num<std::uint8_t>(0);
497 EXPECT_EQ(a.size(), 8u);
499 EXPECT_EQ(a.get_unum(), 0ul);
500 EXPECT_EQ(a.get_num(), 0l);
501
502 a.set_num<std::uint8_t>(0xA5);
504 EXPECT_EQ(a.get_unum(), 0xA5ul);
505 EXPECT_EQ(a.get_num(), 0xA5l);
506
507 a.set_num<std::int8_t>(-1);
509 EXPECT_EQ(a.get_unum(), 255ul);
510 EXPECT_EQ(a.get_num(), 255l);
511
512 a.set_num<std::int8_t>(-2);
514 EXPECT_EQ(a.get_unum(), 254ul);
515 EXPECT_EQ(a.get_num(), 254l);
516
517 a.set_num<std::int16_t>(-2);
518 EXPECT_EQ(a.size(), 16u);
520 EXPECT_EQ(a.get_unum(), 65534ul);
521 EXPECT_EQ(a.get_num(), 65534l);
522
523 a.set_num<long>(-1);
524 EXPECT_EQ(a.size(), sizeof(long) * 8);
526 EXPECT_EQ(a.get_unum(), std::numeric_limits<unsigned long>::max());
527}
528
530{
531 constexpr size_t ul_bits = sizeof(unsigned long) * 8;
532 constexpr size_t extra = 5;
533
535 a.write_bit(0, 1); // outside get_unum() window
536 a.write_bit(a.size() - 1, 1); // LSB within get_unum() window
537 EXPECT_EQ(a.get_unum(), 1ul);
538}
539
541{
542 mt19937 rng(12345);
543
544 for (int iter = 0; iter < 50; ++iter)
545 {
546 const size_t n1 = rng() % 200;
547 const size_t n2 = rng() % 200;
548
549 const auto bits1 = random_bits(rng, n1);
550 const auto bits2 = random_bits(rng, n2);
551
552 const BitArray a = from_bits(bits1);
553 const BitArray b = from_bits(bits2);
554
555 const auto expected_or = or_bits(bits1, bits2);
556 const auto expected_and = and_bits(bits1, bits2);
557
558 const BitArray got_or = a | b;
559 const BitArray got_and = a & b;
560
563
564 const int ones = got_or.count_ones();
565 int expected_ones = 0;
566 for (auto bit : expected_or)
569 EXPECT_EQ(got_or.count_zeros(), static_cast<int>(got_or.size()) - ones);
570 }
571}
572
574{
575 BitArray a;
576 a.set_bit_str("10110011");
577
578 // Copy constructor
579 BitArray b(a);
581 EXPECT_TRUE(b == a);
582
583 // Modify b, a should not change
584 b.write_bit(0, 0);
586 EXPECT_EQ(a.read_bit(0), 1);
587
588 // Copy assignment
589 BitArray c;
590 c = a;
592 EXPECT_TRUE(c == a);
593
594 // Self assignment
595 c = c;
597}
598
600{
601 BitArray a;
602 a.set_bit_str("10110011");
603 const string original = a.get_bit_str();
604
605 // Move constructor
606 BitArray b(std::move(a));
608 EXPECT_EQ(a.size(), 0u); // a should be empty after move
609
610 // Move assignment
611 BitArray c;
612 c.set_bit_str("111");
613 c = std::move(b);
615 EXPECT_EQ(b.size(), 0u); // b should be empty after move
616}
617
619{
620 BitArray a;
621 a.set_bit_str("10110011");
622
623 BitArray b;
624 b.set_bit_str("0101");
625
626 const string a_str = a.get_bit_str();
627 const string b_str = b.get_bit_str();
628
629 a.swap(b);
630
633}
634
635TEST(BitArrayFunctions, bits_list)
636{
637 BitArray a;
638 a.set_bit_str("10110");
639
640 auto list = a.bits_list();
641 EXPECT_EQ(list.size(), 5u);
642
643 auto it = list.get_it();
644 EXPECT_EQ(it.get_curr(), 1); it.next();
645 EXPECT_EQ(it.get_curr(), 0); it.next();
646 EXPECT_EQ(it.get_curr(), 1); it.next();
647 EXPECT_EQ(it.get_curr(), 1); it.next();
648 EXPECT_EQ(it.get_curr(), 0);
649}
650
652{
653 BitArray a;
654 a.reserve(16);
655
656 // fast_write doesn't expand, so we need to reserve first
657 a.fast_write(0, 1);
658 a.fast_write(7, 1);
659 a.fast_write(15, 1);
660
661 EXPECT_EQ(a.fast_read(0), 1);
662 EXPECT_EQ(a.fast_read(1), 0);
663 EXPECT_EQ(a.fast_read(7), 1);
664 EXPECT_EQ(a.fast_read(15), 1);
665}
666
667TEST(BitArrayFunctions, save_in_array_of_chars)
668{
669 BitArray a;
670 a.set_bit_str("10110011");
671
672 ostringstream out;
673 a.save_in_array_of_chars("test_arr", out);
674 const string output = out.str();
675
676 EXPECT_NE(output.find("test_arr"), string::npos);
677 EXPECT_NE(output.find("8 bits"), string::npos);
678 EXPECT_NE(output.find("const unsigned char"), string::npos);
679}
680
682{
683 BitArray a;
684 a.set_bit_str("10110011");
685
686 BitArray b;
687 b.set_bit_str("10110011");
688
689 BitArray c;
690 c.set_bit_str("10110010");
691
692 BitArray d;
693 d.set_bit_str("1011001");
694
695 EXPECT_TRUE(a == b);
696 EXPECT_FALSE(a == c); // Different last bit
697 EXPECT_FALSE(a == d); // Different size
698}
699
701{
702 BitArray a;
703 a.set_bit_str("101");
704
705 auto it = a.get_it();
706 it.reset_last();
707 EXPECT_TRUE(it.has_curr());
708 EXPECT_EQ(it.get_curr(), 1u); // Last bit
709
710 it.prev();
711 EXPECT_EQ(it.get_curr(), 0u); // Middle bit
712
713 it.prev();
714 EXPECT_EQ(it.get_curr(), 1u); // First bit
715
716 // At position 0, prev moves to -1 (before first, like rend())
717 it.prev();
718 EXPECT_EQ(it.get_pos(), -1);
720
721 // Now at position -1, prev should throw
722 EXPECT_THROW(it.prev(), std::underflow_error);
723}
724
726{
727 BitArray a;
728 a.set_bit_str("101");
729
730 auto it = a.get_it();
731 EXPECT_EQ(it.get_pos(), 0);
732
733 it.next();
734 EXPECT_EQ(it.get_pos(), 1);
735
736 it.end();
737 EXPECT_EQ(it.get_pos(), 3);
739
740 it.reset();
741 EXPECT_EQ(it.get_pos(), 0);
742 EXPECT_TRUE(it.has_curr());
743}
744
745} // namespace
Space-efficient bit array implementation.
unsigned int get_curr_ne() const noexcept
Definition bitArray.H:1049
unsigned int get_curr() const
Definition bitArray.H:1054
void reset() noexcept
Definition bitArray.H:1102
bool has_curr() const noexcept
Definition bitArray.H:1043
long get_pos() const noexcept
Definition bitArray.H:1061
void end() noexcept
Definition bitArray.H:1090
void reset_last() noexcept
Definition bitArray.H:1082
Contiguous array of bits.
Definition bitArray.H:189
bool traverse(Operation &operation) const
Definition bitArray.H:1108
void fast_write(const size_t i, const unsigned int value)
Definition bitArray.H:443
int read_bit(const size_t i) const
Read bit i.
Definition bitArray.H:377
std::string get_bit_str() const
Definition bitArray.H:906
void circular_left_shift(const size_t n=1)
Shifts the bits n positions to the left circularly.
Definition bitArray.H:788
void load_from_array_of_chars(const unsigned char str[], const size_t num_bits)
Reads an array of bits saved in a character array.
Definition bitArray.H:687
long get_num() const noexcept
Definition bitArray.H:886
void set_bit_str(const std::string &str)
Definition bitArray.H:891
int fast_read(const size_t i) const noexcept
Definition bitArray.H:438
void write(const size_t i, const unsigned int value)
Writes bit i with value without memory check.
Definition bitArray.H:426
auto get_it() const noexcept
Definition bitArray.H:1105
void left_shift(const size_t n=1)
Shifts the bits n positions to the left.
Definition bitArray.H:711
void circular_right_shift(const size_t n=1)
Shifts the bits n positions to the right circularly.
Definition bitArray.H:817
void pop()
Removes the last bit of the array.
Definition bitArray.H:456
void write_bit(const size_t i, const unsigned int value)
Write bit i with the value.
Definition bitArray.H:392
void reserve(const size_t dim)
Reserve memory in advance for the bit array dim dimension.
Definition bitArray.H:328
void right_shift(const size_t n=1)
Shifts the bits n positions to the right.
Definition bitArray.H:729
void load(std::istream &input)
Loads an array of bits from a file.
Definition bitArray.H:590
DynList< char > bits_list() const
Converts it to a list.
Definition bitArray.H:506
void empty() noexcept
Delete all inserted bits.
Definition bitArray.H:465
void save_in_array_of_chars(const std::string &name, std::ostream &output) const
Saves a static string declaration to a text file.
Definition bitArray.H:643
int read(const size_t i) const
Quick read of bit i.
Definition bitArray.H:411
void set_num(T n)
Definition bitArray.H:840
void push(const unsigned int value)
Inserts the value at the end of the array.
Definition bitArray.H:450
constexpr size_t size() const noexcept
Returns the dimension of the bit array.
Definition bitArray.H:334
void swap(BitArray &array) noexcept
Definition bitArray.H:485
void save(std::ostream &output) const
Saves the bit sequence in a text file.
Definition bitArray.H:548
unsigned long get_unum() const noexcept
Definition bitArray.H:874
void set_size(const size_t sz)
Resets the dimension of the array.
Definition bitArray.H:337
void write_bit(const unsigned int i, const unsigned int val) noexcept
Definition bitArray.H:125
int get_int() const noexcept
Definition bitArray.H:136
int count_ones() const noexcept
Definition bitArray.H:158
void set_int(int i) noexcept
Definition bitArray.H:141
unsigned int read_bit(const unsigned int i) const noexcept
Definition bitArray.H:119
int count_zeros() const noexcept
Definition bitArray.H:163
size_t size() const noexcept
Count the number of elements of the list.
Definition htlist.H:1319
#define TEST(name)
static mt19937 rng
__gmp_expr< typename __gmp_resolve_expr< T, V >::value_type, __gmp_binary_expr< __gmp_expr< T, U >, __gmp_expr< V, W >, __gmp_max_function > > max(const __gmp_expr< T, U > &expr1, const __gmp_expr< V, W > &expr2)
Definition gmpfrxx.h:4110
__gmp_expr< typename __gmp_resolve_expr< T, V >::value_type, __gmp_binary_expr< __gmp_expr< T, U >, __gmp_expr< V, W >, __gmp_min_function > > min(const __gmp_expr< T, U > &expr1, const __gmp_expr< V, W > &expr2)
Definition gmpfrxx.h:4111
Main namespace for Aleph-w library functions.
Definition ah-arena.H:89
bool completed() const noexcept
Return true if all underlying iterators are finished.
Definition ah-zip.H:140
T & swap(T &t1, T &t2)
Generic swap using object's swap method.
Definition ahTypes.H:121
std::decay_t< typename HeadC::Item_Type > T
Definition ah-zip.H:107
DynList< T > maps(const C &c, Op op)
Classic map operation.
STL namespace.
DynList< int > l
ofstream output
Definition writeHeap.C:213