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
66 return static_cast<size_t>(
h ^ (
h >> 16U));
74 typename enable_if<
sizeof(
T) ==
sizeof(
uint32_t),
size_t>::type
80#if ETL_USING_64BIT_TYPES
86 typename enable_if<
sizeof(
T) ==
sizeof(
uint64_t),
size_t>::type
96 template<
typename T,
bool IsEnum=false>
101 hash_base(
const hash_base& other);
102 hash_base& operator=(
const hash_base& other);
105 hash_base(hash_base&& other);
106 hash_base& operator=(hash_base&& other);
118 template <
typename T>
119 struct hash : private_hash::hash_base<T, etl::is_enum<T>::value>{};
125 template <
typename T>
struct hash;
135 ETL_STATIC_ASSERT(
sizeof(
size_t) >=
sizeof(
bool),
"size_t smaller than type");
137 size_t operator ()(
bool v)
const
139 return static_cast<size_t>(v);
150 ETL_STATIC_ASSERT(
sizeof(
size_t) >=
sizeof(
char),
"size_t smaller than type");
152 size_t operator ()(
char v)
const
154 return static_cast<size_t>(v);
165 ETL_STATIC_ASSERT(
sizeof(
size_t) >=
sizeof(
signed char),
"size_t smaller than type");
167 size_t operator ()(
signed char v)
const
169 return static_cast<size_t>(v);
178 struct hash<unsigned char>
180 ETL_STATIC_ASSERT(
sizeof(
size_t) >=
sizeof(
unsigned char),
"size_t smaller than type");
182 size_t operator ()(
unsigned char v)
const
184 return static_cast<size_t>(v);
195 size_t operator ()(
wchar_t v)
const
198 if ETL_IF_CONSTEXPR(
sizeof(
size_t) >=
sizeof(v))
200 return static_cast<size_t>(v);
204 uint8_t* p =
reinterpret_cast<uint8_t*
>(&v);
205 return private_hash::generic_hash<size_t>(p, p +
sizeof(v));
217 size_t operator ()(
short v)
const
220 if ETL_IF_CONSTEXPR(
sizeof(
size_t) >=
sizeof(v))
222 return static_cast<size_t>(v);
226 uint8_t* p =
reinterpret_cast<uint8_t*
>(&v);
227 return private_hash::generic_hash<size_t>(p, p +
sizeof(v));
237 struct hash<unsigned short>
239 size_t operator ()(
unsigned short v)
const
242 if ETL_IF_CONSTEXPR(
sizeof(
size_t) >=
sizeof(v))
244 return static_cast<size_t>(v);
248 uint8_t* p =
reinterpret_cast<uint8_t*
>(&v);
249 return private_hash::generic_hash<size_t>(p, p +
sizeof(v));
261 size_t operator ()(
int v)
const
264 if ETL_IF_CONSTEXPR(
sizeof(
size_t) >=
sizeof(v))
266 return static_cast<size_t>(v);
270 uint8_t* p =
reinterpret_cast<uint8_t*
>(&v);
271 return private_hash::generic_hash<size_t>(p, p +
sizeof(v));
281 struct hash<unsigned int>
283 size_t operator ()(
unsigned int v)
const
286 if ETL_IF_CONSTEXPR(
sizeof(
size_t) >=
sizeof(v))
288 return static_cast<size_t>(v);
292 uint8_t* p =
reinterpret_cast<uint8_t*
>(&v);
293 return private_hash::generic_hash<size_t>(p, p +
sizeof(v));
305 size_t operator ()(
long v)
const
308 if ETL_IF_CONSTEXPR(
sizeof(
size_t) >=
sizeof(v))
310 return static_cast<size_t>(v);
314 uint8_t* p =
reinterpret_cast<uint8_t*
>(&v);
315 return private_hash::generic_hash<size_t>(p, p +
sizeof(v));
325 struct hash<long long>
327 size_t operator ()(
long long v)
const
330 if ETL_IF_CONSTEXPR(
sizeof(
size_t) >=
sizeof(v))
332 return static_cast<size_t>(v);
336 uint8_t* p =
reinterpret_cast<uint8_t*
>(&v);
337 return private_hash::generic_hash<size_t>(p, p +
sizeof(v));
347 struct hash<unsigned long>
349 size_t operator ()(
unsigned long v)
const
352 if ETL_IF_CONSTEXPR(
sizeof(
size_t) >=
sizeof(v))
354 return static_cast<size_t>(v);
358 uint8_t* p =
reinterpret_cast<uint8_t*
>(&v);
359 return private_hash::generic_hash<size_t>(p, p +
sizeof(v));
369 struct hash<unsigned long long>
371 size_t operator ()(
unsigned long long v)
const
374 if ETL_IF_CONSTEXPR(
sizeof(
size_t) >=
sizeof(v))
376 return static_cast<size_t>(v);
380 uint8_t* p =
reinterpret_cast<uint8_t*
>(&v);
381 return private_hash::generic_hash<size_t>(p, p +
sizeof(v));
393 size_t operator ()(
float v)
const
396 if ETL_IF_CONSTEXPR(
sizeof(
size_t) ==
sizeof(v))
414 uint8_t* p =
reinterpret_cast<uint8_t*
>(&v);
415 return private_hash::generic_hash<size_t>(p, p +
sizeof(v));
427 size_t operator ()(
double v)
const
430 if ETL_IF_CONSTEXPR(
sizeof(
size_t) ==
sizeof(v))
448 uint8_t* p =
reinterpret_cast<uint8_t*
>(&v);
449 return private_hash::generic_hash<size_t>(p, p +
sizeof(v));
459 struct hash<long double>
461 size_t operator ()(
long double v)
const
464 if ETL_IF_CONSTEXPR(
sizeof(
size_t) ==
sizeof(v))
482 uint8_t* p =
reinterpret_cast<uint8_t*
>(&v);
483 return private_hash::generic_hash<size_t>(p, p +
sizeof(v));
492 template <
typename T>
495 size_t operator ()(
const T* v)
const
498 if (
sizeof(
size_t) ==
sizeof(T*))
512 uint8_t* p =
reinterpret_cast<uint8_t*
>(&v);
513 return private_hash::generic_hash<size_t>(p, p +
sizeof(v));
518 namespace private_hash
526 size_t operator()(T v)
const
528 if (
sizeof(
size_t) >=
sizeof(T))
530 return static_cast<size_t>(v);
534 return ::etl::hash<unsigned long long>()(
static_cast<unsigned long long>(v));
bitset_ext
Definition absolute.h:38
ETL_CONSTEXPR TContainer::iterator begin(TContainer &container)
Definition iterator.h:962
ETL_CONSTEXPR TContainer::iterator end(TContainer &container)
Definition iterator.h:992
ETL_CONSTEXPR pair()
Default constructor.
Definition utility.h:176