Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/generic/include/boost/spirit/home/classic/phoenix/operators.hpp @ 16:2665513ce2d3
Add boost headers
author | Chris Cannam |
---|---|
date | Tue, 05 Aug 2014 11:11:38 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DEPENDENCIES/generic/include/boost/spirit/home/classic/phoenix/operators.hpp Tue Aug 05 11:11:38 2014 +0100 @@ -0,0 +1,2203 @@ +/*============================================================================= + Phoenix V1.2.1 + Copyright (c) 2001-2002 Joel de Guzman + + 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 PHOENIX_OPERATORS_HPP +#define PHOENIX_OPERATORS_HPP + +/////////////////////////////////////////////////////////////////////////////// +#if !defined(BOOST_NO_CWCTYPE) + #include <cwctype> +#endif + +#if defined(__BORLANDC__) || (defined(__ICL) && __ICL >= 700) +#define CREF const& +#else +#define CREF +#endif + +#include <climits> +#include <boost/spirit/home/classic/phoenix/actor.hpp> +#include <boost/spirit/home/classic/phoenix/composite.hpp> +#include <boost/config.hpp> +#include <boost/mpl/if.hpp> + +/////////////////////////////////////////////////////////////////////////////// +namespace phoenix { + +/////////////////////////////////////////////////////////////////////////////// +// +// Operators +// +// Lazy operators +// +// This class provides a mechanism for lazily evaluating operators. +// Syntactically, a lazy operator looks like an ordinary C/C++ +// infix, prefix or postfix operator. The operator application +// looks the same. However, unlike ordinary operators, the actual +// operator execution is deferred. (see actor.hpp, primitives.hpp +// and composite.hpp for an overview). Samples: +// +// arg1 + arg2 +// 1 + arg1 * arg2 +// 1 / -arg1 +// arg1 < 150 +// +// T1 set of classes implement all the C++ free operators. Like +// lazy functions (see functions.hpp), lazy operators are not +// immediately executed when invoked. Instead, a composite (see +// composite.hpp) object is created and returned to the caller. +// Example: +// +// (arg1 + arg2) * arg3 +// +// does nothing more than return a composite. T1 second function +// call will evaluate the actual operators. Example: +// +// int i = 4, j = 5, k = 6; +// cout << ((arg1 + arg2) * arg3)(i, j, k); +// +// will print out "54". +// +// Arbitrarily complex expressions can be lazily evaluated +// following three simple rules: +// +// 1) Lazy evaluated binary operators apply when at least one +// of the operands is an actor object (see actor.hpp and +// primitives.hpp). Consequently, if an operand is not an actor +// object, it is implicitly converted to an object of type +// actor<value<T> > (where T is the original type of the +// operand). +// +// 2) Lazy evaluated unary operators apply only to operands +// which are actor objects. +// +// 3) The result of a lazy operator is a composite actor object +// that can in turn apply to rule 1. +// +// Example: +// +// arg1 + 3 +// +// is a lazy expression involving the operator+. Following rule 1, +// lazy evaluation is triggered since arg1 is an instance of an +// actor<argument<N> > class (see primitives.hpp). The right +// operand <3> is implicitly converted to an actor<value<int> >. +// The result of this binary + expression is a composite object, +// following rule 3. +// +// Take note that although at least one of the operands must be a +// valid actor class in order for lazy evaluation to take effect, +// if this is not the case and we still want to lazily evaluate an +// expression, we can use var(x), val(x) or cref(x) to transform +// the operand into a valid action object (see primitives.hpp). +// Example: +// +// val(1) << 3; +// +// Supported operators: +// +// Unary operators: +// +// prefix: ~, !, -, +, ++, --, & (reference), * (dereference) +// postfix: ++, -- +// +// Binary operators: +// +// =, [], +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>= +// +, -, *, /, %, &, |, ^, <<, >> +// ==, !=, <, >, <=, >= +// &&, || +// +// Each operator has a special tag type associated with it. For +// example the binary + operator has a plus_op tag type associated +// with it. This is used to specialize either the unary_operator or +// binary_operator template classes (see unary_operator and +// binary_operator below). Specializations of these unary_operator +// and binary_operator are the actual workhorses that implement the +// operations. The behavior of each lazy operator depends on these +// unary_operator and binary_operator specializations. 'preset' +// specializations conform to the canonical operator rules modeled +// by the behavior of integers and pointers: +// +// Prefix -, + and ~ accept constant arguments and return an +// object by value. +// +// The ! accept constant arguments and returns a boolean +// result. +// +// The & (address-of), * (dereference) both return a reference +// to an object. +// +// Prefix ++ returns a reference to its mutable argument after +// it is incremented. +// +// Postfix ++ returns the mutable argument by value before it +// is incremented. +// +// The += and its family accept mutable right hand side (rhs) +// operand and return a reference to the rhs operand. +// +// Infix + and its family accept constant arguments and return +// an object by value. +// +// The == and its family accept constant arguments and return a +// boolean result. +// +// Operators && and || accept constant arguments and return a +// boolean result and are short circuit evaluated as expected. +// +/////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////// +// +// Operator tags +// +// Each C++ operator has a corresponding tag type. This is +// used as a means for specializing the unary_operator and +// binary_operator (see below). The tag also serves as the +// lazy operator type compatible as a composite operation +// see (composite.hpp). +// +/////////////////////////////////////////////////////////////////////////////// + +// Unary operator tags + +struct negative_op; struct positive_op; +struct logical_not_op; struct invert_op; +struct reference_op; struct dereference_op; +struct pre_incr_op; struct pre_decr_op; +struct post_incr_op; struct post_decr_op; + +// Binary operator tags + +struct assign_op; struct index_op; +struct plus_assign_op; struct minus_assign_op; +struct times_assign_op; struct divide_assign_op; struct mod_assign_op; +struct and_assign_op; struct or_assign_op; struct xor_assign_op; +struct shift_l_assign_op; struct shift_r_assign_op; + +struct plus_op; struct minus_op; +struct times_op; struct divide_op; struct mod_op; +struct and_op; struct or_op; struct xor_op; +struct shift_l_op; struct shift_r_op; + +struct eq_op; struct not_eq_op; +struct lt_op; struct lt_eq_op; +struct gt_op; struct gt_eq_op; +struct logical_and_op; struct logical_or_op; + +/////////////////////////////////////////////////////////////////////////////// +// +// unary_operator<TagT, T> +// +// The unary_operator class implements most of the C++ unary +// operators. Each specialization is basically a simple static eval +// function plus a result_type typedef that determines the return +// type of the eval function. +// +// TagT is one of the unary operator tags above and T is the data +// type (argument) involved in the operation. +// +// Only the behavior of C/C++ built-in types are taken into account +// in the specializations provided below. For user-defined types, +// these specializations may still be used provided that the +// operator overloads of such types adhere to the standard behavior +// of built-in types. +// +// T1 separate special_ops.hpp file implements more stl savvy +// specializations. Other more specialized unary_operator +// implementations may be defined by the client for specific +// unary operator tags/data types. +// +/////////////////////////////////////////////////////////////////////////////// +template <typename TagT, typename T> +struct unary_operator; + +////////////////////////////////// +template <typename T> +struct unary_operator<negative_op, T> { + + typedef T const result_type; + static result_type eval(T const& v) + { return -v; } +}; + +////////////////////////////////// +template <typename T> +struct unary_operator<positive_op, T> { + + typedef T const result_type; + static result_type eval(T const& v) + { return +v; } +}; + +////////////////////////////////// +template <typename T> +struct unary_operator<logical_not_op, T> { + + typedef T const result_type; + static result_type eval(T const& v) + { return !v; } +}; + +////////////////////////////////// +template <typename T> +struct unary_operator<invert_op, T> { + + typedef T const result_type; + static result_type eval(T const& v) + { return ~v; } +}; + +////////////////////////////////// +template <typename T> +struct unary_operator<reference_op, T> { + + typedef T* result_type; + static result_type eval(T& v) + { return &v; } +}; + +////////////////////////////////// +template <typename T> +struct unary_operator<dereference_op, T*> { + + typedef T& result_type; + static result_type eval(T* v) + { return *v; } +}; + +////////////////////////////////// +template <typename T> +struct unary_operator<dereference_op, T* const> { + + typedef T& result_type; + static result_type eval(T* const v) + { return *v; } +}; + +////////////////////////////////// +template <> +struct unary_operator<dereference_op, nil_t> { + + // G++ eager template instantiation + // somehow requires this. + typedef nil_t result_type; +}; + +////////////////////////////////// +#ifndef __BORLANDC__ +template <> +struct unary_operator<dereference_op, nil_t const> { + + // G++ eager template instantiation + // somehow requires this. + typedef nil_t result_type; +}; +#endif + +////////////////////////////////// +template <typename T> +struct unary_operator<pre_incr_op, T> { + + typedef T& result_type; + static result_type eval(T& v) + { return ++v; } +}; + +////////////////////////////////// +template <typename T> +struct unary_operator<pre_decr_op, T> { + + typedef T& result_type; + static result_type eval(T& v) + { return --v; } +}; + +////////////////////////////////// +template <typename T> +struct unary_operator<post_incr_op, T> { + + typedef T const result_type; + static result_type eval(T& v) + { T t(v); ++v; return t; } +}; + +////////////////////////////////// +template <typename T> +struct unary_operator<post_decr_op, T> { + + typedef T const result_type; + static result_type eval(T& v) + { T t(v); --v; return t; } +}; + +/////////////////////////////////////////////////////////////////////////////// +// +// rank<T> +// +// rank<T> class has a static int constant 'value' that defines the +// absolute rank of a type. rank<T> is used to choose the result +// type of binary operators such as +. The type with the higher +// rank wins and is used as the operator's return type. T1 generic +// user defined type has a very high rank and always wins when +// compared against a user defined type. If this is not desireable, +// one can write a rank specialization for the type. +// +// Take note that ranks 0..9999 are reserved for the framework. +// +/////////////////////////////////////////////////////////////////////////////// +template <typename T> +struct rank { static int const value = INT_MAX; }; + +template <> struct rank<void> { static int const value = 0; }; +template <> struct rank<bool> { static int const value = 10; }; + +template <> struct rank<char> { static int const value = 20; }; +template <> struct rank<signed char> { static int const value = 20; }; +template <> struct rank<unsigned char> { static int const value = 30; }; +#if !defined(BOOST_NO_INTRINSIC_WCHAR_T) +template <> struct rank<wchar_t> { static int const value = 40; }; +#endif // !defined(BOOST_NO_INTRINSIC_WCHAR_T) + +template <> struct rank<short> { static int const value = 50; }; +template <> struct rank<unsigned short> { static int const value = 60; }; + +template <> struct rank<int> { static int const value = 70; }; +template <> struct rank<unsigned int> { static int const value = 80; }; + +template <> struct rank<long> { static int const value = 90; }; +template <> struct rank<unsigned long> { static int const value = 100; }; + +#ifdef BOOST_HAS_LONG_LONG +template <> struct rank< ::boost::long_long_type> { static int const value = 110; }; +template <> struct rank< ::boost::ulong_long_type> { static int const value = 120; }; +#endif + +template <> struct rank<float> { static int const value = 130; }; +template <> struct rank<double> { static int const value = 140; }; +template <> struct rank<long double> { static int const value = 150; }; + +template <typename T> struct rank<T*> +{ static int const value = 160; }; + +template <typename T> struct rank<T* const> +{ static int const value = 160; }; + +template <typename T, int N> struct rank<T[N]> +{ static int const value = 160; }; + +/////////////////////////////////////////////////////////////////////////////// +// +// higher_rank<T0, T1> +// +// Chooses the type (T0 or T1) with the higher rank. +// +/////////////////////////////////////////////////////////////////////////////// +template <typename T0, typename T1> +struct higher_rank { + typedef typename boost::mpl::if_c< + rank<T0>::value < rank<T1>::value, + T1, T0>::type type; +}; + +/////////////////////////////////////////////////////////////////////////////// +// +// binary_operator<TagT, T0, T1> +// +// The binary_operator class implements most of the C++ binary +// operators. Each specialization is basically a simple static eval +// function plus a result_type typedef that determines the return +// type of the eval function. +// +// TagT is one of the binary operator tags above T0 and T1 are the +// (arguments') data types involved in the operation. +// +// Only the behavior of C/C++ built-in types are taken into account +// in the specializations provided below. For user-defined types, +// these specializations may still be used provided that the +// operator overloads of such types adhere to the standard behavior +// of built-in types. +// +// T1 separate special_ops.hpp file implements more stl savvy +// specializations. Other more specialized unary_operator +// implementations may be defined by the client for specific +// unary operator tags/data types. +// +// All binary_operator except the logical_and_op and logical_or_op +// have an eval static function that carries out the actual operation. +// The logical_and_op and logical_or_op d are special because these +// two operators are short-circuit evaluated. +// +/////////////////////////////////////////////////////////////////////////////// +template <typename TagT, typename T0, typename T1> +struct binary_operator; + +////////////////////////////////// +template <typename T0, typename T1> +struct binary_operator<assign_op, T0, T1> { + + typedef T0& result_type; + static result_type eval(T0& lhs, T1 const& rhs) + { return lhs = rhs; } +}; + +////////////////////////////////// +template <typename T1> +struct binary_operator<index_op, nil_t, T1> { + + // G++ eager template instantiation + // somehow requires this. + typedef nil_t result_type; +}; + +////////////////////////////////// +template <typename T0, typename T1> +struct binary_operator<index_op, T0*, T1> { + + typedef T0& result_type; + static result_type eval(T0* ptr, T1 const& index) + { return ptr[index]; } +}; + +////////////////////////////////// +template <typename T0, typename T1> +struct binary_operator<index_op, T0* const, T1> { + + typedef T0& result_type; + static result_type eval(T0* const ptr, T1 const& index) + { return ptr[index]; } +}; + +////////////////////////////////// +template <typename T0, int N, typename T1> +struct binary_operator<index_op, T0[N], T1> { + + typedef T0& result_type; + static result_type eval(T0* ptr, T1 const& index) + { return ptr[index]; } +}; + +////////////////////////////////// +template <typename T0, typename T1> +struct binary_operator<plus_assign_op, T0, T1> { + + typedef T0& result_type; + static result_type eval(T0& lhs, T1 const& rhs) + { return lhs += rhs; } +}; + +////////////////////////////////// +template <typename T0, typename T1> +struct binary_operator<minus_assign_op, T0, T1> { + + typedef T0& result_type; + static result_type eval(T0& lhs, T1 const& rhs) + { return lhs -= rhs; } +}; + +////////////////////////////////// +template <typename T0, typename T1> +struct binary_operator<times_assign_op, T0, T1> { + + typedef T0& result_type; + static result_type eval(T0& lhs, T1 const& rhs) + { return lhs *= rhs; } +}; + +////////////////////////////////// +template <typename T0, typename T1> +struct binary_operator<divide_assign_op, T0, T1> { + + typedef T0& result_type; + static result_type eval(T0& lhs, T1 const& rhs) + { return lhs /= rhs; } +}; + +////////////////////////////////// +template <typename T0, typename T1> +struct binary_operator<mod_assign_op, T0, T1> { + + typedef T0& result_type; + static result_type eval(T0& lhs, T1 const& rhs) + { return lhs %= rhs; } +}; + +////////////////////////////////// +template <typename T0, typename T1> +struct binary_operator<and_assign_op, T0, T1> { + + typedef T0& result_type; + static result_type eval(T0& lhs, T1 const& rhs) + { return lhs &= rhs; } +}; + +////////////////////////////////// +template <typename T0, typename T1> +struct binary_operator<or_assign_op, T0, T1> { + + typedef T0& result_type; + static result_type eval(T0& lhs, T1 const& rhs) + { return lhs |= rhs; } +}; + +////////////////////////////////// +template <typename T0, typename T1> +struct binary_operator<xor_assign_op, T0, T1> { + + typedef T0& result_type; + static result_type eval(T0& lhs, T1 const& rhs) + { return lhs ^= rhs; } +}; + +////////////////////////////////// +template <typename T0, typename T1> +struct binary_operator<shift_l_assign_op, T0, T1> { + + typedef T0& result_type; + static result_type eval(T0& lhs, T1 const& rhs) + { return lhs <<= rhs; } +}; + +////////////////////////////////// +template <typename T0, typename T1> +struct binary_operator<shift_r_assign_op, T0, T1> { + + typedef T0& result_type; + static result_type eval(T0& lhs, T1 const& rhs) + { return lhs >>= rhs; } +}; + +////////////////////////////////// +template <typename T0, typename T1> +struct binary_operator<plus_op, T0, T1> { + + typedef typename higher_rank<T0, T1>::type const result_type; + static result_type eval(T0 const& lhs, T1 const& rhs) + { return lhs + rhs; } +}; + +////////////////////////////////// +template <typename T0, typename T1> +struct binary_operator<minus_op, T0, T1> { + + typedef typename higher_rank<T0, T1>::type const result_type; + static result_type eval(T0 const& lhs, T1 const& rhs) + { return lhs - rhs; } +}; + +////////////////////////////////// +template <typename T0, typename T1> +struct binary_operator<times_op, T0, T1> { + + typedef typename higher_rank<T0, T1>::type const result_type; + static result_type eval(T0 const& lhs, T1 const& rhs) + { return lhs * rhs; } +}; + +////////////////////////////////// +template <typename T0, typename T1> +struct binary_operator<divide_op, T0, T1> { + + typedef typename higher_rank<T0, T1>::type const result_type; + static result_type eval(T0 const& lhs, T1 const& rhs) + { return lhs / rhs; } +}; + +////////////////////////////////// +template <typename T0, typename T1> +struct binary_operator<mod_op, T0, T1> { + + typedef typename higher_rank<T0, T1>::type const result_type; + static result_type eval(T0 const& lhs, T1 const& rhs) + { return lhs % rhs; } +}; + +////////////////////////////////// +template <typename T0, typename T1> +struct binary_operator<and_op, T0, T1> { + + typedef typename higher_rank<T0, T1>::type const result_type; + static result_type eval(T0 const& lhs, T1 const& rhs) + { return lhs & rhs; } +}; + +////////////////////////////////// +template <typename T0, typename T1> +struct binary_operator<or_op, T0, T1> { + + typedef typename higher_rank<T0, T1>::type const result_type; + static result_type eval(T0 const& lhs, T1 const& rhs) + { return lhs | rhs; } +}; + +////////////////////////////////// +template <typename T0, typename T1> +struct binary_operator<xor_op, T0, T1> { + + typedef typename higher_rank<T0, T1>::type const result_type; + static result_type eval(T0 const& lhs, T1 const& rhs) + { return lhs ^ rhs; } +}; + +////////////////////////////////// +template <typename T0, typename T1> +struct binary_operator<shift_l_op, T0, T1> { + + typedef T0 const result_type; + static result_type eval(T0 const& lhs, T1 const& rhs) + { return lhs << rhs; } +}; + +////////////////////////////////// +template <typename T0, typename T1> +struct binary_operator<shift_r_op, T0, T1> { + + typedef T0 const result_type; + static result_type eval(T0 const& lhs, T1 const& rhs) + { return lhs >> rhs; } +}; + +////////////////////////////////// +template <typename T0, typename T1> +struct binary_operator<eq_op, T0, T1> { + + typedef bool result_type; + static result_type eval(T0 const& lhs, T1 const& rhs) + { return lhs == rhs; } +}; + +////////////////////////////////// +template <typename T0, typename T1> +struct binary_operator<not_eq_op, T0, T1> { + + typedef bool result_type; + static result_type eval(T0 const& lhs, T1 const& rhs) + { return lhs != rhs; } +}; + +////////////////////////////////// +template <typename T0, typename T1> +struct binary_operator<lt_op, T0, T1> { + + typedef bool result_type; + static result_type eval(T0 const& lhs, T1 const& rhs) + { return lhs < rhs; } +}; + +////////////////////////////////// +template <typename T0, typename T1> +struct binary_operator<lt_eq_op, T0, T1> { + + typedef bool result_type; + static result_type eval(T0 const& lhs, T1 const& rhs) + { return lhs <= rhs; } +}; + +////////////////////////////////// +template <typename T0, typename T1> +struct binary_operator<gt_op, T0, T1> { + + typedef bool result_type; + static result_type eval(T0 const& lhs, T1 const& rhs) + { return lhs > rhs; } +}; + +////////////////////////////////// +template <typename T0, typename T1> +struct binary_operator<gt_eq_op, T0, T1> { + + typedef bool result_type; + static result_type eval(T0 const& lhs, T1 const& rhs) + { return lhs >= rhs; } +}; + +////////////////////////////////// +template <typename T0, typename T1> +struct binary_operator<logical_and_op, T0, T1> { + + typedef bool result_type; + // no eval function, see comment above. +}; + +////////////////////////////////// +template <typename T0, typename T1> +struct binary_operator<logical_or_op, T0, T1> { + + typedef bool result_type; + // no eval function, see comment above. +}; + +/////////////////////////////////////////////////////////////////////////////// +// +// negative lazy operator (prefix -) +// +/////////////////////////////////////////////////////////////////////////////// +struct negative_op { + + template <typename T0> + struct result { + + typedef typename unary_operator<negative_op, T0>::result_type type; + }; + + template <typename T0> + typename unary_operator<negative_op, T0>::result_type + operator()(T0& _0) const + { return unary_operator<negative_op, T0>::eval(_0); } +}; + +////////////////////////////////// +template <typename BaseT> +inline typename impl::make_unary<negative_op, BaseT>::type +operator-(actor<BaseT> const& _0) +{ + return impl::make_unary<negative_op, BaseT>::construct(_0); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// positive lazy operator (prefix +) +// +/////////////////////////////////////////////////////////////////////////////// +struct positive_op { + + template <typename T0> + struct result { + + typedef typename unary_operator<positive_op, T0>::result_type type; + }; + + template <typename T0> + typename unary_operator<positive_op, T0>::result_type + operator()(T0& _0) const + { return unary_operator<positive_op, T0>::eval(_0); } +}; + +////////////////////////////////// +template <typename BaseT> +inline typename impl::make_unary<positive_op, BaseT>::type +operator+(actor<BaseT> const& _0) +{ + return impl::make_unary<positive_op, BaseT>::construct(_0); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// logical not lazy operator (prefix !) +// +/////////////////////////////////////////////////////////////////////////////// +struct logical_not_op { + + template <typename T0> + struct result { + + typedef typename unary_operator<logical_not_op, T0>::result_type type; + }; + + template <typename T0> + typename unary_operator<logical_not_op, T0>::result_type + operator()(T0& _0) const + { return unary_operator<logical_not_op, T0>::eval(_0); } +}; + +////////////////////////////////// +template <typename BaseT> +inline typename impl::make_unary<logical_not_op, BaseT>::type +operator!(actor<BaseT> const& _0) +{ + return impl::make_unary<logical_not_op, BaseT>::construct(_0); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// invert lazy operator (prefix ~) +// +/////////////////////////////////////////////////////////////////////////////// +struct invert_op { + + template <typename T0> + struct result { + + typedef typename unary_operator<invert_op, T0>::result_type type; + }; + + template <typename T0> + typename unary_operator<invert_op, T0>::result_type + operator()(T0& _0) const + { return unary_operator<invert_op, T0>::eval(_0); } +}; + +////////////////////////////////// +template <typename BaseT> +inline typename impl::make_unary<invert_op, BaseT>::type +operator~(actor<BaseT> const& _0) +{ + return impl::make_unary<invert_op, BaseT>::construct(_0); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// reference lazy operator (prefix &) +// +/////////////////////////////////////////////////////////////////////////////// +struct reference_op { + + template <typename T0> + struct result { + + typedef typename unary_operator<reference_op, T0>::result_type type; + }; + + template <typename T0> + typename unary_operator<reference_op, T0>::result_type + operator()(T0& _0) const + { return unary_operator<reference_op, T0>::eval(_0); } +}; + +////////////////////////////////// +template <typename BaseT> +inline typename impl::make_unary<reference_op, BaseT>::type +operator&(actor<BaseT> const& _0) +{ + return impl::make_unary<reference_op, BaseT>::construct(_0); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// dereference lazy operator (prefix *) +// +/////////////////////////////////////////////////////////////////////////////// +struct dereference_op { + + template <typename T0> + struct result { + + typedef typename unary_operator<dereference_op, T0>::result_type type; + }; + + template <typename T0> + typename unary_operator<dereference_op, T0>::result_type + operator()(T0& _0) const + { return unary_operator<dereference_op, T0>::eval(_0); } +}; + +////////////////////////////////// +template <typename BaseT> +inline typename impl::make_unary<dereference_op, BaseT>::type +operator*(actor<BaseT> const& _0) +{ + return impl::make_unary<dereference_op, BaseT>::construct(_0); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// pre increment lazy operator (prefix ++) +// +/////////////////////////////////////////////////////////////////////////////// +struct pre_incr_op { + + template <typename T0> + struct result { + + typedef typename unary_operator<pre_incr_op, T0>::result_type type; + }; + + template <typename T0> + typename unary_operator<pre_incr_op, T0>::result_type + operator()(T0& _0) const + { return unary_operator<pre_incr_op, T0>::eval(_0); } +}; + +////////////////////////////////// +template <typename BaseT> +inline typename impl::make_unary<pre_incr_op, BaseT>::type +operator++(actor<BaseT> const& _0) +{ + return impl::make_unary<pre_incr_op, BaseT>::construct(_0); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// pre decrement lazy operator (prefix --) +// +/////////////////////////////////////////////////////////////////////////////// +struct pre_decr_op { + + template <typename T0> + struct result { + + typedef typename unary_operator<pre_decr_op, T0>::result_type type; + }; + + template <typename T0> + typename unary_operator<pre_decr_op, T0>::result_type + operator()(T0& _0) const + { return unary_operator<pre_decr_op, T0>::eval(_0); } +}; + +////////////////////////////////// +template <typename BaseT> +inline typename impl::make_unary<pre_decr_op, BaseT>::type +operator--(actor<BaseT> const& _0) +{ + return impl::make_unary<pre_decr_op, BaseT>::construct(_0); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// post increment lazy operator (postfix ++) +// +/////////////////////////////////////////////////////////////////////////////// +struct post_incr_op { + + template <typename T0> + struct result { + + typedef typename unary_operator<post_incr_op, T0>::result_type type; + }; + + template <typename T0> + typename unary_operator<post_incr_op, T0>::result_type + operator()(T0& _0) const + { return unary_operator<post_incr_op, T0>::eval(_0); } +}; + +////////////////////////////////// +template <typename BaseT> +inline typename impl::make_unary<post_incr_op, BaseT>::type +operator++(actor<BaseT> const& _0, int) +{ + return impl::make_unary<post_incr_op, BaseT>::construct(_0); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// post decrement lazy operator (postfix --) +// +/////////////////////////////////////////////////////////////////////////////// +struct post_decr_op { + + template <typename T0> + struct result { + + typedef typename unary_operator<post_decr_op, T0>::result_type type; + }; + + template <typename T0> + typename unary_operator<post_decr_op, T0>::result_type + operator()(T0& _0) const + { return unary_operator<post_decr_op, T0>::eval(_0); } +}; + +////////////////////////////////// +template <typename BaseT> +inline typename impl::make_unary<post_decr_op, BaseT>::type +operator--(actor<BaseT> const& _0, int) +{ + return impl::make_unary<post_decr_op, BaseT>::construct(_0); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// assignment lazy operator (infix =) +// The acual lazy operator is a member of the actor class. +// +/////////////////////////////////////////////////////////////////////////////// +struct assign_op { + + template <typename T0, typename T1> + struct result { + + typedef typename binary_operator<assign_op, T0, T1> + ::result_type type; + }; + + template <typename T0, typename T1> + typename binary_operator<assign_op, T0, T1>::result_type + operator()(T0& _0, T1& _1) const + { return binary_operator<assign_op, T0, T1>::eval(_0, _1); } +}; + +////////////////////////////////// +template <typename BaseT> +template <typename B> +inline typename impl::make_binary1<assign_op, BaseT, B>::type +actor<BaseT>::operator=(B const& _1) const +{ + return impl::make_binary1<assign_op, BaseT, B>::construct(*this, _1); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// index lazy operator (array index []) +// The acual lazy operator is a member of the actor class. +// +/////////////////////////////////////////////////////////////////////////////// +struct index_op { + + template <typename T0, typename T1> + struct result { + + typedef typename binary_operator<index_op, T0, T1> + ::result_type type; + }; + + template <typename T0, typename T1> + typename binary_operator<index_op, T0, T1>::result_type + operator()(T0& _0, T1& _1) const + { return binary_operator<index_op, T0, T1>::eval(_0, _1); } +}; + +////////////////////////////////// +template <typename BaseT> +template <typename B> +inline typename impl::make_binary1<index_op, BaseT, B>::type +actor<BaseT>::operator[](B const& _1) const +{ + return impl::make_binary1<index_op, BaseT, B>::construct(*this, _1); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// plus assign lazy operator (infix +=) +// +/////////////////////////////////////////////////////////////////////////////// +struct plus_assign_op { + + template <typename T0, typename T1> + struct result { + + typedef typename binary_operator<plus_assign_op, T0, T1> + ::result_type type; + }; + + template <typename T0, typename T1> + typename binary_operator<plus_assign_op, T0, T1>::result_type + operator()(T0& _0, T1& _1) const + { return binary_operator<plus_assign_op, T0, T1>::eval(_0, _1); } +}; + +////////////////////////////////// +template <typename BaseT, typename T1> +inline typename impl::make_binary1<plus_assign_op, BaseT, T1>::type +operator+=(actor<BaseT> const& _0, T1 CREF _1) +{ + return impl::make_binary1<plus_assign_op, BaseT, T1>::construct(_0, _1); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// minus assign lazy operator (infix -=) +// +/////////////////////////////////////////////////////////////////////////////// +struct minus_assign_op { + + template <typename T0, typename T1> + struct result { + + typedef typename binary_operator<minus_assign_op, T0, T1> + ::result_type type; + }; + + template <typename T0, typename T1> + typename binary_operator<minus_assign_op, T0, T1>::result_type + operator()(T0& _0, T1& _1) const + { return binary_operator<minus_assign_op, T0, T1>::eval(_0, _1); } +}; + +////////////////////////////////// +template <typename BaseT, typename T1> +inline typename impl::make_binary1<minus_assign_op, BaseT, T1>::type +operator-=(actor<BaseT> const& _0, T1 CREF _1) +{ + return impl::make_binary1<minus_assign_op, BaseT, T1>::construct(_0, _1); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// times assign lazy operator (infix *=) +// +/////////////////////////////////////////////////////////////////////////////// +struct times_assign_op { + + template <typename T0, typename T1> + struct result { + + typedef typename binary_operator<times_assign_op, T0, T1> + ::result_type type; + }; + + template <typename T0, typename T1> + typename binary_operator<times_assign_op, T0, T1>::result_type + operator()(T0& _0, T1& _1) const + { return binary_operator<times_assign_op, T0, T1>::eval(_0, _1); } +}; + +////////////////////////////////// +template <typename BaseT, typename T1> +inline typename impl::make_binary1<times_assign_op, BaseT, T1>::type +operator*=(actor<BaseT> const& _0, T1 CREF _1) +{ + return impl::make_binary1<times_assign_op, BaseT, T1>::construct(_0, _1); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// divide assign lazy operator (infix /=) +// +/////////////////////////////////////////////////////////////////////////////// +struct divide_assign_op { + + template <typename T0, typename T1> + struct result { + + typedef typename binary_operator<divide_assign_op, T0, T1> + ::result_type type; + }; + + template <typename T0, typename T1> + typename binary_operator<divide_assign_op, T0, T1>::result_type + operator()(T0& _0, T1& _1) const + { return binary_operator<divide_assign_op, T0, T1>::eval(_0, _1); } +}; + +////////////////////////////////// +template <typename BaseT, typename T1> +inline typename impl::make_binary1<divide_assign_op, BaseT, T1>::type +operator/=(actor<BaseT> const& _0, T1 CREF _1) +{ + return impl::make_binary1<divide_assign_op, BaseT, T1>::construct(_0, _1); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// mod assign lazy operator (infix %=) +// +/////////////////////////////////////////////////////////////////////////////// +struct mod_assign_op { + + template <typename T0, typename T1> + struct result { + + typedef typename binary_operator<mod_assign_op, T0, T1> + ::result_type type; + }; + + template <typename T0, typename T1> + typename binary_operator<mod_assign_op, T0, T1>::result_type + operator()(T0& _0, T1& _1) const + { return binary_operator<mod_assign_op, T0, T1>::eval(_0, _1); } +}; + +////////////////////////////////// +template <typename BaseT, typename T1> +inline typename impl::make_binary1<mod_assign_op, BaseT, T1>::type +operator%=(actor<BaseT> const& _0, T1 CREF _1) +{ + return impl::make_binary1<mod_assign_op, BaseT, T1>::construct(_0, _1); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// and assign lazy operator (infix &=) +// +/////////////////////////////////////////////////////////////////////////////// +struct and_assign_op { + + template <typename T0, typename T1> + struct result { + + typedef typename binary_operator<and_assign_op, T0, T1> + ::result_type type; + }; + + template <typename T0, typename T1> + typename binary_operator<and_assign_op, T0, T1>::result_type + operator()(T0& _0, T1& _1) const + { return binary_operator<and_assign_op, T0, T1>::eval(_0, _1); } +}; + +////////////////////////////////// +template <typename BaseT, typename T1> +inline typename impl::make_binary1<and_assign_op, BaseT, T1>::type +operator&=(actor<BaseT> const& _0, T1 CREF _1) +{ + return impl::make_binary1<and_assign_op, BaseT, T1>::construct(_0, _1); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// or assign lazy operator (infix |=) +// +/////////////////////////////////////////////////////////////////////////////// +struct or_assign_op { + + template <typename T0, typename T1> + struct result { + + typedef typename binary_operator<or_assign_op, T0, T1> + ::result_type type; + }; + + template <typename T0, typename T1> + typename binary_operator<or_assign_op, T0, T1>::result_type + operator()(T0& _0, T1& _1) const + { return binary_operator<or_assign_op, T0, T1>::eval(_0, _1); } +}; + +////////////////////////////////// +template <typename BaseT, typename T1> +inline typename impl::make_binary1<or_assign_op, BaseT, T1>::type +operator|=(actor<BaseT> const& _0, T1 CREF _1) +{ + return impl::make_binary1<or_assign_op, BaseT, T1>::construct(_0, _1); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// xor assign lazy operator (infix ^=) +// +/////////////////////////////////////////////////////////////////////////////// +struct xor_assign_op { + + template <typename T0, typename T1> + struct result { + + typedef typename binary_operator<xor_assign_op, T0, T1> + ::result_type type; + }; + + template <typename T0, typename T1> + typename binary_operator<xor_assign_op, T0, T1>::result_type + operator()(T0& _0, T1& _1) const + { return binary_operator<xor_assign_op, T0, T1>::eval(_0, _1); } +}; + +////////////////////////////////// +template <typename BaseT, typename T1> +inline typename impl::make_binary1<xor_assign_op, BaseT, T1>::type +operator^=(actor<BaseT> const& _0, T1 CREF _1) +{ + return impl::make_binary1<xor_assign_op, BaseT, T1>::construct(_0, _1); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// shift left assign lazy operator (infix <<=) +// +/////////////////////////////////////////////////////////////////////////////// +struct shift_l_assign_op { + + template <typename T0, typename T1> + struct result { + + typedef typename binary_operator<shift_l_assign_op, T0, T1> + ::result_type type; + }; + + template <typename T0, typename T1> + typename binary_operator<shift_l_assign_op, T0, T1>::result_type + operator()(T0& _0, T1& _1) const + { return binary_operator<shift_l_assign_op, T0, T1>::eval(_0, _1); } +}; + +////////////////////////////////// +template <typename BaseT, typename T1> +inline typename impl::make_binary1<shift_l_assign_op, BaseT, T1>::type +operator<<=(actor<BaseT> const& _0, T1 CREF _1) +{ + return impl::make_binary1<shift_l_assign_op, BaseT, T1>::construct(_0, _1); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// shift right assign lazy operator (infix >>=) +// +/////////////////////////////////////////////////////////////////////////////// +struct shift_r_assign_op { + + template <typename T0, typename T1> + struct result { + + typedef typename binary_operator<shift_r_assign_op, T0, T1> + ::result_type type; + }; + + template <typename T0, typename T1> + typename binary_operator<shift_r_assign_op, T0, T1>::result_type + operator()(T0& _0, T1& _1) const + { return binary_operator<shift_r_assign_op, T0, T1>::eval(_0, _1); } +}; + +////////////////////////////////// +template <typename BaseT, typename T1> +inline typename impl::make_binary1<shift_r_assign_op, BaseT, T1>::type +operator>>=(actor<BaseT> const& _0, T1 CREF _1) +{ + return impl::make_binary1<shift_r_assign_op, BaseT, T1>::construct(_0, _1); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// plus lazy operator (infix +) +// +/////////////////////////////////////////////////////////////////////////////// +struct plus_op { + + template <typename T0, typename T1> + struct result { + + typedef typename binary_operator<plus_op, T0, T1> + ::result_type type; + }; + + template <typename T0, typename T1> + typename binary_operator<plus_op, T0, T1>::result_type + operator()(T0& _0, T1& _1) const + { return binary_operator<plus_op, T0, T1>::eval(_0, _1); } +}; + +////////////////////////////////// +template <typename BaseT, typename T1> +inline typename impl::make_binary1<plus_op, BaseT, T1>::type +operator+(actor<BaseT> const& _0, T1 CREF _1) +{ + return impl::make_binary1<plus_op, BaseT, T1>::construct(_0, _1); +} + +////////////////////////////////// +template <typename T0, typename BaseT> +inline typename impl::make_binary2<plus_op, T0, BaseT>::type +operator+(T0 CREF _0, actor<BaseT> const& _1) +{ + return impl::make_binary2<plus_op, T0, BaseT>::construct(_0, _1); +} + +////////////////////////////////// +template <typename BaseT0, typename BaseT1> +inline typename impl::make_binary3<plus_op, BaseT0, BaseT1>::type +operator+(actor<BaseT0> const& _0, actor<BaseT1> const& _1) +{ + return impl::make_binary3<plus_op, BaseT0, BaseT1>::construct(_0, _1); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// minus lazy operator (infix -) +// +/////////////////////////////////////////////////////////////////////////////// +struct minus_op { + + template <typename T0, typename T1> + struct result { + + typedef typename binary_operator<minus_op, T0, T1> + ::result_type type; + }; + + template <typename T0, typename T1> + typename binary_operator<minus_op, T0, T1>::result_type + operator()(T0& _0, T1& _1) const + { return binary_operator<minus_op, T0, T1>::eval(_0, _1); } +}; + +////////////////////////////////// +template <typename BaseT, typename T1> +inline typename impl::make_binary1<minus_op, BaseT, T1>::type +operator-(actor<BaseT> const& _0, T1 CREF _1) +{ + return impl::make_binary1<minus_op, BaseT, T1>::construct(_0, _1); +} + +////////////////////////////////// +template <typename T0, typename BaseT> +inline typename impl::make_binary2<minus_op, T0, BaseT>::type +operator-(T0 CREF _0, actor<BaseT> const& _1) +{ + return impl::make_binary2<minus_op, T0, BaseT>::construct(_0, _1); +} + +////////////////////////////////// +template <typename BaseT0, typename BaseT1> +inline typename impl::make_binary3<minus_op, BaseT0, BaseT1>::type +operator-(actor<BaseT0> const& _0, actor<BaseT1> const& _1) +{ + return impl::make_binary3<minus_op, BaseT0, BaseT1>::construct(_0, _1); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// times lazy operator (infix *) +// +/////////////////////////////////////////////////////////////////////////////// +struct times_op { + + template <typename T0, typename T1> + struct result { + + typedef typename binary_operator<times_op, T0, T1> + ::result_type type; + }; + + template <typename T0, typename T1> + typename binary_operator<times_op, T0, T1>::result_type + operator()(T0& _0, T1& _1) const + { return binary_operator<times_op, T0, T1>::eval(_0, _1); } +}; + +////////////////////////////////// +template <typename BaseT, typename T1> +inline typename impl::make_binary1<times_op, BaseT, T1>::type +operator*(actor<BaseT> const& _0, T1 CREF _1) +{ + return impl::make_binary1<times_op, BaseT, T1>::construct(_0, _1); +} + +////////////////////////////////// +template <typename T0, typename BaseT> +inline typename impl::make_binary2<times_op, T0, BaseT>::type +operator*(T0 CREF _0, actor<BaseT> const& _1) +{ + return impl::make_binary2<times_op, T0, BaseT>::construct(_0, _1); +} + +////////////////////////////////// +template <typename BaseT0, typename BaseT1> +inline typename impl::make_binary3<times_op, BaseT0, BaseT1>::type +operator*(actor<BaseT0> const& _0, actor<BaseT1> const& _1) +{ + return impl::make_binary3<times_op, BaseT0, BaseT1>::construct(_0, _1); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// divide lazy operator (infix /) +// +/////////////////////////////////////////////////////////////////////////////// +struct divide_op { + + template <typename T0, typename T1> + struct result { + + typedef typename binary_operator<divide_op, T0, T1> + ::result_type type; + }; + + template <typename T0, typename T1> + typename binary_operator<divide_op, T0, T1>::result_type + operator()(T0& _0, T1& _1) const + { return binary_operator<divide_op, T0, T1>::eval(_0, _1); } +}; + +////////////////////////////////// +template <typename BaseT, typename T1> +inline typename impl::make_binary1<divide_op, BaseT, T1>::type +operator/(actor<BaseT> const& _0, T1 CREF _1) +{ + return impl::make_binary1<divide_op, BaseT, T1>::construct(_0, _1); +} + +////////////////////////////////// +template <typename T0, typename BaseT> +inline typename impl::make_binary2<divide_op, T0, BaseT>::type +operator/(T0 CREF _0, actor<BaseT> const& _1) +{ + return impl::make_binary2<divide_op, T0, BaseT>::construct(_0, _1); +} + +////////////////////////////////// +template <typename BaseT0, typename BaseT1> +inline typename impl::make_binary3<divide_op, BaseT0, BaseT1>::type +operator/(actor<BaseT0> const& _0, actor<BaseT1> const& _1) +{ + return impl::make_binary3<divide_op, BaseT0, BaseT1>::construct(_0, _1); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// mod lazy operator (infix %) +// +/////////////////////////////////////////////////////////////////////////////// +struct mod_op { + + template <typename T0, typename T1> + struct result { + + typedef typename binary_operator<mod_op, T0, T1> + ::result_type type; + }; + + template <typename T0, typename T1> + typename binary_operator<mod_op, T0, T1>::result_type + operator()(T0& _0, T1& _1) const + { return binary_operator<mod_op, T0, T1>::eval(_0, _1); } +}; + +////////////////////////////////// +template <typename BaseT, typename T1> +inline typename impl::make_binary1<mod_op, BaseT, T1>::type +operator%(actor<BaseT> const& _0, T1 CREF _1) +{ + return impl::make_binary1<mod_op, BaseT, T1>::construct(_0, _1); +} + +////////////////////////////////// +template <typename T0, typename BaseT> +inline typename impl::make_binary2<mod_op, T0, BaseT>::type +operator%(T0 CREF _0, actor<BaseT> const& _1) +{ + return impl::make_binary2<mod_op, T0, BaseT>::construct(_0, _1); +} + +////////////////////////////////// +template <typename BaseT0, typename BaseT1> +inline typename impl::make_binary3<mod_op, BaseT0, BaseT1>::type +operator%(actor<BaseT0> const& _0, actor<BaseT1> const& _1) +{ + return impl::make_binary3<mod_op, BaseT0, BaseT1>::construct(_0, _1); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// and lazy operator (infix &) +// +/////////////////////////////////////////////////////////////////////////////// +struct and_op { + + template <typename T0, typename T1> + struct result { + + typedef typename binary_operator<and_op, T0, T1> + ::result_type type; + }; + + template <typename T0, typename T1> + typename binary_operator<and_op, T0, T1>::result_type + operator()(T0& _0, T1& _1) const + { return binary_operator<and_op, T0, T1>::eval(_0, _1); } +}; + +////////////////////////////////// +template <typename BaseT, typename T1> +inline typename impl::make_binary1<and_op, BaseT, T1>::type +operator&(actor<BaseT> const& _0, T1 CREF _1) +{ + return impl::make_binary1<and_op, BaseT, T1>::construct(_0, _1); +} + +////////////////////////////////// +template <typename T0, typename BaseT> +inline typename impl::make_binary2<and_op, T0, BaseT>::type +operator&(T0 CREF _0, actor<BaseT> const& _1) +{ + return impl::make_binary2<and_op, T0, BaseT>::construct(_0, _1); +} + +////////////////////////////////// +template <typename BaseT0, typename BaseT1> +inline typename impl::make_binary3<and_op, BaseT0, BaseT1>::type +operator&(actor<BaseT0> const& _0, actor<BaseT1> const& _1) +{ + return impl::make_binary3<and_op, BaseT0, BaseT1>::construct(_0, _1); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// or lazy operator (infix |) +// +/////////////////////////////////////////////////////////////////////////////// +struct or_op { + + template <typename T0, typename T1> + struct result { + + typedef typename binary_operator<or_op, T0, T1> + ::result_type type; + }; + + template <typename T0, typename T1> + typename binary_operator<or_op, T0, T1>::result_type + operator()(T0& _0, T1& _1) const + { return binary_operator<or_op, T0, T1>::eval(_0, _1); } +}; + +////////////////////////////////// +template <typename BaseT, typename T1> +inline typename impl::make_binary1<or_op, BaseT, T1>::type +operator|(actor<BaseT> const& _0, T1 CREF _1) +{ + return impl::make_binary1<or_op, BaseT, T1>::construct(_0, _1); +} + +////////////////////////////////// +template <typename T0, typename BaseT> +inline typename impl::make_binary2<or_op, T0, BaseT>::type +operator|(T0 CREF _0, actor<BaseT> const& _1) +{ + return impl::make_binary2<or_op, T0, BaseT>::construct(_0, _1); +} + +////////////////////////////////// +template <typename BaseT0, typename BaseT1> +inline typename impl::make_binary3<or_op, BaseT0, BaseT1>::type +operator|(actor<BaseT0> const& _0, actor<BaseT1> const& _1) +{ + return impl::make_binary3<or_op, BaseT0, BaseT1>::construct(_0, _1); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// xor lazy operator (infix ^) +// +/////////////////////////////////////////////////////////////////////////////// +struct xor_op { + + template <typename T0, typename T1> + struct result { + + typedef typename binary_operator<xor_op, T0, T1> + ::result_type type; + }; + + template <typename T0, typename T1> + typename binary_operator<xor_op, T0, T1>::result_type + operator()(T0& _0, T1& _1) const + { return binary_operator<xor_op, T0, T1>::eval(_0, _1); } +}; + +////////////////////////////////// +template <typename BaseT, typename T1> +inline typename impl::make_binary1<xor_op, BaseT, T1>::type +operator^(actor<BaseT> const& _0, T1 CREF _1) +{ + return impl::make_binary1<xor_op, BaseT, T1>::construct(_0, _1); +} + +////////////////////////////////// +template <typename T0, typename BaseT> +inline typename impl::make_binary2<xor_op, T0, BaseT>::type +operator^(T0 CREF _0, actor<BaseT> const& _1) +{ + return impl::make_binary2<xor_op, T0, BaseT>::construct(_0, _1); +} + +////////////////////////////////// +template <typename BaseT0, typename BaseT1> +inline typename impl::make_binary3<xor_op, BaseT0, BaseT1>::type +operator^(actor<BaseT0> const& _0, actor<BaseT1> const& _1) +{ + return impl::make_binary3<xor_op, BaseT0, BaseT1>::construct(_0, _1); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// shift left lazy operator (infix <<) +// +/////////////////////////////////////////////////////////////////////////////// +struct shift_l_op { + + template <typename T0, typename T1> + struct result { + + typedef typename binary_operator<shift_l_op, T0, T1> + ::result_type type; + }; + + template <typename T0, typename T1> + typename binary_operator<shift_l_op, T0, T1>::result_type + operator()(T0& _0, T1& _1) const + { return binary_operator<shift_l_op, T0, T1>::eval(_0, _1); } +}; + +////////////////////////////////// +template <typename BaseT, typename T1> +inline typename impl::make_binary1<shift_l_op, BaseT, T1>::type +operator<<(actor<BaseT> const& _0, T1 CREF _1) +{ + return impl::make_binary1<shift_l_op, BaseT, T1>::construct(_0, _1); +} + +////////////////////////////////// +template <typename T0, typename BaseT> +inline typename impl::make_binary2<shift_l_op, T0, BaseT>::type +operator<<(T0 CREF _0, actor<BaseT> const& _1) +{ + return impl::make_binary2<shift_l_op, T0, BaseT>::construct(_0, _1); +} + +////////////////////////////////// +template <typename BaseT0, typename BaseT1> +inline typename impl::make_binary3<shift_l_op, BaseT0, BaseT1>::type +operator<<(actor<BaseT0> const& _0, actor<BaseT1> const& _1) +{ + return impl::make_binary3<shift_l_op, BaseT0, BaseT1>::construct(_0, _1); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// shift right lazy operator (infix >>) +// +/////////////////////////////////////////////////////////////////////////////// +struct shift_r_op { + + template <typename T0, typename T1> + struct result { + + typedef typename binary_operator<shift_r_op, T0, T1> + ::result_type type; + }; + + template <typename T0, typename T1> + typename binary_operator<shift_r_op, T0, T1>::result_type + operator()(T0& _0, T1& _1) const + { return binary_operator<shift_r_op, T0, T1>::eval(_0, _1); } +}; + +////////////////////////////////// +template <typename BaseT, typename T1> +inline typename impl::make_binary1<shift_r_op, BaseT, T1>::type +operator>>(actor<BaseT> const& _0, T1 CREF _1) +{ + return impl::make_binary1<shift_r_op, BaseT, T1>::construct(_0, _1); +} + +////////////////////////////////// +template <typename T0, typename BaseT> +inline typename impl::make_binary2<shift_r_op, T0, BaseT>::type +operator>>(T0 CREF _0, actor<BaseT> const& _1) +{ + return impl::make_binary2<shift_r_op, T0, BaseT>::construct(_0, _1); +} + +////////////////////////////////// +template <typename BaseT0, typename BaseT1> +inline typename impl::make_binary3<shift_r_op, BaseT0, BaseT1>::type +operator>>(actor<BaseT0> const& _0, actor<BaseT1> const& _1) +{ + return impl::make_binary3<shift_r_op, BaseT0, BaseT1>::construct(_0, _1); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// equal lazy operator (infix ==) +// +/////////////////////////////////////////////////////////////////////////////// +struct eq_op { + + template <typename T0, typename T1> + struct result { + + typedef typename binary_operator<eq_op, T0, T1> + ::result_type type; + }; + + template <typename T0, typename T1> + typename binary_operator<eq_op, T0, T1>::result_type + operator()(T0& _0, T1& _1) const + { return binary_operator<eq_op, T0, T1>::eval(_0, _1); } +}; + +////////////////////////////////// +template <typename BaseT, typename T1> +inline typename impl::make_binary1<eq_op, BaseT, T1>::type +operator==(actor<BaseT> const& _0, T1 CREF _1) +{ + return impl::make_binary1<eq_op, BaseT, T1>::construct(_0, _1); +} + +////////////////////////////////// +template <typename T0, typename BaseT> +inline typename impl::make_binary2<eq_op, T0, BaseT>::type +operator==(T0 CREF _0, actor<BaseT> const& _1) +{ + return impl::make_binary2<eq_op, T0, BaseT>::construct(_0, _1); +} + +////////////////////////////////// +template <typename BaseT0, typename BaseT1> +inline typename impl::make_binary3<eq_op, BaseT0, BaseT1>::type +operator==(actor<BaseT0> const& _0, actor<BaseT1> const& _1) +{ + return impl::make_binary3<eq_op, BaseT0, BaseT1>::construct(_0, _1); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// not equal lazy operator (infix !=) +// +/////////////////////////////////////////////////////////////////////////////// +struct not_eq_op { + + template <typename T0, typename T1> + struct result { + + typedef typename binary_operator<not_eq_op, T0, T1> + ::result_type type; + }; + + template <typename T0, typename T1> + typename binary_operator<not_eq_op, T0, T1>::result_type + operator()(T0& _0, T1& _1) const + { return binary_operator<not_eq_op, T0, T1>::eval(_0, _1); } +}; + +////////////////////////////////// +template <typename BaseT, typename T1> +inline typename impl::make_binary1<not_eq_op, BaseT, T1>::type +operator!=(actor<BaseT> const& _0, T1 CREF _1) +{ + return impl::make_binary1<not_eq_op, BaseT, T1>::construct(_0, _1); +} + +////////////////////////////////// +template <typename T0, typename BaseT> +inline typename impl::make_binary2<not_eq_op, T0, BaseT>::type +operator!=(T0 CREF _0, actor<BaseT> const& _1) +{ + return impl::make_binary2<not_eq_op, T0, BaseT>::construct(_0, _1); +} + +////////////////////////////////// +template <typename BaseT0, typename BaseT1> +inline typename impl::make_binary3<not_eq_op, BaseT0, BaseT1>::type +operator!=(actor<BaseT0> const& _0, actor<BaseT1> const& _1) +{ + return impl::make_binary3<not_eq_op, BaseT0, BaseT1>::construct(_0, _1); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// less than lazy operator (infix <) +// +/////////////////////////////////////////////////////////////////////////////// +struct lt_op { + + template <typename T0, typename T1> + struct result { + + typedef typename binary_operator<lt_op, T0, T1> + ::result_type type; + }; + + template <typename T0, typename T1> + typename binary_operator<lt_op, T0, T1>::result_type + operator()(T0& _0, T1& _1) const + { return binary_operator<lt_op, T0, T1>::eval(_0, _1); } +}; + +////////////////////////////////// +template <typename BaseT, typename T1> +inline typename impl::make_binary1<lt_op, BaseT, T1>::type +operator<(actor<BaseT> const& _0, T1 CREF _1) +{ + return impl::make_binary1<lt_op, BaseT, T1>::construct(_0, _1); +} + +////////////////////////////////// +template <typename T0, typename BaseT> +inline typename impl::make_binary2<lt_op, T0, BaseT>::type +operator<(T0 CREF _0, actor<BaseT> const& _1) +{ + return impl::make_binary2<lt_op, T0, BaseT>::construct(_0, _1); +} + +////////////////////////////////// +template <typename BaseT0, typename BaseT1> +inline typename impl::make_binary3<lt_op, BaseT0, BaseT1>::type +operator<(actor<BaseT0> const& _0, actor<BaseT1> const& _1) +{ + return impl::make_binary3<lt_op, BaseT0, BaseT1>::construct(_0, _1); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// less than equal lazy operator (infix <=) +// +/////////////////////////////////////////////////////////////////////////////// +struct lt_eq_op { + + template <typename T0, typename T1> + struct result { + + typedef typename binary_operator<lt_eq_op, T0, T1> + ::result_type type; + }; + + template <typename T0, typename T1> + typename binary_operator<lt_eq_op, T0, T1>::result_type + operator()(T0& _0, T1& _1) const + { return binary_operator<lt_eq_op, T0, T1>::eval(_0, _1); } +}; + +////////////////////////////////// +template <typename BaseT, typename T1> +inline typename impl::make_binary1<lt_eq_op, BaseT, T1>::type +operator<=(actor<BaseT> const& _0, T1 CREF _1) +{ + return impl::make_binary1<lt_eq_op, BaseT, T1>::construct(_0, _1); +} + +////////////////////////////////// +template <typename T0, typename BaseT> +inline typename impl::make_binary2<lt_eq_op, T0, BaseT>::type +operator<=(T0 CREF _0, actor<BaseT> const& _1) +{ + return impl::make_binary2<lt_eq_op, T0, BaseT>::construct(_0, _1); +} + +////////////////////////////////// +template <typename BaseT0, typename BaseT1> +inline typename impl::make_binary3<lt_eq_op, BaseT0, BaseT1>::type +operator<=(actor<BaseT0> const& _0, actor<BaseT1> const& _1) +{ + return impl::make_binary3<lt_eq_op, BaseT0, BaseT1>::construct(_0, _1); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// greater than lazy operator (infix >) +// +/////////////////////////////////////////////////////////////////////////////// +struct gt_op { + + template <typename T0, typename T1> + struct result { + + typedef typename binary_operator<gt_op, T0, T1> + ::result_type type; + }; + + template <typename T0, typename T1> + typename binary_operator<gt_op, T0, T1>::result_type + operator()(T0& _0, T1& _1) const + { return binary_operator<gt_op, T0, T1>::eval(_0, _1); } +}; + +////////////////////////////////// +template <typename BaseT, typename T1> +inline typename impl::make_binary1<gt_op, BaseT, T1>::type +operator>(actor<BaseT> const& _0, T1 CREF _1) +{ + return impl::make_binary1<gt_op, BaseT, T1>::construct(_0, _1); +} + +////////////////////////////////// +template <typename T0, typename BaseT> +inline typename impl::make_binary2<gt_op, T0, BaseT>::type +operator>(T0 CREF _0, actor<BaseT> const& _1) +{ + return impl::make_binary2<gt_op, T0, BaseT>::construct(_0, _1); +} + +////////////////////////////////// +template <typename BaseT0, typename BaseT1> +inline typename impl::make_binary3<gt_op, BaseT0, BaseT1>::type +operator>(actor<BaseT0> const& _0, actor<BaseT1> const& _1) +{ + return impl::make_binary3<gt_op, BaseT0, BaseT1>::construct(_0, _1); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// greater than equal lazy operator (infix >=) +// +/////////////////////////////////////////////////////////////////////////////// +struct gt_eq_op { + + template <typename T0, typename T1> + struct result { + + typedef typename binary_operator<gt_eq_op, T0, T1> + ::result_type type; + }; + + template <typename T0, typename T1> + typename binary_operator<gt_eq_op, T0, T1>::result_type + operator()(T0& _0, T1& _1) const + { return binary_operator<gt_eq_op, T0, T1>::eval(_0, _1); } +}; + +////////////////////////////////// +template <typename BaseT, typename T1> +inline typename impl::make_binary1<gt_eq_op, BaseT, T1>::type +operator>=(actor<BaseT> const& _0, T1 CREF _1) +{ + return impl::make_binary1<gt_eq_op, BaseT, T1>::construct(_0, _1); +} + +////////////////////////////////// +template <typename T0, typename BaseT> +inline typename impl::make_binary2<gt_eq_op, T0, BaseT>::type +operator>=(T0 CREF _0, actor<BaseT> const& _1) +{ + return impl::make_binary2<gt_eq_op, T0, BaseT>::construct(_0, _1); +} + +////////////////////////////////// +template <typename BaseT0, typename BaseT1> +inline typename impl::make_binary3<gt_eq_op, BaseT0, BaseT1>::type +operator>=(actor<BaseT0> const& _0, actor<BaseT1> const& _1) +{ + return impl::make_binary3<gt_eq_op, BaseT0, BaseT1>::construct(_0, _1); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// logical and lazy operator (infix &&) +// +// The logical_and_composite class and its corresponding generators are +// provided to allow short-circuit evaluation of the operator's +// operands. +// +/////////////////////////////////////////////////////////////////////////////// +template <typename A0, typename A1> +struct logical_and_composite { + + typedef logical_and_composite<A0, A1> self_t; + + template <typename TupleT> + struct result { + + typedef typename binary_operator<logical_and_op, + typename actor_result<A0, TupleT>::plain_type, + typename actor_result<A1, TupleT>::plain_type + >::result_type type; + }; + + logical_and_composite(A0 const& _0, A1 const& _1) + : a0(_0), a1(_1) {} + + template <typename TupleT> + typename actor_result<self_t, TupleT>::type + eval(TupleT const& args) const + { + return a0.eval(args) && a1.eval(args); + } + + A0 a0; A1 a1; // actors +}; + +#if !(defined(__ICL) && __ICL <= 500) +////////////////////////////////// +template <typename BaseT, typename T1> +inline actor<logical_and_composite +<actor<BaseT>, typename as_actor<T1>::type> > +operator&&(actor<BaseT> const& _0, T1 CREF _1) +{ + return logical_and_composite + <actor<BaseT>, typename as_actor<T1>::type> + (_0, as_actor<T1>::convert(_1)); +} + +////////////////////////////////// +template <typename T0, typename BaseT> +inline actor<logical_and_composite +<typename as_actor<T0>::type, actor<BaseT> > > +operator&&(T0 CREF _0, actor<BaseT> const& _1) +{ + return logical_and_composite + <typename as_actor<T0>::type, actor<BaseT> > + (as_actor<T0>::convert(_0), _1); +} + +////////////////////////////////// +template <typename BaseT0, typename BaseT1> +inline actor<logical_and_composite +<actor<BaseT0>, actor<BaseT1> > > +operator&&(actor<BaseT0> const& _0, actor<BaseT1> const& _1) +{ + return logical_and_composite + <actor<BaseT0>, actor<BaseT1> > + (_0, _1); +} +#else +////////////////////////////////// +template <typename T0, typename T1> +inline actor<logical_and_composite +<typename as_actor<T0>::type, typename as_actor<T1>::type> > +operator&&(T0 CREF _0, T1 CREF _1) +{ + return logical_and_composite + <typename as_actor<T0>::type, typename as_actor<T1>::type> + (as_actor<T0>::convert(_0), as_actor<T1>::convert(_1)); +} +#endif // !(__ICL && __ICL <= 500) + +/////////////////////////////////////////////////////////////////////////////// +// +// logical or lazy operator (infix ||) +// +// The logical_or_composite class and its corresponding generators are +// provided to allow short-circuit evaluation of the operator's +// operands. +// +/////////////////////////////////////////////////////////////////////////////// +template <typename A0, typename A1> +struct logical_or_composite { + + typedef logical_or_composite<A0, A1> self_t; + + template <typename TupleT> + struct result { + + typedef typename binary_operator<logical_or_op, + typename actor_result<A0, TupleT>::plain_type, + typename actor_result<A1, TupleT>::plain_type + >::result_type type; + }; + + logical_or_composite(A0 const& _0, A1 const& _1) + : a0(_0), a1(_1) {} + + template <typename TupleT> + typename actor_result<self_t, TupleT>::type + eval(TupleT const& args) const + { + return a0.eval(args) || a1.eval(args); + } + + A0 a0; A1 a1; // actors +}; + +////////////////////////////////// +template <typename BaseT, typename T1> +inline actor<logical_or_composite +<actor<BaseT>, typename as_actor<T1>::type> > +operator||(actor<BaseT> const& _0, T1 CREF _1) +{ + return logical_or_composite + <actor<BaseT>, typename as_actor<T1>::type> + (_0, as_actor<T1>::convert(_1)); +} + +////////////////////////////////// +template <typename T0, typename BaseT> +inline actor<logical_or_composite +<typename as_actor<T0>::type, actor<BaseT> > > +operator||(T0 CREF _0, actor<BaseT> const& _1) +{ + return logical_or_composite + <typename as_actor<T0>::type, actor<BaseT> > + (as_actor<T0>::convert(_0), _1); +} + +////////////////////////////////// +template <typename BaseT0, typename BaseT1> +inline actor<logical_or_composite +<actor<BaseT0>, actor<BaseT1> > > +operator||(actor<BaseT0> const& _0, actor<BaseT1> const& _1) +{ + return logical_or_composite + <actor<BaseT0>, actor<BaseT1> > + (_0, _1); +} + +} // namespace phoenix + +#undef CREF +#endif