You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
231 lines
6.6 KiB
231 lines
6.6 KiB
/////////////////////////////////////////////////////////////////////////////// |
|
/// \file null_regex_traits.hpp |
|
/// Contains the definition of the null_regex_traits\<\> template, which is a |
|
/// stub regex traits implementation that can be used by static and dynamic |
|
/// regexes for searching non-character data. |
|
// |
|
// Copyright 2008 Eric Niebler. 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) |
|
|
|
#ifndef BOOST_XPRESSIVE_TRAITS_NULL_REGEX_TRAITS_HPP_EAN_10_04_2005 |
|
#define BOOST_XPRESSIVE_TRAITS_NULL_REGEX_TRAITS_HPP_EAN_10_04_2005 |
|
|
|
// MS compatible compilers support #pragma once |
|
#if defined(_MSC_VER) && (_MSC_VER >= 1020) |
|
# pragma once |
|
#endif |
|
|
|
#include <vector> |
|
#include <boost/assert.hpp> |
|
#include <boost/mpl/assert.hpp> |
|
#include <boost/xpressive/detail/detail_fwd.hpp> |
|
#include <boost/xpressive/detail/utility/never_true.hpp> |
|
#include <boost/xpressive/detail/utility/ignore_unused.hpp> |
|
|
|
namespace boost { namespace xpressive |
|
{ |
|
|
|
namespace detail |
|
{ |
|
struct not_a_locale {}; |
|
} |
|
|
|
struct regex_traits_version_1_tag; |
|
|
|
/////////////////////////////////////////////////////////////////////////////// |
|
// null_regex_traits |
|
// |
|
/// \brief stub regex_traits for non-char data |
|
/// |
|
template<typename Elem> |
|
struct null_regex_traits |
|
{ |
|
typedef Elem char_type; |
|
typedef std::vector<char_type> string_type; |
|
typedef detail::not_a_locale locale_type; |
|
typedef int char_class_type; |
|
typedef regex_traits_version_1_tag version_tag; |
|
|
|
/// Initialize a null_regex_traits object. |
|
/// |
|
null_regex_traits(locale_type = locale_type()) |
|
{ |
|
} |
|
|
|
/// Checks two null_regex_traits objects for equality |
|
/// |
|
/// \return true. |
|
bool operator ==(null_regex_traits<char_type> const &that) const |
|
{ |
|
detail::ignore_unused(that); |
|
return true; |
|
} |
|
|
|
/// Checks two null_regex_traits objects for inequality |
|
/// |
|
/// \return false. |
|
bool operator !=(null_regex_traits<char_type> const &that) const |
|
{ |
|
detail::ignore_unused(that); |
|
return false; |
|
} |
|
|
|
/// Convert a char to a Elem |
|
/// |
|
/// \param ch The source character. |
|
/// \return Elem(ch). |
|
char_type widen(char ch) const |
|
{ |
|
return char_type(ch); |
|
} |
|
|
|
/// Returns a hash value for a Elem in the range [0, UCHAR_MAX] |
|
/// |
|
/// \param ch The source character. |
|
/// \return a value between 0 and UCHAR_MAX, inclusive. |
|
static unsigned char hash(char_type ch) |
|
{ |
|
return static_cast<unsigned char>(ch); |
|
} |
|
|
|
/// No-op |
|
/// |
|
/// \param ch The source character. |
|
/// \return ch |
|
static char_type translate(char_type ch) |
|
{ |
|
return ch; |
|
} |
|
|
|
/// No-op |
|
/// |
|
/// \param ch The source character. |
|
/// \return ch |
|
static char_type translate_nocase(char_type ch) |
|
{ |
|
return ch; |
|
} |
|
|
|
/// Checks to see if a character is within a character range. |
|
/// |
|
/// \param first The bottom of the range, inclusive. |
|
/// \param last The top of the range, inclusive. |
|
/// \param ch The source character. |
|
/// \return first <= ch && ch <= last. |
|
static bool in_range(char_type first, char_type last, char_type ch) |
|
{ |
|
return first <= ch && ch <= last; |
|
} |
|
|
|
/// Checks to see if a character is within a character range. |
|
/// |
|
/// \param first The bottom of the range, inclusive. |
|
/// \param last The top of the range, inclusive. |
|
/// \param ch The source character. |
|
/// \return first <= ch && ch <= last. |
|
/// \attention Since the null_regex_traits does not do case-folding, |
|
/// this function is equivalent to in_range(). |
|
static bool in_range_nocase(char_type first, char_type last, char_type ch) |
|
{ |
|
return first <= ch && ch <= last; |
|
} |
|
|
|
/// Returns a sort key for the character sequence designated by the iterator range [F1, F2) |
|
/// such that if the character sequence [G1, G2) sorts before the character sequence [H1, H2) |
|
/// then v.transform(G1, G2) < v.transform(H1, H2). |
|
/// |
|
/// \attention Not currently used |
|
template<typename FwdIter> |
|
static string_type transform(FwdIter begin, FwdIter end) |
|
{ |
|
return string_type(begin, end); |
|
} |
|
|
|
/// Returns a sort key for the character sequence designated by the iterator range [F1, F2) |
|
/// such that if the character sequence [G1, G2) sorts before the character sequence [H1, H2) |
|
/// when character case is not considered then |
|
/// v.transform_primary(G1, G2) < v.transform_primary(H1, H2). |
|
/// |
|
/// \attention Not currently used |
|
template<typename FwdIter> |
|
static string_type transform_primary(FwdIter begin, FwdIter end) |
|
{ |
|
return string_type(begin, end); |
|
} |
|
|
|
/// Returns a sequence of characters that represents the collating element |
|
/// consisting of the character sequence designated by the iterator range [F1, F2). |
|
/// Returns an empty string if the character sequence is not a valid collating element. |
|
/// |
|
/// \attention Not currently used |
|
template<typename FwdIter> |
|
static string_type lookup_collatename(FwdIter begin, FwdIter end) |
|
{ |
|
detail::ignore_unused(begin); |
|
detail::ignore_unused(end); |
|
return string_type(); |
|
} |
|
|
|
/// The null_regex_traits does not have character classifications, so lookup_classname() |
|
/// is unused. |
|
/// |
|
/// \param begin not used |
|
/// \param end not used |
|
/// \param icase not used |
|
/// \return static_cast\<char_class_type\>(0) |
|
template<typename FwdIter> |
|
static char_class_type lookup_classname(FwdIter begin, FwdIter end, bool icase) |
|
{ |
|
detail::ignore_unused(begin); |
|
detail::ignore_unused(end); |
|
detail::ignore_unused(icase); |
|
return 0; |
|
} |
|
|
|
/// The null_regex_traits does not have character classifications, so isctype() |
|
/// is unused. |
|
/// |
|
/// \param ch not used |
|
/// \param mask not used |
|
/// \return false |
|
static bool isctype(char_type ch, char_class_type mask) |
|
{ |
|
detail::ignore_unused(ch); |
|
detail::ignore_unused(mask); |
|
return false; |
|
} |
|
|
|
/// The null_regex_traits recognizes no elements as digits, so value() is unused. |
|
/// |
|
/// \param ch not used |
|
/// \param radix not used |
|
/// \return -1 |
|
static int value(char_type ch, int radix) |
|
{ |
|
detail::ignore_unused(ch); |
|
detail::ignore_unused(radix); |
|
return -1; |
|
} |
|
|
|
/// Not used |
|
/// |
|
/// \param loc not used |
|
/// \return loc |
|
static locale_type imbue(locale_type loc) |
|
{ |
|
return loc; |
|
} |
|
|
|
/// Returns locale_type(). |
|
/// |
|
/// \return locale_type() |
|
static locale_type getloc() |
|
{ |
|
return locale_type(); |
|
} |
|
}; |
|
|
|
}} |
|
|
|
#endif
|
|
|