forked from boostorg/algorithm
		
	
		
			
				
	
	
		
			305 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			305 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //  Boost string_algo library classification.hpp header file  ---------------------------//
 | |
| 
 | |
| //  Copyright Pavol Droba 2002-2003. Use, modification and
 | |
| //  distribution is subject to 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_CLASSIFICATION_HPP
 | |
| #define BOOST_STRING_CLASSIFICATION_HPP
 | |
| 
 | |
| #include <algorithm>
 | |
| #include <locale>
 | |
| #include <boost/algorithm/string/detail/classification.hpp>
 | |
| 
 | |
| /*! \file
 | |
|     Classification predicates are included in the library to give 
 | |
|     some more convenience when using algorithms like \c trim() and \c all(). 
 | |
|     They wrap functionality of STL classification functions ( e.g. \c std::isspace() )
 | |
|     into generic functors. 
 | |
| */
 | |
| 
 | |
| namespace boost {
 | |
|     namespace algorithm {
 | |
| 
 | |
| //  classification functor generator -------------------------------------//
 | |
| 
 | |
|         //! is_classified predicate
 | |
|         /*!
 | |
|             Construct the \c is_classified predicate. This predicate holds, if an input is
 | |
|             of specified \c std::ctype category.
 | |
| 
 | |
|             \param Type A \c std::ctype category
 | |
|             \param Loc A locale used for classification
 | |
|             \return An instance of the \c is_classified predicate 
 | |
|         */
 | |
|         inline detail::is_classifiedF
 | |
|         is_classified(std::ctype_base::mask Type, const std::locale& Loc=std::locale())
 | |
|         {
 | |
|             return detail::is_classifiedF(Type, Loc);
 | |
|         }
 | |
| 
 | |
|         //! is_space predicate
 | |
|         /*!
 | |
|             Construct the \c is_classified predicate for \c ctype_base::space category.   
 | |
| 
 | |
|             \param Loc A locale used for classification
 | |
|             \return An instance of the \c is_classified predicate
 | |
|         */
 | |
|         inline detail::is_classifiedF 
 | |
|         is_space(const std::locale& Loc=std::locale())
 | |
|         {
 | |
|             return detail::is_classifiedF(std::ctype_base::space, Loc);
 | |
|         }
 | |
| 
 | |
|         //! is_alnum predicate
 | |
|         /*!
 | |
|             Construct the \c is_classified predicate for the \c ctype_base::alnum category.   
 | |
| 
 | |
|             \param Loc A locale used for classification
 | |
|             \return An instance of the \c is_classified predicate 
 | |
|         */
 | |
|         inline detail::is_classifiedF 
 | |
|         is_alnum(const std::locale& Loc=std::locale())
 | |
|         {
 | |
|             return detail::is_classifiedF(std::ctype_base::alnum, Loc);
 | |
|         }
 | |
| 
 | |
|         //! is_alpha predicate
 | |
|         /*!
 | |
|             Construct the \c is_classified predicate for the \c ctype_base::alpha category.   
 | |
| 
 | |
|             \param Loc A locale used for classification
 | |
|             \return An instance of the \c is_classified predicate 
 | |
|         */
 | |
|         inline detail::is_classifiedF 
 | |
|         is_alpha(const std::locale& Loc=std::locale())
 | |
|         {
 | |
|             return detail::is_classifiedF(std::ctype_base::alpha, Loc);
 | |
|         }
 | |
| 
 | |
|         //! is_cntrl predicate
 | |
|         /*!
 | |
|             Construct the \c is_classified predicate for the \c ctype_base::cntrl category.   
 | |
| 
 | |
|             \param Loc A locale used for classification
 | |
|             \return An instance of the \c is_classified predicate 
 | |
|         */
 | |
|         inline detail::is_classifiedF 
 | |
|         is_cntrl(const std::locale& Loc=std::locale())
 | |
|         {
 | |
|             return detail::is_classifiedF(std::ctype_base::cntrl, Loc);
 | |
|         }
 | |
| 
 | |
|         //! is_digit predicate
 | |
|         /*!
 | |
|             Construct the \c is_classified predicate for the \c ctype_base::digit category.   
 | |
| 
 | |
|             \param Loc A locale used for classification
 | |
|             \return An instance of the \c is_classified predicate 
 | |
|         */
 | |
|         inline detail::is_classifiedF 
 | |
|         is_digit(const std::locale& Loc=std::locale())
 | |
|         {
 | |
|             return detail::is_classifiedF(std::ctype_base::digit, Loc);
 | |
|         }
 | |
| 
 | |
|         //! is_graph predicate
 | |
|         /*!
 | |
|             Construct the \c is_classified predicate for the \c ctype_base::graph category.   
 | |
| 
 | |
|             \param Loc A locale used for classification
 | |
|             \return An instance of the \c is_classified predicate 
 | |
|         */
 | |
|         inline detail::is_classifiedF
 | |
|         is_graph(const std::locale& Loc=std::locale())
 | |
|         {
 | |
|             return detail::is_classifiedF(std::ctype_base::graph, Loc);
 | |
|         }
 | |
| 
 | |
|         //! is_lower predicate
 | |
|         /*!
 | |
|             Construct the \c is_classified predicate for the \c ctype_base::lower category.   
 | |
| 
 | |
|             \param Loc A locale used for classification
 | |
|             \return An instance of \c is_classified predicate 
 | |
|         */
 | |
|         inline detail::is_classifiedF 
 | |
|         is_lower(const std::locale& Loc=std::locale())
 | |
|         {
 | |
|             return detail::is_classifiedF(std::ctype_base::lower, Loc);
 | |
|         }
 | |
| 
 | |
|         //! is_print predicate
 | |
|         /*!
 | |
|             Construct the \c is_classified predicate for the \c ctype_base::print category.   
 | |
| 
 | |
|             \param Loc A locale used for classification
 | |
|             \return An instance of the \c is_classified predicate 
 | |
|         */
 | |
|         inline detail::is_classifiedF 
 | |
|         is_print(const std::locale& Loc=std::locale())
 | |
|         {
 | |
|             return detail::is_classifiedF(std::ctype_base::print, Loc);
 | |
|         }
 | |
| 
 | |
|         //! is_punct predicate
 | |
|         /*!
 | |
|             Construct the \c is_classified predicate for the \c ctype_base::punct category.   
 | |
| 
 | |
|             \param Loc A locale used for classification
 | |
|             \return An instance of the \c is_classified predicate 
 | |
|         */
 | |
|         inline detail::is_classifiedF 
 | |
|         is_punct(const std::locale& Loc=std::locale())
 | |
|         {
 | |
|             return detail::is_classifiedF(std::ctype_base::punct, Loc);
 | |
|         }
 | |
| 
 | |
|         //! is_upper predicate
 | |
|         /*!
 | |
|             Construct the \c is_classified predicate for the \c ctype_base::upper category.   
 | |
| 
 | |
|             \param Loc A locale used for classification
 | |
|             \return An instance of the \c is_classified predicate 
 | |
|         */
 | |
|         inline detail::is_classifiedF 
 | |
|         is_upper(const std::locale& Loc=std::locale())
 | |
|         {
 | |
|             return detail::is_classifiedF(std::ctype_base::upper, Loc);
 | |
|         }
 | |
| 
 | |
|         //! is_xdigit predicate
 | |
|         /*!
 | |
|             Construct the \c is_classified predicate for the \c ctype_base::xdigit category.  
 | |
| 
 | |
|             \param Loc A locale used for classification
 | |
|             \return An instance of the \c is_classified predicate 
 | |
|         */
 | |
|         inline detail::is_classifiedF 
 | |
|         is_xdigit(const std::locale& Loc=std::locale())
 | |
|         {
 | |
|             return detail::is_classifiedF(std::ctype_base::xdigit, Loc);
 | |
|         }
 | |
| 
 | |
|         //! is_any_of predicate
 | |
|         /*!
 | |
|             Construct the \c is_any_of predicate. The predicate holds, if an input
 | |
|             is included in the specified set of characters.
 | |
| 
 | |
|             \param Set A set of characters to be recognized
 | |
|             \return An instance of the \c is_any_of predicate 
 | |
|         */
 | |
|         template<typename ContainerT>
 | |
|         inline detail::is_any_ofF<
 | |
|             BOOST_STRING_TYPENAME value_type_of<ContainerT>::type> 
 | |
|         is_any_of( const ContainerT& Set )
 | |
|         {
 | |
|             return detail::is_any_ofF<
 | |
|                 BOOST_STRING_TYPENAME value_type_of<ContainerT>::type>(Set); 
 | |
|         }
 | |
| 
 | |
|         //! is_from_range predicate
 | |
|         /*!
 | |
|             Construct the \c is_from_range predicate. The predicate holds, if an input
 | |
|             is included in the specified range. (i.e. From <= Ch <= To )
 | |
| 
 | |
|             \param From The start of the range
 | |
|             \param To The end of the range
 | |
|             \return An instance of the \c is_from_range predicate 
 | |
|         */
 | |
|         template<typename CharT>
 | |
|         inline detail::is_from_rangeF<CharT> is_from_range(CharT From, CharT To)
 | |
|         {
 | |
|             return detail::is_from_rangeF<CharT>(From,To); 
 | |
|         }
 | |
| 
 | |
|     } // namespace algorithm
 | |
| 
 | |
|     // pull names to the boost namespace
 | |
|     using algorithm::is_classified;
 | |
|     using algorithm::is_space;
 | |
|     using algorithm::is_alnum;
 | |
|     using algorithm::is_alpha;
 | |
|     using algorithm::is_cntrl;
 | |
|     using algorithm::is_digit;
 | |
|     using algorithm::is_graph;
 | |
|     using algorithm::is_lower;
 | |
|     using algorithm::is_upper;
 | |
|     using algorithm::is_print;
 | |
|     using algorithm::is_punct;
 | |
|     using algorithm::is_xdigit;
 | |
|     using algorithm::is_any_of;
 | |
|     using algorithm::is_from_range;
 | |
| 
 | |
| } // namespace boost
 | |
| 
 | |
| 
 | |
| // predicate combinators ---------------------------------------------------//
 | |
| /*
 | |
|  *    These operators must be declared in the global namespace, otherwise 
 | |
|  *  they are not resolved correctly. There will not a problem with a name-clash,
 | |
|  *  since they are define only for internal types
 | |
|  */ 
 | |
| 
 | |
| //! predicate 'and' composition predicate
 | |
| /*!
 | |
|     Construct the \c class_and predicate. This predicate can be used
 | |
|     to logically combine two classification predicates. \c class_and holds,
 | |
|     if both predicates return true.
 | |
| 
 | |
|     \param Pred1 The first predicate
 | |
|     \param Pred2 The second predicate
 | |
|     \return An instance of the \c class_and predicate     
 | |
| */
 | |
| template<typename Pred1T, typename Pred2T>
 | |
| inline boost::algorithm::detail::pred_andF<Pred1T, Pred2T>
 | |
| operator&&( 
 | |
|     const boost::algorithm::detail::predicate_facade<Pred1T>& Pred1, 
 | |
|     const boost::algorithm::detail::predicate_facade<Pred2T>& Pred2 )
 | |
| {    
 | |
|     return boost::algorithm::detail::pred_andF<Pred1T,Pred2T>(
 | |
|         static_cast<const Pred1T&>(Pred1), 
 | |
|         static_cast<const Pred2T&>(Pred2) );
 | |
| }
 | |
| 
 | |
| //! predicate 'or' composition predicate
 | |
| /*!
 | |
|     Construct the \c class_or predicate. This predicate can be used
 | |
|     to logically combine two classification predicates. \c class_or holds,
 | |
|     if one of the predicates return true.
 | |
| 
 | |
|     \param Pred1 The first predicate
 | |
|     \param Pred2 The second predicate
 | |
|     \return An instance of the \c class_or predicate     
 | |
| */
 | |
| template<typename Pred1T, typename Pred2T>
 | |
| inline boost::algorithm::detail::pred_orF<Pred1T, Pred2T>
 | |
| operator||( 
 | |
|     const boost::algorithm::detail::predicate_facade<Pred1T>& Pred1, 
 | |
|     const boost::algorithm::detail::predicate_facade<Pred2T>& Pred2 )
 | |
| {    
 | |
|     return boost::algorithm::detail::pred_orF<Pred1T,Pred2T>(
 | |
|         static_cast<const Pred1T&>(Pred1), 
 | |
|         static_cast<const Pred2T&>(Pred2));
 | |
| }
 | |
| 
 | |
| //! predicate negation operator
 | |
| /*!
 | |
|     Construct the \c class_not predicate. This predicate represents a negation. 
 | |
|     \c class_or holds, if of the predicates return false.
 | |
| 
 | |
|     \param Pred The predicate to be negated
 | |
|     \return An instance of the \c class_not predicate     
 | |
| */
 | |
| template<typename PredT>
 | |
| inline boost::algorithm::detail::pred_notF<PredT>
 | |
| operator!( const boost::algorithm::detail::predicate_facade<PredT>& Pred )
 | |
| {
 | |
|     return boost::algorithm::detail::pred_notF<PredT>(static_cast<const PredT&>(Pred)); 
 | |
| }
 | |
| 
 | |
| #endif  // BOOST_STRING_PREDICATE_HPP
 |