19#ifndef FENNEC_LANG_TYPE_OPERATORS_H
20#define FENNEC_LANG_TYPE_OPERATORS_H
29template<
typename T0,
typename T1 = T0>
32 template<
typename U,
typename V>
static auto test(U*) ->
decltype(declval<U>() == declval<V>());
33 template<
typename,
typename>
static auto test(...) -> false_type;
35 static constexpr bool value = is_same_v<bool, decltype(test<T0, T1>(0))>;
38template<
typename T0,
typename T1 = T0>
constexpr bool has_equals_v = has_equals<T0, T1>::value;
42template<
typename T0,
typename T1 = T0>
45 template<
typename U,
typename V>
static auto test(U*) ->
decltype(declval<U>() != declval<V>());
46 template<
typename,
typename>
static auto test(...) -> false_type;
48 static constexpr bool value = is_same_v<bool, decltype(test<T0, T1>(0))>;
51template<
typename T0,
typename T1 = T0>
constexpr bool has_nequals_v = has_nequals<T0, T1>::value;
56template<
typename T0,
typename T1 = T0>
59 template<
typename U,
typename V>
static auto test(U*) ->
decltype(declval<U>() < declval<V>());
60 template<
typename,
typename>
static auto test(...) -> false_type;
62 static constexpr bool value = is_same_v<bool, decltype(test<T0, T1>(0))>;
65template<
typename T0,
typename T1 = T0>
constexpr bool has_less_v = has_less<T0, T1>::value;
70template<
typename T0,
typename T1 = T0>
71struct has_less_equals {
73 template<
typename U,
typename V>
static auto test(U*) ->
decltype(declval<U>() <= declval<V>());
74 template<
typename,
typename>
static auto test(...) -> false_type;
76 static constexpr bool value = is_same_v<bool, decltype(test<T0, T1>(0))>;
79template<
typename T0,
typename T1 = T0>
constexpr bool has_less_equals_v = has_less_equals<T0, T1>::value;
84template<
typename T0,
typename T1 = T0>
87 template<
typename U,
typename V>
static auto test(U*) ->
decltype(declval<U>() > declval<V>());
88 template<
typename,
typename>
static auto test(...) -> false_type;
90 static constexpr bool value = is_same_v<bool, decltype(test<T0, T1>(0))>;
93template<
typename T0,
typename T1 = T0>
constexpr bool has_greater_v = has_greater<T0, T1>::value;
98template<
typename T0,
typename T1 = T0>
99struct has_greater_equals {
101 template<
typename U,
typename V>
static auto test(U*) ->
decltype(declval<U>() >= declval<V>());
102 template<
typename,
typename>
static auto test(...) -> false_type;
104 static constexpr bool value = is_same_v<bool, decltype(test<T0, T1>(0))>;
107template<
typename T0,
typename T1 = T0>
constexpr bool has_greater_equals_v = has_greater_equals<T0, T1>::value;