Skip to content

Commit c07f3ec

Browse files
authored
Merge pull request #1272 from trcrsired/next
[deque] erase should check boundary correctly when on move left
2 parents 3125d4a + 450d3f9 commit c07f3ec

13 files changed

Lines changed: 1374 additions & 50 deletions

File tree

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,6 @@ compile_commands.json
2020
# --- Exceptions ---
2121
# Allow documentation HTMLs
2222
!docs/**/*.html
23+
# Claw Code local artifacts
24+
.claude/settings.local.json
25+
.claude/sessions/
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#include <fast_io.h>
2+
#include <fast_io_driver/timer.h>
3+
#include <fast_io_dsal/deque.h>
4+
#include <cstddef>
5+
6+
int main()
7+
{
8+
fast_io::timer tm(u8"fast_io::deque insert single");
9+
fast_io::deque<std::size_t> dq;
10+
constexpr std::size_t n{50000};
11+
12+
{
13+
fast_io::timer t(u8"insert_index");
14+
for (std::size_t i{}; i != n; ++i)
15+
{
16+
::std::size_t dqsz{dq.size()};
17+
std::size_t pos = dqsz ? (i % dqsz) : 0;
18+
dq.insert_index(pos, i);
19+
}
20+
}
21+
22+
std::size_t sum{};
23+
{
24+
fast_io::timer t(u8"loop");
25+
for (auto const e : dq)
26+
{
27+
sum += e;
28+
}
29+
}
30+
31+
fast_io::io::perrln("sum=", sum);
32+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#include <fast_io.h>
2+
#include <fast_io_driver/timer.h>
3+
#include <fast_io_dsal/deque.h>
4+
#include <cstddef>
5+
6+
int main()
7+
{
8+
fast_io::timer tm(u8"fast_io::deque emplace single");
9+
fast_io::deque<std::size_t> dq;
10+
constexpr std::size_t n{50000};
11+
12+
{
13+
fast_io::timer t(u8"emplace_index");
14+
for (std::size_t i{}; i != n; ++i)
15+
{
16+
::std::size_t dqsz{dq.size()};
17+
std::size_t pos = dqsz ? (i % dqsz) : 0;
18+
dq.emplace_index(pos, i);
19+
}
20+
}
21+
22+
std::size_t sum{};
23+
{
24+
fast_io::timer t(u8"loop");
25+
for (auto const e : dq)
26+
{
27+
sum += e;
28+
}
29+
}
30+
31+
fast_io::io::perrln("sum=", sum);
32+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#include <fast_io.h>
2+
#include <fast_io_driver/timer.h>
3+
#include <fast_io_dsal/deque.h>
4+
#include <cstddef>
5+
6+
int main()
7+
{
8+
fast_io::timer tm(u8"fast_io::deque insert iterator");
9+
fast_io::deque<std::size_t> dq;
10+
constexpr std::size_t n{50000};
11+
12+
{
13+
fast_io::timer t(u8"insert(iterator)");
14+
for (std::size_t i{}; i != n; ++i)
15+
{
16+
::std::size_t dqsz{dq.size()};
17+
std::size_t pos = dqsz ? (i % dqsz) : 0;
18+
dq.insert(dq.begin() + pos, i);
19+
}
20+
}
21+
22+
std::size_t sum{};
23+
{
24+
fast_io::timer t(u8"loop");
25+
for (auto const e : dq)
26+
{
27+
sum += e;
28+
}
29+
}
30+
31+
fast_io::io::perrln("sum=", sum);
32+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#include <fast_io.h>
2+
#include <fast_io_driver/timer.h>
3+
#include <deque>
4+
#include <cstddef>
5+
6+
int main()
7+
{
8+
fast_io::timer tm(u8"std::deque insert single");
9+
::std::deque<std::size_t> dq;
10+
constexpr std::size_t n{50000};
11+
12+
{
13+
fast_io::timer t(u8"insert");
14+
for (std::size_t i{}; i != n; ++i)
15+
{
16+
::std::size_t dqsz{dq.size()};
17+
std::size_t pos = dqsz ? (i % dqsz) : 0;
18+
dq.insert(dq.begin() + pos, i);
19+
}
20+
}
21+
22+
std::size_t sum{};
23+
{
24+
fast_io::timer t(u8"loop");
25+
for (auto const e : dq)
26+
{
27+
sum += e;
28+
}
29+
}
30+
31+
fast_io::io::perrln("sum=", sum);
32+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
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+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#pragma once
2+
3+
namespace fast_io
4+
{
5+
6+
namespace manipulators
7+
{
8+
9+
template <typename T>
10+
struct debug_view_t
11+
{
12+
using manip_tag = manip_tag_t;
13+
T reference;
14+
};
15+
16+
template <typename T>
17+
inline constexpr debug_view_t<T const &> debug_view(T const &v) noexcept
18+
{
19+
return ::fast_io::manipulators::debug_view_t<T const &>{v};
20+
}
21+
22+
} // namespace manipulators
23+
24+
} // namespace fast_io

0 commit comments

Comments
 (0)