diff --git a/include/boost/lambda2/lambda2.hpp b/include/boost/lambda2/lambda2.hpp index dfd11f3..d450d9b 100644 --- a/include/boost/lambda2/lambda2.hpp +++ b/include/boost/lambda2/lambda2.hpp @@ -10,6 +10,7 @@ #include #include #include +#include // Same format as BOOST_VERSION: // major * 100000 + minor * 100 + patch @@ -201,9 +202,6 @@ BOOST_LAMBDA2_UNARY_LAMBDA(~, std::bit_not<>) // additional -BOOST_LAMBDA2_BINARY_LAMBDA(<<, lambda2_detail::left_shift) -BOOST_LAMBDA2_BINARY_LAMBDA(>>, lambda2_detail::right_shift) - BOOST_LAMBDA2_UNARY_LAMBDA(+, lambda2_detail::unary_plus) BOOST_LAMBDA2_UNARY_LAMBDA(*, lambda2_detail::dereference) @@ -226,6 +224,38 @@ 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) +// operator<< + +template::value>, + class B, class = lambda2_detail::enable_binary_lambda> +auto operator<<( A&& a, B&& b ) +{ + return std::bind( lambda2_detail::left_shift(), std::forward(a), std::forward(b) ); \ +} + +template::value>, + class B, class = lambda2_detail::enable_unary_lambda> +auto operator<<( A& a, B&& b ) +{ + return std::bind( lambda2_detail::left_shift(), std::ref(a), std::forward(b) ); +} + +// operator>> + +template::value>, + class B, class = lambda2_detail::enable_binary_lambda> +auto operator>>( A&& a, B&& b ) +{ + return std::bind( lambda2_detail::right_shift(), std::forward(a), std::forward(b) ); \ +} + +template::value>, + class B, class = lambda2_detail::enable_unary_lambda> +auto operator>>( A& a, B&& b ) +{ + return std::bind( lambda2_detail::right_shift(), std::ref(a), std::forward(b) ); +} + } // namespace lambda2 } // namespace boost diff --git a/test/Jamfile b/test/Jamfile index f86f8de..ac00c2e 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -24,3 +24,5 @@ run placeholders.cpp ; run increment.cpp ; run subscript.cpp ; run compound.cpp ; +run stream_insert.cpp ; +run stream_extract.cpp ; diff --git a/test/stream_extract.cpp b/test/stream_extract.cpp new file mode 100644 index 0000000..8ccc114 --- /dev/null +++ b/test/stream_extract.cpp @@ -0,0 +1,28 @@ +// Copyright 2021 Peter Dimov +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include +#include + +template T from_string( std::string const& s ) +{ + using namespace boost::lambda2; + + std::istringstream is( s ); + + T t{}; + + ( is >> _1 )( t ); + + return t; +} + +int main() +{ + BOOST_TEST_EQ( from_string( "123" ), 123 ); + + return boost::report_errors(); +} diff --git a/test/stream_insert.cpp b/test/stream_insert.cpp new file mode 100644 index 0000000..722091c --- /dev/null +++ b/test/stream_insert.cpp @@ -0,0 +1,26 @@ +// Copyright 2021 Peter Dimov +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include +#include + +template std::string to_string( T const& t ) +{ + using namespace boost::lambda2; + + std::ostringstream os; + + ( os << _1 )( t ); + + return os.str(); +} + +int main() +{ + BOOST_TEST_EQ( to_string( 123 ), "123" ); + + return boost::report_errors(); +}