Add pop method to chunked_buffer

This commit is contained in:
2025-06-26 14:29:16 +02:00
parent 47c6677405
commit 43ab95880d
4 changed files with 53 additions and 5 deletions

View File

@ -442,16 +442,16 @@ ASL_TEST(move_assign_inline_to_heap)
ASL_TEST_EXPECT(buf2.size() == 2);
ASL_TEST_EXPECT(d[0] == false);
ASL_TEST_EXPECT(d[1] == false);
ASL_TEST_EXPECT(d[2] == false); // moved but not destroyed
ASL_TEST_EXPECT(d[3] == false); // moved but not destroyed
ASL_TEST_EXPECT(d[2] == true);
ASL_TEST_EXPECT(d[3] == true);
ASL_TEST_EXPECT(d[4] == true);
ASL_TEST_EXPECT(d[5] == true);
}
ASL_TEST_EXPECT(d[0] == true);
ASL_TEST_EXPECT(d[1] == true);
ASL_TEST_EXPECT(d[2] == false); // moved but not destroyed
ASL_TEST_EXPECT(d[3] == false); // moved but not destroyed
ASL_TEST_EXPECT(d[2] == true);
ASL_TEST_EXPECT(d[3] == true);
ASL_TEST_EXPECT(d[4] == true);
ASL_TEST_EXPECT(d[5] == true);
}

View File

@ -335,6 +335,12 @@ public:
resize_uninit_inner(new_size);
}
void pop()
{
ASL_ASSERT(size() > 0);
resize_uninit_inner(size() - 1);
}
template<typename Chunk>
class generic_iterator
{

View File

@ -135,6 +135,48 @@ ASL_TEST(push)
}
}
ASL_TEST(pop)
{
asl::chunked_buffer<int, 2> b;
for (int i = 0; i < 8; ++i)
{
b.push(i);
}
ASL_TEST_EXPECT(b.size() == 8);
b.pop();
ASL_TEST_EXPECT(b.size() == 7);
for (int i = 0; i < 7; ++i)
{
ASL_TEST_EXPECT(b[i] == i);
}
}
ASL_TEST(pop_destruct)
{
asl::chunked_buffer<DestructorObserver, 16> b;
bool d[3];
b.push(&d[0]);
b.push(&d[1]);
b.push(&d[2]);
ASL_TEST_EXPECT(!d[0]);
ASL_TEST_EXPECT(!d[1]);
ASL_TEST_EXPECT(!d[2]);
b.pop();
ASL_TEST_EXPECT(!d[0]);
ASL_TEST_EXPECT(!d[1]);
ASL_TEST_EXPECT(d[2]);
b.pop();
ASL_TEST_EXPECT(!d[0]);
ASL_TEST_EXPECT(d[1]);
ASL_TEST_EXPECT(d[2]);
}
ASL_TEST(clear_destroy)
{
bool destroyed[5]{};

View File

@ -77,7 +77,7 @@ struct DestructorObserver
{
if (this != &other)
{
destroyed = asl::exchange(other.destroyed, nullptr);
asl::swap(destroyed, other.destroyed);
}
return *this;
}