mirror of
https://github.com/boostorg/algorithm.git
synced 2025-07-06 01:06:37 +02:00
Join algorithm implemented
[SVN r32916]
This commit is contained in:
144
include/boost/algorithm/string/join.hpp
Normal file
144
include/boost/algorithm/string/join.hpp
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
// Boost string_algo library join.hpp header file ---------------------------//
|
||||||
|
|
||||||
|
// Copyright Pavol Droba 2002-2006. Use, modification and
|
||||||
|
// distribution is subject to 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>
|
||||||
|
|
||||||
|
|
||||||
|
/*! \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,
|
||||||
|
Range1T& Separator)
|
||||||
|
{
|
||||||
|
// Define working types
|
||||||
|
typedef typename range_value<SequenceSequenceT>::type ResultT;
|
||||||
|
typedef typename range_const_iterator<SequenceSequenceT>::type InputIteratorT;
|
||||||
|
|
||||||
|
// Parse input
|
||||||
|
InputIteratorT itBegin=begin(Input);
|
||||||
|
InputIteratorT itEnd=end(Input);
|
||||||
|
|
||||||
|
// Construct container to hold the result
|
||||||
|
ResultT Result;
|
||||||
|
|
||||||
|
// Append first element
|
||||||
|
if(itBegin!=itEnd)
|
||||||
|
{
|
||||||
|
detail::insert(Result, end(Result), *itBegin);
|
||||||
|
++itBegin;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(;itBegin!=itEnd; ++itBegin)
|
||||||
|
{
|
||||||
|
// Add separator
|
||||||
|
detail::insert(Result, end(Result), Separator);
|
||||||
|
// Add element
|
||||||
|
detail::insert(Result, 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,
|
||||||
|
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=begin(Input);
|
||||||
|
InputIteratorT itEnd=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, end(Result), *itBegin);
|
||||||
|
++itBegin;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(;itBegin!=itEnd; ++itBegin)
|
||||||
|
{
|
||||||
|
if(Pred(*itBegin))
|
||||||
|
{
|
||||||
|
// Add separator
|
||||||
|
detail::insert(Result, end(Result), Separator);
|
||||||
|
// Add element
|
||||||
|
detail::insert(Result, 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
|
||||||
|
|
@ -1,6 +1,6 @@
|
|||||||
// Boost string_algo library find.hpp header file ---------------------------//
|
// Boost string_algo library split.hpp header file ---------------------------//
|
||||||
|
|
||||||
// Copyright Pavol Droba 2002-2003. Use, modification and
|
// Copyright Pavol Droba 2002-2006. Use, modification and
|
||||||
// distribution is subject to the Boost Software License, Version
|
// distribution is subject to the Boost Software License, Version
|
||||||
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
// http://www.boost.org/LICENSE_1_0.txt)
|
||||||
@ -55,7 +55,7 @@ namespace boost {
|
|||||||
|
|
||||||
\note Prior content of the result will be overwritten.
|
\note Prior content of the result will be overwritten.
|
||||||
|
|
||||||
\note This function provides the strong exception-safety guarantee
|
\note This function provides the strong exception-safety guarantee
|
||||||
*/
|
*/
|
||||||
template< typename SequenceSequenceT, typename Range1T, typename Range2T >
|
template< typename SequenceSequenceT, typename Range1T, typename Range2T >
|
||||||
inline SequenceSequenceT& find_all(
|
inline SequenceSequenceT& find_all(
|
||||||
@ -90,7 +90,7 @@ namespace boost {
|
|||||||
|
|
||||||
\note Prior content of the result will be overwritten.
|
\note Prior content of the result will be overwritten.
|
||||||
|
|
||||||
\note This function provides the strong exception-safety guarantee
|
\note This function provides the strong exception-safety guarantee
|
||||||
*/
|
*/
|
||||||
template< typename SequenceSequenceT, typename Range1T, typename Range2T >
|
template< typename SequenceSequenceT, typename Range1T, typename Range2T >
|
||||||
inline SequenceSequenceT& ifind_all(
|
inline SequenceSequenceT& ifind_all(
|
||||||
|
Reference in New Issue
Block a user