31#ifndef ETL_HASH_INCLUDED
32#define ETL_HASH_INCLUDED
36#if ETL_USING_8BIT_TYPES
41#include "static_assert.h"
51 namespace private_hash
58 typename enable_if<
sizeof(T) ==
sizeof(uint16_t),
size_t>::type
59 generic_hash(
const uint8_t*
begin,
const uint8_t*
end)
63 return static_cast<size_t>(h ^ (h >> 16U));
71 typename enable_if<
sizeof(T) ==
sizeof(uint32_t),
size_t>::type
72 generic_hash(
const uint8_t*
begin,
const uint8_t*
end)
77#if ETL_USING_64BIT_TYPES
83 typename enable_if<
sizeof(T) ==
sizeof(uint64_t),
size_t>::type
84 generic_hash(
const uint8_t*
begin,
const uint8_t*
end)
93 template<
typename T,
bool IsEnum=false>
98 hash_base(
const hash_base& other);
99 hash_base& operator=(
const hash_base& other);
102 hash_base(hash_base&& other);
103 hash_base& operator=(hash_base&& other);
115 template <
typename T>
116 struct hash : private_hash::hash_base<T, etl::is_enum<T>::value>{};
122 template <
typename T>
struct hash;
132 ETL_STATIC_ASSERT(
sizeof(
size_t) >=
sizeof(
bool),
"size_t smaller than type");
134 size_t operator ()(
bool v)
const
136 return static_cast<size_t>(v);
147 ETL_STATIC_ASSERT(
sizeof(
size_t) >=
sizeof(
char),
"size_t smaller than type");
149 size_t operator ()(
char v)
const
151 return static_cast<size_t>(v);
162 ETL_STATIC_ASSERT(
sizeof(
size_t) >=
sizeof(
signed char),
"size_t smaller than type");
164 size_t operator ()(
signed char v)
const
166 return static_cast<size_t>(v);
175 struct hash<unsigned char>
177 ETL_STATIC_ASSERT(
sizeof(
size_t) >=
sizeof(
unsigned char),
"size_t smaller than type");
179 size_t operator ()(
unsigned char v)
const
181 return static_cast<size_t>(v);
192 ETL_STATIC_ASSERT(
sizeof(
size_t) >=
sizeof(
wchar_t),
"size_t smaller than type");
194 size_t operator ()(
wchar_t v)
const
196 return static_cast<size_t>(v);
207 ETL_STATIC_ASSERT(
sizeof(
size_t) >=
sizeof(
short),
"size_t smaller than type");
209 size_t operator ()(
short v)
const
211 return static_cast<size_t>(v);
220 struct hash<unsigned short>
222 ETL_STATIC_ASSERT(
sizeof(
size_t) >=
sizeof(
unsigned short),
"size_t smaller than type");
224 size_t operator ()(
unsigned short v)
const
226 return static_cast<size_t>(v);
237 ETL_STATIC_ASSERT(
sizeof(
size_t) >=
sizeof(
int),
"size_t smaller than type");
239 size_t operator ()(
int v)
const
241 return static_cast<size_t>(v);
250 struct hash<unsigned int>
252 ETL_STATIC_ASSERT(
sizeof(
size_t) >=
sizeof(
unsigned int),
"size_t smaller than type");
254 size_t operator ()(
unsigned int v)
const
256 return static_cast<size_t>(v);
267 size_t operator ()(
long v)
const
270 if ETL_IF_CONSTEXPR(
sizeof(
size_t) >=
sizeof(v))
272 return static_cast<size_t>(v);
276 uint8_t* p =
reinterpret_cast<uint8_t*
>(&v);
277 return private_hash::generic_hash<size_t>(p, p +
sizeof(v));
287 struct hash<long long>
289 size_t operator ()(
long long v)
const
292 if ETL_IF_CONSTEXPR(
sizeof(
size_t) >=
sizeof(v))
294 return static_cast<size_t>(v);
298 uint8_t* p =
reinterpret_cast<uint8_t*
>(&v);
299 return private_hash::generic_hash<size_t>(p, p +
sizeof(v));
309 struct hash<unsigned long>
311 size_t operator ()(
unsigned long v)
const
314 if ETL_IF_CONSTEXPR(
sizeof(
size_t) >=
sizeof(v))
316 return static_cast<size_t>(v);
320 uint8_t* p =
reinterpret_cast<uint8_t*
>(&v);
321 return private_hash::generic_hash<size_t>(p, p +
sizeof(v));
331 struct hash<unsigned long long>
333 size_t operator ()(
unsigned long long v)
const
336 if ETL_IF_CONSTEXPR(
sizeof(
size_t) >=
sizeof(v))
338 return static_cast<size_t>(v);
342 uint8_t* p =
reinterpret_cast<uint8_t*
>(&v);
343 return private_hash::generic_hash<size_t>(p, p +
sizeof(v));
355 size_t operator ()(
float v)
const
358 if ETL_IF_CONSTEXPR(
sizeof(
size_t) ==
sizeof(v))
376 uint8_t* p =
reinterpret_cast<uint8_t*
>(&v);
377 return private_hash::generic_hash<size_t>(p, p +
sizeof(v));
389 size_t operator ()(
double v)
const
392 if ETL_IF_CONSTEXPR(
sizeof(
size_t) ==
sizeof(v))
410 uint8_t* p =
reinterpret_cast<uint8_t*
>(&v);
411 return private_hash::generic_hash<size_t>(p, p +
sizeof(v));
421 struct hash<long double>
423 size_t operator ()(
long double v)
const
426 if ETL_IF_CONSTEXPR(
sizeof(
size_t) ==
sizeof(v))
444 uint8_t* p =
reinterpret_cast<uint8_t*
>(&v);
445 return private_hash::generic_hash<size_t>(p, p +
sizeof(v));
454 template <
typename T>
457 size_t operator ()(
const T* v)
const
460 if (
sizeof(
size_t) ==
sizeof(T*))
474 uint8_t* p =
reinterpret_cast<uint8_t*
>(&v);
475 return private_hash::generic_hash<size_t>(p, p +
sizeof(v));
480 namespace private_hash
486 struct hash_base<T, true>
488 size_t operator()(T v)
const
490 if (
sizeof(
size_t) >=
sizeof(T))
492 return static_cast<size_t>(v);
496 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:931
ETL_CONSTEXPR TContainer::iterator end(TContainer &container)
Definition: iterator.h:961