NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
icommon.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_INTERFACE_ICOMMON_HPP__
2#define NEFORCE_CORE_INTERFACE_ICOMMON_HPP__
3
11
13NEFORCE_BEGIN_NAMESPACE__
14
20
29template <typename T>
30struct ihashable {
31private:
32 constexpr const T& derived() const noexcept { return static_cast<const T&>(*this); }
33
34public:
41 NEFORCE_NODISCARD constexpr size_t to_ihash() const noexcept(noexcept(derived().to_hash())) {
42 return derived().to_hash();
43 }
44};
45 // CRTPInterfaces
47
52
57template <typename T>
58struct hash<T, enable_if_t<is_base_of<ihashable<T>, T>::value>> {
59 NEFORCE_NODISCARD constexpr size_t operator()(const T& obj) const noexcept(noexcept(obj.to_ihash())) {
60 return obj.to_ihash();
61 }
62};
63 // HashPrimary
65
70
79template <typename T>
81private:
82 constexpr const T& derived() const noexcept { return static_cast<const T&>(*this); }
83
84public:
92 NEFORCE_NODISCARD constexpr bool operator==(const T& rhs) const noexcept(noexcept(derived().equal_to(rhs))) {
93 return derived().equal_to(rhs);
94 }
95
103 NEFORCE_NODISCARD constexpr bool operator!=(const T& rhs) const noexcept(noexcept(!(derived().equal_to(rhs)))) {
104 return !(derived().equal_to(rhs));
105 }
106
114 NEFORCE_NODISCARD constexpr bool operator<(const T& rhs) const noexcept(noexcept(derived().less_than(rhs))) {
115 return derived().less_than(rhs);
116 }
117
125 NEFORCE_NODISCARD constexpr bool operator>(const T& rhs) const noexcept(noexcept(rhs.less_than(derived()))) {
126 return rhs.less_than(derived());
127 }
128
136 NEFORCE_NODISCARD constexpr bool operator<=(const T& rhs) const noexcept(noexcept(!(rhs.less_than(derived())))) {
137 return !(rhs.less_than(derived()));
138 }
139
147 NEFORCE_NODISCARD constexpr bool operator>=(const T& rhs) const noexcept(noexcept(!(derived().less_than(rhs)))) {
148 return !(derived().less_than(rhs));
149 }
150};
151
152template <typename T, enable_if_t<is_base_of_v<icomparable<T>, T>, int> = 0>
153NEFORCE_NODISCARD constexpr bool operator==(const T& lhs, const T& rhs) {
154 return lhs.equal_to(rhs);
155}
156
157template <typename T, enable_if_t<is_base_of_v<icomparable<T>, T>, int> = 0>
158NEFORCE_NODISCARD constexpr bool operator!=(const T& lhs, const T& rhs) {
159 return !(lhs.equal_to(rhs));
160}
161
162template <typename T, enable_if_t<is_base_of_v<icomparable<T>, T>, int> = 0>
163NEFORCE_NODISCARD constexpr bool operator<(const T& lhs, const T& rhs) {
164 return lhs.less_than(rhs);
165}
166
167template <typename T, enable_if_t<is_base_of_v<icomparable<T>, T>, int> = 0>
168NEFORCE_NODISCARD constexpr bool operator>(const T& lhs, const T& rhs) {
169 return rhs.less_than(lhs);
170}
171
172template <typename T, enable_if_t<is_base_of_v<icomparable<T>, T>, int> = 0>
173NEFORCE_NODISCARD constexpr bool operator<=(const T& lhs, const T& rhs) {
174 return !(rhs.less_than(lhs));
175}
176
177template <typename T, enable_if_t<is_base_of_v<icomparable<T>, T>, int> = 0>
178NEFORCE_NODISCARD constexpr bool operator>=(const T& lhs, const T& rhs) {
179 return !(lhs.less_than(rhs));
180}
181
182
192template <typename T>
193struct icommon : public icomparable<T>, public ihashable<T> {};
194 // CRTPInterfaces
196
197NEFORCE_END_NAMESPACE__
198#endif // NEFORCE_CORE_INTERFACE_ICOMMON_HPP__
bool operator!=(const function< Res(Args...)> &f, nullptr_t np) noexcept
不等于空指针比较
bool operator==(const function< Res(Args...)> &f, nullptr_t np) noexcept
等于空指针比较
typename enable_if< Test, T >::type enable_if_t
enable_if的便捷别名
哈希函数库
哈希函数的主模板
通用接口,同时具备可比较和可哈希功能
可比较对象接口模板
constexpr bool operator<=(const T &rhs) const noexcept(noexcept(!(rhs.less_than(derived()))))
小于等于比较运算符
constexpr bool operator>=(const T &rhs) const noexcept(noexcept(!(derived().less_than(rhs))))
大于等于比较运算符
constexpr bool operator==(const T &rhs) const noexcept(noexcept(derived().equal_to(rhs)))
相等比较运算符
constexpr bool operator!=(const T &rhs) const noexcept(noexcept(!(derived().equal_to(rhs))))
不等比较运算符
constexpr bool operator>(const T &rhs) const noexcept(noexcept(rhs.less_than(derived())))
大于比较运算符
constexpr bool operator<(const T &rhs) const noexcept(noexcept(derived().less_than(rhs)))
小于比较运算符
可哈希对象接口模板
constexpr size_t to_ihash() const noexcept(noexcept(derived().to_hash()))
获取对象的哈希值
判断Base是否是Derived的基类