Base regex code on char_class_type.
__get_classname() and __bracket_expression were assuming that char_class_type was ctype_base::mask rather than using regex_traits<_CharT>::char_class_type. This change allows char_class_type to be defined to something other than ctype_base::mask so that the implementation will still work for platforms with an 8-bit ctype mask (such as Android and OpenBSD). git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@214201 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e515bbda1b
commit
1757386944
@ -1192,7 +1192,8 @@ regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f,
|
|||||||
|
|
||||||
// lookup_classname
|
// lookup_classname
|
||||||
|
|
||||||
ctype_base::mask _LIBCPP_FUNC_VIS __get_classname(const char* __s, bool __icase);
|
regex_traits<char>::char_class_type _LIBCPP_FUNC_VIS
|
||||||
|
__get_classname(const char* __s, bool __icase);
|
||||||
|
|
||||||
template <class _CharT>
|
template <class _CharT>
|
||||||
template <class _ForwardIterator>
|
template <class _ForwardIterator>
|
||||||
@ -2184,8 +2185,8 @@ class __bracket_expression
|
|||||||
vector<pair<string_type, string_type> > __ranges_;
|
vector<pair<string_type, string_type> > __ranges_;
|
||||||
vector<pair<_CharT, _CharT> > __digraphs_;
|
vector<pair<_CharT, _CharT> > __digraphs_;
|
||||||
vector<string_type> __equivalences_;
|
vector<string_type> __equivalences_;
|
||||||
ctype_base::mask __mask_;
|
typename regex_traits<_CharT>::char_class_type __mask_;
|
||||||
ctype_base::mask __neg_mask_;
|
typename regex_traits<_CharT>::char_class_type __neg_mask_;
|
||||||
bool __negate_;
|
bool __negate_;
|
||||||
bool __icase_;
|
bool __icase_;
|
||||||
bool __collate_;
|
bool __collate_;
|
||||||
@ -2281,10 +2282,10 @@ public:
|
|||||||
void __add_equivalence(const string_type& __s)
|
void __add_equivalence(const string_type& __s)
|
||||||
{__equivalences_.push_back(__s);}
|
{__equivalences_.push_back(__s);}
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void __add_class(ctype_base::mask __mask)
|
void __add_class(typename regex_traits<_CharT>::char_class_type __mask)
|
||||||
{__mask_ |= __mask;}
|
{__mask_ |= __mask;}
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void __add_neg_class(ctype_base::mask __mask)
|
void __add_neg_class(typename regex_traits<_CharT>::char_class_type __mask)
|
||||||
{__neg_mask_ |= __mask;}
|
{__neg_mask_ |= __mask;}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -207,7 +207,7 @@ const collationnames collatenames[] =
|
|||||||
struct classnames
|
struct classnames
|
||||||
{
|
{
|
||||||
const char* elem_;
|
const char* elem_;
|
||||||
ctype_base::mask mask_;
|
regex_traits<char>::char_class_type mask_;
|
||||||
};
|
};
|
||||||
|
|
||||||
#if defined(__clang__)
|
#if defined(__clang__)
|
||||||
@ -254,12 +254,12 @@ __get_collation_name(const char* s)
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
ctype_base::mask
|
regex_traits<char>::char_class_type
|
||||||
__get_classname(const char* s, bool __icase)
|
__get_classname(const char* s, bool __icase)
|
||||||
{
|
{
|
||||||
const classnames* i =
|
const classnames* i =
|
||||||
_VSTD::lower_bound(begin(ClassNames), end(ClassNames), s, use_strcmp());
|
_VSTD::lower_bound(begin(ClassNames), end(ClassNames), s, use_strcmp());
|
||||||
ctype_base::mask r = 0;
|
regex_traits<char>::char_class_type r = 0;
|
||||||
if (i != end(ClassNames) && strcmp(s, i->elem_) == 0)
|
if (i != end(ClassNames) && strcmp(s, i->elem_) == 0)
|
||||||
{
|
{
|
||||||
r = i->mask_;
|
r = i->mask_;
|
||||||
|
@ -22,7 +22,9 @@
|
|||||||
|
|
||||||
template <class char_type>
|
template <class char_type>
|
||||||
void
|
void
|
||||||
test(const char_type* A, std::ctype_base::mask expected, bool icase = false)
|
test(const char_type* A,
|
||||||
|
typename std::regex_traits<char_type>::char_class_type expected,
|
||||||
|
bool icase = false)
|
||||||
{
|
{
|
||||||
std::regex_traits<char_type> t;
|
std::regex_traits<char_type> t;
|
||||||
typedef forward_iterator<const char_type*> F;
|
typedef forward_iterator<const char_type*> F;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user