mirror of
https://github.com/boostorg/lambda2.git
synced 2025-05-11 21:53:58 +00:00
Special-case streams in operator<< and operator>>
This commit is contained in:
parent
3a06c98e8d
commit
e2251ab450
@ -10,6 +10,7 @@
|
|||||||
#include <utility>
|
#include <utility>
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
|
#include <iosfwd>
|
||||||
|
|
||||||
// Same format as BOOST_VERSION:
|
// Same format as BOOST_VERSION:
|
||||||
// major * 100000 + minor * 100 + patch
|
// major * 100000 + minor * 100 + patch
|
||||||
@ -201,9 +202,6 @@ BOOST_LAMBDA2_UNARY_LAMBDA(~, std::bit_not<>)
|
|||||||
|
|
||||||
// additional
|
// 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::unary_plus)
|
||||||
BOOST_LAMBDA2_UNARY_LAMBDA(*, lambda2_detail::dereference)
|
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::left_shift_equal)
|
||||||
BOOST_LAMBDA2_BINARY_LAMBDA(>>=, lambda2_detail::right_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 lambda2
|
||||||
} // namespace boost
|
} // namespace boost
|
||||||
|
|
||||||
|
@ -24,3 +24,5 @@ run placeholders.cpp ;
|
|||||||
run increment.cpp ;
|
run increment.cpp ;
|
||||||
run subscript.cpp ;
|
run subscript.cpp ;
|
||||||
run compound.cpp ;
|
run compound.cpp ;
|
||||||
|
run stream_insert.cpp ;
|
||||||
|
run stream_extract.cpp ;
|
||||||
|
28
test/stream_extract.cpp
Normal file
28
test/stream_extract.cpp
Normal file
@ -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 <boost/lambda2.hpp>
|
||||||
|
#include <boost/core/lightweight_test.hpp>
|
||||||
|
#include <sstream>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
template<class T> 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<int>( "123" ), 123 );
|
||||||
|
|
||||||
|
return boost::report_errors();
|
||||||
|
}
|
26
test/stream_insert.cpp
Normal file
26
test/stream_insert.cpp
Normal file
@ -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 <boost/lambda2.hpp>
|
||||||
|
#include <boost/core/lightweight_test.hpp>
|
||||||
|
#include <sstream>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
template<class T> 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();
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user