Add compound assignment operators

This commit is contained in:
Peter Dimov 2021-06-27 18:41:35 +03:00
parent 04367ac3e5
commit f3a3810be4
3 changed files with 57 additions and 0 deletions

View File

@ -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<class T> using remove_cvref_t = std::remove_cv_t<std::remove_reference_t<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

View File

@ -23,3 +23,4 @@ run dereference.cpp ;
run placeholders.cpp ;
run increment.cpp ;
run subscript.cpp ;
run compound.cpp ;

32
test/compound.cpp Normal file
View File

@ -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 <boost/lambda2.hpp>
#include <boost/core/lightweight_test.hpp>
#include <functional>
#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();
}