312 lines
11 KiB
C++
312 lines
11 KiB
C++
// 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
|