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