146 lines
4.9 KiB
C++
146 lines
4.9 KiB
C++
// 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
|
|
|