diff --git a/include/boost/lambda/detail/operators.hpp b/include/boost/lambda/detail/operators.hpp index 53bdc51..99387a6 100644 --- a/include/boost/lambda/detail/operators.hpp +++ b/include/boost/lambda/detail/operators.hpp @@ -27,22 +27,31 @@ namespace lambda { #error "Multiple defines of BOOST_LAMBDA_BE1" #endif + // For all BOOSTA_LAMBDA_BE* macros: + + // CONSTA must be either 'A' or 'const A' + // CONSTB must be either 'B' or 'const B' + + // It is stupid to have the names A and B as macro arguments, but it avoids + // the need to pass in emtpy macro arguments, which gives warnings on some + // compilers + #define BOOST_LAMBDA_BE1(OPER_NAME, ACTION, CONSTA, CONSTB, CONVERSION) \ template \ inline const \ lambda_functor< \ lambda_functor_base< \ ACTION, \ - tuple, typename CONVERSION ::type> \ + tuple, typename CONVERSION ::type> \ > \ > \ -OPER_NAME (const lambda_functor& a, CONSTB B& b) { \ +OPER_NAME (const lambda_functor& a, CONSTB& b) { \ return \ lambda_functor_base< \ ACTION, \ - tuple, typename CONVERSION ::type> \ + tuple, typename CONVERSION ::type> \ > \ - (tuple, typename CONVERSION ::type>(a, b)); \ + (tuple, typename CONVERSION ::type>(a, b)); \ } @@ -56,16 +65,16 @@ inline const \ lambda_functor< \ lambda_functor_base< \ ACTION, \ - tuple::type, lambda_functor > \ + tuple::type, lambda_functor > \ > \ > \ -OPER_NAME (CONSTA A& a, const lambda_functor& b) { \ +OPER_NAME (CONSTA& a, const lambda_functor& b) { \ return \ lambda_functor_base< \ ACTION, \ - tuple::type, lambda_functor > \ + tuple::type, lambda_functor > \ > \ - (tuple::type, lambda_functor >(a, b)); \ + (tuple::type, lambda_functor >(a, b)); \ } @@ -100,36 +109,37 @@ BOOST_LAMBDA_BE1(OPER_NAME, ACTION, CONSTA, CONSTB, CONST_CONVERSION) \ BOOST_LAMBDA_BE2(OPER_NAME, ACTION, CONSTA, CONSTB, CONST_CONVERSION) \ BOOST_LAMBDA_BE3(OPER_NAME, ACTION, CONSTA, CONSTB, CONST_CONVERSION) +#define BOOST_LAMBDA_EMPTY() -BOOST_LAMBDA_BE(operator+, arithmetic_action, const, const, const_copy_argument) -BOOST_LAMBDA_BE(operator-, arithmetic_action, const, const, const_copy_argument) -BOOST_LAMBDA_BE(operator*, arithmetic_action, const, const, const_copy_argument) -BOOST_LAMBDA_BE(operator/, arithmetic_action, const, const, const_copy_argument) -BOOST_LAMBDA_BE(operator%, arithmetic_action, const, const, const_copy_argument) -BOOST_LAMBDA_BE(operator<<, bitwise_action, const, const, const_copy_argument) -BOOST_LAMBDA_BE(operator>>, bitwise_action, const, const, const_copy_argument) -BOOST_LAMBDA_BE(operator&, bitwise_action, const, const, const_copy_argument) -BOOST_LAMBDA_BE(operator|, bitwise_action, const, const, const_copy_argument) -BOOST_LAMBDA_BE(operator^, bitwise_action, const, const, const_copy_argument) -BOOST_LAMBDA_BE(operator&&, logical_action, const, const, const_copy_argument) -BOOST_LAMBDA_BE(operator||, logical_action, const, const, const_copy_argument) -BOOST_LAMBDA_BE(operator<, relational_action, const, const, const_copy_argument) -BOOST_LAMBDA_BE(operator>, relational_action, const, const, const_copy_argument) -BOOST_LAMBDA_BE(operator<=, relational_action, const, const, const_copy_argument) -BOOST_LAMBDA_BE(operator>=, relational_action, const, const, const_copy_argument) -BOOST_LAMBDA_BE(operator==, relational_action, const, const, const_copy_argument) -BOOST_LAMBDA_BE(operator!=, relational_action, const, const, const_copy_argument) +BOOST_LAMBDA_BE(operator+, arithmetic_action, const A, const B, const_copy_argument) +BOOST_LAMBDA_BE(operator-, arithmetic_action, const A, const B, const_copy_argument) +BOOST_LAMBDA_BE(operator*, arithmetic_action, const A, const B, const_copy_argument) +BOOST_LAMBDA_BE(operator/, arithmetic_action, const A, const B, const_copy_argument) +BOOST_LAMBDA_BE(operator%, arithmetic_action, const A, const B, const_copy_argument) +BOOST_LAMBDA_BE(operator<<, bitwise_action, const A, const B, const_copy_argument) +BOOST_LAMBDA_BE(operator>>, bitwise_action, const A, const B, const_copy_argument) +BOOST_LAMBDA_BE(operator&, bitwise_action, const A, const B, const_copy_argument) +BOOST_LAMBDA_BE(operator|, bitwise_action, const A, const B, const_copy_argument) +BOOST_LAMBDA_BE(operator^, bitwise_action, const A, const B, const_copy_argument) +BOOST_LAMBDA_BE(operator&&, logical_action, const A, const B, const_copy_argument) +BOOST_LAMBDA_BE(operator||, logical_action, const A, const B, const_copy_argument) +BOOST_LAMBDA_BE(operator<, relational_action, const A, const B, const_copy_argument) +BOOST_LAMBDA_BE(operator>, relational_action, const A, const B, const_copy_argument) +BOOST_LAMBDA_BE(operator<=, relational_action, const A, const B, const_copy_argument) +BOOST_LAMBDA_BE(operator>=, relational_action, const A, const B, const_copy_argument) +BOOST_LAMBDA_BE(operator==, relational_action, const A, const B, const_copy_argument) +BOOST_LAMBDA_BE(operator!=, relational_action, const A, const B, const_copy_argument) -BOOST_LAMBDA_BE(operator+=, arithmetic_assignment_action, , const, reference_argument) -BOOST_LAMBDA_BE(operator-=, arithmetic_assignment_action, , const, reference_argument) -BOOST_LAMBDA_BE(operator*=, arithmetic_assignment_action, , const, reference_argument) -BOOST_LAMBDA_BE(operator/=, arithmetic_assignment_action, , const, reference_argument) -BOOST_LAMBDA_BE(operator%=, arithmetic_assignment_action, , const, reference_argument) -BOOST_LAMBDA_BE(operator<<=, bitwise_assignment_action, , const, reference_argument) -BOOST_LAMBDA_BE(operator>>=, bitwise_assignment_action, , const, reference_argument) -BOOST_LAMBDA_BE(operator&=, bitwise_assignment_action, , const, reference_argument) -BOOST_LAMBDA_BE(operator|=, bitwise_assignment_action, , const, reference_argument) -BOOST_LAMBDA_BE(operator^=, bitwise_assignment_action, , const, reference_argument) +BOOST_LAMBDA_BE(operator+=, arithmetic_assignment_action, A, const B, reference_argument) +BOOST_LAMBDA_BE(operator-=, arithmetic_assignment_action, A, const B, reference_argument) +BOOST_LAMBDA_BE(operator*=, arithmetic_assignment_action, A, const B, reference_argument) +BOOST_LAMBDA_BE(operator/=, arithmetic_assignment_action, A, const B, reference_argument) +BOOST_LAMBDA_BE(operator%=, arithmetic_assignment_action, A, const B, reference_argument) +BOOST_LAMBDA_BE(operator<<=, bitwise_assignment_action, A, const B, reference_argument) +BOOST_LAMBDA_BE(operator>>=, bitwise_assignment_action, A, const B, reference_argument) +BOOST_LAMBDA_BE(operator&=, bitwise_assignment_action, A, const B, reference_argument) +BOOST_LAMBDA_BE(operator|=, bitwise_assignment_action, A, const B, reference_argument) +BOOST_LAMBDA_BE(operator^=, bitwise_assignment_action, A, const B, reference_argument) // A special trick for comma operator for correct preprocessing @@ -139,9 +149,9 @@ BOOST_LAMBDA_BE(operator^=, bitwise_assignment_action, , const, refe #define BOOST_LAMBDA_COMMA_OPERATOR_NAME operator, -BOOST_LAMBDA_BE1(BOOST_LAMBDA_COMMA_OPERATOR_NAME, other_action, const, const, const_copy_argument) -BOOST_LAMBDA_BE2(BOOST_LAMBDA_COMMA_OPERATOR_NAME, other_action, const, const, const_copy_argument) -BOOST_LAMBDA_BE3(BOOST_LAMBDA_COMMA_OPERATOR_NAME, other_action, const, const, const_copy_argument) +BOOST_LAMBDA_BE1(BOOST_LAMBDA_COMMA_OPERATOR_NAME, other_action, const A, const B, const_copy_argument) +BOOST_LAMBDA_BE2(BOOST_LAMBDA_COMMA_OPERATOR_NAME, other_action, const A, const B, const_copy_argument) +BOOST_LAMBDA_BE3(BOOST_LAMBDA_COMMA_OPERATOR_NAME, other_action, const A, const B, const_copy_argument) @@ -197,8 +207,8 @@ template struct convert_istream_to_ref_others_to_c_plain_by_default { } // detail -BOOST_LAMBDA_BE2(operator<<, bitwise_action< leftshift_action>, , const, detail::convert_ostream_to_ref_others_to_c_plain_by_default) -BOOST_LAMBDA_BE2(operator>>, bitwise_action< rightshift_action>, , const, detail::convert_istream_to_ref_others_to_c_plain_by_default) +BOOST_LAMBDA_BE2(operator<<, bitwise_action< leftshift_action>, A, const B, detail::convert_ostream_to_ref_others_to_c_plain_by_default) +BOOST_LAMBDA_BE2(operator>>, bitwise_action< rightshift_action>, A, const B, detail::convert_istream_to_ref_others_to_c_plain_by_default) // special case for io_manipulators. @@ -253,17 +263,17 @@ operator>>(const lambda_functor& a, Ret(&b)(ManipArg)) #error "Multiple defines of BOOST_LAMBDA_PTR_ARITHMETIC_E1" #endif -#define BOOST_LAMBDA_PTR_ARITHMETIC_E1(OPER_NAME, ACTION, CONST) \ +#define BOOST_LAMBDA_PTR_ARITHMETIC_E1(OPER_NAME, ACTION, CONSTB) \ template \ inline const \ lambda_functor< \ - lambda_functor_base, CONST B(&)[N]> > \ + lambda_functor_base, CONSTB(&)[N]> > \ > \ -OPER_NAME (const lambda_functor& a, CONST B(&b)[N]) \ +OPER_NAME (const lambda_functor& a, CONSTB(&b)[N]) \ { \ return lambda_functor< \ - lambda_functor_base, CONST B(&)[N]> > \ - >(tuple, CONST B(&)[N]>(a, b)); \ + lambda_functor_base, CONSTB(&)[N]> > \ + >(tuple, CONSTB(&)[N]>(a, b)); \ } @@ -271,31 +281,31 @@ OPER_NAME (const lambda_functor& a, CONST B(&b)[N]) \ #error "Multiple defines of BOOST_LAMBDA_PTR_ARITHMETIC_E2" #endif -#define BOOST_LAMBDA_PTR_ARITHMETIC_E2(OPER_NAME, ACTION, CONST) \ +#define BOOST_LAMBDA_PTR_ARITHMETIC_E2(OPER_NAME, ACTION, CONSTA) \ template \ inline const \ lambda_functor< \ - lambda_functor_base > > \ + lambda_functor_base > > \ > \ -OPER_NAME (CONST A(&a)[N], const lambda_functor& b) \ +OPER_NAME (CONSTA(&a)[N], const lambda_functor& b) \ { \ return \ - lambda_functor_base > > \ - (tuple >(a, b)); \ + lambda_functor_base > > \ + (tuple >(a, b)); \ } -BOOST_LAMBDA_PTR_ARITHMETIC_E1(operator+, arithmetic_action,) -BOOST_LAMBDA_PTR_ARITHMETIC_E2(operator+, arithmetic_action,) -BOOST_LAMBDA_PTR_ARITHMETIC_E1(operator+, arithmetic_action,const) -BOOST_LAMBDA_PTR_ARITHMETIC_E2(operator+, arithmetic_action,const) +BOOST_LAMBDA_PTR_ARITHMETIC_E1(operator+, arithmetic_action, B) +BOOST_LAMBDA_PTR_ARITHMETIC_E2(operator+, arithmetic_action, A) +BOOST_LAMBDA_PTR_ARITHMETIC_E1(operator+, arithmetic_action,const B) +BOOST_LAMBDA_PTR_ARITHMETIC_E2(operator+, arithmetic_action,const A) //BOOST_LAMBDA_PTR_ARITHMETIC_E1(operator-, arithmetic_action) // This is not needed, since the result of ptr-ptr is an rvalue anyway -BOOST_LAMBDA_PTR_ARITHMETIC_E2(operator-, arithmetic_action, ) -BOOST_LAMBDA_PTR_ARITHMETIC_E2(operator-, arithmetic_action, const) +BOOST_LAMBDA_PTR_ARITHMETIC_E2(operator-, arithmetic_action, A) +BOOST_LAMBDA_PTR_ARITHMETIC_E2(operator-, arithmetic_action, const A) #undef BOOST_LAMBDA_BE1