summaryrefslogtreecommitdiff
path: root/boost/compute/functional/operator.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/compute/functional/operator.hpp')
-rw-r--r--boost/compute/functional/operator.hpp100
1 files changed, 100 insertions, 0 deletions
diff --git a/boost/compute/functional/operator.hpp b/boost/compute/functional/operator.hpp
new file mode 100644
index 0000000000..908372a326
--- /dev/null
+++ b/boost/compute/functional/operator.hpp
@@ -0,0 +1,100 @@
+//---------------------------------------------------------------------------//
+// 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_OPERATORS_HPP
+#define BOOST_COMPUTE_FUNCTIONAL_OPERATORS_HPP
+
+#include <string>
+
+namespace boost {
+namespace compute {
+namespace detail {
+
+template<class Expr1, class Expr2, class Result>
+struct invoked_binary_operator
+{
+ typedef Result result_type;
+
+ invoked_binary_operator(const std::string &op,
+ const Expr1 &arg1,
+ const Expr2 &arg2)
+ : m_op(op),
+ m_expr1(arg1),
+ m_expr2(arg2)
+ {
+ }
+
+ std::string op() const
+ {
+ return m_op;
+ }
+
+ Expr1 arg1() const
+ {
+ return m_expr1;
+ }
+
+ Expr2 arg2() const
+ {
+ return m_expr2;
+ }
+
+ std::string m_op;
+ Expr1 m_expr1;
+ Expr2 m_expr2;
+};
+
+} // end detail namespace
+
+/// \internal_
+#define BOOST_COMPUTE_DECLARE_BINARY_OPERATOR(name, op, return_type, arg_type) \
+ template<class arg_type> \
+ class name : public function<return_type (arg_type, arg_type)> \
+ { \
+ public: \
+ name() : function<return_type (arg_type, arg_type)>(BOOST_PP_STRINGIZE(name)) { } \
+ \
+ template<class Arg1, class Arg2> \
+ detail::invoked_binary_operator<Arg1, Arg2, T> \
+ operator()(const Arg1 &x, const Arg2 &y) const \
+ { \
+ return detail::invoked_binary_operator<Arg1, Arg2, T>(op, x, y); \
+ } \
+ };
+
+// arithmetic operations
+BOOST_COMPUTE_DECLARE_BINARY_OPERATOR(plus, "+", T, T)
+BOOST_COMPUTE_DECLARE_BINARY_OPERATOR(minus, "-", T, T)
+BOOST_COMPUTE_DECLARE_BINARY_OPERATOR(multiplies, "*", T, T)
+BOOST_COMPUTE_DECLARE_BINARY_OPERATOR(divides, "/", T, T)
+BOOST_COMPUTE_DECLARE_BINARY_OPERATOR(modulus, "%", T, T)
+
+// comparisons
+BOOST_COMPUTE_DECLARE_BINARY_OPERATOR(equal_to, "==", T, T)
+BOOST_COMPUTE_DECLARE_BINARY_OPERATOR(not_equal_to, "!=", T, T)
+BOOST_COMPUTE_DECLARE_BINARY_OPERATOR(greater, ">", T, T)
+BOOST_COMPUTE_DECLARE_BINARY_OPERATOR(less, "<", T, T)
+BOOST_COMPUTE_DECLARE_BINARY_OPERATOR(greater_equal, ">=", T, T)
+BOOST_COMPUTE_DECLARE_BINARY_OPERATOR(less_equal, "<=", T, T)
+
+// logical operators
+BOOST_COMPUTE_DECLARE_BINARY_OPERATOR(logical_and, "&&", T, T)
+BOOST_COMPUTE_DECLARE_BINARY_OPERATOR(logical_or, "||", T, T)
+
+// bitwise operations
+BOOST_COMPUTE_DECLARE_BINARY_OPERATOR(bit_and, "&", T, T)
+BOOST_COMPUTE_DECLARE_BINARY_OPERATOR(bit_or, "|", T, T)
+BOOST_COMPUTE_DECLARE_BINARY_OPERATOR(bit_xor, "^", T, T)
+BOOST_COMPUTE_DECLARE_BINARY_OPERATOR(shift_left, "<<", T, T)
+BOOST_COMPUTE_DECLARE_BINARY_OPERATOR(shift_right, ">>", T, T)
+
+} // end compute namespace
+} // end boost namespace
+#endif // BOOST_COMPUTE_FUNCTIONAL_OPERATORS_HPP