Mercurial > thymian
annotate templates/named_operator.hpp @ 0:a4671277546c tip
created the repository for the thymian project
| author | ferencd |
|---|---|
| date | Tue, 17 Aug 2021 11:19:54 +0200 |
| parents | |
| children |
| rev | line source |
|---|---|
| ferencd@0 | 1 #ifndef BASE_NAMED_OPERATOR_HPP |
| ferencd@0 | 2 #define BASE_NAMED_OPERATOR_HPP |
| ferencd@0 | 3 |
| ferencd@0 | 4 #include <utility> |
| ferencd@0 | 5 |
| ferencd@0 | 6 namespace base { |
| ferencd@0 | 7 |
| ferencd@0 | 8 template <typename F> |
| ferencd@0 | 9 struct named_operator_wrapper { |
| ferencd@0 | 10 F f; |
| ferencd@0 | 11 }; |
| ferencd@0 | 12 |
| ferencd@0 | 13 template <typename T, typename F> |
| ferencd@0 | 14 struct named_operator_lhs { |
| ferencd@0 | 15 F f; |
| ferencd@0 | 16 T& value; |
| ferencd@0 | 17 }; |
| ferencd@0 | 18 |
| ferencd@0 | 19 template <typename T, typename F> |
| ferencd@0 | 20 inline named_operator_lhs<T, F> operator <(T& lhs, named_operator_wrapper<F> rhs) { |
| ferencd@0 | 21 return {rhs.f, lhs}; |
| ferencd@0 | 22 } |
| ferencd@0 | 23 |
| ferencd@0 | 24 template <typename T, typename F> |
| ferencd@0 | 25 inline named_operator_lhs<T const, F> operator <(T const& lhs, named_operator_wrapper<F> rhs) { |
| ferencd@0 | 26 return {rhs.f, lhs}; |
| ferencd@0 | 27 } |
| ferencd@0 | 28 |
| ferencd@0 | 29 template <typename T1, typename T2, typename F> |
| ferencd@0 | 30 inline auto operator >(named_operator_lhs<T1, F> const& lhs, T2 const& rhs) |
| ferencd@0 | 31 -> decltype(lhs.f(std::declval<T1>(), std::declval<T2>())) |
| ferencd@0 | 32 { |
| ferencd@0 | 33 return lhs.f(lhs.value, rhs); |
| ferencd@0 | 34 } |
| ferencd@0 | 35 |
| ferencd@0 | 36 template <typename T1, typename T2, typename F> |
| ferencd@0 | 37 inline auto operator >=(named_operator_lhs<T1, F> const& lhs, T2 const& rhs) |
| ferencd@0 | 38 -> decltype(lhs.value = lhs.f(std::declval<T1>(), std::declval<T2>())) |
| ferencd@0 | 39 { |
| ferencd@0 | 40 return lhs.value = lhs.f(lhs.value, rhs); |
| ferencd@0 | 41 } |
| ferencd@0 | 42 |
| ferencd@0 | 43 template <typename F> |
| ferencd@0 | 44 inline |
| ferencd@0 | 45 #ifndef _MSC_VER |
| ferencd@0 | 46 constexpr |
| ferencd@0 | 47 #endif |
| ferencd@0 | 48 named_operator_wrapper<F> make_named_operator(F f) { |
| ferencd@0 | 49 return {f}; |
| ferencd@0 | 50 } |
| ferencd@0 | 51 |
| ferencd@0 | 52 } // namespace base |
| ferencd@0 | 53 |
| ferencd@0 | 54 #endif // ndef BASE_NAMED_OPERATOR_HPP |
