/*============================================================================= Copyright (c) 2011-2019 Bolero MURAKAMI https://github.com/bolero-MURAKAMI/Sprout Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) =============================================================================*/ #ifndef SPROUT_FUNCTIONAL_NOT1_HPP #define SPROUT_FUNCTIONAL_NOT1_HPP #include #include #include #include #include namespace sprout { namespace detail { template::value> class unary_negate_impl; template class unary_negate_impl { public: typedef typename Predicate::argument_type argument_type; typedef bool result_type; protected: Predicate fn; public: explicit SPROUT_CONSTEXPR unary_negate_impl(Predicate const& pred) : fn(pred) {} SPROUT_CONSTEXPR bool operator()(typename Predicate::argument_type const& x) const { return !fn(x); } }; template class unary_negate_impl { protected: Predicate fn; public: explicit SPROUT_CONSTEXPR unary_negate_impl(Predicate const& pred) : fn(pred) {} template SPROUT_CONSTEXPR decltype(!std::declval()(std::declval())) operator()(T&& x) const { return !fn(SPROUT_FORWARD(T, x)); } }; } // namespace detail // 20.8.8 negators template class unary_negate : public sprout::detail::unary_negate_impl { public: explicit SPROUT_CONSTEXPR unary_negate(Predicate const& pred) : sprout::detail::unary_negate_impl(pred) {} }; template inline SPROUT_CONSTEXPR sprout::unary_negate not1(Predicate const& pred) { return sprout::unary_negate(pred); } } // namespace sprout #endif // #ifndef SPROUT_FUNCTIONAL_NOT1_HPP