f5a2d78072
The std::regex code uses std::map and std::vector, which means that when _GLIBCXX_DEBUG is defined it uses the debug versions of those containers. That no longer compiles, because I changed <regex> to include <bits/stl_map.h> and <bits/stl_vector.h> instead of <map> and <vector>, so the debug versions aren't defined, and std::map doesn't compile. There is also a use of std::stack, which defaults to std::deque which is the debug deque when _GLIBCXX_DEBUG is defined. Using std::map, std::vector, and std::deque is probably a mistake, and we should qualify them with _GLIBCXX_STD_C instead so that the debug versions aren't used. We do not need the overhead of checking our own uses of those containers, which should be correct anyway. The exception is the vector base class of std::match_results, which exposes iterators to users, so can benefit from debug mode checks for its iterators. For other accesses to the vector elements, match_results already does its own checks, so can access the _GLIBCXX_STD_C::vector base class directly. Signed-off-by: Jonathan Wakely <jwakely@redhat.com> libstdc++-v3/ChangeLog: * include/bits/regex.h (basic_regex::transform_primary): Use _GLIBCXX_STD_C::vector for local variable. * include/bits/regex.tcc (__regex_algo_impl): Use reference to _GLIBCXX_STD_C::vector base class of match_results. * include/bits/regex_automaton.tcc (_StateSeq:_M_clone): Use _GLIBCXX_STD_C::map and _GLIBCXX_STD_C::deque for local variables. * include/bits/regex_compiler.h (_BracketMatcher): Use _GLIBCXX_STD_C::vector for data members. * include/bits/regex_executor.h (_Executor): Likewise. * include/std/regex [_GLIBCXX_DEBUG]: Include <debug/vector>.
97 lines
3.0 KiB
C++
97 lines
3.0 KiB
C++
// <regex> -*- C++ -*-
|
|
|
|
// Copyright (C) 2007-2021 Free Software Foundation, Inc.
|
|
//
|
|
// This file is part of the GNU ISO C++ Library. This library is free
|
|
// software; you can redistribute it and/or modify it under the
|
|
// terms of the GNU General Public License as published by the
|
|
// Free Software Foundation; either version 3, or (at your option)
|
|
// any later version.
|
|
|
|
// This library is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
|
|
// Under Section 7 of GPL version 3, you are granted additional
|
|
// permissions described in the GCC Runtime Library Exception, version
|
|
// 3.1, as published by the Free Software Foundation.
|
|
|
|
// You should have received a copy of the GNU General Public License and
|
|
// a copy of the GCC Runtime Library Exception along with this program;
|
|
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
|
// <http://www.gnu.org/licenses/>.
|
|
|
|
/** @file include/regex
|
|
* This is a Standard C++ Library header.
|
|
*/
|
|
|
|
#ifndef _GLIBCXX_REGEX
|
|
#define _GLIBCXX_REGEX 1
|
|
|
|
#pragma GCC system_header
|
|
|
|
#if __cplusplus < 201103L
|
|
# include <bits/c++0x_warning.h>
|
|
#else
|
|
|
|
#include <bitset>
|
|
#include <locale>
|
|
#include <sstream>
|
|
#include <stack>
|
|
#include <stdexcept>
|
|
#include <string>
|
|
|
|
#include <ext/aligned_buffer.h>
|
|
#include <ext/numeric_traits.h>
|
|
#include <bits/shared_ptr.h>
|
|
#include <bits/std_function.h>
|
|
#include <bits/stl_algobase.h> // std::copy, std::fill_n
|
|
#include <bits/stl_algo.h> // std::sort, std::unique
|
|
#include <bits/stl_iterator_base_types.h> // std::iterator_traits
|
|
#include <bits/stl_pair.h>
|
|
#include <bits/stl_tree.h>
|
|
#include <bits/stl_map.h>
|
|
#include <bits/stl_vector.h>
|
|
#include <bits/stl_bvector.h>
|
|
#include <bits/vector.tcc>
|
|
#ifdef _GLIBCXX_DEBUG
|
|
# include <debug/vector>
|
|
#endif
|
|
#include <bits/regex_constants.h>
|
|
#include <bits/regex_error.h>
|
|
#include <bits/regex_automaton.h>
|
|
#include <bits/regex_scanner.h>
|
|
#include <bits/regex_compiler.h>
|
|
#include <bits/regex.h>
|
|
#include <bits/regex_executor.h>
|
|
|
|
#if __cplusplus >= 201703L && _GLIBCXX_USE_CXX11_ABI
|
|
namespace std _GLIBCXX_VISIBILITY(default)
|
|
{
|
|
_GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|
namespace pmr
|
|
{
|
|
template<typename _Tp> class polymorphic_allocator;
|
|
template<typename _BidirectionalIterator>
|
|
using match_results
|
|
= std::match_results<_BidirectionalIterator, polymorphic_allocator<
|
|
sub_match<_BidirectionalIterator>>>;
|
|
using cmatch = match_results<const char*>;
|
|
// Use __normal_iterator directly, because pmr::string::const_iterator
|
|
// would require pmr::polymorphic_allocator to be complete.
|
|
using smatch
|
|
= match_results<__gnu_cxx::__normal_iterator<const char*, string>>;
|
|
#ifdef _GLIBCXX_USE_WCHAR_T
|
|
using wcmatch = match_results<const wchar_t*>;
|
|
using wsmatch
|
|
= match_results<__gnu_cxx::__normal_iterator<const wchar_t*, wstring>>;
|
|
#endif
|
|
} // namespace pmr
|
|
_GLIBCXX_END_NAMESPACE_VERSION
|
|
} // namespace std
|
|
#endif // C++17
|
|
#endif // C++11
|
|
|
|
#endif // _GLIBCXX_REGEX
|