1#ifndef joedb_Freedom_Keeper_declared
2#define joedb_Freedom_Keeper_declared
21 std::vector<uint8_t> is_free_v;
22 std::vector<Record_Id> next_v;
23 std::vector<Record_Id> previous_v;
42 this->freedom_size = size;
49 next_p = next_v.data() + 2;
94 for (
size_t i = 0; i <
size; i++)
110 index +
size < index ||
117 for (
size_t i = 0; i <
size; i++)
206 for (
size_t i = 0; i <
size; ++i)
213 for (
size_t i = 0; i <
size; ++i)
228 size_t size()
const {
return size_t(free_size);}
232 if (used_size == free_size)
256 if (result == used_size)
259 if (result == free_size)
272 return used_size - 1;
277 if (used_size == free_size)
280 return free_size - 1;
288 if (result == used_size - 1)
301 return index >= used_size;
306 return index >= used_size;
313 index +
size >= index &&
314 index +
size <= used_size;
321 if (free_size == used_size)
330 if (free_size <
size)
336 if (index == used_size && used_size < free_size)
347 if (index == used_size - 1 && index >=
Record_Id{0})
358 if (index == used_size && used_size +
size <= free_size)
360 used_size = used_size +
size;
369 if (index +
size == used_size)
371 used_size = used_size -
size;
388 void lose_compactness()
402#define SWITCH(f) (dense ? dfk.f : lfk.f)
452 if (!dfk.
free(index))
Record_Id get_previous(Record_Id index) const
Record_Id get_first_used() const
Record_Id get_next(Record_Id index) const
bool is_used(Record_Id index) const
bool is_free(Record_Id index) const
Record_Id get_first_free() const
bool is_used_vector(Record_Id index, size_t size) const
bool use(Record_Id index)
bool free_vector(Record_Id index, size_t size)
bool use_vector(Record_Id index, size_t size)
Record_Id get_used_count() const
bool free(Record_Id index)
Record_Id get_free_record()
bool is_free_vector(Record_Id index, size_t size) const
void resize(Record_Id size)
Record_Id get_size() const
static constexpr Record_Id free_list
static constexpr Record_Id used_list
Record_Id get_free_record()
Record_Id get_last_used() const
void resize(size_t new_size)
Record_Id get_size() const
Record_Id get_first_free() const
void use(Record_Id index)
bool is_free_vector(Record_Id index, size_t size) const
void free_vector(Record_Id index, size_t size)
Record_Id get_last_free() const
void use_vector(Record_Id index, size_t size)
bool is_used_vector(Record_Id index, size_t size) const
bool is_used(Record_Id index) const
bool is_free(Record_Id index) const
void resize(Record_Id new_size)
Record_Id get_previous(Record_Id index) const
Record_Id get_next(Record_Id index) const
Record_Id get_used_count() const
void free(Record_Id index)
Record_Id get_first_used() const
Record_Id next_f(Record_Id id) const
uint8_t is_free_f(Record_Id id) const
void resize_vector(Record_Id size)
List_Data(const List_Data &)=delete
Record_Id & previous_f(Record_Id id)
Record_Id & next_f(Record_Id id)
uint8_t & is_free_f(Record_Id id)
Record_Id previous_f(Record_Id id) const
List_Data & operator=(const List_Data &)=delete
Record_Id get_size() const
bool is_used_vector(Record_Id index, size_t size) const
Record_Id get_previous(const Record_Id index) const
Record_Id get_free_record()
bool is_used(Record_Id index) const
void free_vector(Record_Id index, size_t size)
Record_Id get_used_count() const
Record_Id get_first_used() const
bool is_free(Record_Id index) const
Record_Id get_next(const Record_Id index) const
Record_Id get_first_free() const
bool is_free_vector(Record_Id index, size_t size) const
void resize(const Record_Id new_size)
void free(Record_Id index)
void use_vector(Record_Id index, size_t size)
void use(const Record_Id index)
constexpr bool is_null() const
constexpr bool is_not_null() const
#define JOEDB_DEBUG_ASSERT(x)
assertion tested in debug mode
#define JOEDB_RELEASE_ASSERT(x)
always-tested assertion (release and debug mode)
constexpr index_t to_underlying(Record_Id id)