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