31#ifndef ETL_HASH_INCLUDED
32#define ETL_HASH_INCLUDED
36#if ETL_USING_8BIT_TYPES
41 #include "static_assert.h"
54 namespace private_hash
61 typename enable_if<
sizeof(T) ==
sizeof(uint16_t),
size_t>::type generic_hash(
const uint8_t* begin,
const uint8_t* end)
63 uint32_t h = fnv_1a_32(begin, end);
65 return static_cast<size_t>(h ^ (h >> 16U));
73 typename enable_if<
sizeof(T) ==
sizeof(uint32_t),
size_t>::type generic_hash(
const uint8_t* begin,
const uint8_t* end)
75 return fnv_1a_32(begin, end);
78 #if ETL_USING_64BIT_TYPES
84 typename enable_if<
sizeof(T) ==
sizeof(uint64_t),
size_t>::type generic_hash(
const uint8_t* begin,
const uint8_t* end)
86 return fnv_1a_64(begin, end);
93 template <
typename T,
bool Is_Enum = false>
99 hash_base(
const hash_base& other);
100 hash_base& operator=(
const hash_base& other);
103 hash_base(hash_base&& other);
104 hash_base& operator=(hash_base&& other);
117 template <
typename T>
118 struct hash : private_hash::hash_base<T, etl::is_enum<T>::value>
126 template <
typename T>
137 ETL_STATIC_ASSERT(
sizeof(
size_t) >=
sizeof(
bool),
"size_t smaller than type");
139 size_t operator()(
bool v)
const
141 return static_cast<size_t>(v);
152 ETL_STATIC_ASSERT(
sizeof(
size_t) >=
sizeof(
char),
"size_t smaller than type");
154 size_t operator()(
char v)
const
156 return static_cast<size_t>(v);
165 struct hash<signed char>
167 ETL_STATIC_ASSERT(
sizeof(
size_t) >=
sizeof(
signed char),
"size_t smaller than type");
169 size_t operator()(
signed char v)
const
171 return static_cast<size_t>(v);
180 struct hash<unsigned char>
182 ETL_STATIC_ASSERT(
sizeof(
size_t) >=
sizeof(
unsigned char),
"size_t smaller than type");
184 size_t operator()(
unsigned char v)
const
186 return static_cast<size_t>(v);
197 size_t operator()(
wchar_t v)
const
200 if ETL_IF_CONSTEXPR (
sizeof(
size_t) >=
sizeof(v))
202 return static_cast<size_t>(v);
206 uint8_t* p =
reinterpret_cast<uint8_t*
>(&v);
207 return private_hash::generic_hash<size_t>(p, p +
sizeof(v));
219 size_t operator()(
short v)
const
222 if ETL_IF_CONSTEXPR (
sizeof(
size_t) >=
sizeof(v))
224 return static_cast<size_t>(v);
228 uint8_t* p =
reinterpret_cast<uint8_t*
>(&v);
229 return private_hash::generic_hash<size_t>(p, p +
sizeof(v));
239 struct hash<unsigned short>
241 size_t operator()(
unsigned short v)
const
244 if ETL_IF_CONSTEXPR (
sizeof(
size_t) >=
sizeof(v))
246 return static_cast<size_t>(v);
250 uint8_t* p =
reinterpret_cast<uint8_t*
>(&v);
251 return private_hash::generic_hash<size_t>(p, p +
sizeof(v));
263 size_t operator()(
int v)
const
266 if ETL_IF_CONSTEXPR (
sizeof(
size_t) >=
sizeof(v))
268 return static_cast<size_t>(v);
272 uint8_t* p =
reinterpret_cast<uint8_t*
>(&v);
273 return private_hash::generic_hash<size_t>(p, p +
sizeof(v));
283 struct hash<unsigned int>
285 size_t operator()(
unsigned int v)
const
288 if ETL_IF_CONSTEXPR (
sizeof(
size_t) >=
sizeof(v))
290 return static_cast<size_t>(v);
294 uint8_t* p =
reinterpret_cast<uint8_t*
>(&v);
295 return private_hash::generic_hash<size_t>(p, p +
sizeof(v));
307 size_t operator()(
long v)
const
310 if ETL_IF_CONSTEXPR (
sizeof(
size_t) >=
sizeof(v))
312 return static_cast<size_t>(v);
316 uint8_t* p =
reinterpret_cast<uint8_t*
>(&v);
317 return private_hash::generic_hash<size_t>(p, p +
sizeof(v));
327 struct hash<long long>
329 size_t operator()(
long long v)
const
332 if ETL_IF_CONSTEXPR (
sizeof(
size_t) >=
sizeof(v))
334 return static_cast<size_t>(v);
338 uint8_t* p =
reinterpret_cast<uint8_t*
>(&v);
339 return private_hash::generic_hash<size_t>(p, p +
sizeof(v));
349 struct hash<unsigned long>
351 size_t operator()(
unsigned long v)
const
354 if ETL_IF_CONSTEXPR (
sizeof(
size_t) >=
sizeof(v))
356 return static_cast<size_t>(v);
360 uint8_t* p =
reinterpret_cast<uint8_t*
>(&v);
361 return private_hash::generic_hash<size_t>(p, p +
sizeof(v));
371 struct hash<unsigned long long>
373 size_t operator()(
unsigned long long v)
const
376 if ETL_IF_CONSTEXPR (
sizeof(
size_t) >=
sizeof(v))
378 return static_cast<size_t>(v);
382 uint8_t* p =
reinterpret_cast<uint8_t*
>(&v);
383 return private_hash::generic_hash<size_t>(p, p +
sizeof(v));
395 size_t operator()(
float v)
const
398 if ETL_IF_CONSTEXPR (
sizeof(
size_t) ==
sizeof(v))
416 uint8_t* p =
reinterpret_cast<uint8_t*
>(&v);
417 return private_hash::generic_hash<size_t>(p, p +
sizeof(v));
429 size_t operator()(
double v)
const
432 if ETL_IF_CONSTEXPR (
sizeof(
size_t) ==
sizeof(v))
450 uint8_t* p =
reinterpret_cast<uint8_t*
>(&v);
451 return private_hash::generic_hash<size_t>(p, p +
sizeof(v));
461 struct hash<long double>
463 size_t operator()(
long double v)
const
466 if ETL_IF_CONSTEXPR (
sizeof(
size_t) ==
sizeof(v))
484 uint8_t* p =
reinterpret_cast<uint8_t*
>(&v);
485 return private_hash::generic_hash<size_t>(p, p +
sizeof(v));
494 template <
typename T>
497 size_t operator()(
const T* v)
const
500 if (
sizeof(
size_t) ==
sizeof(T*))
514 uint8_t* p =
reinterpret_cast<uint8_t*
>(&v);
515 return private_hash::generic_hash<size_t>(p, p +
sizeof(v));
520 namespace private_hash
525 template <
typename T>
526 struct hash_base<T, true>
528 size_t operator()(T v)
const
530 if (
sizeof(
size_t) >=
sizeof(T))
532 return static_cast<size_t>(v);
536 return ::etl::hash<unsigned long long>()(
static_cast<unsigned long long>(v));
bitset_ext
Definition absolute.h:40