335 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			335 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | //  Boost string_algo library find.hpp header file  ---------------------------// | ||
|  | 
 | ||
|  | //  Copyright Pavol Droba 2002-2003. | ||
|  | // | ||
|  | // 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_FIND_HPP | ||
|  | #define BOOST_STRING_FIND_HPP | ||
|  | 
 | ||
|  | #include <boost/algorithm/string/config.hpp> | ||
|  | 
 | ||
|  | #include <boost/range/iterator_range_core.hpp> | ||
|  | #include <boost/range/begin.hpp> | ||
|  | #include <boost/range/end.hpp> | ||
|  | #include <boost/range/iterator.hpp> | ||
|  | #include <boost/range/as_literal.hpp> | ||
|  | 
 | ||
|  | #include <boost/algorithm/string/finder.hpp> | ||
|  | #include <boost/algorithm/string/compare.hpp> | ||
|  | #include <boost/algorithm/string/constants.hpp> | ||
|  | 
 | ||
|  | /*! \file | ||
|  |     Defines a set of find algorithms. The algorithms are searching | ||
|  |     for a substring of the input. The result is given as an \c iterator_range | ||
|  |     delimiting the substring. | ||
|  | */ | ||
|  | 
 | ||
|  | namespace boost { | ||
|  |     namespace algorithm { | ||
|  | 
 | ||
|  | //  Generic find -----------------------------------------------// | ||
|  | 
 | ||
|  |         //! Generic find algorithm | ||
|  |         /*! | ||
|  |             Search the input using the given finder. | ||
|  | 
 | ||
|  |             \param Input A string which will be searched. | ||
|  |             \param Finder Finder object used for searching. | ||
|  |             \return  | ||
|  |                 An \c iterator_range delimiting the match.  | ||
|  |                 Returned iterator is either \c RangeT::iterator or  | ||
|  |                 \c RangeT::const_iterator, depending on the constness of  | ||
|  |                 the input parameter. | ||
|  |         */ | ||
|  |         template<typename RangeT, typename FinderT> | ||
|  |         inline iterator_range<  | ||
|  |             BOOST_STRING_TYPENAME range_iterator<RangeT>::type> | ||
|  |         find(  | ||
|  |             RangeT& Input,  | ||
|  |             const FinderT& Finder) | ||
|  |         { | ||
|  |             iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_input(::boost::as_literal(Input)); | ||
|  | 
 | ||
|  |             return Finder(::boost::begin(lit_input),::boost::end(lit_input)); | ||
|  |         } | ||
|  | 
 | ||
|  | //  find_first  -----------------------------------------------// | ||
|  | 
 | ||
|  |         //! Find first algorithm | ||
|  |         /*! | ||
|  |             Search for the first occurrence of the substring in the input.  | ||
|  |              | ||
|  |             \param Input A string which will be searched. | ||
|  |             \param Search A substring to be searched for. | ||
|  |             \return  | ||
|  |                 An \c iterator_range delimiting the match.  | ||
|  |                 Returned iterator is either \c RangeT::iterator or  | ||
|  |                 \c RangeT::const_iterator, depending on the constness of  | ||
|  |                 the input parameter. | ||
|  | 
 | ||
|  |               \note This function provides the strong exception-safety guarantee | ||
|  |         */ | ||
|  |         template<typename Range1T, typename Range2T> | ||
|  |         inline iterator_range<  | ||
|  |             BOOST_STRING_TYPENAME range_iterator<Range1T>::type> | ||
|  |         find_first(  | ||
|  |             Range1T& Input,  | ||
|  |             const Range2T& Search) | ||
|  |         { | ||
|  |             return ::boost::algorithm::find(Input, ::boost::algorithm::first_finder(Search)); | ||
|  |         } | ||
|  | 
 | ||
|  |         //! Find first algorithm ( case insensitive ) | ||
|  |         /*! | ||
|  |             Search for the first occurrence of the substring in the input.  | ||
|  |             Searching is case insensitive. | ||
|  |              | ||
|  |             \param Input A string which will be searched. | ||
|  |             \param Search A substring to be searched for. | ||
|  |             \param Loc A locale used for case insensitive comparison | ||
|  |             \return  | ||
|  |                 An \c iterator_range delimiting the match.  | ||
|  |                 Returned iterator is either \c Range1T::iterator or  | ||
|  |                 \c Range1T::const_iterator, depending on the constness of  | ||
|  |                 the input parameter. | ||
|  | 
 | ||
|  |             \note This function provides the strong exception-safety guarantee | ||
|  |         */ | ||
|  |         template<typename Range1T, typename Range2T> | ||
|  |         inline iterator_range<  | ||
|  |             BOOST_STRING_TYPENAME range_iterator<Range1T>::type> | ||
|  |         ifind_first(  | ||
|  |             Range1T& Input,  | ||
|  |             const Range2T& Search, | ||
|  |             const std::locale& Loc=std::locale()) | ||
|  |         { | ||
|  |             return ::boost::algorithm::find(Input, ::boost::algorithm::first_finder(Search,is_iequal(Loc))); | ||
|  |         } | ||
|  | 
 | ||
|  | //  find_last  -----------------------------------------------// | ||
|  | 
 | ||
|  |         //! Find last algorithm | ||
|  |         /*! | ||
|  |             Search for the last occurrence of the substring in the input.  | ||
|  |              | ||
|  |             \param Input A string which will be searched. | ||
|  |             \param Search A substring to be searched for. | ||
|  |             \return  | ||
|  |                 An \c iterator_range delimiting the match.  | ||
|  |                 Returned iterator is either \c Range1T::iterator or  | ||
|  |                 \c Range1T::const_iterator, depending on the constness of  | ||
|  |                 the input parameter. | ||
|  | 
 | ||
|  |             \note This function provides the strong exception-safety guarantee | ||
|  |         */ | ||
|  |         template<typename Range1T, typename Range2T> | ||
|  |         inline iterator_range<  | ||
|  |             BOOST_STRING_TYPENAME range_iterator<Range1T>::type> | ||
|  |         find_last(  | ||
|  |             Range1T& Input,  | ||
|  |             const Range2T& Search) | ||
|  |         { | ||
|  |             return ::boost::algorithm::find(Input, ::boost::algorithm::last_finder(Search)); | ||
|  |         } | ||
|  | 
 | ||
|  |         //! Find last algorithm ( case insensitive ) | ||
|  |         /*! | ||
|  |             Search for the last match a string in the input.  | ||
|  |             Searching is case insensitive. | ||
|  |              | ||
|  |             \param Input A string which will be searched. | ||
|  |             \param Search A substring to be searched for. | ||
|  |             \param Loc A locale used for case insensitive comparison | ||
|  |             \return  | ||
|  |                 An \c iterator_range delimiting the match.  | ||
|  |                 Returned iterator is either \c Range1T::iterator or  | ||
|  |                 \c Range1T::const_iterator, depending on the constness of  | ||
|  |                 the input parameter. | ||
|  |          | ||
|  |             \note This function provides the strong exception-safety guarantee     | ||
|  |         */ | ||
|  |         template<typename Range1T, typename Range2T> | ||
|  |         inline iterator_range<  | ||
|  |             BOOST_STRING_TYPENAME range_iterator<Range1T>::type> | ||
|  |         ifind_last(  | ||
|  |             Range1T& Input,  | ||
|  |             const Range2T& Search, | ||
|  |             const std::locale& Loc=std::locale()) | ||
|  |         { | ||
|  |             return ::boost::algorithm::find(Input, ::boost::algorithm::last_finder(Search, is_iequal(Loc))); | ||
|  |         } | ||
|  | 
 | ||
|  | //  find_nth ----------------------------------------------------------------------// | ||
|  | 
 | ||
|  |         //! Find n-th algorithm  | ||
|  |         /*! | ||
|  |             Search for the n-th (zero-indexed) occurrence of the substring in the  | ||
|  |             input.          | ||
|  |              | ||
|  |             \param Input A string which will be searched. | ||
|  |             \param Search A substring to be searched for. | ||
|  |             \param Nth An index (zero-indexed) of the match to be found. | ||
|  |                 For negative N, the matches are counted from the end of string. | ||
|  |             \return  | ||
|  |                 An \c iterator_range delimiting the match.  | ||
|  |                 Returned iterator is either \c Range1T::iterator or  | ||
|  |                 \c Range1T::const_iterator, depending on the constness of  | ||
|  |                 the input parameter. | ||
|  |         */ | ||
|  |         template<typename Range1T, typename Range2T> | ||
|  |         inline iterator_range<  | ||
|  |             BOOST_STRING_TYPENAME range_iterator<Range1T>::type> | ||
|  |         find_nth(  | ||
|  |             Range1T& Input,  | ||
|  |             const Range2T& Search, | ||
|  |             int Nth) | ||
|  |         { | ||
|  |             return ::boost::algorithm::find(Input, ::boost::algorithm::nth_finder(Search,Nth)); | ||
|  |         } | ||
|  | 
 | ||
|  |         //! Find n-th algorithm ( case insensitive ). | ||
|  |         /*! | ||
|  |             Search for the n-th (zero-indexed) occurrence of the substring in the  | ||
|  |             input. Searching is case insensitive. | ||
|  |              | ||
|  |             \param Input A string which will be searched. | ||
|  |             \param Search A substring to be searched for. | ||
|  |             \param Nth An index (zero-indexed) of the match to be found.  | ||
|  |                 For negative N, the matches are counted from the end of string. | ||
|  |             \param Loc A locale used for case insensitive comparison | ||
|  |             \return  | ||
|  |                 An \c iterator_range delimiting the match.  | ||
|  |                 Returned iterator is either \c Range1T::iterator or  | ||
|  |                 \c Range1T::const_iterator, depending on the constness of  | ||
|  |                 the input parameter. | ||
|  | 
 | ||
|  | 
 | ||
|  |             \note This function provides the strong exception-safety guarantee | ||
|  |         */ | ||
|  |         template<typename Range1T, typename Range2T> | ||
|  |         inline iterator_range<  | ||
|  |             BOOST_STRING_TYPENAME range_iterator<Range1T>::type> | ||
|  |         ifind_nth(  | ||
|  |             Range1T& Input,  | ||
|  |             const Range2T& Search, | ||
|  |             int Nth, | ||
|  |             const std::locale& Loc=std::locale()) | ||
|  |         { | ||
|  |             return ::boost::algorithm::find(Input, ::boost::algorithm::nth_finder(Search,Nth,is_iequal(Loc))); | ||
|  |         } | ||
|  | 
 | ||
|  | //  find_head ----------------------------------------------------------------------// | ||
|  | 
 | ||
|  |         //! Find head algorithm | ||
|  |         /*! | ||
|  |             Get the head of the input. Head is a prefix of the string of the  | ||
|  |             given size. If the input is shorter then required, whole input is considered  | ||
|  |             to be the head. | ||
|  | 
 | ||
|  |             \param Input An input string | ||
|  |             \param N Length of the head | ||
|  |                 For N>=0, at most N characters are extracted. | ||
|  |                 For N<0, at most size(Input)-|N| characters are extracted. | ||
|  |             \return  | ||
|  |                 An \c iterator_range delimiting the match.  | ||
|  |                 Returned iterator is either \c Range1T::iterator or  | ||
|  |                 \c Range1T::const_iterator, depending on the constness of  | ||
|  |                 the input parameter. | ||
|  | 
 | ||
|  |             \note This function provides the strong exception-safety guarantee | ||
|  |         */ | ||
|  |         template<typename RangeT> | ||
|  |         inline iterator_range<  | ||
|  |             BOOST_STRING_TYPENAME range_iterator<RangeT>::type> | ||
|  |         find_head(  | ||
|  |             RangeT& Input,  | ||
|  |             int N) | ||
|  |         { | ||
|  |             return ::boost::algorithm::find(Input, ::boost::algorithm::head_finder(N)); | ||
|  |         } | ||
|  | 
 | ||
|  | //  find_tail ----------------------------------------------------------------------// | ||
|  | 
 | ||
|  |         //! Find tail algorithm | ||
|  |         /*! | ||
|  |             Get the tail of the input. Tail is a suffix of the string of the  | ||
|  |             given size. If the input is shorter then required, whole input is considered  | ||
|  |             to be the tail. | ||
|  | 
 | ||
|  |             \param Input An input string | ||
|  |             \param N Length of the tail.  | ||
|  |                 For N>=0, at most N characters are extracted. | ||
|  |                 For N<0, at most size(Input)-|N| characters are extracted. | ||
|  |             \return  | ||
|  |                 An \c iterator_range delimiting the match.  | ||
|  |                 Returned iterator is either \c RangeT::iterator or  | ||
|  |                 \c RangeT::const_iterator, depending on the constness of  | ||
|  |                 the input parameter. | ||
|  | 
 | ||
|  | 
 | ||
|  |             \note This function provides the strong exception-safety guarantee | ||
|  |         */ | ||
|  |         template<typename RangeT> | ||
|  |         inline iterator_range<  | ||
|  |             BOOST_STRING_TYPENAME range_iterator<RangeT>::type> | ||
|  |         find_tail(  | ||
|  |             RangeT& Input,  | ||
|  |             int N) | ||
|  |         { | ||
|  |             return ::boost::algorithm::find(Input, ::boost::algorithm::tail_finder(N)); | ||
|  |         } | ||
|  | 
 | ||
|  | //  find_token --------------------------------------------------------------------// | ||
|  | 
 | ||
|  |         //! Find token algorithm | ||
|  |         /*! | ||
|  |             Look for a given token in the string. Token is a character that matches the | ||
|  |             given predicate. | ||
|  |             If the "token compress mode" is enabled, adjacent tokens are considered to be one match. | ||
|  |              | ||
|  |             \param Input A input string. | ||
|  |             \param Pred A unary predicate to identify a token | ||
|  |             \param eCompress Enable/Disable compressing of adjacent tokens | ||
|  |             \return  | ||
|  |                 An \c iterator_range delimiting the match.  | ||
|  |                 Returned iterator is either \c RangeT::iterator or  | ||
|  |                 \c RangeT::const_iterator, depending on the constness of  | ||
|  |                 the input parameter. | ||
|  |          | ||
|  |             \note This function provides the strong exception-safety guarantee     | ||
|  |         */ | ||
|  |         template<typename RangeT, typename PredicateT> | ||
|  |         inline iterator_range<  | ||
|  |             BOOST_STRING_TYPENAME range_iterator<RangeT>::type> | ||
|  |         find_token(  | ||
|  |             RangeT& Input, | ||
|  |             PredicateT Pred, | ||
|  |             token_compress_mode_type eCompress=token_compress_off) | ||
|  |         { | ||
|  |             return ::boost::algorithm::find(Input, ::boost::algorithm::token_finder(Pred, eCompress)); | ||
|  |         } | ||
|  | 
 | ||
|  |     } // namespace algorithm | ||
|  | 
 | ||
|  |     // pull names to the boost namespace | ||
|  |     using algorithm::find; | ||
|  |     using algorithm::find_first; | ||
|  |     using algorithm::ifind_first; | ||
|  |     using algorithm::find_last; | ||
|  |     using algorithm::ifind_last; | ||
|  |     using algorithm::find_nth; | ||
|  |     using algorithm::ifind_nth; | ||
|  |     using algorithm::find_head; | ||
|  |     using algorithm::find_tail; | ||
|  |     using algorithm::find_token; | ||
|  | 
 | ||
|  | } // namespace boost | ||
|  | 
 | ||
|  | 
 | ||
|  | #endif  // BOOST_STRING_FIND_HPP |