inline void PackedDeque::append_front(const uint64_t& value) { if (filled == vec.size()) { size_t new_capacity = size_t(factor * vec.size()) + 1; PackedVector new_vec; new_vec.resize(new_capacity); new_vec.set(0, value); for (size_t i = 0; i < filled; i++) { new_vec.set(i + 1, get(i)); } vec = std::move(new_vec); begin_idx = 0; } else { if (begin_idx == 0) { begin_idx = vec.size() - 1; } else { begin_idx--; } vec.set(begin_idx, value); } filled++; }
inline void PackedDeque::append_back(const uint64_t& value) { // expand capacity if necessary if (filled == vec.size()) { size_t new_capacity = size_t(factor * vec.size()) + 1; reserve(new_capacity); } // update the pointer to the back filled++; // set the value vec.set(internal_index(filled - 1), value); }
TEST_F(FidoVectorTest, makeSparse){ EXPECT_EQ(3,pv.size()); EXPECT_EQ(3,pv.numberEntries()); PackedVector sparse = pv.makeSparse(); EXPECT_EQ(6,sparse.size()); EXPECT_EQ(6,sparse.numberEntries()); }
inline void PackedDeque::pop_front() { begin_idx++; if (begin_idx == vec.size()) { begin_idx = 0; } filled--; contract(); }
inline void PackedDeque::append_back(const uint64_t& value) { if (filled == vec.size()) { size_t new_capacity = size_t(factor * vec.size()) + 1; PackedVector new_vec; new_vec.resize(new_capacity); for (size_t i = 0; i < filled; i++) { new_vec.set(i, get(i)); } new_vec.set(filled, value); vec = std::move(new_vec); begin_idx = 0; filled++; } else { filled++; vec.set(internal_index(filled - 1), value); } }
inline void PackedDeque::append_front(const uint64_t& value) { // expand capacity if necessary if (filled == vec.size()) { size_t new_capacity = size_t(factor * vec.size()) + 1; reserve(new_capacity); } // update the pointer to the front if (begin_idx == 0) { begin_idx = vec.size() - 1; } else { begin_idx--; } // update the pointer to the back filled++; // set the value vec.set(internal_index(0), value); }
inline void PackedDeque::pop_front() { // update the pointer to the beginning begin_idx++; if (begin_idx == vec.size()) { begin_idx = 0; } // update the pointer to the end filled--; // shrink if necessary contract(); }
inline void PackedDeque::reserve(const size_t& future_size) { if (future_size > vec.size()) { PackedVector new_vec; new_vec.resize(future_size); for (size_t i = 0; i < filled; i++) { new_vec.set(i, get(i)); } vec = std::move(new_vec); begin_idx = 0; } }
inline void PackedDeque::contract() { size_t shrink_capacity = vec.size() / (factor * factor); if (filled <= shrink_capacity) { PackedVector new_vec; new_vec.resize(filled); for (size_t i = 0; i < filled; i++) { new_vec.set(i, get(i)); } vec = std::move(new_vec); begin_idx = 0; } }
inline size_t PackedDeque::internal_index(const size_t& i) const { assert(i < filled); return i < vec.size() - begin_idx ? begin_idx + i : i - (vec.size() - begin_idx); }