Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // Copyright 2012 John Maddock. Distributed under the Boost Chris@16: // Software License, Version 1.0. (See accompanying file Chris@16: // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_MP_NO_ET_OPS_HPP Chris@16: #define BOOST_MP_NO_ET_OPS_HPP Chris@16: Chris@16: #ifdef BOOST_MSVC Chris@16: #pragma warning(push) Chris@16: #pragma warning(disable: 4714) Chris@16: #endif Chris@16: Chris@16: namespace boost{ Chris@16: namespace multiprecision{ Chris@16: Chris@16: // Chris@16: // Operators for non-expression template enabled number. Chris@16: // NOTE: this is not a complete header - really just a suffix to default_ops.hpp. Chris@16: // NOTE: these operators have to be defined after the methods in default_ops.hpp. Chris@16: // Chris@16: template Chris@16: BOOST_MP_FORCEINLINE number operator - (const number& v) Chris@16: { Chris@16: BOOST_STATIC_ASSERT_MSG(is_signed_number::value, "Negating an unsigned type results in ill-defined behavior."); Chris@16: number result(v); Chris@16: result.backend().negate(); Chris@16: return BOOST_MP_MOVE(result); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE number operator ~ (const number& v) Chris@16: { Chris@16: number result; Chris@16: eval_complement(result.backend(), v.backend()); Chris@16: return BOOST_MP_MOVE(result); Chris@16: } Chris@16: // Chris@16: // Addition: Chris@16: // Chris@16: template Chris@16: BOOST_MP_FORCEINLINE number operator + (const number& a, const number& b) Chris@16: { Chris@16: number result; Chris@16: using default_ops::eval_add; Chris@16: eval_add(result.backend(), a.backend(), b.backend()); Chris@16: return BOOST_MP_MOVE(result); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if >, number >::type Chris@16: operator + (const number& a, const V& b) Chris@16: { Chris@16: number result; Chris@16: using default_ops::eval_add; Chris@16: eval_add(result.backend(), a.backend(), number::canonical_value(b)); Chris@16: return BOOST_MP_MOVE(result); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if >, number >::type Chris@16: operator + (const V& a, const number& b) Chris@16: { Chris@16: number result; Chris@16: using default_ops::eval_add; Chris@16: eval_add(result.backend(), b.backend(), number::canonical_value(a)); Chris@16: return BOOST_MP_MOVE(result); Chris@16: } Chris@16: // Chris@16: // Subtraction: Chris@16: // Chris@16: template Chris@16: BOOST_MP_FORCEINLINE number operator - (const number& a, const number& b) Chris@16: { Chris@16: number result; Chris@16: using default_ops::eval_subtract; Chris@16: eval_subtract(result.backend(), a.backend(), b.backend()); Chris@16: return BOOST_MP_MOVE(result); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if >, number >::type Chris@16: operator - (const number& a, const V& b) Chris@16: { Chris@16: number result; Chris@16: using default_ops::eval_subtract; Chris@16: eval_subtract(result.backend(), a.backend(), number::canonical_value(b)); Chris@16: return BOOST_MP_MOVE(result); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if >, number >::type Chris@16: operator - (const V& a, const number& b) Chris@16: { Chris@16: number result; Chris@16: using default_ops::eval_subtract; Chris@16: eval_subtract(result.backend(), number::canonical_value(a), b.backend()); Chris@16: return BOOST_MP_MOVE(result); Chris@16: } Chris@16: // Chris@16: // Multiply: Chris@16: // Chris@16: template Chris@16: BOOST_MP_FORCEINLINE number operator * (const number& a, const number& b) Chris@16: { Chris@16: number result; Chris@16: using default_ops::eval_multiply; Chris@16: eval_multiply(result.backend(), a.backend(), b.backend()); Chris@16: return BOOST_MP_MOVE(result); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if >, number >::type Chris@16: operator * (const number& a, const V& b) Chris@16: { Chris@16: number result; Chris@16: using default_ops::eval_multiply; Chris@16: eval_multiply(result.backend(), a.backend(), number::canonical_value(b)); Chris@16: return BOOST_MP_MOVE(result); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if >, number >::type Chris@16: operator * (const V& a, const number& b) Chris@16: { Chris@16: number result; Chris@16: using default_ops::eval_multiply; Chris@16: eval_multiply(result.backend(), b.backend(), number::canonical_value(a)); Chris@16: return BOOST_MP_MOVE(result); Chris@16: } Chris@16: // Chris@16: // divide: Chris@16: // Chris@16: template Chris@16: BOOST_MP_FORCEINLINE number operator / (const number& a, const number& b) Chris@16: { Chris@16: number result; Chris@16: using default_ops::eval_divide; Chris@16: eval_divide(result.backend(), a.backend(), b.backend()); Chris@16: return BOOST_MP_MOVE(result); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if >, number >::type Chris@16: operator / (const number& a, const V& b) Chris@16: { Chris@16: number result; Chris@16: using default_ops::eval_divide; Chris@16: eval_divide(result.backend(), a.backend(), number::canonical_value(b)); Chris@16: return BOOST_MP_MOVE(result); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if >, number >::type Chris@16: operator / (const V& a, const number& b) Chris@16: { Chris@16: number result; Chris@16: using default_ops::eval_divide; Chris@16: eval_divide(result.backend(), number::canonical_value(a), b.backend()); Chris@16: return BOOST_MP_MOVE(result); Chris@16: } Chris@16: // Chris@16: // modulus: Chris@16: // Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if_c::value == number_kind_integer, number >::type operator % (const number& a, const number& b) Chris@16: { Chris@16: number result; Chris@16: using default_ops::eval_modulus; Chris@16: eval_modulus(result.backend(), a.backend(), b.backend()); Chris@16: return BOOST_MP_MOVE(result); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if_c >::value && (number_category::value == number_kind_integer), number >::type Chris@16: operator % (const number& a, const V& b) Chris@16: { Chris@16: number result; Chris@16: using default_ops::eval_modulus; Chris@16: eval_modulus(result.backend(), a.backend(), number::canonical_value(b)); Chris@16: return BOOST_MP_MOVE(result); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if_c >::value && (number_category::value == number_kind_integer), number >::type Chris@16: operator % (const V& a, const number& b) Chris@16: { Chris@16: number result; Chris@16: using default_ops::eval_modulus; Chris@16: eval_modulus(result.backend(), number::canonical_value(a), b.backend()); Chris@16: return BOOST_MP_MOVE(result); Chris@16: } Chris@16: // Chris@16: // Bitwise or: Chris@16: // Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if_c::value == number_kind_integer, number >::type operator | (const number& a, const number& b) Chris@16: { Chris@16: number result; Chris@16: using default_ops::eval_bitwise_or; Chris@16: eval_bitwise_or(result.backend(), a.backend(), b.backend()); Chris@16: return BOOST_MP_MOVE(result); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if_c >::value && (number_category::value == number_kind_integer), number >::type Chris@16: operator | (const number& a, const V& b) Chris@16: { Chris@16: number result; Chris@16: using default_ops::eval_bitwise_or; Chris@16: eval_bitwise_or(result.backend(), a.backend(), number::canonical_value(b)); Chris@16: return BOOST_MP_MOVE(result); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if_c >::value && (number_category::value == number_kind_integer), number >::type Chris@16: operator | (const V& a, const number& b) Chris@16: { Chris@16: number result; Chris@16: using default_ops::eval_bitwise_or; Chris@16: eval_bitwise_or(result.backend(), b.backend(), number::canonical_value(a)); Chris@16: return BOOST_MP_MOVE(result); Chris@16: } Chris@16: // Chris@16: // Bitwise xor: Chris@16: // Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if_c::value == number_kind_integer, number >::type operator ^ (const number& a, const number& b) Chris@16: { Chris@16: number result; Chris@16: using default_ops::eval_bitwise_xor; Chris@16: eval_bitwise_xor(result.backend(), a.backend(), b.backend()); Chris@16: return BOOST_MP_MOVE(result); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if_c >::value && (number_category::value == number_kind_integer), number >::type Chris@16: operator ^ (const number& a, const V& b) Chris@16: { Chris@16: number result; Chris@16: using default_ops::eval_bitwise_xor; Chris@16: eval_bitwise_xor(result.backend(), a.backend(), number::canonical_value(b)); Chris@16: return BOOST_MP_MOVE(result); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if_c >::value && (number_category::value == number_kind_integer), number >::type Chris@16: operator ^ (const V& a, const number& b) Chris@16: { Chris@16: number result; Chris@16: using default_ops::eval_bitwise_xor; Chris@16: eval_bitwise_xor(result.backend(), b.backend(), number::canonical_value(a)); Chris@16: return BOOST_MP_MOVE(result); Chris@16: } Chris@16: // Chris@16: // Bitwise and: Chris@16: // Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if_c::value == number_kind_integer, number >::type operator & (const number& a, const number& b) Chris@16: { Chris@16: number result; Chris@16: using default_ops::eval_bitwise_and; Chris@16: eval_bitwise_and(result.backend(), a.backend(), b.backend()); Chris@16: return BOOST_MP_MOVE(result); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if_c >::value && (number_category::value == number_kind_integer), number >::type Chris@16: operator & (const number& a, const V& b) Chris@16: { Chris@16: number result; Chris@16: using default_ops::eval_bitwise_and; Chris@16: eval_bitwise_and(result.backend(), a.backend(), number::canonical_value(b)); Chris@16: return BOOST_MP_MOVE(result); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if_c >::value && (number_category::value == number_kind_integer), number >::type Chris@16: operator & (const V& a, const number& b) Chris@16: { Chris@16: number result; Chris@16: using default_ops::eval_bitwise_and; Chris@16: eval_bitwise_and(result.backend(), b.backend(), number::canonical_value(a)); Chris@16: return BOOST_MP_MOVE(result); Chris@16: } Chris@16: // Chris@16: // shifts: Chris@16: // Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if_c::value && (number_category::value == number_kind_integer), number >::type Chris@16: operator << (const number& a, const I& b) Chris@16: { Chris@16: number result(a); Chris@16: using default_ops::eval_left_shift; Chris@16: detail::check_shift_range(b, mpl::bool_<(sizeof(I) > sizeof(std::size_t))>(), is_signed()); Chris@16: eval_left_shift(result.backend(), b); Chris@16: return BOOST_MP_MOVE(result); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if_c::value && (number_category::value == number_kind_integer), number >::type Chris@16: operator >> (const number& a, const I& b) Chris@16: { Chris@16: number result(a); Chris@16: using default_ops::eval_right_shift; Chris@16: detail::check_shift_range(b, mpl::bool_<(sizeof(I) > sizeof(std::size_t))>(), is_signed()); Chris@16: eval_right_shift(result.backend(), b); Chris@16: return BOOST_MP_MOVE(result); Chris@16: } Chris@16: Chris@16: #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !(defined(__GNUC__) && ((__GNUC__ == 4) && (__GNUC_MINOR__ < 5))) Chris@16: // Chris@16: // If we have rvalue references go all over again with rvalue ref overloads and move semantics. Chris@16: // Note that while it would be tempting to implement these so they return an rvalue reference Chris@16: // (and indeed this would be optimally efficient), this is unsafe due to users propensity to Chris@16: // write: Chris@16: // Chris@16: // const T& t = a * b; Chris@16: // Chris@16: // which would lead to a dangling reference if we didn't return by value. Of course move Chris@16: // semantics help a great deal in return by value, so performance is still pretty good... Chris@16: // Chris@16: template Chris@16: BOOST_MP_FORCEINLINE number operator - (number&& v) Chris@16: { Chris@16: BOOST_STATIC_ASSERT_MSG(is_signed_number::value, "Negating an unsigned type results in ill-defined behavior."); Chris@16: v.backend().negate(); Chris@16: return static_cast&&>(v); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if_c::value == number_kind_integer, number >::type operator ~ (number&& v) Chris@16: { Chris@16: eval_complement(v.backend(), v.backend()); Chris@16: return static_cast&&>(v); Chris@16: } Chris@16: // Chris@16: // Addition: Chris@16: // Chris@16: template Chris@16: BOOST_MP_FORCEINLINE number operator + (number&& a, const number& b) Chris@16: { Chris@16: using default_ops::eval_add; Chris@16: eval_add(a.backend(), b.backend()); Chris@16: return static_cast&&>(a); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE number operator + (const number& a, number&& b) Chris@16: { Chris@16: using default_ops::eval_add; Chris@16: eval_add(b.backend(), a.backend()); Chris@16: return static_cast&&>(b); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE number operator + (number&& a, number&& b) Chris@16: { Chris@16: using default_ops::eval_add; Chris@16: eval_add(a.backend(), b.backend()); Chris@16: return static_cast&&>(a); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if >, number >::type Chris@16: operator + (number&& a, const V& b) Chris@16: { Chris@16: using default_ops::eval_add; Chris@16: eval_add(a.backend(), number::canonical_value(b)); Chris@16: return static_cast&&>(a); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if >, number >::type Chris@16: operator + (const V& a, number&& b) Chris@16: { Chris@16: using default_ops::eval_add; Chris@16: eval_add(b.backend(), number::canonical_value(a)); Chris@16: return static_cast&&>(b); Chris@16: } Chris@16: // Chris@16: // Subtraction: Chris@16: // Chris@16: template Chris@16: BOOST_MP_FORCEINLINE number operator - (number&& a, const number& b) Chris@16: { Chris@16: using default_ops::eval_subtract; Chris@16: eval_subtract(a.backend(), b.backend()); Chris@16: return static_cast&&>(a); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if, number >::type operator - (const number& a, number&& b) Chris@16: { Chris@16: using default_ops::eval_subtract; Chris@16: eval_subtract(b.backend(), a.backend()); Chris@16: b.backend().negate(); Chris@16: return static_cast&&>(b); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE number operator - (number&& a, number&& b) Chris@16: { Chris@16: using default_ops::eval_subtract; Chris@16: eval_subtract(a.backend(), b.backend()); Chris@16: return static_cast&&>(a); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if >, number >::type Chris@16: operator - (number&& a, const V& b) Chris@16: { Chris@16: using default_ops::eval_subtract; Chris@16: eval_subtract(a.backend(), number::canonical_value(b)); Chris@16: return static_cast&&>(a); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if_c<(is_compatible_arithmetic_type >::value && is_signed_number::value), number >::type Chris@16: operator - (const V& a, number&& b) Chris@16: { Chris@16: using default_ops::eval_subtract; Chris@16: eval_subtract(b.backend(), number::canonical_value(a)); Chris@16: b.backend().negate(); Chris@16: return static_cast&&>(b); Chris@16: } Chris@16: // Chris@16: // Multiply: Chris@16: // Chris@16: template Chris@16: BOOST_MP_FORCEINLINE number operator * (number&& a, const number& b) Chris@16: { Chris@16: using default_ops::eval_multiply; Chris@16: eval_multiply(a.backend(), b.backend()); Chris@16: return static_cast&&>(a); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE number operator * (const number& a, number&& b) Chris@16: { Chris@16: using default_ops::eval_multiply; Chris@16: eval_multiply(b.backend(), a.backend()); Chris@16: return static_cast&&>(b); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE number operator * (number&& a, number&& b) Chris@16: { Chris@16: using default_ops::eval_multiply; Chris@16: eval_multiply(a.backend(), b.backend()); Chris@16: return static_cast&&>(a); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if >, number >::type Chris@16: operator * (number&& a, const V& b) Chris@16: { Chris@16: using default_ops::eval_multiply; Chris@16: eval_multiply(a.backend(), number::canonical_value(b)); Chris@16: return static_cast&&>(a); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if >, number >::type Chris@16: operator * (const V& a, number&& b) Chris@16: { Chris@16: using default_ops::eval_multiply; Chris@16: eval_multiply(b.backend(), number::canonical_value(a)); Chris@16: return static_cast&&>(b); Chris@16: } Chris@16: // Chris@16: // divide: Chris@16: // Chris@16: template Chris@16: BOOST_MP_FORCEINLINE number operator / (number&& a, const number& b) Chris@16: { Chris@16: using default_ops::eval_divide; Chris@16: eval_divide(a.backend(), b.backend()); Chris@16: return static_cast&&>(a); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if >, number >::type Chris@16: operator / (number&& a, const V& b) Chris@16: { Chris@16: using default_ops::eval_divide; Chris@16: eval_divide(a.backend(), number::canonical_value(b)); Chris@16: return static_cast&&>(a); Chris@16: } Chris@16: // Chris@16: // modulus: Chris@16: // Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if_c::value == number_kind_integer, number >::type operator % (number&& a, const number& b) Chris@16: { Chris@16: using default_ops::eval_modulus; Chris@16: eval_modulus(a.backend(), b.backend()); Chris@16: return static_cast&&>(a); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if_c >::value && (number_category::value == number_kind_integer), number >::type Chris@16: operator % (number&& a, const V& b) Chris@16: { Chris@16: using default_ops::eval_modulus; Chris@16: eval_modulus(a.backend(), number::canonical_value(b)); Chris@16: return static_cast&&>(a); Chris@16: } Chris@16: // Chris@16: // Bitwise or: Chris@16: // Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if_c::value == number_kind_integer, number >::type operator | (number&& a, const number& b) Chris@16: { Chris@16: using default_ops::eval_bitwise_or; Chris@16: eval_bitwise_or(a.backend(), b.backend()); Chris@16: return static_cast&&>(a); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if_c::value == number_kind_integer, number >::type operator | (const number& a, number&& b) Chris@16: { Chris@16: using default_ops::eval_bitwise_or; Chris@16: eval_bitwise_or(b.backend(), a.backend()); Chris@16: return static_cast&&>(b); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if_c::value == number_kind_integer, number >::type operator | (number&& a, number&& b) Chris@16: { Chris@16: using default_ops::eval_bitwise_or; Chris@16: eval_bitwise_or(a.backend(), b.backend()); Chris@16: return static_cast&&>(a); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if_c >::value && (number_category::value == number_kind_integer), number >::type Chris@16: operator | (number&& a, const V& b) Chris@16: { Chris@16: using default_ops::eval_bitwise_or; Chris@16: eval_bitwise_or(a.backend(), number::canonical_value(b)); Chris@16: return static_cast&&>(a); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if_c >::value && (number_category::value == number_kind_integer), number >::type Chris@16: operator | (const V& a, number&& b) Chris@16: { Chris@16: using default_ops::eval_bitwise_or; Chris@16: eval_bitwise_or(b.backend(), number::canonical_value(a)); Chris@16: return static_cast&&>(b); Chris@16: } Chris@16: // Chris@16: // Bitwise xor: Chris@16: // Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if_c::value == number_kind_integer, number >::type operator ^ (number&& a, const number& b) Chris@16: { Chris@16: using default_ops::eval_bitwise_xor; Chris@16: eval_bitwise_xor(a.backend(), b.backend()); Chris@16: return static_cast&&>(a); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if_c::value == number_kind_integer, number >::type operator ^ (const number& a, number&& b) Chris@16: { Chris@16: using default_ops::eval_bitwise_xor; Chris@16: eval_bitwise_xor(b.backend(), a.backend()); Chris@16: return static_cast&&>(b); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if_c::value == number_kind_integer, number >::type operator ^ (number&& a, number&& b) Chris@16: { Chris@16: using default_ops::eval_bitwise_xor; Chris@16: eval_bitwise_xor(a.backend(), b.backend()); Chris@16: return static_cast&&>(a); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if_c >::value && (number_category::value == number_kind_integer), number >::type Chris@16: operator ^ (number&& a, const V& b) Chris@16: { Chris@16: using default_ops::eval_bitwise_xor; Chris@16: eval_bitwise_xor(a.backend(), number::canonical_value(b)); Chris@16: return static_cast&&>(a); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if_c >::value && (number_category::value == number_kind_integer), number >::type Chris@16: operator ^ (const V& a, number&& b) Chris@16: { Chris@16: using default_ops::eval_bitwise_xor; Chris@16: eval_bitwise_xor(b.backend(), number::canonical_value(a)); Chris@16: return static_cast&&>(b); Chris@16: } Chris@16: // Chris@16: // Bitwise and: Chris@16: // Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if_c::value == number_kind_integer, number >::type operator & (number&& a, const number& b) Chris@16: { Chris@16: using default_ops::eval_bitwise_and; Chris@16: eval_bitwise_and(a.backend(), b.backend()); Chris@16: return static_cast&&>(a); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if_c::value == number_kind_integer, number >::type operator & (const number& a, number&& b) Chris@16: { Chris@16: using default_ops::eval_bitwise_and; Chris@16: eval_bitwise_and(b.backend(), a.backend()); Chris@16: return static_cast&&>(b); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if_c::value == number_kind_integer, number >::type operator & (number&& a, number&& b) Chris@16: { Chris@16: using default_ops::eval_bitwise_and; Chris@16: eval_bitwise_and(a.backend(), b.backend()); Chris@16: return static_cast&&>(a); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if_c >::value && (number_category::value == number_kind_integer), number >::type Chris@16: operator & (number&& a, const V& b) Chris@16: { Chris@16: using default_ops::eval_bitwise_and; Chris@16: eval_bitwise_and(a.backend(), number::canonical_value(b)); Chris@16: return static_cast&&>(a); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if_c >::value && (number_category::value == number_kind_integer), number >::type Chris@16: operator & (const V& a, number&& b) Chris@16: { Chris@16: using default_ops::eval_bitwise_and; Chris@16: eval_bitwise_and(b.backend(), number::canonical_value(a)); Chris@16: return static_cast&&>(b); Chris@16: } Chris@16: // Chris@16: // shifts: Chris@16: // Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if_c::value && (number_category::value == number_kind_integer), number >::type Chris@16: operator << (number&& a, const I& b) Chris@16: { Chris@16: using default_ops::eval_left_shift; Chris@16: eval_left_shift(a.backend(), b); Chris@16: return static_cast&&>(a); Chris@16: } Chris@16: template Chris@16: BOOST_MP_FORCEINLINE typename enable_if_c::value && (number_category::value == number_kind_integer), number >::type Chris@16: operator >> (number&& a, const I& b) Chris@16: { Chris@16: using default_ops::eval_right_shift; Chris@16: eval_right_shift(a.backend(), b); Chris@16: return static_cast&&>(a); Chris@16: } Chris@16: Chris@16: #endif Chris@16: Chris@16: }} // namespaces Chris@16: Chris@16: #ifdef BOOST_MSVC Chris@16: #pragma warning(pop) Chris@16: #endif Chris@16: Chris@16: #endif // BOOST_MP_NO_ET_OPS_HPP