xtd 0.2.0
__polymorphic_hasher.hpp
Go to the documentation of this file.
1
4
5#pragma once
7#if !defined(__XTD_CORE_INTERNAL__)
8#error "Do not include this file: Internal use only"
9#endif
11
12#include "../object.hpp"
13#include "../ihashable.hpp"
14#include <functional>
15#include <type_traits>
16
18template<typename key_t>
19using __is_hashable__ = std::is_invocable<std::hash<key_t>, const key_t&>;
20
21template<typename key_t, typename bool_t>
22struct __value_hasher__ {};
23
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);}
27};
28
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));
33 //return std::hash<std::string_view>{}(typeid(key).name());
34 }
35};
36
37template<typename key_t, typename bool_t>
38struct __object_hasher__ {};
39
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();}
43};
44
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);}
48};
49
50template<typename key_t, typename bool_t>
51struct __ihashable_hasher__ {};
52
53template<typename key_t>
54struct __ihashable_hasher__<key_t, std::true_type> {
55 xtd::size operator()(const key_t& key) const {return static_cast<const xtd::ihashable&>(key).get_hash_code();}
56};
57
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);}
61};
62
63template<typename key_t, typename bool_t>
64struct __polymorphic_hasher__ {};
65
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);}
69};
70
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);}
74};
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