476 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			476 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								//  Boost string_algo library predicate.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_PREDICATE_HPP
							 | 
						||
| 
								 | 
							
								#define BOOST_STRING_PREDICATE_HPP
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/algorithm/string/config.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/range/begin.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/range/end.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/range/iterator.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/range/const_iterator.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/range/as_literal.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/range/iterator_range_core.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/algorithm/string/compare.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/algorithm/string/find.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/algorithm/string/detail/predicate.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*! \file boost/algorithm/string/predicate.hpp
							 | 
						||
| 
								 | 
							
								    Defines string-related predicates. 
							 | 
						||
| 
								 | 
							
								    The predicates determine whether a substring is contained in the input string 
							 | 
						||
| 
								 | 
							
								    under various conditions: a string starts with the substring, ends with the 
							 | 
						||
| 
								 | 
							
								    substring, simply contains the substring or if both strings are equal.
							 | 
						||
| 
								 | 
							
								    Additionaly the algorithm \c all() checks all elements of a container to satisfy a 
							 | 
						||
| 
								 | 
							
								    condition.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    All predicates provide the strong exception guarantee.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace boost {
							 | 
						||
| 
								 | 
							
								    namespace algorithm {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//  starts_with predicate  -----------------------------------------------//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        //! 'Starts with' predicate
							 | 
						||
| 
								 | 
							
								        /*!
							 | 
						||
| 
								 | 
							
								            This predicate holds when the test string is a prefix of the Input.
							 | 
						||
| 
								 | 
							
								            In other words, if the input starts with the test.
							 | 
						||
| 
								 | 
							
								            When the optional predicate is specified, it is used for character-wise
							 | 
						||
| 
								 | 
							
								            comparison.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            \param Input An input sequence
							 | 
						||
| 
								 | 
							
								            \param Test A test sequence
							 | 
						||
| 
								 | 
							
								            \param Comp An element comparison predicate
							 | 
						||
| 
								 | 
							
								            \return The result of the test
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								              \note This function provides the strong exception-safety guarantee
							 | 
						||
| 
								 | 
							
								        */
							 | 
						||
| 
								 | 
							
								        template<typename Range1T, typename Range2T, typename PredicateT>
							 | 
						||
| 
								 | 
							
								            inline bool starts_with( 
							 | 
						||
| 
								 | 
							
								            const Range1T& Input, 
							 | 
						||
| 
								 | 
							
								            const Range2T& Test,
							 | 
						||
| 
								 | 
							
								            PredicateT Comp)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range1T>::type> lit_input(::boost::as_literal(Input));
							 | 
						||
| 
								 | 
							
								            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range2T>::type> lit_test(::boost::as_literal(Test));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            typedef BOOST_STRING_TYPENAME 
							 | 
						||
| 
								 | 
							
								                range_const_iterator<Range1T>::type Iterator1T;
							 | 
						||
| 
								 | 
							
								            typedef BOOST_STRING_TYPENAME 
							 | 
						||
| 
								 | 
							
								                range_const_iterator<Range2T>::type Iterator2T;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            Iterator1T InputEnd=::boost::end(lit_input);
							 | 
						||
| 
								 | 
							
								            Iterator2T TestEnd=::boost::end(lit_test);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            Iterator1T it=::boost::begin(lit_input);
							 | 
						||
| 
								 | 
							
								            Iterator2T pit=::boost::begin(lit_test);
							 | 
						||
| 
								 | 
							
								            for(;
							 | 
						||
| 
								 | 
							
								                it!=InputEnd && pit!=TestEnd;
							 | 
						||
| 
								 | 
							
								                ++it,++pit)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                if( !(Comp(*it,*pit)) )
							 | 
						||
| 
								 | 
							
								                    return false;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            return pit==TestEnd;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        //! 'Starts with' predicate
							 | 
						||
| 
								 | 
							
								        /*!
							 | 
						||
| 
								 | 
							
								            \overload
							 | 
						||
| 
								 | 
							
								        */
							 | 
						||
| 
								 | 
							
								        template<typename Range1T, typename Range2T>
							 | 
						||
| 
								 | 
							
								        inline bool starts_with( 
							 | 
						||
| 
								 | 
							
								            const Range1T& Input, 
							 | 
						||
| 
								 | 
							
								            const Range2T& Test)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            return ::boost::algorithm::starts_with(Input, Test, is_equal());
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        //! 'Starts with' predicate ( case insensitive )
							 | 
						||
| 
								 | 
							
								        /*!
							 | 
						||
| 
								 | 
							
								            This predicate holds when the test string is a prefix of the Input.
							 | 
						||
| 
								 | 
							
								            In other words, if the input starts with the test.
							 | 
						||
| 
								 | 
							
								            Elements are compared case insensitively.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            \param Input An input sequence
							 | 
						||
| 
								 | 
							
								            \param Test A test sequence
							 | 
						||
| 
								 | 
							
								            \param Loc A locale used for case insensitive comparison
							 | 
						||
| 
								 | 
							
								            \return The result of the test
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            \note This function provides the strong exception-safety guarantee
							 | 
						||
| 
								 | 
							
								        */
							 | 
						||
| 
								 | 
							
								        template<typename Range1T, typename Range2T>
							 | 
						||
| 
								 | 
							
								        inline bool istarts_with( 
							 | 
						||
| 
								 | 
							
								            const Range1T& Input, 
							 | 
						||
| 
								 | 
							
								            const Range2T& Test,
							 | 
						||
| 
								 | 
							
								            const std::locale& Loc=std::locale())
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            return ::boost::algorithm::starts_with(Input, Test, is_iequal(Loc));
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//  ends_with predicate  -----------------------------------------------//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        //! 'Ends with' predicate
							 | 
						||
| 
								 | 
							
								        /*!
							 | 
						||
| 
								 | 
							
								            This predicate holds when the test string is a suffix of the Input.
							 | 
						||
| 
								 | 
							
								            In other words, if the input ends with the test.
							 | 
						||
| 
								 | 
							
								            When the optional predicate is specified, it is used for character-wise
							 | 
						||
| 
								 | 
							
								            comparison.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            \param Input An input sequence
							 | 
						||
| 
								 | 
							
								            \param Test A test sequence
							 | 
						||
| 
								 | 
							
								            \param Comp An element comparison predicate
							 | 
						||
| 
								 | 
							
								            \return The result of the test
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								              \note This function provides the strong exception-safety guarantee
							 | 
						||
| 
								 | 
							
								        */
							 | 
						||
| 
								 | 
							
								        template<typename Range1T, typename Range2T, typename PredicateT>
							 | 
						||
| 
								 | 
							
								        inline bool ends_with( 
							 | 
						||
| 
								 | 
							
								            const Range1T& Input, 
							 | 
						||
| 
								 | 
							
								            const Range2T& Test,
							 | 
						||
| 
								 | 
							
								            PredicateT Comp)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range1T>::type> lit_input(::boost::as_literal(Input));
							 | 
						||
| 
								 | 
							
								            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range2T>::type> lit_test(::boost::as_literal(Test));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            typedef BOOST_STRING_TYPENAME 
							 | 
						||
| 
								 | 
							
								                range_const_iterator<Range1T>::type Iterator1T;
							 | 
						||
| 
								 | 
							
								            typedef BOOST_STRING_TYPENAME boost::detail::
							 | 
						||
| 
								 | 
							
								                iterator_traits<Iterator1T>::iterator_category category;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            return detail::
							 | 
						||
| 
								 | 
							
								                ends_with_iter_select( 
							 | 
						||
| 
								 | 
							
								                    ::boost::begin(lit_input), 
							 | 
						||
| 
								 | 
							
								                    ::boost::end(lit_input), 
							 | 
						||
| 
								 | 
							
								                    ::boost::begin(lit_test), 
							 | 
						||
| 
								 | 
							
								                    ::boost::end(lit_test), 
							 | 
						||
| 
								 | 
							
								                    Comp,
							 | 
						||
| 
								 | 
							
								                    category());
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        //! 'Ends with' predicate
							 | 
						||
| 
								 | 
							
								        /*!
							 | 
						||
| 
								 | 
							
								            \overload
							 | 
						||
| 
								 | 
							
								        */
							 | 
						||
| 
								 | 
							
								        template<typename Range1T, typename Range2T>
							 | 
						||
| 
								 | 
							
								        inline bool ends_with( 
							 | 
						||
| 
								 | 
							
								            const Range1T& Input, 
							 | 
						||
| 
								 | 
							
								            const Range2T& Test)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            return ::boost::algorithm::ends_with(Input, Test, is_equal());
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        //! 'Ends with' predicate ( case insensitive )
							 | 
						||
| 
								 | 
							
								        /*!
							 | 
						||
| 
								 | 
							
								            This predicate holds when the test container is a suffix of the Input.
							 | 
						||
| 
								 | 
							
								            In other words, if the input ends with the test.
							 | 
						||
| 
								 | 
							
								            Elements are compared case insensitively.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            \param Input An input sequence
							 | 
						||
| 
								 | 
							
								            \param Test A test sequence
							 | 
						||
| 
								 | 
							
								            \param Loc A locale used for case insensitive comparison
							 | 
						||
| 
								 | 
							
								            \return The result of the test
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            \note This function provides the strong exception-safety guarantee
							 | 
						||
| 
								 | 
							
								        */
							 | 
						||
| 
								 | 
							
								        template<typename Range1T, typename Range2T>
							 | 
						||
| 
								 | 
							
								        inline bool iends_with( 
							 | 
						||
| 
								 | 
							
								            const Range1T& Input, 
							 | 
						||
| 
								 | 
							
								            const Range2T& Test,
							 | 
						||
| 
								 | 
							
								            const std::locale& Loc=std::locale())
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            return ::boost::algorithm::ends_with(Input, Test, is_iequal(Loc));
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//  contains predicate  -----------------------------------------------//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        //! 'Contains' predicate
							 | 
						||
| 
								 | 
							
								        /*!
							 | 
						||
| 
								 | 
							
								            This predicate holds when the test container is contained in the Input.
							 | 
						||
| 
								 | 
							
								            When the optional predicate is specified, it is used for character-wise
							 | 
						||
| 
								 | 
							
								            comparison.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            \param Input An input sequence
							 | 
						||
| 
								 | 
							
								            \param Test A test sequence
							 | 
						||
| 
								 | 
							
								            \param Comp An element comparison predicate
							 | 
						||
| 
								 | 
							
								            \return The result of the test
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								               \note This function provides the strong exception-safety guarantee
							 | 
						||
| 
								 | 
							
								        */
							 | 
						||
| 
								 | 
							
								        template<typename Range1T, typename Range2T, typename PredicateT>
							 | 
						||
| 
								 | 
							
								        inline bool contains( 
							 | 
						||
| 
								 | 
							
								            const Range1T& Input, 
							 | 
						||
| 
								 | 
							
								            const Range2T& Test,
							 | 
						||
| 
								 | 
							
								            PredicateT Comp)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range1T>::type> lit_input(::boost::as_literal(Input));
							 | 
						||
| 
								 | 
							
								            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range2T>::type> lit_test(::boost::as_literal(Test));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if (::boost::empty(lit_test))
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                // Empty range is contained always
							 | 
						||
| 
								 | 
							
								                return true;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								            // Use the temporary variable to make VACPP happy
							 | 
						||
| 
								 | 
							
								            bool bResult=(::boost::algorithm::first_finder(lit_test,Comp)(::boost::begin(lit_input), ::boost::end(lit_input)));
							 | 
						||
| 
								 | 
							
								            return bResult;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        //! 'Contains' predicate
							 | 
						||
| 
								 | 
							
								        /*!
							 | 
						||
| 
								 | 
							
								            \overload
							 | 
						||
| 
								 | 
							
								        */
							 | 
						||
| 
								 | 
							
								        template<typename Range1T, typename Range2T>
							 | 
						||
| 
								 | 
							
								        inline bool contains( 
							 | 
						||
| 
								 | 
							
								            const Range1T& Input, 
							 | 
						||
| 
								 | 
							
								            const Range2T& Test)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            return ::boost::algorithm::contains(Input, Test, is_equal());
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        //! 'Contains' predicate ( case insensitive )
							 | 
						||
| 
								 | 
							
								        /*!
							 | 
						||
| 
								 | 
							
								            This predicate holds when the test container is contained in the Input.
							 | 
						||
| 
								 | 
							
								            Elements are compared case insensitively.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            \param Input An input sequence
							 | 
						||
| 
								 | 
							
								            \param Test A test sequence
							 | 
						||
| 
								 | 
							
								            \param Loc A locale used for case insensitive comparison
							 | 
						||
| 
								 | 
							
								            \return The result of the test
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            \note This function provides the strong exception-safety guarantee
							 | 
						||
| 
								 | 
							
								        */
							 | 
						||
| 
								 | 
							
								        template<typename Range1T, typename Range2T>
							 | 
						||
| 
								 | 
							
								        inline bool icontains( 
							 | 
						||
| 
								 | 
							
								            const Range1T& Input, 
							 | 
						||
| 
								 | 
							
								            const Range2T& Test, 
							 | 
						||
| 
								 | 
							
								            const std::locale& Loc=std::locale())
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            return ::boost::algorithm::contains(Input, Test, is_iequal(Loc));
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//  equals predicate  -----------------------------------------------//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        //! 'Equals' predicate
							 | 
						||
| 
								 | 
							
								        /*!
							 | 
						||
| 
								 | 
							
								            This predicate holds when the test container is equal to the
							 | 
						||
| 
								 | 
							
								            input container i.e. all elements in both containers are same.
							 | 
						||
| 
								 | 
							
								            When the optional predicate is specified, it is used for character-wise
							 | 
						||
| 
								 | 
							
								            comparison.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            \param Input An input sequence
							 | 
						||
| 
								 | 
							
								            \param Test A test sequence
							 | 
						||
| 
								 | 
							
								            \param Comp An element comparison predicate
							 | 
						||
| 
								 | 
							
								            \return The result of the test
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            \note This is a two-way version of \c std::equal algorithm
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            \note This function provides the strong exception-safety guarantee
							 | 
						||
| 
								 | 
							
								        */
							 | 
						||
| 
								 | 
							
								        template<typename Range1T, typename Range2T, typename PredicateT>
							 | 
						||
| 
								 | 
							
								        inline bool equals( 
							 | 
						||
| 
								 | 
							
								            const Range1T& Input, 
							 | 
						||
| 
								 | 
							
								            const Range2T& Test,
							 | 
						||
| 
								 | 
							
								            PredicateT Comp)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range1T>::type> lit_input(::boost::as_literal(Input));
							 | 
						||
| 
								 | 
							
								            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range2T>::type> lit_test(::boost::as_literal(Test));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            typedef BOOST_STRING_TYPENAME 
							 | 
						||
| 
								 | 
							
								                range_const_iterator<Range1T>::type Iterator1T;
							 | 
						||
| 
								 | 
							
								            typedef BOOST_STRING_TYPENAME 
							 | 
						||
| 
								 | 
							
								                range_const_iterator<Range2T>::type Iterator2T;
							 | 
						||
| 
								 | 
							
								                
							 | 
						||
| 
								 | 
							
								            Iterator1T InputEnd=::boost::end(lit_input);
							 | 
						||
| 
								 | 
							
								            Iterator2T TestEnd=::boost::end(lit_test);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            Iterator1T it=::boost::begin(lit_input);
							 | 
						||
| 
								 | 
							
								            Iterator2T pit=::boost::begin(lit_test);
							 | 
						||
| 
								 | 
							
								            for(;
							 | 
						||
| 
								 | 
							
								                it!=InputEnd && pit!=TestEnd;
							 | 
						||
| 
								 | 
							
								                ++it,++pit)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                if( !(Comp(*it,*pit)) )
							 | 
						||
| 
								 | 
							
								                    return false;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            return  (pit==TestEnd) && (it==InputEnd);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        //! 'Equals' predicate
							 | 
						||
| 
								 | 
							
								        /*!
							 | 
						||
| 
								 | 
							
								            \overload
							 | 
						||
| 
								 | 
							
								        */
							 | 
						||
| 
								 | 
							
								        template<typename Range1T, typename Range2T>
							 | 
						||
| 
								 | 
							
								        inline bool equals( 
							 | 
						||
| 
								 | 
							
								            const Range1T& Input, 
							 | 
						||
| 
								 | 
							
								            const Range2T& Test)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            return ::boost::algorithm::equals(Input, Test, is_equal());
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        //! 'Equals' predicate ( case insensitive )
							 | 
						||
| 
								 | 
							
								        /*!
							 | 
						||
| 
								 | 
							
								            This predicate holds when the test container is equal to the
							 | 
						||
| 
								 | 
							
								            input container i.e. all elements in both containers are same.
							 | 
						||
| 
								 | 
							
								            Elements are compared case insensitively.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            \param Input An input sequence
							 | 
						||
| 
								 | 
							
								            \param Test A test sequence
							 | 
						||
| 
								 | 
							
								            \param Loc A locale used for case insensitive comparison
							 | 
						||
| 
								 | 
							
								            \return The result of the test
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            \note This is a two-way version of \c std::equal algorithm
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            \note This function provides the strong exception-safety guarantee
							 | 
						||
| 
								 | 
							
								        */
							 | 
						||
| 
								 | 
							
								        template<typename Range1T, typename Range2T>
							 | 
						||
| 
								 | 
							
								        inline bool iequals( 
							 | 
						||
| 
								 | 
							
								            const Range1T& Input, 
							 | 
						||
| 
								 | 
							
								            const Range2T& Test,
							 | 
						||
| 
								 | 
							
								            const std::locale& Loc=std::locale())
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            return ::boost::algorithm::equals(Input, Test, is_iequal(Loc));
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// lexicographical_compare predicate -----------------------------//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        //! Lexicographical compare predicate
							 | 
						||
| 
								 | 
							
								        /*!
							 | 
						||
| 
								 | 
							
								             This predicate is an overload of std::lexicographical_compare
							 | 
						||
| 
								 | 
							
								             for range arguments
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								             It check whether the first argument is lexicographically less
							 | 
						||
| 
								 | 
							
								             then the second one.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								             If the optional predicate is specified, it is used for character-wise
							 | 
						||
| 
								 | 
							
								             comparison
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								             \param Arg1 First argument 
							 | 
						||
| 
								 | 
							
								             \param Arg2 Second argument
							 | 
						||
| 
								 | 
							
								             \param Pred Comparison predicate
							 | 
						||
| 
								 | 
							
								             \return The result of the test
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								             \note This function provides the strong exception-safety guarantee
							 | 
						||
| 
								 | 
							
								         */
							 | 
						||
| 
								 | 
							
								        template<typename Range1T, typename Range2T, typename PredicateT>
							 | 
						||
| 
								 | 
							
								        inline bool lexicographical_compare(
							 | 
						||
| 
								 | 
							
								            const Range1T& Arg1,
							 | 
						||
| 
								 | 
							
								            const Range2T& Arg2,
							 | 
						||
| 
								 | 
							
								            PredicateT Pred)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range1T>::type> lit_arg1(::boost::as_literal(Arg1));
							 | 
						||
| 
								 | 
							
								            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range2T>::type> lit_arg2(::boost::as_literal(Arg2));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            return std::lexicographical_compare(
							 | 
						||
| 
								 | 
							
								                ::boost::begin(lit_arg1),
							 | 
						||
| 
								 | 
							
								                ::boost::end(lit_arg1),
							 | 
						||
| 
								 | 
							
								                ::boost::begin(lit_arg2),
							 | 
						||
| 
								 | 
							
								                ::boost::end(lit_arg2),
							 | 
						||
| 
								 | 
							
								                Pred);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        //! Lexicographical compare predicate
							 | 
						||
| 
								 | 
							
								        /*!
							 | 
						||
| 
								 | 
							
								            \overload
							 | 
						||
| 
								 | 
							
								         */
							 | 
						||
| 
								 | 
							
								        template<typename Range1T, typename Range2T>
							 | 
						||
| 
								 | 
							
								            inline bool lexicographical_compare(
							 | 
						||
| 
								 | 
							
								            const Range1T& Arg1,
							 | 
						||
| 
								 | 
							
								            const Range2T& Arg2)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            return ::boost::algorithm::lexicographical_compare(Arg1, Arg2, is_less());
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        //! Lexicographical compare predicate (case-insensitive)
							 | 
						||
| 
								 | 
							
								        /*!
							 | 
						||
| 
								 | 
							
								            This predicate is an overload of std::lexicographical_compare
							 | 
						||
| 
								 | 
							
								            for range arguments.
							 | 
						||
| 
								 | 
							
								            It check whether the first argument is lexicographically less
							 | 
						||
| 
								 | 
							
								            then the second one.
							 | 
						||
| 
								 | 
							
								            Elements are compared case insensitively
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								             \param Arg1 First argument 
							 | 
						||
| 
								 | 
							
								             \param Arg2 Second argument
							 | 
						||
| 
								 | 
							
								             \param Loc A locale used for case insensitive comparison
							 | 
						||
| 
								 | 
							
								             \return The result of the test
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								             \note This function provides the strong exception-safety guarantee
							 | 
						||
| 
								 | 
							
								         */
							 | 
						||
| 
								 | 
							
								        template<typename Range1T, typename Range2T>
							 | 
						||
| 
								 | 
							
								        inline bool ilexicographical_compare(
							 | 
						||
| 
								 | 
							
								            const Range1T& Arg1,
							 | 
						||
| 
								 | 
							
								            const Range2T& Arg2,
							 | 
						||
| 
								 | 
							
								            const std::locale& Loc=std::locale())
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            return ::boost::algorithm::lexicographical_compare(Arg1, Arg2, is_iless(Loc));
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//  all predicate  -----------------------------------------------//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        //! 'All' predicate
							 | 
						||
| 
								 | 
							
								        /*!
							 | 
						||
| 
								 | 
							
								            This predicate holds it all its elements satisfy a given 
							 | 
						||
| 
								 | 
							
								            condition, represented by the predicate.
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								            \param Input An input sequence
							 | 
						||
| 
								 | 
							
								            \param Pred A predicate
							 | 
						||
| 
								 | 
							
								            \return The result of the test
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            \note This function provides the strong exception-safety guarantee
							 | 
						||
| 
								 | 
							
								        */
							 | 
						||
| 
								 | 
							
								        template<typename RangeT, typename PredicateT>
							 | 
						||
| 
								 | 
							
								        inline bool all( 
							 | 
						||
| 
								 | 
							
								            const RangeT& Input, 
							 | 
						||
| 
								 | 
							
								            PredicateT Pred)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_input(::boost::as_literal(Input));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            typedef BOOST_STRING_TYPENAME 
							 | 
						||
| 
								 | 
							
								                range_const_iterator<RangeT>::type Iterator1T;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            Iterator1T InputEnd=::boost::end(lit_input);
							 | 
						||
| 
								 | 
							
								            for( Iterator1T It=::boost::begin(lit_input); It!=InputEnd; ++It)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                if (!Pred(*It))
							 | 
						||
| 
								 | 
							
								                    return false;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            
							 | 
						||
| 
								 | 
							
								            return true;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    } // namespace algorithm
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // pull names to the boost namespace
							 | 
						||
| 
								 | 
							
								    using algorithm::starts_with;
							 | 
						||
| 
								 | 
							
								    using algorithm::istarts_with;
							 | 
						||
| 
								 | 
							
								    using algorithm::ends_with;
							 | 
						||
| 
								 | 
							
								    using algorithm::iends_with;
							 | 
						||
| 
								 | 
							
								    using algorithm::contains;
							 | 
						||
| 
								 | 
							
								    using algorithm::icontains;
							 | 
						||
| 
								 | 
							
								    using algorithm::equals;
							 | 
						||
| 
								 | 
							
								    using algorithm::iequals;
							 | 
						||
| 
								 | 
							
								    using algorithm::all;
							 | 
						||
| 
								 | 
							
								    using algorithm::lexicographical_compare;
							 | 
						||
| 
								 | 
							
								    using algorithm::ilexicographical_compare;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								} // namespace boost
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif  // BOOST_STRING_PREDICATE_HPP
							 |