diff --git a/.gitignore b/.gitignore
index a9e42ef..4e9c87a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,2 @@
build/
-bin/
-*.kate-swp
+bin/
\ No newline at end of file
diff --git a/std.cppm b/std.cppm
deleted file mode 100644
index 4a46223..0000000
--- a/std.cppm
+++ /dev/null
@@ -1,4088 +0,0 @@
-// -*- 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
-// .
-
-module;
-
-// stdc++.h doesn't include because of TBB issues;
-// FIXME for now let's avoid the problem by suppressing TBB.
-#define _GLIBCXX_USE_TBB_PAR_BACKEND 0
-
-#include
-#include
-
-// Module std does include deprecated library interfaces.
-#undef __DEPRECATED
-#include
-
-export module std;
-
-// C library exports are appended from std-clib.cc.in.
-
-// 27.4
-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_first;
- using ranges::fold_left_first_with_iter;
- using ranges::fold_left_first_with_iter_result;
- using ranges::fold_left_with_iter;
- using ranges::fold_left_with_iter_result;
- using ranges::fold_right;
- using ranges::fold_right_last;
- using ranges::in_value_result;
- using ranges::out_value_result;
-#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
-#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
-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
-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;
-#ifdef __cpp_lib_atomic_lock_free_type_aliases
- using std::atomic_signed_lock_free;
-#endif
- 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;
-#ifdef __cpp_lib_atomic_lock_free_type_aliases
- using std::atomic_unsigned_lock_free;
-#endif
- 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
-#if __cpp_lib_barrier
-export namespace std
-{
- using std::barrier;
-}
-#endif
-
-// 22.15
-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;
-#if __cpp_lib_byteswap // >= C++23
- using std::byteswap;
-#endif
-}
-
-// 22.9
-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
-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
-#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;
-#if __cpp_lib_chrono >= 201907L
- 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;
-#endif
- 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
-
-// : 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
-#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
-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;
-#if __cpp_lib_tuple_like >= 202311L
- using std::tuple_element;
- using std::tuple_element_t;
- using std::tuple_size;
- using std::tuple_size_v;
- using std::get;
-#endif
-}
-export namespace std::inline literals::inline complex_literals
-{
- using std::operator""il;
- using std::operator""i;
- using std::operator""if;
-}
-
-// 18
-#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
-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
-#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
-#if __cpp_lib_debugging
-export namespace std
-{
- using std::breakpoint;
- using std::breakpoint_if_debugging;
- using std::is_debugger_present;
-}
-#endif
-
-// 24.3
-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
-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
-#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
-#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
-
-//
-#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
-
-//
-#if __cpp_lib_flat_map
-export namespace std
-{
- using std::flat_map;
- using std::flat_multimap;
- using std::sorted_equivalent;
- using std::sorted_equivalent_t;
- using std::sorted_unique;
- using std::sorted_unique_t;
-}
-#endif
-
-//
-#if __cpp_lib_flat_set
-export namespace std
-{
- using std::flat_set;
- using std::flat_multiset;
- using std::sorted_equivalent;
- using std::sorted_equivalent_t;
- using std::sorted_unique;
- using std::sorted_unique_t;
-}
-#endif
-
-//
-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;
-#if __cpp_lib_format_ranges
- 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;
-#ifdef __cpp_lib_format_ranges
- using std::format_kind;
- using std::range_format;
- using std::range_formatter;
-#endif
-}
-
-//
-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;
- }
-}
-
-//
-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;
-}
-
-//
-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;
- }
-}
-
-//
-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
-
-// FIXME
-
-// 17.10.2
-export namespace std
-{
- using std::begin;
- using std::end;
- using std::initializer_list;
-}
-
-// FIXME
-
-//
-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;
-}
-
-//
-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;
-}
-
-//
-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;
-}
-
-//
-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;
-}
-
-//
-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>>;
-}
-
-//
-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;
- // _Cpo is an implementation detail we can't avoid exposing; if we do the
- // using in ranges directly, it conflicts with any friend functions of the
- // same name, which is why the customization points are in an inline
- // namespace in the first place.
- namespace ranges::inline _Cpo
- {
- using _Cpo::iter_move;
- using _Cpo::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
-#if __glibcxx_algorithm_default_value_type // >= C++26
- using std::projected_value_t;
-#endif
-}
-// FIXME these should be friends of __normal_iterator to avoid exporting
-// __gnu_cxx.
-export namespace __gnu_cxx
-{
- using __gnu_cxx::operator==;
- using __gnu_cxx::operator<=>;
- using __gnu_cxx::operator+;
- using __gnu_cxx::operator-;
-}
-
-//
-export namespace std
-{
- using std::latch;
-}
-
-// 17.3.3 [limits.syn]
-export namespace std
-{
- using std::float_denorm_style; // deprecated in C++23
- using std::float_round_style;
- using std::numeric_limits;
-}
-
-// FIXME
-
-//
-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;
- }
-}
-
-//
-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;
-}
-
-//