15constexpr int LEN_BITS = 16;
16constexpr int RANDDATA_BITS = 20;
21std::vector<bool> RANDDATA;
27 for (
size_t i = 0; i < (1U << RANDDATA_BITS) + (1U << LEN_BITS); ++i) {
28 RANDDATA.push_back(ctx.randbool());
40 size_t limitlen = 4 * maxlen;
45 const auto& cdeq = deq;
46 const auto& cbitdeq = bitdeq;
52 bitdeq.push_back(val);
56 const auto iter_limit{maxlen > 6000 ? 90U : 900U};
62 deq = std::deque<bool>{};
63 bitdeq = bitdeque_type{};
80 deq.assign(
count, val);
81 bitdeq.assign(
count, val);
87 deq = std::deque<bool>(
count, val);
88 bitdeq = bitdeque_type(
count, val);
93 deq = std::deque<bool>(
count);
94 bitdeq = bitdeque_type(
count);
99 auto rand_begin = RANDDATA.begin() + ctx.
randbits(RANDDATA_BITS);
100 auto rand_end = rand_begin +
count;
101 deq = std::deque<bool>(rand_begin, rand_end);
102 bitdeq = bitdeque_type(rand_begin, rand_end);
107 auto rand_begin = RANDDATA.begin() + ctx.
randbits(RANDDATA_BITS);
108 auto rand_end = rand_begin +
count;
109 deq.assign(rand_begin, rand_end);
110 bitdeq.assign(rand_begin, rand_end);
115 deq = std::deque<bool>(ilist);
116 bitdeq = bitdeque_type(ilist);
122 bitdeq.assign(ilist);
128 const std::deque<bool> deq2(
count, val);
130 const bitdeque_type bitdeq2(
count, val);
137 std::deque<bool> deq2(
count, val);
138 deq = std::move(deq2);
139 bitdeque_type bitdeq2(
count, val);
140 bitdeq = std::move(bitdeq2);
145 auto rand_begin = RANDDATA.begin() + ctx.
randbits(RANDDATA_BITS);
146 auto rand_end = rand_begin +
count;
147 std::deque<bool> deq2(rand_begin, rand_end);
148 bitdeque_type bitdeq2(rand_begin, rand_end);
150 assert(deq.size() == bitdeq.size());
151 assert(deq2.size() == bitdeq2.size());
153 swap(bitdeq, bitdeq2);
154 assert(deq.size() == bitdeq.size());
155 assert(deq2.size() == bitdeq2.size());
160 auto rand_begin = RANDDATA.begin() + ctx.
randbits(RANDDATA_BITS);
161 auto rand_end = rand_begin +
count;
162 std::deque<bool> deq2(rand_begin, rand_end);
163 bitdeque_type bitdeq2(rand_begin, rand_end);
164 assert(deq.size() == bitdeq.size());
165 assert(deq2.size() == bitdeq2.size());
167 bitdeq.swap(bitdeq2);
168 assert(deq.size() == bitdeq.size());
169 assert(deq2.size() == bitdeq2.size());
181 auto it = deq.begin() + pos1;
182 auto bitit = bitdeq.begin() + pos1;
183 if ((
size_t)pos1 != cdeq.size())
assert(*it == *bitit);
184 assert(it - deq.begin() == pos1);
185 assert(bitit - bitdeq.begin() == pos1);
188 bitit += pos2 - pos1;
191 bitit -= pos1 - pos2;
193 if ((
size_t)pos2 != cdeq.size())
assert(*it == *bitit);
194 assert(deq.end() - it == bitdeq.end() - bitit);
196 if ((
size_t)pos2 != cdeq.size()) {
206 assert(deq.end() - it == bitdeq.end() - bitit);
210 assert(deq.end() - deq.begin() == bitdeq.end() - bitdeq.begin());
214 assert(cdeq.end() - cdeq.begin() == cbitdeq.end() - cbitdeq.begin());
218 assert(deq.rend() - deq.rbegin() == bitdeq.rend() - bitdeq.rbegin());
222 assert(cdeq.rend() - cdeq.rbegin() == cbitdeq.rend() - cbitdeq.rbegin());
226 assert(cdeq.cend() - cdeq.cbegin() == cbitdeq.cend() - cbitdeq.cbegin());
230 assert(cdeq.crend() - cdeq.crbegin() == cbitdeq.crend() - cbitdeq.crbegin());
234 assert(cdeq.size() == cbitdeq.size());
235 assert(cbitdeq.size() <= cbitdeq.max_size());
239 assert(cdeq.empty() == cbitdeq.empty());
245 auto& ref = deq.at(pos);
246 auto bitref = bitdeq.at(pos);
258 bool throw_deq{
false}, throw_bitdeq{
false};
259 bool val_deq{
false}, val_bitdeq{
false};
261 auto& ref = deq.at(pos);
264 }
catch (
const std::out_of_range&) {
268 auto ref = bitdeq.at(pos);
271 }
catch (
const std::out_of_range&) {
274 assert(throw_deq == throw_bitdeq);
275 assert(throw_bitdeq == (pos >= cdeq.size()));
276 if (!throw_deq)
assert(val_deq == val_bitdeq);
281 bool throw_deq{
false}, throw_bitdeq{
false};
282 bool val_deq{
false}, val_bitdeq{
false};
284 auto& ref = cdeq.at(pos);
286 }
catch (
const std::out_of_range&) {
290 auto ref = cbitdeq.at(pos);
292 }
catch (
const std::out_of_range&) {
295 assert(throw_deq == throw_bitdeq);
296 assert(throw_bitdeq == (pos >= cdeq.size()));
297 if (!throw_deq)
assert(val_deq == val_bitdeq);
303 assert(deq[pos] == bitdeq[pos]);
305 deq[pos] = !deq[pos];
314 assert(deq[pos] == bitdeq[pos]);
320 auto& ref = deq.front();
321 auto bitref = bitdeq.front();
332 auto& ref = cdeq.front();
333 auto bitref = cbitdeq.front();
340 auto& ref = deq.back();
341 auto bitref = bitdeq.back();
352 const auto& cdeq = deq;
353 const auto& cbitdeq = bitdeq;
354 auto& ref = cdeq.back();
355 auto bitref = cbitdeq.back();
361 if (cdeq.size() < limitlen) {
365 bitdeq.push_back(val);
368 auto& ref = deq[pos];
369 auto bitref = bitdeq[pos];
372 bitdeq.push_back(val);
379 if (cdeq.size() < limitlen) {
383 bitdeq.push_front(val);
386 auto& ref = deq[pos];
387 auto bitref = bitdeq[pos];
390 bitdeq.push_front(val);
398 if (cdeq.size() == 1) {
403 auto& ref = deq[pos];
404 auto bitref = bitdeq[pos];
415 if (cdeq.size() == 1) {
420 auto& ref = deq[pos];
421 auto bitref = bitdeq[pos];
433 size_t after = cdeq.size() - 1 - before;
434 auto it = deq.erase(cdeq.begin() + before);
435 auto bitit = bitdeq.erase(cbitdeq.begin() + before);
436 assert(it == cdeq.begin() + before && it == cdeq.end() - after);
437 assert(bitit == cbitdeq.begin() + before && bitit == cbitdeq.end() - after);
443 auto it = deq.erase(cdeq.begin(), cdeq.begin() +
count);
444 auto bitit = bitdeq.erase(cbitdeq.begin(), cbitdeq.begin() +
count);
445 assert(it == deq.begin());
446 assert(bitit == bitdeq.begin());
451 auto it = deq.erase(cdeq.end() -
count, cdeq.end());
452 auto bitit = bitdeq.erase(cbitdeq.end() -
count, cbitdeq.end());
454 assert(bitit == bitdeq.end());
460 size_t after = cdeq.size() -
count - before;
461 auto it = deq.erase(cdeq.begin() + before, cdeq.end() - after);
462 auto bitit = bitdeq.erase(cbitdeq.begin() + before, cbitdeq.end() - after);
463 assert(it == cdeq.begin() + before && it == cdeq.end() - after);
464 assert(bitit == cbitdeq.begin() + before && bitit == cbitdeq.end() - after);
468 if (cdeq.size() < limitlen) {
472 auto it = deq.insert(cdeq.begin() + before, val);
473 auto bitit = do_emplace ? bitdeq.emplace(cbitdeq.begin() + before, val)
474 : bitdeq.insert(cbitdeq.begin() + before, val);
475 assert(it == deq.begin() + before);
476 assert(bitit == bitdeq.begin() + before);
481 if (cdeq.size() < limitlen) {
483 auto rand_begin = RANDDATA.begin() + ctx.
randbits(RANDDATA_BITS);
484 auto rand_end = rand_begin +
count;
485 auto it = deq.insert(cdeq.begin(), rand_begin, rand_end);
486 auto bitit = bitdeq.insert(cbitdeq.begin(), rand_begin, rand_end);
487 assert(it == cdeq.begin());
488 assert(bitit == cbitdeq.begin());
493 if (cdeq.size() < limitlen) {
495 auto rand_begin = RANDDATA.begin() + ctx.
randbits(RANDDATA_BITS);
496 auto rand_end = rand_begin +
count;
497 auto it = deq.insert(cdeq.end(), rand_begin, rand_end);
498 auto bitit = bitdeq.insert(cbitdeq.end(), rand_begin, rand_end);
505 if (cdeq.size() < limitlen) {
509 auto it = deq.insert(cdeq.begin() + before,
count, val);
510 auto bitit = bitdeq.insert(cbitdeq.begin() + before,
count, val);
511 assert(it == deq.begin() + before);
512 assert(bitit == bitdeq.begin() + before);
517 if (cdeq.size() < limitlen) {
520 auto rand_begin = RANDDATA.begin() + ctx.
randbits(RANDDATA_BITS);
521 auto rand_end = rand_begin +
count;
522 auto it = deq.insert(cdeq.begin() + before, rand_begin, rand_end);
523 auto bitit = bitdeq.insert(cbitdeq.begin() + before, rand_begin, rand_end);
524 assert(it == deq.begin() + before);
525 assert(bitit == bitdeq.begin() + before);
530 assert(deq.size() == bitdeq.size());
531 auto it = deq.begin();
532 auto bitit = bitdeq.begin();
533 auto itend = deq.end();
534 while (it != itend) {
FUZZ_TARGET(bitdeque,.init=InitRandData)
T ConsumeIntegralInRange(T min, T max)
bool randbool() noexcept
Generate a random boolean.
uint64_t randbits(int bits) noexcept
Generate a random (bits)-bit integer.
Class that mimics std::deque<bool>, but with std::vector<bool>'s bit packing.
LIMITED_WHILE(provider.remaining_bytes(), 10000)
FuzzedDataProvider provider
size_t CallOneOf(FuzzedDataProvider &fuzzed_data_provider, Callables... callables)