209 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			209 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | //---------------------------------------------------------------------------// | ||
|  | // Copyright (c) 2013 Kyle Lutz <kyle.r.lutz@gmail.com> | ||
|  | // | ||
|  | // 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 | ||
|  | // | ||
|  | // See http://boostorg.github.com/compute for more information. | ||
|  | //---------------------------------------------------------------------------// | ||
|  | 
 | ||
|  | #ifndef BOOST_COMPUTE_FUNCTIONAL_LOGICAL_HPP | ||
|  | #define BOOST_COMPUTE_FUNCTIONAL_LOGICAL_HPP | ||
|  | 
 | ||
|  | namespace boost { | ||
|  | namespace compute { | ||
|  | namespace detail { | ||
|  | 
 | ||
|  | template<class Predicate, class Expr> | ||
|  | class invoked_unary_negate_function | ||
|  | { | ||
|  | public: | ||
|  |     typedef int result_type; | ||
|  | 
 | ||
|  |     invoked_unary_negate_function(const Predicate &pred, | ||
|  |                                   const Expr &expr) | ||
|  |         : m_pred(pred), | ||
|  |           m_expr(expr) | ||
|  |     { | ||
|  |     } | ||
|  | 
 | ||
|  |     Predicate pred() const | ||
|  |     { | ||
|  |         return m_pred; | ||
|  |     } | ||
|  | 
 | ||
|  |     Expr expr() const | ||
|  |     { | ||
|  |         return m_expr; | ||
|  |     } | ||
|  | 
 | ||
|  | private: | ||
|  |     Predicate m_pred; | ||
|  |     Expr m_expr; | ||
|  | }; | ||
|  | 
 | ||
|  | template<class Predicate, class Expr1, class Expr2> | ||
|  | class invoked_binary_negate_function | ||
|  | { | ||
|  | public: | ||
|  |     typedef int result_type; | ||
|  | 
 | ||
|  |     invoked_binary_negate_function(const Predicate &pred, | ||
|  |                                    const Expr1 &expr1, | ||
|  |                                    const Expr2 &expr2) | ||
|  |         : m_pred(pred), | ||
|  |           m_expr1(expr1), | ||
|  |           m_expr2(expr2) | ||
|  |     { | ||
|  |     } | ||
|  | 
 | ||
|  |     Predicate pred() const | ||
|  |     { | ||
|  |         return m_pred; | ||
|  |     } | ||
|  | 
 | ||
|  |     Expr1 expr1() const | ||
|  |     { | ||
|  |         return m_expr1; | ||
|  |     } | ||
|  | 
 | ||
|  |     Expr2 expr2() const | ||
|  |     { | ||
|  |         return m_expr2; | ||
|  |     } | ||
|  | 
 | ||
|  | private: | ||
|  |     Predicate m_pred; | ||
|  |     Expr1 m_expr1; | ||
|  |     Expr2 m_expr2; | ||
|  | }; | ||
|  | 
 | ||
|  | } // end detail namespace | ||
|  | 
 | ||
|  | /// \internal_ | ||
|  | template<class Arg, class Result> | ||
|  | struct unary_function | ||
|  | { | ||
|  |     typedef Arg argument_type; | ||
|  |     typedef Result result_type; | ||
|  | }; | ||
|  | 
 | ||
|  | /// \internal_ | ||
|  | template<class Arg1, class Arg2, class Result> | ||
|  | struct binary_function | ||
|  | { | ||
|  |     typedef Arg1 first_argument_type; | ||
|  |     typedef Arg2 second_argument_type; | ||
|  |     typedef Result result_type; | ||
|  | }; | ||
|  | 
 | ||
|  | /// \internal_ | ||
|  | template<class Arg1, class Arg2, class Arg3, class Result> | ||
|  | struct ternary_function | ||
|  | { | ||
|  |     typedef Arg1 first_argument_type; | ||
|  |     typedef Arg2 second_argument_type; | ||
|  |     typedef Arg3 third_argument_type; | ||
|  |     typedef Result result_type; | ||
|  | }; | ||
|  | 
 | ||
|  | /// The unary_negate function adaptor negates a unary function. | ||
|  | /// | ||
|  | /// \see not1() | ||
|  | template<class Predicate> | ||
|  | class unary_negate : public unary_function<void, int> | ||
|  | { | ||
|  | public: | ||
|  |     explicit unary_negate(Predicate pred) | ||
|  |         : m_pred(pred) | ||
|  |     { | ||
|  |     } | ||
|  | 
 | ||
|  |     /// \internal_ | ||
|  |     template<class Arg> | ||
|  |     detail::invoked_unary_negate_function<Predicate, Arg> | ||
|  |     operator()(const Arg &arg) const | ||
|  |     { | ||
|  |         return detail::invoked_unary_negate_function< | ||
|  |                    Predicate, | ||
|  |                    Arg | ||
|  |                 >(m_pred, arg); | ||
|  |     } | ||
|  | 
 | ||
|  | private: | ||
|  |     Predicate m_pred; | ||
|  | }; | ||
|  | 
 | ||
|  | /// The binnary_negate function adaptor negates a binary function. | ||
|  | /// | ||
|  | /// \see not2() | ||
|  | template<class Predicate> | ||
|  | class binary_negate : public binary_function<void, void, int> | ||
|  | { | ||
|  | public: | ||
|  |     explicit binary_negate(Predicate pred) | ||
|  |         : m_pred(pred) | ||
|  |     { | ||
|  |     } | ||
|  | 
 | ||
|  |     /// \internal_ | ||
|  |     template<class Arg1, class Arg2> | ||
|  |     detail::invoked_binary_negate_function<Predicate, Arg1, Arg2> | ||
|  |     operator()(const Arg1 &arg1, const Arg2 &arg2) const | ||
|  |     { | ||
|  |         return detail::invoked_binary_negate_function< | ||
|  |                    Predicate, | ||
|  |                    Arg1, | ||
|  |                    Arg2 | ||
|  |                 >(m_pred, arg1, arg2); | ||
|  |     } | ||
|  | 
 | ||
|  | private: | ||
|  |     Predicate m_pred; | ||
|  | }; | ||
|  | 
 | ||
|  | /// Returns a unary_negate adaptor around \p predicate. | ||
|  | /// | ||
|  | /// \param predicate the unary function to wrap | ||
|  | /// | ||
|  | /// \return a unary_negate wrapper around \p predicate | ||
|  | template<class Predicate> | ||
|  | inline unary_negate<Predicate> not1(const Predicate &predicate) | ||
|  | { | ||
|  |     return unary_negate<Predicate>(predicate); | ||
|  | } | ||
|  | 
 | ||
|  | /// Returns a binary_negate adaptor around \p predicate. | ||
|  | /// | ||
|  | /// \param predicate the binary function to wrap | ||
|  | /// | ||
|  | /// \return a binary_negate wrapper around \p predicate | ||
|  | template<class Predicate> | ||
|  | inline binary_negate<Predicate> not2(const Predicate &predicate) | ||
|  | { | ||
|  |     return binary_negate<Predicate>(predicate); | ||
|  | } | ||
|  | 
 | ||
|  | /// The logical_not function negates its argument and returns it. | ||
|  | /// | ||
|  | /// \see not1(), not2() | ||
|  | template<class T> | ||
|  | struct logical_not : public unary_function<T, int> | ||
|  | { | ||
|  |     /// \internal_ | ||
|  |     template<class Expr> | ||
|  |     detail::invoked_function<int, boost::tuple<Expr> > | ||
|  |     operator()(const Expr &expr) const | ||
|  |     { | ||
|  |         return detail::invoked_function<int, boost::tuple<Expr> >( | ||
|  |             "!", std::string(), boost::make_tuple(expr) | ||
|  |         ); | ||
|  |     } | ||
|  | }; | ||
|  | 
 | ||
|  | } // end compute namespace | ||
|  | } // end boost namespace | ||
|  | 
 | ||
|  | #endif // BOOST_COMPUTE_FUNCTIONAL_LOGICAL_HPP |