forked from boostorg/algorithm
		
	
		
			
				
	
	
		
			164 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			164 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //  Boost string_algo library split.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_SPLIT_HPP
 | |
| #define BOOST_STRING_SPLIT_HPP
 | |
| 
 | |
| #include <boost/algorithm/string/config.hpp>
 | |
| 
 | |
| #include <boost/algorithm/string/iter_find.hpp>
 | |
| #include <boost/algorithm/string/finder.hpp>
 | |
| #include <boost/algorithm/string/compare.hpp>
 | |
| 
 | |
| /*! \file
 | |
|     Defines basic split algorithms. 
 | |
|     Split algorithms can be used to divide a string
 | |
|     into several parts according to given criteria.
 | |
|     
 | |
|     Each part is copied and added as a new element to the
 | |
|     output container.
 | |
|     Thus the result container must be able to hold copies
 | |
|     of the matches (in a compatible structure like std::string) or
 | |
|     a reference to it (e.g. using the iterator range class).
 | |
|     Examples of such a container are \c std::vector<std::string>
 | |
|     or \c std::list<boost::iterator_range<std::string::iterator>>
 | |
| */
 | |
| 
 | |
| namespace boost {
 | |
|     namespace algorithm {
 | |
| 
 | |
| //  find_all  ------------------------------------------------------------//
 | |
| 
 | |
|         //! Find all algorithm
 | |
|         /*!
 | |
|             This algorithm finds all occurrences of the search string
 | |
|             in the input.
 | |
|             
 | |
|             Each part is copied and added as a new element to the
 | |
|             output container.
 | |
|             Thus the result container must be able to hold copies
 | |
|             of the matches (in a compatible structure like std::string) or
 | |
|             a reference to it (e.g. using the iterator range class).
 | |
|             Examples of such a container are \c std::vector<std::string>
 | |
|             or \c std::list<boost::iterator_range<std::string::iterator>>
 | |
| 
 | |
|             \param Result A container that can hold copies of references to the substrings
 | |
|             \param Input A container which will be searched.
 | |
|             \param Search A substring to be searched for.
 | |
|             \return A reference the result
 | |
| 
 | |
|             \note Prior content of the result will be overwritten.
 | |
| 
 | |
|             \note This function provides the strong exception-safety guarantee
 | |
|         */
 | |
|         template< typename SequenceSequenceT, typename Range1T, typename Range2T >
 | |
|         inline SequenceSequenceT& find_all(
 | |
|             SequenceSequenceT& Result,
 | |
|             Range1T& Input,
 | |
|             const Range2T& Search)
 | |
|         {
 | |
|             return ::boost::algorithm::iter_find(
 | |
|                 Result,
 | |
|                 Input,
 | |
|                 ::boost::algorithm::first_finder(Search) );        
 | |
|         }
 | |
| 
 | |
|         //! Find all algorithm ( case insensitive ) 
 | |
|         /*!
 | |
|             This algorithm finds all occurrences of the search string
 | |
|             in the input. 
 | |
|             Each part is copied and added as a new element to the
 | |
|             output container. Thus the result container must be able to hold copies
 | |
|             of the matches (in a compatible structure like std::string) or
 | |
|             a reference to it (e.g. using the iterator range class).
 | |
|             Examples of such a container are \c std::vector<std::string>
 | |
|             or \c std::list<boost::iterator_range<std::string::iterator>>
 | |
| 
 | |
|             Searching is case insensitive.
 | |
| 
 | |
|             \param Result A container that can hold copies of references to the substrings
 | |
|             \param Input A container which will be searched.
 | |
|             \param Search A substring to be searched for.
 | |
|             \param Loc A locale used for case insensitive comparison
 | |
|             \return A reference the result
 | |
| 
 | |
|             \note Prior content of the result will be overwritten.
 | |
| 
 | |
|             \note This function provides the strong exception-safety guarantee
 | |
|         */
 | |
|         template< typename SequenceSequenceT, typename Range1T, typename Range2T >
 | |
|         inline SequenceSequenceT& ifind_all(
 | |
|             SequenceSequenceT& Result,
 | |
|             Range1T& Input,
 | |
|             const Range2T& Search,
 | |
|             const std::locale& Loc=std::locale() )
 | |
|         {
 | |
|             return ::boost::algorithm::iter_find(
 | |
|                 Result,
 | |
|                 Input,
 | |
|                 ::boost::algorithm::first_finder(Search, is_iequal(Loc) ) );        
 | |
|         }
 | |
| 
 | |
| 
 | |
| //  tokenize  -------------------------------------------------------------//
 | |
| 
 | |
|         //! Split algorithm
 | |
|         /*! 
 | |
|             Tokenize expression. This function is equivalent to C strtok. Input
 | |
|             sequence is split into tokens, separated by separators. Separators 
 | |
|             are given by means of the predicate.
 | |
| 
 | |
|             Each part is copied and added as a new element to the
 | |
|             output container.
 | |
|             Thus the result container must be able to hold copies
 | |
|             of the matches (in a compatible structure like std::string) or
 | |
|             a reference to it (e.g. using the iterator range class).
 | |
|             Examples of such a container are \c std::vector<std::string>
 | |
|             or \c std::list<boost::iterator_range<std::string::iterator>>
 | |
|     
 | |
|             \param Result A container that can hold copies of references to the substrings          
 | |
|             \param Input A container which will be searched.
 | |
|             \param Pred A predicate to identify separators. This predicate is 
 | |
|                 supposed to return true if a given element is a separator.
 | |
|             \param eCompress If eCompress argument is set to token_compress_on, adjacent 
 | |
|                 separators are merged together. Otherwise, every two separators
 | |
|                 delimit a token.
 | |
|             \return A reference the result
 | |
| 
 | |
|             \note Prior content of the result will be overwritten.
 | |
| 
 | |
|             \note This function provides the strong exception-safety guarantee
 | |
|         */
 | |
|         template< typename SequenceSequenceT, typename RangeT, typename PredicateT >
 | |
|         inline SequenceSequenceT& split(
 | |
|             SequenceSequenceT& Result,
 | |
|             RangeT& Input,
 | |
|             PredicateT Pred,
 | |
|             token_compress_mode_type eCompress=token_compress_off )
 | |
|         {
 | |
|             return ::boost::algorithm::iter_split(
 | |
|                 Result,
 | |
|                 Input,
 | |
|                 ::boost::algorithm::token_finder( Pred, eCompress ) );         
 | |
|         }
 | |
| 
 | |
|     } // namespace algorithm
 | |
| 
 | |
|     // pull names to the boost namespace
 | |
|     using algorithm::find_all;
 | |
|     using algorithm::ifind_all;
 | |
|     using algorithm::split;    
 | |
| 
 | |
| } // namespace boost
 | |
| 
 | |
| 
 | |
| #endif  // BOOST_STRING_SPLIT_HPP
 | |
| 
 |