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
 |