2
0
mirror of https://github.com/boostorg/lambda2.git synced 2026-01-31 08:12:26 +00:00

Special-case streams in operator<< and operator>>

This commit is contained in:
Peter Dimov
2021-09-05 01:50:37 +03:00
parent 3a06c98e8d
commit e2251ab450
4 changed files with 89 additions and 3 deletions

View File

@@ -10,6 +10,7 @@
#include <utility>
#include <tuple>
#include <cstddef>
#include <iosfwd>
// 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<class A, class = std::enable_if_t<!std::is_convertible<A&, std::ios_base&>::value>,
class B, class = lambda2_detail::enable_binary_lambda<A, B>>
auto operator<<( A&& a, B&& b )
{
return std::bind( lambda2_detail::left_shift(), std::forward<A>(a), std::forward<B>(b) ); \
}
template<class A, class = std::enable_if_t<std::is_convertible<A&, std::ios_base&>::value>,
class B, class = lambda2_detail::enable_unary_lambda<B>>
auto operator<<( A& a, B&& b )
{
return std::bind( lambda2_detail::left_shift(), std::ref(a), std::forward<B>(b) );
}
// operator>>
template<class A, class = std::enable_if_t<!std::is_convertible<A&, std::ios_base&>::value>,
class B, class = lambda2_detail::enable_binary_lambda<A, B>>
auto operator>>( A&& a, B&& b )
{
return std::bind( lambda2_detail::right_shift(), std::forward<A>(a), std::forward<B>(b) ); \
}
template<class A, class = std::enable_if_t<std::is_convertible<A&, std::ios_base&>::value>,
class B, class = lambda2_detail::enable_unary_lambda<B>>
auto operator>>( A& a, B&& b )
{
return std::bind( lambda2_detail::right_shift(), std::ref(a), std::forward<B>(b) );
}
} // namespace lambda2
} // namespace boost