|
30 | 30 |
|
31 | 31 | #pragma once |
32 | 32 |
|
33 | | -#include <godot_cpp/templates/hashfuncs.hpp> |
| 33 | +#include <godot_cpp/core/defs.hpp> |
34 | 34 |
|
35 | 35 | namespace godot { |
36 | 36 |
|
37 | 37 | template <typename F, typename S> |
38 | 38 | struct Pair { |
39 | | - F first; |
40 | | - S second; |
41 | | - |
42 | | - Pair() : |
43 | | - first(), |
44 | | - second() { |
45 | | - } |
46 | | - |
47 | | - Pair(F p_first, const S &p_second) : |
48 | | - first(p_first), |
49 | | - second(p_second) { |
50 | | - } |
| 39 | + F first{}; |
| 40 | + S second{}; |
| 41 | + |
| 42 | + constexpr Pair() = default; |
| 43 | + constexpr Pair(const F &p_first, const S &p_second) : |
| 44 | + first(p_first), second(p_second) {} |
| 45 | + |
| 46 | + constexpr bool operator==(const Pair &p_other) const { return first == p_other.first && second == p_other.second; } |
| 47 | + constexpr bool operator!=(const Pair &p_other) const { return first != p_other.first || second != p_other.second; } |
| 48 | + constexpr bool operator<(const Pair &p_other) const { return first == p_other.first ? (second < p_other.second) : (first < p_other.first); } |
| 49 | + constexpr bool operator<=(const Pair &p_other) const { return first == p_other.first ? (second <= p_other.second) : (first < p_other.first); } |
| 50 | + constexpr bool operator>(const Pair &p_other) const { return first == p_other.first ? (second > p_other.second) : (first > p_other.first); } |
| 51 | + constexpr bool operator>=(const Pair &p_other) const { return first == p_other.first ? (second >= p_other.second) : (first > p_other.first); } |
51 | 52 | }; |
52 | 53 |
|
53 | | -template <typename F, typename S> |
54 | | -bool operator==(const Pair<F, S> &pair, const Pair<F, S> &other) { |
55 | | - return (pair.first == other.first) && (pair.second == other.second); |
56 | | -} |
57 | | - |
58 | | -template <typename F, typename S> |
59 | | -bool operator!=(const Pair<F, S> &pair, const Pair<F, S> &other) { |
60 | | - return (pair.first != other.first) || (pair.second != other.second); |
61 | | -} |
62 | | - |
63 | 54 | template <typename F, typename S> |
64 | 55 | struct PairSort { |
65 | | - bool operator()(const Pair<F, S> &A, const Pair<F, S> &B) const { |
66 | | - if (A.first != B.first) { |
67 | | - return A.first < B.first; |
68 | | - } |
69 | | - return A.second < B.second; |
| 56 | + constexpr bool operator()(const Pair<F, S> &p_lhs, const Pair<F, S> &p_rhs) const { |
| 57 | + return p_lhs < p_rhs; |
70 | 58 | } |
71 | 59 | }; |
72 | 60 |
|
| 61 | +// Pair is zero-constructible if and only if both constrained types are zero-constructible. |
73 | 62 | template <typename F, typename S> |
74 | | -struct PairHash { |
75 | | - static uint32_t hash(const Pair<F, S> &P) { |
76 | | - uint64_t h1 = HashMapHasherDefault::hash(P.first); |
77 | | - uint64_t h2 = HashMapHasherDefault::hash(P.second); |
78 | | - return hash_one_uint64((h1 << 32) | h2); |
79 | | - } |
80 | | -}; |
| 63 | +struct is_zero_constructible<Pair<F, S>> : std::conjunction<is_zero_constructible<F>, is_zero_constructible<S>> {}; |
81 | 64 |
|
82 | 65 | template <typename K, typename V> |
83 | 66 | struct KeyValue { |
84 | | - const K key; |
85 | | - V value; |
86 | | - |
87 | | - void operator=(const KeyValue &p_kv) = delete; |
88 | | - _FORCE_INLINE_ KeyValue(const KeyValue &p_kv) : |
89 | | - key(p_kv.key), |
90 | | - value(p_kv.value) { |
91 | | - } |
92 | | - _FORCE_INLINE_ KeyValue(const K &p_key, const V &p_value) : |
93 | | - key(p_key), |
94 | | - value(p_value) { |
95 | | - } |
| 67 | + const K key{}; |
| 68 | + V value{}; |
| 69 | + |
| 70 | + KeyValue &operator=(const KeyValue &p_kv) = delete; |
| 71 | + KeyValue &operator=(KeyValue &&p_kv) = delete; |
| 72 | + |
| 73 | + constexpr KeyValue(const KeyValue &p_kv) = default; |
| 74 | + constexpr KeyValue(KeyValue &&p_kv) = default; |
| 75 | + constexpr KeyValue(const K &p_key, const V &p_value) : |
| 76 | + key(p_key), value(p_value) {} |
| 77 | + constexpr KeyValue(const Pair<K, V> &p_pair) : |
| 78 | + key(p_pair.first), value(p_pair.second) {} |
| 79 | + |
| 80 | + constexpr bool operator==(const KeyValue &p_other) const { return key == p_other.key && value == p_other.value; } |
| 81 | + constexpr bool operator!=(const KeyValue &p_other) const { return key != p_other.key || value != p_other.value; } |
| 82 | + constexpr bool operator<(const KeyValue &p_other) const { return key == p_other.key ? (value < p_other.value) : (key < p_other.key); } |
| 83 | + constexpr bool operator<=(const KeyValue &p_other) const { return key == p_other.key ? (value <= p_other.value) : (key < p_other.key); } |
| 84 | + constexpr bool operator>(const KeyValue &p_other) const { return key == p_other.key ? (value > p_other.value) : (key > p_other.key); } |
| 85 | + constexpr bool operator>=(const KeyValue &p_other) const { return key == p_other.key ? (value >= p_other.value) : (key > p_other.key); } |
96 | 86 | }; |
97 | 87 |
|
98 | | -template <typename K, typename V> |
99 | | -bool operator==(const KeyValue<K, V> &pair, const KeyValue<K, V> &other) { |
100 | | - return (pair.key == other.key) && (pair.value == other.value); |
101 | | -} |
102 | | - |
103 | | -template <typename K, typename V> |
104 | | -bool operator!=(const KeyValue<K, V> &pair, const KeyValue<K, V> &other) { |
105 | | - return (pair.key != other.key) || (pair.value != other.value); |
106 | | -} |
107 | | - |
108 | 88 | template <typename K, typename V> |
109 | 89 | struct KeyValueSort { |
110 | | - bool operator()(const KeyValue<K, V> &A, const KeyValue<K, V> &B) const { |
111 | | - return A.key < B.key; |
| 90 | + constexpr bool operator()(const KeyValue<K, V> &p_lhs, const KeyValue<K, V> &p_rhs) const { |
| 91 | + return p_lhs.key < p_rhs.key; |
112 | 92 | } |
113 | 93 | }; |
114 | 94 |
|
| 95 | +// KeyValue is zero-constructible if and only if both constrained types are zero-constructible. |
| 96 | +template <typename K, typename V> |
| 97 | +struct is_zero_constructible<KeyValue<K, V>> : std::conjunction<is_zero_constructible<K>, is_zero_constructible<V>> {}; |
| 98 | + |
115 | 99 | } // namespace godot |
0 commit comments