#ifndef U32_TABLE_HPP_
#define U32_TABLE_HPP_
#include "cpc_common.hpp"
namespace datasketches {
static const uint32_t U32_TABLE_UPSIZE_NUMER = 3LL;
static const uint32_t U32_TABLE_UPSIZE_DENOM = 4LL;
static const uint32_t U32_TABLE_DOWNSIZE_NUMER = 1LL;
static const uint32_t U32_TABLE_DOWNSIZE_DENOM = 4LL;
template<typename A>
class u32_table {
public:
using vector_u32 = std::vector<uint32_t, typename std::allocator_traits<A>::template rebind_alloc<uint32_t>>;
u32_table(const A& allocator);
u32_table(uint8_t lg_size, uint8_t num_valid_bits, const A& allocator);
inline uint32_t get_num_items() const;
inline const uint32_t* get_slots() const;
inline uint8_t get_lg_size() const;
inline void clear();
inline bool maybe_insert(uint32_t item);
inline bool maybe_delete(uint32_t item);
static u32_table make_from_pairs(const uint32_t* pairs, uint32_t num_pairs, uint8_t lg_k, const A& allocator);
vector_u32 unwrapping_get_items() const;
static void merge(
const uint32_t* arr_a, size_t start_a, size_t length_a, const uint32_t* arr_b, size_t start_b, size_t length_b, uint32_t* arr_c, size_t start_c );
static void introspective_insertion_sort(uint32_t* a, size_t l, size_t r);
static void knuth_shell_sort3(uint32_t* a, size_t l, size_t r);
private:
uint8_t lg_size; uint8_t num_valid_bits;
uint32_t num_items;
vector_u32 slots;
inline uint32_t lookup(uint32_t item) const;
inline void must_insert(uint32_t item);
inline void rebuild(uint8_t new_lg_size);
};
}
#include "u32_table_impl.hpp"
#endif