// <regex> -*- C++ -*-

// Copyright (C) 2007-2025 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

#ifdef _GLIBCXX_SYSHDR
#pragma GCC system_header
#endif

#include <bits/requires_hosted.h> // string and container heavy

#if __cplusplus < 201103L
# include <bits/c++0x_warning.h>
#else

#include <bitset>
#include <locale>
#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>

#define __glibcxx_want_nonmember_container_access
#include <bits/version.h>

#if __cplusplus >= 201703L && _GLIBCXX_USE_CXX11_ABI
#include <bits/memory_resource.h>
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
  namespace pmr
  {
    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
