Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
1e7f4e9
try to extract code that maybe common out insert_ranges_impl
trcrsired Mar 25, 2026
f240971
merge common code for insert in insert_range
trcrsired Mar 25, 2026
ed3f2f7
Implement insert and insert_index for single element
trcrsired Mar 25, 2026
b08ba9d
.gitignore
trcrsired Apr 1, 2026
a3ea146
add a vector append placeholder
trcrsired Apr 1, 2026
5496231
Merge branch 'next' of github.com:trcrsired/fast_io into next
trcrsired Apr 2, 2026
47d28b5
try to implement deque insert single element
trcrsired Apr 9, 2026
84e9390
Merge remote-tracking branch 'parent/next' into next
trcrsired Apr 9, 2026
f8be355
deque only recovers when it is at the end/front of block
trcrsired Apr 9, 2026
e4ffc39
[skip ci] try to add files for deque test/bench etc first
trcrsired Apr 9, 2026
accb77d
[skip ci] deque insert single element needs test
trcrsired Apr 9, 2026
469a1e2
[skip ci] deque insert single element size bug
trcrsired Apr 9, 2026
5c99931
[skip ci]test deque insert on other machine first
trcrsired Apr 9, 2026
7561f02
deque insert single element without iterator test. let's test eh safety
trcrsired Apr 9, 2026
9c36976
OHOS has different file struct than musl itself
trcrsired Apr 12, 2026
dd61ee6
[deque] remove all debug_print
trcrsired Apr 28, 2026
f949f4c
[debug][deque]use alias type instead
trcrsired Apr 28, 2026
ef10503
[deque] erase has the bug for erasing after empty
trcrsired Apr 28, 2026
86ab016
[deque] add a unit test for just testing the the boundary case
trcrsired Apr 28, 2026
83b4b83
Merge remote-tracking branch 'parent/next' into next
trcrsired Apr 28, 2026
ec96dbe
[deque] avoid using __builtin_trap() in test since msvc does not supp…
trcrsired Apr 28, 2026
450d3f9
[deque] avoid using __builtin_trap(). use fast_terminate() instead
trcrsired Apr 28, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,6 @@ compile_commands.json
# --- Exceptions ---
# Allow documentation HTMLs
!docs/**/*.html
# Claw Code local artifacts
.claude/settings.local.json
.claude/sessions/
32 changes: 32 additions & 0 deletions benchmark/0011.containers/deque/0007.insert_single/fast_io.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#include <fast_io.h>
#include <fast_io_driver/timer.h>
#include <fast_io_dsal/deque.h>
#include <cstddef>

int main()
{
fast_io::timer tm(u8"fast_io::deque insert single");
fast_io::deque<std::size_t> dq;
constexpr std::size_t n{50000};

{
fast_io::timer t(u8"insert_index");
for (std::size_t i{}; i != n; ++i)
{
::std::size_t dqsz{dq.size()};
std::size_t pos = dqsz ? (i % dqsz) : 0;
dq.insert_index(pos, i);
}
}

std::size_t sum{};
{
fast_io::timer t(u8"loop");
for (auto const e : dq)
{
sum += e;
}
}

fast_io::io::perrln("sum=", sum);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#include <fast_io.h>
#include <fast_io_driver/timer.h>
#include <fast_io_dsal/deque.h>
#include <cstddef>

int main()
{
fast_io::timer tm(u8"fast_io::deque emplace single");
fast_io::deque<std::size_t> dq;
constexpr std::size_t n{50000};

{
fast_io::timer t(u8"emplace_index");
for (std::size_t i{}; i != n; ++i)
{
::std::size_t dqsz{dq.size()};
std::size_t pos = dqsz ? (i % dqsz) : 0;
dq.emplace_index(pos, i);
}
}

std::size_t sum{};
{
fast_io::timer t(u8"loop");
for (auto const e : dq)
{
sum += e;
}
}

fast_io::io::perrln("sum=", sum);
}
32 changes: 32 additions & 0 deletions benchmark/0011.containers/deque/0007.insert_single/fast_io_iter.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#include <fast_io.h>
#include <fast_io_driver/timer.h>
#include <fast_io_dsal/deque.h>
#include <cstddef>

int main()
{
fast_io::timer tm(u8"fast_io::deque insert iterator");
fast_io::deque<std::size_t> dq;
constexpr std::size_t n{50000};

{
fast_io::timer t(u8"insert(iterator)");
for (std::size_t i{}; i != n; ++i)
{
::std::size_t dqsz{dq.size()};
std::size_t pos = dqsz ? (i % dqsz) : 0;
dq.insert(dq.begin() + pos, i);
}
}

std::size_t sum{};
{
fast_io::timer t(u8"loop");
for (auto const e : dq)
{
sum += e;
}
}

fast_io::io::perrln("sum=", sum);
}
32 changes: 32 additions & 0 deletions benchmark/0011.containers/deque/0007.insert_single/std.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#include <fast_io.h>
#include <fast_io_driver/timer.h>
#include <deque>
#include <cstddef>

int main()
{
fast_io::timer tm(u8"std::deque insert single");
::std::deque<std::size_t> dq;
constexpr std::size_t n{50000};

{
fast_io::timer t(u8"insert");
for (std::size_t i{}; i != n; ++i)
{
::std::size_t dqsz{dq.size()};
std::size_t pos = dqsz ? (i % dqsz) : 0;
dq.insert(dq.begin() + pos, i);
}
}

std::size_t sum{};
{
fast_io::timer t(u8"loop");
for (auto const e : dq)
{
sum += e;
}
}

fast_io::io::perrln("sum=", sum);
}
75 changes: 75 additions & 0 deletions fuzzing/0007.containers/deque/fuzz_deque_insert_single.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
#include <fast_io.h>
#include <fast_io_dsal/deque.h>
#include <deque>
#include <cstddef>
#include <cstdint>
#include <cstring>
#include <ranges>

extern "C" int LLVMFuzzerTestOneInput(uint8_t const *data, size_t size)
{
::fast_io::deque<std::size_t> dq;
std::deque<std::size_t> ref;

for (size_t i{}; i != size; ++i)
{
uint8_t b = data[i];

// 4 operations: insert single at various positions
uint8_t op = b & 0x3u;

// Position: [0, size]
std::size_t pos = dq.size() == 0 ? 0 : (static_cast<std::size_t>(b) * 37u) % (dq.size() + 1);

std::size_t value = i * 1315423911ull;

switch (op)
{
case 0: // insert_index (single element)
{
dq.insert_index(pos, value);
ref.insert(ref.begin() + pos, value);
break;
}

case 1: // insert using iterator (single element)
{
auto it = dq.insert(dq.cbegin() + pos, value);
(void)it;
ref.insert(ref.begin() + pos, value);
break;
}

case 2: // erase single element (to keep sizes bounded)
{
if (!ref.empty())
{
std::size_t p = pos % ref.size();
dq.erase_index(p);
ref.erase(ref.begin() + p);
}
break;
}

case 3: // emplace_index (single element)
{
dq.emplace_index(pos, value);
ref.emplace(ref.begin() + pos, value);
break;
}
}

// Validate correctness
if (dq.size() != ref.size())
{
__builtin_trap();
}

if (!std::ranges::equal(dq, ref))
{
__builtin_trap();
}
}

return 0;
}
24 changes: 24 additions & 0 deletions include/fast_io_dsal/impl/debug/common.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#pragma once

namespace fast_io
{

namespace manipulators
{

template <typename T>
struct debug_view_t
{
using manip_tag = manip_tag_t;
T reference;
};

template <typename T>
inline constexpr debug_view_t<T const &> debug_view(T const &v) noexcept
{
return ::fast_io::manipulators::debug_view_t<T const &>{v};
}

} // namespace manipulators

} // namespace fast_io
Loading
Loading