313 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			313 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								//  Boost string_algo library classification.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_CLASSIFICATION_HPP
							 | 
						||
| 
								 | 
							
								#define BOOST_STRING_CLASSIFICATION_HPP
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <algorithm>
							 | 
						||
| 
								 | 
							
								#include <locale>
							 | 
						||
| 
								 | 
							
								#include <boost/range/value_type.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/range/as_literal.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/algorithm/string/detail/classification.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/algorithm/string/predicate_facade.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 the 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 the \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 the 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 RangeT>
							 | 
						||
| 
								 | 
							
								        inline detail::is_any_ofF<
							 | 
						||
| 
								 | 
							
								            BOOST_STRING_TYPENAME range_value<RangeT>::type> 
							 | 
						||
| 
								 | 
							
								        is_any_of( const RangeT& Set )
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_set(boost::as_literal(Set));
							 | 
						||
| 
								 | 
							
								            return detail::is_any_ofF<BOOST_STRING_TYPENAME range_value<RangeT>::type>(lit_set); 
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        //! is_from_range predicate
							 | 
						||
| 
								 | 
							
								        /*!
							 | 
						||
| 
								 | 
							
								            Construct the \c is_from_range predicate. The predicate holds if the 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); 
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        
							 | 
						||
| 
								 | 
							
								        // predicate combinators ---------------------------------------------------//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        //! 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 detail::pred_andF<Pred1T, Pred2T>
							 | 
						||
| 
								 | 
							
								        operator&&( 
							 | 
						||
| 
								 | 
							
								            const predicate_facade<Pred1T>& Pred1, 
							 | 
						||
| 
								 | 
							
								            const predicate_facade<Pred2T>& Pred2 )
							 | 
						||
| 
								 | 
							
								        {    
							 | 
						||
| 
								 | 
							
								            // Doing the static_cast with the pointer instead of the reference
							 | 
						||
| 
								 | 
							
								            // is a workaround for some compilers which have problems with
							 | 
						||
| 
								 | 
							
								            // static_cast's of template references, i.e. CW8. /grafik/
							 | 
						||
| 
								 | 
							
								            return 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 detail::pred_orF<Pred1T, Pred2T>
							 | 
						||
| 
								 | 
							
								        operator||( 
							 | 
						||
| 
								 | 
							
								            const predicate_facade<Pred1T>& Pred1, 
							 | 
						||
| 
								 | 
							
								            const predicate_facade<Pred2T>& Pred2 )
							 | 
						||
| 
								 | 
							
								        {    
							 | 
						||
| 
								 | 
							
								            // Doing the static_cast with the pointer instead of the reference
							 | 
						||
| 
								 | 
							
								            // is a workaround for some compilers which have problems with
							 | 
						||
| 
								 | 
							
								            // static_cast's of template references, i.e. CW8. /grafik/
							 | 
						||
| 
								 | 
							
								            return 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 detail::pred_notF<PredT>
							 | 
						||
| 
								 | 
							
								        operator!( const predicate_facade<PredT>& Pred )
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            // Doing the static_cast with the pointer instead of the reference
							 | 
						||
| 
								 | 
							
								            // is a workaround for some compilers which have problems with
							 | 
						||
| 
								 | 
							
								            // static_cast's of template references, i.e. CW8. /grafik/
							 | 
						||
| 
								 | 
							
								            return detail::pred_notF<PredT>(*static_cast<const PredT*>(&Pred)); 
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    } // 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
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif  // BOOST_STRING_PREDICATE_HPP
							 |