forked from boostorg/algorithm
		
	
		
			
				
	
	
		
			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
 | |
| 
 |