1e78f53d1SNikolas Klauser// -*- C++ -*- 2e78f53d1SNikolas Klauser//===----------------------------------------------------------------------===// 3e78f53d1SNikolas Klauser// 4e78f53d1SNikolas Klauser// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5e78f53d1SNikolas Klauser// See https://llvm.org/LICENSE.txt for license information. 6e78f53d1SNikolas Klauser// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7e78f53d1SNikolas Klauser// 8e78f53d1SNikolas Klauser//===----------------------------------------------------------------------===// 9e78f53d1SNikolas Klauser 10ce777190SNikolas Klauser#ifndef _LIBCPP___CXX03_REGEX 11ce777190SNikolas Klauser#define _LIBCPP___CXX03_REGEX 12e78f53d1SNikolas Klauser 13e78f53d1SNikolas Klauser/* 14e78f53d1SNikolas Klauser regex synopsis 15e78f53d1SNikolas Klauser 1673fbae83SNikolas Klauser#include <__cxx03/compare> 1773fbae83SNikolas Klauser#include <__cxx03/initializer_list> 18e78f53d1SNikolas Klauser 19e78f53d1SNikolas Klausernamespace std 20e78f53d1SNikolas Klauser{ 21e78f53d1SNikolas Klauser 22e78f53d1SNikolas Klausernamespace regex_constants 23e78f53d1SNikolas Klauser{ 24e78f53d1SNikolas Klauser 25e78f53d1SNikolas Klauserenum syntax_option_type 26e78f53d1SNikolas Klauser{ 27e78f53d1SNikolas Klauser icase = unspecified, 28e78f53d1SNikolas Klauser nosubs = unspecified, 29e78f53d1SNikolas Klauser optimize = unspecified, 30e78f53d1SNikolas Klauser collate = unspecified, 31e78f53d1SNikolas Klauser ECMAScript = unspecified, 32e78f53d1SNikolas Klauser basic = unspecified, 33e78f53d1SNikolas Klauser extended = unspecified, 34e78f53d1SNikolas Klauser awk = unspecified, 35e78f53d1SNikolas Klauser grep = unspecified, 36e78f53d1SNikolas Klauser egrep = unspecified, 37e78f53d1SNikolas Klauser multiline = unspecified 38e78f53d1SNikolas Klauser}; 39e78f53d1SNikolas Klauser 40e78f53d1SNikolas Klauserconstexpr syntax_option_type operator~(syntax_option_type f); 41e78f53d1SNikolas Klauserconstexpr syntax_option_type operator&(syntax_option_type lhs, syntax_option_type rhs); 42e78f53d1SNikolas Klauserconstexpr syntax_option_type operator|(syntax_option_type lhs, syntax_option_type rhs); 43e78f53d1SNikolas Klauser 44e78f53d1SNikolas Klauserenum match_flag_type 45e78f53d1SNikolas Klauser{ 46e78f53d1SNikolas Klauser match_default = 0, 47e78f53d1SNikolas Klauser match_not_bol = unspecified, 48e78f53d1SNikolas Klauser match_not_eol = unspecified, 49e78f53d1SNikolas Klauser match_not_bow = unspecified, 50e78f53d1SNikolas Klauser match_not_eow = unspecified, 51e78f53d1SNikolas Klauser match_any = unspecified, 52e78f53d1SNikolas Klauser match_not_null = unspecified, 53e78f53d1SNikolas Klauser match_continuous = unspecified, 54e78f53d1SNikolas Klauser match_prev_avail = unspecified, 55e78f53d1SNikolas Klauser format_default = 0, 56e78f53d1SNikolas Klauser format_sed = unspecified, 57e78f53d1SNikolas Klauser format_no_copy = unspecified, 58e78f53d1SNikolas Klauser format_first_only = unspecified 59e78f53d1SNikolas Klauser}; 60e78f53d1SNikolas Klauser 61e78f53d1SNikolas Klauserconstexpr match_flag_type operator~(match_flag_type f); 62e78f53d1SNikolas Klauserconstexpr match_flag_type operator&(match_flag_type lhs, match_flag_type rhs); 63e78f53d1SNikolas Klauserconstexpr match_flag_type operator|(match_flag_type lhs, match_flag_type rhs); 64e78f53d1SNikolas Klauser 65e78f53d1SNikolas Klauserenum error_type 66e78f53d1SNikolas Klauser{ 67e78f53d1SNikolas Klauser error_collate = unspecified, 68e78f53d1SNikolas Klauser error_ctype = unspecified, 69e78f53d1SNikolas Klauser error_escape = unspecified, 70e78f53d1SNikolas Klauser error_backref = unspecified, 71e78f53d1SNikolas Klauser error_brack = unspecified, 72e78f53d1SNikolas Klauser error_paren = unspecified, 73e78f53d1SNikolas Klauser error_brace = unspecified, 74e78f53d1SNikolas Klauser error_badbrace = unspecified, 75e78f53d1SNikolas Klauser error_range = unspecified, 76e78f53d1SNikolas Klauser error_space = unspecified, 77e78f53d1SNikolas Klauser error_badrepeat = unspecified, 78e78f53d1SNikolas Klauser error_complexity = unspecified, 79e78f53d1SNikolas Klauser error_stack = unspecified 80e78f53d1SNikolas Klauser}; 81e78f53d1SNikolas Klauser 82e78f53d1SNikolas Klauser} // regex_constants 83e78f53d1SNikolas Klauser 84e78f53d1SNikolas Klauserclass regex_error 85e78f53d1SNikolas Klauser : public runtime_error 86e78f53d1SNikolas Klauser{ 87e78f53d1SNikolas Klauserpublic: 88e78f53d1SNikolas Klauser explicit regex_error(regex_constants::error_type ecode); 89e78f53d1SNikolas Klauser regex_constants::error_type code() const; 90e78f53d1SNikolas Klauser}; 91e78f53d1SNikolas Klauser 92e78f53d1SNikolas Klausertemplate <class charT> 93e78f53d1SNikolas Klauserstruct regex_traits 94e78f53d1SNikolas Klauser{ 95e78f53d1SNikolas Klauserpublic: 96e78f53d1SNikolas Klauser typedef charT char_type; 97e78f53d1SNikolas Klauser typedef basic_string<char_type> string_type; 98e78f53d1SNikolas Klauser typedef locale locale_type; 99e78f53d1SNikolas Klauser typedef /bitmask_type/ char_class_type; 100e78f53d1SNikolas Klauser 101e78f53d1SNikolas Klauser regex_traits(); 102e78f53d1SNikolas Klauser 103e78f53d1SNikolas Klauser static size_t length(const char_type* p); 104e78f53d1SNikolas Klauser charT translate(charT c) const; 105e78f53d1SNikolas Klauser charT translate_nocase(charT c) const; 106e78f53d1SNikolas Klauser template <class ForwardIterator> 107e78f53d1SNikolas Klauser string_type 108e78f53d1SNikolas Klauser transform(ForwardIterator first, ForwardIterator last) const; 109e78f53d1SNikolas Klauser template <class ForwardIterator> 110e78f53d1SNikolas Klauser string_type 111e78f53d1SNikolas Klauser transform_primary( ForwardIterator first, ForwardIterator last) const; 112e78f53d1SNikolas Klauser template <class ForwardIterator> 113e78f53d1SNikolas Klauser string_type 114e78f53d1SNikolas Klauser lookup_collatename(ForwardIterator first, ForwardIterator last) const; 115e78f53d1SNikolas Klauser template <class ForwardIterator> 116e78f53d1SNikolas Klauser char_class_type 117e78f53d1SNikolas Klauser lookup_classname(ForwardIterator first, ForwardIterator last, 118e78f53d1SNikolas Klauser bool icase = false) const; 119e78f53d1SNikolas Klauser bool isctype(charT c, char_class_type f) const; 120e78f53d1SNikolas Klauser int value(charT ch, int radix) const; 121e78f53d1SNikolas Klauser locale_type imbue(locale_type l); 122e78f53d1SNikolas Klauser locale_type getloc()const; 123e78f53d1SNikolas Klauser}; 124e78f53d1SNikolas Klauser 125e78f53d1SNikolas Klausertemplate <class charT, class traits = regex_traits<charT>> 126e78f53d1SNikolas Klauserclass basic_regex 127e78f53d1SNikolas Klauser{ 128e78f53d1SNikolas Klauserpublic: 129e78f53d1SNikolas Klauser // types: 130e78f53d1SNikolas Klauser typedef charT value_type; 131e78f53d1SNikolas Klauser typedef traits traits_type; 132e78f53d1SNikolas Klauser typedef typename traits::string_type string_type; 133e78f53d1SNikolas Klauser typedef regex_constants::syntax_option_type flag_type; 134e78f53d1SNikolas Klauser typedef typename traits::locale_type locale_type; 135e78f53d1SNikolas Klauser 136e78f53d1SNikolas Klauser // constants: 137e78f53d1SNikolas Klauser static constexpr regex_constants::syntax_option_type icase = regex_constants::icase; 138e78f53d1SNikolas Klauser static constexpr regex_constants::syntax_option_type nosubs = regex_constants::nosubs; 139e78f53d1SNikolas Klauser static constexpr regex_constants::syntax_option_type optimize = regex_constants::optimize; 140e78f53d1SNikolas Klauser static constexpr regex_constants::syntax_option_type collate = regex_constants::collate; 141e78f53d1SNikolas Klauser static constexpr regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript; 142e78f53d1SNikolas Klauser static constexpr regex_constants::syntax_option_type basic = regex_constants::basic; 143e78f53d1SNikolas Klauser static constexpr regex_constants::syntax_option_type extended = regex_constants::extended; 144e78f53d1SNikolas Klauser static constexpr regex_constants::syntax_option_type awk = regex_constants::awk; 145e78f53d1SNikolas Klauser static constexpr regex_constants::syntax_option_type grep = regex_constants::grep; 146e78f53d1SNikolas Klauser static constexpr regex_constants::syntax_option_type egrep = regex_constants::egrep; 147e78f53d1SNikolas Klauser static constexpr regex_constants::syntax_option_type multiline = regex_constants::multiline; 148e78f53d1SNikolas Klauser 149e78f53d1SNikolas Klauser // construct/copy/destroy: 150e78f53d1SNikolas Klauser basic_regex(); 151e78f53d1SNikolas Klauser explicit basic_regex(const charT* p, flag_type f = regex_constants::ECMAScript); 152e78f53d1SNikolas Klauser basic_regex(const charT* p, size_t len, flag_type f = regex_constants::ECMAScript); 153e78f53d1SNikolas Klauser basic_regex(const basic_regex&); 154e78f53d1SNikolas Klauser basic_regex(basic_regex&&) noexcept; 155e78f53d1SNikolas Klauser template <class ST, class SA> 156e78f53d1SNikolas Klauser explicit basic_regex(const basic_string<charT, ST, SA>& p, 157e78f53d1SNikolas Klauser flag_type f = regex_constants::ECMAScript); 158e78f53d1SNikolas Klauser template <class ForwardIterator> 159e78f53d1SNikolas Klauser basic_regex(ForwardIterator first, ForwardIterator last, 160e78f53d1SNikolas Klauser flag_type f = regex_constants::ECMAScript); 161e78f53d1SNikolas Klauser basic_regex(initializer_list<charT>, flag_type = regex_constants::ECMAScript); 162e78f53d1SNikolas Klauser 163e78f53d1SNikolas Klauser ~basic_regex(); 164e78f53d1SNikolas Klauser 165e78f53d1SNikolas Klauser basic_regex& operator=(const basic_regex&); 166e78f53d1SNikolas Klauser basic_regex& operator=(basic_regex&&) noexcept; 167e78f53d1SNikolas Klauser basic_regex& operator=(const charT* ptr); 168e78f53d1SNikolas Klauser basic_regex& operator=(initializer_list<charT> il); 169e78f53d1SNikolas Klauser template <class ST, class SA> 170e78f53d1SNikolas Klauser basic_regex& operator=(const basic_string<charT, ST, SA>& p); 171e78f53d1SNikolas Klauser 172e78f53d1SNikolas Klauser // assign: 173e78f53d1SNikolas Klauser basic_regex& assign(const basic_regex& that); 174e78f53d1SNikolas Klauser basic_regex& assign(basic_regex&& that) noexcept; 175e78f53d1SNikolas Klauser basic_regex& assign(const charT* ptr, flag_type f = regex_constants::ECMAScript); 176e78f53d1SNikolas Klauser basic_regex& assign(const charT* p, size_t len, flag_type f = regex_constants::ECMAScript); 177e78f53d1SNikolas Klauser template <class string_traits, class A> 178e78f53d1SNikolas Klauser basic_regex& assign(const basic_string<charT, string_traits, A>& s, 179e78f53d1SNikolas Klauser flag_type f = regex_constants::ECMAScript); 180e78f53d1SNikolas Klauser template <class InputIterator> 181e78f53d1SNikolas Klauser basic_regex& assign(InputIterator first, InputIterator last, 182e78f53d1SNikolas Klauser flag_type f = regex_constants::ECMAScript); 183e78f53d1SNikolas Klauser basic_regex& assign(initializer_list<charT>, flag_type f = regex_constants::ECMAScript); 184e78f53d1SNikolas Klauser 185e78f53d1SNikolas Klauser // const operations: 186e78f53d1SNikolas Klauser unsigned mark_count() const; 187e78f53d1SNikolas Klauser flag_type flags() const; 188e78f53d1SNikolas Klauser 189e78f53d1SNikolas Klauser // locale: 190e78f53d1SNikolas Klauser locale_type imbue(locale_type loc); 191e78f53d1SNikolas Klauser locale_type getloc() const; 192e78f53d1SNikolas Klauser 193e78f53d1SNikolas Klauser // swap: 194e78f53d1SNikolas Klauser void swap(basic_regex&); 195e78f53d1SNikolas Klauser}; 196e78f53d1SNikolas Klauser 197e78f53d1SNikolas Klausertemplate<class ForwardIterator> 198e78f53d1SNikolas Klauserbasic_regex(ForwardIterator, ForwardIterator, 199e78f53d1SNikolas Klauser regex_constants::syntax_option_type = regex_constants::ECMAScript) 200e78f53d1SNikolas Klauser -> basic_regex<typename iterator_traits<ForwardIterator>::value_type>; // C++17 201e78f53d1SNikolas Klauser 202e78f53d1SNikolas Klausertypedef basic_regex<char> regex; 203e78f53d1SNikolas Klausertypedef basic_regex<wchar_t> wregex; 204e78f53d1SNikolas Klauser 205e78f53d1SNikolas Klausertemplate <class charT, class traits> 206e78f53d1SNikolas Klauser void swap(basic_regex<charT, traits>& e1, basic_regex<charT, traits>& e2); 207e78f53d1SNikolas Klauser 208e78f53d1SNikolas Klausertemplate <class BidirectionalIterator> 209e78f53d1SNikolas Klauserclass sub_match 210e78f53d1SNikolas Klauser : public pair<BidirectionalIterator, BidirectionalIterator> 211e78f53d1SNikolas Klauser{ 212e78f53d1SNikolas Klauserpublic: 213e78f53d1SNikolas Klauser typedef typename iterator_traits<BidirectionalIterator>::value_type value_type; 214e78f53d1SNikolas Klauser typedef typename iterator_traits<BidirectionalIterator>::difference_type difference_type; 215e78f53d1SNikolas Klauser typedef BidirectionalIterator iterator; 216e78f53d1SNikolas Klauser typedef basic_string<value_type> string_type; 217e78f53d1SNikolas Klauser 218e78f53d1SNikolas Klauser bool matched; 219e78f53d1SNikolas Klauser 220e78f53d1SNikolas Klauser constexpr sub_match(); 221e78f53d1SNikolas Klauser 222e78f53d1SNikolas Klauser difference_type length() const; 223e78f53d1SNikolas Klauser operator string_type() const; 224e78f53d1SNikolas Klauser string_type str() const; 225e78f53d1SNikolas Klauser 226e78f53d1SNikolas Klauser int compare(const sub_match& s) const; 227e78f53d1SNikolas Klauser int compare(const string_type& s) const; 228e78f53d1SNikolas Klauser int compare(const value_type* s) const; 229e78f53d1SNikolas Klauser 230e78f53d1SNikolas Klauser void swap(sub_match& s) noexcept(see below); 231e78f53d1SNikolas Klauser}; 232e78f53d1SNikolas Klauser 233e78f53d1SNikolas Klausertypedef sub_match<const char*> csub_match; 234e78f53d1SNikolas Klausertypedef sub_match<const wchar_t*> wcsub_match; 235e78f53d1SNikolas Klausertypedef sub_match<string::const_iterator> ssub_match; 236e78f53d1SNikolas Klausertypedef sub_match<wstring::const_iterator> wssub_match; 237e78f53d1SNikolas Klauser 238e78f53d1SNikolas Klausertemplate <class BiIter> 239e78f53d1SNikolas Klauser bool 240e78f53d1SNikolas Klauser operator==(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs); 241e78f53d1SNikolas Klauser 242e78f53d1SNikolas Klausertemplate <class BiIter> 243e78f53d1SNikolas Klauser auto 244e78f53d1SNikolas Klauser operator<=>(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs); // Since C++20 245e78f53d1SNikolas Klauser 246e78f53d1SNikolas Klauser template <class BiIter> // Removed in C++20 247e78f53d1SNikolas Klauser bool 248e78f53d1SNikolas Klauser operator!=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs); 249e78f53d1SNikolas Klauser 250e78f53d1SNikolas Klausertemplate <class BiIter> // Removed in C++20 251e78f53d1SNikolas Klauser bool 252e78f53d1SNikolas Klauser operator<(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs); 253e78f53d1SNikolas Klauser 254e78f53d1SNikolas Klausertemplate <class BiIter> // Removed in C++20 255e78f53d1SNikolas Klauser bool 256e78f53d1SNikolas Klauser operator<=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs); 257e78f53d1SNikolas Klauser 258e78f53d1SNikolas Klausertemplate <class BiIter> // Removed in C++20 259e78f53d1SNikolas Klauser bool 260e78f53d1SNikolas Klauser operator>=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs); 261e78f53d1SNikolas Klauser 262e78f53d1SNikolas Klausertemplate <class BiIter> // Removed in C++20 263e78f53d1SNikolas Klauser bool 264e78f53d1SNikolas Klauser operator>(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs); 265e78f53d1SNikolas Klauser 266e78f53d1SNikolas Klausertemplate <class BiIter, class ST, class SA> // Removed in C++20 267e78f53d1SNikolas Klauser bool 268e78f53d1SNikolas Klauser operator==(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs, 269e78f53d1SNikolas Klauser const sub_match<BiIter>& rhs); 270e78f53d1SNikolas Klauser 271e78f53d1SNikolas Klausertemplate <class BiIter, class ST, class SA> // Removed in C++20 272e78f53d1SNikolas Klauser bool 273e78f53d1SNikolas Klauser operator!=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs, 274e78f53d1SNikolas Klauser const sub_match<BiIter>& rhs); 275e78f53d1SNikolas Klauser 276e78f53d1SNikolas Klausertemplate <class BiIter, class ST, class SA> // Removed in C++20 277e78f53d1SNikolas Klauser bool 278e78f53d1SNikolas Klauser operator<(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs, 279e78f53d1SNikolas Klauser const sub_match<BiIter>& rhs); 280e78f53d1SNikolas Klauser 281e78f53d1SNikolas Klausertemplate <class BiIter, class ST, class SA> // Removed in C++20 282e78f53d1SNikolas Klauser bool 283e78f53d1SNikolas Klauser operator>(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs, 284e78f53d1SNikolas Klauser const sub_match<BiIter>& rhs); 285e78f53d1SNikolas Klauser 286e78f53d1SNikolas Klausertemplate <class BiIter, class ST, class SA> // Removed in C++20 287e78f53d1SNikolas Klauser bool operator>=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs, 288e78f53d1SNikolas Klauser const sub_match<BiIter>& rhs); 289e78f53d1SNikolas Klauser 290e78f53d1SNikolas Klausertemplate <class BiIter, class ST, class SA> // Removed in C++20 291e78f53d1SNikolas Klauser bool 292e78f53d1SNikolas Klauser operator<=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs, 293e78f53d1SNikolas Klauser const sub_match<BiIter>& rhs); 294e78f53d1SNikolas Klauser 295e78f53d1SNikolas Klausertemplate <class BiIter, class ST, class SA> 296e78f53d1SNikolas Klauser bool 297e78f53d1SNikolas Klauser operator==(const sub_match<BiIter>& lhs, 298e78f53d1SNikolas Klauser const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs); 299e78f53d1SNikolas Klauser 300e78f53d1SNikolas Klausertemplate <class BiIter, class ST, class SA> // Since C++20 301e78f53d1SNikolas Klauser auto 302e78f53d1SNikolas Klauser operator<=>(const sub_match<BiIter>& lhs, 303e78f53d1SNikolas Klauser const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs); 304e78f53d1SNikolas Klauser 305e78f53d1SNikolas Klausertemplate <class BiIter, class ST, class SA> // Removed in C++20 306e78f53d1SNikolas Klauser bool 307e78f53d1SNikolas Klauser operator!=(const sub_match<BiIter>& lhs, 308e78f53d1SNikolas Klauser const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs); 309e78f53d1SNikolas Klauser 310e78f53d1SNikolas Klausertemplate <class BiIter, class ST, class SA> // Removed in C++20 311e78f53d1SNikolas Klauser bool 312e78f53d1SNikolas Klauser operator<(const sub_match<BiIter>& lhs, 313e78f53d1SNikolas Klauser const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs); 314e78f53d1SNikolas Klauser 315e78f53d1SNikolas Klausertemplate <class BiIter, class ST, class SA> // Removed in C++20 316e78f53d1SNikolas Klauser bool 317e78f53d1SNikolas Klauser operator>(const sub_match<BiIter>& lhs, 318e78f53d1SNikolas Klauser const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs); 319e78f53d1SNikolas Klauser 320e78f53d1SNikolas Klausertemplate <class BiIter, class ST, class SA> // Removed in C++20 321e78f53d1SNikolas Klauser bool 322e78f53d1SNikolas Klauser operator>=(const sub_match<BiIter>& lhs, 323e78f53d1SNikolas Klauser const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs); 324e78f53d1SNikolas Klauser 325e78f53d1SNikolas Klausertemplate <class BiIter, class ST, class SA> // Removed in C++20 326e78f53d1SNikolas Klauser bool 327e78f53d1SNikolas Klauser operator<=(const sub_match<BiIter>& lhs, 328e78f53d1SNikolas Klauser const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs); 329e78f53d1SNikolas Klauser 330e78f53d1SNikolas Klausertemplate <class BiIter> // Removed in C++20 331e78f53d1SNikolas Klauser bool 332e78f53d1SNikolas Klauser operator==(typename iterator_traits<BiIter>::value_type const* lhs, 333e78f53d1SNikolas Klauser const sub_match<BiIter>& rhs); 334e78f53d1SNikolas Klauser 335e78f53d1SNikolas Klausertemplate <class BiIter> // Removed in C++20 336e78f53d1SNikolas Klauser bool 337e78f53d1SNikolas Klauser operator!=(typename iterator_traits<BiIter>::value_type const* lhs, 338e78f53d1SNikolas Klauser const sub_match<BiIter>& rhs); 339e78f53d1SNikolas Klauser 340e78f53d1SNikolas Klausertemplate <class BiIter> // Removed in C++20 341e78f53d1SNikolas Klauser bool 342e78f53d1SNikolas Klauser operator<(typename iterator_traits<BiIter>::value_type const* lhs, 343e78f53d1SNikolas Klauser const sub_match<BiIter>& rhs); 344e78f53d1SNikolas Klauser 345e78f53d1SNikolas Klausertemplate <class BiIter> // Removed in C++20 346e78f53d1SNikolas Klauser bool 347e78f53d1SNikolas Klauser operator>(typename iterator_traits<BiIter>::value_type const* lhs, 348e78f53d1SNikolas Klauser const sub_match<BiIter>& rhs); 349e78f53d1SNikolas Klauser 350e78f53d1SNikolas Klausertemplate <class BiIter> // Removed in C++20 351e78f53d1SNikolas Klauser bool 352e78f53d1SNikolas Klauser operator>=(typename iterator_traits<BiIter>::value_type const* lhs, 353e78f53d1SNikolas Klauser const sub_match<BiIter>& rhs); 354e78f53d1SNikolas Klauser 355e78f53d1SNikolas Klausertemplate <class BiIter> // Removed in C++20 356e78f53d1SNikolas Klauser bool 357e78f53d1SNikolas Klauser operator<=(typename iterator_traits<BiIter>::value_type const* lhs, 358e78f53d1SNikolas Klauser const sub_match<BiIter>& rhs); 359e78f53d1SNikolas Klauser 360e78f53d1SNikolas Klausertemplate <class BiIter> 361e78f53d1SNikolas Klauser bool 362e78f53d1SNikolas Klauser operator==(const sub_match<BiIter>& lhs, 363e78f53d1SNikolas Klauser typename iterator_traits<BiIter>::value_type const* rhs); 364e78f53d1SNikolas Klauser 365e78f53d1SNikolas Klausertemplate <class BiIter> // Since C++20 366e78f53d1SNikolas Klauser auto 367e78f53d1SNikolas Klauser operator<=>(const sub_match<BiIter>& lhs, 368e78f53d1SNikolas Klauser typename iterator_traits<BiIter>::value_type const* rhs); 369e78f53d1SNikolas Klauser 370e78f53d1SNikolas Klausertemplate <class BiIter, class ST, class SA> // Removed in C++20 371e78f53d1SNikolas Klauser bool 372e78f53d1SNikolas Klauser operator!=(const sub_match<BiIter>& lhs, 373e78f53d1SNikolas Klauser typename iterator_traits<BiIter>::value_type const* rhs); 374e78f53d1SNikolas Klauser 375e78f53d1SNikolas Klausertemplate <class BiIter> // Removed in C++20 376e78f53d1SNikolas Klauser bool 377e78f53d1SNikolas Klauser operator<(const sub_match<BiIter>& lhs, 378e78f53d1SNikolas Klauser typename iterator_traits<BiIter>::value_type const* rhs); 379e78f53d1SNikolas Klauser 380e78f53d1SNikolas Klausertemplate <class BiIter> // Removed in C++20 381e78f53d1SNikolas Klauser bool 382e78f53d1SNikolas Klauser operator>(const sub_match<BiIter>& lhs, 383e78f53d1SNikolas Klauser typename iterator_traits<BiIter>::value_type const* rhs); 384e78f53d1SNikolas Klauser 385e78f53d1SNikolas Klausertemplate <class BiIter> // Removed in C++20 386e78f53d1SNikolas Klauser bool 387e78f53d1SNikolas Klauser operator>=(const sub_match<BiIter>& lhs, 388e78f53d1SNikolas Klauser typename iterator_traits<BiIter>::value_type const* rhs); 389e78f53d1SNikolas Klauser 390e78f53d1SNikolas Klausertemplate <class BiIter> // Removed in C++20 391e78f53d1SNikolas Klauser bool 392e78f53d1SNikolas Klauser operator<=(const sub_match<BiIter>& lhs, 393e78f53d1SNikolas Klauser typename iterator_traits<BiIter>::value_type const* rhs); 394e78f53d1SNikolas Klauser 395e78f53d1SNikolas Klausertemplate <class BiIter> // Removed in C++20 396e78f53d1SNikolas Klauser bool 397e78f53d1SNikolas Klauser operator==(typename iterator_traits<BiIter>::value_type const& lhs, 398e78f53d1SNikolas Klauser const sub_match<BiIter>& rhs); 399e78f53d1SNikolas Klauser 400e78f53d1SNikolas Klausertemplate <class BiIter> // Removed in C++20 401e78f53d1SNikolas Klauser bool 402e78f53d1SNikolas Klauser operator!=(typename iterator_traits<BiIter>::value_type const& lhs, 403e78f53d1SNikolas Klauser const sub_match<BiIter>& rhs); 404e78f53d1SNikolas Klauser 405e78f53d1SNikolas Klausertemplate <class BiIter> // Removed in C++20 406e78f53d1SNikolas Klauser bool 407e78f53d1SNikolas Klauser operator<(typename iterator_traits<BiIter>::value_type const& lhs, 408e78f53d1SNikolas Klauser const sub_match<BiIter>& rhs); 409e78f53d1SNikolas Klauser 410e78f53d1SNikolas Klausertemplate <class BiIter> // Removed in C++20 411e78f53d1SNikolas Klauser bool 412e78f53d1SNikolas Klauser operator>(typename iterator_traits<BiIter>::value_type const& lhs, 413e78f53d1SNikolas Klauser const sub_match<BiIter>& rhs); 414e78f53d1SNikolas Klauser 415e78f53d1SNikolas Klausertemplate <class BiIter> // Removed in C++20 416e78f53d1SNikolas Klauser bool 417e78f53d1SNikolas Klauser operator>=(typename iterator_traits<BiIter>::value_type const& lhs, 418e78f53d1SNikolas Klauser const sub_match<BiIter>& rhs); 419e78f53d1SNikolas Klauser 420e78f53d1SNikolas Klausertemplate <class BiIter> // Removed in C++20 421e78f53d1SNikolas Klauser bool 422e78f53d1SNikolas Klauser operator<=(typename iterator_traits<BiIter>::value_type const& lhs, 423e78f53d1SNikolas Klauser const sub_match<BiIter>& rhs); 424e78f53d1SNikolas Klauser 425e78f53d1SNikolas Klausertemplate <class BiIter> 426e78f53d1SNikolas Klauser bool 427e78f53d1SNikolas Klauser operator==(const sub_match<BiIter>& lhs, 428e78f53d1SNikolas Klauser typename iterator_traits<BiIter>::value_type const& rhs); 429e78f53d1SNikolas Klauser 430e78f53d1SNikolas Klausertemplate <class BiIter> // Since C++20 431e78f53d1SNikolas Klauser auto 432e78f53d1SNikolas Klauser operator<=>(const sub_match<BiIter>& lhs, 433e78f53d1SNikolas Klauser typename iterator_traits<BiIter>::value_type const& rhs); 434e78f53d1SNikolas Klauser 435e78f53d1SNikolas Klausertemplate <class BiIter> // Removed in C++20 436e78f53d1SNikolas Klauser bool 437e78f53d1SNikolas Klauser operator!=(const sub_match<BiIter>& lhs, 438e78f53d1SNikolas Klauser typename iterator_traits<BiIter>::value_type const& rhs); 439e78f53d1SNikolas Klauser 440e78f53d1SNikolas Klausertemplate <class BiIter> // Removed in C++20 441e78f53d1SNikolas Klauser bool 442e78f53d1SNikolas Klauser operator<(const sub_match<BiIter>& lhs, 443e78f53d1SNikolas Klauser typename iterator_traits<BiIter>::value_type const& rhs); 444e78f53d1SNikolas Klauser 445e78f53d1SNikolas Klausertemplate <class BiIter> // Removed in C++20 446e78f53d1SNikolas Klauser bool 447e78f53d1SNikolas Klauser operator>(const sub_match<BiIter>& lhs, 448e78f53d1SNikolas Klauser typename iterator_traits<BiIter>::value_type const& rhs); 449e78f53d1SNikolas Klauser 450e78f53d1SNikolas Klausertemplate <class BiIter> // Removed in C++20 451e78f53d1SNikolas Klauser bool 452e78f53d1SNikolas Klauser operator>=(const sub_match<BiIter>& lhs, 453e78f53d1SNikolas Klauser typename iterator_traits<BiIter>::value_type const& rhs); 454e78f53d1SNikolas Klauser 455e78f53d1SNikolas Klausertemplate <class BiIter> // Removed in C++20 456e78f53d1SNikolas Klauser bool 457e78f53d1SNikolas Klauser operator<=(const sub_match<BiIter>& lhs, 458e78f53d1SNikolas Klauser typename iterator_traits<BiIter>::value_type const& rhs); 459e78f53d1SNikolas Klauser 460e78f53d1SNikolas Klausertemplate <class charT, class ST, class BiIter> 461e78f53d1SNikolas Klauser basic_ostream<charT, ST>& 462e78f53d1SNikolas Klauser operator<<(basic_ostream<charT, ST>& os, const sub_match<BiIter>& m); 463e78f53d1SNikolas Klauser 464e78f53d1SNikolas Klausertemplate <class BidirectionalIterator, 465e78f53d1SNikolas Klauser class Allocator = allocator<sub_match<BidirectionalIterator>>> 466e78f53d1SNikolas Klauserclass match_results 467e78f53d1SNikolas Klauser{ 468e78f53d1SNikolas Klauserpublic: 469e78f53d1SNikolas Klauser typedef sub_match<BidirectionalIterator> value_type; 470e78f53d1SNikolas Klauser typedef const value_type& const_reference; 471e78f53d1SNikolas Klauser typedef value_type& reference; 472e78f53d1SNikolas Klauser typedef /implementation-defined/ const_iterator; 473e78f53d1SNikolas Klauser typedef const_iterator iterator; 474e78f53d1SNikolas Klauser typedef typename iterator_traits<BidirectionalIterator>::difference_type difference_type; 475e78f53d1SNikolas Klauser typedef typename allocator_traits<Allocator>::size_type size_type; 476e78f53d1SNikolas Klauser typedef Allocator allocator_type; 477e78f53d1SNikolas Klauser typedef typename iterator_traits<BidirectionalIterator>::value_type char_type; 478e78f53d1SNikolas Klauser typedef basic_string<char_type> string_type; 479e78f53d1SNikolas Klauser 480e78f53d1SNikolas Klauser // construct/copy/destroy: 481e78f53d1SNikolas Klauser explicit match_results(const Allocator& a = Allocator()); // before C++20 482e78f53d1SNikolas Klauser match_results() : match_results(Allocator()) {} // C++20 483e78f53d1SNikolas Klauser explicit match_results(const Allocator& a); // C++20 484e78f53d1SNikolas Klauser match_results(const match_results& m); 485e78f53d1SNikolas Klauser match_results(match_results&& m) noexcept; 486e78f53d1SNikolas Klauser match_results& operator=(const match_results& m); 487e78f53d1SNikolas Klauser match_results& operator=(match_results&& m); 488e78f53d1SNikolas Klauser ~match_results(); 489e78f53d1SNikolas Klauser 490e78f53d1SNikolas Klauser bool ready() const; 491e78f53d1SNikolas Klauser 492e78f53d1SNikolas Klauser // size: 493e78f53d1SNikolas Klauser size_type size() const; 494e78f53d1SNikolas Klauser size_type max_size() const; 495e78f53d1SNikolas Klauser bool empty() const; 496e78f53d1SNikolas Klauser 497e78f53d1SNikolas Klauser // element access: 498e78f53d1SNikolas Klauser difference_type length(size_type sub = 0) const; 499e78f53d1SNikolas Klauser difference_type position(size_type sub = 0) const; 500e78f53d1SNikolas Klauser string_type str(size_type sub = 0) const; 501e78f53d1SNikolas Klauser const_reference operator[](size_type n) const; 502e78f53d1SNikolas Klauser 503e78f53d1SNikolas Klauser const_reference prefix() const; 504e78f53d1SNikolas Klauser const_reference suffix() const; 505e78f53d1SNikolas Klauser 506e78f53d1SNikolas Klauser const_iterator begin() const; 507e78f53d1SNikolas Klauser const_iterator end() const; 508e78f53d1SNikolas Klauser const_iterator cbegin() const; 509e78f53d1SNikolas Klauser const_iterator cend() const; 510e78f53d1SNikolas Klauser 511e78f53d1SNikolas Klauser // format: 512e78f53d1SNikolas Klauser template <class OutputIter> 513e78f53d1SNikolas Klauser OutputIter 514e78f53d1SNikolas Klauser format(OutputIter out, const char_type* fmt_first, 515e78f53d1SNikolas Klauser const char_type* fmt_last, 516e78f53d1SNikolas Klauser regex_constants::match_flag_type flags = regex_constants::format_default) const; 517e78f53d1SNikolas Klauser template <class OutputIter, class ST, class SA> 518e78f53d1SNikolas Klauser OutputIter 519e78f53d1SNikolas Klauser format(OutputIter out, const basic_string<char_type, ST, SA>& fmt, 520e78f53d1SNikolas Klauser regex_constants::match_flag_type flags = regex_constants::format_default) const; 521e78f53d1SNikolas Klauser template <class ST, class SA> 522e78f53d1SNikolas Klauser basic_string<char_type, ST, SA> 523e78f53d1SNikolas Klauser format(const basic_string<char_type, ST, SA>& fmt, 524e78f53d1SNikolas Klauser regex_constants::match_flag_type flags = regex_constants::format_default) const; 525e78f53d1SNikolas Klauser string_type 526e78f53d1SNikolas Klauser format(const char_type* fmt, 527e78f53d1SNikolas Klauser regex_constants::match_flag_type flags = regex_constants::format_default) const; 528e78f53d1SNikolas Klauser 529e78f53d1SNikolas Klauser // allocator: 530e78f53d1SNikolas Klauser allocator_type get_allocator() const; 531e78f53d1SNikolas Klauser 532e78f53d1SNikolas Klauser // swap: 533e78f53d1SNikolas Klauser void swap(match_results& that); 534e78f53d1SNikolas Klauser}; 535e78f53d1SNikolas Klauser 536e78f53d1SNikolas Klausertypedef match_results<const char*> cmatch; 537e78f53d1SNikolas Klausertypedef match_results<const wchar_t*> wcmatch; 538e78f53d1SNikolas Klausertypedef match_results<string::const_iterator> smatch; 539e78f53d1SNikolas Klausertypedef match_results<wstring::const_iterator> wsmatch; 540e78f53d1SNikolas Klauser 541e78f53d1SNikolas Klausertemplate <class BidirectionalIterator, class Allocator> 542e78f53d1SNikolas Klauser bool 543e78f53d1SNikolas Klauser operator==(const match_results<BidirectionalIterator, Allocator>& m1, 544e78f53d1SNikolas Klauser const match_results<BidirectionalIterator, Allocator>& m2); 545e78f53d1SNikolas Klauser 546e78f53d1SNikolas Klausertemplate <class BidirectionalIterator, class Allocator> // Removed in C++20 547e78f53d1SNikolas Klauser bool 548e78f53d1SNikolas Klauser operator!=(const match_results<BidirectionalIterator, Allocator>& m1, 549e78f53d1SNikolas Klauser const match_results<BidirectionalIterator, Allocator>& m2); 550e78f53d1SNikolas Klauser 551e78f53d1SNikolas Klausertemplate <class BidirectionalIterator, class Allocator> 552e78f53d1SNikolas Klauser void 553e78f53d1SNikolas Klauser swap(match_results<BidirectionalIterator, Allocator>& m1, 554e78f53d1SNikolas Klauser match_results<BidirectionalIterator, Allocator>& m2); 555e78f53d1SNikolas Klauser 556e78f53d1SNikolas Klausertemplate <class BidirectionalIterator, class Allocator, class charT, class traits> 557e78f53d1SNikolas Klauser bool 558e78f53d1SNikolas Klauser regex_match(BidirectionalIterator first, BidirectionalIterator last, 559e78f53d1SNikolas Klauser match_results<BidirectionalIterator, Allocator>& m, 560e78f53d1SNikolas Klauser const basic_regex<charT, traits>& e, 561e78f53d1SNikolas Klauser regex_constants::match_flag_type flags = regex_constants::match_default); 562e78f53d1SNikolas Klauser 563e78f53d1SNikolas Klausertemplate <class BidirectionalIterator, class charT, class traits> 564e78f53d1SNikolas Klauser bool 565e78f53d1SNikolas Klauser regex_match(BidirectionalIterator first, BidirectionalIterator last, 566e78f53d1SNikolas Klauser const basic_regex<charT, traits>& e, 567e78f53d1SNikolas Klauser regex_constants::match_flag_type flags = regex_constants::match_default); 568e78f53d1SNikolas Klauser 569e78f53d1SNikolas Klausertemplate <class charT, class Allocator, class traits> 570e78f53d1SNikolas Klauser bool 571e78f53d1SNikolas Klauser regex_match(const charT* str, match_results<const charT*, Allocator>& m, 572e78f53d1SNikolas Klauser const basic_regex<charT, traits>& e, 573e78f53d1SNikolas Klauser regex_constants::match_flag_type flags = regex_constants::match_default); 574e78f53d1SNikolas Klauser 575e78f53d1SNikolas Klausertemplate <class ST, class SA, class Allocator, class charT, class traits> 576e78f53d1SNikolas Klauser bool 577e78f53d1SNikolas Klauser regex_match(const basic_string<charT, ST, SA>& s, 578e78f53d1SNikolas Klauser match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m, 579e78f53d1SNikolas Klauser const basic_regex<charT, traits>& e, 580e78f53d1SNikolas Klauser regex_constants::match_flag_type flags = regex_constants::match_default); 581e78f53d1SNikolas Klauser 582e78f53d1SNikolas Klausertemplate <class ST, class SA, class Allocator, class charT, class traits> 583e78f53d1SNikolas Klauser bool 584e78f53d1SNikolas Klauser regex_match(const basic_string<charT, ST, SA>&& s, 585e78f53d1SNikolas Klauser match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m, 586e78f53d1SNikolas Klauser const basic_regex<charT, traits>& e, 587e78f53d1SNikolas Klauser regex_constants::match_flag_type flags = regex_constants::match_default) = delete; // C++14 588e78f53d1SNikolas Klauser 589e78f53d1SNikolas Klausertemplate <class charT, class traits> 590e78f53d1SNikolas Klauser bool 591e78f53d1SNikolas Klauser regex_match(const charT* str, const basic_regex<charT, traits>& e, 592e78f53d1SNikolas Klauser regex_constants::match_flag_type flags = regex_constants::match_default); 593e78f53d1SNikolas Klauser 594e78f53d1SNikolas Klausertemplate <class ST, class SA, class charT, class traits> 595e78f53d1SNikolas Klauser bool 596e78f53d1SNikolas Klauser regex_match(const basic_string<charT, ST, SA>& s, 597e78f53d1SNikolas Klauser const basic_regex<charT, traits>& e, 598e78f53d1SNikolas Klauser regex_constants::match_flag_type flags = regex_constants::match_default); 599e78f53d1SNikolas Klauser 600e78f53d1SNikolas Klausertemplate <class BidirectionalIterator, class Allocator, class charT, class traits> 601e78f53d1SNikolas Klauser bool 602e78f53d1SNikolas Klauser regex_search(BidirectionalIterator first, BidirectionalIterator last, 603e78f53d1SNikolas Klauser match_results<BidirectionalIterator, Allocator>& m, 604e78f53d1SNikolas Klauser const basic_regex<charT, traits>& e, 605e78f53d1SNikolas Klauser regex_constants::match_flag_type flags = regex_constants::match_default); 606e78f53d1SNikolas Klauser 607e78f53d1SNikolas Klausertemplate <class BidirectionalIterator, class charT, class traits> 608e78f53d1SNikolas Klauser bool 609e78f53d1SNikolas Klauser regex_search(BidirectionalIterator first, BidirectionalIterator last, 610e78f53d1SNikolas Klauser const basic_regex<charT, traits>& e, 611e78f53d1SNikolas Klauser regex_constants::match_flag_type flags = regex_constants::match_default); 612e78f53d1SNikolas Klauser 613e78f53d1SNikolas Klausertemplate <class charT, class Allocator, class traits> 614e78f53d1SNikolas Klauser bool 615e78f53d1SNikolas Klauser regex_search(const charT* str, match_results<const charT*, Allocator>& m, 616e78f53d1SNikolas Klauser const basic_regex<charT, traits>& e, 617e78f53d1SNikolas Klauser regex_constants::match_flag_type flags = regex_constants::match_default); 618e78f53d1SNikolas Klauser 619e78f53d1SNikolas Klausertemplate <class charT, class traits> 620e78f53d1SNikolas Klauser bool 621e78f53d1SNikolas Klauser regex_search(const charT* str, const basic_regex<charT, traits>& e, 622e78f53d1SNikolas Klauser regex_constants::match_flag_type flags = regex_constants::match_default); 623e78f53d1SNikolas Klauser 624e78f53d1SNikolas Klausertemplate <class ST, class SA, class charT, class traits> 625e78f53d1SNikolas Klauser bool 626e78f53d1SNikolas Klauser regex_search(const basic_string<charT, ST, SA>& s, 627e78f53d1SNikolas Klauser const basic_regex<charT, traits>& e, 628e78f53d1SNikolas Klauser regex_constants::match_flag_type flags = regex_constants::match_default); 629e78f53d1SNikolas Klauser 630e78f53d1SNikolas Klausertemplate <class ST, class SA, class Allocator, class charT, class traits> 631e78f53d1SNikolas Klauser bool 632e78f53d1SNikolas Klauser regex_search(const basic_string<charT, ST, SA>& s, 633e78f53d1SNikolas Klauser match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m, 634e78f53d1SNikolas Klauser const basic_regex<charT, traits>& e, 635e78f53d1SNikolas Klauser regex_constants::match_flag_type flags = regex_constants::match_default); 636e78f53d1SNikolas Klauser 637e78f53d1SNikolas Klausertemplate <class ST, class SA, class Allocator, class charT, class traits> 638e78f53d1SNikolas Klauser bool 639e78f53d1SNikolas Klauser regex_search(const basic_string<charT, ST, SA>&& s, 640e78f53d1SNikolas Klauser match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m, 641e78f53d1SNikolas Klauser const basic_regex<charT, traits>& e, 642e78f53d1SNikolas Klauser regex_constants::match_flag_type flags = regex_constants::match_default) = delete; // C++14 643e78f53d1SNikolas Klauser 644e78f53d1SNikolas Klausertemplate <class OutputIterator, class BidirectionalIterator, 645e78f53d1SNikolas Klauser class traits, class charT, class ST, class SA> 646e78f53d1SNikolas Klauser OutputIterator 647e78f53d1SNikolas Klauser regex_replace(OutputIterator out, 648e78f53d1SNikolas Klauser BidirectionalIterator first, BidirectionalIterator last, 649e78f53d1SNikolas Klauser const basic_regex<charT, traits>& e, 650e78f53d1SNikolas Klauser const basic_string<charT, ST, SA>& fmt, 651e78f53d1SNikolas Klauser regex_constants::match_flag_type flags = regex_constants::match_default); 652e78f53d1SNikolas Klauser 653e78f53d1SNikolas Klausertemplate <class OutputIterator, class BidirectionalIterator, 654e78f53d1SNikolas Klauser class traits, class charT> 655e78f53d1SNikolas Klauser OutputIterator 656e78f53d1SNikolas Klauser regex_replace(OutputIterator out, 657e78f53d1SNikolas Klauser BidirectionalIterator first, BidirectionalIterator last, 658e78f53d1SNikolas Klauser const basic_regex<charT, traits>& e, const charT* fmt, 659e78f53d1SNikolas Klauser regex_constants::match_flag_type flags = regex_constants::match_default); 660e78f53d1SNikolas Klauser 661e78f53d1SNikolas Klausertemplate <class traits, class charT, class ST, class SA, class FST, class FSA> 662e78f53d1SNikolas Klauser basic_string<charT, ST, SA> 663e78f53d1SNikolas Klauser regex_replace(const basic_string<charT, ST, SA>& s, 664e78f53d1SNikolas Klauser const basic_regex<charT, traits>& e, 665e78f53d1SNikolas Klauser const basic_string<charT, FST, FSA>& fmt, 666e78f53d1SNikolas Klauser regex_constants::match_flag_type flags = regex_constants::match_default); 667e78f53d1SNikolas Klauser 668e78f53d1SNikolas Klausertemplate <class traits, class charT, class ST, class SA> 669e78f53d1SNikolas Klauser basic_string<charT, ST, SA> 670e78f53d1SNikolas Klauser regex_replace(const basic_string<charT, ST, SA>& s, 671e78f53d1SNikolas Klauser const basic_regex<charT, traits>& e, const charT* fmt, 672e78f53d1SNikolas Klauser regex_constants::match_flag_type flags = regex_constants::match_default); 673e78f53d1SNikolas Klauser 674e78f53d1SNikolas Klausertemplate <class traits, class charT, class ST, class SA> 675e78f53d1SNikolas Klauser basic_string<charT> 676e78f53d1SNikolas Klauser regex_replace(const charT* s, 677e78f53d1SNikolas Klauser const basic_regex<charT, traits>& e, 678e78f53d1SNikolas Klauser const basic_string<charT, ST, SA>& fmt, 679e78f53d1SNikolas Klauser regex_constants::match_flag_type flags = regex_constants::match_default); 680e78f53d1SNikolas Klauser 681e78f53d1SNikolas Klausertemplate <class traits, class charT> 682e78f53d1SNikolas Klauser basic_string<charT> 683e78f53d1SNikolas Klauser regex_replace(const charT* s, 684e78f53d1SNikolas Klauser const basic_regex<charT, traits>& e, 685e78f53d1SNikolas Klauser const charT* fmt, 686e78f53d1SNikolas Klauser regex_constants::match_flag_type flags = regex_constants::match_default); 687e78f53d1SNikolas Klauser 688e78f53d1SNikolas Klausertemplate <class BidirectionalIterator, 689e78f53d1SNikolas Klauser class charT = typename iterator_traits< BidirectionalIterator>::value_type, 690e78f53d1SNikolas Klauser class traits = regex_traits<charT>> 691e78f53d1SNikolas Klauserclass regex_iterator 692e78f53d1SNikolas Klauser{ 693e78f53d1SNikolas Klauserpublic: 694e78f53d1SNikolas Klauser typedef basic_regex<charT, traits> regex_type; 695e78f53d1SNikolas Klauser typedef match_results<BidirectionalIterator> value_type; 696e78f53d1SNikolas Klauser typedef ptrdiff_t difference_type; 697e78f53d1SNikolas Klauser typedef const value_type* pointer; 698e78f53d1SNikolas Klauser typedef const value_type& reference; 699e78f53d1SNikolas Klauser typedef forward_iterator_tag iterator_category; 700e78f53d1SNikolas Klauser typedef input_iterator_tag iterator_concept; // since C++20 701e78f53d1SNikolas Klauser 702e78f53d1SNikolas Klauser regex_iterator(); 703e78f53d1SNikolas Klauser regex_iterator(BidirectionalIterator a, BidirectionalIterator b, 704e78f53d1SNikolas Klauser const regex_type& re, 705e78f53d1SNikolas Klauser regex_constants::match_flag_type m = regex_constants::match_default); 706e78f53d1SNikolas Klauser regex_iterator(BidirectionalIterator a, BidirectionalIterator b, 707e78f53d1SNikolas Klauser const regex_type&& re, 708e78f53d1SNikolas Klauser regex_constants::match_flag_type m 709e78f53d1SNikolas Klauser = regex_constants::match_default) = delete; // C++14 710e78f53d1SNikolas Klauser regex_iterator(const regex_iterator&); 711e78f53d1SNikolas Klauser regex_iterator& operator=(const regex_iterator&); 712e78f53d1SNikolas Klauser 713e78f53d1SNikolas Klauser bool operator==(const regex_iterator&) const; 714e78f53d1SNikolas Klauser bool operator==(default_sentinel_t) const { return *this == regex_iterator(); } // since C++20 715e78f53d1SNikolas Klauser bool operator!=(const regex_iterator&) const; // Removed in C++20 716e78f53d1SNikolas Klauser 717e78f53d1SNikolas Klauser const value_type& operator*() const; 718e78f53d1SNikolas Klauser const value_type* operator->() const; 719e78f53d1SNikolas Klauser 720e78f53d1SNikolas Klauser regex_iterator& operator++(); 721e78f53d1SNikolas Klauser regex_iterator operator++(int); 722e78f53d1SNikolas Klauser}; 723e78f53d1SNikolas Klauser 724e78f53d1SNikolas Klausertypedef regex_iterator<const char*> cregex_iterator; 725e78f53d1SNikolas Klausertypedef regex_iterator<const wchar_t*> wcregex_iterator; 726e78f53d1SNikolas Klausertypedef regex_iterator<string::const_iterator> sregex_iterator; 727e78f53d1SNikolas Klausertypedef regex_iterator<wstring::const_iterator> wsregex_iterator; 728e78f53d1SNikolas Klauser 729e78f53d1SNikolas Klausertemplate <class BidirectionalIterator, 730e78f53d1SNikolas Klauser class charT = typename iterator_traits<BidirectionalIterator>::value_type, 731e78f53d1SNikolas Klauser class traits = regex_traits<charT>> 732e78f53d1SNikolas Klauserclass regex_token_iterator 733e78f53d1SNikolas Klauser{ 734e78f53d1SNikolas Klauserpublic: 735e78f53d1SNikolas Klauser typedef basic_regex<charT, traits> regex_type; 736e78f53d1SNikolas Klauser typedef sub_match<BidirectionalIterator> value_type; 737e78f53d1SNikolas Klauser typedef ptrdiff_t difference_type; 738e78f53d1SNikolas Klauser typedef const value_type* pointer; 739e78f53d1SNikolas Klauser typedef const value_type& reference; 740e78f53d1SNikolas Klauser typedef forward_iterator_tag iterator_category; 741e78f53d1SNikolas Klauser typedef input_iterator_tag iterator_concept; // since C++20 742e78f53d1SNikolas Klauser 743e78f53d1SNikolas Klauser regex_token_iterator(); 744e78f53d1SNikolas Klauser regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, 745e78f53d1SNikolas Klauser const regex_type& re, int submatch = 0, 746e78f53d1SNikolas Klauser regex_constants::match_flag_type m = regex_constants::match_default); 747e78f53d1SNikolas Klauser regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, 748e78f53d1SNikolas Klauser const regex_type&& re, int submatch = 0, 749e78f53d1SNikolas Klauser regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14 750e78f53d1SNikolas Klauser regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, 751e78f53d1SNikolas Klauser const regex_type& re, const vector<int>& submatches, 752e78f53d1SNikolas Klauser regex_constants::match_flag_type m = regex_constants::match_default); 753e78f53d1SNikolas Klauser regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, 754e78f53d1SNikolas Klauser const regex_type&& re, const vector<int>& submatches, 755e78f53d1SNikolas Klauser regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14 756e78f53d1SNikolas Klauser regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, 757e78f53d1SNikolas Klauser const regex_type& re, initializer_list<int> submatches, 758e78f53d1SNikolas Klauser regex_constants::match_flag_type m = regex_constants::match_default); 759e78f53d1SNikolas Klauser regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, 760e78f53d1SNikolas Klauser const regex_type&& re, initializer_list<int> submatches, 761e78f53d1SNikolas Klauser regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14 762e78f53d1SNikolas Klauser template <size_t N> 763e78f53d1SNikolas Klauser regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, 764e78f53d1SNikolas Klauser const regex_type& re, const int (&submatches)[N], 765e78f53d1SNikolas Klauser regex_constants::match_flag_type m = regex_constants::match_default); 766e78f53d1SNikolas Klauser template <size_t N> 767e78f53d1SNikolas Klauser regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, 768e78f53d1SNikolas Klauser const regex_type&& re, const int (&submatches)[N], 769e78f53d1SNikolas Klauser regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14 770e78f53d1SNikolas Klauser regex_token_iterator(const regex_token_iterator&); 771e78f53d1SNikolas Klauser regex_token_iterator& operator=(const regex_token_iterator&); 772e78f53d1SNikolas Klauser 773e78f53d1SNikolas Klauser bool operator==(const regex_token_iterator&) const; 774e78f53d1SNikolas Klauser bool operator==(default_sentinel_t) const { return *this == regex_token_iterator(); } // since C++20 775e78f53d1SNikolas Klauser bool operator!=(const regex_token_iterator&) const; // Removed in C++20 776e78f53d1SNikolas Klauser 777e78f53d1SNikolas Klauser const value_type& operator*() const; 778e78f53d1SNikolas Klauser const value_type* operator->() const; 779e78f53d1SNikolas Klauser 780e78f53d1SNikolas Klauser regex_token_iterator& operator++(); 781e78f53d1SNikolas Klauser regex_token_iterator operator++(int); 782e78f53d1SNikolas Klauser}; 783e78f53d1SNikolas Klauser 784e78f53d1SNikolas Klausertypedef regex_token_iterator<const char*> cregex_token_iterator; 785e78f53d1SNikolas Klausertypedef regex_token_iterator<const wchar_t*> wcregex_token_iterator; 786e78f53d1SNikolas Klausertypedef regex_token_iterator<string::const_iterator> sregex_token_iterator; 787e78f53d1SNikolas Klausertypedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator; 788e78f53d1SNikolas Klauser 789e78f53d1SNikolas Klauser} // std 790e78f53d1SNikolas Klauser*/ 791e78f53d1SNikolas Klauser 79273fbae83SNikolas Klauser#include <__cxx03/__algorithm/find.h> 79373fbae83SNikolas Klauser#include <__cxx03/__algorithm/search.h> 79473fbae83SNikolas Klauser#include <__cxx03/__assert> 79573fbae83SNikolas Klauser#include <__cxx03/__config> 79673fbae83SNikolas Klauser#include <__cxx03/__iterator/back_insert_iterator.h> 79773fbae83SNikolas Klauser#include <__cxx03/__iterator/default_sentinel.h> 79873fbae83SNikolas Klauser#include <__cxx03/__iterator/wrap_iter.h> 79973fbae83SNikolas Klauser#include <__cxx03/__locale> 80073fbae83SNikolas Klauser#include <__cxx03/__memory/shared_ptr.h> 80173fbae83SNikolas Klauser#include <__cxx03/__memory_resource/polymorphic_allocator.h> 80273fbae83SNikolas Klauser#include <__cxx03/__type_traits/is_swappable.h> 80373fbae83SNikolas Klauser#include <__cxx03/__utility/move.h> 80473fbae83SNikolas Klauser#include <__cxx03/__utility/pair.h> 80573fbae83SNikolas Klauser#include <__cxx03/__utility/swap.h> 80673fbae83SNikolas Klauser#include <__cxx03/__verbose_abort> 80773fbae83SNikolas Klauser#include <__cxx03/deque> 80873fbae83SNikolas Klauser#include <__cxx03/stdexcept> 80973fbae83SNikolas Klauser#include <__cxx03/string> 81073fbae83SNikolas Klauser#include <__cxx03/vector> 81173fbae83SNikolas Klauser#include <__cxx03/version> 812e78f53d1SNikolas Klauser 813e78f53d1SNikolas Klauser// standard-mandated includes 814e78f53d1SNikolas Klauser 815e78f53d1SNikolas Klauser// [iterator.range] 81673fbae83SNikolas Klauser#include <__cxx03/__iterator/access.h> 81773fbae83SNikolas Klauser#include <__cxx03/__iterator/data.h> 81873fbae83SNikolas Klauser#include <__cxx03/__iterator/empty.h> 81973fbae83SNikolas Klauser#include <__cxx03/__iterator/reverse_access.h> 82073fbae83SNikolas Klauser#include <__cxx03/__iterator/size.h> 821e78f53d1SNikolas Klauser 822e78f53d1SNikolas Klauser// [re.syn] 82373fbae83SNikolas Klauser#include <__cxx03/compare> 82473fbae83SNikolas Klauser#include <__cxx03/initializer_list> 825e78f53d1SNikolas Klauser 826e78f53d1SNikolas Klauser#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 827e78f53d1SNikolas Klauser# pragma GCC system_header 828e78f53d1SNikolas Klauser#endif 829e78f53d1SNikolas Klauser 830e78f53d1SNikolas Klauser_LIBCPP_PUSH_MACROS 83173fbae83SNikolas Klauser#include <__cxx03/__undef_macros> 832e78f53d1SNikolas Klauser 833e78f53d1SNikolas Klauser#define _LIBCPP_REGEX_COMPLEXITY_FACTOR 4096 834e78f53d1SNikolas Klauser 835e78f53d1SNikolas Klauser_LIBCPP_BEGIN_NAMESPACE_STD 836e78f53d1SNikolas Klauser 837e78f53d1SNikolas Klausernamespace regex_constants { 838e78f53d1SNikolas Klauser 839e78f53d1SNikolas Klauser// syntax_option_type 840e78f53d1SNikolas Klauser 841e78f53d1SNikolas Klauserenum syntax_option_type { 842e78f53d1SNikolas Klauser icase = 1 << 0, 843e78f53d1SNikolas Klauser nosubs = 1 << 1, 844e78f53d1SNikolas Klauser optimize = 1 << 2, 845e78f53d1SNikolas Klauser collate = 1 << 3, 846e78f53d1SNikolas Klauser#ifdef _LIBCPP_ABI_REGEX_CONSTANTS_NONZERO 847e78f53d1SNikolas Klauser ECMAScript = 1 << 9, 848e78f53d1SNikolas Klauser#else 849e78f53d1SNikolas Klauser ECMAScript = 0, 850e78f53d1SNikolas Klauser#endif 851e78f53d1SNikolas Klauser basic = 1 << 4, 852e78f53d1SNikolas Klauser extended = 1 << 5, 853e78f53d1SNikolas Klauser awk = 1 << 6, 854e78f53d1SNikolas Klauser grep = 1 << 7, 855e78f53d1SNikolas Klauser egrep = 1 << 8, 856e78f53d1SNikolas Klauser // 1 << 9 may be used by ECMAScript 857e78f53d1SNikolas Klauser multiline = 1 << 10 858e78f53d1SNikolas Klauser}; 859e78f53d1SNikolas Klauser 860e78f53d1SNikolas Klauser_LIBCPP_HIDE_FROM_ABI inline _LIBCPP_CONSTEXPR syntax_option_type __get_grammar(syntax_option_type __g) { 861e78f53d1SNikolas Klauser#ifdef _LIBCPP_ABI_REGEX_CONSTANTS_NONZERO 862e78f53d1SNikolas Klauser return static_cast<syntax_option_type>(__g & 0x3F0); 863e78f53d1SNikolas Klauser#else 864e78f53d1SNikolas Klauser return static_cast<syntax_option_type>(__g & 0x1F0); 865e78f53d1SNikolas Klauser#endif 866e78f53d1SNikolas Klauser} 867e78f53d1SNikolas Klauser 868e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR syntax_option_type operator~(syntax_option_type __x) { 869e78f53d1SNikolas Klauser return syntax_option_type(~int(__x) & 0x1FF); 870e78f53d1SNikolas Klauser} 871e78f53d1SNikolas Klauser 872e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR syntax_option_type 873e78f53d1SNikolas Klauseroperator&(syntax_option_type __x, syntax_option_type __y) { 874e78f53d1SNikolas Klauser return syntax_option_type(int(__x) & int(__y)); 875e78f53d1SNikolas Klauser} 876e78f53d1SNikolas Klauser 877e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR syntax_option_type 878e78f53d1SNikolas Klauseroperator|(syntax_option_type __x, syntax_option_type __y) { 879e78f53d1SNikolas Klauser return syntax_option_type(int(__x) | int(__y)); 880e78f53d1SNikolas Klauser} 881e78f53d1SNikolas Klauser 882e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR syntax_option_type 883e78f53d1SNikolas Klauseroperator^(syntax_option_type __x, syntax_option_type __y) { 884e78f53d1SNikolas Klauser return syntax_option_type(int(__x) ^ int(__y)); 885e78f53d1SNikolas Klauser} 886e78f53d1SNikolas Klauser 887e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI syntax_option_type& operator&=(syntax_option_type& __x, syntax_option_type __y) { 888e78f53d1SNikolas Klauser __x = __x & __y; 889e78f53d1SNikolas Klauser return __x; 890e78f53d1SNikolas Klauser} 891e78f53d1SNikolas Klauser 892e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI syntax_option_type& operator|=(syntax_option_type& __x, syntax_option_type __y) { 893e78f53d1SNikolas Klauser __x = __x | __y; 894e78f53d1SNikolas Klauser return __x; 895e78f53d1SNikolas Klauser} 896e78f53d1SNikolas Klauser 897e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI syntax_option_type& operator^=(syntax_option_type& __x, syntax_option_type __y) { 898e78f53d1SNikolas Klauser __x = __x ^ __y; 899e78f53d1SNikolas Klauser return __x; 900e78f53d1SNikolas Klauser} 901e78f53d1SNikolas Klauser 902e78f53d1SNikolas Klauser// match_flag_type 903e78f53d1SNikolas Klauser 904e78f53d1SNikolas Klauserenum match_flag_type { 905e78f53d1SNikolas Klauser match_default = 0, 906e78f53d1SNikolas Klauser match_not_bol = 1 << 0, 907e78f53d1SNikolas Klauser match_not_eol = 1 << 1, 908e78f53d1SNikolas Klauser match_not_bow = 1 << 2, 909e78f53d1SNikolas Klauser match_not_eow = 1 << 3, 910e78f53d1SNikolas Klauser match_any = 1 << 4, 911e78f53d1SNikolas Klauser match_not_null = 1 << 5, 912e78f53d1SNikolas Klauser match_continuous = 1 << 6, 913e78f53d1SNikolas Klauser match_prev_avail = 1 << 7, 914e78f53d1SNikolas Klauser format_default = 0, 915e78f53d1SNikolas Klauser format_sed = 1 << 8, 916e78f53d1SNikolas Klauser format_no_copy = 1 << 9, 917e78f53d1SNikolas Klauser format_first_only = 1 << 10, 918e78f53d1SNikolas Klauser __no_update_pos = 1 << 11, 919e78f53d1SNikolas Klauser __full_match = 1 << 12 920e78f53d1SNikolas Klauser}; 921e78f53d1SNikolas Klauser 922e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR match_flag_type operator~(match_flag_type __x) { 923e78f53d1SNikolas Klauser return match_flag_type(~int(__x) & 0x0FFF); 924e78f53d1SNikolas Klauser} 925e78f53d1SNikolas Klauser 926e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR match_flag_type operator&(match_flag_type __x, match_flag_type __y) { 927e78f53d1SNikolas Klauser return match_flag_type(int(__x) & int(__y)); 928e78f53d1SNikolas Klauser} 929e78f53d1SNikolas Klauser 930e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR match_flag_type operator|(match_flag_type __x, match_flag_type __y) { 931e78f53d1SNikolas Klauser return match_flag_type(int(__x) | int(__y)); 932e78f53d1SNikolas Klauser} 933e78f53d1SNikolas Klauser 934e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR match_flag_type operator^(match_flag_type __x, match_flag_type __y) { 935e78f53d1SNikolas Klauser return match_flag_type(int(__x) ^ int(__y)); 936e78f53d1SNikolas Klauser} 937e78f53d1SNikolas Klauser 938e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI match_flag_type& operator&=(match_flag_type& __x, match_flag_type __y) { 939e78f53d1SNikolas Klauser __x = __x & __y; 940e78f53d1SNikolas Klauser return __x; 941e78f53d1SNikolas Klauser} 942e78f53d1SNikolas Klauser 943e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI match_flag_type& operator|=(match_flag_type& __x, match_flag_type __y) { 944e78f53d1SNikolas Klauser __x = __x | __y; 945e78f53d1SNikolas Klauser return __x; 946e78f53d1SNikolas Klauser} 947e78f53d1SNikolas Klauser 948e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI match_flag_type& operator^=(match_flag_type& __x, match_flag_type __y) { 949e78f53d1SNikolas Klauser __x = __x ^ __y; 950e78f53d1SNikolas Klauser return __x; 951e78f53d1SNikolas Klauser} 952e78f53d1SNikolas Klauser 953e78f53d1SNikolas Klauserenum error_type { 954e78f53d1SNikolas Klauser error_collate = 1, 955e78f53d1SNikolas Klauser error_ctype, 956e78f53d1SNikolas Klauser error_escape, 957e78f53d1SNikolas Klauser error_backref, 958e78f53d1SNikolas Klauser error_brack, 959e78f53d1SNikolas Klauser error_paren, 960e78f53d1SNikolas Klauser error_brace, 961e78f53d1SNikolas Klauser error_badbrace, 962e78f53d1SNikolas Klauser error_range, 963e78f53d1SNikolas Klauser error_space, 964e78f53d1SNikolas Klauser error_badrepeat, 965e78f53d1SNikolas Klauser error_complexity, 966e78f53d1SNikolas Klauser error_stack, 967e78f53d1SNikolas Klauser __re_err_grammar, 968e78f53d1SNikolas Klauser __re_err_empty, 969e78f53d1SNikolas Klauser __re_err_unknown, 970e78f53d1SNikolas Klauser __re_err_parse 971e78f53d1SNikolas Klauser}; 972e78f53d1SNikolas Klauser 973e78f53d1SNikolas Klauser} // namespace regex_constants 974e78f53d1SNikolas Klauser 975e78f53d1SNikolas Klauserclass _LIBCPP_EXPORTED_FROM_ABI regex_error : public runtime_error { 976e78f53d1SNikolas Klauser regex_constants::error_type __code_; 977e78f53d1SNikolas Klauser 978e78f53d1SNikolas Klauserpublic: 979e78f53d1SNikolas Klauser explicit regex_error(regex_constants::error_type __ecode); 980e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI regex_error(const regex_error&) _NOEXCEPT = default; 981e78f53d1SNikolas Klauser ~regex_error() _NOEXCEPT override; 982e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI regex_constants::error_type code() const { return __code_; } 983e78f53d1SNikolas Klauser}; 984e78f53d1SNikolas Klauser 985e78f53d1SNikolas Klausertemplate <regex_constants::error_type _Ev> 986e78f53d1SNikolas Klauser_LIBCPP_NORETURN inline _LIBCPP_HIDE_FROM_ABI void __throw_regex_error() { 987e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 988e78f53d1SNikolas Klauser throw regex_error(_Ev); 989e78f53d1SNikolas Klauser#else 990e78f53d1SNikolas Klauser _LIBCPP_VERBOSE_ABORT("regex_error was thrown in -fno-exceptions mode"); 991e78f53d1SNikolas Klauser#endif 992e78f53d1SNikolas Klauser} 993e78f53d1SNikolas Klauser 994e78f53d1SNikolas Klausertemplate <class _CharT> 995e78f53d1SNikolas Klauserstruct _LIBCPP_TEMPLATE_VIS regex_traits { 996e78f53d1SNikolas Klauserpublic: 997e78f53d1SNikolas Klauser typedef _CharT char_type; 998e78f53d1SNikolas Klauser typedef basic_string<char_type> string_type; 999e78f53d1SNikolas Klauser typedef locale locale_type; 1000e78f53d1SNikolas Klauser#if defined(__BIONIC__) || defined(_NEWLIB_VERSION) 1001e78f53d1SNikolas Klauser // Originally bionic's ctype_base used its own ctype masks because the 1002e78f53d1SNikolas Klauser // builtin ctype implementation wasn't in libc++ yet. Bionic's ctype mask 1003e78f53d1SNikolas Klauser // was only 8 bits wide and already saturated, so it used a wider type here 1004e78f53d1SNikolas Klauser // to make room for __regex_word (then a part of this class rather than 1005e78f53d1SNikolas Klauser // ctype_base). Bionic has since moved to the builtin ctype_base 1006e78f53d1SNikolas Klauser // implementation, but this was not updated to match. Since then Android has 1007e78f53d1SNikolas Klauser // needed to maintain a stable libc++ ABI, and this can't be changed without 1008e78f53d1SNikolas Klauser // an ABI break. 1009e78f53d1SNikolas Klauser // We also need this workaround for newlib since _NEWLIB_VERSION is not 1010e78f53d1SNikolas Klauser // defined yet inside __config, so we can't set the 1011e78f53d1SNikolas Klauser // _LIBCPP_PROVIDES_DEFAULT_RUNE_TABLE macro. Additionally, newlib is 1012e78f53d1SNikolas Klauser // often used for space constrained environments, so it makes sense not to 1013e78f53d1SNikolas Klauser // duplicate the ctype table. 1014e78f53d1SNikolas Klauser typedef uint16_t char_class_type; 1015e78f53d1SNikolas Klauser#else 1016e78f53d1SNikolas Klauser typedef ctype_base::mask char_class_type; 1017e78f53d1SNikolas Klauser#endif 1018e78f53d1SNikolas Klauser 1019e78f53d1SNikolas Klauser static const char_class_type __regex_word = ctype_base::__regex_word; 1020e78f53d1SNikolas Klauser 1021e78f53d1SNikolas Klauserprivate: 1022e78f53d1SNikolas Klauser locale __loc_; 1023e78f53d1SNikolas Klauser const ctype<char_type>* __ct_; 1024e78f53d1SNikolas Klauser const collate<char_type>* __col_; 1025e78f53d1SNikolas Klauser 1026e78f53d1SNikolas Klauserpublic: 1027e78f53d1SNikolas Klauser regex_traits(); 1028e78f53d1SNikolas Klauser 1029e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI static size_t length(const char_type* __p) { return char_traits<char_type>::length(__p); } 1030e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI char_type translate(char_type __c) const { return __c; } 1031e78f53d1SNikolas Klauser char_type translate_nocase(char_type __c) const; 1032e78f53d1SNikolas Klauser template <class _ForwardIterator> 1033e78f53d1SNikolas Klauser string_type transform(_ForwardIterator __f, _ForwardIterator __l) const; 1034e78f53d1SNikolas Klauser template <class _ForwardIterator> 1035e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI string_type transform_primary(_ForwardIterator __f, _ForwardIterator __l) const { 1036e78f53d1SNikolas Klauser return __transform_primary(__f, __l, char_type()); 1037e78f53d1SNikolas Klauser } 1038e78f53d1SNikolas Klauser template <class _ForwardIterator> 1039e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI string_type lookup_collatename(_ForwardIterator __f, _ForwardIterator __l) const { 1040e78f53d1SNikolas Klauser return __lookup_collatename(__f, __l, char_type()); 1041e78f53d1SNikolas Klauser } 1042e78f53d1SNikolas Klauser template <class _ForwardIterator> 1043e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI char_class_type 1044e78f53d1SNikolas Klauser lookup_classname(_ForwardIterator __f, _ForwardIterator __l, bool __icase = false) const { 1045e78f53d1SNikolas Klauser return __lookup_classname(__f, __l, __icase, char_type()); 1046e78f53d1SNikolas Klauser } 1047e78f53d1SNikolas Klauser bool isctype(char_type __c, char_class_type __m) const; 1048e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI int value(char_type __ch, int __radix) const { return __regex_traits_value(__ch, __radix); } 1049e78f53d1SNikolas Klauser locale_type imbue(locale_type __l); 1050e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI locale_type getloc() const { return __loc_; } 1051e78f53d1SNikolas Klauser 1052e78f53d1SNikolas Klauserprivate: 1053e78f53d1SNikolas Klauser void __init(); 1054e78f53d1SNikolas Klauser 1055e78f53d1SNikolas Klauser template <class _ForwardIterator> 1056e78f53d1SNikolas Klauser string_type __transform_primary(_ForwardIterator __f, _ForwardIterator __l, char) const; 1057e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS 1058e78f53d1SNikolas Klauser template <class _ForwardIterator> 1059e78f53d1SNikolas Klauser string_type __transform_primary(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const; 1060e78f53d1SNikolas Klauser#endif 1061e78f53d1SNikolas Klauser template <class _ForwardIterator> 1062e78f53d1SNikolas Klauser string_type __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, char) const; 1063e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS 1064e78f53d1SNikolas Klauser template <class _ForwardIterator> 1065e78f53d1SNikolas Klauser string_type __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const; 1066e78f53d1SNikolas Klauser#endif 1067e78f53d1SNikolas Klauser template <class _ForwardIterator> 1068e78f53d1SNikolas Klauser char_class_type __lookup_classname(_ForwardIterator __f, _ForwardIterator __l, bool __icase, char) const; 1069e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS 1070e78f53d1SNikolas Klauser template <class _ForwardIterator> 1071e78f53d1SNikolas Klauser char_class_type __lookup_classname(_ForwardIterator __f, _ForwardIterator __l, bool __icase, wchar_t) const; 1072e78f53d1SNikolas Klauser#endif 1073e78f53d1SNikolas Klauser 1074e78f53d1SNikolas Klauser static int __regex_traits_value(unsigned char __ch, int __radix); 1075e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI int __regex_traits_value(char __ch, int __radix) const { 1076e78f53d1SNikolas Klauser return __regex_traits_value(static_cast<unsigned char>(__ch), __radix); 1077e78f53d1SNikolas Klauser } 1078e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS 1079e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI int __regex_traits_value(wchar_t __ch, int __radix) const; 1080e78f53d1SNikolas Klauser#endif 1081e78f53d1SNikolas Klauser}; 1082e78f53d1SNikolas Klauser 1083e78f53d1SNikolas Klausertemplate <class _CharT> 1084e78f53d1SNikolas Klauserconst typename regex_traits<_CharT>::char_class_type regex_traits<_CharT>::__regex_word; 1085e78f53d1SNikolas Klauser 1086e78f53d1SNikolas Klausertemplate <class _CharT> 1087e78f53d1SNikolas Klauserregex_traits<_CharT>::regex_traits() { 1088e78f53d1SNikolas Klauser __init(); 1089e78f53d1SNikolas Klauser} 1090e78f53d1SNikolas Klauser 1091e78f53d1SNikolas Klausertemplate <class _CharT> 1092e78f53d1SNikolas Klausertypename regex_traits<_CharT>::char_type regex_traits<_CharT>::translate_nocase(char_type __c) const { 1093e78f53d1SNikolas Klauser return __ct_->tolower(__c); 1094e78f53d1SNikolas Klauser} 1095e78f53d1SNikolas Klauser 1096e78f53d1SNikolas Klausertemplate <class _CharT> 1097e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 1098e78f53d1SNikolas Klausertypename regex_traits<_CharT>::string_type 1099e78f53d1SNikolas Klauserregex_traits<_CharT>::transform(_ForwardIterator __f, _ForwardIterator __l) const { 1100e78f53d1SNikolas Klauser string_type __s(__f, __l); 1101e78f53d1SNikolas Klauser return __col_->transform(__s.data(), __s.data() + __s.size()); 1102e78f53d1SNikolas Klauser} 1103e78f53d1SNikolas Klauser 1104e78f53d1SNikolas Klausertemplate <class _CharT> 1105e78f53d1SNikolas Klauservoid regex_traits<_CharT>::__init() { 1106e78f53d1SNikolas Klauser __ct_ = &std::use_facet<ctype<char_type> >(__loc_); 1107e78f53d1SNikolas Klauser __col_ = &std::use_facet<collate<char_type> >(__loc_); 1108e78f53d1SNikolas Klauser} 1109e78f53d1SNikolas Klauser 1110e78f53d1SNikolas Klausertemplate <class _CharT> 1111e78f53d1SNikolas Klausertypename regex_traits<_CharT>::locale_type regex_traits<_CharT>::imbue(locale_type __l) { 1112e78f53d1SNikolas Klauser locale __r = __loc_; 1113e78f53d1SNikolas Klauser __loc_ = __l; 1114e78f53d1SNikolas Klauser __init(); 1115e78f53d1SNikolas Klauser return __r; 1116e78f53d1SNikolas Klauser} 1117e78f53d1SNikolas Klauser 1118e78f53d1SNikolas Klauser// transform_primary is very FreeBSD-specific 1119e78f53d1SNikolas Klauser 1120e78f53d1SNikolas Klausertemplate <class _CharT> 1121e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 1122e78f53d1SNikolas Klausertypename regex_traits<_CharT>::string_type 1123e78f53d1SNikolas Klauserregex_traits<_CharT>::__transform_primary(_ForwardIterator __f, _ForwardIterator __l, char) const { 1124e78f53d1SNikolas Klauser const string_type __s(__f, __l); 1125e78f53d1SNikolas Klauser string_type __d = __col_->transform(__s.data(), __s.data() + __s.size()); 1126e78f53d1SNikolas Klauser switch (__d.size()) { 1127e78f53d1SNikolas Klauser case 1: 1128e78f53d1SNikolas Klauser break; 1129e78f53d1SNikolas Klauser case 12: 1130e78f53d1SNikolas Klauser __d[11] = __d[3]; 1131e78f53d1SNikolas Klauser break; 1132e78f53d1SNikolas Klauser default: 1133e78f53d1SNikolas Klauser __d.clear(); 1134e78f53d1SNikolas Klauser break; 1135e78f53d1SNikolas Klauser } 1136e78f53d1SNikolas Klauser return __d; 1137e78f53d1SNikolas Klauser} 1138e78f53d1SNikolas Klauser 1139e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS 1140e78f53d1SNikolas Klausertemplate <class _CharT> 1141e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 1142e78f53d1SNikolas Klausertypename regex_traits<_CharT>::string_type 1143e78f53d1SNikolas Klauserregex_traits<_CharT>::__transform_primary(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const { 1144e78f53d1SNikolas Klauser const string_type __s(__f, __l); 1145e78f53d1SNikolas Klauser string_type __d = __col_->transform(__s.data(), __s.data() + __s.size()); 1146e78f53d1SNikolas Klauser switch (__d.size()) { 1147e78f53d1SNikolas Klauser case 1: 1148e78f53d1SNikolas Klauser break; 1149e78f53d1SNikolas Klauser case 3: 1150e78f53d1SNikolas Klauser __d[2] = __d[0]; 1151e78f53d1SNikolas Klauser break; 1152e78f53d1SNikolas Klauser default: 1153e78f53d1SNikolas Klauser __d.clear(); 1154e78f53d1SNikolas Klauser break; 1155e78f53d1SNikolas Klauser } 1156e78f53d1SNikolas Klauser return __d; 1157e78f53d1SNikolas Klauser} 1158e78f53d1SNikolas Klauser#endif 1159e78f53d1SNikolas Klauser 1160e78f53d1SNikolas Klauser// lookup_collatename is very FreeBSD-specific 1161e78f53d1SNikolas Klauser 1162e78f53d1SNikolas Klauser_LIBCPP_EXPORTED_FROM_ABI string __get_collation_name(const char* __s); 1163e78f53d1SNikolas Klauser 1164e78f53d1SNikolas Klausertemplate <class _CharT> 1165e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 1166e78f53d1SNikolas Klausertypename regex_traits<_CharT>::string_type 1167e78f53d1SNikolas Klauserregex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, char) const { 1168e78f53d1SNikolas Klauser string_type __s(__f, __l); 1169e78f53d1SNikolas Klauser string_type __r; 1170e78f53d1SNikolas Klauser if (!__s.empty()) { 1171e78f53d1SNikolas Klauser __r = std::__get_collation_name(__s.c_str()); 1172e78f53d1SNikolas Klauser if (__r.empty() && __s.size() <= 2) { 1173e78f53d1SNikolas Klauser __r = __col_->transform(__s.data(), __s.data() + __s.size()); 1174e78f53d1SNikolas Klauser if (__r.size() == 1 || __r.size() == 12) 1175e78f53d1SNikolas Klauser __r = __s; 1176e78f53d1SNikolas Klauser else 1177e78f53d1SNikolas Klauser __r.clear(); 1178e78f53d1SNikolas Klauser } 1179e78f53d1SNikolas Klauser } 1180e78f53d1SNikolas Klauser return __r; 1181e78f53d1SNikolas Klauser} 1182e78f53d1SNikolas Klauser 1183e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS 1184e78f53d1SNikolas Klausertemplate <class _CharT> 1185e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 1186e78f53d1SNikolas Klausertypename regex_traits<_CharT>::string_type 1187e78f53d1SNikolas Klauserregex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const { 1188e78f53d1SNikolas Klauser string_type __s(__f, __l); 1189e78f53d1SNikolas Klauser string __n; 1190e78f53d1SNikolas Klauser __n.reserve(__s.size()); 1191e78f53d1SNikolas Klauser for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end(); __i != __e; ++__i) { 1192e78f53d1SNikolas Klauser if (static_cast<unsigned>(*__i) >= 127) 1193e78f53d1SNikolas Klauser return string_type(); 1194e78f53d1SNikolas Klauser __n.push_back(char(*__i)); 1195e78f53d1SNikolas Klauser } 1196e78f53d1SNikolas Klauser string_type __r; 1197e78f53d1SNikolas Klauser if (!__s.empty()) { 1198e78f53d1SNikolas Klauser __n = __get_collation_name(__n.c_str()); 1199e78f53d1SNikolas Klauser if (!__n.empty()) 1200e78f53d1SNikolas Klauser __r.assign(__n.begin(), __n.end()); 1201e78f53d1SNikolas Klauser else if (__s.size() <= 2) { 1202e78f53d1SNikolas Klauser __r = __col_->transform(__s.data(), __s.data() + __s.size()); 1203e78f53d1SNikolas Klauser if (__r.size() == 1 || __r.size() == 3) 1204e78f53d1SNikolas Klauser __r = __s; 1205e78f53d1SNikolas Klauser else 1206e78f53d1SNikolas Klauser __r.clear(); 1207e78f53d1SNikolas Klauser } 1208e78f53d1SNikolas Klauser } 1209e78f53d1SNikolas Klauser return __r; 1210e78f53d1SNikolas Klauser} 1211e78f53d1SNikolas Klauser#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS 1212e78f53d1SNikolas Klauser 1213e78f53d1SNikolas Klauser// lookup_classname 1214e78f53d1SNikolas Klauser 1215e78f53d1SNikolas Klauserregex_traits<char>::char_class_type _LIBCPP_EXPORTED_FROM_ABI __get_classname(const char* __s, bool __icase); 1216e78f53d1SNikolas Klauser 1217e78f53d1SNikolas Klausertemplate <class _CharT> 1218e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 1219e78f53d1SNikolas Klausertypename regex_traits<_CharT>::char_class_type 1220e78f53d1SNikolas Klauserregex_traits<_CharT>::__lookup_classname(_ForwardIterator __f, _ForwardIterator __l, bool __icase, char) const { 1221e78f53d1SNikolas Klauser string_type __s(__f, __l); 1222e78f53d1SNikolas Klauser __ct_->tolower(&__s[0], &__s[0] + __s.size()); 1223e78f53d1SNikolas Klauser return std::__get_classname(__s.c_str(), __icase); 1224e78f53d1SNikolas Klauser} 1225e78f53d1SNikolas Klauser 1226e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS 1227e78f53d1SNikolas Klausertemplate <class _CharT> 1228e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 1229e78f53d1SNikolas Klausertypename regex_traits<_CharT>::char_class_type 1230e78f53d1SNikolas Klauserregex_traits<_CharT>::__lookup_classname(_ForwardIterator __f, _ForwardIterator __l, bool __icase, wchar_t) const { 1231e78f53d1SNikolas Klauser string_type __s(__f, __l); 1232e78f53d1SNikolas Klauser __ct_->tolower(&__s[0], &__s[0] + __s.size()); 1233e78f53d1SNikolas Klauser string __n; 1234e78f53d1SNikolas Klauser __n.reserve(__s.size()); 1235e78f53d1SNikolas Klauser for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end(); __i != __e; ++__i) { 1236e78f53d1SNikolas Klauser if (static_cast<unsigned>(*__i) >= 127) 1237e78f53d1SNikolas Klauser return char_class_type(); 1238e78f53d1SNikolas Klauser __n.push_back(char(*__i)); 1239e78f53d1SNikolas Klauser } 1240e78f53d1SNikolas Klauser return __get_classname(__n.c_str(), __icase); 1241e78f53d1SNikolas Klauser} 1242e78f53d1SNikolas Klauser#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS 1243e78f53d1SNikolas Klauser 1244e78f53d1SNikolas Klausertemplate <class _CharT> 1245e78f53d1SNikolas Klauserbool regex_traits<_CharT>::isctype(char_type __c, char_class_type __m) const { 1246e78f53d1SNikolas Klauser if (__ct_->is(__m, __c)) 1247e78f53d1SNikolas Klauser return true; 1248e78f53d1SNikolas Klauser return (__c == '_' && (__m & __regex_word)); 1249e78f53d1SNikolas Klauser} 1250e78f53d1SNikolas Klauser 1251e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool __is_07(unsigned char __c) { 1252e78f53d1SNikolas Klauser return (__c & 0xF8u) == 1253e78f53d1SNikolas Klauser#if defined(__MVS__) && !defined(__NATIVE_ASCII_F) 1254e78f53d1SNikolas Klauser 0xF0; 1255e78f53d1SNikolas Klauser#else 1256e78f53d1SNikolas Klauser 0x30; 1257e78f53d1SNikolas Klauser#endif 1258e78f53d1SNikolas Klauser} 1259e78f53d1SNikolas Klauser 1260e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool __is_89(unsigned char __c) { 1261e78f53d1SNikolas Klauser return (__c & 0xFEu) == 1262e78f53d1SNikolas Klauser#if defined(__MVS__) && !defined(__NATIVE_ASCII_F) 1263e78f53d1SNikolas Klauser 0xF8; 1264e78f53d1SNikolas Klauser#else 1265e78f53d1SNikolas Klauser 0x38; 1266e78f53d1SNikolas Klauser#endif 1267e78f53d1SNikolas Klauser} 1268e78f53d1SNikolas Klauser 1269e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI unsigned char __to_lower(unsigned char __c) { 1270e78f53d1SNikolas Klauser#if defined(__MVS__) && !defined(__NATIVE_ASCII_F) 1271e78f53d1SNikolas Klauser return __c & 0xBF; 1272e78f53d1SNikolas Klauser#else 1273e78f53d1SNikolas Klauser return __c | 0x20; 1274e78f53d1SNikolas Klauser#endif 1275e78f53d1SNikolas Klauser} 1276e78f53d1SNikolas Klauser 1277e78f53d1SNikolas Klausertemplate <class _CharT> 1278e78f53d1SNikolas Klauserint regex_traits<_CharT>::__regex_traits_value(unsigned char __ch, int __radix) { 1279e78f53d1SNikolas Klauser if (__is_07(__ch)) // '0' <= __ch && __ch <= '7' 1280e78f53d1SNikolas Klauser return __ch - '0'; 1281e78f53d1SNikolas Klauser if (__radix != 8) { 1282e78f53d1SNikolas Klauser if (__is_89(__ch)) // '8' <= __ch && __ch <= '9' 1283e78f53d1SNikolas Klauser return __ch - '0'; 1284e78f53d1SNikolas Klauser if (__radix == 16) { 1285e78f53d1SNikolas Klauser __ch = __to_lower(__ch); // tolower 1286e78f53d1SNikolas Klauser if ('a' <= __ch && __ch <= 'f') 1287e78f53d1SNikolas Klauser return __ch - ('a' - 10); 1288e78f53d1SNikolas Klauser } 1289e78f53d1SNikolas Klauser } 1290e78f53d1SNikolas Klauser return -1; 1291e78f53d1SNikolas Klauser} 1292e78f53d1SNikolas Klauser 1293e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS 1294e78f53d1SNikolas Klausertemplate <class _CharT> 1295e78f53d1SNikolas Klauserinline int regex_traits<_CharT>::__regex_traits_value(wchar_t __ch, int __radix) const { 1296e78f53d1SNikolas Klauser return __regex_traits_value(static_cast<unsigned char>(__ct_->narrow(__ch, char_type())), __radix); 1297e78f53d1SNikolas Klauser} 1298e78f53d1SNikolas Klauser#endif 1299e78f53d1SNikolas Klauser 1300e78f53d1SNikolas Klausertemplate <class _CharT> 1301e78f53d1SNikolas Klauserclass __node; 1302e78f53d1SNikolas Klauser 1303e78f53d1SNikolas Klausertemplate <class _BidirectionalIterator> 1304e78f53d1SNikolas Klauserclass _LIBCPP_TEMPLATE_VIS sub_match; 1305e78f53d1SNikolas Klauser 1306e78f53d1SNikolas Klausertemplate <class _BidirectionalIterator, class _Allocator = allocator<sub_match<_BidirectionalIterator> > > 1307e78f53d1SNikolas Klauserclass _LIBCPP_TEMPLATE_VIS match_results; 1308e78f53d1SNikolas Klauser 1309e78f53d1SNikolas Klausertemplate <class _CharT> 1310e78f53d1SNikolas Klauserstruct __state { 1311e78f53d1SNikolas Klauser enum { 1312e78f53d1SNikolas Klauser __end_state = -1000, 1313e78f53d1SNikolas Klauser __consume_input, // -999 1314e78f53d1SNikolas Klauser __begin_marked_expr, // -998 1315e78f53d1SNikolas Klauser __end_marked_expr, // -997 1316e78f53d1SNikolas Klauser __pop_state, // -996 1317e78f53d1SNikolas Klauser __accept_and_consume, // -995 1318e78f53d1SNikolas Klauser __accept_but_not_consume, // -994 1319e78f53d1SNikolas Klauser __reject, // -993 1320e78f53d1SNikolas Klauser __split, 1321e78f53d1SNikolas Klauser __repeat 1322e78f53d1SNikolas Klauser }; 1323e78f53d1SNikolas Klauser 1324e78f53d1SNikolas Klauser int __do_; 1325e78f53d1SNikolas Klauser const _CharT* __first_; 1326e78f53d1SNikolas Klauser const _CharT* __current_; 1327e78f53d1SNikolas Klauser const _CharT* __last_; 1328e78f53d1SNikolas Klauser vector<sub_match<const _CharT*> > __sub_matches_; 1329e78f53d1SNikolas Klauser vector<pair<size_t, const _CharT*> > __loop_data_; 1330e78f53d1SNikolas Klauser const __node<_CharT>* __node_; 1331e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags_; 1332e78f53d1SNikolas Klauser bool __at_first_; 1333e78f53d1SNikolas Klauser 1334e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI __state() 1335e78f53d1SNikolas Klauser : __do_(0), 1336e78f53d1SNikolas Klauser __first_(nullptr), 1337e78f53d1SNikolas Klauser __current_(nullptr), 1338e78f53d1SNikolas Klauser __last_(nullptr), 1339e78f53d1SNikolas Klauser __node_(nullptr), 1340e78f53d1SNikolas Klauser __flags_(), 1341e78f53d1SNikolas Klauser __at_first_(false) {} 1342e78f53d1SNikolas Klauser}; 1343e78f53d1SNikolas Klauser 1344e78f53d1SNikolas Klauser// __node 1345e78f53d1SNikolas Klauser 1346e78f53d1SNikolas Klausertemplate <class _CharT> 1347e78f53d1SNikolas Klauserclass __node { 1348e78f53d1SNikolas Klauserpublic: 1349e78f53d1SNikolas Klauser typedef std::__state<_CharT> __state; 1350e78f53d1SNikolas Klauser 1351e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI __node() {} 1352e78f53d1SNikolas Klauser __node(const __node&) = delete; 1353e78f53d1SNikolas Klauser __node& operator=(const __node&) = delete; 1354e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI_VIRTUAL 1355e78f53d1SNikolas Klauser virtual ~__node() {} 1356e78f53d1SNikolas Klauser 1357e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI_VIRTUAL 1358e78f53d1SNikolas Klauser virtual void __exec(__state&) const {} 1359e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI_VIRTUAL 1360e78f53d1SNikolas Klauser virtual void __exec_split(bool, __state&) const {} 1361e78f53d1SNikolas Klauser}; 1362e78f53d1SNikolas Klauser 1363e78f53d1SNikolas Klauser// __end_state 1364e78f53d1SNikolas Klauser 1365e78f53d1SNikolas Klausertemplate <class _CharT> 1366e78f53d1SNikolas Klauserclass __end_state : public __node<_CharT> { 1367e78f53d1SNikolas Klauserpublic: 1368e78f53d1SNikolas Klauser typedef std::__state<_CharT> __state; 1369e78f53d1SNikolas Klauser 1370e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI __end_state() {} 1371e78f53d1SNikolas Klauser 1372e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const; 1373e78f53d1SNikolas Klauser}; 1374e78f53d1SNikolas Klauser 1375e78f53d1SNikolas Klausertemplate <class _CharT> 1376e78f53d1SNikolas Klauservoid __end_state<_CharT>::__exec(__state& __s) const { 1377e78f53d1SNikolas Klauser __s.__do_ = __state::__end_state; 1378e78f53d1SNikolas Klauser} 1379e78f53d1SNikolas Klauser 1380e78f53d1SNikolas Klauser// __has_one_state 1381e78f53d1SNikolas Klauser 1382e78f53d1SNikolas Klausertemplate <class _CharT> 1383e78f53d1SNikolas Klauserclass __has_one_state : public __node<_CharT> { 1384e78f53d1SNikolas Klauser __node<_CharT>* __first_; 1385e78f53d1SNikolas Klauser 1386e78f53d1SNikolas Klauserpublic: 1387e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI explicit __has_one_state(__node<_CharT>* __s) : __first_(__s) {} 1388e78f53d1SNikolas Klauser 1389e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI __node<_CharT>* first() const { return __first_; } 1390e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI __node<_CharT>*& first() { return __first_; } 1391e78f53d1SNikolas Klauser}; 1392e78f53d1SNikolas Klauser 1393e78f53d1SNikolas Klauser// __owns_one_state 1394e78f53d1SNikolas Klauser 1395e78f53d1SNikolas Klausertemplate <class _CharT> 1396e78f53d1SNikolas Klauserclass __owns_one_state : public __has_one_state<_CharT> { 1397e78f53d1SNikolas Klauser typedef __has_one_state<_CharT> base; 1398e78f53d1SNikolas Klauser 1399e78f53d1SNikolas Klauserpublic: 1400e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI explicit __owns_one_state(__node<_CharT>* __s) : base(__s) {} 1401e78f53d1SNikolas Klauser 1402e78f53d1SNikolas Klauser ~__owns_one_state() override; 1403e78f53d1SNikolas Klauser}; 1404e78f53d1SNikolas Klauser 1405e78f53d1SNikolas Klausertemplate <class _CharT> 1406e78f53d1SNikolas Klauser__owns_one_state<_CharT>::~__owns_one_state() { 1407e78f53d1SNikolas Klauser delete this->first(); 1408e78f53d1SNikolas Klauser} 1409e78f53d1SNikolas Klauser 1410e78f53d1SNikolas Klauser// __empty_state 1411e78f53d1SNikolas Klauser 1412e78f53d1SNikolas Klausertemplate <class _CharT> 1413e78f53d1SNikolas Klauserclass __empty_state : public __owns_one_state<_CharT> { 1414e78f53d1SNikolas Klauser typedef __owns_one_state<_CharT> base; 1415e78f53d1SNikolas Klauser 1416e78f53d1SNikolas Klauserpublic: 1417e78f53d1SNikolas Klauser typedef std::__state<_CharT> __state; 1418e78f53d1SNikolas Klauser 1419e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI explicit __empty_state(__node<_CharT>* __s) : base(__s) {} 1420e78f53d1SNikolas Klauser 1421e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const; 1422e78f53d1SNikolas Klauser}; 1423e78f53d1SNikolas Klauser 1424e78f53d1SNikolas Klausertemplate <class _CharT> 1425e78f53d1SNikolas Klauservoid __empty_state<_CharT>::__exec(__state& __s) const { 1426e78f53d1SNikolas Klauser __s.__do_ = __state::__accept_but_not_consume; 1427e78f53d1SNikolas Klauser __s.__node_ = this->first(); 1428e78f53d1SNikolas Klauser} 1429e78f53d1SNikolas Klauser 1430e78f53d1SNikolas Klauser// __empty_non_own_state 1431e78f53d1SNikolas Klauser 1432e78f53d1SNikolas Klausertemplate <class _CharT> 1433e78f53d1SNikolas Klauserclass __empty_non_own_state : public __has_one_state<_CharT> { 1434e78f53d1SNikolas Klauser typedef __has_one_state<_CharT> base; 1435e78f53d1SNikolas Klauser 1436e78f53d1SNikolas Klauserpublic: 1437e78f53d1SNikolas Klauser typedef std::__state<_CharT> __state; 1438e78f53d1SNikolas Klauser 1439e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI explicit __empty_non_own_state(__node<_CharT>* __s) : base(__s) {} 1440e78f53d1SNikolas Klauser 1441e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const; 1442e78f53d1SNikolas Klauser}; 1443e78f53d1SNikolas Klauser 1444e78f53d1SNikolas Klausertemplate <class _CharT> 1445e78f53d1SNikolas Klauservoid __empty_non_own_state<_CharT>::__exec(__state& __s) const { 1446e78f53d1SNikolas Klauser __s.__do_ = __state::__accept_but_not_consume; 1447e78f53d1SNikolas Klauser __s.__node_ = this->first(); 1448e78f53d1SNikolas Klauser} 1449e78f53d1SNikolas Klauser 1450e78f53d1SNikolas Klauser// __repeat_one_loop 1451e78f53d1SNikolas Klauser 1452e78f53d1SNikolas Klausertemplate <class _CharT> 1453e78f53d1SNikolas Klauserclass __repeat_one_loop : public __has_one_state<_CharT> { 1454e78f53d1SNikolas Klauser typedef __has_one_state<_CharT> base; 1455e78f53d1SNikolas Klauser 1456e78f53d1SNikolas Klauserpublic: 1457e78f53d1SNikolas Klauser typedef std::__state<_CharT> __state; 1458e78f53d1SNikolas Klauser 1459e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI explicit __repeat_one_loop(__node<_CharT>* __s) : base(__s) {} 1460e78f53d1SNikolas Klauser 1461e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const; 1462e78f53d1SNikolas Klauser}; 1463e78f53d1SNikolas Klauser 1464e78f53d1SNikolas Klausertemplate <class _CharT> 1465e78f53d1SNikolas Klauservoid __repeat_one_loop<_CharT>::__exec(__state& __s) const { 1466e78f53d1SNikolas Klauser __s.__do_ = __state::__repeat; 1467e78f53d1SNikolas Klauser __s.__node_ = this->first(); 1468e78f53d1SNikolas Klauser} 1469e78f53d1SNikolas Klauser 1470e78f53d1SNikolas Klauser// __owns_two_states 1471e78f53d1SNikolas Klauser 1472e78f53d1SNikolas Klausertemplate <class _CharT> 1473e78f53d1SNikolas Klauserclass __owns_two_states : public __owns_one_state<_CharT> { 1474e78f53d1SNikolas Klauser typedef __owns_one_state<_CharT> base; 1475e78f53d1SNikolas Klauser 1476e78f53d1SNikolas Klauser base* __second_; 1477e78f53d1SNikolas Klauser 1478e78f53d1SNikolas Klauserpublic: 1479e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI explicit __owns_two_states(__node<_CharT>* __s1, base* __s2) : base(__s1), __second_(__s2) {} 1480e78f53d1SNikolas Klauser 1481e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual ~__owns_two_states(); 1482e78f53d1SNikolas Klauser 1483e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI base* second() const { return __second_; } 1484e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI base*& second() { return __second_; } 1485e78f53d1SNikolas Klauser}; 1486e78f53d1SNikolas Klauser 1487e78f53d1SNikolas Klausertemplate <class _CharT> 1488e78f53d1SNikolas Klauser__owns_two_states<_CharT>::~__owns_two_states() { 1489e78f53d1SNikolas Klauser delete __second_; 1490e78f53d1SNikolas Klauser} 1491e78f53d1SNikolas Klauser 1492e78f53d1SNikolas Klauser// __loop 1493e78f53d1SNikolas Klauser 1494e78f53d1SNikolas Klausertemplate <class _CharT> 1495e78f53d1SNikolas Klauserclass __loop : public __owns_two_states<_CharT> { 1496e78f53d1SNikolas Klauser typedef __owns_two_states<_CharT> base; 1497e78f53d1SNikolas Klauser 1498e78f53d1SNikolas Klauser size_t __min_; 1499e78f53d1SNikolas Klauser size_t __max_; 1500e78f53d1SNikolas Klauser unsigned __loop_id_; 1501e78f53d1SNikolas Klauser unsigned __mexp_begin_; 1502e78f53d1SNikolas Klauser unsigned __mexp_end_; 1503e78f53d1SNikolas Klauser bool __greedy_; 1504e78f53d1SNikolas Klauser 1505e78f53d1SNikolas Klauserpublic: 1506e78f53d1SNikolas Klauser typedef std::__state<_CharT> __state; 1507e78f53d1SNikolas Klauser 1508e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI explicit __loop( 1509e78f53d1SNikolas Klauser unsigned __loop_id, 1510e78f53d1SNikolas Klauser __node<_CharT>* __s1, 1511e78f53d1SNikolas Klauser __owns_one_state<_CharT>* __s2, 1512e78f53d1SNikolas Klauser unsigned __mexp_begin, 1513e78f53d1SNikolas Klauser unsigned __mexp_end, 1514e78f53d1SNikolas Klauser bool __greedy = true, 1515e78f53d1SNikolas Klauser size_t __min = 0, 1516e78f53d1SNikolas Klauser size_t __max = numeric_limits<size_t>::max()) 1517e78f53d1SNikolas Klauser : base(__s1, __s2), 1518e78f53d1SNikolas Klauser __min_(__min), 1519e78f53d1SNikolas Klauser __max_(__max), 1520e78f53d1SNikolas Klauser __loop_id_(__loop_id), 1521e78f53d1SNikolas Klauser __mexp_begin_(__mexp_begin), 1522e78f53d1SNikolas Klauser __mexp_end_(__mexp_end), 1523e78f53d1SNikolas Klauser __greedy_(__greedy) {} 1524e78f53d1SNikolas Klauser 1525e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state& __s) const; 1526e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec_split(bool __second, __state& __s) const; 1527e78f53d1SNikolas Klauser 1528e78f53d1SNikolas Klauserprivate: 1529e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI void __init_repeat(__state& __s) const { 1530e78f53d1SNikolas Klauser __s.__loop_data_[__loop_id_].second = __s.__current_; 1531e78f53d1SNikolas Klauser for (size_t __i = __mexp_begin_ - 1; __i != __mexp_end_ - 1; ++__i) { 1532e78f53d1SNikolas Klauser __s.__sub_matches_[__i].first = __s.__last_; 1533e78f53d1SNikolas Klauser __s.__sub_matches_[__i].second = __s.__last_; 1534e78f53d1SNikolas Klauser __s.__sub_matches_[__i].matched = false; 1535e78f53d1SNikolas Klauser } 1536e78f53d1SNikolas Klauser } 1537e78f53d1SNikolas Klauser}; 1538e78f53d1SNikolas Klauser 1539e78f53d1SNikolas Klausertemplate <class _CharT> 1540e78f53d1SNikolas Klauservoid __loop<_CharT>::__exec(__state& __s) const { 1541e78f53d1SNikolas Klauser if (__s.__do_ == __state::__repeat) { 1542e78f53d1SNikolas Klauser bool __do_repeat = ++__s.__loop_data_[__loop_id_].first < __max_; 1543e78f53d1SNikolas Klauser bool __do_alt = __s.__loop_data_[__loop_id_].first >= __min_; 1544e78f53d1SNikolas Klauser if (__do_repeat && __do_alt && __s.__loop_data_[__loop_id_].second == __s.__current_) 1545e78f53d1SNikolas Klauser __do_repeat = false; 1546e78f53d1SNikolas Klauser if (__do_repeat && __do_alt) 1547e78f53d1SNikolas Klauser __s.__do_ = __state::__split; 1548e78f53d1SNikolas Klauser else if (__do_repeat) { 1549e78f53d1SNikolas Klauser __s.__do_ = __state::__accept_but_not_consume; 1550e78f53d1SNikolas Klauser __s.__node_ = this->first(); 1551e78f53d1SNikolas Klauser __init_repeat(__s); 1552e78f53d1SNikolas Klauser } else { 1553e78f53d1SNikolas Klauser __s.__do_ = __state::__accept_but_not_consume; 1554e78f53d1SNikolas Klauser __s.__node_ = this->second(); 1555e78f53d1SNikolas Klauser } 1556e78f53d1SNikolas Klauser } else { 1557e78f53d1SNikolas Klauser __s.__loop_data_[__loop_id_].first = 0; 1558e78f53d1SNikolas Klauser bool __do_repeat = 0 < __max_; 1559e78f53d1SNikolas Klauser bool __do_alt = 0 >= __min_; 1560e78f53d1SNikolas Klauser if (__do_repeat && __do_alt) 1561e78f53d1SNikolas Klauser __s.__do_ = __state::__split; 1562e78f53d1SNikolas Klauser else if (__do_repeat) { 1563e78f53d1SNikolas Klauser __s.__do_ = __state::__accept_but_not_consume; 1564e78f53d1SNikolas Klauser __s.__node_ = this->first(); 1565e78f53d1SNikolas Klauser __init_repeat(__s); 1566e78f53d1SNikolas Klauser } else { 1567e78f53d1SNikolas Klauser __s.__do_ = __state::__accept_but_not_consume; 1568e78f53d1SNikolas Klauser __s.__node_ = this->second(); 1569e78f53d1SNikolas Klauser } 1570e78f53d1SNikolas Klauser } 1571e78f53d1SNikolas Klauser} 1572e78f53d1SNikolas Klauser 1573e78f53d1SNikolas Klausertemplate <class _CharT> 1574e78f53d1SNikolas Klauservoid __loop<_CharT>::__exec_split(bool __second, __state& __s) const { 1575e78f53d1SNikolas Klauser __s.__do_ = __state::__accept_but_not_consume; 1576e78f53d1SNikolas Klauser if (__greedy_ != __second) { 1577e78f53d1SNikolas Klauser __s.__node_ = this->first(); 1578e78f53d1SNikolas Klauser __init_repeat(__s); 1579e78f53d1SNikolas Klauser } else 1580e78f53d1SNikolas Klauser __s.__node_ = this->second(); 1581e78f53d1SNikolas Klauser} 1582e78f53d1SNikolas Klauser 1583e78f53d1SNikolas Klauser// __alternate 1584e78f53d1SNikolas Klauser 1585e78f53d1SNikolas Klausertemplate <class _CharT> 1586e78f53d1SNikolas Klauserclass __alternate : public __owns_two_states<_CharT> { 1587e78f53d1SNikolas Klauser typedef __owns_two_states<_CharT> base; 1588e78f53d1SNikolas Klauser 1589e78f53d1SNikolas Klauserpublic: 1590e78f53d1SNikolas Klauser typedef std::__state<_CharT> __state; 1591e78f53d1SNikolas Klauser 1592e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI explicit __alternate(__owns_one_state<_CharT>* __s1, __owns_one_state<_CharT>* __s2) 1593e78f53d1SNikolas Klauser : base(__s1, __s2) {} 1594e78f53d1SNikolas Klauser 1595e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state& __s) const; 1596e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec_split(bool __second, __state& __s) const; 1597e78f53d1SNikolas Klauser}; 1598e78f53d1SNikolas Klauser 1599e78f53d1SNikolas Klausertemplate <class _CharT> 1600e78f53d1SNikolas Klauservoid __alternate<_CharT>::__exec(__state& __s) const { 1601e78f53d1SNikolas Klauser __s.__do_ = __state::__split; 1602e78f53d1SNikolas Klauser} 1603e78f53d1SNikolas Klauser 1604e78f53d1SNikolas Klausertemplate <class _CharT> 1605e78f53d1SNikolas Klauservoid __alternate<_CharT>::__exec_split(bool __second, __state& __s) const { 1606e78f53d1SNikolas Klauser __s.__do_ = __state::__accept_but_not_consume; 1607e78f53d1SNikolas Klauser if (__second) 1608e78f53d1SNikolas Klauser __s.__node_ = this->second(); 1609e78f53d1SNikolas Klauser else 1610e78f53d1SNikolas Klauser __s.__node_ = this->first(); 1611e78f53d1SNikolas Klauser} 1612e78f53d1SNikolas Klauser 1613e78f53d1SNikolas Klauser// __begin_marked_subexpression 1614e78f53d1SNikolas Klauser 1615e78f53d1SNikolas Klausertemplate <class _CharT> 1616e78f53d1SNikolas Klauserclass __begin_marked_subexpression : public __owns_one_state<_CharT> { 1617e78f53d1SNikolas Klauser typedef __owns_one_state<_CharT> base; 1618e78f53d1SNikolas Klauser 1619e78f53d1SNikolas Klauser unsigned __mexp_; 1620e78f53d1SNikolas Klauser 1621e78f53d1SNikolas Klauserpublic: 1622e78f53d1SNikolas Klauser typedef std::__state<_CharT> __state; 1623e78f53d1SNikolas Klauser 1624e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI explicit __begin_marked_subexpression(unsigned __mexp, __node<_CharT>* __s) 1625e78f53d1SNikolas Klauser : base(__s), __mexp_(__mexp) {} 1626e78f53d1SNikolas Klauser 1627e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const; 1628e78f53d1SNikolas Klauser}; 1629e78f53d1SNikolas Klauser 1630e78f53d1SNikolas Klausertemplate <class _CharT> 1631e78f53d1SNikolas Klauservoid __begin_marked_subexpression<_CharT>::__exec(__state& __s) const { 1632e78f53d1SNikolas Klauser __s.__do_ = __state::__accept_but_not_consume; 1633e78f53d1SNikolas Klauser __s.__sub_matches_[__mexp_ - 1].first = __s.__current_; 1634e78f53d1SNikolas Klauser __s.__node_ = this->first(); 1635e78f53d1SNikolas Klauser} 1636e78f53d1SNikolas Klauser 1637e78f53d1SNikolas Klauser// __end_marked_subexpression 1638e78f53d1SNikolas Klauser 1639e78f53d1SNikolas Klausertemplate <class _CharT> 1640e78f53d1SNikolas Klauserclass __end_marked_subexpression : public __owns_one_state<_CharT> { 1641e78f53d1SNikolas Klauser typedef __owns_one_state<_CharT> base; 1642e78f53d1SNikolas Klauser 1643e78f53d1SNikolas Klauser unsigned __mexp_; 1644e78f53d1SNikolas Klauser 1645e78f53d1SNikolas Klauserpublic: 1646e78f53d1SNikolas Klauser typedef std::__state<_CharT> __state; 1647e78f53d1SNikolas Klauser 1648e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI explicit __end_marked_subexpression(unsigned __mexp, __node<_CharT>* __s) 1649e78f53d1SNikolas Klauser : base(__s), __mexp_(__mexp) {} 1650e78f53d1SNikolas Klauser 1651e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const; 1652e78f53d1SNikolas Klauser}; 1653e78f53d1SNikolas Klauser 1654e78f53d1SNikolas Klausertemplate <class _CharT> 1655e78f53d1SNikolas Klauservoid __end_marked_subexpression<_CharT>::__exec(__state& __s) const { 1656e78f53d1SNikolas Klauser __s.__do_ = __state::__accept_but_not_consume; 1657e78f53d1SNikolas Klauser __s.__sub_matches_[__mexp_ - 1].second = __s.__current_; 1658e78f53d1SNikolas Klauser __s.__sub_matches_[__mexp_ - 1].matched = true; 1659e78f53d1SNikolas Klauser __s.__node_ = this->first(); 1660e78f53d1SNikolas Klauser} 1661e78f53d1SNikolas Klauser 1662e78f53d1SNikolas Klauser// __back_ref 1663e78f53d1SNikolas Klauser 1664e78f53d1SNikolas Klausertemplate <class _CharT> 1665e78f53d1SNikolas Klauserclass __back_ref : public __owns_one_state<_CharT> { 1666e78f53d1SNikolas Klauser typedef __owns_one_state<_CharT> base; 1667e78f53d1SNikolas Klauser 1668e78f53d1SNikolas Klauser unsigned __mexp_; 1669e78f53d1SNikolas Klauser 1670e78f53d1SNikolas Klauserpublic: 1671e78f53d1SNikolas Klauser typedef std::__state<_CharT> __state; 1672e78f53d1SNikolas Klauser 1673e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI explicit __back_ref(unsigned __mexp, __node<_CharT>* __s) : base(__s), __mexp_(__mexp) {} 1674e78f53d1SNikolas Klauser 1675e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const; 1676e78f53d1SNikolas Klauser}; 1677e78f53d1SNikolas Klauser 1678e78f53d1SNikolas Klausertemplate <class _CharT> 1679e78f53d1SNikolas Klauservoid __back_ref<_CharT>::__exec(__state& __s) const { 1680e78f53d1SNikolas Klauser if (__mexp_ > __s.__sub_matches_.size()) 1681e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_backref>(); 1682e78f53d1SNikolas Klauser sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_ - 1]; 1683e78f53d1SNikolas Klauser if (__sm.matched) { 1684e78f53d1SNikolas Klauser ptrdiff_t __len = __sm.second - __sm.first; 1685e78f53d1SNikolas Klauser if (__s.__last_ - __s.__current_ >= __len && std::equal(__sm.first, __sm.second, __s.__current_)) { 1686e78f53d1SNikolas Klauser __s.__do_ = __state::__accept_but_not_consume; 1687e78f53d1SNikolas Klauser __s.__current_ += __len; 1688e78f53d1SNikolas Klauser __s.__node_ = this->first(); 1689e78f53d1SNikolas Klauser } else { 1690e78f53d1SNikolas Klauser __s.__do_ = __state::__reject; 1691e78f53d1SNikolas Klauser __s.__node_ = nullptr; 1692e78f53d1SNikolas Klauser } 1693e78f53d1SNikolas Klauser } else { 1694e78f53d1SNikolas Klauser __s.__do_ = __state::__reject; 1695e78f53d1SNikolas Klauser __s.__node_ = nullptr; 1696e78f53d1SNikolas Klauser } 1697e78f53d1SNikolas Klauser} 1698e78f53d1SNikolas Klauser 1699e78f53d1SNikolas Klauser// __back_ref_icase 1700e78f53d1SNikolas Klauser 1701e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 1702e78f53d1SNikolas Klauserclass __back_ref_icase : public __owns_one_state<_CharT> { 1703e78f53d1SNikolas Klauser typedef __owns_one_state<_CharT> base; 1704e78f53d1SNikolas Klauser 1705e78f53d1SNikolas Klauser _Traits __traits_; 1706e78f53d1SNikolas Klauser unsigned __mexp_; 1707e78f53d1SNikolas Klauser 1708e78f53d1SNikolas Klauserpublic: 1709e78f53d1SNikolas Klauser typedef std::__state<_CharT> __state; 1710e78f53d1SNikolas Klauser 1711e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI explicit __back_ref_icase(const _Traits& __traits, unsigned __mexp, __node<_CharT>* __s) 1712e78f53d1SNikolas Klauser : base(__s), __traits_(__traits), __mexp_(__mexp) {} 1713e78f53d1SNikolas Klauser 1714e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const; 1715e78f53d1SNikolas Klauser}; 1716e78f53d1SNikolas Klauser 1717e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 1718e78f53d1SNikolas Klauservoid __back_ref_icase<_CharT, _Traits>::__exec(__state& __s) const { 1719e78f53d1SNikolas Klauser sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_ - 1]; 1720e78f53d1SNikolas Klauser if (__sm.matched) { 1721e78f53d1SNikolas Klauser ptrdiff_t __len = __sm.second - __sm.first; 1722e78f53d1SNikolas Klauser if (__s.__last_ - __s.__current_ >= __len) { 1723e78f53d1SNikolas Klauser for (ptrdiff_t __i = 0; __i < __len; ++__i) { 1724e78f53d1SNikolas Klauser if (__traits_.translate_nocase(__sm.first[__i]) != __traits_.translate_nocase(__s.__current_[__i])) 1725e78f53d1SNikolas Klauser goto __not_equal; 1726e78f53d1SNikolas Klauser } 1727e78f53d1SNikolas Klauser __s.__do_ = __state::__accept_but_not_consume; 1728e78f53d1SNikolas Klauser __s.__current_ += __len; 1729e78f53d1SNikolas Klauser __s.__node_ = this->first(); 1730e78f53d1SNikolas Klauser } else { 1731e78f53d1SNikolas Klauser __s.__do_ = __state::__reject; 1732e78f53d1SNikolas Klauser __s.__node_ = nullptr; 1733e78f53d1SNikolas Klauser } 1734e78f53d1SNikolas Klauser } else { 1735e78f53d1SNikolas Klauser __not_equal: 1736e78f53d1SNikolas Klauser __s.__do_ = __state::__reject; 1737e78f53d1SNikolas Klauser __s.__node_ = nullptr; 1738e78f53d1SNikolas Klauser } 1739e78f53d1SNikolas Klauser} 1740e78f53d1SNikolas Klauser 1741e78f53d1SNikolas Klauser// __back_ref_collate 1742e78f53d1SNikolas Klauser 1743e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 1744e78f53d1SNikolas Klauserclass __back_ref_collate : public __owns_one_state<_CharT> { 1745e78f53d1SNikolas Klauser typedef __owns_one_state<_CharT> base; 1746e78f53d1SNikolas Klauser 1747e78f53d1SNikolas Klauser _Traits __traits_; 1748e78f53d1SNikolas Klauser unsigned __mexp_; 1749e78f53d1SNikolas Klauser 1750e78f53d1SNikolas Klauserpublic: 1751e78f53d1SNikolas Klauser typedef std::__state<_CharT> __state; 1752e78f53d1SNikolas Klauser 1753e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI explicit __back_ref_collate(const _Traits& __traits, unsigned __mexp, __node<_CharT>* __s) 1754e78f53d1SNikolas Klauser : base(__s), __traits_(__traits), __mexp_(__mexp) {} 1755e78f53d1SNikolas Klauser 1756e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const; 1757e78f53d1SNikolas Klauser}; 1758e78f53d1SNikolas Klauser 1759e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 1760e78f53d1SNikolas Klauservoid __back_ref_collate<_CharT, _Traits>::__exec(__state& __s) const { 1761e78f53d1SNikolas Klauser sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_ - 1]; 1762e78f53d1SNikolas Klauser if (__sm.matched) { 1763e78f53d1SNikolas Klauser ptrdiff_t __len = __sm.second - __sm.first; 1764e78f53d1SNikolas Klauser if (__s.__last_ - __s.__current_ >= __len) { 1765e78f53d1SNikolas Klauser for (ptrdiff_t __i = 0; __i < __len; ++__i) { 1766e78f53d1SNikolas Klauser if (__traits_.translate(__sm.first[__i]) != __traits_.translate(__s.__current_[__i])) 1767e78f53d1SNikolas Klauser goto __not_equal; 1768e78f53d1SNikolas Klauser } 1769e78f53d1SNikolas Klauser __s.__do_ = __state::__accept_but_not_consume; 1770e78f53d1SNikolas Klauser __s.__current_ += __len; 1771e78f53d1SNikolas Klauser __s.__node_ = this->first(); 1772e78f53d1SNikolas Klauser } else { 1773e78f53d1SNikolas Klauser __s.__do_ = __state::__reject; 1774e78f53d1SNikolas Klauser __s.__node_ = nullptr; 1775e78f53d1SNikolas Klauser } 1776e78f53d1SNikolas Klauser } else { 1777e78f53d1SNikolas Klauser __not_equal: 1778e78f53d1SNikolas Klauser __s.__do_ = __state::__reject; 1779e78f53d1SNikolas Klauser __s.__node_ = nullptr; 1780e78f53d1SNikolas Klauser } 1781e78f53d1SNikolas Klauser} 1782e78f53d1SNikolas Klauser 1783e78f53d1SNikolas Klauser// __word_boundary 1784e78f53d1SNikolas Klauser 1785e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 1786e78f53d1SNikolas Klauserclass __word_boundary : public __owns_one_state<_CharT> { 1787e78f53d1SNikolas Klauser typedef __owns_one_state<_CharT> base; 1788e78f53d1SNikolas Klauser 1789e78f53d1SNikolas Klauser _Traits __traits_; 1790e78f53d1SNikolas Klauser bool __invert_; 1791e78f53d1SNikolas Klauser 1792e78f53d1SNikolas Klauserpublic: 1793e78f53d1SNikolas Klauser typedef std::__state<_CharT> __state; 1794e78f53d1SNikolas Klauser 1795e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI explicit __word_boundary(const _Traits& __traits, bool __invert, __node<_CharT>* __s) 1796e78f53d1SNikolas Klauser : base(__s), __traits_(__traits), __invert_(__invert) {} 1797e78f53d1SNikolas Klauser 1798e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const; 1799e78f53d1SNikolas Klauser}; 1800e78f53d1SNikolas Klauser 1801e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 1802e78f53d1SNikolas Klauservoid __word_boundary<_CharT, _Traits>::__exec(__state& __s) const { 1803e78f53d1SNikolas Klauser bool __is_word_b = false; 1804e78f53d1SNikolas Klauser if (__s.__first_ != __s.__last_) { 1805e78f53d1SNikolas Klauser if (__s.__current_ == __s.__last_) { 1806e78f53d1SNikolas Klauser if (!(__s.__flags_ & regex_constants::match_not_eow)) { 1807e78f53d1SNikolas Klauser _CharT __c = __s.__current_[-1]; 1808e78f53d1SNikolas Klauser __is_word_b = __c == '_' || __traits_.isctype(__c, ctype_base::alnum); 1809e78f53d1SNikolas Klauser } 1810e78f53d1SNikolas Klauser } else if (__s.__current_ == __s.__first_ && !(__s.__flags_ & regex_constants::match_prev_avail)) { 1811e78f53d1SNikolas Klauser if (!(__s.__flags_ & regex_constants::match_not_bow)) { 1812e78f53d1SNikolas Klauser _CharT __c = *__s.__current_; 1813e78f53d1SNikolas Klauser __is_word_b = __c == '_' || __traits_.isctype(__c, ctype_base::alnum); 1814e78f53d1SNikolas Klauser } 1815e78f53d1SNikolas Klauser } else { 1816e78f53d1SNikolas Klauser _CharT __c1 = __s.__current_[-1]; 1817e78f53d1SNikolas Klauser _CharT __c2 = *__s.__current_; 1818e78f53d1SNikolas Klauser bool __is_c1_b = __c1 == '_' || __traits_.isctype(__c1, ctype_base::alnum); 1819e78f53d1SNikolas Klauser bool __is_c2_b = __c2 == '_' || __traits_.isctype(__c2, ctype_base::alnum); 1820e78f53d1SNikolas Klauser __is_word_b = __is_c1_b != __is_c2_b; 1821e78f53d1SNikolas Klauser } 1822e78f53d1SNikolas Klauser } 1823e78f53d1SNikolas Klauser if (__is_word_b != __invert_) { 1824e78f53d1SNikolas Klauser __s.__do_ = __state::__accept_but_not_consume; 1825e78f53d1SNikolas Klauser __s.__node_ = this->first(); 1826e78f53d1SNikolas Klauser } else { 1827e78f53d1SNikolas Klauser __s.__do_ = __state::__reject; 1828e78f53d1SNikolas Klauser __s.__node_ = nullptr; 1829e78f53d1SNikolas Klauser } 1830e78f53d1SNikolas Klauser} 1831e78f53d1SNikolas Klauser 1832e78f53d1SNikolas Klauser// __l_anchor 1833e78f53d1SNikolas Klauser 1834e78f53d1SNikolas Klausertemplate <class _CharT> 1835e78f53d1SNikolas Klauser_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool __is_eol(_CharT __c) { 1836e78f53d1SNikolas Klauser return __c == '\r' || __c == '\n'; 1837e78f53d1SNikolas Klauser} 1838e78f53d1SNikolas Klauser 1839e78f53d1SNikolas Klausertemplate <class _CharT> 1840e78f53d1SNikolas Klauserclass __l_anchor_multiline : public __owns_one_state<_CharT> { 1841e78f53d1SNikolas Klauser typedef __owns_one_state<_CharT> base; 1842e78f53d1SNikolas Klauser 1843e78f53d1SNikolas Klauser bool __multiline_; 1844e78f53d1SNikolas Klauser 1845e78f53d1SNikolas Klauserpublic: 1846e78f53d1SNikolas Klauser typedef std::__state<_CharT> __state; 1847e78f53d1SNikolas Klauser 1848e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI __l_anchor_multiline(bool __multiline, __node<_CharT>* __s) 1849e78f53d1SNikolas Klauser : base(__s), __multiline_(__multiline) {} 1850e78f53d1SNikolas Klauser 1851e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const; 1852e78f53d1SNikolas Klauser}; 1853e78f53d1SNikolas Klauser 1854e78f53d1SNikolas Klausertemplate <class _CharT> 1855e78f53d1SNikolas Klauservoid __l_anchor_multiline<_CharT>::__exec(__state& __s) const { 1856e78f53d1SNikolas Klauser if (__s.__at_first_ && __s.__current_ == __s.__first_ && !(__s.__flags_ & regex_constants::match_not_bol)) { 1857e78f53d1SNikolas Klauser __s.__do_ = __state::__accept_but_not_consume; 1858e78f53d1SNikolas Klauser __s.__node_ = this->first(); 1859e78f53d1SNikolas Klauser } else if (__multiline_ && !__s.__at_first_ && std::__is_eol(*std::prev(__s.__current_))) { 1860e78f53d1SNikolas Klauser __s.__do_ = __state::__accept_but_not_consume; 1861e78f53d1SNikolas Klauser __s.__node_ = this->first(); 1862e78f53d1SNikolas Klauser } else { 1863e78f53d1SNikolas Klauser __s.__do_ = __state::__reject; 1864e78f53d1SNikolas Klauser __s.__node_ = nullptr; 1865e78f53d1SNikolas Klauser } 1866e78f53d1SNikolas Klauser} 1867e78f53d1SNikolas Klauser 1868e78f53d1SNikolas Klauser// __r_anchor 1869e78f53d1SNikolas Klauser 1870e78f53d1SNikolas Klausertemplate <class _CharT> 1871e78f53d1SNikolas Klauserclass __r_anchor_multiline : public __owns_one_state<_CharT> { 1872e78f53d1SNikolas Klauser typedef __owns_one_state<_CharT> base; 1873e78f53d1SNikolas Klauser 1874e78f53d1SNikolas Klauser bool __multiline_; 1875e78f53d1SNikolas Klauser 1876e78f53d1SNikolas Klauserpublic: 1877e78f53d1SNikolas Klauser typedef std::__state<_CharT> __state; 1878e78f53d1SNikolas Klauser 1879e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI __r_anchor_multiline(bool __multiline, __node<_CharT>* __s) 1880e78f53d1SNikolas Klauser : base(__s), __multiline_(__multiline) {} 1881e78f53d1SNikolas Klauser 1882e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const; 1883e78f53d1SNikolas Klauser}; 1884e78f53d1SNikolas Klauser 1885e78f53d1SNikolas Klausertemplate <class _CharT> 1886e78f53d1SNikolas Klauservoid __r_anchor_multiline<_CharT>::__exec(__state& __s) const { 1887e78f53d1SNikolas Klauser if (__s.__current_ == __s.__last_ && !(__s.__flags_ & regex_constants::match_not_eol)) { 1888e78f53d1SNikolas Klauser __s.__do_ = __state::__accept_but_not_consume; 1889e78f53d1SNikolas Klauser __s.__node_ = this->first(); 1890e78f53d1SNikolas Klauser } else if (__multiline_ && std::__is_eol(*__s.__current_)) { 1891e78f53d1SNikolas Klauser __s.__do_ = __state::__accept_but_not_consume; 1892e78f53d1SNikolas Klauser __s.__node_ = this->first(); 1893e78f53d1SNikolas Klauser } else { 1894e78f53d1SNikolas Klauser __s.__do_ = __state::__reject; 1895e78f53d1SNikolas Klauser __s.__node_ = nullptr; 1896e78f53d1SNikolas Klauser } 1897e78f53d1SNikolas Klauser} 1898e78f53d1SNikolas Klauser 1899e78f53d1SNikolas Klauser// __match_any 1900e78f53d1SNikolas Klauser 1901e78f53d1SNikolas Klausertemplate <class _CharT> 1902e78f53d1SNikolas Klauserclass __match_any : public __owns_one_state<_CharT> { 1903e78f53d1SNikolas Klauser typedef __owns_one_state<_CharT> base; 1904e78f53d1SNikolas Klauser 1905e78f53d1SNikolas Klauserpublic: 1906e78f53d1SNikolas Klauser typedef std::__state<_CharT> __state; 1907e78f53d1SNikolas Klauser 1908e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI __match_any(__node<_CharT>* __s) : base(__s) {} 1909e78f53d1SNikolas Klauser 1910e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const; 1911e78f53d1SNikolas Klauser}; 1912e78f53d1SNikolas Klauser 1913e78f53d1SNikolas Klausertemplate <class _CharT> 1914e78f53d1SNikolas Klauservoid __match_any<_CharT>::__exec(__state& __s) const { 1915e78f53d1SNikolas Klauser if (__s.__current_ != __s.__last_ && *__s.__current_ != 0) { 1916e78f53d1SNikolas Klauser __s.__do_ = __state::__accept_and_consume; 1917e78f53d1SNikolas Klauser ++__s.__current_; 1918e78f53d1SNikolas Klauser __s.__node_ = this->first(); 1919e78f53d1SNikolas Klauser } else { 1920e78f53d1SNikolas Klauser __s.__do_ = __state::__reject; 1921e78f53d1SNikolas Klauser __s.__node_ = nullptr; 1922e78f53d1SNikolas Klauser } 1923e78f53d1SNikolas Klauser} 1924e78f53d1SNikolas Klauser 1925e78f53d1SNikolas Klauser// __match_any_but_newline 1926e78f53d1SNikolas Klauser 1927e78f53d1SNikolas Klausertemplate <class _CharT> 1928e78f53d1SNikolas Klauserclass __match_any_but_newline : public __owns_one_state<_CharT> { 1929e78f53d1SNikolas Klauser typedef __owns_one_state<_CharT> base; 1930e78f53d1SNikolas Klauser 1931e78f53d1SNikolas Klauserpublic: 1932e78f53d1SNikolas Klauser typedef std::__state<_CharT> __state; 1933e78f53d1SNikolas Klauser 1934e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI __match_any_but_newline(__node<_CharT>* __s) : base(__s) {} 1935e78f53d1SNikolas Klauser 1936e78f53d1SNikolas Klauser void __exec(__state&) const override; 1937e78f53d1SNikolas Klauser}; 1938e78f53d1SNikolas Klauser 1939e78f53d1SNikolas Klausertemplate <> 1940e78f53d1SNikolas Klauser_LIBCPP_EXPORTED_FROM_ABI void __match_any_but_newline<char>::__exec(__state&) const; 1941e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS 1942e78f53d1SNikolas Klausertemplate <> 1943e78f53d1SNikolas Klauser_LIBCPP_EXPORTED_FROM_ABI void __match_any_but_newline<wchar_t>::__exec(__state&) const; 1944e78f53d1SNikolas Klauser#endif 1945e78f53d1SNikolas Klauser 1946e78f53d1SNikolas Klauser// __match_char 1947e78f53d1SNikolas Klauser 1948e78f53d1SNikolas Klausertemplate <class _CharT> 1949e78f53d1SNikolas Klauserclass __match_char : public __owns_one_state<_CharT> { 1950e78f53d1SNikolas Klauser typedef __owns_one_state<_CharT> base; 1951e78f53d1SNikolas Klauser 1952e78f53d1SNikolas Klauser _CharT __c_; 1953e78f53d1SNikolas Klauser 1954e78f53d1SNikolas Klauserpublic: 1955e78f53d1SNikolas Klauser typedef std::__state<_CharT> __state; 1956e78f53d1SNikolas Klauser 1957e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI __match_char(_CharT __c, __node<_CharT>* __s) : base(__s), __c_(__c) {} 1958e78f53d1SNikolas Klauser 1959e78f53d1SNikolas Klauser __match_char(const __match_char&) = delete; 1960e78f53d1SNikolas Klauser __match_char& operator=(const __match_char&) = delete; 1961e78f53d1SNikolas Klauser 1962e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const; 1963e78f53d1SNikolas Klauser}; 1964e78f53d1SNikolas Klauser 1965e78f53d1SNikolas Klausertemplate <class _CharT> 1966e78f53d1SNikolas Klauservoid __match_char<_CharT>::__exec(__state& __s) const { 1967e78f53d1SNikolas Klauser if (__s.__current_ != __s.__last_ && *__s.__current_ == __c_) { 1968e78f53d1SNikolas Klauser __s.__do_ = __state::__accept_and_consume; 1969e78f53d1SNikolas Klauser ++__s.__current_; 1970e78f53d1SNikolas Klauser __s.__node_ = this->first(); 1971e78f53d1SNikolas Klauser } else { 1972e78f53d1SNikolas Klauser __s.__do_ = __state::__reject; 1973e78f53d1SNikolas Klauser __s.__node_ = nullptr; 1974e78f53d1SNikolas Klauser } 1975e78f53d1SNikolas Klauser} 1976e78f53d1SNikolas Klauser 1977e78f53d1SNikolas Klauser// __match_char_icase 1978e78f53d1SNikolas Klauser 1979e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 1980e78f53d1SNikolas Klauserclass __match_char_icase : public __owns_one_state<_CharT> { 1981e78f53d1SNikolas Klauser typedef __owns_one_state<_CharT> base; 1982e78f53d1SNikolas Klauser 1983e78f53d1SNikolas Klauser _Traits __traits_; 1984e78f53d1SNikolas Klauser _CharT __c_; 1985e78f53d1SNikolas Klauser 1986e78f53d1SNikolas Klauserpublic: 1987e78f53d1SNikolas Klauser typedef std::__state<_CharT> __state; 1988e78f53d1SNikolas Klauser 1989e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI __match_char_icase(const _Traits& __traits, _CharT __c, __node<_CharT>* __s) 1990e78f53d1SNikolas Klauser : base(__s), __traits_(__traits), __c_(__traits.translate_nocase(__c)) {} 1991e78f53d1SNikolas Klauser 1992e78f53d1SNikolas Klauser __match_char_icase(const __match_char_icase&) = delete; 1993e78f53d1SNikolas Klauser __match_char_icase& operator=(const __match_char_icase&) = delete; 1994e78f53d1SNikolas Klauser 1995e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const; 1996e78f53d1SNikolas Klauser}; 1997e78f53d1SNikolas Klauser 1998e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 1999e78f53d1SNikolas Klauservoid __match_char_icase<_CharT, _Traits>::__exec(__state& __s) const { 2000e78f53d1SNikolas Klauser if (__s.__current_ != __s.__last_ && __traits_.translate_nocase(*__s.__current_) == __c_) { 2001e78f53d1SNikolas Klauser __s.__do_ = __state::__accept_and_consume; 2002e78f53d1SNikolas Klauser ++__s.__current_; 2003e78f53d1SNikolas Klauser __s.__node_ = this->first(); 2004e78f53d1SNikolas Klauser } else { 2005e78f53d1SNikolas Klauser __s.__do_ = __state::__reject; 2006e78f53d1SNikolas Klauser __s.__node_ = nullptr; 2007e78f53d1SNikolas Klauser } 2008e78f53d1SNikolas Klauser} 2009e78f53d1SNikolas Klauser 2010e78f53d1SNikolas Klauser// __match_char_collate 2011e78f53d1SNikolas Klauser 2012e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 2013e78f53d1SNikolas Klauserclass __match_char_collate : public __owns_one_state<_CharT> { 2014e78f53d1SNikolas Klauser typedef __owns_one_state<_CharT> base; 2015e78f53d1SNikolas Klauser 2016e78f53d1SNikolas Klauser _Traits __traits_; 2017e78f53d1SNikolas Klauser _CharT __c_; 2018e78f53d1SNikolas Klauser 2019e78f53d1SNikolas Klauserpublic: 2020e78f53d1SNikolas Klauser typedef std::__state<_CharT> __state; 2021e78f53d1SNikolas Klauser 2022e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI __match_char_collate(const _Traits& __traits, _CharT __c, __node<_CharT>* __s) 2023e78f53d1SNikolas Klauser : base(__s), __traits_(__traits), __c_(__traits.translate(__c)) {} 2024e78f53d1SNikolas Klauser 2025e78f53d1SNikolas Klauser __match_char_collate(const __match_char_collate&) = delete; 2026e78f53d1SNikolas Klauser __match_char_collate& operator=(const __match_char_collate&) = delete; 2027e78f53d1SNikolas Klauser 2028e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const; 2029e78f53d1SNikolas Klauser}; 2030e78f53d1SNikolas Klauser 2031e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 2032e78f53d1SNikolas Klauservoid __match_char_collate<_CharT, _Traits>::__exec(__state& __s) const { 2033e78f53d1SNikolas Klauser if (__s.__current_ != __s.__last_ && __traits_.translate(*__s.__current_) == __c_) { 2034e78f53d1SNikolas Klauser __s.__do_ = __state::__accept_and_consume; 2035e78f53d1SNikolas Klauser ++__s.__current_; 2036e78f53d1SNikolas Klauser __s.__node_ = this->first(); 2037e78f53d1SNikolas Klauser } else { 2038e78f53d1SNikolas Klauser __s.__do_ = __state::__reject; 2039e78f53d1SNikolas Klauser __s.__node_ = nullptr; 2040e78f53d1SNikolas Klauser } 2041e78f53d1SNikolas Klauser} 2042e78f53d1SNikolas Klauser 2043e78f53d1SNikolas Klauser// __bracket_expression 2044e78f53d1SNikolas Klauser 2045e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 2046e78f53d1SNikolas Klauserclass __bracket_expression : public __owns_one_state<_CharT> { 2047e78f53d1SNikolas Klauser typedef __owns_one_state<_CharT> base; 2048e78f53d1SNikolas Klauser typedef typename _Traits::string_type string_type; 2049e78f53d1SNikolas Klauser 2050e78f53d1SNikolas Klauser _Traits __traits_; 2051e78f53d1SNikolas Klauser vector<_CharT> __chars_; 2052e78f53d1SNikolas Klauser vector<_CharT> __neg_chars_; 2053e78f53d1SNikolas Klauser vector<pair<string_type, string_type> > __ranges_; 2054e78f53d1SNikolas Klauser vector<pair<_CharT, _CharT> > __digraphs_; 2055e78f53d1SNikolas Klauser vector<string_type> __equivalences_; 2056e78f53d1SNikolas Klauser typename regex_traits<_CharT>::char_class_type __mask_; 2057e78f53d1SNikolas Klauser typename regex_traits<_CharT>::char_class_type __neg_mask_; 2058e78f53d1SNikolas Klauser bool __negate_; 2059e78f53d1SNikolas Klauser bool __icase_; 2060e78f53d1SNikolas Klauser bool __collate_; 2061e78f53d1SNikolas Klauser bool __might_have_digraph_; 2062e78f53d1SNikolas Klauser 2063e78f53d1SNikolas Klauserpublic: 2064e78f53d1SNikolas Klauser typedef std::__state<_CharT> __state; 2065e78f53d1SNikolas Klauser 2066e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI 2067e78f53d1SNikolas Klauser __bracket_expression(const _Traits& __traits, __node<_CharT>* __s, bool __negate, bool __icase, bool __collate) 2068e78f53d1SNikolas Klauser : base(__s), 2069e78f53d1SNikolas Klauser __traits_(__traits), 2070e78f53d1SNikolas Klauser __mask_(), 2071e78f53d1SNikolas Klauser __neg_mask_(), 2072e78f53d1SNikolas Klauser __negate_(__negate), 2073e78f53d1SNikolas Klauser __icase_(__icase), 2074e78f53d1SNikolas Klauser __collate_(__collate), 2075e78f53d1SNikolas Klauser __might_have_digraph_(__traits_.getloc().name() != "C") {} 2076e78f53d1SNikolas Klauser 2077e78f53d1SNikolas Klauser __bracket_expression(const __bracket_expression&) = delete; 2078e78f53d1SNikolas Klauser __bracket_expression& operator=(const __bracket_expression&) = delete; 2079e78f53d1SNikolas Klauser 2080e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const; 2081e78f53d1SNikolas Klauser 2082e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI bool __negated() const { return __negate_; } 2083e78f53d1SNikolas Klauser 2084e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI void __add_char(_CharT __c) { 2085e78f53d1SNikolas Klauser if (__icase_) 2086e78f53d1SNikolas Klauser __chars_.push_back(__traits_.translate_nocase(__c)); 2087e78f53d1SNikolas Klauser else if (__collate_) 2088e78f53d1SNikolas Klauser __chars_.push_back(__traits_.translate(__c)); 2089e78f53d1SNikolas Klauser else 2090e78f53d1SNikolas Klauser __chars_.push_back(__c); 2091e78f53d1SNikolas Klauser } 2092e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI void __add_neg_char(_CharT __c) { 2093e78f53d1SNikolas Klauser if (__icase_) 2094e78f53d1SNikolas Klauser __neg_chars_.push_back(__traits_.translate_nocase(__c)); 2095e78f53d1SNikolas Klauser else if (__collate_) 2096e78f53d1SNikolas Klauser __neg_chars_.push_back(__traits_.translate(__c)); 2097e78f53d1SNikolas Klauser else 2098e78f53d1SNikolas Klauser __neg_chars_.push_back(__c); 2099e78f53d1SNikolas Klauser } 2100e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI void __add_range(string_type __b, string_type __e) { 2101e78f53d1SNikolas Klauser if (__collate_) { 2102e78f53d1SNikolas Klauser if (__icase_) { 2103e78f53d1SNikolas Klauser for (size_t __i = 0; __i < __b.size(); ++__i) 2104e78f53d1SNikolas Klauser __b[__i] = __traits_.translate_nocase(__b[__i]); 2105e78f53d1SNikolas Klauser for (size_t __i = 0; __i < __e.size(); ++__i) 2106e78f53d1SNikolas Klauser __e[__i] = __traits_.translate_nocase(__e[__i]); 2107e78f53d1SNikolas Klauser } else { 2108e78f53d1SNikolas Klauser for (size_t __i = 0; __i < __b.size(); ++__i) 2109e78f53d1SNikolas Klauser __b[__i] = __traits_.translate(__b[__i]); 2110e78f53d1SNikolas Klauser for (size_t __i = 0; __i < __e.size(); ++__i) 2111e78f53d1SNikolas Klauser __e[__i] = __traits_.translate(__e[__i]); 2112e78f53d1SNikolas Klauser } 2113e78f53d1SNikolas Klauser __ranges_.push_back( 2114e78f53d1SNikolas Klauser std::make_pair(__traits_.transform(__b.begin(), __b.end()), __traits_.transform(__e.begin(), __e.end()))); 2115e78f53d1SNikolas Klauser } else { 2116e78f53d1SNikolas Klauser if (__b.size() != 1 || __e.size() != 1) 2117e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_range>(); 2118e78f53d1SNikolas Klauser if (__icase_) { 2119e78f53d1SNikolas Klauser __b[0] = __traits_.translate_nocase(__b[0]); 2120e78f53d1SNikolas Klauser __e[0] = __traits_.translate_nocase(__e[0]); 2121e78f53d1SNikolas Klauser } 2122e78f53d1SNikolas Klauser __ranges_.push_back(std::make_pair(std::move(__b), std::move(__e))); 2123e78f53d1SNikolas Klauser } 2124e78f53d1SNikolas Klauser } 2125e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI void __add_digraph(_CharT __c1, _CharT __c2) { 2126e78f53d1SNikolas Klauser if (__icase_) 2127e78f53d1SNikolas Klauser __digraphs_.push_back(std::make_pair(__traits_.translate_nocase(__c1), __traits_.translate_nocase(__c2))); 2128e78f53d1SNikolas Klauser else if (__collate_) 2129e78f53d1SNikolas Klauser __digraphs_.push_back(std::make_pair(__traits_.translate(__c1), __traits_.translate(__c2))); 2130e78f53d1SNikolas Klauser else 2131e78f53d1SNikolas Klauser __digraphs_.push_back(std::make_pair(__c1, __c2)); 2132e78f53d1SNikolas Klauser } 2133e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI void __add_equivalence(const string_type& __s) { __equivalences_.push_back(__s); } 2134e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI void __add_class(typename regex_traits<_CharT>::char_class_type __mask) { __mask_ |= __mask; } 2135e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI void __add_neg_class(typename regex_traits<_CharT>::char_class_type __mask) { 2136e78f53d1SNikolas Klauser __neg_mask_ |= __mask; 2137e78f53d1SNikolas Klauser } 2138e78f53d1SNikolas Klauser}; 2139e78f53d1SNikolas Klauser 2140e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 2141e78f53d1SNikolas Klauservoid __bracket_expression<_CharT, _Traits>::__exec(__state& __s) const { 2142e78f53d1SNikolas Klauser bool __found = false; 2143e78f53d1SNikolas Klauser unsigned __consumed = 0; 2144e78f53d1SNikolas Klauser if (__s.__current_ != __s.__last_) { 2145e78f53d1SNikolas Klauser ++__consumed; 2146e78f53d1SNikolas Klauser if (__might_have_digraph_) { 2147e78f53d1SNikolas Klauser const _CharT* __next = std::next(__s.__current_); 2148e78f53d1SNikolas Klauser if (__next != __s.__last_) { 2149e78f53d1SNikolas Klauser pair<_CharT, _CharT> __ch2(*__s.__current_, *__next); 2150e78f53d1SNikolas Klauser if (__icase_) { 2151e78f53d1SNikolas Klauser __ch2.first = __traits_.translate_nocase(__ch2.first); 2152e78f53d1SNikolas Klauser __ch2.second = __traits_.translate_nocase(__ch2.second); 2153e78f53d1SNikolas Klauser } else if (__collate_) { 2154e78f53d1SNikolas Klauser __ch2.first = __traits_.translate(__ch2.first); 2155e78f53d1SNikolas Klauser __ch2.second = __traits_.translate(__ch2.second); 2156e78f53d1SNikolas Klauser } 2157e78f53d1SNikolas Klauser if (!__traits_.lookup_collatename(&__ch2.first, &__ch2.first + 2).empty()) { 2158e78f53d1SNikolas Klauser // __ch2 is a digraph in this locale 2159e78f53d1SNikolas Klauser ++__consumed; 2160e78f53d1SNikolas Klauser for (size_t __i = 0; __i < __digraphs_.size(); ++__i) { 2161e78f53d1SNikolas Klauser if (__ch2 == __digraphs_[__i]) { 2162e78f53d1SNikolas Klauser __found = true; 2163e78f53d1SNikolas Klauser goto __exit; 2164e78f53d1SNikolas Klauser } 2165e78f53d1SNikolas Klauser } 2166e78f53d1SNikolas Klauser if (__collate_ && !__ranges_.empty()) { 2167e78f53d1SNikolas Klauser string_type __s2 = __traits_.transform(&__ch2.first, &__ch2.first + 2); 2168e78f53d1SNikolas Klauser for (size_t __i = 0; __i < __ranges_.size(); ++__i) { 2169e78f53d1SNikolas Klauser if (__ranges_[__i].first <= __s2 && __s2 <= __ranges_[__i].second) { 2170e78f53d1SNikolas Klauser __found = true; 2171e78f53d1SNikolas Klauser goto __exit; 2172e78f53d1SNikolas Klauser } 2173e78f53d1SNikolas Klauser } 2174e78f53d1SNikolas Klauser } 2175e78f53d1SNikolas Klauser if (!__equivalences_.empty()) { 2176e78f53d1SNikolas Klauser string_type __s2 = __traits_.transform_primary(&__ch2.first, &__ch2.first + 2); 2177e78f53d1SNikolas Klauser for (size_t __i = 0; __i < __equivalences_.size(); ++__i) { 2178e78f53d1SNikolas Klauser if (__s2 == __equivalences_[__i]) { 2179e78f53d1SNikolas Klauser __found = true; 2180e78f53d1SNikolas Klauser goto __exit; 2181e78f53d1SNikolas Klauser } 2182e78f53d1SNikolas Klauser } 2183e78f53d1SNikolas Klauser } 2184e78f53d1SNikolas Klauser if (__traits_.isctype(__ch2.first, __mask_) && __traits_.isctype(__ch2.second, __mask_)) { 2185e78f53d1SNikolas Klauser __found = true; 2186e78f53d1SNikolas Klauser goto __exit; 2187e78f53d1SNikolas Klauser } 2188e78f53d1SNikolas Klauser if (!__traits_.isctype(__ch2.first, __neg_mask_) && !__traits_.isctype(__ch2.second, __neg_mask_)) { 2189e78f53d1SNikolas Klauser __found = true; 2190e78f53d1SNikolas Klauser goto __exit; 2191e78f53d1SNikolas Klauser } 2192e78f53d1SNikolas Klauser goto __exit; 2193e78f53d1SNikolas Klauser } 2194e78f53d1SNikolas Klauser } 2195e78f53d1SNikolas Klauser } 2196e78f53d1SNikolas Klauser // test *__s.__current_ as not a digraph 2197e78f53d1SNikolas Klauser _CharT __ch = *__s.__current_; 2198e78f53d1SNikolas Klauser if (__icase_) 2199e78f53d1SNikolas Klauser __ch = __traits_.translate_nocase(__ch); 2200e78f53d1SNikolas Klauser else if (__collate_) 2201e78f53d1SNikolas Klauser __ch = __traits_.translate(__ch); 2202e78f53d1SNikolas Klauser for (size_t __i = 0; __i < __chars_.size(); ++__i) { 2203e78f53d1SNikolas Klauser if (__ch == __chars_[__i]) { 2204e78f53d1SNikolas Klauser __found = true; 2205e78f53d1SNikolas Klauser goto __exit; 2206e78f53d1SNikolas Klauser } 2207e78f53d1SNikolas Klauser } 2208e78f53d1SNikolas Klauser // When there's at least one of __neg_chars_ and __neg_mask_, the set 2209e78f53d1SNikolas Klauser // of "__found" chars is 2210e78f53d1SNikolas Klauser // union(complement(union(__neg_chars_, __neg_mask_)), 2211e78f53d1SNikolas Klauser // other cases...) 2212e78f53d1SNikolas Klauser // 2213e78f53d1SNikolas Klauser // It doesn't make sense to check this when there are no __neg_chars_ 2214e78f53d1SNikolas Klauser // and no __neg_mask_. 2215e78f53d1SNikolas Klauser if (!(__neg_mask_ == 0 && __neg_chars_.empty())) { 2216e78f53d1SNikolas Klauser const bool __in_neg_mask = __traits_.isctype(__ch, __neg_mask_); 2217e78f53d1SNikolas Klauser const bool __in_neg_chars = std::find(__neg_chars_.begin(), __neg_chars_.end(), __ch) != __neg_chars_.end(); 2218e78f53d1SNikolas Klauser if (!(__in_neg_mask || __in_neg_chars)) { 2219e78f53d1SNikolas Klauser __found = true; 2220e78f53d1SNikolas Klauser goto __exit; 2221e78f53d1SNikolas Klauser } 2222e78f53d1SNikolas Klauser } 2223e78f53d1SNikolas Klauser if (!__ranges_.empty()) { 2224e78f53d1SNikolas Klauser string_type __s2 = __collate_ ? __traits_.transform(&__ch, &__ch + 1) : string_type(1, __ch); 2225e78f53d1SNikolas Klauser for (size_t __i = 0; __i < __ranges_.size(); ++__i) { 2226e78f53d1SNikolas Klauser if (__ranges_[__i].first <= __s2 && __s2 <= __ranges_[__i].second) { 2227e78f53d1SNikolas Klauser __found = true; 2228e78f53d1SNikolas Klauser goto __exit; 2229e78f53d1SNikolas Klauser } 2230e78f53d1SNikolas Klauser } 2231e78f53d1SNikolas Klauser } 2232e78f53d1SNikolas Klauser if (!__equivalences_.empty()) { 2233e78f53d1SNikolas Klauser string_type __s2 = __traits_.transform_primary(&__ch, &__ch + 1); 2234e78f53d1SNikolas Klauser for (size_t __i = 0; __i < __equivalences_.size(); ++__i) { 2235e78f53d1SNikolas Klauser if (__s2 == __equivalences_[__i]) { 2236e78f53d1SNikolas Klauser __found = true; 2237e78f53d1SNikolas Klauser goto __exit; 2238e78f53d1SNikolas Klauser } 2239e78f53d1SNikolas Klauser } 2240e78f53d1SNikolas Klauser } 2241e78f53d1SNikolas Klauser if (__traits_.isctype(__ch, __mask_)) { 2242e78f53d1SNikolas Klauser __found = true; 2243e78f53d1SNikolas Klauser goto __exit; 2244e78f53d1SNikolas Klauser } 2245e78f53d1SNikolas Klauser } else 2246e78f53d1SNikolas Klauser __found = __negate_; // force reject 2247e78f53d1SNikolas Klauser__exit: 2248e78f53d1SNikolas Klauser if (__found != __negate_) { 2249e78f53d1SNikolas Klauser __s.__do_ = __state::__accept_and_consume; 2250e78f53d1SNikolas Klauser __s.__current_ += __consumed; 2251e78f53d1SNikolas Klauser __s.__node_ = this->first(); 2252e78f53d1SNikolas Klauser } else { 2253e78f53d1SNikolas Klauser __s.__do_ = __state::__reject; 2254e78f53d1SNikolas Klauser __s.__node_ = nullptr; 2255e78f53d1SNikolas Klauser } 2256e78f53d1SNikolas Klauser} 2257e78f53d1SNikolas Klauser 2258e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 2259e78f53d1SNikolas Klauserclass __lookahead; 2260e78f53d1SNikolas Klauser 2261e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits = regex_traits<_CharT> > 2262e78f53d1SNikolas Klauserclass _LIBCPP_TEMPLATE_VIS basic_regex; 2263e78f53d1SNikolas Klauser 2264e78f53d1SNikolas Klausertypedef basic_regex<char> regex; 2265e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS 2266e78f53d1SNikolas Klausertypedef basic_regex<wchar_t> wregex; 2267e78f53d1SNikolas Klauser#endif 2268e78f53d1SNikolas Klauser 2269e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 2270e78f53d1SNikolas Klauserclass _LIBCPP_TEMPLATE_VIS _LIBCPP_PREFERRED_NAME(regex) 2271e78f53d1SNikolas Klauser _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wregex)) basic_regex { 2272e78f53d1SNikolas Klauserpublic: 2273e78f53d1SNikolas Klauser // types: 2274e78f53d1SNikolas Klauser typedef _CharT value_type; 2275e78f53d1SNikolas Klauser typedef _Traits traits_type; 2276e78f53d1SNikolas Klauser typedef typename _Traits::string_type string_type; 2277e78f53d1SNikolas Klauser typedef regex_constants::syntax_option_type flag_type; 2278e78f53d1SNikolas Klauser typedef typename _Traits::locale_type locale_type; 2279e78f53d1SNikolas Klauser 2280e78f53d1SNikolas Klauserprivate: 2281e78f53d1SNikolas Klauser _Traits __traits_; 2282e78f53d1SNikolas Klauser flag_type __flags_; 2283e78f53d1SNikolas Klauser unsigned __marked_count_; 2284e78f53d1SNikolas Klauser unsigned __loop_count_; 2285e78f53d1SNikolas Klauser int __open_count_; 2286e78f53d1SNikolas Klauser shared_ptr<__empty_state<_CharT> > __start_; 2287e78f53d1SNikolas Klauser __owns_one_state<_CharT>* __end_; 2288e78f53d1SNikolas Klauser 2289e78f53d1SNikolas Klauser typedef std::__state<_CharT> __state; 2290e78f53d1SNikolas Klauser typedef std::__node<_CharT> __node; 2291e78f53d1SNikolas Klauser 2292e78f53d1SNikolas Klauserpublic: 2293e78f53d1SNikolas Klauser // constants: 2294e78f53d1SNikolas Klauser static const regex_constants::syntax_option_type icase = regex_constants::icase; 2295e78f53d1SNikolas Klauser static const regex_constants::syntax_option_type nosubs = regex_constants::nosubs; 2296e78f53d1SNikolas Klauser static const regex_constants::syntax_option_type optimize = regex_constants::optimize; 2297e78f53d1SNikolas Klauser static const regex_constants::syntax_option_type collate = regex_constants::collate; 2298e78f53d1SNikolas Klauser static const regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript; 2299e78f53d1SNikolas Klauser static const regex_constants::syntax_option_type basic = regex_constants::basic; 2300e78f53d1SNikolas Klauser static const regex_constants::syntax_option_type extended = regex_constants::extended; 2301e78f53d1SNikolas Klauser static const regex_constants::syntax_option_type awk = regex_constants::awk; 2302e78f53d1SNikolas Klauser static const regex_constants::syntax_option_type grep = regex_constants::grep; 2303e78f53d1SNikolas Klauser static const regex_constants::syntax_option_type egrep = regex_constants::egrep; 2304e78f53d1SNikolas Klauser static const regex_constants::syntax_option_type multiline = regex_constants::multiline; 2305e78f53d1SNikolas Klauser 2306e78f53d1SNikolas Klauser // construct/copy/destroy: 2307e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI basic_regex() 2308e78f53d1SNikolas Klauser : __flags_(regex_constants::ECMAScript), 2309e78f53d1SNikolas Klauser __marked_count_(0), 2310e78f53d1SNikolas Klauser __loop_count_(0), 2311e78f53d1SNikolas Klauser __open_count_(0), 2312e78f53d1SNikolas Klauser __end_(nullptr) {} 2313e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI explicit basic_regex(const value_type* __p, flag_type __f = regex_constants::ECMAScript) 2314e78f53d1SNikolas Klauser : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0), __end_(nullptr) { 2315e78f53d1SNikolas Klauser __init(__p, __p + __traits_.length(__p)); 2316e78f53d1SNikolas Klauser } 2317e78f53d1SNikolas Klauser 2318e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI basic_regex(const value_type* __p, size_t __len, flag_type __f = regex_constants::ECMAScript) 2319e78f53d1SNikolas Klauser : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0), __end_(nullptr) { 2320e78f53d1SNikolas Klauser __init(__p, __p + __len); 2321e78f53d1SNikolas Klauser } 2322e78f53d1SNikolas Klauser 2323e78f53d1SNikolas Klauser // basic_regex(const basic_regex&) = default; 2324e78f53d1SNikolas Klauser // basic_regex(basic_regex&&) = default; 2325e78f53d1SNikolas Klauser template <class _ST, class _SA> 2326e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI explicit basic_regex(const basic_string<value_type, _ST, _SA>& __p, 2327e78f53d1SNikolas Klauser flag_type __f = regex_constants::ECMAScript) 2328e78f53d1SNikolas Klauser : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0), __end_(nullptr) { 2329e78f53d1SNikolas Klauser __init(__p.begin(), __p.end()); 2330e78f53d1SNikolas Klauser } 2331e78f53d1SNikolas Klauser 2332e78f53d1SNikolas Klauser template <class _ForwardIterator> 2333e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI 2334e78f53d1SNikolas Klauser basic_regex(_ForwardIterator __first, _ForwardIterator __last, flag_type __f = regex_constants::ECMAScript) 2335e78f53d1SNikolas Klauser : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0), __end_(nullptr) { 2336e78f53d1SNikolas Klauser __init(__first, __last); 2337e78f53d1SNikolas Klauser } 2338e78f53d1SNikolas Klauser#ifndef _LIBCPP_CXX03_LANG 2339e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI basic_regex(initializer_list<value_type> __il, flag_type __f = regex_constants::ECMAScript) 2340e78f53d1SNikolas Klauser : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0), __end_(nullptr) { 2341e78f53d1SNikolas Klauser __init(__il.begin(), __il.end()); 2342e78f53d1SNikolas Klauser } 2343e78f53d1SNikolas Klauser#endif // _LIBCPP_CXX03_LANG 2344e78f53d1SNikolas Klauser 2345e78f53d1SNikolas Klauser // ~basic_regex() = default; 2346e78f53d1SNikolas Klauser 2347e78f53d1SNikolas Klauser // basic_regex& operator=(const basic_regex&) = default; 2348e78f53d1SNikolas Klauser // basic_regex& operator=(basic_regex&&) = default; 2349e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI basic_regex& operator=(const value_type* __p) { return assign(__p); } 2350e78f53d1SNikolas Klauser#ifndef _LIBCPP_CXX03_LANG 2351e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI basic_regex& operator=(initializer_list<value_type> __il) { return assign(__il); } 2352e78f53d1SNikolas Klauser#endif // _LIBCPP_CXX03_LANG 2353e78f53d1SNikolas Klauser template <class _ST, class _SA> 2354e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI basic_regex& operator=(const basic_string<value_type, _ST, _SA>& __p) { 2355e78f53d1SNikolas Klauser return assign(__p); 2356e78f53d1SNikolas Klauser } 2357e78f53d1SNikolas Klauser 2358e78f53d1SNikolas Klauser // assign: 2359e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI basic_regex& assign(const basic_regex& __that) { return *this = __that; } 2360e78f53d1SNikolas Klauser#ifndef _LIBCPP_CXX03_LANG 2361e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI basic_regex& assign(basic_regex&& __that) _NOEXCEPT { return *this = std::move(__that); } 2362e78f53d1SNikolas Klauser#endif 2363e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI basic_regex& assign(const value_type* __p, flag_type __f = regex_constants::ECMAScript) { 2364e78f53d1SNikolas Klauser return assign(__p, __p + __traits_.length(__p), __f); 2365e78f53d1SNikolas Klauser } 2366e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI basic_regex& 2367e78f53d1SNikolas Klauser assign(const value_type* __p, size_t __len, flag_type __f = regex_constants::ECMAScript) { 2368e78f53d1SNikolas Klauser return assign(__p, __p + __len, __f); 2369e78f53d1SNikolas Klauser } 2370e78f53d1SNikolas Klauser template <class _ST, class _SA> 2371e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI basic_regex& 2372e78f53d1SNikolas Klauser assign(const basic_string<value_type, _ST, _SA>& __s, flag_type __f = regex_constants::ECMAScript) { 2373e78f53d1SNikolas Klauser return assign(__s.begin(), __s.end(), __f); 2374e78f53d1SNikolas Klauser } 2375e78f53d1SNikolas Klauser 2376e78f53d1SNikolas Klauser template <class _InputIterator, __enable_if_t<__has_exactly_input_iterator_category<_InputIterator>::value, int> = 0> 2377e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI basic_regex& 2378e78f53d1SNikolas Klauser assign(_InputIterator __first, _InputIterator __last, flag_type __f = regex_constants::ECMAScript) { 2379e78f53d1SNikolas Klauser basic_string<_CharT> __t(__first, __last); 2380e78f53d1SNikolas Klauser return assign(__t.begin(), __t.end(), __f); 2381e78f53d1SNikolas Klauser } 2382e78f53d1SNikolas Klauser 2383e78f53d1SNikolas Klauserprivate: 2384e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI void __member_init(flag_type __f) { 2385e78f53d1SNikolas Klauser __flags_ = __f; 2386e78f53d1SNikolas Klauser __marked_count_ = 0; 2387e78f53d1SNikolas Klauser __loop_count_ = 0; 2388e78f53d1SNikolas Klauser __open_count_ = 0; 2389e78f53d1SNikolas Klauser __end_ = nullptr; 2390e78f53d1SNikolas Klauser } 2391e78f53d1SNikolas Klauser 2392e78f53d1SNikolas Klauserpublic: 2393e78f53d1SNikolas Klauser template <class _ForwardIterator, __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value, int> = 0> 2394e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI basic_regex& 2395e78f53d1SNikolas Klauser assign(_ForwardIterator __first, _ForwardIterator __last, flag_type __f = regex_constants::ECMAScript) { 2396e78f53d1SNikolas Klauser return assign(basic_regex(__first, __last, __f)); 2397e78f53d1SNikolas Klauser } 2398e78f53d1SNikolas Klauser 2399e78f53d1SNikolas Klauser#ifndef _LIBCPP_CXX03_LANG 2400e78f53d1SNikolas Klauser 2401e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI basic_regex& 2402e78f53d1SNikolas Klauser assign(initializer_list<value_type> __il, flag_type __f = regex_constants::ECMAScript) { 2403e78f53d1SNikolas Klauser return assign(__il.begin(), __il.end(), __f); 2404e78f53d1SNikolas Klauser } 2405e78f53d1SNikolas Klauser 2406e78f53d1SNikolas Klauser#endif // _LIBCPP_CXX03_LANG 2407e78f53d1SNikolas Klauser 2408e78f53d1SNikolas Klauser // const operations: 2409e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI unsigned mark_count() const { return __marked_count_; } 2410e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI flag_type flags() const { return __flags_; } 2411e78f53d1SNikolas Klauser 2412e78f53d1SNikolas Klauser // locale: 2413e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI locale_type imbue(locale_type __loc) { 2414e78f53d1SNikolas Klauser __member_init(ECMAScript); 2415e78f53d1SNikolas Klauser __start_.reset(); 2416e78f53d1SNikolas Klauser return __traits_.imbue(__loc); 2417e78f53d1SNikolas Klauser } 2418e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI locale_type getloc() const { return __traits_.getloc(); } 2419e78f53d1SNikolas Klauser 2420e78f53d1SNikolas Klauser // swap: 2421e78f53d1SNikolas Klauser void swap(basic_regex& __r); 2422e78f53d1SNikolas Klauser 2423e78f53d1SNikolas Klauserprivate: 2424e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI unsigned __loop_count() const { return __loop_count_; } 2425e78f53d1SNikolas Klauser 2426e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI bool __use_multiline() const { 2427e78f53d1SNikolas Klauser return __get_grammar(__flags_) == ECMAScript && (__flags_ & multiline); 2428e78f53d1SNikolas Klauser } 2429e78f53d1SNikolas Klauser 2430e78f53d1SNikolas Klauser template <class _ForwardIterator> 2431e78f53d1SNikolas Klauser void __init(_ForwardIterator __first, _ForwardIterator __last); 2432e78f53d1SNikolas Klauser template <class _ForwardIterator> 2433e78f53d1SNikolas Klauser _ForwardIterator __parse(_ForwardIterator __first, _ForwardIterator __last); 2434e78f53d1SNikolas Klauser template <class _ForwardIterator> 2435e78f53d1SNikolas Klauser _ForwardIterator __parse_basic_reg_exp(_ForwardIterator __first, _ForwardIterator __last); 2436e78f53d1SNikolas Klauser template <class _ForwardIterator> 2437e78f53d1SNikolas Klauser _ForwardIterator __parse_RE_expression(_ForwardIterator __first, _ForwardIterator __last); 2438e78f53d1SNikolas Klauser template <class _ForwardIterator> 2439e78f53d1SNikolas Klauser _ForwardIterator __parse_simple_RE(_ForwardIterator __first, _ForwardIterator __last); 2440e78f53d1SNikolas Klauser template <class _ForwardIterator> 2441e78f53d1SNikolas Klauser _ForwardIterator __parse_nondupl_RE(_ForwardIterator __first, _ForwardIterator __last); 2442e78f53d1SNikolas Klauser template <class _ForwardIterator> 2443e78f53d1SNikolas Klauser _ForwardIterator __parse_one_char_or_coll_elem_RE(_ForwardIterator __first, _ForwardIterator __last); 2444e78f53d1SNikolas Klauser template <class _ForwardIterator> 2445e78f53d1SNikolas Klauser _ForwardIterator __parse_Back_open_paren(_ForwardIterator __first, _ForwardIterator __last); 2446e78f53d1SNikolas Klauser template <class _ForwardIterator> 2447e78f53d1SNikolas Klauser _ForwardIterator __parse_Back_close_paren(_ForwardIterator __first, _ForwardIterator __last); 2448e78f53d1SNikolas Klauser template <class _ForwardIterator> 2449e78f53d1SNikolas Klauser _ForwardIterator __parse_Back_open_brace(_ForwardIterator __first, _ForwardIterator __last); 2450e78f53d1SNikolas Klauser template <class _ForwardIterator> 2451e78f53d1SNikolas Klauser _ForwardIterator __parse_Back_close_brace(_ForwardIterator __first, _ForwardIterator __last); 2452e78f53d1SNikolas Klauser template <class _ForwardIterator> 2453e78f53d1SNikolas Klauser _ForwardIterator __parse_BACKREF(_ForwardIterator __first, _ForwardIterator __last); 2454e78f53d1SNikolas Klauser template <class _ForwardIterator> 2455e78f53d1SNikolas Klauser _ForwardIterator __parse_ORD_CHAR(_ForwardIterator __first, _ForwardIterator __last); 2456e78f53d1SNikolas Klauser template <class _ForwardIterator> 2457e78f53d1SNikolas Klauser _ForwardIterator __parse_QUOTED_CHAR(_ForwardIterator __first, _ForwardIterator __last); 2458e78f53d1SNikolas Klauser template <class _ForwardIterator> 2459e78f53d1SNikolas Klauser _ForwardIterator __parse_RE_dupl_symbol( 2460e78f53d1SNikolas Klauser _ForwardIterator __first, 2461e78f53d1SNikolas Klauser _ForwardIterator __last, 2462e78f53d1SNikolas Klauser __owns_one_state<_CharT>* __s, 2463e78f53d1SNikolas Klauser unsigned __mexp_begin, 2464e78f53d1SNikolas Klauser unsigned __mexp_end); 2465e78f53d1SNikolas Klauser template <class _ForwardIterator> 2466e78f53d1SNikolas Klauser _ForwardIterator __parse_ERE_dupl_symbol( 2467e78f53d1SNikolas Klauser _ForwardIterator __first, 2468e78f53d1SNikolas Klauser _ForwardIterator __last, 2469e78f53d1SNikolas Klauser __owns_one_state<_CharT>* __s, 2470e78f53d1SNikolas Klauser unsigned __mexp_begin, 2471e78f53d1SNikolas Klauser unsigned __mexp_end); 2472e78f53d1SNikolas Klauser template <class _ForwardIterator> 2473e78f53d1SNikolas Klauser _ForwardIterator __parse_bracket_expression(_ForwardIterator __first, _ForwardIterator __last); 2474e78f53d1SNikolas Klauser template <class _ForwardIterator> 2475e78f53d1SNikolas Klauser _ForwardIterator 2476e78f53d1SNikolas Klauser __parse_follow_list(_ForwardIterator __first, _ForwardIterator __last, __bracket_expression<_CharT, _Traits>* __ml); 2477e78f53d1SNikolas Klauser template <class _ForwardIterator> 2478e78f53d1SNikolas Klauser _ForwardIterator __parse_expression_term( 2479e78f53d1SNikolas Klauser _ForwardIterator __first, _ForwardIterator __last, __bracket_expression<_CharT, _Traits>* __ml); 2480e78f53d1SNikolas Klauser template <class _ForwardIterator> 2481e78f53d1SNikolas Klauser _ForwardIterator __parse_equivalence_class( 2482e78f53d1SNikolas Klauser _ForwardIterator __first, _ForwardIterator __last, __bracket_expression<_CharT, _Traits>* __ml); 2483e78f53d1SNikolas Klauser template <class _ForwardIterator> 2484e78f53d1SNikolas Klauser _ForwardIterator __parse_character_class( 2485e78f53d1SNikolas Klauser _ForwardIterator __first, _ForwardIterator __last, __bracket_expression<_CharT, _Traits>* __ml); 2486e78f53d1SNikolas Klauser template <class _ForwardIterator> 2487e78f53d1SNikolas Klauser _ForwardIterator 2488e78f53d1SNikolas Klauser __parse_collating_symbol(_ForwardIterator __first, _ForwardIterator __last, basic_string<_CharT>& __col_sym); 2489e78f53d1SNikolas Klauser template <class _ForwardIterator> 2490e78f53d1SNikolas Klauser _ForwardIterator __parse_DUP_COUNT(_ForwardIterator __first, _ForwardIterator __last, int& __c); 2491e78f53d1SNikolas Klauser template <class _ForwardIterator> 2492e78f53d1SNikolas Klauser _ForwardIterator __parse_extended_reg_exp(_ForwardIterator __first, _ForwardIterator __last); 2493e78f53d1SNikolas Klauser template <class _ForwardIterator> 2494e78f53d1SNikolas Klauser _ForwardIterator __parse_ERE_branch(_ForwardIterator __first, _ForwardIterator __last); 2495e78f53d1SNikolas Klauser template <class _ForwardIterator> 2496e78f53d1SNikolas Klauser _ForwardIterator __parse_ERE_expression(_ForwardIterator __first, _ForwardIterator __last); 2497e78f53d1SNikolas Klauser template <class _ForwardIterator> 2498e78f53d1SNikolas Klauser _ForwardIterator __parse_one_char_or_coll_elem_ERE(_ForwardIterator __first, _ForwardIterator __last); 2499e78f53d1SNikolas Klauser template <class _ForwardIterator> 2500e78f53d1SNikolas Klauser _ForwardIterator __parse_ORD_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last); 2501e78f53d1SNikolas Klauser template <class _ForwardIterator> 2502e78f53d1SNikolas Klauser _ForwardIterator __parse_QUOTED_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last); 2503e78f53d1SNikolas Klauser template <class _ForwardIterator> 2504e78f53d1SNikolas Klauser _ForwardIterator __parse_ecma_exp(_ForwardIterator __first, _ForwardIterator __last); 2505e78f53d1SNikolas Klauser template <class _ForwardIterator> 2506e78f53d1SNikolas Klauser _ForwardIterator __parse_alternative(_ForwardIterator __first, _ForwardIterator __last); 2507e78f53d1SNikolas Klauser template <class _ForwardIterator> 2508e78f53d1SNikolas Klauser _ForwardIterator __parse_term(_ForwardIterator __first, _ForwardIterator __last); 2509e78f53d1SNikolas Klauser template <class _ForwardIterator> 2510e78f53d1SNikolas Klauser _ForwardIterator __parse_assertion(_ForwardIterator __first, _ForwardIterator __last); 2511e78f53d1SNikolas Klauser template <class _ForwardIterator> 2512e78f53d1SNikolas Klauser _ForwardIterator __parse_atom(_ForwardIterator __first, _ForwardIterator __last); 2513e78f53d1SNikolas Klauser template <class _ForwardIterator> 2514e78f53d1SNikolas Klauser _ForwardIterator __parse_atom_escape(_ForwardIterator __first, _ForwardIterator __last); 2515e78f53d1SNikolas Klauser template <class _ForwardIterator> 2516e78f53d1SNikolas Klauser _ForwardIterator __parse_decimal_escape(_ForwardIterator __first, _ForwardIterator __last); 2517e78f53d1SNikolas Klauser template <class _ForwardIterator> 2518e78f53d1SNikolas Klauser _ForwardIterator __parse_character_class_escape(_ForwardIterator __first, _ForwardIterator __last); 2519e78f53d1SNikolas Klauser template <class _ForwardIterator> 2520e78f53d1SNikolas Klauser _ForwardIterator 2521e78f53d1SNikolas Klauser __parse_character_escape(_ForwardIterator __first, _ForwardIterator __last, basic_string<_CharT>* __str = nullptr); 2522e78f53d1SNikolas Klauser template <class _ForwardIterator> 2523e78f53d1SNikolas Klauser _ForwardIterator __parse_pattern_character(_ForwardIterator __first, _ForwardIterator __last); 2524e78f53d1SNikolas Klauser template <class _ForwardIterator> 2525e78f53d1SNikolas Klauser _ForwardIterator __parse_grep(_ForwardIterator __first, _ForwardIterator __last); 2526e78f53d1SNikolas Klauser template <class _ForwardIterator> 2527e78f53d1SNikolas Klauser _ForwardIterator __parse_egrep(_ForwardIterator __first, _ForwardIterator __last); 2528e78f53d1SNikolas Klauser template <class _ForwardIterator> 2529e78f53d1SNikolas Klauser _ForwardIterator __parse_class_escape( 2530e78f53d1SNikolas Klauser _ForwardIterator __first, 2531e78f53d1SNikolas Klauser _ForwardIterator __last, 2532e78f53d1SNikolas Klauser basic_string<_CharT>& __str, 2533e78f53d1SNikolas Klauser __bracket_expression<_CharT, _Traits>* __ml); 2534e78f53d1SNikolas Klauser template <class _ForwardIterator> 2535e78f53d1SNikolas Klauser _ForwardIterator 2536e78f53d1SNikolas Klauser __parse_awk_escape(_ForwardIterator __first, _ForwardIterator __last, basic_string<_CharT>* __str = nullptr); 2537e78f53d1SNikolas Klauser 2538e78f53d1SNikolas Klauser bool __test_back_ref(_CharT); 2539e78f53d1SNikolas Klauser 2540e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI void __push_l_anchor(); 2541e78f53d1SNikolas Klauser void __push_r_anchor(); 2542e78f53d1SNikolas Klauser void __push_match_any(); 2543e78f53d1SNikolas Klauser void __push_match_any_but_newline(); 2544e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI void __push_greedy_inf_repeat( 2545e78f53d1SNikolas Klauser size_t __min, __owns_one_state<_CharT>* __s, unsigned __mexp_begin = 0, unsigned __mexp_end = 0) { 2546e78f53d1SNikolas Klauser __push_loop(__min, numeric_limits<size_t>::max(), __s, __mexp_begin, __mexp_end); 2547e78f53d1SNikolas Klauser } 2548e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI void __push_nongreedy_inf_repeat( 2549e78f53d1SNikolas Klauser size_t __min, __owns_one_state<_CharT>* __s, unsigned __mexp_begin = 0, unsigned __mexp_end = 0) { 2550e78f53d1SNikolas Klauser __push_loop(__min, numeric_limits<size_t>::max(), __s, __mexp_begin, __mexp_end, false); 2551e78f53d1SNikolas Klauser } 2552e78f53d1SNikolas Klauser void __push_loop(size_t __min, 2553e78f53d1SNikolas Klauser size_t __max, 2554e78f53d1SNikolas Klauser __owns_one_state<_CharT>* __s, 2555e78f53d1SNikolas Klauser size_t __mexp_begin = 0, 2556e78f53d1SNikolas Klauser size_t __mexp_end = 0, 2557e78f53d1SNikolas Klauser bool __greedy = true); 2558e78f53d1SNikolas Klauser __bracket_expression<_CharT, _Traits>* __start_matching_list(bool __negate); 2559e78f53d1SNikolas Klauser void __push_char(value_type __c); 2560e78f53d1SNikolas Klauser void __push_back_ref(int __i); 2561e78f53d1SNikolas Klauser void __push_alternation(__owns_one_state<_CharT>* __sa, __owns_one_state<_CharT>* __sb); 2562e78f53d1SNikolas Klauser void __push_begin_marked_subexpression(); 2563e78f53d1SNikolas Klauser void __push_end_marked_subexpression(unsigned); 2564e78f53d1SNikolas Klauser void __push_empty(); 2565e78f53d1SNikolas Klauser void __push_word_boundary(bool); 2566e78f53d1SNikolas Klauser void __push_lookahead(const basic_regex&, bool, unsigned); 2567e78f53d1SNikolas Klauser 2568e78f53d1SNikolas Klauser template <class _Allocator> 2569e78f53d1SNikolas Klauser bool __search(const _CharT* __first, 2570e78f53d1SNikolas Klauser const _CharT* __last, 2571e78f53d1SNikolas Klauser match_results<const _CharT*, _Allocator>& __m, 2572e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags) const; 2573e78f53d1SNikolas Klauser 2574e78f53d1SNikolas Klauser template <class _Allocator> 2575e78f53d1SNikolas Klauser bool __match_at_start(const _CharT* __first, 2576e78f53d1SNikolas Klauser const _CharT* __last, 2577e78f53d1SNikolas Klauser match_results<const _CharT*, _Allocator>& __m, 2578e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags, 2579e78f53d1SNikolas Klauser bool) const; 2580e78f53d1SNikolas Klauser template <class _Allocator> 2581e78f53d1SNikolas Klauser bool __match_at_start_ecma( 2582e78f53d1SNikolas Klauser const _CharT* __first, 2583e78f53d1SNikolas Klauser const _CharT* __last, 2584e78f53d1SNikolas Klauser match_results<const _CharT*, _Allocator>& __m, 2585e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags, 2586e78f53d1SNikolas Klauser bool) const; 2587e78f53d1SNikolas Klauser template <class _Allocator> 2588e78f53d1SNikolas Klauser bool __match_at_start_posix_nosubs( 2589e78f53d1SNikolas Klauser const _CharT* __first, 2590e78f53d1SNikolas Klauser const _CharT* __last, 2591e78f53d1SNikolas Klauser match_results<const _CharT*, _Allocator>& __m, 2592e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags, 2593e78f53d1SNikolas Klauser bool) const; 2594e78f53d1SNikolas Klauser template <class _Allocator> 2595e78f53d1SNikolas Klauser bool __match_at_start_posix_subs( 2596e78f53d1SNikolas Klauser const _CharT* __first, 2597e78f53d1SNikolas Klauser const _CharT* __last, 2598e78f53d1SNikolas Klauser match_results<const _CharT*, _Allocator>& __m, 2599e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags, 2600e78f53d1SNikolas Klauser bool) const; 2601e78f53d1SNikolas Klauser 2602e78f53d1SNikolas Klauser template <class _Bp, class _Ap, class _Cp, class _Tp> 2603e78f53d1SNikolas Klauser friend bool 2604e78f53d1SNikolas Klauser regex_search(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type); 2605e78f53d1SNikolas Klauser 2606e78f53d1SNikolas Klauser template <class _Ap, class _Cp, class _Tp> 2607e78f53d1SNikolas Klauser friend bool 2608e78f53d1SNikolas Klauser regex_search(const _Cp*, 2609e78f53d1SNikolas Klauser const _Cp*, 2610e78f53d1SNikolas Klauser match_results<const _Cp*, _Ap>&, 2611e78f53d1SNikolas Klauser const basic_regex<_Cp, _Tp>&, 2612e78f53d1SNikolas Klauser regex_constants::match_flag_type); 2613e78f53d1SNikolas Klauser 2614e78f53d1SNikolas Klauser template <class _Bp, class _Cp, class _Tp> 2615e78f53d1SNikolas Klauser friend bool regex_search(_Bp, _Bp, const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type); 2616e78f53d1SNikolas Klauser 2617e78f53d1SNikolas Klauser template <class _Cp, class _Tp> 2618e78f53d1SNikolas Klauser friend bool regex_search(const _Cp*, const _Cp*, const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type); 2619e78f53d1SNikolas Klauser 2620e78f53d1SNikolas Klauser template <class _Cp, class _Ap, class _Tp> 2621e78f53d1SNikolas Klauser friend bool regex_search( 2622e78f53d1SNikolas Klauser const _Cp*, match_results<const _Cp*, _Ap>&, const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type); 2623e78f53d1SNikolas Klauser 2624e78f53d1SNikolas Klauser template <class _ST, class _SA, class _Cp, class _Tp> 2625e78f53d1SNikolas Klauser friend bool regex_search(const basic_string<_Cp, _ST, _SA>& __s, 2626e78f53d1SNikolas Klauser const basic_regex<_Cp, _Tp>& __e, 2627e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags); 2628e78f53d1SNikolas Klauser 2629e78f53d1SNikolas Klauser template <class _ST, class _SA, class _Ap, class _Cp, class _Tp> 2630e78f53d1SNikolas Klauser friend bool regex_search(const basic_string<_Cp, _ST, _SA>& __s, 2631e78f53d1SNikolas Klauser match_results<typename basic_string<_Cp, _ST, _SA>::const_iterator, _Ap>&, 2632e78f53d1SNikolas Klauser const basic_regex<_Cp, _Tp>& __e, 2633e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags); 2634e78f53d1SNikolas Klauser 2635e78f53d1SNikolas Klauser template <class _Iter, class _Ap, class _Cp, class _Tp> 2636e78f53d1SNikolas Klauser friend bool 2637e78f53d1SNikolas Klauser regex_search(__wrap_iter<_Iter> __first, 2638e78f53d1SNikolas Klauser __wrap_iter<_Iter> __last, 2639e78f53d1SNikolas Klauser match_results<__wrap_iter<_Iter>, _Ap>& __m, 2640e78f53d1SNikolas Klauser const basic_regex<_Cp, _Tp>& __e, 2641e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags); 2642e78f53d1SNikolas Klauser 2643e78f53d1SNikolas Klauser template <class, class> 2644e78f53d1SNikolas Klauser friend class __lookahead; 2645e78f53d1SNikolas Klauser}; 2646e78f53d1SNikolas Klauser 2647e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 17 2648e78f53d1SNikolas Klausertemplate <class _ForwardIterator, __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value, int> = 0> 2649e78f53d1SNikolas Klauserbasic_regex(_ForwardIterator, _ForwardIterator, regex_constants::syntax_option_type = regex_constants::ECMAScript) 2650e78f53d1SNikolas Klauser -> basic_regex<typename iterator_traits<_ForwardIterator>::value_type>; 2651e78f53d1SNikolas Klauser#endif 2652e78f53d1SNikolas Klauser 2653e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 2654e78f53d1SNikolas Klauserconst regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::icase; 2655e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 2656e78f53d1SNikolas Klauserconst regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::nosubs; 2657e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 2658e78f53d1SNikolas Klauserconst regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::optimize; 2659e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 2660e78f53d1SNikolas Klauserconst regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::collate; 2661e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 2662e78f53d1SNikolas Klauserconst regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::ECMAScript; 2663e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 2664e78f53d1SNikolas Klauserconst regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::basic; 2665e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 2666e78f53d1SNikolas Klauserconst regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::extended; 2667e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 2668e78f53d1SNikolas Klauserconst regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::awk; 2669e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 2670e78f53d1SNikolas Klauserconst regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::grep; 2671e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 2672e78f53d1SNikolas Klauserconst regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::egrep; 2673e78f53d1SNikolas Klauser 2674e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 2675e78f53d1SNikolas Klauservoid basic_regex<_CharT, _Traits>::swap(basic_regex& __r) { 2676e78f53d1SNikolas Klauser using std::swap; 2677e78f53d1SNikolas Klauser swap(__traits_, __r.__traits_); 2678e78f53d1SNikolas Klauser swap(__flags_, __r.__flags_); 2679e78f53d1SNikolas Klauser swap(__marked_count_, __r.__marked_count_); 2680e78f53d1SNikolas Klauser swap(__loop_count_, __r.__loop_count_); 2681e78f53d1SNikolas Klauser swap(__open_count_, __r.__open_count_); 2682e78f53d1SNikolas Klauser swap(__start_, __r.__start_); 2683e78f53d1SNikolas Klauser swap(__end_, __r.__end_); 2684e78f53d1SNikolas Klauser} 2685e78f53d1SNikolas Klauser 2686e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 2687e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI void swap(basic_regex<_CharT, _Traits>& __x, basic_regex<_CharT, _Traits>& __y) { 2688e78f53d1SNikolas Klauser return __x.swap(__y); 2689e78f53d1SNikolas Klauser} 2690e78f53d1SNikolas Klauser 2691e78f53d1SNikolas Klauser// __lookahead 2692e78f53d1SNikolas Klauser 2693e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 2694e78f53d1SNikolas Klauserclass __lookahead : public __owns_one_state<_CharT> { 2695e78f53d1SNikolas Klauser typedef __owns_one_state<_CharT> base; 2696e78f53d1SNikolas Klauser 2697e78f53d1SNikolas Klauser basic_regex<_CharT, _Traits> __exp_; 2698e78f53d1SNikolas Klauser unsigned __mexp_; 2699e78f53d1SNikolas Klauser bool __invert_; 2700e78f53d1SNikolas Klauser 2701e78f53d1SNikolas Klauserpublic: 2702e78f53d1SNikolas Klauser typedef std::__state<_CharT> __state; 2703e78f53d1SNikolas Klauser 2704e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI 2705e78f53d1SNikolas Klauser __lookahead(const basic_regex<_CharT, _Traits>& __exp, bool __invert, __node<_CharT>* __s, unsigned __mexp) 2706e78f53d1SNikolas Klauser : base(__s), __exp_(__exp), __mexp_(__mexp), __invert_(__invert) {} 2707e78f53d1SNikolas Klauser 2708e78f53d1SNikolas Klauser __lookahead(const __lookahead&) = delete; 2709e78f53d1SNikolas Klauser __lookahead& operator=(const __lookahead&) = delete; 2710e78f53d1SNikolas Klauser 2711e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const; 2712e78f53d1SNikolas Klauser}; 2713e78f53d1SNikolas Klauser 2714e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 2715e78f53d1SNikolas Klauservoid __lookahead<_CharT, _Traits>::__exec(__state& __s) const { 2716e78f53d1SNikolas Klauser match_results<const _CharT*> __m; 2717e78f53d1SNikolas Klauser __m.__init(1 + __exp_.mark_count(), __s.__current_, __s.__last_); 2718e78f53d1SNikolas Klauser bool __matched = __exp_.__match_at_start_ecma( 2719e78f53d1SNikolas Klauser __s.__current_, 2720e78f53d1SNikolas Klauser __s.__last_, 2721e78f53d1SNikolas Klauser __m, 2722e78f53d1SNikolas Klauser (__s.__flags_ | regex_constants::match_continuous) & ~regex_constants::__full_match, 2723e78f53d1SNikolas Klauser __s.__at_first_ && __s.__current_ == __s.__first_); 2724e78f53d1SNikolas Klauser if (__matched != __invert_) { 2725e78f53d1SNikolas Klauser __s.__do_ = __state::__accept_but_not_consume; 2726e78f53d1SNikolas Klauser __s.__node_ = this->first(); 2727e78f53d1SNikolas Klauser for (unsigned __i = 1; __i < __m.size(); ++__i) { 2728e78f53d1SNikolas Klauser __s.__sub_matches_[__mexp_ + __i - 1] = __m.__matches_[__i]; 2729e78f53d1SNikolas Klauser } 2730e78f53d1SNikolas Klauser } else { 2731e78f53d1SNikolas Klauser __s.__do_ = __state::__reject; 2732e78f53d1SNikolas Klauser __s.__node_ = nullptr; 2733e78f53d1SNikolas Klauser } 2734e78f53d1SNikolas Klauser} 2735e78f53d1SNikolas Klauser 2736e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 2737e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 2738e78f53d1SNikolas Klauservoid basic_regex<_CharT, _Traits>::__init(_ForwardIterator __first, _ForwardIterator __last) { 2739e78f53d1SNikolas Klauser if (__get_grammar(__flags_) == 0) 2740e78f53d1SNikolas Klauser __flags_ |= regex_constants::ECMAScript; 2741e78f53d1SNikolas Klauser _ForwardIterator __temp = __parse(__first, __last); 2742e78f53d1SNikolas Klauser if (__temp != __last) 2743e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::__re_err_parse>(); 2744e78f53d1SNikolas Klauser} 2745e78f53d1SNikolas Klauser 2746e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 2747e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 2748e78f53d1SNikolas Klauser_ForwardIterator basic_regex<_CharT, _Traits>::__parse(_ForwardIterator __first, _ForwardIterator __last) { 2749e78f53d1SNikolas Klauser { 2750e78f53d1SNikolas Klauser unique_ptr<__node> __h(new __end_state<_CharT>); 2751e78f53d1SNikolas Klauser __start_.reset(new __empty_state<_CharT>(__h.get())); 2752e78f53d1SNikolas Klauser __h.release(); 2753e78f53d1SNikolas Klauser __end_ = __start_.get(); 2754e78f53d1SNikolas Klauser } 2755e78f53d1SNikolas Klauser switch (__get_grammar(__flags_)) { 2756e78f53d1SNikolas Klauser case ECMAScript: 2757e78f53d1SNikolas Klauser __first = __parse_ecma_exp(__first, __last); 2758e78f53d1SNikolas Klauser break; 2759e78f53d1SNikolas Klauser case basic: 2760e78f53d1SNikolas Klauser __first = __parse_basic_reg_exp(__first, __last); 2761e78f53d1SNikolas Klauser break; 2762e78f53d1SNikolas Klauser case extended: 2763e78f53d1SNikolas Klauser case awk: 2764e78f53d1SNikolas Klauser __first = __parse_extended_reg_exp(__first, __last); 2765e78f53d1SNikolas Klauser break; 2766e78f53d1SNikolas Klauser case grep: 2767e78f53d1SNikolas Klauser __first = __parse_grep(__first, __last); 2768e78f53d1SNikolas Klauser break; 2769e78f53d1SNikolas Klauser case egrep: 2770e78f53d1SNikolas Klauser __first = __parse_egrep(__first, __last); 2771e78f53d1SNikolas Klauser break; 2772e78f53d1SNikolas Klauser default: 2773e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::__re_err_grammar>(); 2774e78f53d1SNikolas Klauser } 2775e78f53d1SNikolas Klauser return __first; 2776e78f53d1SNikolas Klauser} 2777e78f53d1SNikolas Klauser 2778e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 2779e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 2780e78f53d1SNikolas Klauser_ForwardIterator 2781e78f53d1SNikolas Klauserbasic_regex<_CharT, _Traits>::__parse_basic_reg_exp(_ForwardIterator __first, _ForwardIterator __last) { 2782e78f53d1SNikolas Klauser if (__first != __last) { 2783e78f53d1SNikolas Klauser if (*__first == '^') { 2784e78f53d1SNikolas Klauser __push_l_anchor(); 2785e78f53d1SNikolas Klauser ++__first; 2786e78f53d1SNikolas Klauser } 2787e78f53d1SNikolas Klauser if (__first != __last) { 2788e78f53d1SNikolas Klauser __first = __parse_RE_expression(__first, __last); 2789e78f53d1SNikolas Klauser if (__first != __last) { 2790e78f53d1SNikolas Klauser _ForwardIterator __temp = std::next(__first); 2791e78f53d1SNikolas Klauser if (__temp == __last && *__first == '$') { 2792e78f53d1SNikolas Klauser __push_r_anchor(); 2793e78f53d1SNikolas Klauser ++__first; 2794e78f53d1SNikolas Klauser } 2795e78f53d1SNikolas Klauser } 2796e78f53d1SNikolas Klauser } 2797e78f53d1SNikolas Klauser if (__first != __last) 2798e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::__re_err_empty>(); 2799e78f53d1SNikolas Klauser } 2800e78f53d1SNikolas Klauser return __first; 2801e78f53d1SNikolas Klauser} 2802e78f53d1SNikolas Klauser 2803e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 2804e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 2805e78f53d1SNikolas Klauser_ForwardIterator 2806e78f53d1SNikolas Klauserbasic_regex<_CharT, _Traits>::__parse_extended_reg_exp(_ForwardIterator __first, _ForwardIterator __last) { 2807e78f53d1SNikolas Klauser __owns_one_state<_CharT>* __sa = __end_; 2808e78f53d1SNikolas Klauser _ForwardIterator __temp = __parse_ERE_branch(__first, __last); 2809e78f53d1SNikolas Klauser if (__temp == __first) 2810e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::__re_err_empty>(); 2811e78f53d1SNikolas Klauser __first = __temp; 2812e78f53d1SNikolas Klauser while (__first != __last && *__first == '|') { 2813e78f53d1SNikolas Klauser __owns_one_state<_CharT>* __sb = __end_; 2814e78f53d1SNikolas Klauser __temp = __parse_ERE_branch(++__first, __last); 2815e78f53d1SNikolas Klauser if (__temp == __first) 2816e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::__re_err_empty>(); 2817e78f53d1SNikolas Klauser __push_alternation(__sa, __sb); 2818e78f53d1SNikolas Klauser __first = __temp; 2819e78f53d1SNikolas Klauser } 2820e78f53d1SNikolas Klauser return __first; 2821e78f53d1SNikolas Klauser} 2822e78f53d1SNikolas Klauser 2823e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 2824e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 2825e78f53d1SNikolas Klauser_ForwardIterator basic_regex<_CharT, _Traits>::__parse_ERE_branch(_ForwardIterator __first, _ForwardIterator __last) { 2826e78f53d1SNikolas Klauser _ForwardIterator __temp = __parse_ERE_expression(__first, __last); 2827e78f53d1SNikolas Klauser if (__temp == __first) 2828e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::__re_err_empty>(); 2829e78f53d1SNikolas Klauser do { 2830e78f53d1SNikolas Klauser __first = __temp; 2831e78f53d1SNikolas Klauser __temp = __parse_ERE_expression(__first, __last); 2832e78f53d1SNikolas Klauser } while (__temp != __first); 2833e78f53d1SNikolas Klauser return __first; 2834e78f53d1SNikolas Klauser} 2835e78f53d1SNikolas Klauser 2836e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 2837e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 2838e78f53d1SNikolas Klauser_ForwardIterator 2839e78f53d1SNikolas Klauserbasic_regex<_CharT, _Traits>::__parse_ERE_expression(_ForwardIterator __first, _ForwardIterator __last) { 2840e78f53d1SNikolas Klauser __owns_one_state<_CharT>* __e = __end_; 2841e78f53d1SNikolas Klauser unsigned __mexp_begin = __marked_count_; 2842e78f53d1SNikolas Klauser _ForwardIterator __temp = __parse_one_char_or_coll_elem_ERE(__first, __last); 2843e78f53d1SNikolas Klauser if (__temp == __first && __temp != __last) { 2844e78f53d1SNikolas Klauser switch (*__temp) { 2845e78f53d1SNikolas Klauser case '^': 2846e78f53d1SNikolas Klauser __push_l_anchor(); 2847e78f53d1SNikolas Klauser ++__temp; 2848e78f53d1SNikolas Klauser break; 2849e78f53d1SNikolas Klauser case '$': 2850e78f53d1SNikolas Klauser __push_r_anchor(); 2851e78f53d1SNikolas Klauser ++__temp; 2852e78f53d1SNikolas Klauser break; 2853e78f53d1SNikolas Klauser case '(': 2854e78f53d1SNikolas Klauser __push_begin_marked_subexpression(); 2855e78f53d1SNikolas Klauser unsigned __temp_count = __marked_count_; 2856e78f53d1SNikolas Klauser ++__open_count_; 2857e78f53d1SNikolas Klauser __temp = __parse_extended_reg_exp(++__temp, __last); 2858e78f53d1SNikolas Klauser if (__temp == __last || *__temp != ')') 2859e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_paren>(); 2860e78f53d1SNikolas Klauser __push_end_marked_subexpression(__temp_count); 2861e78f53d1SNikolas Klauser --__open_count_; 2862e78f53d1SNikolas Klauser ++__temp; 2863e78f53d1SNikolas Klauser break; 2864e78f53d1SNikolas Klauser } 2865e78f53d1SNikolas Klauser } 2866e78f53d1SNikolas Klauser if (__temp != __first) 2867e78f53d1SNikolas Klauser __temp = __parse_ERE_dupl_symbol(__temp, __last, __e, __mexp_begin + 1, __marked_count_ + 1); 2868e78f53d1SNikolas Klauser __first = __temp; 2869e78f53d1SNikolas Klauser return __first; 2870e78f53d1SNikolas Klauser} 2871e78f53d1SNikolas Klauser 2872e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 2873e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 2874e78f53d1SNikolas Klauser_ForwardIterator 2875e78f53d1SNikolas Klauserbasic_regex<_CharT, _Traits>::__parse_RE_expression(_ForwardIterator __first, _ForwardIterator __last) { 2876e78f53d1SNikolas Klauser while (true) { 2877e78f53d1SNikolas Klauser _ForwardIterator __temp = __parse_simple_RE(__first, __last); 2878e78f53d1SNikolas Klauser if (__temp == __first) 2879e78f53d1SNikolas Klauser break; 2880e78f53d1SNikolas Klauser __first = __temp; 2881e78f53d1SNikolas Klauser } 2882e78f53d1SNikolas Klauser return __first; 2883e78f53d1SNikolas Klauser} 2884e78f53d1SNikolas Klauser 2885e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 2886e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 2887e78f53d1SNikolas Klauser_ForwardIterator basic_regex<_CharT, _Traits>::__parse_simple_RE(_ForwardIterator __first, _ForwardIterator __last) { 2888e78f53d1SNikolas Klauser if (__first != __last) { 2889e78f53d1SNikolas Klauser __owns_one_state<_CharT>* __e = __end_; 2890e78f53d1SNikolas Klauser unsigned __mexp_begin = __marked_count_; 2891e78f53d1SNikolas Klauser _ForwardIterator __temp = __parse_nondupl_RE(__first, __last); 2892e78f53d1SNikolas Klauser if (__temp != __first) 2893e78f53d1SNikolas Klauser __first = __parse_RE_dupl_symbol(__temp, __last, __e, __mexp_begin + 1, __marked_count_ + 1); 2894e78f53d1SNikolas Klauser } 2895e78f53d1SNikolas Klauser return __first; 2896e78f53d1SNikolas Klauser} 2897e78f53d1SNikolas Klauser 2898e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 2899e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 2900e78f53d1SNikolas Klauser_ForwardIterator basic_regex<_CharT, _Traits>::__parse_nondupl_RE(_ForwardIterator __first, _ForwardIterator __last) { 2901e78f53d1SNikolas Klauser _ForwardIterator __temp = __first; 2902e78f53d1SNikolas Klauser __first = __parse_one_char_or_coll_elem_RE(__first, __last); 2903e78f53d1SNikolas Klauser if (__temp == __first) { 2904e78f53d1SNikolas Klauser __temp = __parse_Back_open_paren(__first, __last); 2905e78f53d1SNikolas Klauser if (__temp != __first) { 2906e78f53d1SNikolas Klauser __push_begin_marked_subexpression(); 2907e78f53d1SNikolas Klauser unsigned __temp_count = __marked_count_; 2908e78f53d1SNikolas Klauser __first = __parse_RE_expression(__temp, __last); 2909e78f53d1SNikolas Klauser __temp = __parse_Back_close_paren(__first, __last); 2910e78f53d1SNikolas Klauser if (__temp == __first) 2911e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_paren>(); 2912e78f53d1SNikolas Klauser __push_end_marked_subexpression(__temp_count); 2913e78f53d1SNikolas Klauser __first = __temp; 2914e78f53d1SNikolas Klauser } else 2915e78f53d1SNikolas Klauser __first = __parse_BACKREF(__first, __last); 2916e78f53d1SNikolas Klauser } 2917e78f53d1SNikolas Klauser return __first; 2918e78f53d1SNikolas Klauser} 2919e78f53d1SNikolas Klauser 2920e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 2921e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 2922e78f53d1SNikolas Klauser_ForwardIterator 2923e78f53d1SNikolas Klauserbasic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_RE(_ForwardIterator __first, _ForwardIterator __last) { 2924e78f53d1SNikolas Klauser _ForwardIterator __temp = __parse_ORD_CHAR(__first, __last); 2925e78f53d1SNikolas Klauser if (__temp == __first) { 2926e78f53d1SNikolas Klauser __temp = __parse_QUOTED_CHAR(__first, __last); 2927e78f53d1SNikolas Klauser if (__temp == __first) { 2928e78f53d1SNikolas Klauser if (__temp != __last && *__temp == '.') { 2929e78f53d1SNikolas Klauser __push_match_any(); 2930e78f53d1SNikolas Klauser ++__temp; 2931e78f53d1SNikolas Klauser } else 2932e78f53d1SNikolas Klauser __temp = __parse_bracket_expression(__first, __last); 2933e78f53d1SNikolas Klauser } 2934e78f53d1SNikolas Klauser } 2935e78f53d1SNikolas Klauser __first = __temp; 2936e78f53d1SNikolas Klauser return __first; 2937e78f53d1SNikolas Klauser} 2938e78f53d1SNikolas Klauser 2939e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 2940e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 2941e78f53d1SNikolas Klauser_ForwardIterator 2942e78f53d1SNikolas Klauserbasic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_ERE(_ForwardIterator __first, _ForwardIterator __last) { 2943e78f53d1SNikolas Klauser _ForwardIterator __temp = __parse_ORD_CHAR_ERE(__first, __last); 2944e78f53d1SNikolas Klauser if (__temp == __first) { 2945e78f53d1SNikolas Klauser __temp = __parse_QUOTED_CHAR_ERE(__first, __last); 2946e78f53d1SNikolas Klauser if (__temp == __first) { 2947e78f53d1SNikolas Klauser if (__temp != __last && *__temp == '.') { 2948e78f53d1SNikolas Klauser __push_match_any(); 2949e78f53d1SNikolas Klauser ++__temp; 2950e78f53d1SNikolas Klauser } else 2951e78f53d1SNikolas Klauser __temp = __parse_bracket_expression(__first, __last); 2952e78f53d1SNikolas Klauser } 2953e78f53d1SNikolas Klauser } 2954e78f53d1SNikolas Klauser __first = __temp; 2955e78f53d1SNikolas Klauser return __first; 2956e78f53d1SNikolas Klauser} 2957e78f53d1SNikolas Klauser 2958e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 2959e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 2960e78f53d1SNikolas Klauser_ForwardIterator 2961e78f53d1SNikolas Klauserbasic_regex<_CharT, _Traits>::__parse_Back_open_paren(_ForwardIterator __first, _ForwardIterator __last) { 2962e78f53d1SNikolas Klauser if (__first != __last) { 2963e78f53d1SNikolas Klauser _ForwardIterator __temp = std::next(__first); 2964e78f53d1SNikolas Klauser if (__temp != __last) { 2965e78f53d1SNikolas Klauser if (*__first == '\\' && *__temp == '(') 2966e78f53d1SNikolas Klauser __first = ++__temp; 2967e78f53d1SNikolas Klauser } 2968e78f53d1SNikolas Klauser } 2969e78f53d1SNikolas Klauser return __first; 2970e78f53d1SNikolas Klauser} 2971e78f53d1SNikolas Klauser 2972e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 2973e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 2974e78f53d1SNikolas Klauser_ForwardIterator 2975e78f53d1SNikolas Klauserbasic_regex<_CharT, _Traits>::__parse_Back_close_paren(_ForwardIterator __first, _ForwardIterator __last) { 2976e78f53d1SNikolas Klauser if (__first != __last) { 2977e78f53d1SNikolas Klauser _ForwardIterator __temp = std::next(__first); 2978e78f53d1SNikolas Klauser if (__temp != __last) { 2979e78f53d1SNikolas Klauser if (*__first == '\\' && *__temp == ')') 2980e78f53d1SNikolas Klauser __first = ++__temp; 2981e78f53d1SNikolas Klauser } 2982e78f53d1SNikolas Klauser } 2983e78f53d1SNikolas Klauser return __first; 2984e78f53d1SNikolas Klauser} 2985e78f53d1SNikolas Klauser 2986e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 2987e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 2988e78f53d1SNikolas Klauser_ForwardIterator 2989e78f53d1SNikolas Klauserbasic_regex<_CharT, _Traits>::__parse_Back_open_brace(_ForwardIterator __first, _ForwardIterator __last) { 2990e78f53d1SNikolas Klauser if (__first != __last) { 2991e78f53d1SNikolas Klauser _ForwardIterator __temp = std::next(__first); 2992e78f53d1SNikolas Klauser if (__temp != __last) { 2993e78f53d1SNikolas Klauser if (*__first == '\\' && *__temp == '{') 2994e78f53d1SNikolas Klauser __first = ++__temp; 2995e78f53d1SNikolas Klauser } 2996e78f53d1SNikolas Klauser } 2997e78f53d1SNikolas Klauser return __first; 2998e78f53d1SNikolas Klauser} 2999e78f53d1SNikolas Klauser 3000e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 3001e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 3002e78f53d1SNikolas Klauser_ForwardIterator 3003e78f53d1SNikolas Klauserbasic_regex<_CharT, _Traits>::__parse_Back_close_brace(_ForwardIterator __first, _ForwardIterator __last) { 3004e78f53d1SNikolas Klauser if (__first != __last) { 3005e78f53d1SNikolas Klauser _ForwardIterator __temp = std::next(__first); 3006e78f53d1SNikolas Klauser if (__temp != __last) { 3007e78f53d1SNikolas Klauser if (*__first == '\\' && *__temp == '}') 3008e78f53d1SNikolas Klauser __first = ++__temp; 3009e78f53d1SNikolas Klauser } 3010e78f53d1SNikolas Klauser } 3011e78f53d1SNikolas Klauser return __first; 3012e78f53d1SNikolas Klauser} 3013e78f53d1SNikolas Klauser 3014e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 3015e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 3016e78f53d1SNikolas Klauser_ForwardIterator basic_regex<_CharT, _Traits>::__parse_BACKREF(_ForwardIterator __first, _ForwardIterator __last) { 3017e78f53d1SNikolas Klauser if (__first != __last) { 3018e78f53d1SNikolas Klauser _ForwardIterator __temp = std::next(__first); 3019e78f53d1SNikolas Klauser if (__temp != __last && *__first == '\\' && __test_back_ref(*__temp)) 3020e78f53d1SNikolas Klauser __first = ++__temp; 3021e78f53d1SNikolas Klauser } 3022e78f53d1SNikolas Klauser return __first; 3023e78f53d1SNikolas Klauser} 3024e78f53d1SNikolas Klauser 3025e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 3026e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 3027e78f53d1SNikolas Klauser_ForwardIterator basic_regex<_CharT, _Traits>::__parse_ORD_CHAR(_ForwardIterator __first, _ForwardIterator __last) { 3028e78f53d1SNikolas Klauser if (__first != __last) { 3029e78f53d1SNikolas Klauser _ForwardIterator __temp = std::next(__first); 3030e78f53d1SNikolas Klauser if (__temp == __last && *__first == '$') 3031e78f53d1SNikolas Klauser return __first; 3032e78f53d1SNikolas Klauser // Not called inside a bracket 3033e78f53d1SNikolas Klauser if (*__first == '.' || *__first == '\\' || *__first == '[') 3034e78f53d1SNikolas Klauser return __first; 3035e78f53d1SNikolas Klauser __push_char(*__first); 3036e78f53d1SNikolas Klauser ++__first; 3037e78f53d1SNikolas Klauser } 3038e78f53d1SNikolas Klauser return __first; 3039e78f53d1SNikolas Klauser} 3040e78f53d1SNikolas Klauser 3041e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 3042e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 3043e78f53d1SNikolas Klauser_ForwardIterator basic_regex<_CharT, _Traits>::__parse_ORD_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last) { 3044e78f53d1SNikolas Klauser if (__first != __last) { 3045e78f53d1SNikolas Klauser switch (*__first) { 3046e78f53d1SNikolas Klauser case '^': 3047e78f53d1SNikolas Klauser case '.': 3048e78f53d1SNikolas Klauser case '[': 3049e78f53d1SNikolas Klauser case '$': 3050e78f53d1SNikolas Klauser case '(': 3051e78f53d1SNikolas Klauser case '|': 3052e78f53d1SNikolas Klauser case '*': 3053e78f53d1SNikolas Klauser case '+': 3054e78f53d1SNikolas Klauser case '?': 3055e78f53d1SNikolas Klauser case '{': 3056e78f53d1SNikolas Klauser case '\\': 3057e78f53d1SNikolas Klauser break; 3058e78f53d1SNikolas Klauser case ')': 3059e78f53d1SNikolas Klauser if (__open_count_ == 0) { 3060e78f53d1SNikolas Klauser __push_char(*__first); 3061e78f53d1SNikolas Klauser ++__first; 3062e78f53d1SNikolas Klauser } 3063e78f53d1SNikolas Klauser break; 3064e78f53d1SNikolas Klauser default: 3065e78f53d1SNikolas Klauser __push_char(*__first); 3066e78f53d1SNikolas Klauser ++__first; 3067e78f53d1SNikolas Klauser break; 3068e78f53d1SNikolas Klauser } 3069e78f53d1SNikolas Klauser } 3070e78f53d1SNikolas Klauser return __first; 3071e78f53d1SNikolas Klauser} 3072e78f53d1SNikolas Klauser 3073e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 3074e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 3075e78f53d1SNikolas Klauser_ForwardIterator basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR(_ForwardIterator __first, _ForwardIterator __last) { 3076e78f53d1SNikolas Klauser if (__first != __last) { 3077e78f53d1SNikolas Klauser _ForwardIterator __temp = std::next(__first); 3078e78f53d1SNikolas Klauser if (__temp != __last) { 3079e78f53d1SNikolas Klauser if (*__first == '\\') { 3080e78f53d1SNikolas Klauser switch (*__temp) { 3081e78f53d1SNikolas Klauser case '^': 3082e78f53d1SNikolas Klauser case '.': 3083e78f53d1SNikolas Klauser case '*': 3084e78f53d1SNikolas Klauser case '[': 3085e78f53d1SNikolas Klauser case '$': 3086e78f53d1SNikolas Klauser case '\\': 3087e78f53d1SNikolas Klauser __push_char(*__temp); 3088e78f53d1SNikolas Klauser __first = ++__temp; 3089e78f53d1SNikolas Klauser break; 3090e78f53d1SNikolas Klauser } 3091e78f53d1SNikolas Klauser } 3092e78f53d1SNikolas Klauser } 3093e78f53d1SNikolas Klauser } 3094e78f53d1SNikolas Klauser return __first; 3095e78f53d1SNikolas Klauser} 3096e78f53d1SNikolas Klauser 3097e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 3098e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 3099e78f53d1SNikolas Klauser_ForwardIterator 3100e78f53d1SNikolas Klauserbasic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last) { 3101e78f53d1SNikolas Klauser if (__first != __last) { 3102e78f53d1SNikolas Klauser _ForwardIterator __temp = std::next(__first); 3103e78f53d1SNikolas Klauser if (__temp != __last) { 3104e78f53d1SNikolas Klauser if (*__first == '\\') { 3105e78f53d1SNikolas Klauser switch (*__temp) { 3106e78f53d1SNikolas Klauser case '^': 3107e78f53d1SNikolas Klauser case '.': 3108e78f53d1SNikolas Klauser case '*': 3109e78f53d1SNikolas Klauser case '[': 3110e78f53d1SNikolas Klauser case '$': 3111e78f53d1SNikolas Klauser case '\\': 3112e78f53d1SNikolas Klauser case '(': 3113e78f53d1SNikolas Klauser case ')': 3114e78f53d1SNikolas Klauser case '|': 3115e78f53d1SNikolas Klauser case '+': 3116e78f53d1SNikolas Klauser case '?': 3117e78f53d1SNikolas Klauser case '{': 3118e78f53d1SNikolas Klauser case '}': 3119e78f53d1SNikolas Klauser __push_char(*__temp); 3120e78f53d1SNikolas Klauser __first = ++__temp; 3121e78f53d1SNikolas Klauser break; 3122e78f53d1SNikolas Klauser default: 3123e78f53d1SNikolas Klauser if (__get_grammar(__flags_) == awk) 3124e78f53d1SNikolas Klauser __first = __parse_awk_escape(++__first, __last); 3125e78f53d1SNikolas Klauser else if (__test_back_ref(*__temp)) 3126e78f53d1SNikolas Klauser __first = ++__temp; 3127e78f53d1SNikolas Klauser break; 3128e78f53d1SNikolas Klauser } 3129e78f53d1SNikolas Klauser } 3130e78f53d1SNikolas Klauser } 3131e78f53d1SNikolas Klauser } 3132e78f53d1SNikolas Klauser return __first; 3133e78f53d1SNikolas Klauser} 3134e78f53d1SNikolas Klauser 3135e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 3136e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 3137e78f53d1SNikolas Klauser_ForwardIterator basic_regex<_CharT, _Traits>::__parse_RE_dupl_symbol( 3138e78f53d1SNikolas Klauser _ForwardIterator __first, 3139e78f53d1SNikolas Klauser _ForwardIterator __last, 3140e78f53d1SNikolas Klauser __owns_one_state<_CharT>* __s, 3141e78f53d1SNikolas Klauser unsigned __mexp_begin, 3142e78f53d1SNikolas Klauser unsigned __mexp_end) { 3143e78f53d1SNikolas Klauser if (__first != __last) { 3144e78f53d1SNikolas Klauser if (*__first == '*') { 3145e78f53d1SNikolas Klauser __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end); 3146e78f53d1SNikolas Klauser ++__first; 3147e78f53d1SNikolas Klauser } else { 3148e78f53d1SNikolas Klauser _ForwardIterator __temp = __parse_Back_open_brace(__first, __last); 3149e78f53d1SNikolas Klauser if (__temp != __first) { 3150e78f53d1SNikolas Klauser int __min = 0; 3151e78f53d1SNikolas Klauser __first = __temp; 3152e78f53d1SNikolas Klauser __temp = __parse_DUP_COUNT(__first, __last, __min); 3153e78f53d1SNikolas Klauser if (__temp == __first) 3154e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_badbrace>(); 3155e78f53d1SNikolas Klauser __first = __temp; 3156e78f53d1SNikolas Klauser if (__first == __last) 3157e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_brace>(); 3158e78f53d1SNikolas Klauser if (*__first != ',') { 3159e78f53d1SNikolas Klauser __temp = __parse_Back_close_brace(__first, __last); 3160e78f53d1SNikolas Klauser if (__temp == __first) 3161e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_brace>(); 3162e78f53d1SNikolas Klauser __push_loop(__min, __min, __s, __mexp_begin, __mexp_end, true); 3163e78f53d1SNikolas Klauser __first = __temp; 3164e78f53d1SNikolas Klauser } else { 3165e78f53d1SNikolas Klauser ++__first; // consume ',' 3166e78f53d1SNikolas Klauser int __max = -1; 3167e78f53d1SNikolas Klauser __first = __parse_DUP_COUNT(__first, __last, __max); 3168e78f53d1SNikolas Klauser __temp = __parse_Back_close_brace(__first, __last); 3169e78f53d1SNikolas Klauser if (__temp == __first) 3170e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_brace>(); 3171e78f53d1SNikolas Klauser if (__max == -1) 3172e78f53d1SNikolas Klauser __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end); 3173e78f53d1SNikolas Klauser else { 3174e78f53d1SNikolas Klauser if (__max < __min) 3175e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_badbrace>(); 3176e78f53d1SNikolas Klauser __push_loop(__min, __max, __s, __mexp_begin, __mexp_end, true); 3177e78f53d1SNikolas Klauser } 3178e78f53d1SNikolas Klauser __first = __temp; 3179e78f53d1SNikolas Klauser } 3180e78f53d1SNikolas Klauser } 3181e78f53d1SNikolas Klauser } 3182e78f53d1SNikolas Klauser } 3183e78f53d1SNikolas Klauser return __first; 3184e78f53d1SNikolas Klauser} 3185e78f53d1SNikolas Klauser 3186e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 3187e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 3188e78f53d1SNikolas Klauser_ForwardIterator basic_regex<_CharT, _Traits>::__parse_ERE_dupl_symbol( 3189e78f53d1SNikolas Klauser _ForwardIterator __first, 3190e78f53d1SNikolas Klauser _ForwardIterator __last, 3191e78f53d1SNikolas Klauser __owns_one_state<_CharT>* __s, 3192e78f53d1SNikolas Klauser unsigned __mexp_begin, 3193e78f53d1SNikolas Klauser unsigned __mexp_end) { 3194e78f53d1SNikolas Klauser if (__first != __last) { 3195e78f53d1SNikolas Klauser unsigned __grammar = __get_grammar(__flags_); 3196e78f53d1SNikolas Klauser switch (*__first) { 3197e78f53d1SNikolas Klauser case '*': 3198e78f53d1SNikolas Klauser ++__first; 3199e78f53d1SNikolas Klauser if (__grammar == ECMAScript && __first != __last && *__first == '?') { 3200e78f53d1SNikolas Klauser ++__first; 3201e78f53d1SNikolas Klauser __push_nongreedy_inf_repeat(0, __s, __mexp_begin, __mexp_end); 3202e78f53d1SNikolas Klauser } else 3203e78f53d1SNikolas Klauser __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end); 3204e78f53d1SNikolas Klauser break; 3205e78f53d1SNikolas Klauser case '+': 3206e78f53d1SNikolas Klauser ++__first; 3207e78f53d1SNikolas Klauser if (__grammar == ECMAScript && __first != __last && *__first == '?') { 3208e78f53d1SNikolas Klauser ++__first; 3209e78f53d1SNikolas Klauser __push_nongreedy_inf_repeat(1, __s, __mexp_begin, __mexp_end); 3210e78f53d1SNikolas Klauser } else 3211e78f53d1SNikolas Klauser __push_greedy_inf_repeat(1, __s, __mexp_begin, __mexp_end); 3212e78f53d1SNikolas Klauser break; 3213e78f53d1SNikolas Klauser case '?': 3214e78f53d1SNikolas Klauser ++__first; 3215e78f53d1SNikolas Klauser if (__grammar == ECMAScript && __first != __last && *__first == '?') { 3216e78f53d1SNikolas Klauser ++__first; 3217e78f53d1SNikolas Klauser __push_loop(0, 1, __s, __mexp_begin, __mexp_end, false); 3218e78f53d1SNikolas Klauser } else 3219e78f53d1SNikolas Klauser __push_loop(0, 1, __s, __mexp_begin, __mexp_end); 3220e78f53d1SNikolas Klauser break; 3221e78f53d1SNikolas Klauser case '{': { 3222e78f53d1SNikolas Klauser int __min; 3223e78f53d1SNikolas Klauser _ForwardIterator __temp = __parse_DUP_COUNT(++__first, __last, __min); 3224e78f53d1SNikolas Klauser if (__temp == __first) 3225e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_badbrace>(); 3226e78f53d1SNikolas Klauser __first = __temp; 3227e78f53d1SNikolas Klauser if (__first == __last) 3228e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_brace>(); 3229e78f53d1SNikolas Klauser switch (*__first) { 3230e78f53d1SNikolas Klauser case '}': 3231e78f53d1SNikolas Klauser ++__first; 3232e78f53d1SNikolas Klauser if (__grammar == ECMAScript && __first != __last && *__first == '?') { 3233e78f53d1SNikolas Klauser ++__first; 3234e78f53d1SNikolas Klauser __push_loop(__min, __min, __s, __mexp_begin, __mexp_end, false); 3235e78f53d1SNikolas Klauser } else 3236e78f53d1SNikolas Klauser __push_loop(__min, __min, __s, __mexp_begin, __mexp_end); 3237e78f53d1SNikolas Klauser break; 3238e78f53d1SNikolas Klauser case ',': 3239e78f53d1SNikolas Klauser ++__first; 3240e78f53d1SNikolas Klauser if (__first == __last) 3241e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_badbrace>(); 3242e78f53d1SNikolas Klauser if (*__first == '}') { 3243e78f53d1SNikolas Klauser ++__first; 3244e78f53d1SNikolas Klauser if (__grammar == ECMAScript && __first != __last && *__first == '?') { 3245e78f53d1SNikolas Klauser ++__first; 3246e78f53d1SNikolas Klauser __push_nongreedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end); 3247e78f53d1SNikolas Klauser } else 3248e78f53d1SNikolas Klauser __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end); 3249e78f53d1SNikolas Klauser } else { 3250e78f53d1SNikolas Klauser int __max = -1; 3251e78f53d1SNikolas Klauser __temp = __parse_DUP_COUNT(__first, __last, __max); 3252e78f53d1SNikolas Klauser if (__temp == __first) 3253e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_brace>(); 3254e78f53d1SNikolas Klauser __first = __temp; 3255e78f53d1SNikolas Klauser if (__first == __last || *__first != '}') 3256e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_brace>(); 3257e78f53d1SNikolas Klauser ++__first; 3258e78f53d1SNikolas Klauser if (__max < __min) 3259e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_badbrace>(); 3260e78f53d1SNikolas Klauser if (__grammar == ECMAScript && __first != __last && *__first == '?') { 3261e78f53d1SNikolas Klauser ++__first; 3262e78f53d1SNikolas Klauser __push_loop(__min, __max, __s, __mexp_begin, __mexp_end, false); 3263e78f53d1SNikolas Klauser } else 3264e78f53d1SNikolas Klauser __push_loop(__min, __max, __s, __mexp_begin, __mexp_end); 3265e78f53d1SNikolas Klauser } 3266e78f53d1SNikolas Klauser break; 3267e78f53d1SNikolas Klauser default: 3268e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_badbrace>(); 3269e78f53d1SNikolas Klauser } 3270e78f53d1SNikolas Klauser } break; 3271e78f53d1SNikolas Klauser } 3272e78f53d1SNikolas Klauser } 3273e78f53d1SNikolas Klauser return __first; 3274e78f53d1SNikolas Klauser} 3275e78f53d1SNikolas Klauser 3276e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 3277e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 3278e78f53d1SNikolas Klauser_ForwardIterator 3279e78f53d1SNikolas Klauserbasic_regex<_CharT, _Traits>::__parse_bracket_expression(_ForwardIterator __first, _ForwardIterator __last) { 3280e78f53d1SNikolas Klauser if (__first != __last && *__first == '[') { 3281e78f53d1SNikolas Klauser ++__first; 3282e78f53d1SNikolas Klauser if (__first == __last) 3283e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_brack>(); 3284e78f53d1SNikolas Klauser bool __negate = false; 3285e78f53d1SNikolas Klauser if (*__first == '^') { 3286e78f53d1SNikolas Klauser ++__first; 3287e78f53d1SNikolas Klauser __negate = true; 3288e78f53d1SNikolas Klauser } 3289e78f53d1SNikolas Klauser __bracket_expression<_CharT, _Traits>* __ml = __start_matching_list(__negate); 3290e78f53d1SNikolas Klauser // __ml owned by *this 3291e78f53d1SNikolas Klauser if (__first == __last) 3292e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_brack>(); 3293e78f53d1SNikolas Klauser if (__get_grammar(__flags_) != ECMAScript && *__first == ']') { 3294e78f53d1SNikolas Klauser __ml->__add_char(']'); 3295e78f53d1SNikolas Klauser ++__first; 3296e78f53d1SNikolas Klauser } 3297e78f53d1SNikolas Klauser __first = __parse_follow_list(__first, __last, __ml); 3298e78f53d1SNikolas Klauser if (__first == __last) 3299e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_brack>(); 3300e78f53d1SNikolas Klauser if (*__first == '-') { 3301e78f53d1SNikolas Klauser __ml->__add_char('-'); 3302e78f53d1SNikolas Klauser ++__first; 3303e78f53d1SNikolas Klauser } 3304e78f53d1SNikolas Klauser if (__first == __last || *__first != ']') 3305e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_brack>(); 3306e78f53d1SNikolas Klauser ++__first; 3307e78f53d1SNikolas Klauser } 3308e78f53d1SNikolas Klauser return __first; 3309e78f53d1SNikolas Klauser} 3310e78f53d1SNikolas Klauser 3311e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 3312e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 3313e78f53d1SNikolas Klauser_ForwardIterator basic_regex<_CharT, _Traits>::__parse_follow_list( 3314e78f53d1SNikolas Klauser _ForwardIterator __first, _ForwardIterator __last, __bracket_expression<_CharT, _Traits>* __ml) { 3315e78f53d1SNikolas Klauser if (__first != __last) { 3316e78f53d1SNikolas Klauser while (true) { 3317e78f53d1SNikolas Klauser _ForwardIterator __temp = __parse_expression_term(__first, __last, __ml); 3318e78f53d1SNikolas Klauser if (__temp == __first) 3319e78f53d1SNikolas Klauser break; 3320e78f53d1SNikolas Klauser __first = __temp; 3321e78f53d1SNikolas Klauser } 3322e78f53d1SNikolas Klauser } 3323e78f53d1SNikolas Klauser return __first; 3324e78f53d1SNikolas Klauser} 3325e78f53d1SNikolas Klauser 3326e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 3327e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 3328e78f53d1SNikolas Klauser_ForwardIterator basic_regex<_CharT, _Traits>::__parse_expression_term( 3329e78f53d1SNikolas Klauser _ForwardIterator __first, _ForwardIterator __last, __bracket_expression<_CharT, _Traits>* __ml) { 3330e78f53d1SNikolas Klauser if (__first != __last && *__first != ']') { 3331e78f53d1SNikolas Klauser _ForwardIterator __temp = std::next(__first); 3332e78f53d1SNikolas Klauser basic_string<_CharT> __start_range; 3333e78f53d1SNikolas Klauser if (__temp != __last && *__first == '[') { 3334e78f53d1SNikolas Klauser if (*__temp == '=') 3335e78f53d1SNikolas Klauser return __parse_equivalence_class(++__temp, __last, __ml); 3336e78f53d1SNikolas Klauser else if (*__temp == ':') 3337e78f53d1SNikolas Klauser return __parse_character_class(++__temp, __last, __ml); 3338e78f53d1SNikolas Klauser else if (*__temp == '.') 3339e78f53d1SNikolas Klauser __first = __parse_collating_symbol(++__temp, __last, __start_range); 3340e78f53d1SNikolas Klauser } 3341e78f53d1SNikolas Klauser unsigned __grammar = __get_grammar(__flags_); 3342e78f53d1SNikolas Klauser if (__start_range.empty()) { 3343e78f53d1SNikolas Klauser if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\') { 3344e78f53d1SNikolas Klauser if (__grammar == ECMAScript) 3345e78f53d1SNikolas Klauser __first = __parse_class_escape(++__first, __last, __start_range, __ml); 3346e78f53d1SNikolas Klauser else 3347e78f53d1SNikolas Klauser __first = __parse_awk_escape(++__first, __last, &__start_range); 3348e78f53d1SNikolas Klauser } else { 3349e78f53d1SNikolas Klauser __start_range = *__first; 3350e78f53d1SNikolas Klauser ++__first; 3351e78f53d1SNikolas Klauser } 3352e78f53d1SNikolas Klauser } 3353e78f53d1SNikolas Klauser if (__first != __last && *__first != ']') { 3354e78f53d1SNikolas Klauser __temp = std::next(__first); 3355e78f53d1SNikolas Klauser if (__temp != __last && *__first == '-' && *__temp != ']') { 3356e78f53d1SNikolas Klauser // parse a range 3357e78f53d1SNikolas Klauser basic_string<_CharT> __end_range; 3358e78f53d1SNikolas Klauser __first = __temp; 3359e78f53d1SNikolas Klauser ++__temp; 3360e78f53d1SNikolas Klauser if (__temp != __last && *__first == '[' && *__temp == '.') 3361e78f53d1SNikolas Klauser __first = __parse_collating_symbol(++__temp, __last, __end_range); 3362e78f53d1SNikolas Klauser else { 3363e78f53d1SNikolas Klauser if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\') { 3364e78f53d1SNikolas Klauser if (__grammar == ECMAScript) 3365e78f53d1SNikolas Klauser __first = __parse_class_escape(++__first, __last, __end_range, __ml); 3366e78f53d1SNikolas Klauser else 3367e78f53d1SNikolas Klauser __first = __parse_awk_escape(++__first, __last, &__end_range); 3368e78f53d1SNikolas Klauser } else { 3369e78f53d1SNikolas Klauser __end_range = *__first; 3370e78f53d1SNikolas Klauser ++__first; 3371e78f53d1SNikolas Klauser } 3372e78f53d1SNikolas Klauser } 3373e78f53d1SNikolas Klauser __ml->__add_range(std::move(__start_range), std::move(__end_range)); 3374e78f53d1SNikolas Klauser } else if (!__start_range.empty()) { 3375e78f53d1SNikolas Klauser if (__start_range.size() == 1) 3376e78f53d1SNikolas Klauser __ml->__add_char(__start_range[0]); 3377e78f53d1SNikolas Klauser else 3378e78f53d1SNikolas Klauser __ml->__add_digraph(__start_range[0], __start_range[1]); 3379e78f53d1SNikolas Klauser } 3380e78f53d1SNikolas Klauser } else if (!__start_range.empty()) { 3381e78f53d1SNikolas Klauser if (__start_range.size() == 1) 3382e78f53d1SNikolas Klauser __ml->__add_char(__start_range[0]); 3383e78f53d1SNikolas Klauser else 3384e78f53d1SNikolas Klauser __ml->__add_digraph(__start_range[0], __start_range[1]); 3385e78f53d1SNikolas Klauser } 3386e78f53d1SNikolas Klauser } 3387e78f53d1SNikolas Klauser return __first; 3388e78f53d1SNikolas Klauser} 3389e78f53d1SNikolas Klauser 3390e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 3391e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 3392e78f53d1SNikolas Klauser_ForwardIterator basic_regex<_CharT, _Traits>::__parse_class_escape( 3393e78f53d1SNikolas Klauser _ForwardIterator __first, 3394e78f53d1SNikolas Klauser _ForwardIterator __last, 3395e78f53d1SNikolas Klauser basic_string<_CharT>& __str, 3396e78f53d1SNikolas Klauser __bracket_expression<_CharT, _Traits>* __ml) { 3397e78f53d1SNikolas Klauser if (__first == __last) 3398e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_escape>(); 3399e78f53d1SNikolas Klauser switch (*__first) { 3400e78f53d1SNikolas Klauser case 0: 3401e78f53d1SNikolas Klauser __str = *__first; 3402e78f53d1SNikolas Klauser return ++__first; 3403e78f53d1SNikolas Klauser case 'b': 3404e78f53d1SNikolas Klauser __str = _CharT(8); 3405e78f53d1SNikolas Klauser return ++__first; 3406e78f53d1SNikolas Klauser case 'd': 3407e78f53d1SNikolas Klauser __ml->__add_class(ctype_base::digit); 3408e78f53d1SNikolas Klauser return ++__first; 3409e78f53d1SNikolas Klauser case 'D': 3410e78f53d1SNikolas Klauser __ml->__add_neg_class(ctype_base::digit); 3411e78f53d1SNikolas Klauser return ++__first; 3412e78f53d1SNikolas Klauser case 's': 3413e78f53d1SNikolas Klauser __ml->__add_class(ctype_base::space); 3414e78f53d1SNikolas Klauser return ++__first; 3415e78f53d1SNikolas Klauser case 'S': 3416e78f53d1SNikolas Klauser __ml->__add_neg_class(ctype_base::space); 3417e78f53d1SNikolas Klauser return ++__first; 3418e78f53d1SNikolas Klauser case 'w': 3419e78f53d1SNikolas Klauser __ml->__add_class(ctype_base::alnum); 3420e78f53d1SNikolas Klauser __ml->__add_char('_'); 3421e78f53d1SNikolas Klauser return ++__first; 3422e78f53d1SNikolas Klauser case 'W': 3423e78f53d1SNikolas Klauser __ml->__add_neg_class(ctype_base::alnum); 3424e78f53d1SNikolas Klauser __ml->__add_neg_char('_'); 3425e78f53d1SNikolas Klauser return ++__first; 3426e78f53d1SNikolas Klauser } 3427e78f53d1SNikolas Klauser __first = __parse_character_escape(__first, __last, &__str); 3428e78f53d1SNikolas Klauser return __first; 3429e78f53d1SNikolas Klauser} 3430e78f53d1SNikolas Klauser 3431e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 3432e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 3433e78f53d1SNikolas Klauser_ForwardIterator basic_regex<_CharT, _Traits>::__parse_awk_escape( 3434e78f53d1SNikolas Klauser _ForwardIterator __first, _ForwardIterator __last, basic_string<_CharT>* __str) { 3435e78f53d1SNikolas Klauser if (__first == __last) 3436e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_escape>(); 3437e78f53d1SNikolas Klauser switch (*__first) { 3438e78f53d1SNikolas Klauser case '\\': 3439e78f53d1SNikolas Klauser case '"': 3440e78f53d1SNikolas Klauser case '/': 3441e78f53d1SNikolas Klauser if (__str) 3442e78f53d1SNikolas Klauser *__str = *__first; 3443e78f53d1SNikolas Klauser else 3444e78f53d1SNikolas Klauser __push_char(*__first); 3445e78f53d1SNikolas Klauser return ++__first; 3446e78f53d1SNikolas Klauser case 'a': 3447e78f53d1SNikolas Klauser if (__str) 3448e78f53d1SNikolas Klauser *__str = _CharT(7); 3449e78f53d1SNikolas Klauser else 3450e78f53d1SNikolas Klauser __push_char(_CharT(7)); 3451e78f53d1SNikolas Klauser return ++__first; 3452e78f53d1SNikolas Klauser case 'b': 3453e78f53d1SNikolas Klauser if (__str) 3454e78f53d1SNikolas Klauser *__str = _CharT(8); 3455e78f53d1SNikolas Klauser else 3456e78f53d1SNikolas Klauser __push_char(_CharT(8)); 3457e78f53d1SNikolas Klauser return ++__first; 3458e78f53d1SNikolas Klauser case 'f': 3459e78f53d1SNikolas Klauser if (__str) 3460e78f53d1SNikolas Klauser *__str = _CharT(0xC); 3461e78f53d1SNikolas Klauser else 3462e78f53d1SNikolas Klauser __push_char(_CharT(0xC)); 3463e78f53d1SNikolas Klauser return ++__first; 3464e78f53d1SNikolas Klauser case 'n': 3465e78f53d1SNikolas Klauser if (__str) 3466e78f53d1SNikolas Klauser *__str = _CharT(0xA); 3467e78f53d1SNikolas Klauser else 3468e78f53d1SNikolas Klauser __push_char(_CharT(0xA)); 3469e78f53d1SNikolas Klauser return ++__first; 3470e78f53d1SNikolas Klauser case 'r': 3471e78f53d1SNikolas Klauser if (__str) 3472e78f53d1SNikolas Klauser *__str = _CharT(0xD); 3473e78f53d1SNikolas Klauser else 3474e78f53d1SNikolas Klauser __push_char(_CharT(0xD)); 3475e78f53d1SNikolas Klauser return ++__first; 3476e78f53d1SNikolas Klauser case 't': 3477e78f53d1SNikolas Klauser if (__str) 3478e78f53d1SNikolas Klauser *__str = _CharT(0x9); 3479e78f53d1SNikolas Klauser else 3480e78f53d1SNikolas Klauser __push_char(_CharT(0x9)); 3481e78f53d1SNikolas Klauser return ++__first; 3482e78f53d1SNikolas Klauser case 'v': 3483e78f53d1SNikolas Klauser if (__str) 3484e78f53d1SNikolas Klauser *__str = _CharT(0xB); 3485e78f53d1SNikolas Klauser else 3486e78f53d1SNikolas Klauser __push_char(_CharT(0xB)); 3487e78f53d1SNikolas Klauser return ++__first; 3488e78f53d1SNikolas Klauser } 3489e78f53d1SNikolas Klauser if ('0' <= *__first && *__first <= '7') { 3490e78f53d1SNikolas Klauser unsigned __val = *__first - '0'; 3491e78f53d1SNikolas Klauser if (++__first != __last && ('0' <= *__first && *__first <= '7')) { 3492e78f53d1SNikolas Klauser __val = 8 * __val + *__first - '0'; 3493e78f53d1SNikolas Klauser if (++__first != __last && ('0' <= *__first && *__first <= '7')) 3494e78f53d1SNikolas Klauser __val = 8 * __val + *__first++ - '0'; 3495e78f53d1SNikolas Klauser } 3496e78f53d1SNikolas Klauser if (__str) 3497e78f53d1SNikolas Klauser *__str = _CharT(__val); 3498e78f53d1SNikolas Klauser else 3499e78f53d1SNikolas Klauser __push_char(_CharT(__val)); 3500e78f53d1SNikolas Klauser } else 3501e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_escape>(); 3502e78f53d1SNikolas Klauser return __first; 3503e78f53d1SNikolas Klauser} 3504e78f53d1SNikolas Klauser 3505e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 3506e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 3507e78f53d1SNikolas Klauser_ForwardIterator basic_regex<_CharT, _Traits>::__parse_equivalence_class( 3508e78f53d1SNikolas Klauser _ForwardIterator __first, _ForwardIterator __last, __bracket_expression<_CharT, _Traits>* __ml) { 3509e78f53d1SNikolas Klauser // Found [= 3510e78f53d1SNikolas Klauser // This means =] must exist 3511e78f53d1SNikolas Klauser value_type __equal_close[2] = {'=', ']'}; 3512e78f53d1SNikolas Klauser _ForwardIterator __temp = std::search(__first, __last, __equal_close, __equal_close + 2); 3513e78f53d1SNikolas Klauser if (__temp == __last) 3514e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_brack>(); 3515e78f53d1SNikolas Klauser // [__first, __temp) contains all text in [= ... =] 3516e78f53d1SNikolas Klauser string_type __collate_name = __traits_.lookup_collatename(__first, __temp); 3517e78f53d1SNikolas Klauser if (__collate_name.empty()) 3518e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_collate>(); 3519e78f53d1SNikolas Klauser string_type __equiv_name = __traits_.transform_primary(__collate_name.begin(), __collate_name.end()); 3520e78f53d1SNikolas Klauser if (!__equiv_name.empty()) 3521e78f53d1SNikolas Klauser __ml->__add_equivalence(__equiv_name); 3522e78f53d1SNikolas Klauser else { 3523e78f53d1SNikolas Klauser switch (__collate_name.size()) { 3524e78f53d1SNikolas Klauser case 1: 3525e78f53d1SNikolas Klauser __ml->__add_char(__collate_name[0]); 3526e78f53d1SNikolas Klauser break; 3527e78f53d1SNikolas Klauser case 2: 3528e78f53d1SNikolas Klauser __ml->__add_digraph(__collate_name[0], __collate_name[1]); 3529e78f53d1SNikolas Klauser break; 3530e78f53d1SNikolas Klauser default: 3531e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_collate>(); 3532e78f53d1SNikolas Klauser } 3533e78f53d1SNikolas Klauser } 3534e78f53d1SNikolas Klauser __first = std::next(__temp, 2); 3535e78f53d1SNikolas Klauser return __first; 3536e78f53d1SNikolas Klauser} 3537e78f53d1SNikolas Klauser 3538e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 3539e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 3540e78f53d1SNikolas Klauser_ForwardIterator basic_regex<_CharT, _Traits>::__parse_character_class( 3541e78f53d1SNikolas Klauser _ForwardIterator __first, _ForwardIterator __last, __bracket_expression<_CharT, _Traits>* __ml) { 3542e78f53d1SNikolas Klauser // Found [: 3543e78f53d1SNikolas Klauser // This means :] must exist 3544e78f53d1SNikolas Klauser value_type __colon_close[2] = {':', ']'}; 3545e78f53d1SNikolas Klauser _ForwardIterator __temp = std::search(__first, __last, __colon_close, __colon_close + 2); 3546e78f53d1SNikolas Klauser if (__temp == __last) 3547e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_brack>(); 3548e78f53d1SNikolas Klauser // [__first, __temp) contains all text in [: ... :] 3549e78f53d1SNikolas Klauser typedef typename _Traits::char_class_type char_class_type; 3550e78f53d1SNikolas Klauser char_class_type __class_type = __traits_.lookup_classname(__first, __temp, __flags_ & icase); 3551e78f53d1SNikolas Klauser if (__class_type == 0) 3552e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_ctype>(); 3553e78f53d1SNikolas Klauser __ml->__add_class(__class_type); 3554e78f53d1SNikolas Klauser __first = std::next(__temp, 2); 3555e78f53d1SNikolas Klauser return __first; 3556e78f53d1SNikolas Klauser} 3557e78f53d1SNikolas Klauser 3558e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 3559e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 3560e78f53d1SNikolas Klauser_ForwardIterator basic_regex<_CharT, _Traits>::__parse_collating_symbol( 3561e78f53d1SNikolas Klauser _ForwardIterator __first, _ForwardIterator __last, basic_string<_CharT>& __col_sym) { 3562e78f53d1SNikolas Klauser // Found [. 3563e78f53d1SNikolas Klauser // This means .] must exist 3564e78f53d1SNikolas Klauser value_type __dot_close[2] = {'.', ']'}; 3565e78f53d1SNikolas Klauser _ForwardIterator __temp = std::search(__first, __last, __dot_close, __dot_close + 2); 3566e78f53d1SNikolas Klauser if (__temp == __last) 3567e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_brack>(); 3568e78f53d1SNikolas Klauser // [__first, __temp) contains all text in [. ... .] 3569e78f53d1SNikolas Klauser __col_sym = __traits_.lookup_collatename(__first, __temp); 3570e78f53d1SNikolas Klauser switch (__col_sym.size()) { 3571e78f53d1SNikolas Klauser case 1: 3572e78f53d1SNikolas Klauser case 2: 3573e78f53d1SNikolas Klauser break; 3574e78f53d1SNikolas Klauser default: 3575e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_collate>(); 3576e78f53d1SNikolas Klauser } 3577e78f53d1SNikolas Klauser __first = std::next(__temp, 2); 3578e78f53d1SNikolas Klauser return __first; 3579e78f53d1SNikolas Klauser} 3580e78f53d1SNikolas Klauser 3581e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 3582e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 3583e78f53d1SNikolas Klauser_ForwardIterator 3584e78f53d1SNikolas Klauserbasic_regex<_CharT, _Traits>::__parse_DUP_COUNT(_ForwardIterator __first, _ForwardIterator __last, int& __c) { 3585e78f53d1SNikolas Klauser if (__first != __last) { 3586e78f53d1SNikolas Klauser int __val = __traits_.value(*__first, 10); 3587e78f53d1SNikolas Klauser if (__val != -1) { 3588e78f53d1SNikolas Klauser __c = __val; 3589e78f53d1SNikolas Klauser for (++__first; __first != __last && (__val = __traits_.value(*__first, 10)) != -1; ++__first) { 3590e78f53d1SNikolas Klauser if (__c >= numeric_limits<int>::max() / 10) 3591e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_badbrace>(); 3592e78f53d1SNikolas Klauser __c *= 10; 3593e78f53d1SNikolas Klauser __c += __val; 3594e78f53d1SNikolas Klauser } 3595e78f53d1SNikolas Klauser } 3596e78f53d1SNikolas Klauser } 3597e78f53d1SNikolas Klauser return __first; 3598e78f53d1SNikolas Klauser} 3599e78f53d1SNikolas Klauser 3600e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 3601e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 3602e78f53d1SNikolas Klauser_ForwardIterator basic_regex<_CharT, _Traits>::__parse_ecma_exp(_ForwardIterator __first, _ForwardIterator __last) { 3603e78f53d1SNikolas Klauser __owns_one_state<_CharT>* __sa = __end_; 3604e78f53d1SNikolas Klauser _ForwardIterator __temp = __parse_alternative(__first, __last); 3605e78f53d1SNikolas Klauser if (__temp == __first) 3606e78f53d1SNikolas Klauser __push_empty(); 3607e78f53d1SNikolas Klauser __first = __temp; 3608e78f53d1SNikolas Klauser while (__first != __last && *__first == '|') { 3609e78f53d1SNikolas Klauser __owns_one_state<_CharT>* __sb = __end_; 3610e78f53d1SNikolas Klauser __temp = __parse_alternative(++__first, __last); 3611e78f53d1SNikolas Klauser if (__temp == __first) 3612e78f53d1SNikolas Klauser __push_empty(); 3613e78f53d1SNikolas Klauser __push_alternation(__sa, __sb); 3614e78f53d1SNikolas Klauser __first = __temp; 3615e78f53d1SNikolas Klauser } 3616e78f53d1SNikolas Klauser return __first; 3617e78f53d1SNikolas Klauser} 3618e78f53d1SNikolas Klauser 3619e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 3620e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 3621e78f53d1SNikolas Klauser_ForwardIterator basic_regex<_CharT, _Traits>::__parse_alternative(_ForwardIterator __first, _ForwardIterator __last) { 3622e78f53d1SNikolas Klauser while (true) { 3623e78f53d1SNikolas Klauser _ForwardIterator __temp = __parse_term(__first, __last); 3624e78f53d1SNikolas Klauser if (__temp == __first) 3625e78f53d1SNikolas Klauser break; 3626e78f53d1SNikolas Klauser __first = __temp; 3627e78f53d1SNikolas Klauser } 3628e78f53d1SNikolas Klauser return __first; 3629e78f53d1SNikolas Klauser} 3630e78f53d1SNikolas Klauser 3631e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 3632e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 3633e78f53d1SNikolas Klauser_ForwardIterator basic_regex<_CharT, _Traits>::__parse_term(_ForwardIterator __first, _ForwardIterator __last) { 3634e78f53d1SNikolas Klauser _ForwardIterator __temp = __parse_assertion(__first, __last); 3635e78f53d1SNikolas Klauser if (__temp == __first) { 3636e78f53d1SNikolas Klauser __owns_one_state<_CharT>* __e = __end_; 3637e78f53d1SNikolas Klauser unsigned __mexp_begin = __marked_count_; 3638e78f53d1SNikolas Klauser __temp = __parse_atom(__first, __last); 3639e78f53d1SNikolas Klauser if (__temp != __first) 3640e78f53d1SNikolas Klauser __first = __parse_ERE_dupl_symbol(__temp, __last, __e, __mexp_begin + 1, __marked_count_ + 1); 3641e78f53d1SNikolas Klauser } else 3642e78f53d1SNikolas Klauser __first = __temp; 3643e78f53d1SNikolas Klauser return __first; 3644e78f53d1SNikolas Klauser} 3645e78f53d1SNikolas Klauser 3646e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 3647e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 3648e78f53d1SNikolas Klauser_ForwardIterator basic_regex<_CharT, _Traits>::__parse_assertion(_ForwardIterator __first, _ForwardIterator __last) { 3649e78f53d1SNikolas Klauser if (__first != __last) { 3650e78f53d1SNikolas Klauser switch (*__first) { 3651e78f53d1SNikolas Klauser case '^': 3652e78f53d1SNikolas Klauser __push_l_anchor(); 3653e78f53d1SNikolas Klauser ++__first; 3654e78f53d1SNikolas Klauser break; 3655e78f53d1SNikolas Klauser case '$': 3656e78f53d1SNikolas Klauser __push_r_anchor(); 3657e78f53d1SNikolas Klauser ++__first; 3658e78f53d1SNikolas Klauser break; 3659e78f53d1SNikolas Klauser case '\\': { 3660e78f53d1SNikolas Klauser _ForwardIterator __temp = std::next(__first); 3661e78f53d1SNikolas Klauser if (__temp != __last) { 3662e78f53d1SNikolas Klauser if (*__temp == 'b') { 3663e78f53d1SNikolas Klauser __push_word_boundary(false); 3664e78f53d1SNikolas Klauser __first = ++__temp; 3665e78f53d1SNikolas Klauser } else if (*__temp == 'B') { 3666e78f53d1SNikolas Klauser __push_word_boundary(true); 3667e78f53d1SNikolas Klauser __first = ++__temp; 3668e78f53d1SNikolas Klauser } 3669e78f53d1SNikolas Klauser } 3670e78f53d1SNikolas Klauser } break; 3671e78f53d1SNikolas Klauser case '(': { 3672e78f53d1SNikolas Klauser _ForwardIterator __temp = std::next(__first); 3673e78f53d1SNikolas Klauser if (__temp != __last && *__temp == '?') { 3674e78f53d1SNikolas Klauser if (++__temp != __last) { 3675e78f53d1SNikolas Klauser switch (*__temp) { 3676e78f53d1SNikolas Klauser case '=': { 3677e78f53d1SNikolas Klauser basic_regex __exp; 3678e78f53d1SNikolas Klauser __exp.__flags_ = __flags_; 3679e78f53d1SNikolas Klauser __temp = __exp.__parse(++__temp, __last); 3680e78f53d1SNikolas Klauser unsigned __mexp = __exp.__marked_count_; 3681e78f53d1SNikolas Klauser __push_lookahead(std::move(__exp), false, __marked_count_); 3682e78f53d1SNikolas Klauser __marked_count_ += __mexp; 3683e78f53d1SNikolas Klauser if (__temp == __last || *__temp != ')') 3684e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_paren>(); 3685e78f53d1SNikolas Klauser __first = ++__temp; 3686e78f53d1SNikolas Klauser } break; 3687e78f53d1SNikolas Klauser case '!': { 3688e78f53d1SNikolas Klauser basic_regex __exp; 3689e78f53d1SNikolas Klauser __exp.__flags_ = __flags_; 3690e78f53d1SNikolas Klauser __temp = __exp.__parse(++__temp, __last); 3691e78f53d1SNikolas Klauser unsigned __mexp = __exp.__marked_count_; 3692e78f53d1SNikolas Klauser __push_lookahead(std::move(__exp), true, __marked_count_); 3693e78f53d1SNikolas Klauser __marked_count_ += __mexp; 3694e78f53d1SNikolas Klauser if (__temp == __last || *__temp != ')') 3695e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_paren>(); 3696e78f53d1SNikolas Klauser __first = ++__temp; 3697e78f53d1SNikolas Klauser } break; 3698e78f53d1SNikolas Klauser } 3699e78f53d1SNikolas Klauser } 3700e78f53d1SNikolas Klauser } 3701e78f53d1SNikolas Klauser } break; 3702e78f53d1SNikolas Klauser } 3703e78f53d1SNikolas Klauser } 3704e78f53d1SNikolas Klauser return __first; 3705e78f53d1SNikolas Klauser} 3706e78f53d1SNikolas Klauser 3707e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 3708e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 3709e78f53d1SNikolas Klauser_ForwardIterator basic_regex<_CharT, _Traits>::__parse_atom(_ForwardIterator __first, _ForwardIterator __last) { 3710e78f53d1SNikolas Klauser if (__first != __last) { 3711e78f53d1SNikolas Klauser switch (*__first) { 3712e78f53d1SNikolas Klauser case '.': 3713e78f53d1SNikolas Klauser __push_match_any_but_newline(); 3714e78f53d1SNikolas Klauser ++__first; 3715e78f53d1SNikolas Klauser break; 3716e78f53d1SNikolas Klauser case '\\': 3717e78f53d1SNikolas Klauser __first = __parse_atom_escape(__first, __last); 3718e78f53d1SNikolas Klauser break; 3719e78f53d1SNikolas Klauser case '[': 3720e78f53d1SNikolas Klauser __first = __parse_bracket_expression(__first, __last); 3721e78f53d1SNikolas Klauser break; 3722e78f53d1SNikolas Klauser case '(': { 3723e78f53d1SNikolas Klauser ++__first; 3724e78f53d1SNikolas Klauser if (__first == __last) 3725e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_paren>(); 3726e78f53d1SNikolas Klauser _ForwardIterator __temp = std::next(__first); 3727e78f53d1SNikolas Klauser if (__temp != __last && *__first == '?' && *__temp == ':') { 3728e78f53d1SNikolas Klauser ++__open_count_; 3729e78f53d1SNikolas Klauser __first = __parse_ecma_exp(++__temp, __last); 3730e78f53d1SNikolas Klauser if (__first == __last || *__first != ')') 3731e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_paren>(); 3732e78f53d1SNikolas Klauser --__open_count_; 3733e78f53d1SNikolas Klauser ++__first; 3734e78f53d1SNikolas Klauser } else { 3735e78f53d1SNikolas Klauser __push_begin_marked_subexpression(); 3736e78f53d1SNikolas Klauser unsigned __temp_count = __marked_count_; 3737e78f53d1SNikolas Klauser ++__open_count_; 3738e78f53d1SNikolas Klauser __first = __parse_ecma_exp(__first, __last); 3739e78f53d1SNikolas Klauser if (__first == __last || *__first != ')') 3740e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_paren>(); 3741e78f53d1SNikolas Klauser __push_end_marked_subexpression(__temp_count); 3742e78f53d1SNikolas Klauser --__open_count_; 3743e78f53d1SNikolas Klauser ++__first; 3744e78f53d1SNikolas Klauser } 3745e78f53d1SNikolas Klauser } break; 3746e78f53d1SNikolas Klauser case '*': 3747e78f53d1SNikolas Klauser case '+': 3748e78f53d1SNikolas Klauser case '?': 3749e78f53d1SNikolas Klauser case '{': 3750e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_badrepeat>(); 3751e78f53d1SNikolas Klauser break; 3752e78f53d1SNikolas Klauser default: 3753e78f53d1SNikolas Klauser __first = __parse_pattern_character(__first, __last); 3754e78f53d1SNikolas Klauser break; 3755e78f53d1SNikolas Klauser } 3756e78f53d1SNikolas Klauser } 3757e78f53d1SNikolas Klauser return __first; 3758e78f53d1SNikolas Klauser} 3759e78f53d1SNikolas Klauser 3760e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 3761e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 3762e78f53d1SNikolas Klauser_ForwardIterator basic_regex<_CharT, _Traits>::__parse_atom_escape(_ForwardIterator __first, _ForwardIterator __last) { 3763e78f53d1SNikolas Klauser if (__first != __last && *__first == '\\') { 3764e78f53d1SNikolas Klauser _ForwardIterator __t1 = std::next(__first); 3765e78f53d1SNikolas Klauser if (__t1 == __last) 3766e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_escape>(); 3767e78f53d1SNikolas Klauser 3768e78f53d1SNikolas Klauser _ForwardIterator __t2 = __parse_decimal_escape(__t1, __last); 3769e78f53d1SNikolas Klauser if (__t2 != __t1) 3770e78f53d1SNikolas Klauser __first = __t2; 3771e78f53d1SNikolas Klauser else { 3772e78f53d1SNikolas Klauser __t2 = __parse_character_class_escape(__t1, __last); 3773e78f53d1SNikolas Klauser if (__t2 != __t1) 3774e78f53d1SNikolas Klauser __first = __t2; 3775e78f53d1SNikolas Klauser else { 3776e78f53d1SNikolas Klauser __t2 = __parse_character_escape(__t1, __last); 3777e78f53d1SNikolas Klauser if (__t2 != __t1) 3778e78f53d1SNikolas Klauser __first = __t2; 3779e78f53d1SNikolas Klauser } 3780e78f53d1SNikolas Klauser } 3781e78f53d1SNikolas Klauser } 3782e78f53d1SNikolas Klauser return __first; 3783e78f53d1SNikolas Klauser} 3784e78f53d1SNikolas Klauser 3785e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 3786e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 3787e78f53d1SNikolas Klauser_ForwardIterator 3788e78f53d1SNikolas Klauserbasic_regex<_CharT, _Traits>::__parse_decimal_escape(_ForwardIterator __first, _ForwardIterator __last) { 3789e78f53d1SNikolas Klauser if (__first != __last) { 3790e78f53d1SNikolas Klauser if (*__first == '0') { 3791e78f53d1SNikolas Klauser __push_char(_CharT()); 3792e78f53d1SNikolas Klauser ++__first; 3793e78f53d1SNikolas Klauser } else if ('1' <= *__first && *__first <= '9') { 3794e78f53d1SNikolas Klauser unsigned __v = *__first - '0'; 3795e78f53d1SNikolas Klauser for (++__first; __first != __last && '0' <= *__first && *__first <= '9'; ++__first) { 3796e78f53d1SNikolas Klauser if (__v >= numeric_limits<unsigned>::max() / 10) 3797e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_backref>(); 3798e78f53d1SNikolas Klauser __v = 10 * __v + *__first - '0'; 3799e78f53d1SNikolas Klauser } 3800e78f53d1SNikolas Klauser if (__v == 0 || __v > mark_count()) 3801e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_backref>(); 3802e78f53d1SNikolas Klauser __push_back_ref(__v); 3803e78f53d1SNikolas Klauser } 3804e78f53d1SNikolas Klauser } 3805e78f53d1SNikolas Klauser return __first; 3806e78f53d1SNikolas Klauser} 3807e78f53d1SNikolas Klauser 3808e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 3809e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 3810e78f53d1SNikolas Klauser_ForwardIterator 3811e78f53d1SNikolas Klauserbasic_regex<_CharT, _Traits>::__parse_character_class_escape(_ForwardIterator __first, _ForwardIterator __last) { 3812e78f53d1SNikolas Klauser if (__first != __last) { 3813e78f53d1SNikolas Klauser __bracket_expression<_CharT, _Traits>* __ml; 3814e78f53d1SNikolas Klauser switch (*__first) { 3815e78f53d1SNikolas Klauser case 'd': 3816e78f53d1SNikolas Klauser __ml = __start_matching_list(false); 3817e78f53d1SNikolas Klauser __ml->__add_class(ctype_base::digit); 3818e78f53d1SNikolas Klauser ++__first; 3819e78f53d1SNikolas Klauser break; 3820e78f53d1SNikolas Klauser case 'D': 3821e78f53d1SNikolas Klauser __ml = __start_matching_list(true); 3822e78f53d1SNikolas Klauser __ml->__add_class(ctype_base::digit); 3823e78f53d1SNikolas Klauser ++__first; 3824e78f53d1SNikolas Klauser break; 3825e78f53d1SNikolas Klauser case 's': 3826e78f53d1SNikolas Klauser __ml = __start_matching_list(false); 3827e78f53d1SNikolas Klauser __ml->__add_class(ctype_base::space); 3828e78f53d1SNikolas Klauser ++__first; 3829e78f53d1SNikolas Klauser break; 3830e78f53d1SNikolas Klauser case 'S': 3831e78f53d1SNikolas Klauser __ml = __start_matching_list(true); 3832e78f53d1SNikolas Klauser __ml->__add_class(ctype_base::space); 3833e78f53d1SNikolas Klauser ++__first; 3834e78f53d1SNikolas Klauser break; 3835e78f53d1SNikolas Klauser case 'w': 3836e78f53d1SNikolas Klauser __ml = __start_matching_list(false); 3837e78f53d1SNikolas Klauser __ml->__add_class(ctype_base::alnum); 3838e78f53d1SNikolas Klauser __ml->__add_char('_'); 3839e78f53d1SNikolas Klauser ++__first; 3840e78f53d1SNikolas Klauser break; 3841e78f53d1SNikolas Klauser case 'W': 3842e78f53d1SNikolas Klauser __ml = __start_matching_list(true); 3843e78f53d1SNikolas Klauser __ml->__add_class(ctype_base::alnum); 3844e78f53d1SNikolas Klauser __ml->__add_char('_'); 3845e78f53d1SNikolas Klauser ++__first; 3846e78f53d1SNikolas Klauser break; 3847e78f53d1SNikolas Klauser } 3848e78f53d1SNikolas Klauser } 3849e78f53d1SNikolas Klauser return __first; 3850e78f53d1SNikolas Klauser} 3851e78f53d1SNikolas Klauser 3852e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 3853e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 3854e78f53d1SNikolas Klauser_ForwardIterator basic_regex<_CharT, _Traits>::__parse_character_escape( 3855e78f53d1SNikolas Klauser _ForwardIterator __first, _ForwardIterator __last, basic_string<_CharT>* __str) { 3856e78f53d1SNikolas Klauser if (__first != __last) { 3857e78f53d1SNikolas Klauser _ForwardIterator __t; 3858e78f53d1SNikolas Klauser unsigned __sum = 0; 3859e78f53d1SNikolas Klauser int __hd; 3860e78f53d1SNikolas Klauser switch (*__first) { 3861e78f53d1SNikolas Klauser case 'f': 3862e78f53d1SNikolas Klauser if (__str) 3863e78f53d1SNikolas Klauser *__str = _CharT(0xC); 3864e78f53d1SNikolas Klauser else 3865e78f53d1SNikolas Klauser __push_char(_CharT(0xC)); 3866e78f53d1SNikolas Klauser ++__first; 3867e78f53d1SNikolas Klauser break; 3868e78f53d1SNikolas Klauser case 'n': 3869e78f53d1SNikolas Klauser if (__str) 3870e78f53d1SNikolas Klauser *__str = _CharT(0xA); 3871e78f53d1SNikolas Klauser else 3872e78f53d1SNikolas Klauser __push_char(_CharT(0xA)); 3873e78f53d1SNikolas Klauser ++__first; 3874e78f53d1SNikolas Klauser break; 3875e78f53d1SNikolas Klauser case 'r': 3876e78f53d1SNikolas Klauser if (__str) 3877e78f53d1SNikolas Klauser *__str = _CharT(0xD); 3878e78f53d1SNikolas Klauser else 3879e78f53d1SNikolas Klauser __push_char(_CharT(0xD)); 3880e78f53d1SNikolas Klauser ++__first; 3881e78f53d1SNikolas Klauser break; 3882e78f53d1SNikolas Klauser case 't': 3883e78f53d1SNikolas Klauser if (__str) 3884e78f53d1SNikolas Klauser *__str = _CharT(0x9); 3885e78f53d1SNikolas Klauser else 3886e78f53d1SNikolas Klauser __push_char(_CharT(0x9)); 3887e78f53d1SNikolas Klauser ++__first; 3888e78f53d1SNikolas Klauser break; 3889e78f53d1SNikolas Klauser case 'v': 3890e78f53d1SNikolas Klauser if (__str) 3891e78f53d1SNikolas Klauser *__str = _CharT(0xB); 3892e78f53d1SNikolas Klauser else 3893e78f53d1SNikolas Klauser __push_char(_CharT(0xB)); 3894e78f53d1SNikolas Klauser ++__first; 3895e78f53d1SNikolas Klauser break; 3896e78f53d1SNikolas Klauser case 'c': 3897e78f53d1SNikolas Klauser if ((__t = std::next(__first)) != __last) { 3898e78f53d1SNikolas Klauser if (('A' <= *__t && *__t <= 'Z') || ('a' <= *__t && *__t <= 'z')) { 3899e78f53d1SNikolas Klauser if (__str) 3900e78f53d1SNikolas Klauser *__str = _CharT(*__t % 32); 3901e78f53d1SNikolas Klauser else 3902e78f53d1SNikolas Klauser __push_char(_CharT(*__t % 32)); 3903e78f53d1SNikolas Klauser __first = ++__t; 3904e78f53d1SNikolas Klauser } else 3905e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_escape>(); 3906e78f53d1SNikolas Klauser } else 3907e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_escape>(); 3908e78f53d1SNikolas Klauser break; 3909e78f53d1SNikolas Klauser case 'u': 3910e78f53d1SNikolas Klauser ++__first; 3911e78f53d1SNikolas Klauser if (__first == __last) 3912e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_escape>(); 3913e78f53d1SNikolas Klauser __hd = __traits_.value(*__first, 16); 3914e78f53d1SNikolas Klauser if (__hd == -1) 3915e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_escape>(); 3916e78f53d1SNikolas Klauser __sum = 16 * __sum + static_cast<unsigned>(__hd); 3917e78f53d1SNikolas Klauser ++__first; 3918e78f53d1SNikolas Klauser if (__first == __last) 3919e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_escape>(); 3920e78f53d1SNikolas Klauser __hd = __traits_.value(*__first, 16); 3921e78f53d1SNikolas Klauser if (__hd == -1) 3922e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_escape>(); 3923e78f53d1SNikolas Klauser __sum = 16 * __sum + static_cast<unsigned>(__hd); 3924e78f53d1SNikolas Klauser // fallthrough 3925e78f53d1SNikolas Klauser case 'x': 3926e78f53d1SNikolas Klauser ++__first; 3927e78f53d1SNikolas Klauser if (__first == __last) 3928e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_escape>(); 3929e78f53d1SNikolas Klauser __hd = __traits_.value(*__first, 16); 3930e78f53d1SNikolas Klauser if (__hd == -1) 3931e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_escape>(); 3932e78f53d1SNikolas Klauser __sum = 16 * __sum + static_cast<unsigned>(__hd); 3933e78f53d1SNikolas Klauser ++__first; 3934e78f53d1SNikolas Klauser if (__first == __last) 3935e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_escape>(); 3936e78f53d1SNikolas Klauser __hd = __traits_.value(*__first, 16); 3937e78f53d1SNikolas Klauser if (__hd == -1) 3938e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_escape>(); 3939e78f53d1SNikolas Klauser __sum = 16 * __sum + static_cast<unsigned>(__hd); 3940e78f53d1SNikolas Klauser if (__str) 3941e78f53d1SNikolas Klauser *__str = _CharT(__sum); 3942e78f53d1SNikolas Klauser else 3943e78f53d1SNikolas Klauser __push_char(_CharT(__sum)); 3944e78f53d1SNikolas Klauser ++__first; 3945e78f53d1SNikolas Klauser break; 3946e78f53d1SNikolas Klauser case '0': 3947e78f53d1SNikolas Klauser if (__str) 3948e78f53d1SNikolas Klauser *__str = _CharT(0); 3949e78f53d1SNikolas Klauser else 3950e78f53d1SNikolas Klauser __push_char(_CharT(0)); 3951e78f53d1SNikolas Klauser ++__first; 3952e78f53d1SNikolas Klauser break; 3953e78f53d1SNikolas Klauser default: 3954e78f53d1SNikolas Klauser if (*__first != '_' && !__traits_.isctype(*__first, ctype_base::alnum)) { 3955e78f53d1SNikolas Klauser if (__str) 3956e78f53d1SNikolas Klauser *__str = *__first; 3957e78f53d1SNikolas Klauser else 3958e78f53d1SNikolas Klauser __push_char(*__first); 3959e78f53d1SNikolas Klauser ++__first; 3960e78f53d1SNikolas Klauser } else 3961e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_escape>(); 3962e78f53d1SNikolas Klauser break; 3963e78f53d1SNikolas Klauser } 3964e78f53d1SNikolas Klauser } 3965e78f53d1SNikolas Klauser return __first; 3966e78f53d1SNikolas Klauser} 3967e78f53d1SNikolas Klauser 3968e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 3969e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 3970e78f53d1SNikolas Klauser_ForwardIterator 3971e78f53d1SNikolas Klauserbasic_regex<_CharT, _Traits>::__parse_pattern_character(_ForwardIterator __first, _ForwardIterator __last) { 3972e78f53d1SNikolas Klauser if (__first != __last) { 3973e78f53d1SNikolas Klauser switch (*__first) { 3974e78f53d1SNikolas Klauser case '^': 3975e78f53d1SNikolas Klauser case '$': 3976e78f53d1SNikolas Klauser case '\\': 3977e78f53d1SNikolas Klauser case '.': 3978e78f53d1SNikolas Klauser case '*': 3979e78f53d1SNikolas Klauser case '+': 3980e78f53d1SNikolas Klauser case '?': 3981e78f53d1SNikolas Klauser case '(': 3982e78f53d1SNikolas Klauser case ')': 3983e78f53d1SNikolas Klauser case '[': 3984e78f53d1SNikolas Klauser case ']': 3985e78f53d1SNikolas Klauser case '{': 3986e78f53d1SNikolas Klauser case '}': 3987e78f53d1SNikolas Klauser case '|': 3988e78f53d1SNikolas Klauser break; 3989e78f53d1SNikolas Klauser default: 3990e78f53d1SNikolas Klauser __push_char(*__first); 3991e78f53d1SNikolas Klauser ++__first; 3992e78f53d1SNikolas Klauser break; 3993e78f53d1SNikolas Klauser } 3994e78f53d1SNikolas Klauser } 3995e78f53d1SNikolas Klauser return __first; 3996e78f53d1SNikolas Klauser} 3997e78f53d1SNikolas Klauser 3998e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 3999e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 4000e78f53d1SNikolas Klauser_ForwardIterator basic_regex<_CharT, _Traits>::__parse_grep(_ForwardIterator __first, _ForwardIterator __last) { 4001e78f53d1SNikolas Klauser __owns_one_state<_CharT>* __sa = __end_; 4002e78f53d1SNikolas Klauser _ForwardIterator __t1 = std::find(__first, __last, _CharT('\n')); 4003e78f53d1SNikolas Klauser if (__t1 != __first) 4004e78f53d1SNikolas Klauser __parse_basic_reg_exp(__first, __t1); 4005e78f53d1SNikolas Klauser else 4006e78f53d1SNikolas Klauser __push_empty(); 4007e78f53d1SNikolas Klauser __first = __t1; 4008e78f53d1SNikolas Klauser if (__first != __last) 4009e78f53d1SNikolas Klauser ++__first; 4010e78f53d1SNikolas Klauser while (__first != __last) { 4011e78f53d1SNikolas Klauser __t1 = std::find(__first, __last, _CharT('\n')); 4012e78f53d1SNikolas Klauser __owns_one_state<_CharT>* __sb = __end_; 4013e78f53d1SNikolas Klauser if (__t1 != __first) 4014e78f53d1SNikolas Klauser __parse_basic_reg_exp(__first, __t1); 4015e78f53d1SNikolas Klauser else 4016e78f53d1SNikolas Klauser __push_empty(); 4017e78f53d1SNikolas Klauser __push_alternation(__sa, __sb); 4018e78f53d1SNikolas Klauser __first = __t1; 4019e78f53d1SNikolas Klauser if (__first != __last) 4020e78f53d1SNikolas Klauser ++__first; 4021e78f53d1SNikolas Klauser } 4022e78f53d1SNikolas Klauser return __first; 4023e78f53d1SNikolas Klauser} 4024e78f53d1SNikolas Klauser 4025e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 4026e78f53d1SNikolas Klausertemplate <class _ForwardIterator> 4027e78f53d1SNikolas Klauser_ForwardIterator basic_regex<_CharT, _Traits>::__parse_egrep(_ForwardIterator __first, _ForwardIterator __last) { 4028e78f53d1SNikolas Klauser __owns_one_state<_CharT>* __sa = __end_; 4029e78f53d1SNikolas Klauser _ForwardIterator __t1 = std::find(__first, __last, _CharT('\n')); 4030e78f53d1SNikolas Klauser if (__t1 != __first) 4031e78f53d1SNikolas Klauser __parse_extended_reg_exp(__first, __t1); 4032e78f53d1SNikolas Klauser else 4033e78f53d1SNikolas Klauser __push_empty(); 4034e78f53d1SNikolas Klauser __first = __t1; 4035e78f53d1SNikolas Klauser if (__first != __last) 4036e78f53d1SNikolas Klauser ++__first; 4037e78f53d1SNikolas Klauser while (__first != __last) { 4038e78f53d1SNikolas Klauser __t1 = std::find(__first, __last, _CharT('\n')); 4039e78f53d1SNikolas Klauser __owns_one_state<_CharT>* __sb = __end_; 4040e78f53d1SNikolas Klauser if (__t1 != __first) 4041e78f53d1SNikolas Klauser __parse_extended_reg_exp(__first, __t1); 4042e78f53d1SNikolas Klauser else 4043e78f53d1SNikolas Klauser __push_empty(); 4044e78f53d1SNikolas Klauser __push_alternation(__sa, __sb); 4045e78f53d1SNikolas Klauser __first = __t1; 4046e78f53d1SNikolas Klauser if (__first != __last) 4047e78f53d1SNikolas Klauser ++__first; 4048e78f53d1SNikolas Klauser } 4049e78f53d1SNikolas Klauser return __first; 4050e78f53d1SNikolas Klauser} 4051e78f53d1SNikolas Klauser 4052e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 4053e78f53d1SNikolas Klauserbool basic_regex<_CharT, _Traits>::__test_back_ref(_CharT __c) { 4054e78f53d1SNikolas Klauser unsigned __val = __traits_.value(__c, 10); 4055e78f53d1SNikolas Klauser if (__val >= 1 && __val <= 9) { 4056e78f53d1SNikolas Klauser if (__val > mark_count()) 4057e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_backref>(); 4058e78f53d1SNikolas Klauser __push_back_ref(__val); 4059e78f53d1SNikolas Klauser return true; 4060e78f53d1SNikolas Klauser } 4061e78f53d1SNikolas Klauser 4062e78f53d1SNikolas Klauser return false; 4063e78f53d1SNikolas Klauser} 4064e78f53d1SNikolas Klauser 4065e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 4066e78f53d1SNikolas Klauservoid basic_regex<_CharT, _Traits>::__push_loop( 4067e78f53d1SNikolas Klauser size_t __min, size_t __max, __owns_one_state<_CharT>* __s, size_t __mexp_begin, size_t __mexp_end, bool __greedy) { 4068e78f53d1SNikolas Klauser unique_ptr<__empty_state<_CharT> > __e1(new __empty_state<_CharT>(__end_->first())); 4069e78f53d1SNikolas Klauser __end_->first() = nullptr; 4070e78f53d1SNikolas Klauser unique_ptr<__loop<_CharT> > __e2( 4071e78f53d1SNikolas Klauser new __loop<_CharT>(__loop_count_, __s->first(), __e1.get(), __mexp_begin, __mexp_end, __greedy, __min, __max)); 4072e78f53d1SNikolas Klauser __s->first() = nullptr; 4073e78f53d1SNikolas Klauser __e1.release(); 4074e78f53d1SNikolas Klauser __end_->first() = new __repeat_one_loop<_CharT>(__e2.get()); 4075e78f53d1SNikolas Klauser __end_ = __e2->second(); 4076e78f53d1SNikolas Klauser __s->first() = __e2.release(); 4077e78f53d1SNikolas Klauser ++__loop_count_; 4078e78f53d1SNikolas Klauser} 4079e78f53d1SNikolas Klauser 4080e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 4081e78f53d1SNikolas Klauservoid basic_regex<_CharT, _Traits>::__push_char(value_type __c) { 4082e78f53d1SNikolas Klauser if (flags() & icase) 4083e78f53d1SNikolas Klauser __end_->first() = new __match_char_icase<_CharT, _Traits>(__traits_, __c, __end_->first()); 4084e78f53d1SNikolas Klauser else if (flags() & collate) 4085e78f53d1SNikolas Klauser __end_->first() = new __match_char_collate<_CharT, _Traits>(__traits_, __c, __end_->first()); 4086e78f53d1SNikolas Klauser else 4087e78f53d1SNikolas Klauser __end_->first() = new __match_char<_CharT>(__c, __end_->first()); 4088e78f53d1SNikolas Klauser __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first()); 4089e78f53d1SNikolas Klauser} 4090e78f53d1SNikolas Klauser 4091e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 4092e78f53d1SNikolas Klauservoid basic_regex<_CharT, _Traits>::__push_begin_marked_subexpression() { 4093e78f53d1SNikolas Klauser if (!(__flags_ & nosubs)) { 4094e78f53d1SNikolas Klauser __end_->first() = new __begin_marked_subexpression<_CharT>(++__marked_count_, __end_->first()); 4095e78f53d1SNikolas Klauser __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first()); 4096e78f53d1SNikolas Klauser } 4097e78f53d1SNikolas Klauser} 4098e78f53d1SNikolas Klauser 4099e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 4100e78f53d1SNikolas Klauservoid basic_regex<_CharT, _Traits>::__push_end_marked_subexpression(unsigned __sub) { 4101e78f53d1SNikolas Klauser if (!(__flags_ & nosubs)) { 4102e78f53d1SNikolas Klauser __end_->first() = new __end_marked_subexpression<_CharT>(__sub, __end_->first()); 4103e78f53d1SNikolas Klauser __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first()); 4104e78f53d1SNikolas Klauser } 4105e78f53d1SNikolas Klauser} 4106e78f53d1SNikolas Klauser 4107e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 4108e78f53d1SNikolas Klauservoid basic_regex<_CharT, _Traits>::__push_l_anchor() { 4109e78f53d1SNikolas Klauser __end_->first() = new __l_anchor_multiline<_CharT>(__use_multiline(), __end_->first()); 4110e78f53d1SNikolas Klauser __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first()); 4111e78f53d1SNikolas Klauser} 4112e78f53d1SNikolas Klauser 4113e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 4114e78f53d1SNikolas Klauservoid basic_regex<_CharT, _Traits>::__push_r_anchor() { 4115e78f53d1SNikolas Klauser __end_->first() = new __r_anchor_multiline<_CharT>(__use_multiline(), __end_->first()); 4116e78f53d1SNikolas Klauser __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first()); 4117e78f53d1SNikolas Klauser} 4118e78f53d1SNikolas Klauser 4119e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 4120e78f53d1SNikolas Klauservoid basic_regex<_CharT, _Traits>::__push_match_any() { 4121e78f53d1SNikolas Klauser __end_->first() = new __match_any<_CharT>(__end_->first()); 4122e78f53d1SNikolas Klauser __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first()); 4123e78f53d1SNikolas Klauser} 4124e78f53d1SNikolas Klauser 4125e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 4126e78f53d1SNikolas Klauservoid basic_regex<_CharT, _Traits>::__push_match_any_but_newline() { 4127e78f53d1SNikolas Klauser __end_->first() = new __match_any_but_newline<_CharT>(__end_->first()); 4128e78f53d1SNikolas Klauser __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first()); 4129e78f53d1SNikolas Klauser} 4130e78f53d1SNikolas Klauser 4131e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 4132e78f53d1SNikolas Klauservoid basic_regex<_CharT, _Traits>::__push_empty() { 4133e78f53d1SNikolas Klauser __end_->first() = new __empty_state<_CharT>(__end_->first()); 4134e78f53d1SNikolas Klauser __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first()); 4135e78f53d1SNikolas Klauser} 4136e78f53d1SNikolas Klauser 4137e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 4138e78f53d1SNikolas Klauservoid basic_regex<_CharT, _Traits>::__push_word_boundary(bool __invert) { 4139e78f53d1SNikolas Klauser __end_->first() = new __word_boundary<_CharT, _Traits>(__traits_, __invert, __end_->first()); 4140e78f53d1SNikolas Klauser __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first()); 4141e78f53d1SNikolas Klauser} 4142e78f53d1SNikolas Klauser 4143e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 4144e78f53d1SNikolas Klauservoid basic_regex<_CharT, _Traits>::__push_back_ref(int __i) { 4145e78f53d1SNikolas Klauser if (flags() & icase) 4146e78f53d1SNikolas Klauser __end_->first() = new __back_ref_icase<_CharT, _Traits>(__traits_, __i, __end_->first()); 4147e78f53d1SNikolas Klauser else if (flags() & collate) 4148e78f53d1SNikolas Klauser __end_->first() = new __back_ref_collate<_CharT, _Traits>(__traits_, __i, __end_->first()); 4149e78f53d1SNikolas Klauser else 4150e78f53d1SNikolas Klauser __end_->first() = new __back_ref<_CharT>(__i, __end_->first()); 4151e78f53d1SNikolas Klauser __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first()); 4152e78f53d1SNikolas Klauser} 4153e78f53d1SNikolas Klauser 4154e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 4155e78f53d1SNikolas Klauservoid basic_regex<_CharT, _Traits>::__push_alternation(__owns_one_state<_CharT>* __sa, __owns_one_state<_CharT>* __ea) { 4156e78f53d1SNikolas Klauser __sa->first() = new __alternate<_CharT>( 4157e78f53d1SNikolas Klauser static_cast<__owns_one_state<_CharT>*>(__sa->first()), static_cast<__owns_one_state<_CharT>*>(__ea->first())); 4158e78f53d1SNikolas Klauser __ea->first() = nullptr; 4159e78f53d1SNikolas Klauser __ea->first() = new __empty_state<_CharT>(__end_->first()); 4160e78f53d1SNikolas Klauser __end_->first() = nullptr; 4161e78f53d1SNikolas Klauser __end_->first() = new __empty_non_own_state<_CharT>(__ea->first()); 4162e78f53d1SNikolas Klauser __end_ = static_cast<__owns_one_state<_CharT>*>(__ea->first()); 4163e78f53d1SNikolas Klauser} 4164e78f53d1SNikolas Klauser 4165e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 4166e78f53d1SNikolas Klauser__bracket_expression<_CharT, _Traits>* basic_regex<_CharT, _Traits>::__start_matching_list(bool __negate) { 4167e78f53d1SNikolas Klauser __bracket_expression<_CharT, _Traits>* __r = new __bracket_expression<_CharT, _Traits>( 4168e78f53d1SNikolas Klauser __traits_, __end_->first(), __negate, __flags_ & icase, __flags_ & collate); 4169e78f53d1SNikolas Klauser __end_->first() = __r; 4170e78f53d1SNikolas Klauser __end_ = __r; 4171e78f53d1SNikolas Klauser return __r; 4172e78f53d1SNikolas Klauser} 4173e78f53d1SNikolas Klauser 4174e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 4175e78f53d1SNikolas Klauservoid basic_regex<_CharT, _Traits>::__push_lookahead(const basic_regex& __exp, bool __invert, unsigned __mexp) { 4176e78f53d1SNikolas Klauser __end_->first() = new __lookahead<_CharT, _Traits>(__exp, __invert, __end_->first(), __mexp); 4177e78f53d1SNikolas Klauser __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first()); 4178e78f53d1SNikolas Klauser} 4179e78f53d1SNikolas Klauser 4180e78f53d1SNikolas Klauser// sub_match 4181e78f53d1SNikolas Klauser 4182e78f53d1SNikolas Klausertypedef sub_match<const char*> csub_match; 4183e78f53d1SNikolas Klausertypedef sub_match<string::const_iterator> ssub_match; 4184e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS 4185e78f53d1SNikolas Klausertypedef sub_match<const wchar_t*> wcsub_match; 4186e78f53d1SNikolas Klausertypedef sub_match<wstring::const_iterator> wssub_match; 4187e78f53d1SNikolas Klauser#endif 4188e78f53d1SNikolas Klauser 4189e78f53d1SNikolas Klausertemplate <class _BidirectionalIterator> 4190e78f53d1SNikolas Klauserclass _LIBCPP_TEMPLATE_VIS _LIBCPP_PREFERRED_NAME(csub_match) 4191e78f53d1SNikolas Klauser _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wcsub_match)) _LIBCPP_PREFERRED_NAME(ssub_match) 4192e78f53d1SNikolas Klauser _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wssub_match)) sub_match 4193e78f53d1SNikolas Klauser : public pair<_BidirectionalIterator, _BidirectionalIterator> { 4194e78f53d1SNikolas Klauserpublic: 4195e78f53d1SNikolas Klauser typedef _BidirectionalIterator iterator; 4196e78f53d1SNikolas Klauser typedef typename iterator_traits<iterator>::value_type value_type; 4197e78f53d1SNikolas Klauser typedef typename iterator_traits<iterator>::difference_type difference_type; 4198e78f53d1SNikolas Klauser typedef basic_string<value_type> string_type; 4199e78f53d1SNikolas Klauser 4200e78f53d1SNikolas Klauser bool matched; 4201e78f53d1SNikolas Klauser 4202e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR sub_match() : matched() {} 4203e78f53d1SNikolas Klauser 4204e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI difference_type length() const { 4205e78f53d1SNikolas Klauser return matched ? std::distance(this->first, this->second) : 0; 4206e78f53d1SNikolas Klauser } 4207e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI string_type str() const { 4208e78f53d1SNikolas Klauser return matched ? string_type(this->first, this->second) : string_type(); 4209e78f53d1SNikolas Klauser } 4210e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI operator string_type() const { return str(); } 4211e78f53d1SNikolas Klauser 4212e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI int compare(const sub_match& __s) const { return str().compare(__s.str()); } 4213e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI int compare(const string_type& __s) const { return str().compare(__s); } 4214e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI int compare(const value_type* __s) const { return str().compare(__s); } 4215e78f53d1SNikolas Klauser 4216e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI void swap(sub_match& __s) _NOEXCEPT_(__is_nothrow_swappable_v<_BidirectionalIterator>) { 4217e78f53d1SNikolas Klauser this->pair<_BidirectionalIterator, _BidirectionalIterator>::swap(__s); 4218e78f53d1SNikolas Klauser std::swap(matched, __s.matched); 4219e78f53d1SNikolas Klauser } 4220e78f53d1SNikolas Klauser}; 4221e78f53d1SNikolas Klauser 4222e78f53d1SNikolas Klausertemplate <class _BiIter> 4223e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool operator==(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y) { 4224e78f53d1SNikolas Klauser return __x.compare(__y) == 0; 4225e78f53d1SNikolas Klauser} 4226e78f53d1SNikolas Klauser 4227e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 20 4228e78f53d1SNikolas Klausertemplate <class _BiIter> 4229e78f53d1SNikolas Klauserusing __sub_match_cat = compare_three_way_result_t<basic_string<typename iterator_traits<_BiIter>::value_type>>; 4230e78f53d1SNikolas Klauser 4231e78f53d1SNikolas Klausertemplate <class _BiIter> 4232e78f53d1SNikolas Klauser_LIBCPP_HIDE_FROM_ABI auto operator<=>(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y) { 4233e78f53d1SNikolas Klauser return static_cast<__sub_match_cat<_BiIter>>(__x.compare(__y) <=> 0); 4234e78f53d1SNikolas Klauser} 4235e78f53d1SNikolas Klauser#else // _LIBCPP_STD_VER >= 20 4236e78f53d1SNikolas Klausertemplate <class _BiIter> 4237e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool operator!=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y) { 4238e78f53d1SNikolas Klauser return !(__x == __y); 4239e78f53d1SNikolas Klauser} 4240e78f53d1SNikolas Klauser 4241e78f53d1SNikolas Klausertemplate <class _BiIter> 4242e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool operator<(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y) { 4243e78f53d1SNikolas Klauser return __x.compare(__y) < 0; 4244e78f53d1SNikolas Klauser} 4245e78f53d1SNikolas Klauser 4246e78f53d1SNikolas Klausertemplate <class _BiIter> 4247e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool operator<=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y) { 4248e78f53d1SNikolas Klauser return !(__y < __x); 4249e78f53d1SNikolas Klauser} 4250e78f53d1SNikolas Klauser 4251e78f53d1SNikolas Klausertemplate <class _BiIter> 4252e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool operator>=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y) { 4253e78f53d1SNikolas Klauser return !(__x < __y); 4254e78f53d1SNikolas Klauser} 4255e78f53d1SNikolas Klauser 4256e78f53d1SNikolas Klausertemplate <class _BiIter> 4257e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool operator>(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y) { 4258e78f53d1SNikolas Klauser return __y < __x; 4259e78f53d1SNikolas Klauser} 4260e78f53d1SNikolas Klauser 4261e78f53d1SNikolas Klausertemplate <class _BiIter, class _ST, class _SA> 4262e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4263e78f53d1SNikolas Klauseroperator==(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x, 4264e78f53d1SNikolas Klauser const sub_match<_BiIter>& __y) { 4265e78f53d1SNikolas Klauser return __y.compare(typename sub_match<_BiIter>::string_type(__x.data(), __x.size())) == 0; 4266e78f53d1SNikolas Klauser} 4267e78f53d1SNikolas Klauser 4268e78f53d1SNikolas Klausertemplate <class _BiIter, class _ST, class _SA> 4269e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4270e78f53d1SNikolas Klauseroperator!=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x, 4271e78f53d1SNikolas Klauser const sub_match<_BiIter>& __y) { 4272e78f53d1SNikolas Klauser return !(__x == __y); 4273e78f53d1SNikolas Klauser} 4274e78f53d1SNikolas Klauser 4275e78f53d1SNikolas Klausertemplate <class _BiIter, class _ST, class _SA> 4276e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4277e78f53d1SNikolas Klauseroperator<(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x, 4278e78f53d1SNikolas Klauser const sub_match<_BiIter>& __y) { 4279e78f53d1SNikolas Klauser return __y.compare(typename sub_match<_BiIter>::string_type(__x.data(), __x.size())) > 0; 4280e78f53d1SNikolas Klauser} 4281e78f53d1SNikolas Klauser 4282e78f53d1SNikolas Klausertemplate <class _BiIter, class _ST, class _SA> 4283e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4284e78f53d1SNikolas Klauseroperator>(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x, 4285e78f53d1SNikolas Klauser const sub_match<_BiIter>& __y) { 4286e78f53d1SNikolas Klauser return __y < __x; 4287e78f53d1SNikolas Klauser} 4288e78f53d1SNikolas Klauser 4289e78f53d1SNikolas Klausertemplate <class _BiIter, class _ST, class _SA> 4290e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4291e78f53d1SNikolas Klauseroperator>=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x, 4292e78f53d1SNikolas Klauser const sub_match<_BiIter>& __y) { 4293e78f53d1SNikolas Klauser return !(__x < __y); 4294e78f53d1SNikolas Klauser} 4295e78f53d1SNikolas Klauser 4296e78f53d1SNikolas Klausertemplate <class _BiIter, class _ST, class _SA> 4297e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4298e78f53d1SNikolas Klauseroperator<=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x, 4299e78f53d1SNikolas Klauser const sub_match<_BiIter>& __y) { 4300e78f53d1SNikolas Klauser return !(__y < __x); 4301e78f53d1SNikolas Klauser} 4302e78f53d1SNikolas Klauser#endif // _LIBCPP_STD_VER >= 20 4303e78f53d1SNikolas Klauser 4304e78f53d1SNikolas Klausertemplate <class _BiIter, class _ST, class _SA> 4305e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4306e78f53d1SNikolas Klauseroperator==(const sub_match<_BiIter>& __x, 4307e78f53d1SNikolas Klauser const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y) { 4308e78f53d1SNikolas Klauser return __x.compare(typename sub_match<_BiIter>::string_type(__y.data(), __y.size())) == 0; 4309e78f53d1SNikolas Klauser} 4310e78f53d1SNikolas Klauser 4311e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 20 4312e78f53d1SNikolas Klausertemplate <class _BiIter, class _ST, class _SA> 4313e78f53d1SNikolas Klauser_LIBCPP_HIDE_FROM_ABI auto 4314e78f53d1SNikolas Klauseroperator<=>(const sub_match<_BiIter>& __x, 4315e78f53d1SNikolas Klauser const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y) { 4316e78f53d1SNikolas Klauser return static_cast<__sub_match_cat<_BiIter>>( 4317e78f53d1SNikolas Klauser __x.compare(typename sub_match<_BiIter>::string_type(__y.data(), __y.size())) <=> 0); 4318e78f53d1SNikolas Klauser} 4319e78f53d1SNikolas Klauser#else // _LIBCPP_STD_VER >= 20 4320e78f53d1SNikolas Klausertemplate <class _BiIter, class _ST, class _SA> 4321e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4322e78f53d1SNikolas Klauseroperator!=(const sub_match<_BiIter>& __x, 4323e78f53d1SNikolas Klauser const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y) { 4324e78f53d1SNikolas Klauser return !(__x == __y); 4325e78f53d1SNikolas Klauser} 4326e78f53d1SNikolas Klauser 4327e78f53d1SNikolas Klausertemplate <class _BiIter, class _ST, class _SA> 4328e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4329e78f53d1SNikolas Klauseroperator<(const sub_match<_BiIter>& __x, 4330e78f53d1SNikolas Klauser const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y) { 4331e78f53d1SNikolas Klauser return __x.compare(typename sub_match<_BiIter>::string_type(__y.data(), __y.size())) < 0; 4332e78f53d1SNikolas Klauser} 4333e78f53d1SNikolas Klauser 4334e78f53d1SNikolas Klausertemplate <class _BiIter, class _ST, class _SA> 4335e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4336e78f53d1SNikolas Klauseroperator>(const sub_match<_BiIter>& __x, 4337e78f53d1SNikolas Klauser const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y) { 4338e78f53d1SNikolas Klauser return __y < __x; 4339e78f53d1SNikolas Klauser} 4340e78f53d1SNikolas Klauser 4341e78f53d1SNikolas Klausertemplate <class _BiIter, class _ST, class _SA> 4342e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4343e78f53d1SNikolas Klauseroperator>=(const sub_match<_BiIter>& __x, 4344e78f53d1SNikolas Klauser const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y) { 4345e78f53d1SNikolas Klauser return !(__x < __y); 4346e78f53d1SNikolas Klauser} 4347e78f53d1SNikolas Klauser 4348e78f53d1SNikolas Klausertemplate <class _BiIter, class _ST, class _SA> 4349e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4350e78f53d1SNikolas Klauseroperator<=(const sub_match<_BiIter>& __x, 4351e78f53d1SNikolas Klauser const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y) { 4352e78f53d1SNikolas Klauser return !(__y < __x); 4353e78f53d1SNikolas Klauser} 4354e78f53d1SNikolas Klauser 4355e78f53d1SNikolas Klausertemplate <class _BiIter> 4356e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4357e78f53d1SNikolas Klauseroperator==(typename iterator_traits<_BiIter>::value_type const* __x, const sub_match<_BiIter>& __y) { 4358e78f53d1SNikolas Klauser return __y.compare(__x) == 0; 4359e78f53d1SNikolas Klauser} 4360e78f53d1SNikolas Klauser 4361e78f53d1SNikolas Klausertemplate <class _BiIter> 4362e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4363e78f53d1SNikolas Klauseroperator!=(typename iterator_traits<_BiIter>::value_type const* __x, const sub_match<_BiIter>& __y) { 4364e78f53d1SNikolas Klauser return !(__x == __y); 4365e78f53d1SNikolas Klauser} 4366e78f53d1SNikolas Klauser 4367e78f53d1SNikolas Klausertemplate <class _BiIter> 4368e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4369e78f53d1SNikolas Klauseroperator<(typename iterator_traits<_BiIter>::value_type const* __x, const sub_match<_BiIter>& __y) { 4370e78f53d1SNikolas Klauser return __y.compare(__x) > 0; 4371e78f53d1SNikolas Klauser} 4372e78f53d1SNikolas Klauser 4373e78f53d1SNikolas Klausertemplate <class _BiIter> 4374e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4375e78f53d1SNikolas Klauseroperator>(typename iterator_traits<_BiIter>::value_type const* __x, const sub_match<_BiIter>& __y) { 4376e78f53d1SNikolas Klauser return __y < __x; 4377e78f53d1SNikolas Klauser} 4378e78f53d1SNikolas Klauser 4379e78f53d1SNikolas Klausertemplate <class _BiIter> 4380e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4381e78f53d1SNikolas Klauseroperator>=(typename iterator_traits<_BiIter>::value_type const* __x, const sub_match<_BiIter>& __y) { 4382e78f53d1SNikolas Klauser return !(__x < __y); 4383e78f53d1SNikolas Klauser} 4384e78f53d1SNikolas Klauser 4385e78f53d1SNikolas Klausertemplate <class _BiIter> 4386e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4387e78f53d1SNikolas Klauseroperator<=(typename iterator_traits<_BiIter>::value_type const* __x, const sub_match<_BiIter>& __y) { 4388e78f53d1SNikolas Klauser return !(__y < __x); 4389e78f53d1SNikolas Klauser} 4390e78f53d1SNikolas Klauser#endif // _LIBCPP_STD_VER >= 20 4391e78f53d1SNikolas Klauser 4392e78f53d1SNikolas Klausertemplate <class _BiIter> 4393e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4394e78f53d1SNikolas Klauseroperator==(const sub_match<_BiIter>& __x, typename iterator_traits<_BiIter>::value_type const* __y) { 4395e78f53d1SNikolas Klauser return __x.compare(__y) == 0; 4396e78f53d1SNikolas Klauser} 4397e78f53d1SNikolas Klauser 4398e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 20 4399e78f53d1SNikolas Klausertemplate <class _BiIter> 4400e78f53d1SNikolas Klauser_LIBCPP_HIDE_FROM_ABI auto 4401e78f53d1SNikolas Klauseroperator<=>(const sub_match<_BiIter>& __x, typename iterator_traits<_BiIter>::value_type const* __y) { 4402e78f53d1SNikolas Klauser return static_cast<__sub_match_cat<_BiIter>>(__x.compare(__y) <=> 0); 4403e78f53d1SNikolas Klauser} 4404e78f53d1SNikolas Klauser#else // _LIBCPP_STD_VER >= 20 4405e78f53d1SNikolas Klausertemplate <class _BiIter> 4406e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4407e78f53d1SNikolas Klauseroperator!=(const sub_match<_BiIter>& __x, typename iterator_traits<_BiIter>::value_type const* __y) { 4408e78f53d1SNikolas Klauser return !(__x == __y); 4409e78f53d1SNikolas Klauser} 4410e78f53d1SNikolas Klauser 4411e78f53d1SNikolas Klausertemplate <class _BiIter> 4412e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4413e78f53d1SNikolas Klauseroperator<(const sub_match<_BiIter>& __x, typename iterator_traits<_BiIter>::value_type const* __y) { 4414e78f53d1SNikolas Klauser return __x.compare(__y) < 0; 4415e78f53d1SNikolas Klauser} 4416e78f53d1SNikolas Klauser 4417e78f53d1SNikolas Klausertemplate <class _BiIter> 4418e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4419e78f53d1SNikolas Klauseroperator>(const sub_match<_BiIter>& __x, typename iterator_traits<_BiIter>::value_type const* __y) { 4420e78f53d1SNikolas Klauser return __y < __x; 4421e78f53d1SNikolas Klauser} 4422e78f53d1SNikolas Klauser 4423e78f53d1SNikolas Klausertemplate <class _BiIter> 4424e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4425e78f53d1SNikolas Klauseroperator>=(const sub_match<_BiIter>& __x, typename iterator_traits<_BiIter>::value_type const* __y) { 4426e78f53d1SNikolas Klauser return !(__x < __y); 4427e78f53d1SNikolas Klauser} 4428e78f53d1SNikolas Klauser 4429e78f53d1SNikolas Klausertemplate <class _BiIter> 4430e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4431e78f53d1SNikolas Klauseroperator<=(const sub_match<_BiIter>& __x, typename iterator_traits<_BiIter>::value_type const* __y) { 4432e78f53d1SNikolas Klauser return !(__y < __x); 4433e78f53d1SNikolas Klauser} 4434e78f53d1SNikolas Klauser 4435e78f53d1SNikolas Klausertemplate <class _BiIter> 4436e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4437e78f53d1SNikolas Klauseroperator==(typename iterator_traits<_BiIter>::value_type const& __x, const sub_match<_BiIter>& __y) { 4438e78f53d1SNikolas Klauser typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type; 4439e78f53d1SNikolas Klauser return __y.compare(string_type(1, __x)) == 0; 4440e78f53d1SNikolas Klauser} 4441e78f53d1SNikolas Klauser 4442e78f53d1SNikolas Klausertemplate <class _BiIter> 4443e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4444e78f53d1SNikolas Klauseroperator!=(typename iterator_traits<_BiIter>::value_type const& __x, const sub_match<_BiIter>& __y) { 4445e78f53d1SNikolas Klauser return !(__x == __y); 4446e78f53d1SNikolas Klauser} 4447e78f53d1SNikolas Klauser 4448e78f53d1SNikolas Klausertemplate <class _BiIter> 4449e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4450e78f53d1SNikolas Klauseroperator<(typename iterator_traits<_BiIter>::value_type const& __x, const sub_match<_BiIter>& __y) { 4451e78f53d1SNikolas Klauser typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type; 4452e78f53d1SNikolas Klauser return __y.compare(string_type(1, __x)) > 0; 4453e78f53d1SNikolas Klauser} 4454e78f53d1SNikolas Klauser 4455e78f53d1SNikolas Klausertemplate <class _BiIter> 4456e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4457e78f53d1SNikolas Klauseroperator>(typename iterator_traits<_BiIter>::value_type const& __x, const sub_match<_BiIter>& __y) { 4458e78f53d1SNikolas Klauser return __y < __x; 4459e78f53d1SNikolas Klauser} 4460e78f53d1SNikolas Klauser 4461e78f53d1SNikolas Klausertemplate <class _BiIter> 4462e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4463e78f53d1SNikolas Klauseroperator>=(typename iterator_traits<_BiIter>::value_type const& __x, const sub_match<_BiIter>& __y) { 4464e78f53d1SNikolas Klauser return !(__x < __y); 4465e78f53d1SNikolas Klauser} 4466e78f53d1SNikolas Klauser 4467e78f53d1SNikolas Klausertemplate <class _BiIter> 4468e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4469e78f53d1SNikolas Klauseroperator<=(typename iterator_traits<_BiIter>::value_type const& __x, const sub_match<_BiIter>& __y) { 4470e78f53d1SNikolas Klauser return !(__y < __x); 4471e78f53d1SNikolas Klauser} 4472e78f53d1SNikolas Klauser#endif // _LIBCPP_STD_VER >= 20 4473e78f53d1SNikolas Klauser 4474e78f53d1SNikolas Klausertemplate <class _BiIter> 4475e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4476e78f53d1SNikolas Klauseroperator==(const sub_match<_BiIter>& __x, typename iterator_traits<_BiIter>::value_type const& __y) { 4477e78f53d1SNikolas Klauser typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type; 4478e78f53d1SNikolas Klauser return __x.compare(string_type(1, __y)) == 0; 4479e78f53d1SNikolas Klauser} 4480e78f53d1SNikolas Klauser 4481e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 20 4482e78f53d1SNikolas Klausertemplate <class _BiIter> 4483e78f53d1SNikolas Klauser_LIBCPP_HIDE_FROM_ABI auto 4484e78f53d1SNikolas Klauseroperator<=>(const sub_match<_BiIter>& __x, typename iterator_traits<_BiIter>::value_type const& __y) { 4485e78f53d1SNikolas Klauser using string_type = basic_string<typename iterator_traits<_BiIter>::value_type>; 4486e78f53d1SNikolas Klauser return static_cast<__sub_match_cat<_BiIter>>(__x.compare(string_type(1, __y)) <=> 0); 4487e78f53d1SNikolas Klauser} 4488e78f53d1SNikolas Klauser#else // _LIBCPP_STD_VER >= 20 4489e78f53d1SNikolas Klausertemplate <class _BiIter> 4490e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4491e78f53d1SNikolas Klauseroperator!=(const sub_match<_BiIter>& __x, typename iterator_traits<_BiIter>::value_type const& __y) { 4492e78f53d1SNikolas Klauser return !(__x == __y); 4493e78f53d1SNikolas Klauser} 4494e78f53d1SNikolas Klauser 4495e78f53d1SNikolas Klausertemplate <class _BiIter> 4496e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4497e78f53d1SNikolas Klauseroperator<(const sub_match<_BiIter>& __x, typename iterator_traits<_BiIter>::value_type const& __y) { 4498e78f53d1SNikolas Klauser typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type; 4499e78f53d1SNikolas Klauser return __x.compare(string_type(1, __y)) < 0; 4500e78f53d1SNikolas Klauser} 4501e78f53d1SNikolas Klauser 4502e78f53d1SNikolas Klausertemplate <class _BiIter> 4503e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4504e78f53d1SNikolas Klauseroperator>(const sub_match<_BiIter>& __x, typename iterator_traits<_BiIter>::value_type const& __y) { 4505e78f53d1SNikolas Klauser return __y < __x; 4506e78f53d1SNikolas Klauser} 4507e78f53d1SNikolas Klauser 4508e78f53d1SNikolas Klausertemplate <class _BiIter> 4509e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4510e78f53d1SNikolas Klauseroperator>=(const sub_match<_BiIter>& __x, typename iterator_traits<_BiIter>::value_type const& __y) { 4511e78f53d1SNikolas Klauser return !(__x < __y); 4512e78f53d1SNikolas Klauser} 4513e78f53d1SNikolas Klauser 4514e78f53d1SNikolas Klausertemplate <class _BiIter> 4515e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 4516e78f53d1SNikolas Klauseroperator<=(const sub_match<_BiIter>& __x, typename iterator_traits<_BiIter>::value_type const& __y) { 4517e78f53d1SNikolas Klauser return !(__y < __x); 4518e78f53d1SNikolas Klauser} 4519e78f53d1SNikolas Klauser#endif // _LIBCPP_STD_VER >= 20 4520e78f53d1SNikolas Klauser 4521e78f53d1SNikolas Klausertemplate <class _CharT, class _ST, class _BiIter> 4522e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _ST>& 4523e78f53d1SNikolas Klauseroperator<<(basic_ostream<_CharT, _ST>& __os, const sub_match<_BiIter>& __m) { 4524e78f53d1SNikolas Klauser return __os << __m.str(); 4525e78f53d1SNikolas Klauser} 4526e78f53d1SNikolas Klauser 4527e78f53d1SNikolas Klausertypedef match_results<const char*> cmatch; 4528e78f53d1SNikolas Klausertypedef match_results<string::const_iterator> smatch; 4529e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS 4530e78f53d1SNikolas Klausertypedef match_results<const wchar_t*> wcmatch; 4531e78f53d1SNikolas Klausertypedef match_results<wstring::const_iterator> wsmatch; 4532e78f53d1SNikolas Klauser#endif 4533e78f53d1SNikolas Klauser 4534e78f53d1SNikolas Klausertemplate <class _BidirectionalIterator, class _Allocator> 4535e78f53d1SNikolas Klauserclass _LIBCPP_TEMPLATE_VIS _LIBCPP_PREFERRED_NAME(cmatch) _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wcmatch)) 4536e78f53d1SNikolas Klauser _LIBCPP_PREFERRED_NAME(smatch) _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wsmatch)) match_results { 4537e78f53d1SNikolas Klauserpublic: 4538e78f53d1SNikolas Klauser typedef _Allocator allocator_type; 4539e78f53d1SNikolas Klauser typedef sub_match<_BidirectionalIterator> value_type; 4540e78f53d1SNikolas Klauser 4541e78f53d1SNikolas Klauserprivate: 4542e78f53d1SNikolas Klauser typedef vector<value_type, allocator_type> __container_type; 4543e78f53d1SNikolas Klauser 4544e78f53d1SNikolas Klauser __container_type __matches_; 4545e78f53d1SNikolas Klauser value_type __unmatched_; 4546e78f53d1SNikolas Klauser value_type __prefix_; 4547e78f53d1SNikolas Klauser value_type __suffix_; 4548e78f53d1SNikolas Klauser bool __ready_; 4549e78f53d1SNikolas Klauser 4550e78f53d1SNikolas Klauserpublic: 4551e78f53d1SNikolas Klauser _BidirectionalIterator __position_start_; 4552e78f53d1SNikolas Klauser typedef const value_type& const_reference; 4553e78f53d1SNikolas Klauser typedef value_type& reference; 4554e78f53d1SNikolas Klauser typedef typename __container_type::const_iterator const_iterator; 4555e78f53d1SNikolas Klauser typedef const_iterator iterator; 4556e78f53d1SNikolas Klauser typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type; 4557e78f53d1SNikolas Klauser typedef typename allocator_traits<allocator_type>::size_type size_type; 4558e78f53d1SNikolas Klauser typedef typename iterator_traits<_BidirectionalIterator>::value_type char_type; 4559e78f53d1SNikolas Klauser typedef basic_string<char_type> string_type; 4560e78f53d1SNikolas Klauser 4561e78f53d1SNikolas Klauser // construct/copy/destroy: 4562e78f53d1SNikolas Klauser#ifndef _LIBCPP_CXX03_LANG 4563e78f53d1SNikolas Klauser match_results() : match_results(allocator_type()) {} 4564e78f53d1SNikolas Klauser explicit match_results(const allocator_type& __a); 4565e78f53d1SNikolas Klauser#else 4566e78f53d1SNikolas Klauser explicit match_results(const allocator_type& __a = allocator_type()); 4567e78f53d1SNikolas Klauser#endif 4568e78f53d1SNikolas Klauser 4569e78f53d1SNikolas Klauser // match_results(const match_results&) = default; 4570e78f53d1SNikolas Klauser // match_results& operator=(const match_results&) = default; 4571e78f53d1SNikolas Klauser // match_results(match_results&& __m) = default; 4572e78f53d1SNikolas Klauser // match_results& operator=(match_results&& __m) = default; 4573e78f53d1SNikolas Klauser // ~match_results() = default; 4574e78f53d1SNikolas Klauser 4575e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI bool ready() const { return __ready_; } 4576e78f53d1SNikolas Klauser 4577e78f53d1SNikolas Klauser // size: 4578e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI size_type size() const _NOEXCEPT { return __matches_.size(); } 4579e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI size_type max_size() const _NOEXCEPT { return __matches_.max_size(); } 4580e78f53d1SNikolas Klauser _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI bool empty() const _NOEXCEPT { return size() == 0; } 4581e78f53d1SNikolas Klauser 4582e78f53d1SNikolas Klauser // element access: 4583e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI difference_type length(size_type __sub = 0) const { 4584e78f53d1SNikolas Klauser // If the match results are not ready, this will return `0`. 4585e78f53d1SNikolas Klauser _LIBCPP_ASSERT_PEDANTIC(ready(), "match_results::length() called when not ready"); 4586e78f53d1SNikolas Klauser return (*this)[__sub].length(); 4587e78f53d1SNikolas Klauser } 4588e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI difference_type position(size_type __sub = 0) const { 4589e78f53d1SNikolas Klauser // If the match results are not ready, this will return the result of subtracting two default-constructed iterators 4590e78f53d1SNikolas Klauser // (which is typically a well-defined operation). 4591e78f53d1SNikolas Klauser _LIBCPP_ASSERT_PEDANTIC(ready(), "match_results::position() called when not ready"); 4592e78f53d1SNikolas Klauser return std::distance(__position_start_, (*this)[__sub].first); 4593e78f53d1SNikolas Klauser } 4594e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI string_type str(size_type __sub = 0) const { 4595e78f53d1SNikolas Klauser // If the match results are not ready, this will return an empty string. 4596e78f53d1SNikolas Klauser _LIBCPP_ASSERT_PEDANTIC(ready(), "match_results::str() called when not ready"); 4597e78f53d1SNikolas Klauser return (*this)[__sub].str(); 4598e78f53d1SNikolas Klauser } 4599e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI const_reference operator[](size_type __n) const { 4600e78f53d1SNikolas Klauser // If the match results are not ready, this call will be equivalent to calling this function with `__n >= size()`, 4601e78f53d1SNikolas Klauser // returning an empty subrange. 4602e78f53d1SNikolas Klauser _LIBCPP_ASSERT_PEDANTIC(ready(), "match_results::operator[]() called when not ready"); 4603e78f53d1SNikolas Klauser return __n < __matches_.size() ? __matches_[__n] : __unmatched_; 4604e78f53d1SNikolas Klauser } 4605e78f53d1SNikolas Klauser 4606e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI const_reference prefix() const { 4607e78f53d1SNikolas Klauser // If the match results are not ready, this will return a default-constructed empty `__suffix_`. 4608e78f53d1SNikolas Klauser _LIBCPP_ASSERT_PEDANTIC(ready(), "match_results::prefix() called when not ready"); 4609e78f53d1SNikolas Klauser return __prefix_; 4610e78f53d1SNikolas Klauser } 4611e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI const_reference suffix() const { 4612e78f53d1SNikolas Klauser // If the match results are not ready, this will return a default-constructed empty `__suffix_`. 4613e78f53d1SNikolas Klauser _LIBCPP_ASSERT_PEDANTIC(ready(), "match_results::suffix() called when not ready"); 4614e78f53d1SNikolas Klauser return __suffix_; 4615e78f53d1SNikolas Klauser } 4616e78f53d1SNikolas Klauser 4617e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI const_iterator begin() const { return empty() ? __matches_.end() : __matches_.begin(); } 4618e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI const_iterator end() const { return __matches_.end(); } 4619e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI const_iterator cbegin() const { return empty() ? __matches_.end() : __matches_.begin(); } 4620e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI const_iterator cend() const { return __matches_.end(); } 4621e78f53d1SNikolas Klauser 4622e78f53d1SNikolas Klauser // format: 4623e78f53d1SNikolas Klauser template <class _OutputIter> 4624e78f53d1SNikolas Klauser _OutputIter format(_OutputIter __output_iter, 4625e78f53d1SNikolas Klauser const char_type* __fmt_first, 4626e78f53d1SNikolas Klauser const char_type* __fmt_last, 4627e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags = regex_constants::format_default) const; 4628e78f53d1SNikolas Klauser template <class _OutputIter, class _ST, class _SA> 4629e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _OutputIter 4630e78f53d1SNikolas Klauser format(_OutputIter __output_iter, 4631e78f53d1SNikolas Klauser const basic_string<char_type, _ST, _SA>& __fmt, 4632e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags = regex_constants::format_default) const { 4633e78f53d1SNikolas Klauser return format(__output_iter, __fmt.data(), __fmt.data() + __fmt.size(), __flags); 4634e78f53d1SNikolas Klauser } 4635e78f53d1SNikolas Klauser template <class _ST, class _SA> 4636e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI basic_string<char_type, _ST, _SA> 4637e78f53d1SNikolas Klauser format(const basic_string<char_type, _ST, _SA>& __fmt, 4638e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags = regex_constants::format_default) const { 4639e78f53d1SNikolas Klauser basic_string<char_type, _ST, _SA> __r; 4640e78f53d1SNikolas Klauser format(std::back_inserter(__r), __fmt.data(), __fmt.data() + __fmt.size(), __flags); 4641e78f53d1SNikolas Klauser return __r; 4642e78f53d1SNikolas Klauser } 4643e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI string_type 4644e78f53d1SNikolas Klauser format(const char_type* __fmt, regex_constants::match_flag_type __flags = regex_constants::format_default) const { 4645e78f53d1SNikolas Klauser string_type __r; 4646e78f53d1SNikolas Klauser format(std::back_inserter(__r), __fmt, __fmt + char_traits<char_type>::length(__fmt), __flags); 4647e78f53d1SNikolas Klauser return __r; 4648e78f53d1SNikolas Klauser } 4649e78f53d1SNikolas Klauser 4650e78f53d1SNikolas Klauser // allocator: 4651e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI allocator_type get_allocator() const { return __matches_.get_allocator(); } 4652e78f53d1SNikolas Klauser 4653e78f53d1SNikolas Klauser // swap: 4654e78f53d1SNikolas Klauser void swap(match_results& __m); 4655e78f53d1SNikolas Klauser 4656e78f53d1SNikolas Klauser template <class _Bp, class _Ap> 4657e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI void 4658e78f53d1SNikolas Klauser __assign(_BidirectionalIterator __f, 4659e78f53d1SNikolas Klauser _BidirectionalIterator __l, 4660e78f53d1SNikolas Klauser const match_results<_Bp, _Ap>& __m, 4661e78f53d1SNikolas Klauser bool __no_update_pos) { 4662e78f53d1SNikolas Klauser _Bp __mf = __m.prefix().first; 4663e78f53d1SNikolas Klauser __matches_.resize(__m.size()); 4664e78f53d1SNikolas Klauser for (size_type __i = 0; __i < __matches_.size(); ++__i) { 4665e78f53d1SNikolas Klauser __matches_[__i].first = std::next(__f, std::distance(__mf, __m[__i].first)); 4666e78f53d1SNikolas Klauser __matches_[__i].second = std::next(__f, std::distance(__mf, __m[__i].second)); 4667e78f53d1SNikolas Klauser __matches_[__i].matched = __m[__i].matched; 4668e78f53d1SNikolas Klauser } 4669e78f53d1SNikolas Klauser __unmatched_.first = __l; 4670e78f53d1SNikolas Klauser __unmatched_.second = __l; 4671e78f53d1SNikolas Klauser __unmatched_.matched = false; 4672e78f53d1SNikolas Klauser __prefix_.first = std::next(__f, std::distance(__mf, __m.prefix().first)); 4673e78f53d1SNikolas Klauser __prefix_.second = std::next(__f, std::distance(__mf, __m.prefix().second)); 4674e78f53d1SNikolas Klauser __prefix_.matched = __m.prefix().matched; 4675e78f53d1SNikolas Klauser __suffix_.first = std::next(__f, std::distance(__mf, __m.suffix().first)); 4676e78f53d1SNikolas Klauser __suffix_.second = std::next(__f, std::distance(__mf, __m.suffix().second)); 4677e78f53d1SNikolas Klauser __suffix_.matched = __m.suffix().matched; 4678e78f53d1SNikolas Klauser if (!__no_update_pos) 4679e78f53d1SNikolas Klauser __position_start_ = __prefix_.first; 4680e78f53d1SNikolas Klauser __ready_ = __m.ready(); 4681e78f53d1SNikolas Klauser } 4682e78f53d1SNikolas Klauser 4683e78f53d1SNikolas Klauserprivate: 4684e78f53d1SNikolas Klauser void __init(unsigned __s, _BidirectionalIterator __f, _BidirectionalIterator __l, bool __no_update_pos = false); 4685e78f53d1SNikolas Klauser 4686e78f53d1SNikolas Klauser template <class, class> 4687e78f53d1SNikolas Klauser friend class basic_regex; 4688e78f53d1SNikolas Klauser 4689e78f53d1SNikolas Klauser template <class _Bp, class _Ap, class _Cp, class _Tp> 4690e78f53d1SNikolas Klauser friend bool 4691e78f53d1SNikolas Klauser regex_match(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type); 4692e78f53d1SNikolas Klauser 4693e78f53d1SNikolas Klauser template <class _Bp, class _Ap> 4694e78f53d1SNikolas Klauser friend bool operator==(const match_results<_Bp, _Ap>&, const match_results<_Bp, _Ap>&); 4695e78f53d1SNikolas Klauser 4696e78f53d1SNikolas Klauser template <class, class> 4697e78f53d1SNikolas Klauser friend class __lookahead; 4698e78f53d1SNikolas Klauser 4699e78f53d1SNikolas Klauser template <class, class, class> 4700e78f53d1SNikolas Klauser friend class regex_iterator; 4701e78f53d1SNikolas Klauser}; 4702e78f53d1SNikolas Klauser 4703e78f53d1SNikolas Klausertemplate <class _BidirectionalIterator, class _Allocator> 4704e78f53d1SNikolas Klausermatch_results<_BidirectionalIterator, _Allocator>::match_results(const allocator_type& __a) 4705e78f53d1SNikolas Klauser : __matches_(__a), __unmatched_(), __prefix_(), __suffix_(), __ready_(false), __position_start_() {} 4706e78f53d1SNikolas Klauser 4707e78f53d1SNikolas Klausertemplate <class _BidirectionalIterator, class _Allocator> 4708e78f53d1SNikolas Klauservoid match_results<_BidirectionalIterator, _Allocator>::__init( 4709e78f53d1SNikolas Klauser unsigned __s, _BidirectionalIterator __f, _BidirectionalIterator __l, bool __no_update_pos) { 4710e78f53d1SNikolas Klauser __unmatched_.first = __l; 4711e78f53d1SNikolas Klauser __unmatched_.second = __l; 4712e78f53d1SNikolas Klauser __unmatched_.matched = false; 4713e78f53d1SNikolas Klauser __matches_.assign(__s, __unmatched_); 4714e78f53d1SNikolas Klauser __prefix_.first = __f; 4715e78f53d1SNikolas Klauser __prefix_.second = __f; 4716e78f53d1SNikolas Klauser __prefix_.matched = false; 4717e78f53d1SNikolas Klauser __suffix_ = __unmatched_; 4718e78f53d1SNikolas Klauser if (!__no_update_pos) 4719e78f53d1SNikolas Klauser __position_start_ = __prefix_.first; 4720e78f53d1SNikolas Klauser __ready_ = true; 4721e78f53d1SNikolas Klauser} 4722e78f53d1SNikolas Klauser 4723e78f53d1SNikolas Klausertemplate <class _BidirectionalIterator, class _Allocator> 4724e78f53d1SNikolas Klausertemplate <class _OutputIter> 4725e78f53d1SNikolas Klauser_OutputIter match_results<_BidirectionalIterator, _Allocator>::format( 4726e78f53d1SNikolas Klauser _OutputIter __output_iter, 4727e78f53d1SNikolas Klauser const char_type* __fmt_first, 4728e78f53d1SNikolas Klauser const char_type* __fmt_last, 4729e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags) const { 4730e78f53d1SNikolas Klauser // Note: this duplicates a check in `vector::operator[]` but provides a better error message. 4731e78f53d1SNikolas Klauser _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(ready(), "match_results::format() called when not ready"); 4732e78f53d1SNikolas Klauser if (__flags & regex_constants::format_sed) { 4733e78f53d1SNikolas Klauser for (; __fmt_first != __fmt_last; ++__fmt_first) { 4734e78f53d1SNikolas Klauser if (*__fmt_first == '&') 4735e78f53d1SNikolas Klauser __output_iter = std::copy(__matches_[0].first, __matches_[0].second, __output_iter); 4736e78f53d1SNikolas Klauser else if (*__fmt_first == '\\' && __fmt_first + 1 != __fmt_last) { 4737e78f53d1SNikolas Klauser ++__fmt_first; 4738e78f53d1SNikolas Klauser if ('0' <= *__fmt_first && *__fmt_first <= '9') { 4739e78f53d1SNikolas Klauser size_t __i = *__fmt_first - '0'; 4740e78f53d1SNikolas Klauser __output_iter = std::copy((*this)[__i].first, (*this)[__i].second, __output_iter); 4741e78f53d1SNikolas Klauser } else { 4742e78f53d1SNikolas Klauser *__output_iter = *__fmt_first; 4743e78f53d1SNikolas Klauser ++__output_iter; 4744e78f53d1SNikolas Klauser } 4745e78f53d1SNikolas Klauser } else { 4746e78f53d1SNikolas Klauser *__output_iter = *__fmt_first; 4747e78f53d1SNikolas Klauser ++__output_iter; 4748e78f53d1SNikolas Klauser } 4749e78f53d1SNikolas Klauser } 4750e78f53d1SNikolas Klauser } else { 4751e78f53d1SNikolas Klauser for (; __fmt_first != __fmt_last; ++__fmt_first) { 4752e78f53d1SNikolas Klauser if (*__fmt_first == '$' && __fmt_first + 1 != __fmt_last) { 4753e78f53d1SNikolas Klauser switch (__fmt_first[1]) { 4754e78f53d1SNikolas Klauser case '$': 4755e78f53d1SNikolas Klauser *__output_iter = *++__fmt_first; 4756e78f53d1SNikolas Klauser ++__output_iter; 4757e78f53d1SNikolas Klauser break; 4758e78f53d1SNikolas Klauser case '&': 4759e78f53d1SNikolas Klauser ++__fmt_first; 4760e78f53d1SNikolas Klauser __output_iter = std::copy(__matches_[0].first, __matches_[0].second, __output_iter); 4761e78f53d1SNikolas Klauser break; 4762e78f53d1SNikolas Klauser case '`': 4763e78f53d1SNikolas Klauser ++__fmt_first; 4764e78f53d1SNikolas Klauser __output_iter = std::copy(__prefix_.first, __prefix_.second, __output_iter); 4765e78f53d1SNikolas Klauser break; 4766e78f53d1SNikolas Klauser case '\'': 4767e78f53d1SNikolas Klauser ++__fmt_first; 4768e78f53d1SNikolas Klauser __output_iter = std::copy(__suffix_.first, __suffix_.second, __output_iter); 4769e78f53d1SNikolas Klauser break; 4770e78f53d1SNikolas Klauser default: 4771e78f53d1SNikolas Klauser if ('0' <= __fmt_first[1] && __fmt_first[1] <= '9') { 4772e78f53d1SNikolas Klauser ++__fmt_first; 4773e78f53d1SNikolas Klauser size_t __idx = *__fmt_first - '0'; 4774e78f53d1SNikolas Klauser if (__fmt_first + 1 != __fmt_last && '0' <= __fmt_first[1] && __fmt_first[1] <= '9') { 4775e78f53d1SNikolas Klauser ++__fmt_first; 4776e78f53d1SNikolas Klauser if (__idx >= numeric_limits<size_t>::max() / 10) 4777e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_escape>(); 4778e78f53d1SNikolas Klauser __idx = 10 * __idx + *__fmt_first - '0'; 4779e78f53d1SNikolas Klauser } 4780e78f53d1SNikolas Klauser __output_iter = std::copy((*this)[__idx].first, (*this)[__idx].second, __output_iter); 4781e78f53d1SNikolas Klauser } else { 4782e78f53d1SNikolas Klauser *__output_iter = *__fmt_first; 4783e78f53d1SNikolas Klauser ++__output_iter; 4784e78f53d1SNikolas Klauser } 4785e78f53d1SNikolas Klauser break; 4786e78f53d1SNikolas Klauser } 4787e78f53d1SNikolas Klauser } else { 4788e78f53d1SNikolas Klauser *__output_iter = *__fmt_first; 4789e78f53d1SNikolas Klauser ++__output_iter; 4790e78f53d1SNikolas Klauser } 4791e78f53d1SNikolas Klauser } 4792e78f53d1SNikolas Klauser } 4793e78f53d1SNikolas Klauser return __output_iter; 4794e78f53d1SNikolas Klauser} 4795e78f53d1SNikolas Klauser 4796e78f53d1SNikolas Klausertemplate <class _BidirectionalIterator, class _Allocator> 4797e78f53d1SNikolas Klauservoid match_results<_BidirectionalIterator, _Allocator>::swap(match_results& __m) { 4798e78f53d1SNikolas Klauser using std::swap; 4799e78f53d1SNikolas Klauser swap(__matches_, __m.__matches_); 4800e78f53d1SNikolas Klauser swap(__unmatched_, __m.__unmatched_); 4801e78f53d1SNikolas Klauser swap(__prefix_, __m.__prefix_); 4802e78f53d1SNikolas Klauser swap(__suffix_, __m.__suffix_); 4803e78f53d1SNikolas Klauser swap(__position_start_, __m.__position_start_); 4804e78f53d1SNikolas Klauser swap(__ready_, __m.__ready_); 4805e78f53d1SNikolas Klauser} 4806e78f53d1SNikolas Klauser 4807e78f53d1SNikolas Klausertemplate <class _BidirectionalIterator, class _Allocator> 4808e78f53d1SNikolas Klauser_LIBCPP_HIDE_FROM_ABI bool operator==(const match_results<_BidirectionalIterator, _Allocator>& __x, 4809e78f53d1SNikolas Klauser const match_results<_BidirectionalIterator, _Allocator>& __y) { 4810e78f53d1SNikolas Klauser if (__x.__ready_ != __y.__ready_) 4811e78f53d1SNikolas Klauser return false; 4812e78f53d1SNikolas Klauser if (!__x.__ready_) 4813e78f53d1SNikolas Klauser return true; 4814e78f53d1SNikolas Klauser return __x.__matches_ == __y.__matches_ && __x.__prefix_ == __y.__prefix_ && __x.__suffix_ == __y.__suffix_; 4815e78f53d1SNikolas Klauser} 4816e78f53d1SNikolas Klauser 4817e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER < 20 4818e78f53d1SNikolas Klausertemplate <class _BidirectionalIterator, class _Allocator> 4819e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool operator!=(const match_results<_BidirectionalIterator, _Allocator>& __x, 4820e78f53d1SNikolas Klauser const match_results<_BidirectionalIterator, _Allocator>& __y) { 4821e78f53d1SNikolas Klauser return !(__x == __y); 4822e78f53d1SNikolas Klauser} 4823e78f53d1SNikolas Klauser#endif 4824e78f53d1SNikolas Klauser 4825e78f53d1SNikolas Klausertemplate <class _BidirectionalIterator, class _Allocator> 4826e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI void 4827e78f53d1SNikolas Klauserswap(match_results<_BidirectionalIterator, _Allocator>& __x, match_results<_BidirectionalIterator, _Allocator>& __y) { 4828e78f53d1SNikolas Klauser __x.swap(__y); 4829e78f53d1SNikolas Klauser} 4830e78f53d1SNikolas Klauser 4831e78f53d1SNikolas Klauser// regex_search 4832e78f53d1SNikolas Klauser 4833e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 4834e78f53d1SNikolas Klausertemplate <class _Allocator> 4835e78f53d1SNikolas Klauserbool basic_regex<_CharT, _Traits>::__match_at_start_ecma( 4836e78f53d1SNikolas Klauser const _CharT* __first, 4837e78f53d1SNikolas Klauser const _CharT* __last, 4838e78f53d1SNikolas Klauser match_results<const _CharT*, _Allocator>& __m, 4839e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags, 4840e78f53d1SNikolas Klauser bool __at_first) const { 4841e78f53d1SNikolas Klauser vector<__state> __states; 4842e78f53d1SNikolas Klauser __node* __st = __start_.get(); 4843e78f53d1SNikolas Klauser if (__st) { 4844e78f53d1SNikolas Klauser sub_match<const _CharT*> __unmatched; 4845e78f53d1SNikolas Klauser __unmatched.first = __last; 4846e78f53d1SNikolas Klauser __unmatched.second = __last; 4847e78f53d1SNikolas Klauser __unmatched.matched = false; 4848e78f53d1SNikolas Klauser 4849e78f53d1SNikolas Klauser __states.push_back(__state()); 4850e78f53d1SNikolas Klauser __states.back().__do_ = 0; 4851e78f53d1SNikolas Klauser __states.back().__first_ = __first; 4852e78f53d1SNikolas Klauser __states.back().__current_ = __first; 4853e78f53d1SNikolas Klauser __states.back().__last_ = __last; 4854e78f53d1SNikolas Klauser __states.back().__sub_matches_.resize(mark_count(), __unmatched); 4855e78f53d1SNikolas Klauser __states.back().__loop_data_.resize(__loop_count()); 4856e78f53d1SNikolas Klauser __states.back().__node_ = __st; 4857e78f53d1SNikolas Klauser __states.back().__flags_ = __flags; 4858e78f53d1SNikolas Klauser __states.back().__at_first_ = __at_first; 4859e78f53d1SNikolas Klauser int __counter = 0; 4860e78f53d1SNikolas Klauser int __length = __last - __first; 4861e78f53d1SNikolas Klauser do { 4862e78f53d1SNikolas Klauser ++__counter; 4863e78f53d1SNikolas Klauser if (__counter % _LIBCPP_REGEX_COMPLEXITY_FACTOR == 0 && __counter / _LIBCPP_REGEX_COMPLEXITY_FACTOR >= __length) 4864e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_complexity>(); 4865e78f53d1SNikolas Klauser __state& __s = __states.back(); 4866e78f53d1SNikolas Klauser if (__s.__node_) 4867e78f53d1SNikolas Klauser __s.__node_->__exec(__s); 4868e78f53d1SNikolas Klauser switch (__s.__do_) { 4869e78f53d1SNikolas Klauser case __state::__end_state: 4870e78f53d1SNikolas Klauser if ((__flags & regex_constants::match_not_null) && __s.__current_ == __first) { 4871e78f53d1SNikolas Klauser __states.pop_back(); 4872e78f53d1SNikolas Klauser break; 4873e78f53d1SNikolas Klauser } 4874e78f53d1SNikolas Klauser if ((__flags & regex_constants::__full_match) && __s.__current_ != __last) { 4875e78f53d1SNikolas Klauser __states.pop_back(); 4876e78f53d1SNikolas Klauser break; 4877e78f53d1SNikolas Klauser } 4878e78f53d1SNikolas Klauser __m.__matches_[0].first = __first; 4879e78f53d1SNikolas Klauser __m.__matches_[0].second = std::next(__first, __s.__current_ - __first); 4880e78f53d1SNikolas Klauser __m.__matches_[0].matched = true; 4881e78f53d1SNikolas Klauser for (unsigned __i = 0; __i < __s.__sub_matches_.size(); ++__i) 4882e78f53d1SNikolas Klauser __m.__matches_[__i + 1] = __s.__sub_matches_[__i]; 4883e78f53d1SNikolas Klauser return true; 4884e78f53d1SNikolas Klauser case __state::__accept_and_consume: 4885e78f53d1SNikolas Klauser case __state::__repeat: 4886e78f53d1SNikolas Klauser case __state::__accept_but_not_consume: 4887e78f53d1SNikolas Klauser break; 4888e78f53d1SNikolas Klauser case __state::__split: { 4889e78f53d1SNikolas Klauser __state __snext = __s; 4890e78f53d1SNikolas Klauser __s.__node_->__exec_split(true, __s); 4891e78f53d1SNikolas Klauser __snext.__node_->__exec_split(false, __snext); 4892e78f53d1SNikolas Klauser __states.push_back(std::move(__snext)); 4893e78f53d1SNikolas Klauser } break; 4894e78f53d1SNikolas Klauser case __state::__reject: 4895e78f53d1SNikolas Klauser __states.pop_back(); 4896e78f53d1SNikolas Klauser break; 4897e78f53d1SNikolas Klauser default: 4898e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::__re_err_unknown>(); 4899e78f53d1SNikolas Klauser break; 4900e78f53d1SNikolas Klauser } 4901e78f53d1SNikolas Klauser } while (!__states.empty()); 4902e78f53d1SNikolas Klauser } 4903e78f53d1SNikolas Klauser return false; 4904e78f53d1SNikolas Klauser} 4905e78f53d1SNikolas Klauser 4906e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 4907e78f53d1SNikolas Klausertemplate <class _Allocator> 4908e78f53d1SNikolas Klauserbool basic_regex<_CharT, _Traits>::__match_at_start_posix_nosubs( 4909e78f53d1SNikolas Klauser const _CharT* __first, 4910e78f53d1SNikolas Klauser const _CharT* __last, 4911e78f53d1SNikolas Klauser match_results<const _CharT*, _Allocator>& __m, 4912e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags, 4913e78f53d1SNikolas Klauser bool __at_first) const { 4914e78f53d1SNikolas Klauser deque<__state> __states; 4915e78f53d1SNikolas Klauser ptrdiff_t __highest_j = 0; 4916e78f53d1SNikolas Klauser ptrdiff_t __np = std::distance(__first, __last); 4917e78f53d1SNikolas Klauser __node* __st = __start_.get(); 4918e78f53d1SNikolas Klauser if (__st) { 4919e78f53d1SNikolas Klauser __states.push_back(__state()); 4920e78f53d1SNikolas Klauser __states.back().__do_ = 0; 4921e78f53d1SNikolas Klauser __states.back().__first_ = __first; 4922e78f53d1SNikolas Klauser __states.back().__current_ = __first; 4923e78f53d1SNikolas Klauser __states.back().__last_ = __last; 4924e78f53d1SNikolas Klauser __states.back().__loop_data_.resize(__loop_count()); 4925e78f53d1SNikolas Klauser __states.back().__node_ = __st; 4926e78f53d1SNikolas Klauser __states.back().__flags_ = __flags; 4927e78f53d1SNikolas Klauser __states.back().__at_first_ = __at_first; 4928e78f53d1SNikolas Klauser bool __matched = false; 4929e78f53d1SNikolas Klauser int __counter = 0; 4930e78f53d1SNikolas Klauser int __length = __last - __first; 4931e78f53d1SNikolas Klauser do { 4932e78f53d1SNikolas Klauser ++__counter; 4933e78f53d1SNikolas Klauser if (__counter % _LIBCPP_REGEX_COMPLEXITY_FACTOR == 0 && __counter / _LIBCPP_REGEX_COMPLEXITY_FACTOR >= __length) 4934e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_complexity>(); 4935e78f53d1SNikolas Klauser __state& __s = __states.back(); 4936e78f53d1SNikolas Klauser if (__s.__node_) 4937e78f53d1SNikolas Klauser __s.__node_->__exec(__s); 4938e78f53d1SNikolas Klauser switch (__s.__do_) { 4939e78f53d1SNikolas Klauser case __state::__end_state: 4940e78f53d1SNikolas Klauser if ((__flags & regex_constants::match_not_null) && __s.__current_ == __first) { 4941e78f53d1SNikolas Klauser __states.pop_back(); 4942e78f53d1SNikolas Klauser break; 4943e78f53d1SNikolas Klauser } 4944e78f53d1SNikolas Klauser if ((__flags & regex_constants::__full_match) && __s.__current_ != __last) { 4945e78f53d1SNikolas Klauser __states.pop_back(); 4946e78f53d1SNikolas Klauser break; 4947e78f53d1SNikolas Klauser } 4948e78f53d1SNikolas Klauser if (!__matched || __highest_j < __s.__current_ - __s.__first_) 4949e78f53d1SNikolas Klauser __highest_j = __s.__current_ - __s.__first_; 4950e78f53d1SNikolas Klauser __matched = true; 4951e78f53d1SNikolas Klauser if (__highest_j == __np) 4952e78f53d1SNikolas Klauser __states.clear(); 4953e78f53d1SNikolas Klauser else 4954e78f53d1SNikolas Klauser __states.pop_back(); 4955e78f53d1SNikolas Klauser break; 4956e78f53d1SNikolas Klauser case __state::__consume_input: 4957e78f53d1SNikolas Klauser break; 4958e78f53d1SNikolas Klauser case __state::__accept_and_consume: 4959e78f53d1SNikolas Klauser __states.push_front(std::move(__s)); 4960e78f53d1SNikolas Klauser __states.pop_back(); 4961e78f53d1SNikolas Klauser break; 4962e78f53d1SNikolas Klauser case __state::__repeat: 4963e78f53d1SNikolas Klauser case __state::__accept_but_not_consume: 4964e78f53d1SNikolas Klauser break; 4965e78f53d1SNikolas Klauser case __state::__split: { 4966e78f53d1SNikolas Klauser __state __snext = __s; 4967e78f53d1SNikolas Klauser __s.__node_->__exec_split(true, __s); 4968e78f53d1SNikolas Klauser __snext.__node_->__exec_split(false, __snext); 4969e78f53d1SNikolas Klauser __states.push_back(std::move(__snext)); 4970e78f53d1SNikolas Klauser } break; 4971e78f53d1SNikolas Klauser case __state::__reject: 4972e78f53d1SNikolas Klauser __states.pop_back(); 4973e78f53d1SNikolas Klauser break; 4974e78f53d1SNikolas Klauser default: 4975e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::__re_err_unknown>(); 4976e78f53d1SNikolas Klauser break; 4977e78f53d1SNikolas Klauser } 4978e78f53d1SNikolas Klauser } while (!__states.empty()); 4979e78f53d1SNikolas Klauser if (__matched) { 4980e78f53d1SNikolas Klauser __m.__matches_[0].first = __first; 4981e78f53d1SNikolas Klauser __m.__matches_[0].second = std::next(__first, __highest_j); 4982e78f53d1SNikolas Klauser __m.__matches_[0].matched = true; 4983e78f53d1SNikolas Klauser return true; 4984e78f53d1SNikolas Klauser } 4985e78f53d1SNikolas Klauser } 4986e78f53d1SNikolas Klauser return false; 4987e78f53d1SNikolas Klauser} 4988e78f53d1SNikolas Klauser 4989e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 4990e78f53d1SNikolas Klausertemplate <class _Allocator> 4991e78f53d1SNikolas Klauserbool basic_regex<_CharT, _Traits>::__match_at_start_posix_subs( 4992e78f53d1SNikolas Klauser const _CharT* __first, 4993e78f53d1SNikolas Klauser const _CharT* __last, 4994e78f53d1SNikolas Klauser match_results<const _CharT*, _Allocator>& __m, 4995e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags, 4996e78f53d1SNikolas Klauser bool __at_first) const { 4997e78f53d1SNikolas Klauser vector<__state> __states; 4998e78f53d1SNikolas Klauser __state __best_state; 4999e78f53d1SNikolas Klauser ptrdiff_t __highest_j = 0; 5000e78f53d1SNikolas Klauser ptrdiff_t __np = std::distance(__first, __last); 5001e78f53d1SNikolas Klauser __node* __st = __start_.get(); 5002e78f53d1SNikolas Klauser if (__st) { 5003e78f53d1SNikolas Klauser sub_match<const _CharT*> __unmatched; 5004e78f53d1SNikolas Klauser __unmatched.first = __last; 5005e78f53d1SNikolas Klauser __unmatched.second = __last; 5006e78f53d1SNikolas Klauser __unmatched.matched = false; 5007e78f53d1SNikolas Klauser 5008e78f53d1SNikolas Klauser __states.push_back(__state()); 5009e78f53d1SNikolas Klauser __states.back().__do_ = 0; 5010e78f53d1SNikolas Klauser __states.back().__first_ = __first; 5011e78f53d1SNikolas Klauser __states.back().__current_ = __first; 5012e78f53d1SNikolas Klauser __states.back().__last_ = __last; 5013e78f53d1SNikolas Klauser __states.back().__sub_matches_.resize(mark_count(), __unmatched); 5014e78f53d1SNikolas Klauser __states.back().__loop_data_.resize(__loop_count()); 5015e78f53d1SNikolas Klauser __states.back().__node_ = __st; 5016e78f53d1SNikolas Klauser __states.back().__flags_ = __flags; 5017e78f53d1SNikolas Klauser __states.back().__at_first_ = __at_first; 5018e78f53d1SNikolas Klauser bool __matched = false; 5019e78f53d1SNikolas Klauser int __counter = 0; 5020e78f53d1SNikolas Klauser int __length = __last - __first; 5021e78f53d1SNikolas Klauser do { 5022e78f53d1SNikolas Klauser ++__counter; 5023e78f53d1SNikolas Klauser if (__counter % _LIBCPP_REGEX_COMPLEXITY_FACTOR == 0 && __counter / _LIBCPP_REGEX_COMPLEXITY_FACTOR >= __length) 5024e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::error_complexity>(); 5025e78f53d1SNikolas Klauser __state& __s = __states.back(); 5026e78f53d1SNikolas Klauser if (__s.__node_) 5027e78f53d1SNikolas Klauser __s.__node_->__exec(__s); 5028e78f53d1SNikolas Klauser switch (__s.__do_) { 5029e78f53d1SNikolas Klauser case __state::__end_state: 5030e78f53d1SNikolas Klauser if ((__flags & regex_constants::match_not_null) && __s.__current_ == __first) { 5031e78f53d1SNikolas Klauser __states.pop_back(); 5032e78f53d1SNikolas Klauser break; 5033e78f53d1SNikolas Klauser } 5034e78f53d1SNikolas Klauser if ((__flags & regex_constants::__full_match) && __s.__current_ != __last) { 5035e78f53d1SNikolas Klauser __states.pop_back(); 5036e78f53d1SNikolas Klauser break; 5037e78f53d1SNikolas Klauser } 5038e78f53d1SNikolas Klauser if (!__matched || __highest_j < __s.__current_ - __s.__first_) { 5039e78f53d1SNikolas Klauser __highest_j = __s.__current_ - __s.__first_; 5040e78f53d1SNikolas Klauser __best_state = __s; 5041e78f53d1SNikolas Klauser } 5042e78f53d1SNikolas Klauser __matched = true; 5043e78f53d1SNikolas Klauser if (__highest_j == __np) 5044e78f53d1SNikolas Klauser __states.clear(); 5045e78f53d1SNikolas Klauser else 5046e78f53d1SNikolas Klauser __states.pop_back(); 5047e78f53d1SNikolas Klauser break; 5048e78f53d1SNikolas Klauser case __state::__accept_and_consume: 5049e78f53d1SNikolas Klauser case __state::__repeat: 5050e78f53d1SNikolas Klauser case __state::__accept_but_not_consume: 5051e78f53d1SNikolas Klauser break; 5052e78f53d1SNikolas Klauser case __state::__split: { 5053e78f53d1SNikolas Klauser __state __snext = __s; 5054e78f53d1SNikolas Klauser __s.__node_->__exec_split(true, __s); 5055e78f53d1SNikolas Klauser __snext.__node_->__exec_split(false, __snext); 5056e78f53d1SNikolas Klauser __states.push_back(std::move(__snext)); 5057e78f53d1SNikolas Klauser } break; 5058e78f53d1SNikolas Klauser case __state::__reject: 5059e78f53d1SNikolas Klauser __states.pop_back(); 5060e78f53d1SNikolas Klauser break; 5061e78f53d1SNikolas Klauser default: 5062e78f53d1SNikolas Klauser __throw_regex_error<regex_constants::__re_err_unknown>(); 5063e78f53d1SNikolas Klauser break; 5064e78f53d1SNikolas Klauser } 5065e78f53d1SNikolas Klauser } while (!__states.empty()); 5066e78f53d1SNikolas Klauser if (__matched) { 5067e78f53d1SNikolas Klauser __m.__matches_[0].first = __first; 5068e78f53d1SNikolas Klauser __m.__matches_[0].second = std::next(__first, __highest_j); 5069e78f53d1SNikolas Klauser __m.__matches_[0].matched = true; 5070e78f53d1SNikolas Klauser for (unsigned __i = 0; __i < __best_state.__sub_matches_.size(); ++__i) 5071e78f53d1SNikolas Klauser __m.__matches_[__i + 1] = __best_state.__sub_matches_[__i]; 5072e78f53d1SNikolas Klauser return true; 5073e78f53d1SNikolas Klauser } 5074e78f53d1SNikolas Klauser } 5075e78f53d1SNikolas Klauser return false; 5076e78f53d1SNikolas Klauser} 5077e78f53d1SNikolas Klauser 5078e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 5079e78f53d1SNikolas Klausertemplate <class _Allocator> 5080e78f53d1SNikolas Klauserbool basic_regex<_CharT, _Traits>::__match_at_start( 5081e78f53d1SNikolas Klauser const _CharT* __first, 5082e78f53d1SNikolas Klauser const _CharT* __last, 5083e78f53d1SNikolas Klauser match_results<const _CharT*, _Allocator>& __m, 5084e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags, 5085e78f53d1SNikolas Klauser bool __at_first) const { 5086e78f53d1SNikolas Klauser if (__get_grammar(__flags_) == ECMAScript) 5087e78f53d1SNikolas Klauser return __match_at_start_ecma(__first, __last, __m, __flags, __at_first); 5088e78f53d1SNikolas Klauser if (mark_count() == 0) 5089e78f53d1SNikolas Klauser return __match_at_start_posix_nosubs(__first, __last, __m, __flags, __at_first); 5090e78f53d1SNikolas Klauser return __match_at_start_posix_subs(__first, __last, __m, __flags, __at_first); 5091e78f53d1SNikolas Klauser} 5092e78f53d1SNikolas Klauser 5093e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 5094e78f53d1SNikolas Klausertemplate <class _Allocator> 5095e78f53d1SNikolas Klauserbool basic_regex<_CharT, _Traits>::__search( 5096e78f53d1SNikolas Klauser const _CharT* __first, 5097e78f53d1SNikolas Klauser const _CharT* __last, 5098e78f53d1SNikolas Klauser match_results<const _CharT*, _Allocator>& __m, 5099e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags) const { 5100e78f53d1SNikolas Klauser if (__flags & regex_constants::match_prev_avail) 5101e78f53d1SNikolas Klauser __flags &= ~(regex_constants::match_not_bol | regex_constants::match_not_bow); 5102e78f53d1SNikolas Klauser 5103e78f53d1SNikolas Klauser __m.__init(1 + mark_count(), __first, __last, __flags & regex_constants::__no_update_pos); 5104e78f53d1SNikolas Klauser if (__match_at_start(__first, __last, __m, __flags, !(__flags & regex_constants::__no_update_pos))) { 5105e78f53d1SNikolas Klauser __m.__prefix_.second = __m[0].first; 5106e78f53d1SNikolas Klauser __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second; 5107e78f53d1SNikolas Klauser __m.__suffix_.first = __m[0].second; 5108e78f53d1SNikolas Klauser __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second; 5109e78f53d1SNikolas Klauser return true; 5110e78f53d1SNikolas Klauser } 5111e78f53d1SNikolas Klauser if (__first != __last && !(__flags & regex_constants::match_continuous)) { 5112e78f53d1SNikolas Klauser __flags |= regex_constants::match_prev_avail; 5113e78f53d1SNikolas Klauser for (++__first; __first != __last; ++__first) { 5114e78f53d1SNikolas Klauser __m.__matches_.assign(__m.size(), __m.__unmatched_); 5115e78f53d1SNikolas Klauser if (__match_at_start(__first, __last, __m, __flags, false)) { 5116e78f53d1SNikolas Klauser __m.__prefix_.second = __m[0].first; 5117e78f53d1SNikolas Klauser __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second; 5118e78f53d1SNikolas Klauser __m.__suffix_.first = __m[0].second; 5119e78f53d1SNikolas Klauser __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second; 5120e78f53d1SNikolas Klauser return true; 5121e78f53d1SNikolas Klauser } 5122e78f53d1SNikolas Klauser __m.__matches_.assign(__m.size(), __m.__unmatched_); 5123e78f53d1SNikolas Klauser } 5124e78f53d1SNikolas Klauser __m.__matches_.assign(__m.size(), __m.__unmatched_); 5125e78f53d1SNikolas Klauser if (__match_at_start(__first, __last, __m, __flags, false)) { 5126e78f53d1SNikolas Klauser __m.__prefix_.second = __m[0].first; 5127e78f53d1SNikolas Klauser __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second; 5128e78f53d1SNikolas Klauser __m.__suffix_.first = __m[0].second; 5129e78f53d1SNikolas Klauser __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second; 5130e78f53d1SNikolas Klauser return true; 5131e78f53d1SNikolas Klauser } 5132e78f53d1SNikolas Klauser } 5133e78f53d1SNikolas Klauser __m.__matches_.clear(); 5134e78f53d1SNikolas Klauser return false; 5135e78f53d1SNikolas Klauser} 5136e78f53d1SNikolas Klauser 5137e78f53d1SNikolas Klausertemplate <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits> 5138e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 5139e78f53d1SNikolas Klauserregex_search(_BidirectionalIterator __first, 5140e78f53d1SNikolas Klauser _BidirectionalIterator __last, 5141e78f53d1SNikolas Klauser match_results<_BidirectionalIterator, _Allocator>& __m, 5142e78f53d1SNikolas Klauser const basic_regex<_CharT, _Traits>& __e, 5143e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags = regex_constants::match_default) { 5144e78f53d1SNikolas Klauser int __offset = (__flags & regex_constants::match_prev_avail) ? 1 : 0; 5145e78f53d1SNikolas Klauser basic_string<_CharT> __s(std::prev(__first, __offset), __last); 5146e78f53d1SNikolas Klauser match_results<const _CharT*> __mc; 5147e78f53d1SNikolas Klauser bool __r = __e.__search(__s.data() + __offset, __s.data() + __s.size(), __mc, __flags); 5148e78f53d1SNikolas Klauser __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos); 5149e78f53d1SNikolas Klauser return __r; 5150e78f53d1SNikolas Klauser} 5151e78f53d1SNikolas Klauser 5152e78f53d1SNikolas Klausertemplate <class _Iter, class _Allocator, class _CharT, class _Traits> 5153e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 5154e78f53d1SNikolas Klauserregex_search(__wrap_iter<_Iter> __first, 5155e78f53d1SNikolas Klauser __wrap_iter<_Iter> __last, 5156e78f53d1SNikolas Klauser match_results<__wrap_iter<_Iter>, _Allocator>& __m, 5157e78f53d1SNikolas Klauser const basic_regex<_CharT, _Traits>& __e, 5158e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags = regex_constants::match_default) { 5159e78f53d1SNikolas Klauser match_results<const _CharT*> __mc; 5160e78f53d1SNikolas Klauser bool __r = __e.__search(__first.base(), __last.base(), __mc, __flags); 5161e78f53d1SNikolas Klauser __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos); 5162e78f53d1SNikolas Klauser return __r; 5163e78f53d1SNikolas Klauser} 5164e78f53d1SNikolas Klauser 5165e78f53d1SNikolas Klausertemplate <class _Allocator, class _CharT, class _Traits> 5166e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 5167e78f53d1SNikolas Klauserregex_search(const _CharT* __first, 5168e78f53d1SNikolas Klauser const _CharT* __last, 5169e78f53d1SNikolas Klauser match_results<const _CharT*, _Allocator>& __m, 5170e78f53d1SNikolas Klauser const basic_regex<_CharT, _Traits>& __e, 5171e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags = regex_constants::match_default) { 5172e78f53d1SNikolas Klauser return __e.__search(__first, __last, __m, __flags); 5173e78f53d1SNikolas Klauser} 5174e78f53d1SNikolas Klauser 5175e78f53d1SNikolas Klausertemplate <class _BidirectionalIterator, class _CharT, class _Traits> 5176e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 5177e78f53d1SNikolas Klauserregex_search(_BidirectionalIterator __first, 5178e78f53d1SNikolas Klauser _BidirectionalIterator __last, 5179e78f53d1SNikolas Klauser const basic_regex<_CharT, _Traits>& __e, 5180e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags = regex_constants::match_default) { 5181e78f53d1SNikolas Klauser basic_string<_CharT> __s(__first, __last); 5182e78f53d1SNikolas Klauser match_results<const _CharT*> __mc; 5183e78f53d1SNikolas Klauser return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags); 5184e78f53d1SNikolas Klauser} 5185e78f53d1SNikolas Klauser 5186e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 5187e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 5188e78f53d1SNikolas Klauserregex_search(const _CharT* __first, 5189e78f53d1SNikolas Klauser const _CharT* __last, 5190e78f53d1SNikolas Klauser const basic_regex<_CharT, _Traits>& __e, 5191e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags = regex_constants::match_default) { 5192e78f53d1SNikolas Klauser match_results<const _CharT*> __mc; 5193e78f53d1SNikolas Klauser return __e.__search(__first, __last, __mc, __flags); 5194e78f53d1SNikolas Klauser} 5195e78f53d1SNikolas Klauser 5196e78f53d1SNikolas Klausertemplate <class _CharT, class _Allocator, class _Traits> 5197e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 5198e78f53d1SNikolas Klauserregex_search(const _CharT* __str, 5199e78f53d1SNikolas Klauser match_results<const _CharT*, _Allocator>& __m, 5200e78f53d1SNikolas Klauser const basic_regex<_CharT, _Traits>& __e, 5201e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags = regex_constants::match_default) { 5202e78f53d1SNikolas Klauser return __e.__search(__str, __str + _Traits::length(__str), __m, __flags); 5203e78f53d1SNikolas Klauser} 5204e78f53d1SNikolas Klauser 5205e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 5206e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 5207e78f53d1SNikolas Klauserregex_search(const _CharT* __str, 5208e78f53d1SNikolas Klauser const basic_regex<_CharT, _Traits>& __e, 5209e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags = regex_constants::match_default) { 5210e78f53d1SNikolas Klauser match_results<const _CharT*> __m; 5211e78f53d1SNikolas Klauser return std::regex_search(__str, __m, __e, __flags); 5212e78f53d1SNikolas Klauser} 5213e78f53d1SNikolas Klauser 5214e78f53d1SNikolas Klausertemplate <class _ST, class _SA, class _CharT, class _Traits> 5215e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 5216e78f53d1SNikolas Klauserregex_search(const basic_string<_CharT, _ST, _SA>& __s, 5217e78f53d1SNikolas Klauser const basic_regex<_CharT, _Traits>& __e, 5218e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags = regex_constants::match_default) { 5219e78f53d1SNikolas Klauser match_results<const _CharT*> __mc; 5220e78f53d1SNikolas Klauser return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags); 5221e78f53d1SNikolas Klauser} 5222e78f53d1SNikolas Klauser 5223e78f53d1SNikolas Klausertemplate <class _ST, class _SA, class _Allocator, class _CharT, class _Traits> 5224e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 5225e78f53d1SNikolas Klauserregex_search(const basic_string<_CharT, _ST, _SA>& __s, 5226e78f53d1SNikolas Klauser match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m, 5227e78f53d1SNikolas Klauser const basic_regex<_CharT, _Traits>& __e, 5228e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags = regex_constants::match_default) { 5229e78f53d1SNikolas Klauser match_results<const _CharT*> __mc; 5230e78f53d1SNikolas Klauser bool __r = __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags); 5231e78f53d1SNikolas Klauser __m.__assign(__s.begin(), __s.end(), __mc, __flags & regex_constants::__no_update_pos); 5232e78f53d1SNikolas Klauser return __r; 5233e78f53d1SNikolas Klauser} 5234e78f53d1SNikolas Klauser 5235e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 14 5236e78f53d1SNikolas Klausertemplate <class _ST, class _SA, class _Ap, class _Cp, class _Tp> 5237e78f53d1SNikolas Klauserbool regex_search(const basic_string<_Cp, _ST, _SA>&& __s, 5238e78f53d1SNikolas Klauser match_results<typename basic_string<_Cp, _ST, _SA>::const_iterator, _Ap>&, 5239e78f53d1SNikolas Klauser const basic_regex<_Cp, _Tp>& __e, 5240e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags = regex_constants::match_default) = delete; 5241e78f53d1SNikolas Klauser#endif 5242e78f53d1SNikolas Klauser 5243e78f53d1SNikolas Klauser// regex_match 5244e78f53d1SNikolas Klauser 5245e78f53d1SNikolas Klausertemplate <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits> 5246e78f53d1SNikolas Klauser_LIBCPP_HIDE_FROM_ABI bool 5247e78f53d1SNikolas Klauserregex_match(_BidirectionalIterator __first, 5248e78f53d1SNikolas Klauser _BidirectionalIterator __last, 5249e78f53d1SNikolas Klauser match_results<_BidirectionalIterator, _Allocator>& __m, 5250e78f53d1SNikolas Klauser const basic_regex<_CharT, _Traits>& __e, 5251e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags = regex_constants::match_default) { 5252e78f53d1SNikolas Klauser bool __r = std::regex_search( 5253e78f53d1SNikolas Klauser __first, __last, __m, __e, __flags | regex_constants::match_continuous | regex_constants::__full_match); 5254e78f53d1SNikolas Klauser if (__r) { 5255e78f53d1SNikolas Klauser __r = !__m.suffix().matched; 5256e78f53d1SNikolas Klauser if (!__r) 5257e78f53d1SNikolas Klauser __m.__matches_.clear(); 5258e78f53d1SNikolas Klauser } 5259e78f53d1SNikolas Klauser return __r; 5260e78f53d1SNikolas Klauser} 5261e78f53d1SNikolas Klauser 5262e78f53d1SNikolas Klausertemplate <class _BidirectionalIterator, class _CharT, class _Traits> 5263e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 5264e78f53d1SNikolas Klauserregex_match(_BidirectionalIterator __first, 5265e78f53d1SNikolas Klauser _BidirectionalIterator __last, 5266e78f53d1SNikolas Klauser const basic_regex<_CharT, _Traits>& __e, 5267e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags = regex_constants::match_default) { 5268e78f53d1SNikolas Klauser match_results<_BidirectionalIterator> __m; 5269e78f53d1SNikolas Klauser return std::regex_match(__first, __last, __m, __e, __flags); 5270e78f53d1SNikolas Klauser} 5271e78f53d1SNikolas Klauser 5272e78f53d1SNikolas Klausertemplate <class _CharT, class _Allocator, class _Traits> 5273e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 5274e78f53d1SNikolas Klauserregex_match(const _CharT* __str, 5275e78f53d1SNikolas Klauser match_results<const _CharT*, _Allocator>& __m, 5276e78f53d1SNikolas Klauser const basic_regex<_CharT, _Traits>& __e, 5277e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags = regex_constants::match_default) { 5278e78f53d1SNikolas Klauser return std::regex_match(__str, __str + _Traits::length(__str), __m, __e, __flags); 5279e78f53d1SNikolas Klauser} 5280e78f53d1SNikolas Klauser 5281e78f53d1SNikolas Klausertemplate <class _ST, class _SA, class _Allocator, class _CharT, class _Traits> 5282e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 5283e78f53d1SNikolas Klauserregex_match(const basic_string<_CharT, _ST, _SA>& __s, 5284e78f53d1SNikolas Klauser match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m, 5285e78f53d1SNikolas Klauser const basic_regex<_CharT, _Traits>& __e, 5286e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags = regex_constants::match_default) { 5287e78f53d1SNikolas Klauser return std::regex_match(__s.begin(), __s.end(), __m, __e, __flags); 5288e78f53d1SNikolas Klauser} 5289e78f53d1SNikolas Klauser 5290e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 14 5291e78f53d1SNikolas Klausertemplate <class _ST, class _SA, class _Allocator, class _CharT, class _Traits> 5292e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 5293e78f53d1SNikolas Klauserregex_match(const basic_string<_CharT, _ST, _SA>&& __s, 5294e78f53d1SNikolas Klauser match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m, 5295e78f53d1SNikolas Klauser const basic_regex<_CharT, _Traits>& __e, 5296e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags = regex_constants::match_default) = delete; 5297e78f53d1SNikolas Klauser#endif 5298e78f53d1SNikolas Klauser 5299e78f53d1SNikolas Klausertemplate <class _CharT, class _Traits> 5300e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 5301e78f53d1SNikolas Klauserregex_match(const _CharT* __str, 5302e78f53d1SNikolas Klauser const basic_regex<_CharT, _Traits>& __e, 5303e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags = regex_constants::match_default) { 5304e78f53d1SNikolas Klauser return std::regex_match(__str, __str + _Traits::length(__str), __e, __flags); 5305e78f53d1SNikolas Klauser} 5306e78f53d1SNikolas Klauser 5307e78f53d1SNikolas Klausertemplate <class _ST, class _SA, class _CharT, class _Traits> 5308e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI bool 5309e78f53d1SNikolas Klauserregex_match(const basic_string<_CharT, _ST, _SA>& __s, 5310e78f53d1SNikolas Klauser const basic_regex<_CharT, _Traits>& __e, 5311e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags = regex_constants::match_default) { 5312e78f53d1SNikolas Klauser return std::regex_match(__s.begin(), __s.end(), __e, __flags); 5313e78f53d1SNikolas Klauser} 5314e78f53d1SNikolas Klauser 5315e78f53d1SNikolas Klauser// regex_iterator 5316e78f53d1SNikolas Klauser 5317e78f53d1SNikolas Klausertemplate <class _BidirectionalIterator, 5318e78f53d1SNikolas Klauser class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type, 5319e78f53d1SNikolas Klauser class _Traits = regex_traits<_CharT> > 5320e78f53d1SNikolas Klauserclass _LIBCPP_TEMPLATE_VIS regex_iterator; 5321e78f53d1SNikolas Klauser 5322e78f53d1SNikolas Klausertypedef regex_iterator<const char*> cregex_iterator; 5323e78f53d1SNikolas Klausertypedef regex_iterator<string::const_iterator> sregex_iterator; 5324e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS 5325e78f53d1SNikolas Klausertypedef regex_iterator<const wchar_t*> wcregex_iterator; 5326e78f53d1SNikolas Klausertypedef regex_iterator<wstring::const_iterator> wsregex_iterator; 5327e78f53d1SNikolas Klauser#endif 5328e78f53d1SNikolas Klauser 5329e78f53d1SNikolas Klausertemplate <class _BidirectionalIterator, class _CharT, class _Traits> 5330e78f53d1SNikolas Klauserclass _LIBCPP_TEMPLATE_VIS _LIBCPP_PREFERRED_NAME(cregex_iterator) 5331e78f53d1SNikolas Klauser _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wcregex_iterator)) _LIBCPP_PREFERRED_NAME(sregex_iterator) 5332e78f53d1SNikolas Klauser _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wsregex_iterator)) regex_iterator { 5333e78f53d1SNikolas Klauserpublic: 5334e78f53d1SNikolas Klauser typedef basic_regex<_CharT, _Traits> regex_type; 5335e78f53d1SNikolas Klauser typedef match_results<_BidirectionalIterator> value_type; 5336e78f53d1SNikolas Klauser typedef ptrdiff_t difference_type; 5337e78f53d1SNikolas Klauser typedef const value_type* pointer; 5338e78f53d1SNikolas Klauser typedef const value_type& reference; 5339e78f53d1SNikolas Klauser typedef forward_iterator_tag iterator_category; 5340e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 20 5341e78f53d1SNikolas Klauser typedef input_iterator_tag iterator_concept; 5342e78f53d1SNikolas Klauser#endif 5343e78f53d1SNikolas Klauser 5344e78f53d1SNikolas Klauserprivate: 5345e78f53d1SNikolas Klauser _BidirectionalIterator __begin_; 5346e78f53d1SNikolas Klauser _BidirectionalIterator __end_; 5347e78f53d1SNikolas Klauser const regex_type* __pregex_; 5348e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags_; 5349e78f53d1SNikolas Klauser value_type __match_; 5350e78f53d1SNikolas Klauser 5351e78f53d1SNikolas Klauserpublic: 5352e78f53d1SNikolas Klauser regex_iterator(); 5353e78f53d1SNikolas Klauser regex_iterator(_BidirectionalIterator __a, 5354e78f53d1SNikolas Klauser _BidirectionalIterator __b, 5355e78f53d1SNikolas Klauser const regex_type& __re, 5356e78f53d1SNikolas Klauser regex_constants::match_flag_type __m = regex_constants::match_default); 5357e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 14 5358e78f53d1SNikolas Klauser regex_iterator(_BidirectionalIterator __a, 5359e78f53d1SNikolas Klauser _BidirectionalIterator __b, 5360e78f53d1SNikolas Klauser const regex_type&& __re, 5361e78f53d1SNikolas Klauser regex_constants::match_flag_type __m = regex_constants::match_default) = delete; 5362e78f53d1SNikolas Klauser#endif 5363e78f53d1SNikolas Klauser 5364e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI bool operator==(const regex_iterator& __x) const; 5365e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 20 5366e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI bool operator==(default_sentinel_t) const { return *this == regex_iterator(); } 5367e78f53d1SNikolas Klauser#endif 5368e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER < 20 5369e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI bool operator!=(const regex_iterator& __x) const { return !(*this == __x); } 5370e78f53d1SNikolas Klauser#endif 5371e78f53d1SNikolas Klauser 5372e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI reference operator*() const { return __match_; } 5373e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI pointer operator->() const { return std::addressof(__match_); } 5374e78f53d1SNikolas Klauser 5375e78f53d1SNikolas Klauser regex_iterator& operator++(); 5376e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI regex_iterator operator++(int) { 5377e78f53d1SNikolas Klauser regex_iterator __t(*this); 5378e78f53d1SNikolas Klauser ++(*this); 5379e78f53d1SNikolas Klauser return __t; 5380e78f53d1SNikolas Klauser } 5381e78f53d1SNikolas Klauser}; 5382e78f53d1SNikolas Klauser 5383e78f53d1SNikolas Klausertemplate <class _BidirectionalIterator, class _CharT, class _Traits> 5384e78f53d1SNikolas Klauserregex_iterator<_BidirectionalIterator, _CharT, _Traits>::regex_iterator() 5385e78f53d1SNikolas Klauser : __begin_(), __end_(), __pregex_(nullptr), __flags_(), __match_() {} 5386e78f53d1SNikolas Klauser 5387e78f53d1SNikolas Klausertemplate <class _BidirectionalIterator, class _CharT, class _Traits> 5388e78f53d1SNikolas Klauserregex_iterator<_BidirectionalIterator, _CharT, _Traits>::regex_iterator( 5389e78f53d1SNikolas Klauser _BidirectionalIterator __a, 5390e78f53d1SNikolas Klauser _BidirectionalIterator __b, 5391e78f53d1SNikolas Klauser const regex_type& __re, 5392e78f53d1SNikolas Klauser regex_constants::match_flag_type __m) 5393e78f53d1SNikolas Klauser : __begin_(__a), __end_(__b), __pregex_(std::addressof(__re)), __flags_(__m) { 5394e78f53d1SNikolas Klauser std::regex_search(__begin_, __end_, __match_, *__pregex_, __flags_); 5395e78f53d1SNikolas Klauser} 5396e78f53d1SNikolas Klauser 5397e78f53d1SNikolas Klausertemplate <class _BidirectionalIterator, class _CharT, class _Traits> 5398e78f53d1SNikolas Klauserbool regex_iterator<_BidirectionalIterator, _CharT, _Traits>::operator==(const regex_iterator& __x) const { 5399e78f53d1SNikolas Klauser if (__match_.empty() && __x.__match_.empty()) 5400e78f53d1SNikolas Klauser return true; 5401e78f53d1SNikolas Klauser if (__match_.empty() || __x.__match_.empty()) 5402e78f53d1SNikolas Klauser return false; 5403e78f53d1SNikolas Klauser return __begin_ == __x.__begin_ && __end_ == __x.__end_ && __pregex_ == __x.__pregex_ && __flags_ == __x.__flags_ && 5404e78f53d1SNikolas Klauser __match_[0] == __x.__match_[0]; 5405e78f53d1SNikolas Klauser} 5406e78f53d1SNikolas Klauser 5407e78f53d1SNikolas Klausertemplate <class _BidirectionalIterator, class _CharT, class _Traits> 5408e78f53d1SNikolas Klauserregex_iterator<_BidirectionalIterator, _CharT, _Traits>& 5409e78f53d1SNikolas Klauserregex_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++() { 5410e78f53d1SNikolas Klauser __flags_ |= regex_constants::__no_update_pos; 5411e78f53d1SNikolas Klauser _BidirectionalIterator __start = __match_[0].second; 5412e78f53d1SNikolas Klauser _BidirectionalIterator __prefix_start = __start; 5413e78f53d1SNikolas Klauser 5414e78f53d1SNikolas Klauser if (__match_[0].first == __match_[0].second) { 5415e78f53d1SNikolas Klauser if (__start == __end_) { 5416e78f53d1SNikolas Klauser __match_ = value_type(); 5417e78f53d1SNikolas Klauser return *this; 5418e78f53d1SNikolas Klauser } else if (std::regex_search(__start, 5419e78f53d1SNikolas Klauser __end_, 5420e78f53d1SNikolas Klauser __match_, 5421e78f53d1SNikolas Klauser *__pregex_, 5422e78f53d1SNikolas Klauser __flags_ | regex_constants::match_not_null | regex_constants::match_continuous)) 5423e78f53d1SNikolas Klauser return *this; 5424e78f53d1SNikolas Klauser else 5425e78f53d1SNikolas Klauser ++__start; 5426e78f53d1SNikolas Klauser } 5427e78f53d1SNikolas Klauser 5428e78f53d1SNikolas Klauser __flags_ |= regex_constants::match_prev_avail; 5429e78f53d1SNikolas Klauser if (!std::regex_search(__start, __end_, __match_, *__pregex_, __flags_)) { 5430e78f53d1SNikolas Klauser __match_ = value_type(); 5431e78f53d1SNikolas Klauser 5432e78f53d1SNikolas Klauser } else { 5433e78f53d1SNikolas Klauser // The Standard mandates that if `regex_search` returns true ([re.regiter.incr]), "`match.prefix().first` shall be 5434e78f53d1SNikolas Klauser // equal to the previous value of `match[0].second`... It is unspecified how the implementation makes these 5435e78f53d1SNikolas Klauser // adjustments." The adjustment is necessary if we incremented `__start` above (the branch that deals with 5436e78f53d1SNikolas Klauser // zero-length matches). 5437e78f53d1SNikolas Klauser auto& __prefix = __match_.__prefix_; 5438e78f53d1SNikolas Klauser __prefix.first = __prefix_start; 5439e78f53d1SNikolas Klauser __prefix.matched = __prefix.first != __prefix.second; 5440e78f53d1SNikolas Klauser } 5441e78f53d1SNikolas Klauser 5442e78f53d1SNikolas Klauser return *this; 5443e78f53d1SNikolas Klauser} 5444e78f53d1SNikolas Klauser 5445e78f53d1SNikolas Klauser// regex_token_iterator 5446e78f53d1SNikolas Klauser 5447e78f53d1SNikolas Klausertemplate <class _BidirectionalIterator, 5448e78f53d1SNikolas Klauser class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type, 5449e78f53d1SNikolas Klauser class _Traits = regex_traits<_CharT> > 5450e78f53d1SNikolas Klauserclass _LIBCPP_TEMPLATE_VIS regex_token_iterator; 5451e78f53d1SNikolas Klauser 5452e78f53d1SNikolas Klausertypedef regex_token_iterator<const char*> cregex_token_iterator; 5453e78f53d1SNikolas Klausertypedef regex_token_iterator<string::const_iterator> sregex_token_iterator; 5454e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS 5455e78f53d1SNikolas Klausertypedef regex_token_iterator<const wchar_t*> wcregex_token_iterator; 5456e78f53d1SNikolas Klausertypedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator; 5457e78f53d1SNikolas Klauser#endif 5458e78f53d1SNikolas Klauser 5459e78f53d1SNikolas Klausertemplate <class _BidirectionalIterator, class _CharT, class _Traits> 5460e78f53d1SNikolas Klauserclass _LIBCPP_TEMPLATE_VIS _LIBCPP_PREFERRED_NAME(cregex_token_iterator) 5461e78f53d1SNikolas Klauser _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wcregex_token_iterator)) 5462e78f53d1SNikolas Klauser _LIBCPP_PREFERRED_NAME(sregex_token_iterator) 5463e78f53d1SNikolas Klauser _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wsregex_token_iterator)) regex_token_iterator { 5464e78f53d1SNikolas Klauserpublic: 5465e78f53d1SNikolas Klauser typedef basic_regex<_CharT, _Traits> regex_type; 5466e78f53d1SNikolas Klauser typedef sub_match<_BidirectionalIterator> value_type; 5467e78f53d1SNikolas Klauser typedef ptrdiff_t difference_type; 5468e78f53d1SNikolas Klauser typedef const value_type* pointer; 5469e78f53d1SNikolas Klauser typedef const value_type& reference; 5470e78f53d1SNikolas Klauser typedef forward_iterator_tag iterator_category; 5471e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 20 5472e78f53d1SNikolas Klauser typedef input_iterator_tag iterator_concept; 5473e78f53d1SNikolas Klauser#endif 5474e78f53d1SNikolas Klauser 5475e78f53d1SNikolas Klauserprivate: 5476e78f53d1SNikolas Klauser typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Position; 5477e78f53d1SNikolas Klauser 5478e78f53d1SNikolas Klauser _Position __position_; 5479e78f53d1SNikolas Klauser const value_type* __result_; 5480e78f53d1SNikolas Klauser value_type __suffix_; 5481e78f53d1SNikolas Klauser ptrdiff_t __n_; 5482e78f53d1SNikolas Klauser vector<int> __subs_; 5483e78f53d1SNikolas Klauser 5484e78f53d1SNikolas Klauserpublic: 5485e78f53d1SNikolas Klauser regex_token_iterator(); 5486e78f53d1SNikolas Klauser regex_token_iterator(_BidirectionalIterator __a, 5487e78f53d1SNikolas Klauser _BidirectionalIterator __b, 5488e78f53d1SNikolas Klauser const regex_type& __re, 5489e78f53d1SNikolas Klauser int __submatch = 0, 5490e78f53d1SNikolas Klauser regex_constants::match_flag_type __m = regex_constants::match_default); 5491e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 14 5492e78f53d1SNikolas Klauser regex_token_iterator(_BidirectionalIterator __a, 5493e78f53d1SNikolas Klauser _BidirectionalIterator __b, 5494e78f53d1SNikolas Klauser const regex_type&& __re, 5495e78f53d1SNikolas Klauser int __submatch = 0, 5496e78f53d1SNikolas Klauser regex_constants::match_flag_type __m = regex_constants::match_default) = delete; 5497e78f53d1SNikolas Klauser#endif 5498e78f53d1SNikolas Klauser 5499e78f53d1SNikolas Klauser regex_token_iterator(_BidirectionalIterator __a, 5500e78f53d1SNikolas Klauser _BidirectionalIterator __b, 5501e78f53d1SNikolas Klauser const regex_type& __re, 5502e78f53d1SNikolas Klauser const vector<int>& __submatches, 5503e78f53d1SNikolas Klauser regex_constants::match_flag_type __m = regex_constants::match_default); 5504e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 14 5505e78f53d1SNikolas Klauser regex_token_iterator(_BidirectionalIterator __a, 5506e78f53d1SNikolas Klauser _BidirectionalIterator __b, 5507e78f53d1SNikolas Klauser const regex_type&& __re, 5508e78f53d1SNikolas Klauser const vector<int>& __submatches, 5509e78f53d1SNikolas Klauser regex_constants::match_flag_type __m = regex_constants::match_default) = delete; 5510e78f53d1SNikolas Klauser#endif 5511e78f53d1SNikolas Klauser 5512e78f53d1SNikolas Klauser#ifndef _LIBCPP_CXX03_LANG 5513e78f53d1SNikolas Klauser regex_token_iterator(_BidirectionalIterator __a, 5514e78f53d1SNikolas Klauser _BidirectionalIterator __b, 5515e78f53d1SNikolas Klauser const regex_type& __re, 5516e78f53d1SNikolas Klauser initializer_list<int> __submatches, 5517e78f53d1SNikolas Klauser regex_constants::match_flag_type __m = regex_constants::match_default); 5518e78f53d1SNikolas Klauser 5519e78f53d1SNikolas Klauser# if _LIBCPP_STD_VER >= 14 5520e78f53d1SNikolas Klauser regex_token_iterator(_BidirectionalIterator __a, 5521e78f53d1SNikolas Klauser _BidirectionalIterator __b, 5522e78f53d1SNikolas Klauser const regex_type&& __re, 5523e78f53d1SNikolas Klauser initializer_list<int> __submatches, 5524e78f53d1SNikolas Klauser regex_constants::match_flag_type __m = regex_constants::match_default) = delete; 5525e78f53d1SNikolas Klauser# endif 5526e78f53d1SNikolas Klauser#endif // _LIBCPP_CXX03_LANG 5527e78f53d1SNikolas Klauser template <size_t _Np> 5528e78f53d1SNikolas Klauser regex_token_iterator(_BidirectionalIterator __a, 5529e78f53d1SNikolas Klauser _BidirectionalIterator __b, 5530e78f53d1SNikolas Klauser const regex_type& __re, 5531e78f53d1SNikolas Klauser const int (&__submatches)[_Np], 5532e78f53d1SNikolas Klauser regex_constants::match_flag_type __m = regex_constants::match_default); 5533e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 14 5534e78f53d1SNikolas Klauser template <size_t _Np> 5535e78f53d1SNikolas Klauser regex_token_iterator(_BidirectionalIterator __a, 5536e78f53d1SNikolas Klauser _BidirectionalIterator __b, 5537e78f53d1SNikolas Klauser const regex_type&& __re, 5538e78f53d1SNikolas Klauser const int (&__submatches)[_Np], 5539e78f53d1SNikolas Klauser regex_constants::match_flag_type __m = regex_constants::match_default) = delete; 5540e78f53d1SNikolas Klauser#endif 5541e78f53d1SNikolas Klauser 5542e78f53d1SNikolas Klauser regex_token_iterator(const regex_token_iterator&); 5543e78f53d1SNikolas Klauser regex_token_iterator& operator=(const regex_token_iterator&); 5544e78f53d1SNikolas Klauser 5545e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI bool operator==(const regex_token_iterator& __x) const; 5546e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 20 5547*dab6463eSLoS _LIBCPP_HIDE_FROM_ABI bool operator==(default_sentinel_t) const { return *this == regex_token_iterator(); } 5548e78f53d1SNikolas Klauser#endif 5549e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER < 20 5550e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI bool operator!=(const regex_token_iterator& __x) const { return !(*this == __x); } 5551e78f53d1SNikolas Klauser#endif 5552e78f53d1SNikolas Klauser 5553e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI const value_type& operator*() const { return *__result_; } 5554e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI const value_type* operator->() const { return __result_; } 5555e78f53d1SNikolas Klauser 5556e78f53d1SNikolas Klauser regex_token_iterator& operator++(); 5557e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI regex_token_iterator operator++(int) { 5558e78f53d1SNikolas Klauser regex_token_iterator __t(*this); 5559e78f53d1SNikolas Klauser ++(*this); 5560e78f53d1SNikolas Klauser return __t; 5561e78f53d1SNikolas Klauser } 5562e78f53d1SNikolas Klauser 5563e78f53d1SNikolas Klauserprivate: 5564e78f53d1SNikolas Klauser void __init(_BidirectionalIterator __a, _BidirectionalIterator __b); 5565e78f53d1SNikolas Klauser void __establish_result() { 5566e78f53d1SNikolas Klauser if (__subs_[__n_] == -1) 5567e78f53d1SNikolas Klauser __result_ = &__position_->prefix(); 5568e78f53d1SNikolas Klauser else 5569e78f53d1SNikolas Klauser __result_ = &(*__position_)[__subs_[__n_]]; 5570e78f53d1SNikolas Klauser } 5571e78f53d1SNikolas Klauser}; 5572e78f53d1SNikolas Klauser 5573e78f53d1SNikolas Klausertemplate <class _BidirectionalIterator, class _CharT, class _Traits> 5574e78f53d1SNikolas Klauserregex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::regex_token_iterator() 5575e78f53d1SNikolas Klauser : __result_(nullptr), __suffix_(), __n_(0) {} 5576e78f53d1SNikolas Klauser 5577e78f53d1SNikolas Klausertemplate <class _BidirectionalIterator, class _CharT, class _Traits> 5578e78f53d1SNikolas Klauservoid regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::__init( 5579e78f53d1SNikolas Klauser _BidirectionalIterator __a, _BidirectionalIterator __b) { 5580e78f53d1SNikolas Klauser if (__position_ != _Position()) 5581e78f53d1SNikolas Klauser __establish_result(); 5582e78f53d1SNikolas Klauser else if (__subs_[__n_] == -1) { 5583e78f53d1SNikolas Klauser __suffix_.matched = true; 5584e78f53d1SNikolas Klauser __suffix_.first = __a; 5585e78f53d1SNikolas Klauser __suffix_.second = __b; 5586e78f53d1SNikolas Klauser __result_ = &__suffix_; 5587e78f53d1SNikolas Klauser } else 5588e78f53d1SNikolas Klauser __result_ = nullptr; 5589e78f53d1SNikolas Klauser} 5590e78f53d1SNikolas Klauser 5591e78f53d1SNikolas Klausertemplate <class _BidirectionalIterator, class _CharT, class _Traits> 5592e78f53d1SNikolas Klauserregex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::regex_token_iterator( 5593e78f53d1SNikolas Klauser _BidirectionalIterator __a, 5594e78f53d1SNikolas Klauser _BidirectionalIterator __b, 5595e78f53d1SNikolas Klauser const regex_type& __re, 5596e78f53d1SNikolas Klauser int __submatch, 5597e78f53d1SNikolas Klauser regex_constants::match_flag_type __m) 5598e78f53d1SNikolas Klauser : __position_(__a, __b, __re, __m), __n_(0), __subs_(1, __submatch) { 5599e78f53d1SNikolas Klauser __init(__a, __b); 5600e78f53d1SNikolas Klauser} 5601e78f53d1SNikolas Klauser 5602e78f53d1SNikolas Klausertemplate <class _BidirectionalIterator, class _CharT, class _Traits> 5603e78f53d1SNikolas Klauserregex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::regex_token_iterator( 5604e78f53d1SNikolas Klauser _BidirectionalIterator __a, 5605e78f53d1SNikolas Klauser _BidirectionalIterator __b, 5606e78f53d1SNikolas Klauser const regex_type& __re, 5607e78f53d1SNikolas Klauser const vector<int>& __submatches, 5608e78f53d1SNikolas Klauser regex_constants::match_flag_type __m) 5609e78f53d1SNikolas Klauser : __position_(__a, __b, __re, __m), __n_(0), __subs_(__submatches) { 5610e78f53d1SNikolas Klauser __init(__a, __b); 5611e78f53d1SNikolas Klauser} 5612e78f53d1SNikolas Klauser 5613e78f53d1SNikolas Klauser#ifndef _LIBCPP_CXX03_LANG 5614e78f53d1SNikolas Klauser 5615e78f53d1SNikolas Klausertemplate <class _BidirectionalIterator, class _CharT, class _Traits> 5616e78f53d1SNikolas Klauserregex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::regex_token_iterator( 5617e78f53d1SNikolas Klauser _BidirectionalIterator __a, 5618e78f53d1SNikolas Klauser _BidirectionalIterator __b, 5619e78f53d1SNikolas Klauser const regex_type& __re, 5620e78f53d1SNikolas Klauser initializer_list<int> __submatches, 5621e78f53d1SNikolas Klauser regex_constants::match_flag_type __m) 5622e78f53d1SNikolas Klauser : __position_(__a, __b, __re, __m), __n_(0), __subs_(__submatches) { 5623e78f53d1SNikolas Klauser __init(__a, __b); 5624e78f53d1SNikolas Klauser} 5625e78f53d1SNikolas Klauser 5626e78f53d1SNikolas Klauser#endif // _LIBCPP_CXX03_LANG 5627e78f53d1SNikolas Klauser 5628e78f53d1SNikolas Klausertemplate <class _BidirectionalIterator, class _CharT, class _Traits> 5629e78f53d1SNikolas Klausertemplate <size_t _Np> 5630e78f53d1SNikolas Klauserregex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::regex_token_iterator( 5631e78f53d1SNikolas Klauser _BidirectionalIterator __a, 5632e78f53d1SNikolas Klauser _BidirectionalIterator __b, 5633e78f53d1SNikolas Klauser const regex_type& __re, 5634e78f53d1SNikolas Klauser const int (&__submatches)[_Np], 5635e78f53d1SNikolas Klauser regex_constants::match_flag_type __m) 5636e78f53d1SNikolas Klauser : __position_(__a, __b, __re, __m), __n_(0), __subs_(begin(__submatches), end(__submatches)) { 5637e78f53d1SNikolas Klauser __init(__a, __b); 5638e78f53d1SNikolas Klauser} 5639e78f53d1SNikolas Klauser 5640e78f53d1SNikolas Klausertemplate <class _BidirectionalIterator, class _CharT, class _Traits> 5641e78f53d1SNikolas Klauserregex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::regex_token_iterator(const regex_token_iterator& __x) 5642e78f53d1SNikolas Klauser : __position_(__x.__position_), 5643e78f53d1SNikolas Klauser __result_(__x.__result_), 5644e78f53d1SNikolas Klauser __suffix_(__x.__suffix_), 5645e78f53d1SNikolas Klauser __n_(__x.__n_), 5646e78f53d1SNikolas Klauser __subs_(__x.__subs_) { 5647e78f53d1SNikolas Klauser if (__x.__result_ == &__x.__suffix_) 5648e78f53d1SNikolas Klauser __result_ = &__suffix_; 5649e78f53d1SNikolas Klauser else if (__result_ != nullptr) 5650e78f53d1SNikolas Klauser __establish_result(); 5651e78f53d1SNikolas Klauser} 5652e78f53d1SNikolas Klauser 5653e78f53d1SNikolas Klausertemplate <class _BidirectionalIterator, class _CharT, class _Traits> 5654e78f53d1SNikolas Klauserregex_token_iterator<_BidirectionalIterator, _CharT, _Traits>& 5655e78f53d1SNikolas Klauserregex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::operator=(const regex_token_iterator& __x) { 5656e78f53d1SNikolas Klauser if (this != &__x) { 5657e78f53d1SNikolas Klauser __position_ = __x.__position_; 5658e78f53d1SNikolas Klauser if (__x.__result_ == &__x.__suffix_) 5659e78f53d1SNikolas Klauser __result_ = &__suffix_; 5660e78f53d1SNikolas Klauser else 5661e78f53d1SNikolas Klauser __result_ = __x.__result_; 5662e78f53d1SNikolas Klauser __suffix_ = __x.__suffix_; 5663e78f53d1SNikolas Klauser __n_ = __x.__n_; 5664e78f53d1SNikolas Klauser __subs_ = __x.__subs_; 5665e78f53d1SNikolas Klauser 5666e78f53d1SNikolas Klauser if (__result_ != nullptr && __result_ != &__suffix_) 5667e78f53d1SNikolas Klauser __establish_result(); 5668e78f53d1SNikolas Klauser } 5669e78f53d1SNikolas Klauser return *this; 5670e78f53d1SNikolas Klauser} 5671e78f53d1SNikolas Klauser 5672e78f53d1SNikolas Klausertemplate <class _BidirectionalIterator, class _CharT, class _Traits> 5673e78f53d1SNikolas Klauserbool regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::operator==(const regex_token_iterator& __x) const { 5674e78f53d1SNikolas Klauser if (__result_ == nullptr && __x.__result_ == nullptr) 5675e78f53d1SNikolas Klauser return true; 5676e78f53d1SNikolas Klauser if (__result_ == &__suffix_ && __x.__result_ == &__x.__suffix_ && __suffix_ == __x.__suffix_) 5677e78f53d1SNikolas Klauser return true; 5678e78f53d1SNikolas Klauser if (__result_ == nullptr || __x.__result_ == nullptr) 5679e78f53d1SNikolas Klauser return false; 5680e78f53d1SNikolas Klauser if (__result_ == &__suffix_ || __x.__result_ == &__x.__suffix_) 5681e78f53d1SNikolas Klauser return false; 5682e78f53d1SNikolas Klauser return __position_ == __x.__position_ && __n_ == __x.__n_ && __subs_ == __x.__subs_; 5683e78f53d1SNikolas Klauser} 5684e78f53d1SNikolas Klauser 5685e78f53d1SNikolas Klausertemplate <class _BidirectionalIterator, class _CharT, class _Traits> 5686e78f53d1SNikolas Klauserregex_token_iterator<_BidirectionalIterator, _CharT, _Traits>& 5687e78f53d1SNikolas Klauserregex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++() { 5688e78f53d1SNikolas Klauser _Position __prev = __position_; 5689e78f53d1SNikolas Klauser if (__result_ == &__suffix_) 5690e78f53d1SNikolas Klauser __result_ = nullptr; 5691e78f53d1SNikolas Klauser else if (static_cast<size_t>(__n_ + 1) < __subs_.size()) { 5692e78f53d1SNikolas Klauser ++__n_; 5693e78f53d1SNikolas Klauser __establish_result(); 5694e78f53d1SNikolas Klauser } else { 5695e78f53d1SNikolas Klauser __n_ = 0; 5696e78f53d1SNikolas Klauser ++__position_; 5697e78f53d1SNikolas Klauser if (__position_ != _Position()) 5698e78f53d1SNikolas Klauser __establish_result(); 5699e78f53d1SNikolas Klauser else { 5700e78f53d1SNikolas Klauser if (std::find(__subs_.begin(), __subs_.end(), -1) != __subs_.end() && __prev->suffix().length() != 0) { 5701e78f53d1SNikolas Klauser __suffix_.matched = true; 5702e78f53d1SNikolas Klauser __suffix_.first = __prev->suffix().first; 5703e78f53d1SNikolas Klauser __suffix_.second = __prev->suffix().second; 5704e78f53d1SNikolas Klauser __result_ = &__suffix_; 5705e78f53d1SNikolas Klauser } else 5706e78f53d1SNikolas Klauser __result_ = nullptr; 5707e78f53d1SNikolas Klauser } 5708e78f53d1SNikolas Klauser } 5709e78f53d1SNikolas Klauser return *this; 5710e78f53d1SNikolas Klauser} 5711e78f53d1SNikolas Klauser 5712e78f53d1SNikolas Klauser// regex_replace 5713e78f53d1SNikolas Klauser 5714e78f53d1SNikolas Klausertemplate <class _OutputIterator, class _BidirectionalIterator, class _Traits, class _CharT> 5715e78f53d1SNikolas Klauser_LIBCPP_HIDE_FROM_ABI _OutputIterator regex_replace( 5716e78f53d1SNikolas Klauser _OutputIterator __output_iter, 5717e78f53d1SNikolas Klauser _BidirectionalIterator __first, 5718e78f53d1SNikolas Klauser _BidirectionalIterator __last, 5719e78f53d1SNikolas Klauser const basic_regex<_CharT, _Traits>& __e, 5720e78f53d1SNikolas Klauser const _CharT* __fmt, 5721e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags = regex_constants::match_default) { 5722e78f53d1SNikolas Klauser typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Iter; 5723e78f53d1SNikolas Klauser _Iter __i(__first, __last, __e, __flags); 5724e78f53d1SNikolas Klauser _Iter __eof; 5725e78f53d1SNikolas Klauser if (__i == __eof) { 5726e78f53d1SNikolas Klauser if (!(__flags & regex_constants::format_no_copy)) 5727e78f53d1SNikolas Klauser __output_iter = std::copy(__first, __last, __output_iter); 5728e78f53d1SNikolas Klauser } else { 5729e78f53d1SNikolas Klauser sub_match<_BidirectionalIterator> __lm; 5730e78f53d1SNikolas Klauser for (size_t __len = char_traits<_CharT>::length(__fmt); __i != __eof; ++__i) { 5731e78f53d1SNikolas Klauser if (!(__flags & regex_constants::format_no_copy)) 5732e78f53d1SNikolas Klauser __output_iter = std::copy(__i->prefix().first, __i->prefix().second, __output_iter); 5733e78f53d1SNikolas Klauser __output_iter = __i->format(__output_iter, __fmt, __fmt + __len, __flags); 5734e78f53d1SNikolas Klauser __lm = __i->suffix(); 5735e78f53d1SNikolas Klauser if (__flags & regex_constants::format_first_only) 5736e78f53d1SNikolas Klauser break; 5737e78f53d1SNikolas Klauser } 5738e78f53d1SNikolas Klauser if (!(__flags & regex_constants::format_no_copy)) 5739e78f53d1SNikolas Klauser __output_iter = std::copy(__lm.first, __lm.second, __output_iter); 5740e78f53d1SNikolas Klauser } 5741e78f53d1SNikolas Klauser return __output_iter; 5742e78f53d1SNikolas Klauser} 5743e78f53d1SNikolas Klauser 5744e78f53d1SNikolas Klausertemplate <class _OutputIterator, class _BidirectionalIterator, class _Traits, class _CharT, class _ST, class _SA> 5745e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI _OutputIterator regex_replace( 5746e78f53d1SNikolas Klauser _OutputIterator __output_iter, 5747e78f53d1SNikolas Klauser _BidirectionalIterator __first, 5748e78f53d1SNikolas Klauser _BidirectionalIterator __last, 5749e78f53d1SNikolas Klauser const basic_regex<_CharT, _Traits>& __e, 5750e78f53d1SNikolas Klauser const basic_string<_CharT, _ST, _SA>& __fmt, 5751e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags = regex_constants::match_default) { 5752e78f53d1SNikolas Klauser return std::regex_replace(__output_iter, __first, __last, __e, __fmt.c_str(), __flags); 5753e78f53d1SNikolas Klauser} 5754e78f53d1SNikolas Klauser 5755e78f53d1SNikolas Klausertemplate <class _Traits, class _CharT, class _ST, class _SA, class _FST, class _FSA> 5756e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI basic_string<_CharT, _ST, _SA> 5757e78f53d1SNikolas Klauserregex_replace(const basic_string<_CharT, _ST, _SA>& __s, 5758e78f53d1SNikolas Klauser const basic_regex<_CharT, _Traits>& __e, 5759e78f53d1SNikolas Klauser const basic_string<_CharT, _FST, _FSA>& __fmt, 5760e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags = regex_constants::match_default) { 5761e78f53d1SNikolas Klauser basic_string<_CharT, _ST, _SA> __r; 5762e78f53d1SNikolas Klauser std::regex_replace(std::back_inserter(__r), __s.begin(), __s.end(), __e, __fmt.c_str(), __flags); 5763e78f53d1SNikolas Klauser return __r; 5764e78f53d1SNikolas Klauser} 5765e78f53d1SNikolas Klauser 5766e78f53d1SNikolas Klausertemplate <class _Traits, class _CharT, class _ST, class _SA> 5767e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI basic_string<_CharT, _ST, _SA> 5768e78f53d1SNikolas Klauserregex_replace(const basic_string<_CharT, _ST, _SA>& __s, 5769e78f53d1SNikolas Klauser const basic_regex<_CharT, _Traits>& __e, 5770e78f53d1SNikolas Klauser const _CharT* __fmt, 5771e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags = regex_constants::match_default) { 5772e78f53d1SNikolas Klauser basic_string<_CharT, _ST, _SA> __r; 5773e78f53d1SNikolas Klauser std::regex_replace(std::back_inserter(__r), __s.begin(), __s.end(), __e, __fmt, __flags); 5774e78f53d1SNikolas Klauser return __r; 5775e78f53d1SNikolas Klauser} 5776e78f53d1SNikolas Klauser 5777e78f53d1SNikolas Klausertemplate <class _Traits, class _CharT, class _ST, class _SA> 5778e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI basic_string<_CharT> 5779e78f53d1SNikolas Klauserregex_replace(const _CharT* __s, 5780e78f53d1SNikolas Klauser const basic_regex<_CharT, _Traits>& __e, 5781e78f53d1SNikolas Klauser const basic_string<_CharT, _ST, _SA>& __fmt, 5782e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags = regex_constants::match_default) { 5783e78f53d1SNikolas Klauser basic_string<_CharT> __r; 5784e78f53d1SNikolas Klauser std::regex_replace(std::back_inserter(__r), __s, __s + char_traits<_CharT>::length(__s), __e, __fmt.c_str(), __flags); 5785e78f53d1SNikolas Klauser return __r; 5786e78f53d1SNikolas Klauser} 5787e78f53d1SNikolas Klauser 5788e78f53d1SNikolas Klausertemplate <class _Traits, class _CharT> 5789e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI basic_string<_CharT> 5790e78f53d1SNikolas Klauserregex_replace(const _CharT* __s, 5791e78f53d1SNikolas Klauser const basic_regex<_CharT, _Traits>& __e, 5792e78f53d1SNikolas Klauser const _CharT* __fmt, 5793e78f53d1SNikolas Klauser regex_constants::match_flag_type __flags = regex_constants::match_default) { 5794e78f53d1SNikolas Klauser basic_string<_CharT> __r; 5795e78f53d1SNikolas Klauser std::regex_replace(std::back_inserter(__r), __s, __s + char_traits<_CharT>::length(__s), __e, __fmt, __flags); 5796e78f53d1SNikolas Klauser return __r; 5797e78f53d1SNikolas Klauser} 5798e78f53d1SNikolas Klauser 5799e78f53d1SNikolas Klauser_LIBCPP_END_NAMESPACE_STD 5800e78f53d1SNikolas Klauser 5801e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 17 5802e78f53d1SNikolas Klauser_LIBCPP_BEGIN_NAMESPACE_STD 5803e78f53d1SNikolas Klausernamespace pmr { 5804e78f53d1SNikolas Klausertemplate <class _BidirT> 5805e78f53d1SNikolas Klauserusing match_results _LIBCPP_AVAILABILITY_PMR = 5806e78f53d1SNikolas Klauser std::match_results<_BidirT, polymorphic_allocator<std::sub_match<_BidirT>>>; 5807e78f53d1SNikolas Klauser 5808e78f53d1SNikolas Klauserusing cmatch _LIBCPP_AVAILABILITY_PMR = match_results<const char*>; 5809e78f53d1SNikolas Klauserusing smatch _LIBCPP_AVAILABILITY_PMR = match_results<std::pmr::string::const_iterator>; 5810e78f53d1SNikolas Klauser 5811e78f53d1SNikolas Klauser# ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS 5812e78f53d1SNikolas Klauserusing wcmatch _LIBCPP_AVAILABILITY_PMR = match_results<const wchar_t*>; 5813e78f53d1SNikolas Klauserusing wsmatch _LIBCPP_AVAILABILITY_PMR = match_results<std::pmr::wstring::const_iterator>; 5814e78f53d1SNikolas Klauser# endif 5815e78f53d1SNikolas Klauser} // namespace pmr 5816e78f53d1SNikolas Klauser_LIBCPP_END_NAMESPACE_STD 5817e78f53d1SNikolas Klauser#endif 5818e78f53d1SNikolas Klauser 5819e78f53d1SNikolas Klauser_LIBCPP_POP_MACROS 5820e78f53d1SNikolas Klauser 5821e78f53d1SNikolas Klauser#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 582273fbae83SNikolas Klauser# include <__cxx03/atomic> 582373fbae83SNikolas Klauser# include <__cxx03/concepts> 582473fbae83SNikolas Klauser# include <__cxx03/cstdlib> 582573fbae83SNikolas Klauser# include <__cxx03/iosfwd> 582673fbae83SNikolas Klauser# include <__cxx03/iterator> 582773fbae83SNikolas Klauser# include <__cxx03/mutex> 582873fbae83SNikolas Klauser# include <__cxx03/new> 582973fbae83SNikolas Klauser# include <__cxx03/type_traits> 583073fbae83SNikolas Klauser# include <__cxx03/typeinfo> 583173fbae83SNikolas Klauser# include <__cxx03/utility> 5832e78f53d1SNikolas Klauser#endif 5833e78f53d1SNikolas Klauser 5834ce777190SNikolas Klauser#endif // _LIBCPP___CXX03_REGEX 5835