34 template<
class T,
class HashFunction,
class Equals = std::equal_to<T>>
requires(std::is_trivial<T>::value and std::is_copy_constructible_v<T>)
35 class ScratchHashSet32;
44 template<
class T,
class HashFunction,
class Equals>
requires(std::is_trivial<T>::value and std::is_copy_constructible_v<T>)
51 std::size_t memoryBytes,
53 const HashFunction& hash = {},
54 const Equals& equals = {});
56 [[nodiscard]]
static JPL_INLINE std::size_t GetRequiredMemorySize(
uint32 expectedCount);
58 inline void Init(
void* memory, std::size_t memoryBytes,
uint32 expectedCount);
60 inline bool Insert(
const T& key);
62 [[nodiscard]]
inline bool Contains(
const T& key)
const;
65 JPL_INLINE
void Clear();
67 [[nodiscard]] JPL_INLINE
uint32 size()
const {
return mSize; }
71 [[nodiscard]]
static JPL_INLINE std::size_t GetCapacityForCount(
uint32 expectedCount);
74 [[no_unique_address]] HashFunction mHasher{};
75 [[no_unique_address]] Equals mEquals{};
77 uint8* mOcupied =
nullptr;
92 template<
class T,
class HashFunction,
class Equals>
requires(std::is_trivial<T>::value and std::is_copy_constructible_v<T>)
94 std::size_t memoryBytes,
96 const HashFunction& hash,
101 Init(memory, memoryBytes, expectedCount);
104 template<
class T,
class HashFunction,
class Equals>
requires(std::is_trivial<T>::value and std::is_copy_constructible_v<T>)
107 const std::size_t capacity = GetCapacityForCount(expectedCount);
108 return capacity *
sizeof(T)
109 + capacity *
sizeof(
uint8);
112 template<
class T,
class HashFunction,
class Equals>
requires(std::is_trivial<T>::value and std::is_copy_constructible_v<T>)
115 const std::size_t minCapacity = expectedCount > 0 ? expectedCount * 2llu : 2llu;
116 JPL_ASSERT(minCapacity <= std::numeric_limits<uint32>::max());
117 return std::bit_ceil(minCapacity);
120 template<
class T,
class HashFunction,
class Equals>
requires(std::is_trivial<T>::value and std::is_copy_constructible_v<T>)
123 mCapacity =
static_cast<uint32>(GetCapacityForCount(expectedCount));
124 mMask = mCapacity - 1u;
127 const std::size_t slotsBytes =
static_cast<std::size_t
>(mCapacity) *
sizeof(T);
128 const std::size_t flagsBytes =
static_cast<std::size_t
>(mCapacity) *
sizeof(
uint8);
130 JPL_ASSERT(slotsBytes + flagsBytes <= memoryBytes);
132 std::byte* ptr =
static_cast<std::byte*
>(memory);
133 mKeys =
reinterpret_cast<T*
>(ptr);
134 mOcupied =
reinterpret_cast<uint8*
>(ptr + slotsBytes);
136 std::memset(mOcupied, 0, flagsBytes);
139 template<
class T,
class HashFunction,
class Equals>
requires(std::is_trivial<T>::value and std::is_copy_constructible_v<T>)
142 uint32 index = mHasher(key) & mMask;
144 for (
uint32 probe = 0; probe < mCapacity; ++probe)
146 if (not mOcupied[index])
154 if (mEquals(mKeys[index], key))
159 index = (index + 1u) & mMask;
166 template<
class T,
class HashFunction,
class Equals>
requires(std::is_trivial<T>::value and std::is_copy_constructible_v<T>)
169 uint32 index = mHasher(key) & mMask;
171 for (
uint32 probe = 0; probe < mCapacity; ++probe)
173 if (not mOcupied[index])
178 if (mEquals(mKeys[index], key))
183 index = (index + 1u) & mMask;
189 template<
class T,
class HashFunction,
class Equals>
requires(std::is_trivial<T>::value and std::is_copy_constructible_v<T>)
192 std::memset(mOcupied, 0,
static_cast<std::size_t
>(mCapacity) *
sizeof(
uint8));
#define JPL_ASSERT(inExpression,...)
Main assert macro, usage: JPL_ASSERT(condition, message) or JPL_ASSERT(condition)
Definition ErrorReporting.h:80
Definition ScratchHashSet.h:46
JPL_INLINE uint32 capacity() const
Definition ScratchHashSet.h:68
ScratchHashSet32()=default
JPL_INLINE uint32 size() const
Definition ScratchHashSet.h:67
Definition AcousticMaterial.h:36
std::uint32_t uint32
Definition Core.h:311
std::uint8_t uint8
Definition Core.h:309