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 PagedVector::set(const size_t& i, const uint64_t& value) { assert(i < filled); uint64_t anchor = anchors.get(i / page_size); if (anchor == 0) { // this page does not have a non-zero anchor yet, use this one anchors.set(i / page_size, value); anchor = value; } pages[i / page_size].set(i % page_size, to_diff(value, anchor)); }
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); }
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::set(const size_t& i, const uint64_t& value) { return vec.set(internal_index(i), value); }
inline void PackedSplayTree::set_parent(size_t x, size_t y) { tree.set((x - 1) * NODE_SIZE + PARENT_OFFSET, y); }
inline void PackedSplayTree::set_right(size_t x, size_t y) { tree.set((x - 1) * NODE_SIZE + RIGHT_CHILD_OFFSET, y); }
inline void PackedSplayTree::set_left(size_t x, size_t y) { tree.set((x - 1) * NODE_SIZE + LEFT_CHILD_OFFSET, y); }
inline void PackedSplayTree::set_value(size_t x, size_t val) { tree.set((x - 1) * NODE_SIZE + VALUE_OFFSET, val); }
inline void PackedSplayTree::set_key(size_t x, size_t val) { tree.set((x - 1) * NODE_SIZE + KEY_OFFSET, val); }