123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- // 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
|