7#if !defined(__XTD_CORE_INTERNAL__)
8#error "Do not include this file: Internal use only"
12#include "../object.hpp"
13#include "../ihashable.hpp"
18template<
typename key_t>
19using __is_hashable__ = std::is_invocable<std::hash<key_t>,
const key_t&>;
21template<
typename key_t,
typename bool_t>
22struct __value_hasher__ {};
24template<
typename key_t>
25struct __value_hasher__<key_t, std::true_type> {
26 xtd::size operator()(
const key_t& key)
const {
return std::hash<key_t> {}(key);}
29template<
typename key_t>
30struct __value_hasher__<key_t, std::false_type> {
31 xtd::size operator()(
const key_t& key)
const {
32 return std::hash<std::intptr_t> {}(
reinterpret_cast<std::intptr_t
>(&key));
37template<
typename key_t,
typename bool_t>
38struct __object_hasher__ {};
40template<
typename key_t>
41struct __object_hasher__<key_t, std::true_type> {
42 xtd::size operator()(
const key_t& key)
const {
return static_cast<const xtd::object&
>(key).get_hash_code();}
45template<
typename key_t>
46struct __object_hasher__<key_t, std::false_type> {
47 xtd::size operator()(
const key_t& key)
const {
return __value_hasher__<key_t, typename __is_hashable__<key_t>::type> {}(key);}
50template<
typename key_t,
typename bool_t>
51struct __ihashable_hasher__ {};
53template<
typename key_t>
54struct __ihashable_hasher__<key_t, std::true_type> {
58template<
typename key_t>
59struct __ihashable_hasher__<key_t, std::false_type> {
60 xtd::size operator()(
const key_t& key)
const {
return __object_hasher__<key_t, typename std::is_base_of<xtd::object, key_t>::type> {}(key);}
63template<
typename key_t,
typename bool_t>
64struct __polymorphic_hasher__ {};
66template<
typename key_t>
67struct __polymorphic_hasher__<key_t, std::true_type> {
68 xtd::size operator()(
const key_t& key)
const {
return __ihashable_hasher__<key_t, typename std::is_base_of<xtd::ihashable, key_t>::type> {}(key);}
71template<
typename key_t>
72struct __polymorphic_hasher__<key_t, std::false_type> {
73 xtd::size operator()(
const key_t& key)
const {
return __value_hasher__<key_t, typename __is_hashable__<key_t>::type> {}(key);}
Defines a generalized method that a value type or class implements to create a type-specific method f...
Definition ihashable.hpp:21
Supports all classes in the xtd class hierarchy and provides low-level services to derived classes....
Definition object.hpp:43
size_t size
Represents a size of any object in bytes.
Definition size.hpp:23