diff --git a/include/boost/lambda2/lambda2.hpp b/include/boost/lambda2/lambda2.hpp index d5093dc..4c4577d 100644 --- a/include/boost/lambda2/lambda2.hpp +++ b/include/boost/lambda2/lambda2.hpp @@ -127,6 +127,17 @@ BOOST_LAMBDA2_UNARY_FN(--, decrement) BOOST_LAMBDA2_POSTFIX_FN(++, postfix_increment) BOOST_LAMBDA2_POSTFIX_FN(--, postfix_decrement) +BOOST_LAMBDA2_BINARY_FN(+=, plus_equal) +BOOST_LAMBDA2_BINARY_FN(-=, minus_equal) +BOOST_LAMBDA2_BINARY_FN(*=, multiplies_equal) +BOOST_LAMBDA2_BINARY_FN(/=, divides_equal) +BOOST_LAMBDA2_BINARY_FN(%=, modulus_equal) +BOOST_LAMBDA2_BINARY_FN(&=, bit_and_equal) +BOOST_LAMBDA2_BINARY_FN(|=, bit_or_equal) +BOOST_LAMBDA2_BINARY_FN(^=, bit_xor_equal) +BOOST_LAMBDA2_BINARY_FN(<<=, left_shift_equal) +BOOST_LAMBDA2_BINARY_FN(>>=, right_shift_equal) + // operators template using remove_cvref_t = std::remove_cv_t>; @@ -202,6 +213,19 @@ BOOST_LAMBDA2_UNARY_LAMBDA(--, lambda2_detail::decrement) BOOST_LAMBDA2_POSTFIX_LAMBDA(++, lambda2_detail::postfix_increment) BOOST_LAMBDA2_POSTFIX_LAMBDA(--, lambda2_detail::postfix_decrement) +// compound assignment + +BOOST_LAMBDA2_BINARY_LAMBDA(+=, lambda2_detail::plus_equal) +BOOST_LAMBDA2_BINARY_LAMBDA(-=, lambda2_detail::minus_equal) +BOOST_LAMBDA2_BINARY_LAMBDA(*=, lambda2_detail::multiplies_equal) +BOOST_LAMBDA2_BINARY_LAMBDA(/=, lambda2_detail::divides_equal) +BOOST_LAMBDA2_BINARY_LAMBDA(%=, lambda2_detail::modulus_equal) +BOOST_LAMBDA2_BINARY_LAMBDA(&=, lambda2_detail::bit_and_equal) +BOOST_LAMBDA2_BINARY_LAMBDA(|=, lambda2_detail::bit_or_equal) +BOOST_LAMBDA2_BINARY_LAMBDA(^=, lambda2_detail::bit_xor_equal) +BOOST_LAMBDA2_BINARY_LAMBDA(<<=, lambda2_detail::left_shift_equal) +BOOST_LAMBDA2_BINARY_LAMBDA(>>=, lambda2_detail::right_shift_equal) + } // namespace lambda2 } // namespace boost diff --git a/test/Jamfile b/test/Jamfile index 1177288..f86f8de 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -23,3 +23,4 @@ run dereference.cpp ; run placeholders.cpp ; run increment.cpp ; run subscript.cpp ; +run compound.cpp ; diff --git a/test/compound.cpp b/test/compound.cpp new file mode 100644 index 0000000..3e63ef7 --- /dev/null +++ b/test/compound.cpp @@ -0,0 +1,32 @@ +// Copyright 2021 Peter Dimov +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include + +#define TEST_COMPOUND(Op) \ + BOOST_TEST_EQ( (_1 Op 1)(x1), y1 Op 1 ); \ + BOOST_TEST_EQ( (_1 Op _2)(x1, x2), y1 Op y2 ); \ + BOOST_TEST_EQ( ((_1 Op _2) Op _3)(x1, x2, x3), (y1 Op y2) Op y3 ); + +int main() +{ + using namespace boost::lambda2; + + int x1 = 1, x2 = 2, x3 = 3, y1 = 1, y2 = 2, y3 = 3; + + TEST_COMPOUND(+=) + TEST_COMPOUND(-=) + TEST_COMPOUND(*=) + TEST_COMPOUND(/=) + TEST_COMPOUND(%=) + TEST_COMPOUND(&=) + TEST_COMPOUND(|=) + TEST_COMPOUND(^=) + TEST_COMPOUND(<<=) + TEST_COMPOUND(>>=) + + return boost::report_errors(); +}