146 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			146 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
//  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
 | 
						|
 |