Merge pull request #49 from Ben10do/feature/forwarding-references

Use forwarding references in string/split.hpp
This commit is contained in:
Marshall Clow
2019-07-03 07:54:40 -07:00
committed by GitHub
3 changed files with 59 additions and 0 deletions

View File

@ -71,7 +71,11 @@ namespace boost {
inline SequenceSequenceT& inline SequenceSequenceT&
iter_find( iter_find(
SequenceSequenceT& Result, SequenceSequenceT& Result,
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
RangeT&& Input,
#else
RangeT& Input, RangeT& Input,
#endif
FinderT Finder ) FinderT Finder )
{ {
BOOST_CONCEPT_ASSERT(( BOOST_CONCEPT_ASSERT((
@ -142,7 +146,11 @@ namespace boost {
inline SequenceSequenceT& inline SequenceSequenceT&
iter_split( iter_split(
SequenceSequenceT& Result, SequenceSequenceT& Result,
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
RangeT&& Input,
#else
RangeT& Input, RangeT& Input,
#endif
FinderT Finder ) FinderT Finder )
{ {
BOOST_CONCEPT_ASSERT(( BOOST_CONCEPT_ASSERT((

View File

@ -61,7 +61,11 @@ namespace boost {
template< typename SequenceSequenceT, typename Range1T, typename Range2T > template< typename SequenceSequenceT, typename Range1T, typename Range2T >
inline SequenceSequenceT& find_all( inline SequenceSequenceT& find_all(
SequenceSequenceT& Result, SequenceSequenceT& Result,
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
Range1T&& Input,
#else
Range1T& Input, Range1T& Input,
#endif
const Range2T& Search) const Range2T& Search)
{ {
return ::boost::algorithm::iter_find( return ::boost::algorithm::iter_find(
@ -96,7 +100,11 @@ namespace boost {
template< typename SequenceSequenceT, typename Range1T, typename Range2T > template< typename SequenceSequenceT, typename Range1T, typename Range2T >
inline SequenceSequenceT& ifind_all( inline SequenceSequenceT& ifind_all(
SequenceSequenceT& Result, SequenceSequenceT& Result,
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
Range1T&& Input,
#else
Range1T& Input, Range1T& Input,
#endif
const Range2T& Search, const Range2T& Search,
const std::locale& Loc=std::locale() ) const std::locale& Loc=std::locale() )
{ {
@ -139,7 +147,11 @@ namespace boost {
template< typename SequenceSequenceT, typename RangeT, typename PredicateT > template< typename SequenceSequenceT, typename RangeT, typename PredicateT >
inline SequenceSequenceT& split( inline SequenceSequenceT& split(
SequenceSequenceT& Result, SequenceSequenceT& Result,
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
RangeT&& Input,
#else
RangeT& Input, RangeT& Input,
#endif
PredicateT Pred, PredicateT Pred,
token_compress_mode_type eCompress=token_compress_off ) token_compress_mode_type eCompress=token_compress_off )
{ {

View File

@ -7,6 +7,8 @@
// See http://www.boost.org for updates, documentation, and revision history. // See http://www.boost.org for updates, documentation, and revision history.
#include <boost/algorithm/string/config.hpp>
#include <boost/algorithm/string/split.hpp> #include <boost/algorithm/string/split.hpp>
#include <boost/algorithm/string/classification.hpp> #include <boost/algorithm/string/classification.hpp>
// equals predicate is used for result comparison // equals predicate is used for result comparison
@ -82,6 +84,28 @@ void iterator_test()
string("xx") ); string("xx") );
deep_compare( tokens, vtokens ); deep_compare( tokens, vtokens );
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
// If using a compiler that supports forwarding references, we should be able to use rvalues, too
find_all(
tokens,
string("xx-abc--xx-abb"),
"xx" );
BOOST_REQUIRE( tokens.size()==2 );
BOOST_CHECK( tokens[0]==string("xx") );
BOOST_CHECK( tokens[1]==string("xx") );
ifind_all(
tokens,
string("Xx-abc--xX-abb-xx"),
"xx" );
BOOST_REQUIRE( tokens.size()==3 );
BOOST_CHECK( tokens[0]==string("Xx") );
BOOST_CHECK( tokens[1]==string("xX") );
BOOST_CHECK( tokens[2]==string("xx") );
#endif
// split tests // split tests
split( split(
tokens, tokens,
@ -144,6 +168,21 @@ void iterator_test()
BOOST_REQUIRE( tokens.size()==1 ); BOOST_REQUIRE( tokens.size()==1 );
BOOST_CHECK( tokens[0]==string("") ); BOOST_CHECK( tokens[0]==string("") );
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
// If using a compiler that supports forwarding references, we should be able to use rvalues, too
split(
tokens,
string("Xx-abc--xX-abb-xx"),
is_any_of("xX"),
token_compress_on );
BOOST_REQUIRE( tokens.size()==4 );
BOOST_CHECK( tokens[0]==string("") );
BOOST_CHECK( tokens[1]==string("-abc--") );
BOOST_CHECK( tokens[2]==string("-abb-") );
BOOST_CHECK( tokens[3]==string("") );
#endif
find_iterator<string::iterator> fiter=make_find_iterator(str1, first_finder("xx")); find_iterator<string::iterator> fiter=make_find_iterator(str1, first_finder("xx"));
find_iterator<string::iterator> fiter2; find_iterator<string::iterator> fiter2;