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