diff --git a/include/boost/lambda2/lambda2.hpp b/include/boost/lambda2/lambda2.hpp index 56b3279..87d7c3f 100644 --- a/include/boost/lambda2/lambda2.hpp +++ b/include/boost/lambda2/lambda2.hpp @@ -97,6 +97,12 @@ BOOST_LAMBDA2_BINARY_FN(>>, right_shift) BOOST_LAMBDA2_UNARY_FN(+, unary_plus) BOOST_LAMBDA2_UNARY_FN(*, dereference) +BOOST_LAMBDA2_UNARY_FN(++, increment) +BOOST_LAMBDA2_UNARY_FN(--, decrement) + +BOOST_LAMBDA2_POSTFIX_FN(++, postfix_increment) +BOOST_LAMBDA2_POSTFIX_FN(--, postfix_decrement) + // operators template using remove_cvref_t = std::remove_cv_t>; @@ -119,6 +125,13 @@ template using enable_binary_lambda = return std::bind( fn(), std::forward(a) ); \ } +#define BOOST_LAMBDA2_POSTFIX_LAMBDA(op, fn) \ + template> \ + auto operator op( A&& a, int ) \ + { \ + return std::bind( fn(), std::forward(a) ); \ + } + #define BOOST_LAMBDA2_BINARY_LAMBDA(op, fn) \ template> \ auto operator op( A&& a, B&& b ) \ @@ -159,6 +172,12 @@ BOOST_LAMBDA2_BINARY_LAMBDA(>>, lambda2_detail::right_shift) BOOST_LAMBDA2_UNARY_LAMBDA(+, lambda2_detail::unary_plus) BOOST_LAMBDA2_UNARY_LAMBDA(*, lambda2_detail::dereference) +BOOST_LAMBDA2_UNARY_LAMBDA(++, lambda2_detail::increment) +BOOST_LAMBDA2_UNARY_LAMBDA(--, lambda2_detail::decrement) + +BOOST_LAMBDA2_POSTFIX_LAMBDA(++, lambda2_detail::postfix_increment) +BOOST_LAMBDA2_POSTFIX_LAMBDA(--, lambda2_detail::postfix_decrement) + } // namespace lambda2 } // namespace boost diff --git a/test/Jamfile b/test/Jamfile index c86f484..48d30cf 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -21,3 +21,4 @@ run version.cpp ; run lookup_problem.cpp ; run dereference.cpp ; run placeholders.cpp ; +run increment.cpp ; diff --git a/test/increment.cpp b/test/increment.cpp new file mode 100644 index 0000000..d36b55e --- /dev/null +++ b/test/increment.cpp @@ -0,0 +1,34 @@ +// Copyright 2021 Peter Dimov +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include + +int main() +{ + using namespace boost::lambda2; + + int x1 = 1, x2 = 2, y1 = 1, y2 = 2; + + BOOST_TEST_EQ( (_1++)(x1), y1++ ); + BOOST_TEST_EQ( (++_1)(x1), ++y1 ); + + BOOST_TEST_EQ( (_1--)(x1), y1-- ); + BOOST_TEST_EQ( (--_1)(x1), --y1 ); + + BOOST_TEST_EQ( (_1++ + _2++)(x1, x2), y1++ + y2++ ); + BOOST_TEST_EQ( (++_1 + ++_2)(x1, x2), ++y1 + ++y2 ); + + BOOST_TEST_EQ( (_1-- + _2--)(x1, x2), y1-- + y2-- ); + BOOST_TEST_EQ( (--_1 + --_2)(x1, x2), --y1 + --y2 ); + + BOOST_TEST_EQ( std::bind(_1 + _2, _1++, _2++)(x1, x2), y1++ + y2++ ); + BOOST_TEST_EQ( std::bind(_1 + _2, ++_1, ++_2)(x1, x2), ++y1 + ++y2 ); + + BOOST_TEST_EQ( std::bind(_1 + _2, _1--, _2--)(x1, x2), y1-- + y2-- ); + BOOST_TEST_EQ( std::bind(_1 + _2, --_1, --_2)(x1, x2), --y1 + --y2 ); + + return boost::report_errors(); +}