Skip to content

Commit d8f2afd

Browse files
committed
Use pod_vector for mmap zero-copy support in serialized data structures
Replace std::vector with essentials::pod_vector in all serialized data structure members. pod_vector supports dual-mode operation: owned storage (like std::vector) and non-owning view over externally managed memory (e.g., mmap'd regions), enabling zero-copy deserialization. Changes: - bit_vector: m_bits std::vector<uint64_t> -> pod_vector<uint64_t> - compact_vector: m_bits std::vector<uint64_t> -> pod_vector<uint64_t> - rank9: m_block_rank_pairs std::vector<uint64_t> -> pod_vector<uint64_t> - darray: m_positions std::vector<uint64_t> -> pod_vector<uint64_t>, templatize access methods for const correctness - cache_line_elias_fano: m_data std::vector<uint8_t> -> pod_vector<uint8_t> - endpoints_sequence: m_hints_0 std::vector<uint8_t> -> pod_vector<uint8_t> No behavioral change for existing code -- pod_vector is a drop-in replacement when used in owned mode.
1 parent 53375cb commit d8f2afd

6 files changed

Lines changed: 19 additions & 17 deletions

File tree

include/bit_vector.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,7 @@ struct bit_vector //
322322
iterator begin() const { return get_iterator_at(0); }
323323

324324
uint64_t num_bits() const { return m_num_bits; }
325-
std::vector<uint64_t> const& data() const { return m_data; }
325+
essentials::pod_vector<uint64_t> const& data() const { return m_data; }
326326

327327
uint64_t num_bytes() const { return sizeof(m_num_bits) + essentials::vec_bytes(m_data); }
328328

@@ -343,7 +343,7 @@ struct bit_vector //
343343

344344
protected:
345345
uint64_t m_num_bits;
346-
std::vector<uint64_t> m_data;
346+
essentials::pod_vector<uint64_t> m_data;
347347

348348
template <typename Visitor, typename T>
349349
static void visit_impl(Visitor& visitor, T&& t) {

include/cache_line_elias_fano.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ struct cache_line_elias_fano {
149149
private:
150150
uint64_t m_back;
151151
uint64_t m_size;
152-
std::vector<uint8_t> m_bits;
152+
essentials::pod_vector<uint8_t> m_bits;
153153

154154
template <typename Visitor, typename T>
155155
static void visit_impl(Visitor& visitor, T&& t) {

include/compact_vector.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ struct compact_vector //
262262
uint64_t back() const { return operator[](size() - 1); }
263263
uint64_t size() const { return m_size; }
264264
uint64_t width() const { return m_width; }
265-
std::vector<uint64_t> const& data() const { return m_data; }
265+
essentials::pod_vector<uint64_t> const& data() const { return m_data; }
266266

267267
typedef enumerator<compact_vector> iterator;
268268
iterator get_iterator_at(uint64_t pos) const { return iterator(this, pos); }
@@ -293,7 +293,7 @@ struct compact_vector //
293293
uint64_t m_size;
294294
uint64_t m_width;
295295
uint64_t m_mask;
296-
std::vector<uint64_t> m_data;
296+
essentials::pod_vector<uint64_t> m_data;
297297

298298
template <typename Visitor, typename T>
299299
static void visit_impl(Visitor& visitor, T&& t) {

include/darray.hpp

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ struct darray {
8181
darray() : m_positions(0) {}
8282

8383
void build(bit_vector const& B) {
84-
std::vector<uint64_t> const& data = B.data();
84+
auto const& data = B.data();
8585
std::vector<uint64_t> cur_block_positions;
8686
std::vector<int64_t> block_inventory;
8787
std::vector<uint16_t> subblock_inventory;
@@ -174,7 +174,7 @@ struct darray {
174174
uint64_t reminder = i & (subblock_size - 1);
175175
if (!reminder) return start_pos;
176176

177-
std::vector<uint64_t> const& data = B.data();
177+
auto const& data = B.data();
178178
uint64_t word_idx = start_pos >> 6;
179179
uint64_t word_shift = start_pos & 63;
180180
uint64_t word = WordGetter()(data, word_idx) & (uint64_t(-1) << word_shift);
@@ -214,9 +214,9 @@ struct darray {
214214

215215
protected:
216216
uint64_t m_positions;
217-
std::vector<int64_t> m_block_inventory;
218-
std::vector<uint16_t> m_subblock_inventory;
219-
std::vector<uint64_t> m_overflow_positions;
217+
essentials::pod_vector<int64_t> m_block_inventory;
218+
essentials::pod_vector<uint16_t> m_subblock_inventory;
219+
essentials::pod_vector<uint64_t> m_overflow_positions;
220220

221221
template <typename Visitor, typename T>
222222
static void visit_impl(Visitor& visitor, T&& t) {
@@ -262,11 +262,13 @@ struct darray {
262262
namespace util {
263263

264264
struct identity_getter {
265-
uint64_t operator()(std::vector<uint64_t> const& data, uint64_t i) const { return data[i]; }
265+
template <typename Vec>
266+
uint64_t operator()(Vec const& data, uint64_t i) const { return data[i]; }
266267
};
267268

268269
struct negating_getter {
269-
uint64_t operator()(std::vector<uint64_t> const& data, uint64_t i) const { return ~data[i]; }
270+
template <typename Vec>
271+
uint64_t operator()(Vec const& data, uint64_t i) const { return ~data[i]; }
270272
};
271273

272274
} // namespace util

include/endpoints_sequence.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ struct endpoints_sequence {
141141
uint64_t m_pos;
142142
uint64_t m_val;
143143
bit_vector::iterator m_high_bits_it;
144-
std::vector<uint8_t>::const_iterator m_low_bits_it;
144+
const uint8_t* m_low_bits_it;
145145

146146
void read_next_value() {
147147
assert(m_pos < m_ptr->size());
@@ -226,7 +226,7 @@ struct endpoints_sequence {
226226
bit_vector m_high_bits;
227227
DArray1 m_high_bits_d1;
228228
compact_vector m_hints_0;
229-
std::vector<uint8_t> m_low_bits;
229+
essentials::pod_vector<uint8_t> m_low_bits;
230230

231231
template <typename Visitor, typename T>
232232
static void visit_impl(Visitor& visitor, T&& t) {

include/rank9.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ struct rank9 {
4646
rank9() {}
4747

4848
void build(bit_vector const& B) {
49-
std::vector<uint64_t> const& data = B.data();
49+
auto const& data = B.data();
5050
std::vector<uint64_t> block_rank_pairs;
5151
uint64_t next_rank = 0;
5252
uint64_t cur_subrank = 0;
@@ -96,7 +96,7 @@ struct rank9 {
9696
uint64_t r = sub_block_rank(sub_block);
9797
uint64_t sub_left = i % 64;
9898
if (sub_left) {
99-
std::vector<uint64_t> const& data = B.data();
99+
auto const& data = B.data();
100100
r += util::popcount(data[sub_block] << (64 - sub_left));
101101
}
102102
return r;
@@ -146,7 +146,7 @@ struct rank9 {
146146
}
147147

148148
static const uint64_t block_size = 8; // in 64bit words
149-
std::vector<uint64_t> m_block_rank_pairs;
149+
essentials::pod_vector<uint64_t> m_block_rank_pairs;
150150
};
151151

152152
} // namespace bits

0 commit comments

Comments
 (0)