diff --git a/contrib/relpath.sh b/contrib/relpath.sh new file mode 100755 index 0000000000000000000000000000000000000000..ac6b769ef81a18ee250c9e1d52fccb0db15397af --- /dev/null +++ b/contrib/relpath.sh @@ -0,0 +1,81 @@ +#!/bin/sh + +if [ "$1" = "--help" -o $# -ne 2 -o -f "$1" ]; then + echo Usage: relpath.sh FROM TO + echo Print the relative path from FROM to TO + echo FROM must be a directory, but need not exist + exit 0 +fi + +from="${1%%/}" +to="${2%%/}" + +# The parent directory of a pathname, handling .. +parent() { + name=$(basename "$1") + path=$(dirname "$1") + top=$(basename "$path") + if [ "$top" = ".." ]; then + path=$(parent "$path") + fi + if [ "$name" = ".." ]; then + path=$(parent "$path") + fi + echo $path +} + +# Canonicalize a directory that contains '..'. +canonicalize() { + path=$1 + suffix= + while ! [ -d "$path" ]; do + name=$(basename "$path") + path=$(parent "$path") + suffix="/$name$suffix" + done + if [ -d "$path" ]; then + echo $(cd "$path"; pwd)$suffix + else + echo $1 + fi +} + +case "$to$from" in + *..* ) + from=$(canonicalize "$from") + to=$(canonicalize "$to") + ;; +esac +case "$to$from" in + *..* ) + echo unable to canonicalize .. >&2 + exit 1 + ;; +esac + +back= +while [ "${to#$from}" = "$to" ]; do + #echo $from too long + from=$(dirname $from); + back=../$back + + if [ "$from" = "/" ]; then + echo $to + exit 0 + elif [ "$from" = . ]; then + echo no common ancestor between $1 and $2 >&2 + exit 1 + fi +done + +to=${to#$from} +to=${to##/} +back=${back%%/} + +if [ -n "$to" ] && [ -n "$back" ]; then + echo $back/$to +elif [ -n "$back$to" ]; then + echo $back$to +else + echo . +fi diff --git a/libstdc++-v3/include/bits/version.def b/libstdc++-v3/include/bits/version.def index 364bafc9bba5c730259c46dd59f0db1a7b642add..8d4b8e9b383e0846cb14f35c83dd0de9688d9761 100644 --- a/libstdc++-v3/include/bits/version.def +++ b/libstdc++-v3/include/bits/version.def @@ -1873,6 +1873,15 @@ ftms = { }; }; +ftms = { + name = modules; + values = { + v = 202207; + cxxmin = 20; + extra_cond = "__cpp_modules"; + }; +}; + // Standard test specifications. stds[97] = ">= 199711L"; stds[03] = ">= 199711L"; diff --git a/libstdc++-v3/include/bits/version.h b/libstdc++-v3/include/bits/version.h index a0e3b36864b71c8312195e3e38cc2afb76a26a84..c556aca38fa8570473afa1c6d93be7a80e1d0ec8 100644 --- a/libstdc++-v3/include/bits/version.h +++ b/libstdc++-v3/include/bits/version.h @@ -2075,4 +2075,14 @@ #endif /* !defined(__cpp_lib_to_string) && defined(__glibcxx_want_to_string) */ #undef __glibcxx_want_to_string +#if !defined(__cpp_lib_modules) +# if (__cplusplus >= 202002L) && (__cpp_modules) +# define __glibcxx_modules 202207L +# if defined(__glibcxx_want_all) || defined(__glibcxx_want_modules) +# define __cpp_lib_modules 202207L +# endif +# endif +#endif /* !defined(__cpp_lib_modules) && defined(__glibcxx_want_modules) */ +#undef __glibcxx_want_modules + #undef __glibcxx_want_all diff --git a/libstdc++-v3/src/c++23/Makefile.am b/libstdc++-v3/src/c++23/Makefile.am index 74996d1e147a3c4f0197f5a7b0c9ac4fe93705c4..cf5b7d6a4301724b1c37b798819bd3228bd4d0e4 100644 --- a/libstdc++-v3/src/c++23/Makefile.am +++ b/libstdc++-v3/src/c++23/Makefile.am @@ -25,6 +25,40 @@ include $(top_srcdir)/fragment.am # Convenience library for C++23 runtime. noinst_LTLIBRARIES = libc++23convenience.la +# Module std support. Not compiled for now, only installed. +# Let's install the interface units in the bits subdirectory. +toolexeclib_DATA = libstdc++.modules.json +includebitsdir = $(gxx_include_dir)/bits +includebits_DATA = std.cc std.compat.cc + +# The manifest to be installed uses the relative path between install dirs. +libstdc++.modules.json: libstdc++.modules.json.in + relpath=$$($(toplevel_srcdir)/contrib/relpath.sh \ + $(abspath $(toolexeclibdir)) \ + $(abspath $(includebitsdir))) && \ + sed "s,@MODPATH@,$$relpath," $< > $@ + +# The uninstalled manifest uses the relative path to builddir. +stamp-module-manifest: libstdc++.modules.json.in + @-mkdir -p ../.libs + sed "s,@MODPATH@,../c++23," $< \ + > ../.libs/libstdc++.modules.json + @$(STAMP) $@ + +# Add the C library exports to both modules. +std.cc: std.cc.in std-clib.cc.in + cat $^ > $@ +std.compat.cc: std.compat.cc.in std-clib.cc.in + cat $^ > $@ + +# Also put the interface units in the build-includes bits directory. +stamp-modules-bits: $(includebits_DATA) + @-mkdir -p $(top_builddir)/include/bits + -cd $(top_builddir)/include/bits && $(LN_S) $(abspath $?) . 2>/dev/null + @$(STAMP) $@ + +all-local: stamp-module-manifest stamp-modules-bits + headers = if ENABLE_EXTERN_TEMPLATE diff --git a/libstdc++-v3/src/c++23/Makefile.in b/libstdc++-v3/src/c++23/Makefile.in index ce609688025042e08919e6b6d8824be3889b1454..715c14c6b8155695c14471eba118e4fdccaa7992 100644 --- a/libstdc++-v3/src/c++23/Makefile.in +++ b/libstdc++-v3/src/c++23/Makefile.in @@ -14,6 +14,7 @@ @SET_MAKE@ + VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ @@ -162,6 +163,36 @@ am__can_run_installinfo = \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(includebitsdir)" \ + "$(DESTDIR)$(toolexeclibdir)" +DATA = $(includebits_DATA) $(toolexeclib_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is @@ -424,6 +455,12 @@ AM_CPPFLAGS = $(GLIBCXX_INCLUDES) $(CPPFLAGS) # Convenience library for C++23 runtime. noinst_LTLIBRARIES = libc++23convenience.la + +# Module std support. Not compiled for now, only installed. +# Let's install the interface units in the bits subdirectory. +toolexeclib_DATA = libstdc++.modules.json +includebitsdir = $(gxx_include_dir)/bits +includebits_DATA = std.cc std.compat.cc headers = # XTEMPLATE_FLAGS = @ENABLE_EXTERN_TEMPLATE_FALSE@inst_sources = @@ -566,6 +603,48 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs +install-includebitsDATA: $(includebits_DATA) + @$(NORMAL_INSTALL) + @list='$(includebits_DATA)'; test -n "$(includebitsdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(includebitsdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(includebitsdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(includebitsdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(includebitsdir)" || exit $$?; \ + done + +uninstall-includebitsDATA: + @$(NORMAL_UNINSTALL) + @list='$(includebits_DATA)'; test -n "$(includebitsdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(includebitsdir)'; $(am__uninstall_files_from_dir) +install-toolexeclibDATA: $(toolexeclib_DATA) + @$(NORMAL_INSTALL) + @list='$(toolexeclib_DATA)'; test -n "$(toolexeclibdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(toolexeclibdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibdir)" || exit $$?; \ + done + +uninstall-toolexeclibDATA: + @$(NORMAL_UNINSTALL) + @list='$(toolexeclib_DATA)'; test -n "$(toolexeclibdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(toolexeclibdir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique @@ -620,8 +699,11 @@ distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-am: all-am check: check-am -all-am: Makefile $(LTLIBRARIES) +all-am: Makefile $(LTLIBRARIES) $(DATA) all-local installdirs: + for dir in "$(DESTDIR)$(includebitsdir)" "$(DESTDIR)$(toolexeclibdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done install: install-am install-exec: install-exec-am install-data: install-data-am @@ -674,13 +756,13 @@ info: info-am info-am: -install-data-am: +install-data-am: install-includebitsDATA install-dvi: install-dvi-am install-dvi-am: -install-exec-am: +install-exec-am: install-toolexeclibDATA install-html: install-html-am @@ -719,27 +801,57 @@ ps: ps-am ps-am: -uninstall-am: +uninstall-am: uninstall-includebitsDATA uninstall-toolexeclibDATA .MAKE: install-am install-strip -.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ - ctags-am distclean distclean-compile distclean-generic \ - distclean-libtool distclean-tags dvi dvi-am html html-am info \ - info-am install install-am install-data install-data-am \ - install-dvi install-dvi-am install-exec install-exec-am \ - install-html install-html-am install-info install-info-am \ +.PHONY: CTAGS GTAGS TAGS all all-am all-local check check-am clean \ + clean-generic clean-libtool clean-noinstLTLIBRARIES \ + cscopelist-am ctags ctags-am distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags dvi dvi-am \ + html html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am \ + install-includebitsDATA install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ - install-ps-am install-strip installcheck installcheck-am \ - installdirs maintainer-clean maintainer-clean-generic \ - mostlyclean mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ - uninstall-am + install-ps-am install-strip install-toolexeclibDATA \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am uninstall-includebitsDATA \ + uninstall-toolexeclibDATA .PRECIOUS: Makefile +# The manifest to be installed uses the relative path between install dirs. +libstdc++.modules.json: libstdc++.modules.json.in + relpath=$$($(toplevel_srcdir)/contrib/relpath.sh \ + $(abspath $(toolexeclibdir)) \ + $(abspath $(includebitsdir))) && \ + sed "s,@MODPATH@,$$relpath," $< > $@ + +# The uninstalled manifest uses the relative path to builddir. +stamp-module-manifest: libstdc++.modules.json.in + @-mkdir -p ../.libs + sed "s,@MODPATH@,../c++23," $< \ + > ../.libs/libstdc++.modules.json + @$(STAMP) $@ + +# Add the C library exports to both modules. +std.cc: std.cc.in std-clib.cc.in + cat $^ > $@ +std.compat.cc: std.compat.cc.in std-clib.cc.in + cat $^ > $@ + +# Also put the interface units in the build-includes bits directory. +stamp-modules-bits: $(includebits_DATA) + @-mkdir -p $(top_builddir)/include/bits + -cd $(top_builddir)/include/bits && $(LN_S) $(abspath $?) . 2>/dev/null + @$(STAMP) $@ + +all-local: stamp-module-manifest stamp-modules-bits + vpath % $(top_srcdir)/src/c++23 # Use C++26 so that std::filebuf::native_handle() is available. diff --git a/libstdc++-v3/src/c++23/libstdc++.modules.json.in b/libstdc++-v3/src/c++23/libstdc++.modules.json.in new file mode 100644 index 0000000000000000000000000000000000000000..063474805ad8ade1b7d7c5a5adb0e46671442a0e --- /dev/null +++ b/libstdc++-v3/src/c++23/libstdc++.modules.json.in @@ -0,0 +1,17 @@ +// C++ module metadata, to install alongside libstdc++.so +{ + "version": 1, + "revision": 1, + "modules": [ + { + "logical-name": "std", + "source-path": "@MODPATH@/std.cc", + "is-std-library": true + }, + { + "logical-name": "std.compat", + "source-path": "@MODPATH@/std.compat.cc", + "is-std-library": true + } + ] +} diff --git a/libstdc++-v3/src/c++23/std-clib.cc.in b/libstdc++-v3/src/c++23/std-clib.cc.in new file mode 100644 index 0000000000000000000000000000000000000000..9d175b4bb4d1dd08fb4638a6d6eada0b61af0777 --- /dev/null +++ b/libstdc++-v3/src/c++23/std-clib.cc.in @@ -0,0 +1,676 @@ +// C standard library exports for -*- C++ -*- std and std.compat modules +// This file is appended to std.cc.in or std-compat.cc.in. + +#ifdef STD_COMPAT +#define C_LIB_NAMESPACE +#else +#define C_LIB_NAMESPACE namespace std +#endif + +// C standard library headers [tab:headers.cpp.c] + +// 19.3 <cassert> +// No exports + +// 23.5.1 <cctype> +export C_LIB_NAMESPACE +{ + using std::isalnum; + using std::isalpha; + using std::isblank; + using std::iscntrl; + using std::isdigit; + using std::isgraph; + using std::islower; + using std::isprint; + using std::ispunct; + using std::isspace; + using std::isupper; + using std::isxdigit; + using std::tolower; + using std::toupper; +} + +// 19.4 <cerrno> +// No exports + +// 28.3 <cfenv> +export C_LIB_NAMESPACE +{ + using std::feclearexcept; + using std::fegetenv; + using std::fegetexceptflag; + using std::fegetround; + using std::feholdexcept; + using std::fenv_t; + using std::feraiseexcept; + using std::fesetenv; + using std::fesetexceptflag; + using std::fesetround; + using std::fetestexcept; + using std::feupdateenv; + using std::fexcept_t; +} + +// 17.3.7 <cfloat> [cfloat.syn] +// No exports, only provides macros + +// 31.13.2 <cinttypes> +export C_LIB_NAMESPACE +{ + using std::imaxabs; + using std::imaxdiv; + using std::imaxdiv_t; + using std::strtoimax; + using std::strtoumax; + using std::wcstoimax; + using std::wcstoumax; +} + +// 17.3.6 <climits> [climits.syn] +// No exports, only provides macros + +// 30.5 <clocale> +export C_LIB_NAMESPACE +{ + using std::lconv; + using std::localeconv; + using std::setlocale; + // LC_* macros not exported +} + +// 28.7.1 <cmath> +export C_LIB_NAMESPACE +{ + using std::abs; + using std::acos; + using std::acosf; + using std::acosh; + using std::acoshf; + using std::acoshl; + using std::acosl; + using std::asin; + using std::asinf; + using std::asinh; + using std::asinhf; + using std::asinhl; + using std::asinl; + using std::atan; + using std::atan2; + using std::atan2f; + using std::atan2l; + using std::atanf; + using std::atanh; + using std::atanhf; + using std::atanhl; + using std::atanl; + using std::cbrt; + using std::cbrtf; + using std::cbrtl; + using std::ceil; + using std::ceilf; + using std::ceill; + using std::copysign; + using std::copysignf; + using std::copysignl; + using std::cos; + using std::cosf; + using std::cosh; + using std::coshf; + using std::coshl; + using std::cosl; + using std::double_t; + using std::erf; + using std::erfc; + using std::erfcf; + using std::erfcl; + using std::erff; + using std::erfl; + using std::exp; + using std::exp2; + using std::exp2f; + using std::exp2l; + using std::expf; + using std::expl; + using std::expm1; + using std::expm1f; + using std::expm1l; + using std::fabs; + using std::fabsf; + using std::fabsl; + using std::fdim; + using std::fdimf; + using std::fdiml; + using std::float_t; + using std::floor; + using std::floorf; + using std::floorl; + using std::fma; + using std::fmaf; + using std::fmal; + using std::fmax; + using std::fmaxf; + using std::fmaxl; + using std::fmin; + using std::fminf; + using std::fminl; + using std::fmod; + using std::fmodf; + using std::fmodl; + using std::fpclassify; + using std::frexp; + using std::frexpf; + using std::frexpl; + using std::hypot; + using std::hypotf; + using std::hypotl; + using std::ilogb; + using std::ilogbf; + using std::ilogbl; + using std::isfinite; + using std::isgreater; + using std::isgreaterequal; + using std::isinf; + using std::isless; + using std::islessequal; + using std::islessgreater; + using std::isnan; + using std::isnormal; + using std::isunordered; + using std::ldexp; + using std::ldexpf; + using std::ldexpl; +#ifndef STD_COMPAT + using std::lerp; +#endif + using std::lgamma; + using std::lgammaf; + using std::lgammal; + using std::llrint; + using std::llrintf; + using std::llrintl; + using std::llround; + using std::llroundf; + using std::llroundl; + using std::log; + using std::log10; + using std::log10f; + using std::log10l; + using std::log1p; + using std::log1pf; + using std::log1pl; + using std::log2; + using std::log2f; + using std::log2l; + using std::logb; + using std::logbf; + using std::logbl; + using std::logf; + using std::logl; + using std::lrint; + using std::lrintf; + using std::lrintl; + using std::lround; + using std::lroundf; + using std::lroundl; + using std::modf; + using std::modff; + using std::modfl; + using std::nan; + using std::nanf; + using std::nanl; + using std::nearbyint; + using std::nearbyintf; + using std::nearbyintl; + using std::nextafter; + using std::nextafterf; + using std::nextafterl; + using std::nexttoward; + using std::nexttowardf; + using std::nexttowardl; + using std::pow; + using std::powf; + using std::powl; + using std::remainder; + using std::remainderf; + using std::remainderl; + using std::remquo; + using std::remquof; + using std::remquol; + using std::rint; + using std::rintf; + using std::rintl; + using std::round; + using std::roundf; + using std::roundl; + using std::scalbln; + using std::scalblnf; + using std::scalblnl; + using std::scalbn; + using std::scalbnf; + using std::scalbnl; + using std::signbit; + using std::sin; + using std::sinf; + using std::sinh; + using std::sinhf; + using std::sinhl; + using std::sinl; + using std::sqrt; + using std::sqrtf; + using std::sqrtl; + using std::tan; + using std::tanf; + using std::tanh; + using std::tanhf; + using std::tanhl; + using std::tanl; + using std::tgamma; + using std::tgammaf; + using std::tgammal; + using std::trunc; + using std::truncf; + using std::truncl; + +#if __cpp_lib_math_special_functions && !defined(STD_COMPAT) + using std::assoc_laguerre; + using std::assoc_laguerref; + using std::assoc_laguerrel; + using std::assoc_legendre; + using std::assoc_legendref; + using std::assoc_legendrel; + using std::beta; + using std::betaf; + using std::betal; + using std::comp_ellint_1; + using std::comp_ellint_1f; + using std::comp_ellint_1l; + using std::comp_ellint_2; + using std::comp_ellint_2f; + using std::comp_ellint_2l; + using std::comp_ellint_3; + using std::comp_ellint_3f; + using std::comp_ellint_3l; + using std::cyl_bessel_i; + using std::cyl_bessel_if; + using std::cyl_bessel_il; + using std::cyl_bessel_j; + using std::cyl_bessel_jf; + using std::cyl_bessel_jl; + using std::cyl_bessel_k; + using std::cyl_bessel_kf; + using std::cyl_bessel_kl; + using std::cyl_neumann; + using std::cyl_neumannf; + using std::cyl_neumannl; + using std::ellint_1; + using std::ellint_1f; + using std::ellint_1l; + using std::ellint_2; + using std::ellint_2f; + using std::ellint_2l; + using std::ellint_3; + using std::ellint_3f; + using std::ellint_3l; + using std::expint; + using std::expintf; + using std::expintl; + using std::hermite; + using std::hermitef; + using std::hermitel; + using std::legendre; + using std::legendref; + using std::legendrel; + using std::laguerre; + using std::laguerref; + using std::laguerrel; + using std::riemann_zeta; + using std::riemann_zetaf; + using std::riemann_zetal; + using std::sph_bessel; + using std::sph_besself; + using std::sph_bessell; + using std::sph_legendre; + using std::sph_legendref; + using std::sph_legendrel; + using std::sph_neumann; + using std::sph_neumannf; + using std::sph_neumannl; +#endif +} + +// 17.13.3 <csetjmp> +export C_LIB_NAMESPACE +{ + using std::jmp_buf; + using std::longjmp; + // setjmp macro not exported +} + +// 17.13.4 <csignal> +export C_LIB_NAMESPACE +{ + using std::raise; + using std::sig_atomic_t; + using std::signal; + // SIG_* macros not exported +} + +// 17.13.2 <cstdarg> +export C_LIB_NAMESPACE +{ + using std::va_list; + // va_arg and friend macros not exported +} + +// 17.2.1 <cstddef> [cstddef.syn] +export C_LIB_NAMESPACE +{ + using std::max_align_t; + using std::nullptr_t; + using std::ptrdiff_t; + using std::size_t; +#ifndef STD_COMPAT + using std::byte; + using std::operator<<=; + using std::operator<<; + using std::operator>>=; + using std::operator>>; + using std::operator|=; + using std::operator|; + using std::operator&=; + using std::operator&; + using std::operator^=; + using std::operator^; + using std::operator~; + using std::to_integer; +#endif + // NULL and offsetof macros not exported +} + +// 17.4 <cstdint> +export C_LIB_NAMESPACE +{ + using std::int8_t; + using std::int16_t; + using std::int32_t; + using std::int64_t; + using std::int_fast16_t; + using std::int_fast32_t; + using std::int_fast64_t; + using std::int_fast8_t; + using std::int_least16_t; + using std::int_least32_t; + using std::int_least64_t; + using std::int_least8_t; + using std::intmax_t; + using std::intptr_t; + using std::uint8_t; + using std::uint16_t; + using std::uint32_t; + using std::uint64_t; + using std::uint_fast16_t; + using std::uint_fast32_t; + using std::uint_fast64_t; + using std::uint_fast8_t; + using std::uint_least16_t; + using std::uint_least32_t; + using std::uint_least64_t; + using std::uint_least8_t; + using std::uintmax_t; + using std::uintptr_t; +} + +// 31.13.1 <cstdio> +export C_LIB_NAMESPACE +{ + using std::clearerr; + using std::fclose; + using std::feof; + using std::ferror; + using std::fflush; + using std::fgetc; + using std::fgetpos; + using std::fgets; + using std::FILE; + using std::fopen; + using std::fpos_t; + using std::fprintf; + using std::fputc; + using std::fputs; + using std::fread; + using std::freopen; + using std::fscanf; + using std::fseek; + using std::fsetpos; + using std::ftell; + using std::fwrite; + using std::getc; + using std::getchar; + using std::perror; + using std::printf; + using std::putc; + using std::putchar; + using std::puts; + using std::remove; + using std::rename; + using std::rewind; + using std::scanf; + using std::setbuf; + using std::setvbuf; + using std::size_t; + using std::snprintf; + using std::sprintf; + using std::sscanf; + using std::tmpfile; + using std::tmpnam; + using std::ungetc; + using std::vfprintf; + using std::vfscanf; + using std::vprintf; + using std::vscanf; + using std::vsnprintf; + using std::vsprintf; + using std::vsscanf; +} + +// 17.2.2 <cstdlib> [cstdlib.syn] +export C_LIB_NAMESPACE +{ + using std::_Exit; + using std::abort; + using std::abs; + using std::aligned_alloc; + using std::at_quick_exit; + using std::atexit; + using std::atof; + using std::atoi; + using std::atol; + using std::atoll; + using std::bsearch; + using std::calloc; + using std::div; + using std::div_t; + using std::exit; + using std::free; + using std::getenv; + using std::labs; + using std::ldiv; + using std::ldiv_t; + using std::llabs; + using std::lldiv; + using std::lldiv_t; + using std::malloc; + using std::mblen; + using std::mbstowcs; + using std::mbtowc; + using std::qsort; + using std::quick_exit; + using std::rand; + using std::realloc; + using std::size_t; + using std::srand; + using std::strtod; + using std::strtof; + using std::strtol; + using std::strtold; + using std::strtoll; + using std::strtoul; + using std::strtoull; + using std::system; + using std::wcstombs; + using std::wctomb; +} + +// 23.5.3 <cstring> +export C_LIB_NAMESPACE +{ + using std::memchr; + using std::memcmp; + using std::memcpy; + using std::memmove; + using std::memset; + using std::size_t; + using std::strcat; + using std::strchr; + using std::strcmp; + using std::strcoll; + using std::strcpy; + using std::strcspn; + using std::strerror; + using std::strlen; + using std::strncat; + using std::strncmp; + using std::strncpy; + using std::strpbrk; + using std::strrchr; + using std::strspn; + using std::strstr; + using std::strtok; + using std::strxfrm; +} + +// 29.15 <ctime> +export C_LIB_NAMESPACE +{ + using std::asctime; + using std::clock; + using std::clock_t; + using std::ctime; + using std::difftime; + using std::gmtime; + using std::localtime; + using std::mktime; + using std::size_t; + using std::strftime; + using std::time; + using std::time_t; + using std::timespec; + using std::tm; + using std::timespec_get; +} + +// 23.5.5 <cuchar> +export C_LIB_NAMESPACE +{ + using std::mbrtoc8; + using std::c8rtomb; + using std::mbrtoc16; + using std::c16rtomb; + using std::mbrtoc32; + using std::c32rtomb; +} + +// 23.5.4 <cwchar> +export C_LIB_NAMESPACE +{ + using std::btowc; + using std::fgetwc; + using std::fgetws; + using std::fputwc; + using std::fputws; + using std::fwide; + using std::fwprintf; + using std::fwscanf; + using std::getwc; + using std::getwchar; + using std::mbrlen; + using std::mbrtowc; + using std::mbsinit; + using std::mbsrtowcs; + using std::mbstate_t; + using std::putwc; + using std::putwchar; + using std::size_t; + using std::swprintf; + using std::swscanf; + using std::tm; + using std::ungetwc; + using std::vfwprintf; + using std::vfwscanf; + using std::vswprintf; + using std::vswscanf; + using std::vwprintf; + using std::vwscanf; + using std::wcrtomb; + using std::wcscat; + using std::wcschr; + using std::wcscmp; + using std::wcscoll; + using std::wcscpy; + using std::wcscspn; + using std::wcsftime; + using std::wcslen; + using std::wcsncat; + using std::wcsncmp; + using std::wcsncpy; + using std::wcspbrk; + using std::wcsrchr; + using std::wcsrtombs; + using std::wcsspn; + using std::wcsstr; + using std::wcstod; + using std::wcstof; + using std::wcstok; + using std::wcstol; + using std::wcstold; + using std::wcstoll; + using std::wcstoul; + using std::wcstoull; + using std::wcsxfrm; + using std::wctob; + using std::wint_t; + using std::wmemchr; + using std::wmemcmp; + using std::wmemcpy; + using std::wmemmove; + using std::wmemset; + using std::wprintf; + using std::wscanf; +} + +// 23.5.2 <cwctype> +export C_LIB_NAMESPACE +{ + using std::iswalnum; + using std::iswalpha; + using std::iswblank; + using std::iswcntrl; + using std::iswctype; + using std::iswdigit; + using std::iswgraph; + using std::iswlower; + using std::iswprint; + using std::iswpunct; + using std::iswspace; + using std::iswupper; + using std::iswxdigit; + using std::towctrans; + using std::towlower; + using std::towupper; + using std::wctrans; + using std::wctrans_t; + using std::wctype; + using std::wctype_t; + using std::wint_t; +} diff --git a/libstdc++-v3/src/c++23/std.cc.in b/libstdc++-v3/src/c++23/std.cc.in new file mode 100644 index 0000000000000000000000000000000000000000..d225c8b8c85ad5a40350a71e6fd8ef1f65ede907 --- /dev/null +++ b/libstdc++-v3/src/c++23/std.cc.in @@ -0,0 +1,3253 @@ +// -*- C++ -*- [std.modules] module std + +// Copyright The GNU Toolchain Authors. +// +// 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. + +// 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/>. + +module; + +// stdc++.h doesn't include <execution> because of TBB issues; +// FIXME for now let's avoid the problem by suppressing TBB. +#define _GLIBCXX_USE_TBB_PAR_BACKEND 0 + +#include <bits/stdc++.h> +#include <execution> + +// Module std does include deprecated library interfaces. +#undef __DEPRECATED +#include <strstream> + +export module std; + +// C library exports are appended from std-clib.cc.in. + +// 27.4 <algorithm> +export namespace std +{ + namespace ranges + { + using std::ranges::in_found_result; + using std::ranges::in_fun_result; + using std::ranges::in_in_out_result; + using std::ranges::in_in_result; + using std::ranges::in_out_out_result; + using std::ranges::in_out_result; + using std::ranges::min_max_result; + } + using std::all_of; + namespace ranges + { + using std::ranges::all_of; + } + using std::any_of; + namespace ranges + { + using std::ranges::any_of; + } + using std::none_of; + namespace ranges + { + using std::ranges::none_of; + } + using std::for_each; + namespace ranges + { + using std::ranges::for_each; + using std::ranges::for_each_result; + } + using std::for_each_n; + namespace ranges + { + using std::ranges::for_each_n; + using std::ranges::for_each_n_result; + } + using std::find; + using std::find_if; + using std::find_if_not; + namespace ranges + { + using std::ranges::find; + using std::ranges::find_if; + using std::ranges::find_if_not; + } + using std::find_end; + namespace ranges + { + using std::ranges::find_end; + } + using std::find_first_of; + namespace ranges + { + using std::ranges::find_first_of; + } + using std::adjacent_find; + namespace ranges + { + using std::ranges::adjacent_find; + } + using std::count; + using std::count_if; + namespace ranges + { + using std::ranges::count; + using std::ranges::count_if; + } + using std::mismatch; + namespace ranges + { + using std::ranges::mismatch; + using std::ranges::mismatch_result; + } + using std::equal; + namespace ranges + { + using std::ranges::equal; + } + using std::is_permutation; + namespace ranges + { + using std::ranges::is_permutation; + } + using std::search; + namespace ranges + { + using std::ranges::search; + } + using std::search_n; + namespace ranges + { + using std::ranges::search_n; + } + namespace ranges + {} + using std::copy; + namespace ranges + { + using std::ranges::copy; + using std::ranges::copy_result; + } + using std::copy_n; + namespace ranges + { + using std::ranges::copy_n; + using std::ranges::copy_n_result; + } + using std::copy_if; + namespace ranges + { + using std::ranges::copy_if; + using std::ranges::copy_if_result; + } + using std::copy_backward; + namespace ranges + { + using std::ranges::copy_backward; + using std::ranges::copy_backward_result; + } + using std::move; + namespace ranges + { + using std::ranges::move; + using std::ranges::move_result; + } + using std::move_backward; + namespace ranges + { + using std::ranges::move_backward; + using std::ranges::move_backward_result; + } + using std::swap_ranges; + namespace ranges + { + using std::ranges::swap_ranges; + using std::ranges::swap_ranges_result; + } + using std::iter_swap; + using std::transform; + namespace ranges + { + using std::ranges::binary_transform_result; + using std::ranges::transform; + using std::ranges::unary_transform_result; + } + using std::replace; + using std::replace_if; + namespace ranges + { + using std::ranges::replace; + using std::ranges::replace_if; + } + using std::replace_copy; + using std::replace_copy_if; + namespace ranges + { + using std::ranges::replace_copy; + using std::ranges::replace_copy_if; + using std::ranges::replace_copy_if_result; + using std::ranges::replace_copy_result; + } + using std::fill; + using std::fill_n; + namespace ranges + { + using std::ranges::fill; + using std::ranges::fill_n; + } + using std::generate; + using std::generate_n; + namespace ranges + { + using std::ranges::generate; + using std::ranges::generate_n; + } + using std::remove; + using std::remove_if; + namespace ranges + { + using std::ranges::remove; + using std::ranges::remove_if; + } + using std::remove_copy; + using std::remove_copy_if; + namespace ranges + { + using std::ranges::remove_copy; + using std::ranges::remove_copy_if; + using std::ranges::remove_copy_if_result; + using std::ranges::remove_copy_result; + } + using std::unique; + namespace ranges + { + using std::ranges::unique; + } + using std::unique_copy; + namespace ranges + { + using std::ranges::unique_copy; + using std::ranges::unique_copy_result; + } + using std::reverse; + namespace ranges + { + using std::ranges::reverse; + } + using std::reverse_copy; + namespace ranges + { + using std::ranges::reverse_copy; + using std::ranges::reverse_copy_result; + } + using std::rotate; + namespace ranges + { + using std::ranges::rotate; + } + using std::rotate_copy; + namespace ranges + { + using std::ranges::rotate_copy; + using std::ranges::rotate_copy_result; + } + using std::sample; + namespace ranges + { + using std::ranges::sample; + } + using std::shuffle; + namespace ranges + { + using std::ranges::shuffle; + } + using std::shift_left; + namespace ranges + {} + using std::shift_right; + namespace ranges + {} + using std::sort; + namespace ranges + { + using std::ranges::sort; + } + using std::stable_sort; + namespace ranges + { + using std::ranges::stable_sort; + } + using std::partial_sort; + namespace ranges + { + using std::ranges::partial_sort; + } + using std::partial_sort_copy; + namespace ranges + { + using std::ranges::partial_sort_copy; + using std::ranges::partial_sort_copy_result; + } + using std::is_sorted; + using std::is_sorted_until; + namespace ranges + { + using std::ranges::is_sorted; + using std::ranges::is_sorted_until; + } + using std::nth_element; + namespace ranges + { + using std::ranges::nth_element; + } + using std::lower_bound; + namespace ranges + { + using std::ranges::lower_bound; + } + using std::upper_bound; + namespace ranges + { + using std::ranges::upper_bound; + } + using std::equal_range; + namespace ranges + { + using std::ranges::equal_range; + } + using std::binary_search; + namespace ranges + { + using std::ranges::binary_search; + } + using std::is_partitioned; + namespace ranges + { + using std::ranges::is_partitioned; + } + using std::partition; + namespace ranges + { + using std::ranges::partition; + } + using std::stable_partition; + namespace ranges + { + using std::ranges::stable_partition; + } + using std::partition_copy; + namespace ranges + { + using std::ranges::partition_copy; + using std::ranges::partition_copy_result; + } + using std::partition_point; + namespace ranges + { + using std::ranges::partition_point; + } + using std::merge; + namespace ranges + { + using std::ranges::merge; + using std::ranges::merge_result; + } + using std::inplace_merge; + namespace ranges + { + using std::ranges::inplace_merge; + } + using std::includes; + namespace ranges + { + using std::ranges::includes; + } + using std::set_union; + namespace ranges + { + using std::ranges::set_union; + using std::ranges::set_union_result; + } + using std::set_intersection; + namespace ranges + { + using std::ranges::set_intersection; + using std::ranges::set_intersection_result; + } + using std::set_difference; + namespace ranges + { + using std::ranges::set_difference; + using std::ranges::set_difference_result; + } + using std::set_symmetric_difference; + namespace ranges + { + using std::ranges::set_symmetric_difference; + using std::ranges::set_symmetric_difference_result; + } + using std::push_heap; + namespace ranges + { + using std::ranges::push_heap; + } + using std::pop_heap; + namespace ranges + { + using std::ranges::pop_heap; + } + using std::make_heap; + namespace ranges + { + using std::ranges::make_heap; + } + using std::sort_heap; + namespace ranges + { + using std::ranges::sort_heap; + } + using std::is_heap; + namespace ranges + { + using std::ranges::is_heap; + } + using std::is_heap_until; + namespace ranges + { + using std::ranges::is_heap_until; + } + using std::min; + namespace ranges + { + using std::ranges::min; + } + using std::max; + namespace ranges + { + using std::ranges::max; + } + using std::minmax; + namespace ranges + { + using std::ranges::minmax; + using std::ranges::minmax_result; + } + using std::min_element; + namespace ranges + { + using std::ranges::min_element; + } + using std::max_element; + namespace ranges + { + using std::ranges::max_element; + } + using std::minmax_element; + namespace ranges + { + using std::ranges::minmax_element; + using std::ranges::minmax_element_result; + } + using std::clamp; + namespace ranges + { + using std::ranges::clamp; + } + using std::lexicographical_compare; + namespace ranges + { + using std::ranges::lexicographical_compare; + } + using std::lexicographical_compare_three_way; + using std::next_permutation; + namespace ranges + { + using std::ranges::next_permutation; + using std::ranges::next_permutation_result; + } + using std::prev_permutation; + namespace ranges + { + using std::ranges::prev_permutation; + using std::ranges::prev_permutation_result; + } + namespace ranges + { +#if __cpp_lib_ranges_contains + using ranges::contains; + using ranges::contains_subrange; +#endif +#if __cpp_lib_ranges_fold + using ranges::fold_left; + using ranges::fold_left_with_iter; + using ranges::fold_right; +#endif +#if __cpp_lib_ranges_find_last + using ranges::find_last; + using ranges::find_last_if; + using ranges::find_last_if_not; +#endif + } +} + +// 22.7.2 <any> +#if __cpp_lib_any +export namespace std +{ + using std::any; + using std::any_cast; + using std::bad_any_cast; + using std::make_any; + using std::swap; +} +#endif + +// 24.3.2 <array> +export namespace std +{ + using std::array; + using std::operator==; + using std::operator<=>; + using std::get; + using std::swap; + using std::to_array; + using std::tuple_element; + using std::tuple_size; +} + +// 33.5.2 <atomic> +export namespace std +{ + using std::atomic; + using std::atomic_bool; + using std::atomic_char; + using std::atomic_char16_t; + using std::atomic_char32_t; + using std::atomic_char8_t; + using std::atomic_compare_exchange_strong; + using std::atomic_compare_exchange_strong_explicit; + using std::atomic_compare_exchange_weak; + using std::atomic_compare_exchange_weak_explicit; + using std::atomic_exchange; + using std::atomic_exchange_explicit; + using std::atomic_fetch_add; + using std::atomic_fetch_add_explicit; + using std::atomic_fetch_and; + using std::atomic_fetch_and_explicit; + using std::atomic_fetch_or; + using std::atomic_fetch_or_explicit; + using std::atomic_fetch_sub; + using std::atomic_fetch_sub_explicit; + using std::atomic_fetch_xor; + using std::atomic_fetch_xor_explicit; + using std::atomic_flag; + using std::atomic_flag_clear; + using std::atomic_flag_clear_explicit; + using std::atomic_flag_notify_all; + using std::atomic_flag_notify_one; + using std::atomic_flag_test; + using std::atomic_flag_test_and_set; + using std::atomic_flag_test_and_set_explicit; + using std::atomic_flag_test_explicit; + using std::atomic_flag_wait; + using std::atomic_flag_wait_explicit; + using std::atomic_init; + using std::atomic_int; + using std::atomic_int16_t; + using std::atomic_int32_t; + using std::atomic_int64_t; + using std::atomic_int8_t; + using std::atomic_int_fast16_t; + using std::atomic_int_fast32_t; + using std::atomic_int_fast64_t; + using std::atomic_int_fast8_t; + using std::atomic_int_least16_t; + using std::atomic_int_least32_t; + using std::atomic_int_least64_t; + using std::atomic_int_least8_t; + using std::atomic_intmax_t; + using std::atomic_intptr_t; + using std::atomic_is_lock_free; + using std::atomic_llong; + using std::atomic_load; + using std::atomic_load_explicit; + using std::atomic_long; + using std::atomic_notify_all; + using std::atomic_notify_one; + using std::atomic_ptrdiff_t; + using std::atomic_ref; + using std::atomic_schar; + using std::atomic_short; + using std::atomic_signal_fence; + using std::atomic_signed_lock_free; + using std::atomic_size_t; + using std::atomic_store; + using std::atomic_store_explicit; + using std::atomic_thread_fence; + using std::atomic_uchar; + using std::atomic_uint; + using std::atomic_uint16_t; + using std::atomic_uint32_t; + using std::atomic_uint64_t; + using std::atomic_uint8_t; + using std::atomic_uint_fast16_t; + using std::atomic_uint_fast32_t; + using std::atomic_uint_fast64_t; + using std::atomic_uint_fast8_t; + using std::atomic_uint_least16_t; + using std::atomic_uint_least32_t; + using std::atomic_uint_least64_t; + using std::atomic_uint_least8_t; + using std::atomic_uintmax_t; + using std::atomic_uintptr_t; + using std::atomic_ullong; + using std::atomic_ulong; + using std::atomic_unsigned_lock_free; + using std::atomic_ushort; + using std::atomic_wait; + using std::atomic_wait_explicit; + using std::atomic_wchar_t; + using std::kill_dependency; + using std::memory_order; + using std::memory_order_acq_rel; + using std::memory_order_acquire; + using std::memory_order_consume; + using std::memory_order_relaxed; + using std::memory_order_release; + using std::memory_order_seq_cst; + // ATOMIC_*_LOCK_FREE not exported +} + +// 33.9.3 <barrier> +#if __cpp_lib_barrier +export namespace std +{ + using std::barrier; +} +#endif + +// 22.15 <bit> +export namespace std +{ + using std::bit_cast; + using std::bit_ceil; + using std::bit_floor; + using std::bit_width; + using std::countl_one; + using std::countl_zero; + using std::countr_one; + using std::countr_zero; + using std::endian; + using std::has_single_bit; + using std::popcount; + using std::rotl; + using std::rotr; +} + +// 22.9 <bitset> +export namespace std +{ + using std::bitset; + using std::operator&; + using std::operator|; + using std::operator^; + using std::operator>>; + using std::operator<<; + using std::hash; +} + +// 22.13 <charconv> +export namespace std +{ + using std::chars_format; + using std::operator&; + using std::operator&=; + using std::operator^; + using std::operator^=; + using std::operator|; + using std::operator|=; + using std::operator~; + using std::from_chars; + using std::from_chars_result; + using std::to_chars; + using std::to_chars_result; +} + +// 29.2 <chrono> +#if __cpp_lib_chrono +export namespace std +{ + namespace chrono + { + using std::chrono::duration; + using std::chrono::time_point; + } + using std::common_type; + namespace chrono + { + using std::chrono::duration_values; + using std::chrono::treat_as_floating_point; + using std::chrono::treat_as_floating_point_v; + using std::chrono::operator+; + using std::chrono::operator-; + using std::chrono::operator*; + using std::chrono::operator/; + using std::chrono::operator%; + using std::chrono::operator==; + using std::chrono::operator<; + using std::chrono::operator>; + using std::chrono::operator<=; + using std::chrono::operator>=; + using std::chrono::operator<=>; + using std::chrono::ceil; + using std::chrono::duration_cast; + using std::chrono::floor; + using std::chrono::round; + using std::chrono::operator<<; + using std::chrono::abs; + using std::chrono::day; + using std::chrono::days; + using std::chrono::file_clock; + using std::chrono::file_time; + using std::chrono::hh_mm_ss; + using std::chrono::high_resolution_clock; + using std::chrono::hours; + using std::chrono::is_am; + using std::chrono::is_pm; + using std::chrono::last_spec; + using std::chrono::local_days; + using std::chrono::local_seconds; + using std::chrono::local_t; + using std::chrono::local_time; + using std::chrono::make12; + using std::chrono::make24; + using std::chrono::microseconds; + using std::chrono::milliseconds; + using std::chrono::minutes; + using std::chrono::month; + using std::chrono::month_day; + using std::chrono::month_day_last; + using std::chrono::month_weekday; + using std::chrono::month_weekday_last; + using std::chrono::months; + using std::chrono::nanoseconds; + using std::chrono::seconds; + using std::chrono::steady_clock; + using std::chrono::sys_days; + using std::chrono::sys_seconds; + using std::chrono::sys_time; + using std::chrono::system_clock; + using std::chrono::time_point_cast; + using std::chrono::weekday; + using std::chrono::weekday_indexed; + using std::chrono::weekday_last; + using std::chrono::weeks; + using std::chrono::year; + using std::chrono::year_month; + using std::chrono::year_month_day; + using std::chrono::year_month_day_last; + using std::chrono::year_month_weekday; + using std::chrono::year_month_weekday_last; + using std::chrono::years; + } + using std::formatter; + namespace chrono + { + using std::chrono::April; + using std::chrono::August; + using std::chrono::December; + using std::chrono::February; + using std::chrono::Friday; + using std::chrono::January; + using std::chrono::July; + using std::chrono::June; + using std::chrono::last; + using std::chrono::March; + using std::chrono::May; + using std::chrono::Monday; + using std::chrono::November; + using std::chrono::October; + using std::chrono::Saturday; + using std::chrono::September; + using std::chrono::Sunday; + using std::chrono::Thursday; + using std::chrono::Tuesday; + using std::chrono::Wednesday; + using chrono::utc_clock; + using chrono::utc_time; + using chrono::utc_seconds; + using chrono::tai_clock; + using chrono::tai_time; + using chrono::tai_seconds; + using chrono::gps_clock; + using chrono::gps_time; + using chrono::gps_seconds; + using chrono::clock_cast; + using chrono::parse; + using chrono::from_stream; + using chrono::clock_time_conversion; + using chrono::tzdb; + using chrono::tzdb_list; + using chrono::get_tzdb; + using chrono::get_tzdb_list; + using chrono::locate_zone; + using chrono::current_zone; + using chrono::reload_tzdb; + using chrono::remote_version; + using chrono::nonexistent_local_time; + using chrono::ambiguous_local_time; + using chrono::sys_info; + using chrono::local_info; + using chrono::choose; + using chrono::time_zone; + using chrono::zoned_traits; + using chrono::zoned_time; + using chrono::zoned_seconds; + using chrono::leap_second; + using chrono::leap_second_info; + using chrono::get_leap_second_info; + using chrono::time_zone_link; + using chrono::local_time_format; + using chrono::is_clock; + using chrono::is_clock_v; + } +} +export namespace std::inline literals::inline chrono_literals +{ + using std::literals::chrono_literals::operator""h; + using std::literals::chrono_literals::operator""min; + using std::literals::chrono_literals::operator""s; + using std::literals::chrono_literals::operator""ms; + using std::literals::chrono_literals::operator""us; + using std::literals::chrono_literals::operator""ns; + using std::literals::chrono_literals::operator""d; + using std::literals::chrono_literals::operator""y; +} +export namespace std::chrono { + using namespace literals::chrono_literals; +} +#endif // __cpp_lib_chrono + +// <codecvt>: deprecated C++17, removed C++26 +export namespace std +{ + using std::codecvt_mode; + using std::codecvt_utf16; + using std::codecvt_utf8; + using std::codecvt_utf8_utf16; +} + +// 17.11.1 <compare> +#if __cpp_lib_three_way_comparison +export namespace std +{ + using std::common_comparison_category; + using std::common_comparison_category_t; + using std::compare_three_way; + using std::compare_three_way_result; + using std::compare_three_way_result_t; + using std::is_eq; + using std::is_gt; + using std::is_gteq; + using std::is_lt; + using std::is_lteq; + using std::is_neq; + using std::partial_ordering; + using std::strong_ordering; + using std::three_way_comparable; + using std::three_way_comparable_with; + using std::weak_ordering; + using std::compare_partial_order_fallback; + using std::compare_strong_order_fallback; + using std::compare_weak_order_fallback; + using std::partial_order; + using std::strong_order; + using std::weak_order; +} +#endif // __cpp_lib_three_way_comparison + +// 28.4 <complex> +export namespace std +{ + using std::complex; + using std::operator+; + using std::operator-; + using std::operator*; + using std::operator/; + using std::operator==; + using std::operator>>; + using std::operator<<; + using std::abs; + using std::acos; + using std::acosh; + using std::arg; + using std::asin; + using std::asinh; + using std::atan; + using std::atanh; + using std::conj; + using std::cos; + using std::cosh; + using std::exp; + using std::imag; + using std::log; + using std::log10; + using std::norm; + using std::polar; + using std::pow; + using std::proj; + using std::real; + using std::sin; + using std::sinh; + using std::sqrt; + using std::tan; + using std::tanh; +} +export namespace std::inline literals::inline complex_literals +{ + using std::operator""il; + using std::operator""i; + using std::operator""if; +} + +// 18 <concepts> +#if __cpp_lib_concepts +export namespace std +{ + using std::assignable_from; + using std::common_reference_with; + using std::common_with; + using std::convertible_to; + using std::derived_from; + using std::floating_point; + using std::integral; + using std::same_as; + using std::signed_integral; + using std::unsigned_integral; + namespace ranges + { + using std::ranges::swap; + } + using std::constructible_from; + using std::copy_constructible; + using std::copyable; + using std::default_initializable; + using std::destructible; + using std::equality_comparable; + using std::equality_comparable_with; + using std::equivalence_relation; + using std::invocable; + using std::movable; + using std::move_constructible; + using std::predicate; + using std::regular; + using std::regular_invocable; + using std::relation; + using std::semiregular; + using std::strict_weak_order; + using std::swappable; + using std::swappable_with; + using std::totally_ordered; + using std::totally_ordered_with; +} +#endif + +// 33.7 <condition_variable> +export namespace std +{ + using std::condition_variable; + using std::condition_variable_any; + using std::cv_status; + using std::notify_all_at_thread_exit; +} + +// 17.12.2 <coroutine> +#if __cpp_lib_coroutine +export namespace std +{ + using std::coroutine_handle; + using std::coroutine_traits; + using std::operator==; + using std::operator<=>; + using std::hash; + using std::noop_coroutine; + using std::noop_coroutine_handle; + using std::noop_coroutine_promise; + using std::suspend_always; + using std::suspend_never; +} +#endif // __cpp_lib_coroutine + +// 22.16 <debugging> +#if __cpp_lib_debugging +export namespace std +{ + using std::breakpoint; + using std::breakpoint_if_debugging; + using std::is_debugger_present; +} +#endif + +// 24.3 <deque> +export namespace std +{ + using std::deque; + using std::operator==; + using std::operator<=>; + using std::erase; + using std::erase_if; + using std::swap; + namespace pmr + { + using std::pmr::deque; + } +} + +// 17.9.2 <exception> +export namespace std +{ + using std::bad_exception; + using std::current_exception; + using std::exception; + using std::exception_ptr; + using std::get_terminate; + using std::make_exception_ptr; + using std::nested_exception; + using std::rethrow_exception; + using std::rethrow_if_nested; + using std::set_terminate; + using std::terminate; + using std::terminate_handler; + using std::throw_with_nested; + using std::uncaught_exception; + using std::uncaught_exceptions; +} + +// 34.4 <execution> +#if __cpp_lib_execution +export namespace std +{ + using std::is_execution_policy; + using std::is_execution_policy_v; + namespace execution + { + using std::execution::sequenced_policy; + using std::execution::parallel_policy; + using std::execution::parallel_unsequenced_policy; + using std::execution::unsequenced_policy; + using std::execution::seq; + using std::execution::par; + using std::execution::par_unseq; + using std::execution::unseq; + } +#if __cpp_lib_senders + using std::forwarding_query_t; + using std::get_allocator_t; + using std::get_stop_token_t; + using std::forwarding_query; + using std::get_allocator; + using std::get_stop_token; + using std::stop_token_of_t; + namespace execution + { + using std::execution::get_domain_t; + using std::execution::get_scheduler_t; + using std::execution::get_delegation_scheduler_t; + using std::execution::get_forward_progress_guarantee_t; + using std::execution::get_completion_scheduler_t; + using std::execution::get_domain; + using std::execution::get_scheduler; + using std::execution::get_delegation_scheduler; + using std::execution::forward_progress_guarantee; + using std::execution::get_forward_progress_guarantee; + using std::execution::get_completion_scheduler; + using std::execution::empty_env; + using std::execution::get_env_t; + using std::execution::get_env; + using std::execution::env_of_t; + using std::execution::default_domain; + using std::execution::scheduler_t; + using std::execution::scheduler; + using std::execution::receiver_t; + using std::execution::receiver; + using std::execution::receiver_of; + using std::execution::set_value_t; + using std::execution::set_error_t; + using std::execution::set_stopped_t; + using std::execution::set_value; + using std::execution::set_error; + using std::execution::set_stopped; + using std::execution::operation_state_t; + using std::execution::operation_state; + using std::execution::start_t; + using std::execution::start; + using std::execution::sender_t; + using std::execution::sender; + using std::execution::sender_in; + using std::execution::sender_to; + using std::execution::get_completion_signatures_t; + using std::execution::get_completion_signatures; + using std::execution::completion_signatures_of_t; + using std::execution::value_types_of_t; + using std::execution::error_types_of_t; + using std::execution::sends_stopped; + using std::execution::tag_of_t; + using std::execution::transform_sender; + using std::execution::transform_env; + using std::execution::apply_sender; + using std::execution::connect_t; + using std::execution::connect; + using std::execution::connect_result_t; + using std::execution::just_t; + using std::execution::just_error_t; + using std::execution::just_stopped_t; + using std::execution::schedule_t; + using std::execution::just; + using std::execution::just_error; + using std::execution::just_stopped; + using std::execution::schedule; + using std::execution::read_env; + using std::execution::schedule_result_t; + using std::execution::sender_adaptor_closure; + using std::execution::starts_on_t; + using std::execution::continues_on_t; + using std::execution::on_t; + using std::execution::schedule_from_t; + using std::execution::then_t; + using std::execution::upon_error_t; + using std::execution::upon_stopped_t; + using std::execution::let_value_t; + using std::execution::let_error_t; + using std::execution::let_stopped_t; + using std::execution::bulk_t; + using std::execution::split_t; + using std::execution::when_all_t; + using std::execution::when_all_with_variant_t; + using std::execution::into_variant_t; + using std::execution::stopped_as_optional_t; + using std::execution::stopped_as_error_t; + using std::execution::starts_on; + using std::execution::continues_on; + using std::execution::on; + using std::execution::schedule_from; + using std::execution::then; + using std::execution::upon_error; + using std::execution::upon_stopped; + using std::execution::let_value; + using std::execution::let_error; + using std::execution::let_stopped; + using std::execution::bulk; + using std::execution::split; + using std::execution::when_all; + using std::execution::when_all_with_variant; + using std::execution::into_variant; + using std::execution::stopped_as_optional; + using std::execution::stopped_as_error; + using std::execution::completion_signatures; + using std::execution::transform_completion_signatures; + using std::execution::transform_completion_signatures_of; + using std::execution::run_loop; + } + namespace this_thread + { + using std::this_thread::sync_wait_t; + using std::this_thread::sync_wait_with_variant_t; + using std::this_thread::sync_wait; + using std::this_thread::sync_wait_with_variant; + } +#endif // __cpp_lib_senders +} +#endif // __cpp_lib_execution + +// 22.8 <expected> +#if __cpp_lib_expected +export namespace std +{ + using std::unexpected; + using std::bad_expected_access; + using std::unexpect_t; + using std::unexpect; + using std::expected; +} +#endif + +// <filesystem> +#if __cpp_lib_filesystem +export namespace std::filesystem +{ + using std::filesystem::begin; + using std::filesystem::copy_options; + using std::filesystem::directory_entry; + using std::filesystem::directory_iterator; + using std::filesystem::directory_options; + using std::filesystem::end; + using std::filesystem::file_status; + using std::filesystem::file_time_type; + using std::filesystem::file_type; + using std::filesystem::filesystem_error; + using std::filesystem::hash_value; + using std::filesystem::path; + using std::filesystem::perm_options; + using std::filesystem::perms; + using std::filesystem::recursive_directory_iterator; + using std::filesystem::space_info; + using std::filesystem::swap; + using std::filesystem::operator&; + using std::filesystem::operator&=; + using std::filesystem::operator^; + using std::filesystem::operator^=; + using std::filesystem::operator|; + using std::filesystem::operator|=; + using std::filesystem::operator~; + using std::filesystem::absolute; + using std::filesystem::canonical; + using std::filesystem::copy; + using std::filesystem::copy_file; + using std::filesystem::copy_symlink; + using std::filesystem::create_directories; + using std::filesystem::create_directory; + using std::filesystem::create_directory_symlink; + using std::filesystem::create_hard_link; + using std::filesystem::create_symlink; + using std::filesystem::current_path; + using std::filesystem::equivalent; + using std::filesystem::exists; + using std::filesystem::file_size; + using std::filesystem::hard_link_count; + using std::filesystem::is_block_file; + using std::filesystem::is_character_file; + using std::filesystem::is_directory; + using std::filesystem::is_empty; + using std::filesystem::is_fifo; + using std::filesystem::is_other; + using std::filesystem::is_regular_file; + using std::filesystem::is_socket; + using std::filesystem::is_symlink; + using std::filesystem::last_write_time; + using std::filesystem::permissions; + using std::filesystem::proximate; + using std::filesystem::read_symlink; + using std::filesystem::relative; + using std::filesystem::remove; + using std::filesystem::remove_all; + using std::filesystem::rename; + using std::filesystem::resize_file; + using std::filesystem::space; + using std::filesystem::status; + using std::filesystem::status_known; + using std::filesystem::symlink_status; + using std::filesystem::temp_directory_path; + using std::filesystem::u8path; + using std::filesystem::weakly_canonical; +} +#endif // __cpp_lib_filesystem + +// <flat_map> + +// <flat_set> + +// <format> +export namespace std +{ + using std::basic_format_arg; + using std::basic_format_args; + using std::basic_format_context; + using std::basic_format_parse_context; + using std::basic_format_string; + using std::format; + using std::format_args; + using std::format_context; + using std::format_error; + using std::format_parse_context; + using std::format_string; + using std::format_to; + using std::format_to_n; + using std::format_to_n_result; + using std::formatted_size; +// FIXME __cpp_lib_format_ranges +#if __cplusplus > 202002L + using std::formattable; +#endif + using std::formatter; + using std::make_format_args; + using std::make_wformat_args; +#if __cpp_lib_format >= 202311L // >= C++26 + using std::runtime_format; +#endif + using std::vformat; + using std::vformat_to; + using std::visit_format_arg; + using std::wformat_args; + using std::wformat_context; + using std::wformat_parse_context; + using std::wformat_string; +} + +// <forward_list> +export namespace std +{ + using std::forward_list; + using std::operator==; + using std::operator<=>; + using std::erase; + using std::erase_if; + using std::swap; + namespace pmr + { + using std::pmr::forward_list; + } +} + +// <fstream> +export namespace std +{ + using std::basic_filebuf; + using std::basic_fstream; + using std::basic_ifstream; + using std::basic_ofstream; + using std::filebuf; + using std::fstream; + using std::ifstream; + using std::ofstream; + using std::swap; + using std::wfilebuf; + using std::wfstream; + using std::wifstream; + using std::wofstream; +} + +// <functional> +export namespace std +{ + using std::bind; + using std::bind_front; +#if __cpp_lib_bind_back + using std::bind_back; +#endif + using std::bit_and; + using std::bit_not; + using std::bit_or; + using std::bit_xor; + using std::compare_three_way; + using std::cref; + using std::divides; + using std::equal_to; + using std::greater; + using std::greater_equal; + using std::identity; + using std::invoke; +#if __cpp_lib_invoke_r + using std::invoke_r; +#endif + using std::is_bind_expression; + using std::is_bind_expression_v; + using std::is_placeholder; + using std::is_placeholder_v; + using std::less; + using std::less_equal; + using std::logical_and; + using std::logical_not; + using std::logical_or; + using std::minus; + using std::modulus; +#if __cpp_lib_move_only_function + using std::move_only_function; +#endif + using std::multiplies; + using std::negate; + using std::not_equal_to; + using std::not_fn; + using std::plus; + using std::ref; + using std::reference_wrapper; + namespace placeholders + { + using std::placeholders::_1; + using std::placeholders::_10; + using std::placeholders::_2; + using std::placeholders::_3; + using std::placeholders::_4; + using std::placeholders::_5; + using std::placeholders::_6; + using std::placeholders::_7; + using std::placeholders::_8; + using std::placeholders::_9; + } + using std::bad_function_call; + using std::function; + using std::mem_fn; + using std::swap; + using std::operator==; + using std::boyer_moore_horspool_searcher; + using std::boyer_moore_searcher; + using std::default_searcher; + using std::hash; + namespace ranges + { + using std::ranges::equal_to; + using std::ranges::greater; + using std::ranges::greater_equal; + using std::ranges::less; + using std::ranges::less_equal; + using std::ranges::not_equal_to; + } +} + +// <future> +export namespace std +{ + using std::future_errc; + using std::future_status; + using std::launch; + using std::operator&; + using std::operator&=; + using std::operator^; + using std::operator^=; + using std::operator|; + using std::operator|=; + using std::operator~; + using std::async; + using std::future; + using std::future_category; + using std::future_error; + using std::is_error_code_enum; + using std::make_error_code; + using std::make_error_condition; + using std::packaged_task; + using std::promise; + using std::shared_future; + using std::swap; + using std::uses_allocator; +} + +#if __cpp_lib_generator +export namespace std +{ + using std::generator; + namespace pmr + { + using pmr::generator; + } +} +#endif + +// <hazard_pointer> FIXME + +// 17.10.2 <initializer_list> +export namespace std +{ + using std::begin; + using std::end; + using std::initializer_list; +} + +// <inplace_vector> FIXME + +// <iomanip> +export namespace std +{ + using std::get_money; + using std::get_time; + using std::put_money; + using std::put_time; + using std::quoted; + using std::resetiosflags; + using std::setbase; + using std::setfill; + using std::setiosflags; + using std::setprecision; + using std::setw; +} + +// <ios> +export namespace std +{ + using std::fpos; + using std::operator!=; + using std::operator-; + using std::operator==; + using std::basic_ios; + using std::boolalpha; + using std::dec; + using std::defaultfloat; + using std::fixed; + using std::hex; + using std::hexfloat; + using std::internal; + using std::io_errc; + using std::ios; + using std::ios_base; + using std::iostream_category; + using std::is_error_code_enum; + using std::left; + using std::make_error_code; + using std::make_error_condition; + using std::noboolalpha; + using std::noshowbase; + using std::noshowpoint; + using std::noshowpos; + using std::noskipws; + using std::nounitbuf; + using std::nouppercase; + using std::oct; + using std::right; + using std::scientific; + using std::showbase; + using std::showpoint; + using std::showpos; + using std::skipws; + using std::streamoff; + using std::streamsize; + using std::unitbuf; + using std::uppercase; + using std::wios; +} + +// <iosfwd> +export namespace std +{ + using std::streampos; + using std::u16streampos; + using std::u32streampos; + using std::u8streampos; + using std::wstreampos; + using std::basic_osyncstream; + using std::basic_syncbuf; + using std::istreambuf_iterator; + using std::ostreambuf_iterator; + using std::osyncstream; + using std::syncbuf; + using std::wosyncstream; + using std::wsyncbuf; + using std::fpos; +} + +// <iostream> +export namespace std +{ + using std::cerr; + using std::cin; + using std::clog; + using std::cout; + using std::wcerr; + using std::wcin; + using std::wclog; + using std::wcout; +} + +// <istream> +export namespace std +{ + using std::basic_iostream; + using std::basic_istream; + using std::iostream; + using std::istream; + using std::wiostream; + using std::wistream; + using std::ws; + using std::operator>>; +} + +// <iterator> +export namespace std +{ + using std::incrementable_traits; + using std::indirectly_readable_traits; + using std::iter_difference_t; + using std::iter_reference_t; + using std::iter_value_t; + using std::iterator_traits; + namespace ranges + { + using std::ranges::iter_move; + using std::ranges::iter_swap; + } + using std::advance; + using std::bidirectional_iterator; + using std::bidirectional_iterator_tag; + using std::contiguous_iterator; + using std::contiguous_iterator_tag; + using std::disable_sized_sentinel_for; + using std::distance; + using std::forward_iterator; + using std::forward_iterator_tag; + using std::incrementable; + using std::indirect_binary_predicate; + using std::indirect_equivalence_relation; + using std::indirect_result_t; + using std::indirect_strict_weak_order; + using std::indirect_unary_predicate; + using std::indirectly_comparable; + using std::indirectly_copyable; + using std::indirectly_copyable_storable; + using std::indirectly_movable; + using std::indirectly_movable_storable; + using std::indirectly_readable; + using std::indirectly_regular_unary_invocable; + using std::indirectly_swappable; + using std::indirectly_unary_invocable; + using std::indirectly_writable; + using std::input_iterator; + using std::input_iterator_tag; + using std::input_or_output_iterator; + using std::iter_common_reference_t; + using std::iter_rvalue_reference_t; + using std::mergeable; + using std::next; + using std::output_iterator; + using std::output_iterator_tag; + using std::permutable; + using std::prev; + using std::projected; + using std::random_access_iterator; + using std::random_access_iterator_tag; + using std::sentinel_for; + using std::sized_sentinel_for; + using std::sortable; + using std::weakly_incrementable; + namespace ranges + { + using std::ranges::advance; + using std::ranges::distance; + using std::ranges::next; + using std::ranges::prev; + } + using std::reverse_iterator; + using std::operator==; + using std::operator!=; + using std::operator<; + using std::operator>; + using std::operator<=; + using std::operator>=; + using std::operator<=>; + using std::operator-; + using std::operator+; + using std::back_insert_iterator; + using std::back_inserter; + using std::begin; + using std::cbegin; + using std::cend; + using std::common_iterator; + using std::counted_iterator; + using std::crbegin; + using std::crend; + using std::data; + using std::default_sentinel; + using std::default_sentinel_t; + using std::empty; + using std::end; + using std::front_insert_iterator; + using std::front_inserter; + using std::insert_iterator; + using std::inserter; + using std::istream_iterator; + using std::istreambuf_iterator; + using std::iterator; + using std::make_move_iterator; + using std::make_reverse_iterator; + using std::move_iterator; + using std::move_sentinel; + using std::ostream_iterator; + using std::ostreambuf_iterator; + using std::rbegin; + using std::rend; + using std::size; + using std::ssize; + using std::unreachable_sentinel; + using std::unreachable_sentinel_t; +#if __glibcxx_ranges_as_const // >= C++23 + using std::iter_const_reference_t; + using std::basic_const_iterator; + using std::const_iterator; + using std::const_sentinel; + using std::make_const_iterator; + using std::make_const_sentinel; +#endif +} + +// <latch> +export namespace std +{ + using std::latch; +} + +// 17.3.3 <limits> [limits.syn] +export namespace std +{ + using std::float_denorm_style; // deprecated in C++23 + using std::float_round_style; + using std::numeric_limits; +} + +// FIXME <linalg> + +// <list> +export namespace std +{ + using std::list; + using std::operator==; + using std::operator<=>; + using std::erase; + using std::erase_if; + using std::swap; + namespace pmr + { + using std::pmr::list; + } +} + +// <locale> +export namespace std +{ + using std::codecvt; + using std::codecvt_base; + using std::codecvt_byname; + using std::collate; + using std::collate_byname; + using std::ctype; + using std::ctype_base; + using std::ctype_byname; + using std::has_facet; + using std::isalnum; + using std::isalpha; + using std::isblank; + using std::iscntrl; + using std::isdigit; + using std::isgraph; + using std::islower; + using std::isprint; + using std::ispunct; + using std::isspace; + using std::isupper; + using std::isxdigit; + using std::locale; + using std::messages; + using std::messages_base; + using std::messages_byname; + using std::money_base; + using std::money_get; + using std::money_put; + using std::moneypunct; + using std::moneypunct_byname; + using std::num_get; + using std::num_put; + using std::numpunct; + using std::numpunct_byname; + using std::time_base; + using std::time_get; + using std::time_get_byname; + using std::time_put; + using std::time_put_byname; + using std::tolower; + using std::toupper; + using std::use_facet; + using std::wbuffer_convert; + using std::wstring_convert; +} + +// <map> +export namespace std +{ + using std::map; + using std::operator==; + using std::operator<=>; + using std::erase_if; + using std::multimap; + using std::swap; + namespace pmr + { + using std::pmr::map; + using std::pmr::multimap; + } +} + +// FIXME <mdspan> + +// 20.2 <memory> +export namespace std +{ + using std::align; + using std::allocator; + using std::allocator_arg; + using std::allocator_arg_t; + using std::allocator_traits; + using std::assume_aligned; + using std::make_obj_using_allocator; + using std::pointer_traits; + using std::to_address; + using std::uninitialized_construct_using_allocator; + using std::uses_allocator; + using std::uses_allocator_construction_args; + using std::uses_allocator_v; + using std::operator==; + using std::addressof; + using std::uninitialized_default_construct; + using std::uninitialized_default_construct_n; + namespace ranges + { + using std::ranges::uninitialized_default_construct; + using std::ranges::uninitialized_default_construct_n; + } + using std::uninitialized_value_construct; + using std::uninitialized_value_construct_n; + namespace ranges + { + using std::ranges::uninitialized_value_construct; + using std::ranges::uninitialized_value_construct_n; + } + using std::uninitialized_copy; + using std::uninitialized_copy_n; + namespace ranges + { + using std::ranges::uninitialized_copy; + using std::ranges::uninitialized_copy_n; + using std::ranges::uninitialized_copy_n_result; + using std::ranges::uninitialized_copy_result; + } + using std::uninitialized_move; + using std::uninitialized_move_n; + namespace ranges + { + using std::ranges::uninitialized_move; + using std::ranges::uninitialized_move_n; + using std::ranges::uninitialized_move_n_result; + using std::ranges::uninitialized_move_result; + } + using std::uninitialized_fill; + using std::uninitialized_fill_n; + namespace ranges + { + using std::ranges::uninitialized_fill; + using std::ranges::uninitialized_fill_n; + } + using std::construct_at; + namespace ranges + { + using std::ranges::construct_at; + } + using std::destroy; + using std::destroy_at; + using std::destroy_n; + namespace ranges + { + using std::ranges::destroy; + using std::ranges::destroy_at; + using std::ranges::destroy_n; + } + using std::default_delete; + using std::make_unique; + using std::make_unique_for_overwrite; + using std::unique_ptr; + using std::operator<; + using std::operator>; + using std::operator<=; + using std::operator>=; + using std::operator<=>; + using std::operator<<; + using std::allocate_shared; + using std::allocate_shared_for_overwrite; + using std::bad_weak_ptr; + using std::const_pointer_cast; + using std::dynamic_pointer_cast; + using std::make_shared; + using std::make_shared_for_overwrite; + using std::reinterpret_pointer_cast; + using std::shared_ptr; + using std::static_pointer_cast; + using std::swap; + using std::get_deleter; + using std::atomic_compare_exchange_strong; + using std::atomic_compare_exchange_strong_explicit; + using std::atomic_compare_exchange_weak; + using std::atomic_compare_exchange_weak_explicit; + using std::atomic_exchange; + using std::atomic_exchange_explicit; + using std::atomic_is_lock_free; + using std::atomic_load; + using std::atomic_load_explicit; + using std::atomic_store; + using std::atomic_store_explicit; + using std::enable_shared_from_this; + using std::hash; + using std::owner_less; + using std::weak_ptr; +#if __cpp_lib_out_ptr + using std::out_ptr; + using std::inout_ptr; +#endif +} + +// 20.4 <memory_resource> +export namespace std::pmr +{ + using std::pmr::memory_resource; + using std::pmr::operator==; + using std::pmr::get_default_resource; + using std::pmr::monotonic_buffer_resource; + using std::pmr::new_delete_resource; + using std::pmr::null_memory_resource; + using std::pmr::polymorphic_allocator; + using std::pmr::pool_options; + using std::pmr::set_default_resource; + using std::pmr::synchronized_pool_resource; + using std::pmr::unsynchronized_pool_resource; +} + +// <mutex> +export namespace std +{ + using std::adopt_lock; + using std::adopt_lock_t; + using std::call_once; + using std::defer_lock; + using std::defer_lock_t; + using std::lock; + using std::lock_guard; + using std::mutex; + using std::once_flag; + using std::recursive_mutex; + using std::recursive_timed_mutex; + using std::scoped_lock; + using std::swap; + using std::timed_mutex; + using std::try_lock; + using std::try_to_lock; + using std::try_to_lock_t; + using std::unique_lock; +} + +// 17.6.2 <new> [new.syn] +export namespace std +{ + using std::align_val_t; + using std::bad_alloc; + using std::bad_array_new_length; + using std::destroying_delete; + using std::destroying_delete_t; + using std::get_new_handler; + using std::hardware_destructive_interference_size; + using std::hardware_constructive_interference_size; + using std::launder; + using std::new_handler; + using std::nothrow; + using std::nothrow_t; + using std::set_new_handler; +} +export +{ + using ::operator new; + using ::operator delete; + using ::operator new[]; + using ::operator delete[]; +} + +// <numbers> +export namespace std::numbers +{ + using std::numbers::e; + using std::numbers::e_v; + using std::numbers::egamma; + using std::numbers::egamma_v; + using std::numbers::inv_pi; + using std::numbers::inv_pi_v; + using std::numbers::inv_sqrt3; + using std::numbers::inv_sqrt3_v; + using std::numbers::inv_sqrtpi; + using std::numbers::inv_sqrtpi_v; + using std::numbers::ln10; + using std::numbers::ln10_v; + using std::numbers::ln2; + using std::numbers::ln2_v; + using std::numbers::log10e; + using std::numbers::log10e_v; + using std::numbers::log2e; + using std::numbers::log2e_v; + using std::numbers::phi; + using std::numbers::phi_v; + using std::numbers::pi; + using std::numbers::pi_v; + using std::numbers::sqrt2; + using std::numbers::sqrt2_v; + using std::numbers::sqrt3; + using std::numbers::sqrt3_v; +} + +// <numeric> +export namespace std +{ + using std::accumulate; + using std::adjacent_difference; + using std::exclusive_scan; + using std::inclusive_scan; + using std::inner_product; + using std::iota; + using std::partial_sum; + using std::reduce; + using std::transform_exclusive_scan; + using std::transform_inclusive_scan; + using std::transform_reduce; + using std::gcd; + using std::lcm; + using std::midpoint; +#if __cpp_lib_ranges_iota + namespace ranges { using ranges::iota; } +#endif +#if __cpp_lib_saturation_arithmetic + using std::add_sat; + using std::sub_sat; + using std::mul_sat; + using std::div_sat; + using std::saturate_cast; +#endif +} + +// <optional> +export namespace std +{ + using std::bad_optional_access; + using std::nullopt; + using std::nullopt_t; + using std::optional; + using std::operator==; + using std::operator!=; + using std::operator<; + using std::operator>; + using std::operator<=; + using std::operator>=; + using std::operator<=>; + using std::hash; + using std::make_optional; + using std::swap; +} + +// <ostream> +export namespace std +{ + using std::basic_ostream; + using std::endl; + using std::ends; + using std::flush; + using std::ostream; + using std::wostream; + using std::operator<<; + using std::emit_on_flush; + using std::noemit_on_flush; + using std::flush_emit; +} + +// <print> +#if __cpp_lib_print +export namespace std +{ + using std::print; + using std::println; + using std::vprint_unicode; + //FIXME using std::vprint_unicode_buffered; + using std::vprint_nonunicode; + //FIXME using std::vprint_nonunicode_buffered; +} +#endif + +// <queue> +export namespace std +{ + using std::queue; + using std::operator==; + using std::operator!=; + using std::operator<; + using std::operator>; + using std::operator<=; + using std::operator>=; + using std::operator<=>; + using std::priority_queue; + using std::swap; + using std::uses_allocator; +} + +// <random> +export namespace std +{ + using std::bernoulli_distribution; + using std::binomial_distribution; + using std::cauchy_distribution; + using std::chi_squared_distribution; + using std::default_random_engine; + using std::discard_block_engine; + using std::discrete_distribution; + using std::exponential_distribution; + using std::extreme_value_distribution; + using std::fisher_f_distribution; + using std::gamma_distribution; + using std::generate_canonical; + using std::geometric_distribution; + using std::independent_bits_engine; + using std::knuth_b; + using std::linear_congruential_engine; + using std::lognormal_distribution; + using std::mersenne_twister_engine; + using std::minstd_rand; + using std::minstd_rand0; + using std::mt19937; + using std::mt19937_64; + using std::negative_binomial_distribution; + using std::normal_distribution; + using std::piecewise_constant_distribution; + using std::piecewise_linear_distribution; + using std::poisson_distribution; + using std::random_device; + using std::ranlux24; + using std::ranlux24_base; + using std::ranlux48; + using std::ranlux48_base; + using std::seed_seq; + using std::shuffle_order_engine; + using std::student_t_distribution; + using std::subtract_with_carry_engine; + using std::uniform_int_distribution; + using std::uniform_random_bit_generator; + using std::uniform_real_distribution; + using std::weibull_distribution; +} + +// <ranges> +export namespace std +{ + namespace ranges + { + using std::ranges::begin; + using std::ranges::cbegin; + using std::ranges::cdata; + using std::ranges::cend; + using std::ranges::crbegin; + using std::ranges::crend; + using std::ranges::data; + using std::ranges::empty; + using std::ranges::end; + using std::ranges::rbegin; + using std::ranges::rend; + using std::ranges::size; + using std::ranges::ssize; + using std::ranges::bidirectional_range; + using std::ranges::borrowed_range; + using std::ranges::common_range; + using std::ranges::contiguous_range; + using std::ranges::disable_sized_range; + using std::ranges::enable_borrowed_range; + using std::ranges::enable_view; + using std::ranges::forward_range; + using std::ranges::get; + using std::ranges::input_range; + using std::ranges::iterator_t; + using std::ranges::output_range; + using std::ranges::random_access_range; + using std::ranges::range; + using std::ranges::range_common_reference_t; + using std::ranges::range_difference_t; + using std::ranges::range_reference_t; + using std::ranges::range_rvalue_reference_t; + using std::ranges::range_size_t; + using std::ranges::range_value_t; + using std::ranges::sentinel_t; + using std::ranges::sized_range; + using std::ranges::subrange; + using std::ranges::subrange_kind; + using std::ranges::view; + using std::ranges::view_base; + using std::ranges::view_interface; + using std::ranges::viewable_range; + } + using std::ranges::get; + namespace ranges + { + using std::ranges::borrowed_iterator_t; + using std::ranges::borrowed_subrange_t; + using std::ranges::dangling; + using std::ranges::empty_view; + namespace views + { + using std::ranges::views::empty; + } + using std::ranges::single_view; + namespace views + { + using std::ranges::views::single; + } + using std::ranges::iota_view; + namespace views + { + using std::ranges::views::iota; + } + using std::ranges::basic_istream_view; + using std::ranges::istream_view; + using std::ranges::wistream_view; + namespace views + { + using std::ranges::views::istream; + } + namespace views + { + using std::ranges::views::all; + using std::ranges::views::all_t; + } + using std::ranges::filter_view; + using std::ranges::owning_view; + using std::ranges::ref_view; + namespace views + { + using std::ranges::views::filter; + } + using std::ranges::transform_view; + namespace views + { + using std::ranges::views::transform; + } + using std::ranges::take_view; + namespace views + { + using std::ranges::views::take; + } + using std::ranges::take_while_view; + namespace views + { + using std::ranges::views::take_while; + } + using std::ranges::drop_view; + namespace views + { + using std::ranges::views::drop; + } + using std::ranges::drop_while_view; + namespace views + { + using std::ranges::views::drop_while; + } + using std::ranges::join_view; + namespace views + { + using std::ranges::views::join; + } + using std::ranges::lazy_split_view; + using std::ranges::split_view; + namespace views + { + using std::ranges::views::lazy_split; + using std::ranges::views::split; + } + namespace views + { + using std::ranges::views::counted; + } + using std::ranges::common_view; + namespace views + { + using std::ranges::views::common; + } + using std::ranges::reverse_view; + namespace views + { + using std::ranges::views::reverse; + } + using std::ranges::elements_view; + using std::ranges::keys_view; + using std::ranges::values_view; + namespace views + { + using std::ranges::views::elements; + using std::ranges::views::keys; + using std::ranges::views::values; + } +#if __cpp_lib_ranges >= 202202L + using ranges::range_adaptor_closure; +#endif + } + namespace views = ranges::views; + using std::tuple_element; + using std::tuple_size; +#if __glibcxx_ranges_as_const // >= C++23 + namespace ranges + { + using ranges::constant_range; + using ranges::const_iterator_t; + using ranges::const_sentinel_t; + using ranges::range_const_reference_t; + using ranges::as_const_view; + namespace views { using views::as_const; } + } +#endif +#ifdef __glibcxx_generator // C++ >= 23 && __glibcxx_coroutine + namespace ranges + { + using ranges::elements_of; + } +#endif +#ifdef __cpp_lib_ranges_as_rvalue // C++ >= 23 + namespace ranges { + using ranges::as_rvalue_view; + namespace views { using views::as_rvalue; } + } +#endif +#ifdef __cpp_lib_ranges_chunk // C++ >= 23 + namespace ranges { + using ranges::chunk_view; + namespace views { using views::chunk; } + } +#endif +#ifdef __cpp_lib_ranges_slide // C++ >= 23 + namespace ranges { + using ranges::slide_view; + namespace views { using views::slide; } + } +#endif +#ifdef __cpp_lib_ranges_zip // C++ >= 23 + namespace ranges { + using ranges::zip_view; + using ranges::zip_transform_view; + using ranges::adjacent_view; + using ranges::adjacent_transform_view; + namespace views { + using views::zip; + using views::zip_transform; + using views::adjacent; + using views::adjacent_transform; + using views::pairwise; + using views::pairwise_transform; + } + } +#endif +#ifdef __cpp_lib_ranges_chunk_by // C++ >= 23 + namespace ranges { + using ranges::chunk_by_view; + namespace views { using views::chunk_by; } + } +#endif +#ifdef __cpp_lib_ranges_join_with // C++ >= 23 + namespace ranges { + using ranges::join_with_view; + namespace views { using views::join_with; } + } +#endif +#ifdef __cpp_lib_ranges_repeat // C++ >= 23 + namespace ranges { + using ranges::repeat_view; + namespace views { using views::repeat; } + } +#endif +#ifdef __cpp_lib_ranges_stride // C++ >= 23 + namespace ranges { + using ranges::stride_view; + namespace views { using views::stride; } + } +#endif +#ifdef __cpp_lib_ranges_cartesian_product // C++ >= 23 + namespace ranges { + using ranges::cartesian_product_view; + namespace views { using views::cartesian_product; } + } +#endif +#ifdef __cpp_lib_ranges_enumerate // C++ >= 23 + namespace ranges { + using ranges::enumerate_view; + namespace views { using views::enumerate; } + } +#endif +} + +// <ratio> +export namespace std +{ + using std::atto; + using std::centi; + using std::deca; + using std::deci; + using std::exa; + using std::femto; + using std::giga; + using std::hecto; + using std::kilo; + using std::mega; + using std::micro; + using std::milli; + using std::nano; + using std::peta; + using std::pico; + using std::ratio; + using std::ratio_add; + using std::ratio_divide; + using std::ratio_equal; + using std::ratio_equal_v; + using std::ratio_greater; + using std::ratio_greater_equal; + using std::ratio_greater_equal_v; + using std::ratio_greater_v; + using std::ratio_less; + using std::ratio_less_equal; + using std::ratio_less_equal_v; + using std::ratio_less_v; + using std::ratio_multiply; + using std::ratio_not_equal; + using std::ratio_not_equal_v; + using std::ratio_subtract; + using std::tera; +} + +// FIXME <rcu> + +// <regex> +export namespace std +{ + namespace regex_constants + { + using std::regex_constants::error_type; + using std::regex_constants::match_flag_type; + using std::regex_constants::syntax_option_type; + using std::regex_constants::operator&; + using std::regex_constants::operator&=; + using std::regex_constants::operator^; + using std::regex_constants::operator^=; + using std::regex_constants::operator|; + using std::regex_constants::operator|=; + using std::regex_constants::operator~; + } + using std::basic_regex; + using std::csub_match; + using std::regex; + using std::regex_error; + using std::regex_traits; + using std::ssub_match; + using std::sub_match; + using std::swap; + using std::wcsub_match; + using std::wregex; + using std::wssub_match; + using std::operator==; + using std::operator<=>; + using std::operator<<; + using std::cmatch; + using std::cregex_iterator; + using std::cregex_token_iterator; + using std::match_results; + using std::regex_iterator; + using std::regex_match; + using std::regex_replace; + using std::regex_search; + using std::regex_token_iterator; + using std::smatch; + using std::sregex_iterator; + using std::sregex_token_iterator; + using std::wcmatch; + using std::wcregex_iterator; + using std::wcregex_token_iterator; + using std::wsmatch; + using std::wsregex_iterator; + using std::wsregex_token_iterator; + namespace pmr + { + using std::pmr::cmatch; + using std::pmr::match_results; + using std::pmr::smatch; + using std::pmr::wcmatch; + using std::pmr::wsmatch; + } +} + +// 20.5 <scoped_allocator> +export namespace std +{ + using std::scoped_allocator_adaptor; + using std::operator==; +} + +// <semaphore> +export namespace std +{ + using std::binary_semaphore; + using std::counting_semaphore; +} + +// <set> +export namespace std +{ + using std::set; + using std::operator==; + using std::operator<=>; + using std::erase_if; + using std::multiset; + using std::swap; + namespace pmr + { + using std::pmr::multiset; + using std::pmr::set; + } +} + +// <shared_mutex> +export namespace std +{ + using std::shared_lock; + using std::shared_mutex; + using std::shared_timed_mutex; + using std::swap; +} + +// 17.8.1 <source_location> +export namespace std +{ + using std::source_location; +} + +// <span> +export namespace std +{ + using std::dynamic_extent; + using std::span; + namespace ranges + { + using std::ranges::enable_borrowed_range; + using std::ranges::enable_view; + } + using std::as_bytes; + using std::as_writable_bytes; +} + +#if __cpp_lib_spanstream +// <spanstream> +export namespace std +{ + using std::basic_spanbuf; + using std::spanbuf; + using std::wspanbuf; + using std::basic_ispanstream; + using std::ispanstream; + using std::wispanstream; + using std::basic_ospanstream; + using std::ospanstream; + using std::wospanstream; + using std::basic_spanstream; + using std::spanstream; + using std::wspanstream; +} +#endif + +// <sstream> +export namespace std +{ + using std::basic_istringstream; + using std::basic_ostringstream; + using std::basic_stringbuf; + using std::basic_stringstream; + using std::istringstream; + using std::ostringstream; + using std::stringbuf; + using std::stringstream; + using std::swap; + using std::wistringstream; + using std::wostringstream; + using std::wstringbuf; + using std::wstringstream; +} + +// <stack> +export namespace std +{ + using std::stack; + using std::operator==; + using std::operator!=; + using std::operator<; + using std::operator>; + using std::operator<=; + using std::operator>=; + using std::operator<=>; + using std::swap; + using std::uses_allocator; +} + +// 19.6 <stacktrace> +#if __cpp_lib_stacktrace +export namespace std +{ + using std::stacktrace_entry; + using std::basic_stacktrace; + using std::stacktrace; + using std::swap; + using std::to_string; + using std::operator<<; + using std::formatter; + namespace pmr + { + using std::pmr::stacktrace; + } + using std::hash; +} +#endif + +// 19.2 <stdexcept> +export namespace std +{ + using std::domain_error; + using std::invalid_argument; + using std::length_error; + using std::logic_error; + using std::out_of_range; + using std::overflow_error; + using std::range_error; + using std::runtime_error; + using std::underflow_error; +} + +// 17.4.2 <stdfloat> +export namespace std +{ +#ifdef __STDCPP_FLOAT16_T__ + using std::float16_t; +#endif +#ifdef __STDCPP_FLOAT32_T__ + using std::float32_t; +#endif +#ifdef __STDCPP_FLOAT64_T__ + using std::float64_t; +#endif +#ifdef __STDCPP_FLOAT128_T__ + using std::float128_t; +#endif +#ifdef __STDCPP_BFLOAT16_T__ + using std::bfloat16_t; +#endif +} + +// <stop_token> +#if __cpp_lib_jthread +export namespace std +{ + using std::stop_token; + using std::stop_source; + using std::nostopstate_t; + using std::nostopstate; + using std::stop_callback; +#if __cpp_lib_senders + using std::never_stop_token; + using std::inplace_stop_token; + using std::inplace_stop_source; + using std::inplace_stop_callback; + using std::stop_callback_for; +#endif +} +#endif + +// <streambuf> +export namespace std +{ + using std::basic_streambuf; + using std::streambuf; + using std::wstreambuf; +} + +// <string> +export namespace std +{ + using std::basic_string; + using std::char_traits; + using std::operator+; + using std::operator==; + using std::operator<=>; + using std::swap; + using std::operator>>; + using std::operator<<; + using std::erase; + using std::erase_if; + using std::getline; + using std::stod; + using std::stof; + using std::stoi; + using std::stol; + using std::stold; + using std::stoll; + using std::stoul; + using std::stoull; + using std::string; + using std::to_string; + using std::to_wstring; + using std::u16string; + using std::u32string; + using std::u8string; + using std::wstring; + namespace pmr + { + using std::pmr::basic_string; + using std::pmr::string; + using std::pmr::u16string; + using std::pmr::u32string; + using std::pmr::u8string; + using std::pmr::wstring; + } + using std::hash; +} +export namespace std::inline literals::inline string_literals +{ + using std::operator""s; +} + +// <string_view> +export namespace std +{ + using std::basic_string_view; + namespace ranges + { + using std::ranges::enable_borrowed_range; + using std::ranges::enable_view; + } + using std::operator==; + using std::operator<=>; + using std::operator<<; + using std::hash; + using std::string_view; + using std::u16string_view; + using std::u32string_view; + using std::u8string_view; + using std::wstring_view; +} +export namespace std::inline literals::inline string_view_literals +{ + using string_view_literals::operator""sv; +} + +// <strstream>: deprecated C++98, removed C++26 +export namespace std +{ + using std::istrstream; + using std::ostrstream; + using std::strstream; + using std::strstreambuf; +} + +// <syncstream> +export namespace std +{ + using std::basic_syncbuf; + using std::swap; + using std::basic_osyncstream; + using std::osyncstream; + using std::syncbuf; + using std::wosyncstream; + using std::wsyncbuf; +} + +// 19.5 <system_error> +export namespace std +{ + using std::errc; + using std::error_category; + using std::error_code; + using std::error_condition; + using std::generic_category; + using std::is_error_code_enum; + using std::is_error_condition_enum; + using std::make_error_code; + using std::system_category; + using std::system_error; + using std::operator<<; + using std::make_error_condition; + using std::operator==; + using std::operator<=>; + using std::hash; + using std::is_error_code_enum_v; + using std::is_error_condition_enum_v; +} + +// <text_encoding> +#if __cpp_lib_text_encoding +export namespace std +{ + using std::text_encoding; +} +#endif + +// <thread> +export namespace std +{ + using std::swap; + using std::thread; + using std::jthread; + namespace this_thread + { + using std::this_thread::get_id; + using std::this_thread::sleep_for; + using std::this_thread::sleep_until; + using std::this_thread::yield; + } + using std::operator==; + using std::operator<=>; + using std::operator<<; + using std::hash; +} + +// <tuple> +export namespace std +{ + using std::apply; + using std::forward_as_tuple; + using std::get; + using std::ignore; + using std::make_from_tuple; + using std::make_tuple; + using std::tie; + using std::tuple; + using std::tuple_cat; + using std::tuple_element; + using std::tuple_element_t; + using std::tuple_size; + using std::operator==; + using std::operator<=>; + using std::swap; + using std::tuple_size_v; + using std::uses_allocator; +} + +// <type_traits> +export namespace std +{ + using std::add_const; + using std::add_const_t; + using std::add_cv; + using std::add_cv_t; + using std::add_lvalue_reference; + using std::add_lvalue_reference_t; + using std::add_pointer; + using std::add_pointer_t; + using std::add_rvalue_reference; + using std::add_rvalue_reference_t; + using std::add_volatile; + using std::add_volatile_t; + using std::aligned_storage; + using std::aligned_storage_t; + using std::aligned_union; + using std::aligned_union_t; + using std::alignment_of; + using std::alignment_of_v; + using std::basic_common_reference; + using std::bool_constant; + using std::common_reference; + using std::common_reference_t; + using std::common_type; + using std::common_type_t; + using std::conditional; + using std::conditional_t; + using std::conjunction; + using std::conjunction_v; + using std::decay; + using std::decay_t; + using std::disjunction; + using std::disjunction_v; + using std::enable_if; + using std::enable_if_t; + using std::extent; + using std::extent_v; + using std::false_type; + using std::has_unique_object_representations; + using std::has_unique_object_representations_v; + using std::has_virtual_destructor; + using std::has_virtual_destructor_v; + using std::integral_constant; + using std::invoke_result; + using std::invoke_result_t; + using std::is_abstract; + using std::is_abstract_v; + using std::is_aggregate; + using std::is_aggregate_v; + using std::is_arithmetic; + using std::is_arithmetic_v; + using std::is_array; + using std::is_array_v; + using std::is_assignable; + using std::is_assignable_v; + using std::is_base_of; + using std::is_base_of_v; + using std::is_bounded_array; + using std::is_bounded_array_v; + using std::is_class; + using std::is_class_v; + using std::is_compound; + using std::is_compound_v; + using std::is_const; + using std::is_const_v; + using std::is_constant_evaluated; + using std::is_constructible; + using std::is_constructible_v; + using std::is_convertible; + using std::is_convertible_v; + using std::is_copy_assignable; + using std::is_copy_assignable_v; + using std::is_copy_constructible; + using std::is_copy_constructible_v; + using std::is_default_constructible; + using std::is_default_constructible_v; + using std::is_destructible; + using std::is_destructible_v; + using std::is_empty; + using std::is_empty_v; + using std::is_enum; + using std::is_enum_v; + using std::is_final; + using std::is_final_v; + using std::is_floating_point; + using std::is_floating_point_v; + using std::is_function; + using std::is_function_v; + using std::is_fundamental; + using std::is_fundamental_v; + using std::is_integral; + using std::is_integral_v; + using std::is_invocable; + using std::is_invocable_r; + using std::is_invocable_r_v; + using std::is_invocable_v; + using std::is_lvalue_reference; + using std::is_lvalue_reference_v; + using std::is_member_function_pointer; + using std::is_member_function_pointer_v; + using std::is_member_object_pointer; + using std::is_member_object_pointer_v; + using std::is_member_pointer; + using std::is_member_pointer_v; + using std::is_move_assignable; + using std::is_move_assignable_v; + using std::is_move_constructible; + using std::is_move_constructible_v; + using std::is_nothrow_assignable; + using std::is_nothrow_assignable_v; + using std::is_nothrow_constructible; + using std::is_nothrow_constructible_v; + using std::is_nothrow_convertible; + using std::is_nothrow_convertible_v; + using std::is_nothrow_copy_assignable; + using std::is_nothrow_copy_assignable_v; + using std::is_nothrow_copy_constructible; + using std::is_nothrow_copy_constructible_v; + using std::is_nothrow_default_constructible; + using std::is_nothrow_default_constructible_v; + using std::is_nothrow_destructible; + using std::is_nothrow_destructible_v; + using std::is_nothrow_invocable; + using std::is_nothrow_invocable_r; + using std::is_nothrow_invocable_r_v; + using std::is_nothrow_invocable_v; + using std::is_nothrow_move_assignable; + using std::is_nothrow_move_assignable_v; + using std::is_nothrow_move_constructible; + using std::is_nothrow_move_constructible_v; + using std::is_nothrow_swappable; + using std::is_nothrow_swappable_v; + using std::is_nothrow_swappable_with; + using std::is_nothrow_swappable_with_v; + using std::is_null_pointer; + using std::is_null_pointer_v; + using std::is_object; + using std::is_object_v; + using std::is_pod; + using std::is_pod_v; + using std::is_pointer; + using std::is_pointer_v; + using std::is_polymorphic; + using std::is_polymorphic_v; + using std::is_reference; + using std::is_reference_v; + using std::is_rvalue_reference; + using std::is_rvalue_reference_v; + using std::is_same; + using std::is_same_v; + using std::is_scalar; + using std::is_scalar_v; + using std::is_signed; + using std::is_signed_v; + using std::is_standard_layout; + using std::is_standard_layout_v; + using std::is_swappable; + using std::is_swappable_v; + using std::is_swappable_with; + using std::is_swappable_with_v; + using std::is_trivial; + using std::is_trivial_v; + using std::is_trivially_assignable; + using std::is_trivially_assignable_v; + using std::is_trivially_constructible; + using std::is_trivially_constructible_v; + using std::is_trivially_copy_assignable; + using std::is_trivially_copy_assignable_v; + using std::is_trivially_copy_constructible; + using std::is_trivially_copy_constructible_v; + using std::is_trivially_copyable; + using std::is_trivially_copyable_v; + using std::is_trivially_default_constructible; + using std::is_trivially_default_constructible_v; + using std::is_trivially_destructible; + using std::is_trivially_destructible_v; + using std::is_trivially_move_assignable; + using std::is_trivially_move_assignable_v; + using std::is_trivially_move_constructible; + using std::is_trivially_move_constructible_v; + using std::is_unbounded_array; + using std::is_unbounded_array_v; + using std::is_union; + using std::is_union_v; + using std::is_unsigned; + using std::is_unsigned_v; +#if __cpp_lib_is_virtual_base_of + using std::is_virtual_base_of; + using std::is_virtual_base_of_v; +#endif + using std::is_void; + using std::is_void_v; + using std::is_volatile; + using std::is_volatile_v; + using std::make_signed; + using std::make_signed_t; + using std::make_unsigned; + using std::make_unsigned_t; + using std::negation; + using std::negation_v; + using std::rank; + using std::rank_v; + using std::remove_all_extents; + using std::remove_all_extents_t; + using std::remove_const; + using std::remove_const_t; + using std::remove_cv; + using std::remove_cv_t; + using std::remove_cvref; + using std::remove_cvref_t; + using std::remove_extent; + using std::remove_extent_t; + using std::remove_pointer; + using std::remove_pointer_t; + using std::remove_reference; + using std::remove_reference_t; + using std::remove_volatile; + using std::remove_volatile_t; + using std::true_type; + using std::type_identity; + using std::type_identity_t; + using std::underlying_type; + using std::underlying_type_t; + using std::unwrap_ref_decay; + using std::unwrap_ref_decay_t; + using std::unwrap_reference; + using std::unwrap_reference_t; + using std::void_t; +#if __cpp_lib_reference_from_temporary + using std::reference_converts_from_temporary; + using std::reference_converts_from_temporary_v; + using std::reference_constructs_from_temporary; + using std::reference_constructs_from_temporary_v; +#endif +#if __cpp_lib_is_layout_compatible + using std::is_corresponding_member; + using std::is_layout_compatible; +#endif +#if __cpp_lib_is_pointer_interconvertible + using std::is_pointer_interconvertible_base_of; + using std::is_pointer_interconvertible_base_of_v; + using std::is_pointer_interconvertible_with_class; +#endif +} + +// <typeindex> +export namespace std +{ + using std::hash; + using std::type_index; +} + +// 17.7.2 <typeinfo> [typeinfo.syn] +export namespace std +{ + using std::bad_cast; + using std::bad_typeid; + using std::type_info; +} + +// <unordered_map> +export namespace std +{ + using std::unordered_map; + using std::unordered_multimap; + using std::operator==; + using std::erase_if; + using std::swap; + namespace pmr + { + using std::pmr::unordered_map; + using std::pmr::unordered_multimap; + } +} + +// <unordered_set> +export namespace std +{ + using std::unordered_multiset; + using std::unordered_set; + using std::operator==; + using std::erase_if; + using std::swap; + namespace pmr + { + using std::pmr::unordered_multiset; + using std::pmr::unordered_set; + } +} + +// <utility> +export namespace std +{ + using std::as_const; + using std::cmp_equal; + using std::cmp_greater; + using std::cmp_greater_equal; + using std::cmp_less; + using std::cmp_less_equal; + using std::cmp_not_equal; + using std::declval; + using std::exchange; + using std::forward; +#if __cpp_lib_forward_like + using std::forward_like; +#endif + using std::in_range; + using std::index_sequence; + using std::index_sequence_for; + using std::integer_sequence; + using std::make_index_sequence; + using std::make_integer_sequence; + using std::move; + using std::move_if_noexcept; + using std::pair; + using std::swap; + using std::operator==; + using std::operator<=>; + using std::get; + using std::in_place; + using std::in_place_index; + using std::in_place_index_t; + using std::in_place_t; + using std::in_place_type; + using std::in_place_type_t; + using std::make_pair; + using std::piecewise_construct; + using std::piecewise_construct_t; + using std::tuple_element; + using std::tuple_size; + namespace rel_ops + { + using std::rel_ops::operator!=; + using std::rel_ops::operator>; + using std::rel_ops::operator<=; + using std::rel_ops::operator>=; + } +#if __cpp_lib_unreachable + using std::unreachable; +#endif +} + +// <valarray> +export namespace std +{ + using std::gslice; + using std::gslice_array; + using std::indirect_array; + using std::mask_array; + using std::slice; + using std::slice_array; + using std::swap; + using std::valarray; + using std::operator*; + using std::operator/; + using std::operator%; + using std::operator+; + using std::operator-; + using std::operator^; + using std::operator&; + using std::operator|; + using std::operator<<; + using std::operator>>; + using std::operator&&; + using std::operator||; + using std::operator==; + using std::operator!=; + using std::operator<; + using std::operator>; + using std::operator<=; + using std::operator>=; + using std::abs; + using std::acos; + using std::asin; + using std::atan; + using std::atan2; + using std::begin; + using std::cos; + using std::cosh; + using std::end; + using std::exp; + using std::log; + using std::log10; + using std::pow; + using std::sin; + using std::sinh; + using std::sqrt; + using std::tan; + using std::tanh; +} + +// <variant> +export namespace std +{ + using std::get; + using std::get_if; + using std::holds_alternative; + using std::variant; + using std::variant_alternative; + using std::variant_alternative_t; + using std::variant_npos; + using std::variant_size; + using std::variant_size_v; + using std::operator==; + using std::operator!=; + using std::operator<; + using std::operator>; + using std::operator<=; + using std::operator>=; + using std::operator<=>; + using std::bad_variant_access; + using std::hash; + using std::monostate; + using std::swap; + using std::visit; +} + +// <vector> +export namespace std +{ + using std::vector; + using std::operator==; + using std::operator<=>; + using std::erase; + using std::erase_if; + using std::swap; + namespace pmr + { + using std::pmr::vector; + } + using std::hash; +} diff --git a/libstdc++-v3/src/c++23/std.compat.cc.in b/libstdc++-v3/src/c++23/std.compat.cc.in new file mode 100644 index 0000000000000000000000000000000000000000..5ca4dc4f15b1a5cbf63a0544dcc1001bddc64530 --- /dev/null +++ b/libstdc++-v3/src/c++23/std.compat.cc.in @@ -0,0 +1,29 @@ +// -*- C++ -*- [std.modules] module std.compat + +// Copyright The GNU Toolchain Authors. +// +// 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. + +// 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/>. + +export module std.compat; +export import std; + +#define STD_COMPAT 1 + +// C library exports are appended from std-clib.cc.in.