predicate.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 476 行 · 第 1/2 页

HPP
476
字号
//  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.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(as_literal(Input));            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range2T>::type> lit_test(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 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 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(as_literal(Input));            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range2T>::type> lit_test(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 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 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(as_literal(Input));            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range2T>::type> lit_test(as_literal(Test));            if (empty(lit_test))            {                // Empty range is contained always                return true;            }                        // Use the temporary variable to make VACPP happy            bool bResult=(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, 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?