1+ #include < fast_io.h>
2+ #include < fast_io_dsal/deque.h>
3+ #include < deque>
4+ #include < cstddef>
5+ #include < cstdint>
6+ #include < cstring>
7+ #include < ranges>
8+
9+ extern " C" int LLVMFuzzerTestOneInput (uint8_t const *data, size_t size)
10+ {
11+ ::fast_io::deque<std::size_t > dq;
12+ std::deque<std::size_t > ref;
13+
14+ for (size_t i{}; i != size; ++i)
15+ {
16+ uint8_t b = data[i];
17+
18+ // 4 operations: insert single at various positions
19+ uint8_t op = b & 0x3u ;
20+
21+ // Position: [0, size]
22+ std::size_t pos = dq.size () == 0 ? 0 : (static_cast <std::size_t >(b) * 37u ) % (dq.size () + 1 );
23+
24+ std::size_t value = i * 1315423911ull ;
25+
26+ switch (op)
27+ {
28+ case 0 : // insert_index (single element)
29+ {
30+ dq.insert_index (pos, value);
31+ ref.insert (ref.begin () + pos, value);
32+ break ;
33+ }
34+
35+ case 1 : // insert using iterator (single element)
36+ {
37+ auto it = dq.insert (dq.cbegin () + pos, value);
38+ (void )it;
39+ ref.insert (ref.begin () + pos, value);
40+ break ;
41+ }
42+
43+ case 2 : // erase single element (to keep sizes bounded)
44+ {
45+ if (!ref.empty ())
46+ {
47+ std::size_t p = pos % ref.size ();
48+ dq.erase_index (p);
49+ ref.erase (ref.begin () + p);
50+ }
51+ break ;
52+ }
53+
54+ case 3 : // emplace_index (single element)
55+ {
56+ dq.emplace_index (pos, value);
57+ ref.emplace (ref.begin () + pos, value);
58+ break ;
59+ }
60+ }
61+
62+ // Validate correctness
63+ if (dq.size () != ref.size ())
64+ {
65+ __builtin_trap ();
66+ }
67+
68+ if (!std::ranges::equal (dq, ref))
69+ {
70+ __builtin_trap ();
71+ }
72+ }
73+
74+ return 0 ;
75+ }
0 commit comments