ferencd@0: #ifndef BASE_NAMED_OPERATOR_HPP ferencd@0: #define BASE_NAMED_OPERATOR_HPP ferencd@0: ferencd@0: #include ferencd@0: ferencd@0: namespace base { ferencd@0: ferencd@0: template ferencd@0: struct named_operator_wrapper { ferencd@0: F f; ferencd@0: }; ferencd@0: ferencd@0: template ferencd@0: struct named_operator_lhs { ferencd@0: F f; ferencd@0: T& value; ferencd@0: }; ferencd@0: ferencd@0: template ferencd@0: inline named_operator_lhs operator <(T& lhs, named_operator_wrapper rhs) { ferencd@0: return {rhs.f, lhs}; ferencd@0: } ferencd@0: ferencd@0: template ferencd@0: inline named_operator_lhs operator <(T const& lhs, named_operator_wrapper rhs) { ferencd@0: return {rhs.f, lhs}; ferencd@0: } ferencd@0: ferencd@0: template ferencd@0: inline auto operator >(named_operator_lhs const& lhs, T2 const& rhs) ferencd@0: -> decltype(lhs.f(std::declval(), std::declval())) ferencd@0: { ferencd@0: return lhs.f(lhs.value, rhs); ferencd@0: } ferencd@0: ferencd@0: template ferencd@0: inline auto operator >=(named_operator_lhs const& lhs, T2 const& rhs) ferencd@0: -> decltype(lhs.value = lhs.f(std::declval(), std::declval())) ferencd@0: { ferencd@0: return lhs.value = lhs.f(lhs.value, rhs); ferencd@0: } ferencd@0: ferencd@0: template ferencd@0: inline ferencd@0: #ifndef _MSC_VER ferencd@0: constexpr ferencd@0: #endif ferencd@0: named_operator_wrapper make_named_operator(F f) { ferencd@0: return {f}; ferencd@0: } ferencd@0: ferencd@0: } // namespace base ferencd@0: ferencd@0: #endif // ndef BASE_NAMED_OPERATOR_HPP