Skip to content

Commit

Permalink
container/f_vec: added convenience interface to create vector
Browse files Browse the repository at this point in the history
Added constructors and methods to create a fragmented vector from range
and from single element.

Signed-off-by: Michał Maślanka <[email protected]>
  • Loading branch information
mmaslankaprv committed Jan 3, 2025
1 parent f28f9fa commit 6139187
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 0 deletions.
18 changes: 18 additions & 0 deletions src/v/container/fragmented_vector.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include <cstddef>
#include <initializer_list>
#include <iterator>
#include <ranges>
#include <span>
#include <stdexcept>
#include <type_traits>
Expand Down Expand Up @@ -119,6 +120,16 @@ class fragmented_vector {
*/
fragmented_vector(std::initializer_list<value_type> elems)
: fragmented_vector(elems.begin(), elems.end()) {}
/**
* @brief Construct a new vector from a given range
*/
template<typename Range>
requires std::ranges::sized_range<Range>
explicit fragmented_vector(Range range)
: fragmented_vector() {
reserve(std::ranges::size(range));
std::move(range.begin(), range.end(), std::back_inserter(*this));
}

fragmented_vector& operator=(fragmented_vector&& other) noexcept {
if (this != &other) {
Expand Down Expand Up @@ -480,6 +491,13 @@ class fragmented_vector {
*/
void erase_to_end(const_iterator begin) { pop_back_n(cend() - begin); }

template<typename... Args>
static fragmented_vector single(Args&&... args) {
fragmented_vector v;
v.emplace_back(std::forward<Args>(args)...);
return v;
}

friend std::ostream&
operator<<(std::ostream& os, const fragmented_vector& v) {
os << "[";
Expand Down
16 changes: 16 additions & 0 deletions src/v/container/tests/fragmented_vector_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -553,4 +553,20 @@ TEST(ChunkedVector, ShrinkToFit) {
EXPECT_EQ(vec.capacity(), 10);
}

TEST(ChunkedVector, FromRange) {
std::vector<int32_t> buffer;
buffer.reserve(10);
for (int i = 0; i < 10; ++i) {
buffer.push_back(i);
}

auto vec = chunked_vector<int32_t>(buffer);
EXPECT_THAT(vec, ElementsAreArray(buffer));
}

TEST(ChunkedVector, InPlaceSingleElement) {
auto v = chunked_vector<std::pair<ss::sstring, int32_t>>::single("a2", 3);
ASSERT_THAT(v, ElementsAre(std::make_pair("a2", 3)));
}

} // namespace

0 comments on commit 6139187

Please sign in to comment.