You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
145 lines
4.9 KiB
145 lines
4.9 KiB
// Boost string_algo library join.hpp header file ---------------------------// |
|
|
|
// Copyright Pavol Droba 2002-2006. |
|
// |
|
// Distributed under the Boost Software License, Version 1.0. |
|
// (See accompanying file LICENSE_1_0.txt or copy at |
|
// http://www.boost.org/LICENSE_1_0.txt) |
|
|
|
// See http://www.boost.org/ for updates, documentation, and revision history. |
|
|
|
#ifndef BOOST_STRING_JOIN_HPP |
|
#define BOOST_STRING_JOIN_HPP |
|
|
|
#include <boost/algorithm/string/config.hpp> |
|
#include <boost/algorithm/string/detail/sequence.hpp> |
|
#include <boost/range/value_type.hpp> |
|
#include <boost/range/as_literal.hpp> |
|
|
|
/*! \file |
|
Defines join algorithm. |
|
|
|
Join algorithm is a counterpart to split algorithms. |
|
It joins strings from a 'list' by adding user defined separator. |
|
Additionally there is a version that allows simple filtering |
|
by providing a predicate. |
|
*/ |
|
|
|
namespace boost { |
|
namespace algorithm { |
|
|
|
// join --------------------------------------------------------------// |
|
|
|
//! Join algorithm |
|
/*! |
|
This algorithm joins all strings in a 'list' into one long string. |
|
Segments are concatenated by given separator. |
|
|
|
\param Input A container that holds the input strings. It must be a container-of-containers. |
|
\param Separator A string that will separate the joined segments. |
|
\return Concatenated string. |
|
|
|
\note This function provides the strong exception-safety guarantee |
|
*/ |
|
template< typename SequenceSequenceT, typename Range1T> |
|
inline typename range_value<SequenceSequenceT>::type |
|
join( |
|
const SequenceSequenceT& Input, |
|
const Range1T& Separator) |
|
{ |
|
// Define working types |
|
typedef typename range_value<SequenceSequenceT>::type ResultT; |
|
typedef typename range_const_iterator<SequenceSequenceT>::type InputIteratorT; |
|
|
|
// Parse input |
|
InputIteratorT itBegin=::boost::begin(Input); |
|
InputIteratorT itEnd=::boost::end(Input); |
|
|
|
// Construct container to hold the result |
|
ResultT Result; |
|
|
|
// Append first element |
|
if(itBegin!=itEnd) |
|
{ |
|
detail::insert(Result, ::boost::end(Result), *itBegin); |
|
++itBegin; |
|
} |
|
|
|
for(;itBegin!=itEnd; ++itBegin) |
|
{ |
|
// Add separator |
|
detail::insert(Result, ::boost::end(Result), ::boost::as_literal(Separator)); |
|
// Add element |
|
detail::insert(Result, ::boost::end(Result), *itBegin); |
|
} |
|
|
|
return Result; |
|
} |
|
|
|
// join_if ----------------------------------------------------------// |
|
|
|
//! Conditional join algorithm |
|
/*! |
|
This algorithm joins all strings in a 'list' into one long string. |
|
Segments are concatenated by given separator. Only segments that |
|
satisfy the predicate will be added to the result. |
|
|
|
\param Input A container that holds the input strings. It must be a container-of-containers. |
|
\param Separator A string that will separate the joined segments. |
|
\param Pred A segment selection predicate |
|
\return Concatenated string. |
|
|
|
\note This function provides the strong exception-safety guarantee |
|
*/ |
|
template< typename SequenceSequenceT, typename Range1T, typename PredicateT> |
|
inline typename range_value<SequenceSequenceT>::type |
|
join_if( |
|
const SequenceSequenceT& Input, |
|
const Range1T& Separator, |
|
PredicateT Pred) |
|
{ |
|
// Define working types |
|
typedef typename range_value<SequenceSequenceT>::type ResultT; |
|
typedef typename range_const_iterator<SequenceSequenceT>::type InputIteratorT; |
|
|
|
// Parse input |
|
InputIteratorT itBegin=::boost::begin(Input); |
|
InputIteratorT itEnd=::boost::end(Input); |
|
|
|
// Construct container to hold the result |
|
ResultT Result; |
|
|
|
// Roll to the first element that will be added |
|
while(itBegin!=itEnd && !Pred(*itBegin)) ++itBegin; |
|
// Add this element |
|
if(itBegin!=itEnd) |
|
{ |
|
detail::insert(Result, ::boost::end(Result), *itBegin); |
|
++itBegin; |
|
} |
|
|
|
for(;itBegin!=itEnd; ++itBegin) |
|
{ |
|
if(Pred(*itBegin)) |
|
{ |
|
// Add separator |
|
detail::insert(Result, ::boost::end(Result), ::boost::as_literal(Separator)); |
|
// Add element |
|
detail::insert(Result, ::boost::end(Result), *itBegin); |
|
} |
|
} |
|
|
|
return Result; |
|
} |
|
|
|
} // namespace algorithm |
|
|
|
// pull names to the boost namespace |
|
using algorithm::join; |
|
using algorithm::join_if; |
|
|
|
} // namespace boost |
|
|
|
|
|
#endif // BOOST_STRING_JOIN_HPP |
|
|
|
|