basedOpinionated utility library |
git clone git://git.dimitrijedobrota.com/based.git |
Log | Files | Refs | README | HACKING | CONTRIBUTING | CODE_OF_CONDUCT | BUILDING |
type_traits.cpp (3600B)
1 #include "based/type_traits.hpp" 2 3 namespace 4 { 5 6 struct irregular 7 { 8 irregular() = default; 9 10 irregular(const irregular&) = delete; 11 irregular(irregular&&) = delete; 12 13 irregular& operator=(const irregular&) = delete; 14 irregular& operator=(irregular&&) = delete; 15 16 ~irregular() = default; 17 }; 18 19 struct no_return 20 { 21 void operator()() {} 22 }; 23 24 template<typename T> 25 struct identity 26 { 27 T operator()(T val) { return val; } 28 }; 29 30 template<typename T, typename U> 31 struct add 32 { 33 T operator()(const T& val1, const U& val2) { return val1 + val2; } 34 }; 35 36 template<typename T> 37 struct mutate 38 { 39 T operator()(T* val) { return *val = 1; } 40 }; 41 42 template<typename T, typename U> 43 T sub(T val1, U val2) 44 { 45 return val1 - val2; 46 } 47 48 } // namespace 49 50 int main() 51 { 52 static_assert(based::arity_v<no_return> == 0); 53 static_assert(based::Procedure<no_return>); 54 static_assert(!based::RegularProcedure<no_return>); 55 static_assert(!based::FunctionalProcedure<no_return>); 56 57 using id = identity<double>; 58 using ii = identity<irregular>; 59 60 static_assert(std::same_as<based::codomain_t<id, double>, double>); 61 static_assert(based::arity_v<id, double> == 1); 62 63 static_assert(based::Procedure<id, double>); 64 static_assert(!based::Procedure<ii, irregular>); 65 66 static_assert(based::RegularProcedure<id, double>); 67 static_assert(!based::RegularProcedure<ii, irregular>); 68 69 static_assert(based::FunctionalProcedure<id, double>); 70 static_assert(!based::FunctionalProcedure<ii, irregular>); 71 72 using ad = add<double, double>; 73 using ai = add<irregular, irregular>; 74 using aid = add<irregular, double>; 75 using adi = add<double, irregular>; 76 77 static_assert(std::same_as<based::codomain_t<ad, double, double>, double>); 78 static_assert(based::arity_v<ad, double, double> == 2); 79 80 static_assert(based::Procedure<ad, double, double>); 81 static_assert(based::Procedure<ai, irregular, irregular>); 82 static_assert(based::Procedure<aid, irregular, double>); 83 static_assert(based::Procedure<adi, double, irregular>); 84 85 static_assert(based::RegularProcedure<ad, double, double>); 86 static_assert(!based::RegularProcedure<ai, irregular, irregular>); 87 static_assert(!based::RegularProcedure<aid, irregular, double>); 88 static_assert(!based::RegularProcedure<adi, double, irregular>); 89 90 static_assert(based::FunctionalProcedure<ad, double, double>); 91 static_assert(!based::FunctionalProcedure<ai, irregular, irregular>); 92 static_assert(!based::FunctionalProcedure<aid, irregular, double>); 93 static_assert(!based::FunctionalProcedure<adi, double, irregular>); 94 95 using md = mutate<double>; 96 97 static_assert(based::Procedure<md, double*>); 98 static_assert(based::RegularProcedure<md, double*>); 99 static_assert(!based::FunctionalProcedure<md>); 100 101 static_assert( 102 based::RegularProcedure<decltype(sub<double, double>), double, double>); 103 104 static const auto l1 = [](double a) { return a; }; 105 static_assert(based::Procedure<decltype(l1), double>); 106 static_assert(based::RegularProcedure<decltype(l1), double>); 107 static_assert(based::FunctionalProcedure<decltype(l1), double>); 108 109 static const auto l2 = [](irregular /* a */) { return 1; }; 110 static_assert(!based::Procedure<decltype(l2), irregular>); 111 static_assert(!based::RegularProcedure<decltype(l2), irregular>); 112 static_assert(!based::FunctionalProcedure<decltype(l2), irregular>); 113 114 static const auto l3 = [](const irregular& /* a */) { return 1; }; 115 static_assert(based::Procedure<decltype(l3), irregular>); 116 static_assert(!based::RegularProcedure<decltype(l3), irregular>); 117 static_assert(!based::FunctionalProcedure<decltype(l3), irregular>); 118 119 return 0; 120 }