From 868af3f950c562baa1a73539703c6c78d51adceb Mon Sep 17 00:00:00 2001 From: Justine Tunney Date: Tue, 22 Mar 2022 05:51:41 -0700 Subject: [PATCH] Import C++ Standard Template Library You can now use the hardest fastest and most dangerous language there is with Cosmopolitan. So far about 75% of LLVM libcxx has been added. A few breaking changes needed to be made to help this go smoothly. - Rename nothrow to dontthrow - Rename nodiscard to dontdiscard - Add some libm functions, e.g. lgamma, nan, etc. - Change intmax_t from int128 to int64 like everything else - Introduce %jjd formatting directive for int128_t - Introduce strtoi128(), strtou128(), etc. - Rename bsrmax() to bsr128() Some of the templates that should be working currently are std::vector, std::string, std::map, std::set, std::deque, etc. --- .vscode/c_cpp_properties.json | 4 +- Makefile | 11 +- build/bootstrap/package.com | Bin 112372 -> 219310 bytes build/definitions.mk | 1 - build/htags | 2 +- build/rules.mk | 7 +- examples/cplusplus-stl.cc | 38 + examples/examples.mk | 2 +- examples/nesemu1.cc | 2 +- libc/alg/alg.h | 8 +- libc/alg/critbit0.h | 8 +- libc/assert.h | 2 + libc/calls/calls.h | 14 +- libc/calls/creat.c | 2 +- libc/calls/internal.h | 2 +- libc/calls/termios.h | 6 +- libc/calls/weirdtypes.h | 16 +- libc/fmt/conv.h | 31 +- libc/fmt/fmt.c | 7 +- libc/fmt/fmt.h | 10 +- libc/{ohmyplus/vector.c => fmt/i128abs.c} | 11 +- libc/fmt/imaxabs.c | 2 +- libc/fmt/ntoa.c | 8 +- libc/fmt/strtoi128.c | 60 + libc/fmt/strtoimax.c | 2 +- libc/fmt/strtoll_l.c | 24 + libc/fmt/strtou128.c | 53 + libc/fmt/strtoull_l.c | 25 + libc/fmt/strtoumax.c | 2 +- libc/fmt/swprintf.c | 26 + libc/fmt/vcscanf.c | 16 +- libc/fmt/wcstoi128.c | 60 + libc/fmt/wcstoimax.c | 2 +- libc/fmt/wcstol.c | 2 +- libc/fmt/wcstoll.c | 59 + libc/fmt/wcstoll_l.c | 25 + libc/fmt/wcstou128.c | 53 + libc/fmt/wcstoull.c | 53 + libc/fmt/wcstoull_l.c | 25 + libc/fmt/wcstoumax.c | 2 +- libc/integral/c.inc | 49 +- libc/integral/lp64.inc | 20 +- libc/intrin/asan.c | 15 +- libc/intrin/ubsan.c | 6 +- libc/inttypes.h | 2 + libc/isystem/endian.h | 8 +- libc/isystem/features.h | 38 + libc/isystem/stdint.h | 1 + libc/isystem/stdio.h | 2 + libc/isystem/stdlib.h | 2 + libc/isystem/time.h | 1 + libc/isystem/wchar.h | 1 + libc/libc.mk | 1 - libc/limits.h | 26 +- libc/literal.h | 1 + libc/math.h | 12 +- libc/mem/get_current_dir_name.c | 2 +- libc/mem/mem.h | 8 +- libc/mem/unhexstr.c | 2 +- libc/nexgen32e/bsf.h | 2 +- libc/nexgen32e/bsr.h | 2 +- libc/nexgen32e/{bsrmax.S => bsr128.S} | 4 +- libc/nt/memory.h | 6 +- libc/nt/runtime.h | 4 +- libc/nt/winsock.h | 8 +- libc/ohmyplus/ohmyplus.mk | 56 - libc/ohmyplus/vector.h | 56 - libc/runtime/gc.h | 2 +- libc/sock/internal.h | 6 +- libc/stdio/mkostemps.c | 2 +- libc/stdio/mkostempsm.c | 4 +- libc/stdio/printf.c | 4 +- libc/stdio/stdio.h | 29 +- libc/stdio/temp.h | 15 +- libc/str/str.h | 6 +- libc/str/towctrans.c | 25 + libc/str/wctrans.c | 25 + libc/testlib/ezbench.h | 3 + libc/testlib/formatint.c | 2 +- libc/testlib/formatrange.c | 2 +- libc/testlib/formatstr.c | 2 +- libc/time/time.h | 4 +- libc/tinymath/cosdf.c | 71 + libc/tinymath/gamma.c | 1 - libc/tinymath/kernel.internal.h | 5 + libc/tinymath/lgamma.c | 24 + libc/tinymath/lgamma_r.c | 321 + libc/tinymath/lgammaf.c | 24 + libc/tinymath/lgammaf_r.c | 256 + libc/{fmt/imaxabs.thunk.S => tinymath/nan.c} | 14 +- libc/tinymath/nanf.c | 23 + libc/tinymath/nanl.c | 23 + libc/tinymath/sindf.c | 72 + libc/tinymath/tandf.c | 90 + libc/unicode/isdigit_l.c | 24 + libc/unicode/isxdigit_l.c | 24 + libc/unicode/locale.h | 18 + libc/x/x.h | 20 +- test/libc/alg/critbit0_test.c | 2 +- test/libc/fmt/atoi_test.c | 45 +- test/libc/fmt/palandprintf_test.c | 37 +- test/libc/fmt/sscanf_test.c | 12 +- test/libc/mem/test.mk | 91 +- test/libc/nexgen32e/memeqmask_test.c | 2 +- test/libc/sock/poll_test.c | 2 +- test/libc/xed/lib.h | 2 +- test/libc/xed/x86ild_lib.c | 2 +- third_party/argon2/blake2b.c | 3 +- third_party/chibicc/parse.c | 2 +- third_party/chibicc/preprocess.c | 4 + third_party/chibicc/test/common.c | 4 +- third_party/chibicc/test/int128_test.c | 8 +- third_party/compiler_rt/int_types.h | 1 - third_party/dlmalloc/dlmalloc.internal.h | 4 +- third_party/gdtoa/gdtoa.h | 4 + third_party/gdtoa/strtod_l.c | 24 + third_party/gdtoa/strtof.c | 1 + third_party/gdtoa/strtof_l.c | 24 + third_party/gdtoa/wcstod.c | 27 + third_party/gdtoa/wcstof.c | 28 + third_party/gdtoa/wcstold.c | 28 + third_party/gdtoa/wcstold_l.c | 25 + third_party/libcxx.bak/__bit_reference | 1281 ++++ third_party/libcxx.bak/__config | 1484 ++++ third_party/libcxx.bak/__debug | 280 + third_party/libcxx.bak/__functional_base | 653 ++ third_party/libcxx.bak/__split_buffer | 645 ++ third_party/libcxx.bak/__tuple | 552 ++ third_party/libcxx.bak/__undef_macros | 34 + third_party/libcxx.bak/algorithm | 5686 ++++++++++++++ third_party/libcxx.bak/climits | 48 + third_party/libcxx.bak/cstddef | 114 + third_party/libcxx.bak/cstdint | 191 + third_party/libcxx.bak/cstdio | 172 + third_party/libcxx.bak/cstdlib | 164 + third_party/libcxx.bak/cstring | 97 + third_party/libcxx.bak/initializer_list | 118 + third_party/libcxx.bak/iosfwd | 221 + third_party/libcxx.bak/libcxx.mk | 57 + third_party/libcxx.bak/limits | 819 ++ third_party/libcxx.bak/memory | 5371 +++++++++++++ third_party/libcxx.bak/stdexcept | 305 + third_party/libcxx.bak/type_traits | 4061 ++++++++++ third_party/libcxx.bak/version | 238 + third_party/libcxx.bak/wchar.h | 182 + third_party/libcxx/.clang-format | 13 + third_party/libcxx/CREDITS.TXT | 150 + third_party/libcxx/LICENSE.TXT | 311 + third_party/libcxx/README.cosmo | 6 + third_party/libcxx/__bit_reference | 1280 ++++ third_party/libcxx/__bsd_locale_fallbacks.h | 137 + third_party/libcxx/__config | 1490 ++++ third_party/libcxx/__debug | 279 + third_party/libcxx/__errc | 217 + third_party/libcxx/__functional_base | 652 ++ third_party/libcxx/__functional_base_03 | 223 + third_party/libcxx/__hash_table | 2913 +++++++ third_party/libcxx/__locale | 1553 ++++ third_party/libcxx/__mutex_base | 541 ++ third_party/libcxx/__node_handle | 208 + third_party/libcxx/__nullptr | 61 + third_party/libcxx/__split_buffer | 644 ++ third_party/libcxx/__string | 985 +++ third_party/libcxx/__threading_support | 490 ++ third_party/libcxx/__tree | 2843 +++++++ third_party/libcxx/__tuple | 551 ++ third_party/libcxx/__undef_macros | 33 + third_party/libcxx/algorithm | 5685 ++++++++++++++ third_party/libcxx/algorithm.cc | 96 + third_party/libcxx/atomic_support.hh | 150 + third_party/libcxx/bit | 486 ++ third_party/libcxx/bitset | 1109 +++ third_party/libcxx/cassert | 24 + third_party/libcxx/cctype | 120 + third_party/libcxx/cerrno | 32 + third_party/libcxx/charconv | 616 ++ third_party/libcxx/charconv.cc | 160 + third_party/libcxx/chrono | 2960 ++++++++ third_party/libcxx/climits | 47 + third_party/libcxx/cmath | 673 ++ third_party/libcxx/config_elast.h | 41 + third_party/libcxx/cstdarg | 46 + third_party/libcxx/cstddef | 113 + third_party/libcxx/cstdint | 191 + third_party/libcxx/cstdio | 171 + third_party/libcxx/cstdlib | 163 + third_party/libcxx/cstring | 96 + third_party/libcxx/ctime | 81 + third_party/libcxx/ctype.h | 59 + third_party/libcxx/cwchar | 193 + third_party/libcxx/cwctype | 86 + third_party/libcxx/deque | 3039 ++++++++ third_party/libcxx/errno.h | 397 + third_party/libcxx/exception | 329 + third_party/libcxx/exception.cc | 16 + third_party/libcxx/exception_fallback.hh | 109 + .../libcxx/exception_pointer_unimplemented.hh | 68 + third_party/libcxx/functional | 3096 ++++++++ third_party/libcxx/functional.cc | 26 + third_party/libcxx/hash.cc | 562 ++ third_party/libcxx/initializer_list | 117 + third_party/libcxx/ios | 1066 +++ third_party/libcxx/iosfwd | 220 + third_party/libcxx/istream | 1651 ++++ third_party/libcxx/iterator | 1938 +++++ third_party/libcxx/libcxx.mk | 123 + third_party/libcxx/limits | 810 ++ third_party/libcxx/limits.h | 64 + third_party/libcxx/list | 2488 ++++++ third_party/libcxx/locale | 4353 +++++++++++ third_party/libcxx/locale.h | 44 + third_party/libcxx/map | 2246 ++++++ third_party/libcxx/math.h | 1861 +++++ third_party/libcxx/memory | 5370 +++++++++++++ third_party/libcxx/mutex | 711 ++ third_party/libcxx/new | 372 + third_party/libcxx/new.cc | 226 + third_party/libcxx/new_handler_fallback.hh | 26 + third_party/libcxx/numeric | 593 ++ third_party/libcxx/optional | 1420 ++++ third_party/libcxx/ostream | 1107 +++ third_party/libcxx/queue | 803 ++ third_party/libcxx/random | 6743 +++++++++++++++++ third_party/libcxx/random.cc | 149 + third_party/libcxx/ratio | 532 ++ third_party/libcxx/refstring.hh | 114 + third_party/libcxx/set | 1493 ++++ third_party/libcxx/sstream | 985 +++ third_party/libcxx/stdexcept | 304 + third_party/libcxx/stdexcept.cc | 14 + third_party/libcxx/stdexcept_default.hh | 65 + third_party/libcxx/stdio.h | 119 + third_party/libcxx/stdlib.h | 103 + third_party/libcxx/streambuf | 500 ++ third_party/libcxx/string | 4365 +++++++++++ third_party/libcxx/string.cc | 459 ++ third_party/libcxx/string.h | 140 + third_party/libcxx/string_view | 842 ++ third_party/libcxx/system_error | 486 ++ third_party/libcxx/system_error.cc | 240 + third_party/libcxx/tuple | 1451 ++++ third_party/libcxx/type_traits | 4060 ++++++++++ third_party/libcxx/typeinfo | 350 + third_party/libcxx/unordered_map | 2445 ++++++ third_party/libcxx/unordered_set | 1680 ++++ third_party/libcxx/utility | 1619 ++++ third_party/libcxx/vector | 3406 +++++++++ third_party/libcxx/vector.cc | 16 + third_party/libcxx/version | 237 + third_party/libcxx/wchar.h | 205 + third_party/libcxx/wctype.h | 78 + third_party/linenoise/linenoise.h | 6 +- third_party/lua/cosmo.h | 2 +- third_party/lua/luaformatstack.c | 2 +- third_party/mbedtls/formatclientciphers.c | 2 +- third_party/mbedtls/iana.h | 2 +- third_party/quickjs/call.c | 8 +- third_party/quickjs/internal.h | 44 +- third_party/smallz4/README.cosmo | 6 + third_party/smallz4/smallz4.cc | 314 + third_party/smallz4/smallz4.hh | 807 ++ third_party/smallz4/smallz4.mk | 86 + third_party/smallz4/smallz4cat.c | 356 + third_party/smallz4/stub.c | 20 + third_party/third_party.mk | 2 + tool/build/calculator.c | 8 +- tool/build/lib/elfwriter.h | 2 +- tool/build/lib/machine.h | 4 +- tool/build/lib/pty.h | 2 +- tool/build/runit.c | 3 +- tool/build/runitd.c | 2 +- tool/decode/lib/asmcodegen.c | 2 +- tool/decode/lib/asmcodegen.h | 14 +- tool/decode/lib/flagger.c | 2 +- tool/decode/lib/flagger.h | 2 +- tool/decode/mkcombos.c | 2 +- tool/decode/zip.c | 4 +- tool/emacs/c.lang | 4 +- tool/emacs/cosmo-c-keywords.el | 4 +- tool/emacs/cosmo-stuff.el | 12 +- tool/emacs/key.py | 10 +- tool/hash/crctab.c | 2 +- tool/net/echoserver.c | 4 +- tool/net/lmaxmind.c | 2 +- tool/net/net.mk | 1 - tool/viz/int2float.c | 4 +- 286 files changed, 123985 insertions(+), 505 deletions(-) create mode 100644 examples/cplusplus-stl.cc rename libc/{ohmyplus/vector.c => fmt/i128abs.c} (89%) create mode 100644 libc/fmt/strtoi128.c create mode 100644 libc/fmt/strtoll_l.c create mode 100644 libc/fmt/strtou128.c create mode 100644 libc/fmt/strtoull_l.c create mode 100644 libc/fmt/swprintf.c create mode 100644 libc/fmt/wcstoi128.c create mode 100644 libc/fmt/wcstoll.c create mode 100644 libc/fmt/wcstoll_l.c create mode 100644 libc/fmt/wcstou128.c create mode 100644 libc/fmt/wcstoull.c create mode 100644 libc/fmt/wcstoull_l.c create mode 100644 libc/isystem/features.h rename libc/nexgen32e/{bsrmax.S => bsr128.S} (98%) delete mode 100644 libc/ohmyplus/ohmyplus.mk delete mode 100644 libc/ohmyplus/vector.h create mode 100644 libc/str/towctrans.c create mode 100644 libc/str/wctrans.c create mode 100644 libc/tinymath/cosdf.c create mode 100644 libc/tinymath/lgamma.c create mode 100644 libc/tinymath/lgamma_r.c create mode 100644 libc/tinymath/lgammaf.c create mode 100644 libc/tinymath/lgammaf_r.c rename libc/{fmt/imaxabs.thunk.S => tinymath/nan.c} (84%) create mode 100644 libc/tinymath/nanf.c create mode 100644 libc/tinymath/nanl.c create mode 100644 libc/tinymath/sindf.c create mode 100644 libc/tinymath/tandf.c create mode 100644 libc/unicode/isdigit_l.c create mode 100644 libc/unicode/isxdigit_l.c create mode 100644 third_party/gdtoa/strtod_l.c create mode 100644 third_party/gdtoa/strtof_l.c create mode 100644 third_party/gdtoa/wcstod.c create mode 100644 third_party/gdtoa/wcstof.c create mode 100644 third_party/gdtoa/wcstold.c create mode 100644 third_party/gdtoa/wcstold_l.c create mode 100644 third_party/libcxx.bak/__bit_reference create mode 100644 third_party/libcxx.bak/__config create mode 100644 third_party/libcxx.bak/__debug create mode 100644 third_party/libcxx.bak/__functional_base create mode 100644 third_party/libcxx.bak/__split_buffer create mode 100644 third_party/libcxx.bak/__tuple create mode 100644 third_party/libcxx.bak/__undef_macros create mode 100644 third_party/libcxx.bak/algorithm create mode 100644 third_party/libcxx.bak/climits create mode 100644 third_party/libcxx.bak/cstddef create mode 100644 third_party/libcxx.bak/cstdint create mode 100644 third_party/libcxx.bak/cstdio create mode 100644 third_party/libcxx.bak/cstdlib create mode 100644 third_party/libcxx.bak/cstring create mode 100644 third_party/libcxx.bak/initializer_list create mode 100644 third_party/libcxx.bak/iosfwd create mode 100644 third_party/libcxx.bak/libcxx.mk create mode 100644 third_party/libcxx.bak/limits create mode 100644 third_party/libcxx.bak/memory create mode 100644 third_party/libcxx.bak/stdexcept create mode 100644 third_party/libcxx.bak/type_traits create mode 100644 third_party/libcxx.bak/version create mode 100644 third_party/libcxx.bak/wchar.h create mode 100644 third_party/libcxx/.clang-format create mode 100644 third_party/libcxx/CREDITS.TXT create mode 100644 third_party/libcxx/LICENSE.TXT create mode 100644 third_party/libcxx/README.cosmo create mode 100644 third_party/libcxx/__bit_reference create mode 100644 third_party/libcxx/__bsd_locale_fallbacks.h create mode 100644 third_party/libcxx/__config create mode 100644 third_party/libcxx/__debug create mode 100644 third_party/libcxx/__errc create mode 100644 third_party/libcxx/__functional_base create mode 100644 third_party/libcxx/__functional_base_03 create mode 100644 third_party/libcxx/__hash_table create mode 100644 third_party/libcxx/__locale create mode 100644 third_party/libcxx/__mutex_base create mode 100644 third_party/libcxx/__node_handle create mode 100644 third_party/libcxx/__nullptr create mode 100644 third_party/libcxx/__split_buffer create mode 100644 third_party/libcxx/__string create mode 100644 third_party/libcxx/__threading_support create mode 100644 third_party/libcxx/__tree create mode 100644 third_party/libcxx/__tuple create mode 100644 third_party/libcxx/__undef_macros create mode 100644 third_party/libcxx/algorithm create mode 100644 third_party/libcxx/algorithm.cc create mode 100644 third_party/libcxx/atomic_support.hh create mode 100644 third_party/libcxx/bit create mode 100644 third_party/libcxx/bitset create mode 100644 third_party/libcxx/cassert create mode 100644 third_party/libcxx/cctype create mode 100644 third_party/libcxx/cerrno create mode 100644 third_party/libcxx/charconv create mode 100644 third_party/libcxx/charconv.cc create mode 100644 third_party/libcxx/chrono create mode 100644 third_party/libcxx/climits create mode 100644 third_party/libcxx/cmath create mode 100644 third_party/libcxx/config_elast.h create mode 100644 third_party/libcxx/cstdarg create mode 100644 third_party/libcxx/cstddef create mode 100644 third_party/libcxx/cstdint create mode 100644 third_party/libcxx/cstdio create mode 100644 third_party/libcxx/cstdlib create mode 100644 third_party/libcxx/cstring create mode 100644 third_party/libcxx/ctime create mode 100644 third_party/libcxx/ctype.h create mode 100644 third_party/libcxx/cwchar create mode 100644 third_party/libcxx/cwctype create mode 100644 third_party/libcxx/deque create mode 100644 third_party/libcxx/errno.h create mode 100644 third_party/libcxx/exception create mode 100644 third_party/libcxx/exception.cc create mode 100644 third_party/libcxx/exception_fallback.hh create mode 100644 third_party/libcxx/exception_pointer_unimplemented.hh create mode 100644 third_party/libcxx/functional create mode 100644 third_party/libcxx/functional.cc create mode 100644 third_party/libcxx/hash.cc create mode 100644 third_party/libcxx/initializer_list create mode 100644 third_party/libcxx/ios create mode 100644 third_party/libcxx/iosfwd create mode 100644 third_party/libcxx/istream create mode 100644 third_party/libcxx/iterator create mode 100644 third_party/libcxx/libcxx.mk create mode 100644 third_party/libcxx/limits create mode 100644 third_party/libcxx/limits.h create mode 100644 third_party/libcxx/list create mode 100644 third_party/libcxx/locale create mode 100644 third_party/libcxx/locale.h create mode 100644 third_party/libcxx/map create mode 100644 third_party/libcxx/math.h create mode 100644 third_party/libcxx/memory create mode 100644 third_party/libcxx/mutex create mode 100644 third_party/libcxx/new create mode 100644 third_party/libcxx/new.cc create mode 100644 third_party/libcxx/new_handler_fallback.hh create mode 100644 third_party/libcxx/numeric create mode 100644 third_party/libcxx/optional create mode 100644 third_party/libcxx/ostream create mode 100644 third_party/libcxx/queue create mode 100644 third_party/libcxx/random create mode 100644 third_party/libcxx/random.cc create mode 100644 third_party/libcxx/ratio create mode 100644 third_party/libcxx/refstring.hh create mode 100644 third_party/libcxx/set create mode 100644 third_party/libcxx/sstream create mode 100644 third_party/libcxx/stdexcept create mode 100644 third_party/libcxx/stdexcept.cc create mode 100644 third_party/libcxx/stdexcept_default.hh create mode 100644 third_party/libcxx/stdio.h create mode 100644 third_party/libcxx/stdlib.h create mode 100644 third_party/libcxx/streambuf create mode 100644 third_party/libcxx/string create mode 100644 third_party/libcxx/string.cc create mode 100644 third_party/libcxx/string.h create mode 100644 third_party/libcxx/string_view create mode 100644 third_party/libcxx/system_error create mode 100644 third_party/libcxx/system_error.cc create mode 100644 third_party/libcxx/tuple create mode 100644 third_party/libcxx/type_traits create mode 100644 third_party/libcxx/typeinfo create mode 100644 third_party/libcxx/unordered_map create mode 100644 third_party/libcxx/unordered_set create mode 100644 third_party/libcxx/utility create mode 100644 third_party/libcxx/vector create mode 100644 third_party/libcxx/vector.cc create mode 100644 third_party/libcxx/version create mode 100644 third_party/libcxx/wchar.h create mode 100644 third_party/libcxx/wctype.h create mode 100644 third_party/smallz4/README.cosmo create mode 100644 third_party/smallz4/smallz4.cc create mode 100644 third_party/smallz4/smallz4.hh create mode 100644 third_party/smallz4/smallz4.mk create mode 100644 third_party/smallz4/smallz4cat.c create mode 100644 third_party/smallz4/stub.c diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 19f21349678..970f7da456d 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -15,7 +15,7 @@ "alignas(x)", "alignof(x)", "artificial=", - "nodiscard=", + "dontdiscard=", "mayalias=", "forceinline=", "forcealign(x)=", @@ -48,7 +48,7 @@ "nosideeffect=", "unreachable=", "thatispacked=", - "nothrow=", + "dontthrow=", "nocallback=", "relegated=", "hidden=", diff --git a/Makefile b/Makefile index 6314ab1e0ac..9051281bf78 100644 --- a/Makefile +++ b/Makefile @@ -111,12 +111,12 @@ include libc/rand/rand.mk # │ include libc/unicode/unicode.mk # │ include third_party/dlmalloc/dlmalloc.mk #─┘ include libc/mem/mem.mk #─┐ -include libc/ohmyplus/ohmyplus.mk # ├──DYNAMIC RUNTIME -include libc/zipos/zipos.mk # │ You can now use stdio -include third_party/gdtoa/gdtoa.mk # │ You can finally call malloc() -include libc/time/time.mk # │ +include libc/zipos/zipos.mk # ├──DYNAMIC RUNTIME +include third_party/gdtoa/gdtoa.mk # │ You can now use stdio +include libc/time/time.mk # │ You can finally call malloc() include libc/alg/alg.mk # │ include libc/stdio/stdio.mk # │ +include third_party/libcxx/libcxx.mk # │ include libc/thread/thread.mk # │ include net/net.mk # │ include libc/log/log.mk # │ @@ -145,6 +145,7 @@ include third_party/maxmind/maxmind.mk include third_party/lua/lua.mk include third_party/make/make.mk include third_party/argon2/argon2.mk +include third_party/smallz4/smallz4.mk include third_party/sqlite3/sqlite3.mk include third_party/mbedtls/test/test.mk include third_party/quickjs/quickjs.mk @@ -255,7 +256,6 @@ COSMOPOLITAN_OBJECTS = \ LIBC_NT_WS2_32 \ LIBC_NT_IPHLPAPI \ LIBC_NT_MSWSOCK \ - LIBC_OHMYPLUS \ LIBC_X \ THIRD_PARTY_GETOPT \ LIBC_LOG \ @@ -308,7 +308,6 @@ COSMOPOLITAN_HEADERS = \ LIBC_MEM \ LIBC_NEXGEN32E \ LIBC_NT \ - LIBC_OHMYPLUS \ LIBC_RAND \ LIBC_RUNTIME \ LIBC_SOCK \ diff --git a/build/bootstrap/package.com b/build/bootstrap/package.com index 6518761caf8a1dfb2fc1cac1b54ea9fccc42a225..285af9e642716add4dba92bc83e8ef569d1871b6 100755 GIT binary patch literal 219310 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 A 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

ApClWVg7_!6p0M%1apQ9nY_}>mkJ|~>J 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

u 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 literal 112372 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 Po m{ + {"CPU", 10}, + {"GPU", 15}, + {"RAM", 20}, + }; + printf("m[\"CPU\"] is %d\n", m["CPU"]); + printf("m[\"RAM\"] is %d\n", m["RAM"]); + printf("m[\"GPU\"] is %d\n", m["GPU"]); + printf("setting cpu to 25\n"); + m["CPU"] = 25; // update an existing value + printf("m[\"CPU\"] is %d\n", m["CPU"]); + printf("m[\"RAM\"] is %d\n", m["RAM"]); + printf("m[\"GPU\"] is %d\n", m["GPU"]); +} diff --git a/examples/examples.mk b/examples/examples.mk index ade86434afa..270390ed5db 100644 --- a/examples/examples.mk +++ b/examples/examples.mk @@ -51,7 +51,6 @@ EXAMPLES_DIRECTDEPS = \ LIBC_NT_USER32 \ LIBC_NT_WS2_32 \ LIBC_NT_ADVAPI32 \ - LIBC_OHMYPLUS \ LIBC_RAND \ LIBC_RUNTIME \ LIBC_SOCK \ @@ -73,6 +72,7 @@ EXAMPLES_DIRECTDEPS = \ THIRD_PARTY_DLMALLOC \ THIRD_PARTY_GDTOA \ THIRD_PARTY_GETOPT \ + THIRD_PARTY_LIBCXX \ THIRD_PARTY_LINENOISE \ THIRD_PARTY_LUA \ THIRD_PARTY_MBEDTLS \ diff --git a/examples/nesemu1.cc b/examples/nesemu1.cc index e0dc738dc90..59d23afa217 100644 --- a/examples/nesemu1.cc +++ b/examples/nesemu1.cc @@ -26,7 +26,6 @@ #include "libc/macros.internal.h" #include "libc/math.h" #include "libc/mem/mem.h" -#include "libc/ohmyplus/vector.h" #include "libc/runtime/runtime.h" #include "libc/sock/sock.h" #include "libc/stdio/stdio.h" @@ -43,6 +42,7 @@ #include "libc/zip.h" #include "libc/zipos/zipos.internal.h" #include "third_party/getopt/getopt.h" +#include "third_party/libcxx/vector" #include "tool/viz/lib/knobs.h" STATIC_YOINK("zip_uri_support"); diff --git a/libc/alg/alg.h b/libc/alg/alg.h index 39fb1633a02..2522ab53b42 100644 --- a/libc/alg/alg.h +++ b/libc/alg/alg.h @@ -8,10 +8,10 @@ COSMOPOLITAN_C_START_ void *bsearch(const void *, const void *, size_t, size_t, int cmp(const void *, const void *)) - paramsnonnull() nothrow nosideeffect; + paramsnonnull() dontthrow nosideeffect; void *bsearch_r(const void *, const void *, size_t, size_t, int cmp(const void *, const void *, void *), void *) - paramsnonnull((1, 2, 5)) nothrow nosideeffect; + paramsnonnull((1, 2, 5)) dontthrow nosideeffect; void djbsort(int32_t *, size_t); void qsort(void *, size_t, size_t, int (*)(const void *, const void *)) paramsnonnull(); @@ -19,9 +19,9 @@ void qsort_r(void *, size_t, size_t, int cmp(const void *, const void *, void *), void *arg) paramsnonnull((1, 4)); int tarjan(int, const int (*)[2], int, int[], int[], int *) - paramsnonnull((2, 4)) nocallback nothrow; + paramsnonnull((2, 4)) nocallback dontthrow; -#define __algalloc returnspointerwithnoaliases nothrow nocallback nodiscard +#define __algalloc returnspointerwithnoaliases dontthrow nocallback dontdiscard char *replacestr(const char *, const char *, const char *) paramsnonnull() __algalloc; diff --git a/libc/alg/critbit0.h b/libc/alg/critbit0.h index ddacc991dba..acf78f88e4b 100644 --- a/libc/alg/critbit0.h +++ b/libc/alg/critbit0.h @@ -11,15 +11,15 @@ struct critbit0 { size_t count; }; -bool critbit0_contains(struct critbit0 *, const char *) nothrow nosideeffect +bool critbit0_contains(struct critbit0 *, const char *) dontthrow nosideeffect paramsnonnull(); bool critbit0_insert(struct critbit0 *, const char *) paramsnonnull(); -bool critbit0_delete(struct critbit0 *, const char *) nothrow paramsnonnull(); -void critbit0_clear(struct critbit0 *) nothrow paramsnonnull(); +bool critbit0_delete(struct critbit0 *, const char *) dontthrow paramsnonnull(); +void critbit0_clear(struct critbit0 *) dontthrow paramsnonnull(); char *critbit0_get(struct critbit0 *, const char *); intptr_t critbit0_allprefixed(struct critbit0 *, const char *, intptr_t (*)(const char *, void *), void *) - paramsnonnull((1, 2, 3)) nothrow; + paramsnonnull((1, 2, 3)) dontthrow; bool critbit0_emplace(struct critbit0 *, char *, size_t) paramsnonnull(); COSMOPOLITAN_C_END_ diff --git a/libc/assert.h b/libc/assert.h index 8ab8e0cd147..6583800c832 100644 --- a/libc/assert.h +++ b/libc/assert.h @@ -12,7 +12,9 @@ void __assert_fail(const char *, const char *, int) hidden wontreturn relegated; ((void)((EXPR) || (__assert_fail(#EXPR, __FILE__, __LINE__), 0))) #endif +#ifndef __cplusplus #define static_assert _Static_assert +#endif COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ diff --git a/libc/calls/calls.h b/libc/calls/calls.h index 2b1e25e2480..100577a172a 100644 --- a/libc/calls/calls.h +++ b/libc/calls/calls.h @@ -66,8 +66,8 @@ COSMOPOLITAN_C_START_ typedef int sig_atomic_t; -DIR *fdopendir(int) nodiscard; -DIR *opendir(const char *) nodiscard; +DIR *fdopendir(int) dontdiscard; +DIR *opendir(const char *) dontdiscard; bool fileexists(const char *); bool isdirectory(const char *); bool isexecutable(const char *); @@ -76,12 +76,12 @@ bool issymlink(const char *); bool32 isatty(int) nosideeffect; bool32 ischardev(int) nosideeffect; char *commandv(const char *, char[hasatleast PATH_MAX]); -char *get_current_dir_name(void) nodiscard; +char *get_current_dir_name(void) dontdiscard; char *getcwd(char *, size_t); char *realpath(const char *, char *); -char *replaceuser(const char *) nodiscard; +char *replaceuser(const char *) dontdiscard; char *ttyname(int); -int access(const char *, int) nothrow; +int access(const char *, int) dontthrow; int arch_prctl(); int chdir(const char *); int chmod(const char *, uint32_t); @@ -105,7 +105,7 @@ int execvpe(const char *, char *const[], char *const[]); int faccessat(int, const char *, int, uint32_t); int fadvise(int, uint64_t, uint64_t, int); int fchdir(int); -int fchmod(int, uint32_t) nothrow; +int fchmod(int, uint32_t) dontthrow; int fchmodat(int, const char *, uint32_t, int); int fchown(int, uint32_t, uint32_t); int fchownat(int, const char *, uint32_t, uint32_t, int); @@ -129,7 +129,7 @@ int getrlimit(int, struct rlimit *); int getrusage(int, struct rusage *); int kill(int, int); int killpg(int, int); -int link(const char *, const char *) nothrow; +int link(const char *, const char *) dontthrow; int linkat(int, const char *, int, const char *, int); int lstat(const char *, struct stat *); int lutimes(const char *, const struct timeval[2]); diff --git a/libc/calls/creat.c b/libc/calls/creat.c index a16f076bbce..46a3d7442cc 100644 --- a/libc/calls/creat.c +++ b/libc/calls/creat.c @@ -35,6 +35,6 @@ * @see open(), touch() * @asyncsignalsafe */ -nodiscard int creat(const char *file, uint32_t mode) { +dontdiscard int creat(const char *file, uint32_t mode) { return openat(AT_FDCWD, file, O_CREAT | O_WRONLY | O_TRUNC, mode); } diff --git a/libc/calls/internal.h b/libc/calls/internal.h index a133840e609..eb85e9d6e93 100644 --- a/libc/calls/internal.h +++ b/libc/calls/internal.h @@ -296,7 +296,7 @@ int sys_truncate_nt(const char *, u64) hidden; int sys_unlinkat_nt(int, const char *, int) hidden; int sys_utimensat_nt(int, const char *, const struct timespec *, int) hidden; int sys_utimes_nt(const char *, const struct timeval[2]) hidden; -ssize_t sys_open_nt(int, const char *, u32, i32) nodiscard hidden; +ssize_t sys_open_nt(int, const char *, u32, i32) dontdiscard hidden; ssize_t sys_read_nt(struct Fd *, const struct iovec *, size_t, ssize_t) hidden; ssize_t sys_readlinkat_nt(int, const char *, char *, size_t) hidden; ssize_t sys_write_nt(int, const struct iovec *, size_t, ssize_t) hidden; diff --git a/libc/calls/termios.h b/libc/calls/termios.h index 35ea0b22317..9f88f7786e6 100644 --- a/libc/calls/termios.h +++ b/libc/calls/termios.h @@ -17,14 +17,14 @@ int tcsetpgrp(int, int32_t); int32_t tcgetpgrp(int); int openpty(int *, int *, char *, const struct termios *, - const struct winsize *) paramsnonnull((1, 2)) nodiscard; + const struct winsize *) paramsnonnull((1, 2)) dontdiscard; int forkpty(int *, char *, const struct termios *, const struct winsize *) - paramsnonnull((1, 2)) nodiscard; + paramsnonnull((1, 2)) dontdiscard; errno_t ptsname_r(int, char *, size_t); int grantpt(int); int unlockpt(int); -int posix_openpt(int) nodiscard; +int posix_openpt(int) dontdiscard; int tcdrain(int); int tcgetsid(int); diff --git a/libc/calls/weirdtypes.h b/libc/calls/weirdtypes.h index bd7c7fe70f6..4b0cb8a6504 100644 --- a/libc/calls/weirdtypes.h +++ b/libc/calls/weirdtypes.h @@ -39,14 +39,14 @@ #define uid_t uint32_t #define rlim_t uint64_t /* int64_t on bsd */ -#define int_fast8_t __INT_FAST8_TYPE__ -#define uint_fast8_t __UINT_FAST8_TYPE__ -#define int_fast16_t __INT_FAST16_TYPE__ -#define uint_fast16_t __UINT_FAST16_TYPE__ -#define int_fast32_t __INT_FAST32_TYPE__ -#define uint_fast32_t __UINT_FAST32_TYPE__ -#define int_fast64_t __INT_FAST64_TYPE__ -#define uint_fast64_t __UINT_FAST64_TYPE__ +typedef __INT_FAST8_TYPE__ int_fast8_t; +typedef __UINT_FAST8_TYPE__ uint_fast8_t; +typedef __INT_FAST16_TYPE__ int_fast16_t; +typedef __UINT_FAST16_TYPE__ uint_fast16_t; +typedef __INT_FAST32_TYPE__ int_fast32_t; +typedef __UINT_FAST32_TYPE__ uint_fast32_t; +typedef __INT_FAST64_TYPE__ int_fast64_t; +typedef __UINT_FAST64_TYPE__ uint_fast64_t; #define atomic_bool _Atomic(_Bool) #define atomic_bool32 atomic_int_fast32_t diff --git a/libc/fmt/conv.h b/libc/fmt/conv.h index 66c42bde6b3..834275b611b 100644 --- a/libc/fmt/conv.h +++ b/libc/fmt/conv.h @@ -17,6 +17,7 @@ COSMOPOLITAN_C_START_ int abs(int) libcesque pureconst; long labs(long) libcesque pureconst; long long llabs(long long) libcesque pureconst; +intmax_t imaxabs(intmax_t) libcesque pureconst; int atoi(const char *) paramsnonnull() libcesque; long atol(const char *) paramsnonnull() libcesque; long long atoll(const char *) paramsnonnull() libcesque; @@ -24,7 +25,6 @@ unsigned long strtoul(const char *, char **, int) paramsnonnull((1)); long long strtoll(const char *, char **, int) paramsnonnull((1)); unsigned long long strtoull(const char *, char **, int) paramsnonnull((1)); long long strtonum(const char *, long long, long long, const char **); -intmax_t div10(intmax_t, unsigned *) hidden; intmax_t strtoimax(const char *, char **, int) paramsnonnull((1)); uintmax_t strtoumax(const char *, char **, int) paramsnonnull((1)); intmax_t wcstoimax(const wchar_t *, wchar_t **, int); @@ -33,18 +33,22 @@ long wcstol(const wchar_t *, wchar_t **, int); unsigned long wcstoul(const wchar_t *, wchar_t **, int); long strtol(const char *, char **, int) paramsnonnull((1)) libcesque; long sizetol(const char *, long) paramsnonnull() libcesque; +long long wcstoll(const wchar_t *, wchar_t **, int); +unsigned long long wcstoull(const wchar_t *, wchar_t **, int); +int wcscoll(const wchar_t *, const wchar_t *); +size_t wcsxfrm(wchar_t *, const wchar_t *, size_t); /*───────────────────────────────────────────────────────────────────────────│─╗ │ cosmopolitan § conversion » time ─╬─│┼ ╚────────────────────────────────────────────────────────────────────────────│*/ -int64_t DosDateTimeToUnix(unsigned, unsigned) nothrow; -struct timeval WindowsTimeToTimeVal(int64_t) nothrow; -struct timespec WindowsTimeToTimeSpec(int64_t) nothrow; -int64_t TimeSpecToWindowsTime(struct timespec) nothrow; -int64_t TimeValToWindowsTime(struct timeval) nothrow; -struct timeval WindowsDurationToTimeVal(int64_t) nothrow; -struct timespec WindowsDurationToTimeSpec(int64_t) nothrow; +int64_t DosDateTimeToUnix(unsigned, unsigned) dontthrow; +struct timeval WindowsTimeToTimeVal(int64_t) dontthrow; +struct timespec WindowsTimeToTimeSpec(int64_t) dontthrow; +int64_t TimeSpecToWindowsTime(struct timespec) dontthrow; +int64_t TimeValToWindowsTime(struct timeval) dontthrow; +struct timeval WindowsDurationToTimeVal(int64_t) dontthrow; +struct timespec WindowsDurationToTimeSpec(int64_t) dontthrow; static inline struct NtFileTime MakeFileTime(int64_t x) { return (struct NtFileTime){(uint32_t)x, (uint32_t)(x >> 32)}; @@ -110,10 +114,13 @@ imaxdiv_t imaxdiv(intmax_t, intmax_t) pureconst; #define lldiv(num, den) ((lldiv_t){(num) / (den), (num) % (den)}) #endif -#ifndef __STRICT_ANSI__ -intmax_t __imaxabs(intmax_t) libcesque pureconst; -#define imaxabs(x) __imaxabs(x) -#endif /* !ANSI */ +#if __GNUC__ * 100 + __GNUC_MINOR__ >= 406 || defined(__llvm__) +int128_t i128abs(int128_t) libcesque pureconst; +int128_t strtoi128(const char *, char **, int) paramsnonnull((1)); +uint128_t strtou128(const char *, char **, int) paramsnonnull((1)); +int128_t wcstoi128(const wchar_t *, wchar_t **, int); +uint128_t wcstou128(const wchar_t *, wchar_t **, int); +#endif /* gcc 4.6+ */ COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ diff --git a/libc/fmt/fmt.c b/libc/fmt/fmt.c index 81924292a98..ca34275ab78 100644 --- a/libc/fmt/fmt.c +++ b/libc/fmt/fmt.c @@ -90,7 +90,8 @@ static int __fmt_atoi(const char **str) { * - `%ld` long (64-bit) * - `%lu` unsigned long (64-bit) * - `%lx` unsigned long (64-bit hexadecimal) - * - `%jd` intmax_t (128-bit) + * - `%jd` intmax_t (64-bit) + * - `%jjd` int128_t (128-bit) * * Width Modifiers * @@ -291,6 +292,10 @@ hidden int __fmt(void *fn, void *arg, const char *format, va_list va) { case 'j': /* intmax_t */ format++; signbit = sizeof(intmax_t) * 8 - 1; + if (*format == 'j') { + format++; + signbit = sizeof(int128_t) * 8 - 1; + } break; case 'l': if (format[1] == 'f' || format[1] == 'F') { diff --git a/libc/fmt/fmt.h b/libc/fmt/fmt.h index e875898379c..4bbc8e14544 100644 --- a/libc/fmt/fmt.h +++ b/libc/fmt/fmt.h @@ -15,18 +15,18 @@ COSMOPOLITAN_C_START_ int snprintf(char *, size_t, const char *, ...) printfesque(3) - paramsnonnull((3)) nothrow nocallback; + paramsnonnull((3)) dontthrow nocallback; int vsnprintf(char *, size_t, const char *, va_list) - paramsnonnull((3)) nothrow nocallback; + paramsnonnull((3)) dontthrow nocallback; int sprintf(char *, const char *, ...) printfesque(2) - paramsnonnull((2)) nothrow nocallback frownedupon(snprintf); + paramsnonnull((2)) dontthrow nocallback frownedupon(snprintf); int vsprintf(char *, const char *, va_list) - paramsnonnull((2)) nothrow nocallback frownedupon(vsnprintf); + paramsnonnull((2)) dontthrow nocallback frownedupon(vsnprintf); int sscanf(const char *, const char *, ...) scanfesque(2); int vsscanf(const char *, const char *, va_list); int vcscanf(int (*)(void *), int (*)(int, void *), void *, const char *, va_list); -int strerror_r(int, char *, size_t) nothrow nocallback; +int strerror_r(int, char *, size_t) dontthrow nocallback; const char *strerror_short(int) nosideeffect; const char *strerror_long(int) nosideeffect; int __fmt(void *, void *, const char *, va_list) hidden; diff --git a/libc/ohmyplus/vector.c b/libc/fmt/i128abs.c similarity index 89% rename from libc/ohmyplus/vector.c rename to libc/fmt/i128abs.c index 5740e591beb..c35be4f75ff 100644 --- a/libc/ohmyplus/vector.c +++ b/libc/fmt/i128abs.c @@ -16,12 +16,9 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/bits/bits.h" -#include "libc/mem/mem.h" +#include "libc/fmt/conv.h" +#include "libc/macros.internal.h" -void __vector_reserve(size_t n, size_t m, intptr_t **data, size_t *toto) { - if ((n = roundup2pow(n)) > *toto) { - *toto = n; - *data = realloc(*data, n * m); - } +int128_t i128abs(int128_t x) { + return ABS(x); } diff --git a/libc/fmt/imaxabs.c b/libc/fmt/imaxabs.c index 664d4d61619..11a640d9f66 100644 --- a/libc/fmt/imaxabs.c +++ b/libc/fmt/imaxabs.c @@ -19,6 +19,6 @@ #include "libc/fmt/conv.h" #include "libc/macros.internal.h" -intmax_t(imaxabs)(intmax_t x) { +intmax_t imaxabs(intmax_t x) { return ABS(x); } diff --git a/libc/fmt/ntoa.c b/libc/fmt/ntoa.c index c583baf00b0..3b788dbb05c 100644 --- a/libc/fmt/ntoa.c +++ b/libc/fmt/ntoa.c @@ -26,7 +26,7 @@ #define BUFFER_SIZE 144 -uintmax_t __udivmodti4(uintmax_t, uintmax_t, uintmax_t *); +uint128_t __udivmodti4(uint128_t, uint128_t, uint128_t *); static int __fmt_ntoa_format(int out(const char *, void *, size_t), void *arg, char *buf, unsigned len, bool negative, @@ -91,9 +91,9 @@ static int __fmt_ntoa_format(int out(const char *, void *, size_t), void *arg, } int __fmt_ntoa2(int out(const char *, void *, size_t), void *arg, - uintmax_t value, bool neg, unsigned log2base, unsigned prec, + uint128_t value, bool neg, unsigned log2base, unsigned prec, unsigned width, unsigned flags, const char *alphabet) { - uintmax_t remainder; + uint128_t remainder; unsigned len, count, digit; char buf[BUFFER_SIZE]; len = 0; @@ -132,7 +132,7 @@ int __fmt_ntoa(int out(const char *, void *, size_t), void *arg, va_list va, unsigned long prec, unsigned long width, unsigned char flags, const char *lang) { bool neg; - uintmax_t value, sign; + uint128_t value, sign; /* ignore '0' flag when prec is given */ if (flags & FLAGS_PRECISION) { diff --git a/libc/fmt/strtoi128.c b/libc/fmt/strtoi128.c new file mode 100644 index 00000000000..ff9d6a317e3 --- /dev/null +++ b/libc/fmt/strtoi128.c @@ -0,0 +1,60 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2020 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/errno.h" +#include "libc/fmt/conv.h" +#include "libc/fmt/strtol.internal.h" +#include "libc/limits.h" +#include "libc/str/str.h" + +/** + * Decodes 128-bit signed integer from ASCII string. + * + * @param s is a non-null nul-terminated string + * @param endptr if non-null will always receive a pointer to the char + * following the last one this function processed, which is usually + * the NUL byte, or in the case of invalid strings, would point to + * the first invalid character + * @param base can be anywhere between [2,36] or 0 to auto-detect based + * on the the prefixes 0 (octal), 0x (hexadecimal), 0b (binary), or + * decimal (base 10) by default + * @return decoded saturated integer + * @see strtou128() + */ +int128_t strtoi128(const char *s, char **endptr, int base) { + char t = 0; + int d, c = *s; + int128_t x = 0; + CONSUME_SPACES(s, c); + GET_SIGN(s, c, d); + GET_RADIX(s, c, base); + if ((c = kBase36[c & 255]) && --c < base) { + if (!((t |= 1) & 2)) { + do { + if (__builtin_mul_overflow(x, base, &x) || + __builtin_add_overflow(x, c * d, &x)) { + x = d > 0 ? INT128_MAX : INT128_MIN; + errno = ERANGE; + t |= 2; + } + } while ((c = kBase36[*++s & 255]) && --c < base); + } + } + if (t && endptr) *endptr = s; + return x; +} diff --git a/libc/fmt/strtoimax.c b/libc/fmt/strtoimax.c index fdcb053911e..7eacb3322c6 100644 --- a/libc/fmt/strtoimax.c +++ b/libc/fmt/strtoimax.c @@ -23,7 +23,7 @@ #include "libc/str/str.h" /** - * Decodes 128-bit signed integer from ASCII string. + * Decodes intmax_t from ASCII string. * * @param s is a non-null nul-terminated string * @param endptr if non-null will always receive a pointer to the char diff --git a/libc/fmt/strtoll_l.c b/libc/fmt/strtoll_l.c new file mode 100644 index 00000000000..0bbb5ea323a --- /dev/null +++ b/libc/fmt/strtoll_l.c @@ -0,0 +1,24 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2022 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/fmt/conv.h" +#include "libc/unicode/locale.h" + +long long strtoll_l(const char *nptr, char **endptr, int base, locale_t l) { + return strtoll(nptr, endptr, base); +} diff --git a/libc/fmt/strtou128.c b/libc/fmt/strtou128.c new file mode 100644 index 00000000000..b8005fd18bf --- /dev/null +++ b/libc/fmt/strtou128.c @@ -0,0 +1,53 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2020 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/fmt/conv.h" +#include "libc/fmt/strtol.internal.h" +#include "libc/str/str.h" + +/** + * Decodes 128-bit unsigned integer from ASCII string. + * + * @param s is a non-null nul-terminated string + * @param endptr if non-null will always receive a pointer to the char + * following the last one this function processed, which is usually + * the NUL byte, or in the case of invalid strings, would point to + * the first invalid character + * @param base can be anywhere between [2,36] or 0 to auto-detect based + * on the the prefixes 0 (octal), 0x (hexadecimal), 0b (binary), or + * decimal (base 10) by default + * @return decoded integer mod 2¹²⁸ negated if leading `-` + * @see strtoi128() + */ +uint128_t strtou128(const char *s, char **endptr, int base) { + char t = 0; + int d, c = *s; + uint128_t x = 0; + CONSUME_SPACES(s, c); + GET_SIGN(s, c, d); + GET_RADIX(s, c, base); + if ((c = kBase36[c & 255]) && --c < base) { + t |= 1; + do { + x *= base; + x += c; + } while ((c = kBase36[*++s & 255]) && --c < base); + } + if (t && endptr) *endptr = s; + return d > 0 ? x : -x; +} diff --git a/libc/fmt/strtoull_l.c b/libc/fmt/strtoull_l.c new file mode 100644 index 00000000000..52cf9313b73 --- /dev/null +++ b/libc/fmt/strtoull_l.c @@ -0,0 +1,25 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2022 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/fmt/conv.h" +#include "libc/unicode/locale.h" + +unsigned long long strtoull_l(const char *nptr, char **endptr, int base, + locale_t l) { + return strtoull(nptr, endptr, base); +} diff --git a/libc/fmt/strtoumax.c b/libc/fmt/strtoumax.c index dd4f5f6542b..eb4e5134ee1 100644 --- a/libc/fmt/strtoumax.c +++ b/libc/fmt/strtoumax.c @@ -21,7 +21,7 @@ #include "libc/str/str.h" /** - * Decodes 128-bit unsigned integer from ASCII string. + * Decodes uintmax_t from ASCII string. * * @param s is a non-null nul-terminated string * @param endptr if non-null will always receive a pointer to the char diff --git a/libc/fmt/swprintf.c b/libc/fmt/swprintf.c new file mode 100644 index 00000000000..da14232d2df --- /dev/null +++ b/libc/fmt/swprintf.c @@ -0,0 +1,26 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2022 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/assert.h" +#include "libc/fmt/fmt.h" +#include "libc/runtime/runtime.h" + +int swprintf(wchar_t* ws, size_t n, const wchar_t* format, ...) { + assert(!"not implemented"); + abort(); +} diff --git a/libc/fmt/vcscanf.c b/libc/fmt/vcscanf.c index bc4b1957238..4dda5b76182 100644 --- a/libc/fmt/vcscanf.c +++ b/libc/fmt/vcscanf.c @@ -70,7 +70,7 @@ int vcscanf(int callback(void *), int unget(int, void *), void *arg, } break; case '%': { - uintmax_t number; + uint128_t number; void *buf; size_t bufsize; unsigned width = 0; @@ -117,8 +117,12 @@ int vcscanf(int callback(void *), int unget(int, void *), void *arg, case '\'': thousands = true; break; - case 'j': /* 128-bit */ - bits = sizeof(intmax_t) * 8; + case 'j': /* j=64-bit jj=128-bit */ + if (bits < 64) { + bits = 64; + } else { + bits = 128; + } break; case 'l': /* long */ case 'L': /* loooong */ @@ -185,7 +189,7 @@ int vcscanf(int callback(void *), int unget(int, void *), void *arg, } } while ((c = callback(arg)) != -1); if (!discard) { - uintmax_t bane = (uintmax_t)1 << (bits - 1); + uint128_t bane = (uint128_t)1 << (bits - 1); if (!(number & ~((bane - 1) | (issigned ? 0 : bane))) || (issigned && number == bane /* two's complement bane */)) { ++items; @@ -198,8 +202,8 @@ int vcscanf(int callback(void *), int unget(int, void *), void *arg, } void *out = va_arg(va, void *); switch (bits) { - case sizeof(uintmax_t) * CHAR_BIT: - *(uintmax_t *)out = number; + case sizeof(uint128_t) * CHAR_BIT: + *(uint128_t *)out = number; break; case 48: case 64: diff --git a/libc/fmt/wcstoi128.c b/libc/fmt/wcstoi128.c new file mode 100644 index 00000000000..4bb79d33827 --- /dev/null +++ b/libc/fmt/wcstoi128.c @@ -0,0 +1,60 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2020 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/errno.h" +#include "libc/fmt/conv.h" +#include "libc/fmt/strtol.internal.h" +#include "libc/limits.h" +#include "libc/str/str.h" + +/** + * Decodes 128-bit signed integer from wide string. + * + * @param s is a non-null nul-terminated string + * @param endptr if non-null will always receive a pointer to the char + * following the last one this function processed, which is usually + * the NUL byte, or in the case of invalid strings, would point to + * the first invalid character + * @param base can be anywhere between [2,36] or 0 to auto-detect based + * on the the prefixes 0 (octal), 0x (hexadecimal), 0b (binary), or + * decimal (base 10) by default + * @return decoded saturated integer + * @see strtou128() + */ +int128_t wcstoi128(const wchar_t *s, wchar_t **endptr, int base) { + char t = 0; + int128_t x = 0; + int d, c = *s; + CONSUME_SPACES(s, c); + GET_SIGN(s, c, d); + GET_RADIX(s, c, base); + if ((c = kBase36[c & 255]) && --c < base) { + if (!((t |= 1) & 2)) { + do { + if (__builtin_mul_overflow(x, base, &x) || + __builtin_add_overflow(x, c * d, &x)) { + x = d > 0 ? INT128_MAX : INT128_MIN; + errno = ERANGE; + t |= 2; + } + } while ((c = kBase36[*++s & 255]) && --c < base); + } + } + if (t && endptr) *endptr = s; + return x; +} diff --git a/libc/fmt/wcstoimax.c b/libc/fmt/wcstoimax.c index dfae5cf9dfe..b6abb147de0 100644 --- a/libc/fmt/wcstoimax.c +++ b/libc/fmt/wcstoimax.c @@ -23,7 +23,7 @@ #include "libc/str/str.h" /** - * Decodes 128-bit signed integer from wide string. + * Decodes intmax_t from wide string. * * @param s is a non-null nul-terminated string * @param endptr if non-null will always receive a pointer to the char diff --git a/libc/fmt/wcstol.c b/libc/fmt/wcstol.c index cdc00649c7f..e27dfd20497 100644 --- a/libc/fmt/wcstol.c +++ b/libc/fmt/wcstol.c @@ -23,7 +23,7 @@ #include "libc/str/str.h" /** - * Decodes signed integer from wide string. + * Decodes signed long integer from wide string. * * @param s is a non-null nul-terminated string * @param endptr if non-null will always receive a pointer to the char diff --git a/libc/fmt/wcstoll.c b/libc/fmt/wcstoll.c new file mode 100644 index 00000000000..4b63f8d55d5 --- /dev/null +++ b/libc/fmt/wcstoll.c @@ -0,0 +1,59 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2020 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/errno.h" +#include "libc/fmt/conv.h" +#include "libc/fmt/strtol.internal.h" +#include "libc/limits.h" +#include "libc/str/str.h" + +/** + * Decodes signed long long integer from wide string. + * + * @param s is a non-null nul-terminated string + * @param endptr if non-null will always receive a pointer to the char + * following the last one this function processed, which is usually + * the NUL byte, or in the case of invalid strings, would point to + * the first invalid character + * @param base can be anywhere between [2,36] or 0 to auto-detect based + * on the the prefixes 0 (octal), 0x (hexadecimal), 0b (binary), or + * decimal (base 10) by default + * @return the decoded signed saturated number + */ +long long wcstoll(const wchar_t *s, wchar_t **endptr, int base) { + char t = 0; + int d, c = *s; + long long x = 0; + CONSUME_SPACES(s, c); + GET_SIGN(s, c, d); + GET_RADIX(s, c, base); + if ((c = kBase36[c & 255]) && --c < base) { + if (!((t |= 1) & 2)) { + do { + if (__builtin_mul_overflow(x, base, &x) || + __builtin_add_overflow(x, c * d, &x)) { + x = d > 0 ? LONG_LONG_MAX : LONG_LONG_MIN; + errno = ERANGE; + t |= 2; + } + } while ((c = kBase36[*++s & 255]) && --c < base); + } + } + if (t && endptr) *endptr = s; + return x; +} diff --git a/libc/fmt/wcstoll_l.c b/libc/fmt/wcstoll_l.c new file mode 100644 index 00000000000..441ed661c6f --- /dev/null +++ b/libc/fmt/wcstoll_l.c @@ -0,0 +1,25 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2022 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/fmt/conv.h" +#include "libc/unicode/locale.h" + +long long wcstoll_l(const wchar_t *nptr, wchar_t **endptr, int base, + locale_t l) { + return wcstoll(nptr, endptr, base); +} diff --git a/libc/fmt/wcstou128.c b/libc/fmt/wcstou128.c new file mode 100644 index 00000000000..38c74f8b28d --- /dev/null +++ b/libc/fmt/wcstou128.c @@ -0,0 +1,53 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2020 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/fmt/conv.h" +#include "libc/fmt/strtol.internal.h" +#include "libc/str/str.h" + +/** + * Decodes 128-bit unsigned integer from wide string. + * + * @param s is a non-null nul-terminated string + * @param endptr if non-null will always receive a pointer to the char + * following the last one this function processed, which is usually + * the NUL byte, or in the case of invalid strings, would point to + * the first invalid character + * @param base can be anywhere between [2,36] or 0 to auto-detect based + * on the the prefixes 0 (octal), 0x (hexadecimal), 0b (binary), or + * decimal (base 10) by default + * @return decoded integer mod 2¹²⁸ negated if leading `-` + * @see strtoi128() + */ +uint128_t wcstou128(const wchar_t *s, wchar_t **endptr, int base) { + char t = 0; + int d, c = *s; + uint128_t x = 0; + CONSUME_SPACES(s, c); + GET_SIGN(s, c, d); + GET_RADIX(s, c, base); + if ((c = kBase36[c & 255]) && --c < base) { + t |= 1; + do { + x *= base; + x += c; + } while ((c = kBase36[*++s & 255]) && --c < base); + } + if (t && endptr) *endptr = s; + return d > 0 ? x : -x; +} diff --git a/libc/fmt/wcstoull.c b/libc/fmt/wcstoull.c new file mode 100644 index 00000000000..c17fe8605d4 --- /dev/null +++ b/libc/fmt/wcstoull.c @@ -0,0 +1,53 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2020 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/errno.h" +#include "libc/fmt/conv.h" +#include "libc/fmt/strtol.internal.h" +#include "libc/str/str.h" + +/** + * Decodes unsigned long long integer from wide string. + * + * @param s is a non-null nul-terminated string + * @param endptr if non-null will always receive a pointer to the char + * following the last one this function processed, which is usually + * the NUL byte, or in the case of invalid strings, would point to + * the first invalid character + * @param base can be anywhere between [2,36] or 0 to auto-detect based + * on the the prefixes 0 (octal), 0x (hexadecimal), 0b (binary), or + * decimal (base 10) by default + * @return decoded integer mod 2⁶⁴ negated if leading `-` + */ +unsigned long long wcstoull(const wchar_t *s, wchar_t **endptr, int base) { + char t = 0; + int d, c = *s; + unsigned long long x = 0; + CONSUME_SPACES(s, c); + GET_SIGN(s, c, d); + GET_RADIX(s, c, base); + if ((c = kBase36[c & 255]) && --c < base) { + t |= 1; + do { + x *= base; + x += c; + } while ((c = kBase36[*++s & 255]) && --c < base); + } + if (t && endptr) *endptr = s; + return d > 0 ? x : -x; +} diff --git a/libc/fmt/wcstoull_l.c b/libc/fmt/wcstoull_l.c new file mode 100644 index 00000000000..926035623cc --- /dev/null +++ b/libc/fmt/wcstoull_l.c @@ -0,0 +1,25 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2022 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/fmt/conv.h" +#include "libc/unicode/locale.h" + +unsigned long long wcstoull_l(const wchar_t *nptr, wchar_t **endptr, int base, + locale_t l) { + return wcstoull(nptr, endptr, base); +} diff --git a/libc/fmt/wcstoumax.c b/libc/fmt/wcstoumax.c index fbbf984641d..80f720756c9 100644 --- a/libc/fmt/wcstoumax.c +++ b/libc/fmt/wcstoumax.c @@ -21,7 +21,7 @@ #include "libc/str/str.h" /** - * Decodes 128-bit unsigned integer from wide string. + * Decodes uintmax_t from wide string. * * @param s is a non-null nul-terminated string * @param endptr if non-null will always receive a pointer to the char diff --git a/libc/integral/c.inc b/libc/integral/c.inc index 1dfbc05bb25..c2186bdf38f 100644 --- a/libc/integral/c.inc +++ b/libc/integral/c.inc @@ -102,6 +102,8 @@ typedef __CHAR16_TYPE__ char16_t; typedef __CHAR32_TYPE__ char32_t; #endif +#define _LIBCPP_STDINT_H + typedef int errno_t; typedef __SIZE_TYPE__ size_t; typedef __PTRDIFF_TYPE__ ssize_t; @@ -118,30 +120,18 @@ typedef __INT32_TYPE__ int32_t; typedef __UINT32_TYPE__ uint32_t; typedef __INT64_TYPE__ int64_t; typedef __UINT64_TYPE__ uint64_t; +typedef __INTMAX_TYPE__ intmax_t; +typedef __UINTMAX_TYPE__ uintmax_t; -typedef struct { - intptr_t ax, dx; -} axdx_t; - -#ifdef __SIZEOF_INTMAX__ -#undef __SIZEOF_INTMAX__ -#endif -#if !defined(__STRICT_ANSI__) && __SIZEOF_POINTER__ == 8 && \ - ((__GNUC__ + 0) * 100 + (__GNUC_MINOR__ + 0) >= 406 || defined(__llvm__)) -#define __SIZEOF_INTMAX__ 16 -#else -#define __SIZEOF_INTMAX__ __SIZEOF_POINTER__ -#endif -#if __SIZEOF_INTMAX__ == 16 +#if __GNUC__ * 100 + __GNUC_MINOR__ >= 406 || defined(__llvm__) typedef signed __int128 int128_t; typedef unsigned __int128 uint128_t; -typedef int128_t intmax_t; -typedef uint128_t uintmax_t; -#elif __SIZEOF_INTMAX__ == 8 -typedef int64_t intmax_t; -typedef uint64_t uintmax_t; #endif +typedef struct { + intptr_t ax, dx; +} axdx_t; + #ifndef __chibicc__ #define va_list __builtin_va_list #define va_arg(ap, type) __builtin_va_arg(ap, type) @@ -152,11 +142,11 @@ typedef uint64_t uintmax_t; #include "libc/integral/lp64arg.inc" #endif -#define libcesque nothrow nocallback +#define libcesque dontthrow nocallback #define memcpyesque libcesque #define strlenesque libcesque nosideeffect paramsnonnull() #define vallocesque \ - libcesque nodiscard returnsaligned((PAGESIZE)) returnspointerwithnoaliases + libcesque dontdiscard returnsaligned((PAGESIZE)) returnspointerwithnoaliases #define reallocesque libcesque returnsaligned((16)) #define mallocesque reallocesque returnspointerwithnoaliases #define interruptfn nocallersavedregisters forcealignargpointer @@ -299,13 +289,13 @@ typedef uint64_t uintmax_t; #endif #endif -#ifndef nodiscard +#ifndef dontdiscard #if !defined(__STRICT_ANSI__) && \ ((__GNUC__ + 0) * 100 + (__GNUC_MINOR__ + 0) >= 304 || \ __has_attribute(__warn_unused_result__)) -#define nodiscard __attribute__((__warn_unused_result__)) +#define dontdiscard __attribute__((__warn_unused_result__)) #else -#define nodiscard +#define dontdiscard #endif #endif @@ -408,15 +398,15 @@ typedef uint64_t uintmax_t; #endif #endif -#ifndef nothrow +#ifndef dontthrow #if defined(__cplusplus) && !defined(__STRICT_ANSI__) && \ - (__has_attribute(nothrow) || \ + (__has_attribute(dontthrow) || \ (__GNUC__ + 0) * 100 + (__GNUC_MINOR__ + 0) >= 303) -#define nothrow __attribute__((__nothrow__)) +#define dontthrow __attribute__((__nothrow__)) #elif defined(_MSC_VER) -#define nothrow __declspec(nothrow) +#define dontthrow __declspec(nothrow) #else -#define nothrow +#define dontthrow #endif #endif @@ -677,6 +667,7 @@ typedef uint64_t uintmax_t; #pragma GCC diagnostic ignored "-Wdangling-else" /* come on tidy */ #pragma GCC diagnostic ignored "-Wformat-security" /* come on tidy */ #pragma GCC diagnostic ignored "-Wunused-value" /* breaks macros */ +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" /* libcxx */ #ifndef __cplusplus #pragma GCC diagnostic ignored "-Wimplicit-int" #endif /* C++ */ diff --git a/libc/integral/lp64.inc b/libc/integral/lp64.inc index 903b72c3616..808a4caa83d 100644 --- a/libc/integral/lp64.inc +++ b/libc/integral/lp64.inc @@ -12,6 +12,8 @@ #define __INTPTR_MAX__ 0x7fffffffffffffffl #define __UINTPTR_MAX__ 0xfffffffffffffffful #define __WINT_MAX__ 0xffffffffu +#define __UINTMAX_MAX__ 0xffffffffffffffffUL +#define __INTMAX_MAX__ 0x7fffffffffffffffL #define __SIZEOF_SHORT__ 2 #define __SIZEOF_INT__ 4 @@ -30,21 +32,23 @@ #if !(__ASSEMBLER__ + __LINKER__ + 0) -#define __INT8_TYPE__ signed char -#define __UINT8_TYPE__ unsigned char +#define __CHAR16_TYPE__ short unsigned int +#define __CHAR32_TYPE__ unsigned int #define __INT16_TYPE__ short int -#define __UINT16_TYPE__ short unsigned int #define __INT32_TYPE__ int -#define __UINT32_TYPE__ unsigned int #define __INT64_TYPE__ long int -#define __UINT64_TYPE__ long unsigned int +#define __INT8_TYPE__ signed char +#define __INTMAX_TYPE__ long int #define __INTPTR_TYPE__ long int -#define __UINTPTR_TYPE__ long unsigned int #define __PTRDIFF_TYPE__ long int #define __SIZE_TYPE__ long unsigned int +#define __UINT16_TYPE__ short unsigned int +#define __UINT32_TYPE__ unsigned int +#define __UINT64_TYPE__ long unsigned int +#define __UINT8_TYPE__ unsigned char +#define __UINTMAX_TYPE__ long unsigned int +#define __UINTPTR_TYPE__ long unsigned int #define __WCHAR_TYPE__ int -#define __CHAR16_TYPE__ short unsigned int -#define __CHAR32_TYPE__ unsigned int #define __WINT_TYPE__ unsigned int #define __INT_LEAST8_TYPE__ __INT8_TYPE__ diff --git a/libc/intrin/asan.c b/libc/intrin/asan.c index c9458327c66..0d6157f0714 100644 --- a/libc/intrin/asan.c +++ b/libc/intrin/asan.c @@ -323,7 +323,7 @@ static void __asan_exit(void) { _Exit(99); } -nodiscard static __asan_die_f *__asan_die(void) { +dontdiscard static __asan_die_f *__asan_die(void) { if (weaken(__die)) { return weaken(__die); } else { @@ -601,7 +601,8 @@ const char *__asan_describe_access_poison(signed char kind) { } } -nodiscard static __asan_die_f *__asan_report_invalid_pointer(const void *addr) { +dontdiscard static __asan_die_f *__asan_report_invalid_pointer( + const void *addr) { kprintf("%n\e[J\e[1;31masan error\e[0m: this corruption at %p shadow %p%n", addr, SHADOW(addr)); return __asan_die(); @@ -719,9 +720,9 @@ static void __asan_report_memory_origin(const unsigned char *addr, int size, } } -nodiscard static __asan_die_f *__asan_report(const void *addr, int size, - const char *message, - signed char kind) { +dontdiscard static __asan_die_f *__asan_report(const void *addr, int size, + const char *message, + signed char kind) { int i; wint_t c; signed char t; @@ -826,8 +827,8 @@ void __asan_verify(const void *p, size_t n) { __asan_unreachable(); } -nodiscard __asan_die_f *__asan_report_memory_fault(void *addr, int size, - const char *message) { +dontdiscard __asan_die_f *__asan_report_memory_fault(void *addr, int size, + const char *message) { return __asan_report(addr, size, message, __asan_fault(SHADOW(addr), -128).kind); } diff --git a/libc/intrin/ubsan.c b/libc/intrin/ubsan.c index 2b047176e93..4f9b6b3bade 100644 --- a/libc/intrin/ubsan.c +++ b/libc/intrin/ubsan.c @@ -202,7 +202,7 @@ static void __ubsan_exit(void) { _Exit(99); } -nodiscard static __ubsan_die_f *__ubsan_die(void) { +dontdiscard static __ubsan_die_f *__ubsan_die(void) { if (weaken(__die)) { return weaken(__die); } else { @@ -216,8 +216,8 @@ static void __ubsan_warning(const struct UbsanSourceLocation *loc, loc->line, SUBTLE, description, RESET); } -nodiscard __ubsan_die_f *__ubsan_abort(const struct UbsanSourceLocation *loc, - const char *description) { +dontdiscard __ubsan_die_f *__ubsan_abort(const struct UbsanSourceLocation *loc, + const char *description) { kprintf("%n%s:%d: %subsan error%s: %s%n", loc->file, loc->line, RED2, RESET, description); return __ubsan_die(); diff --git a/libc/inttypes.h b/libc/inttypes.h index 9d131be6832..e996192bc6f 100644 --- a/libc/inttypes.h +++ b/libc/inttypes.h @@ -48,6 +48,8 @@ typedef __UINT_LEAST64_TYPE__ uint_least64_t; #define __PRI128 "ll" #elif __SIZEOF_INTMAX__ == 16 #define __PRI128 "j" +#else +#define __PRI128 "jj" #endif #if __SIZEOF_POINTER__ == __SIZEOF_INT__ diff --git a/libc/isystem/endian.h b/libc/isystem/endian.h index 60a154711a2..1104d285453 100644 --- a/libc/isystem/endian.h +++ b/libc/isystem/endian.h @@ -1,4 +1,10 @@ #ifndef LIBC_ISYSTEM_ENDIAN_H_ #define LIBC_ISYSTEM_ENDIAN_H_ + +#define __LITTLE_ENDIAN __ORDER_LITTLE_ENDIAN__ +#define __BIG_ENDIAN __ORDER_BIG_ENDIAN__ +#define __PDP_ENDIAN __ORDER_PDP_ENDIAN__ +#define __BYTE_ORDER __BYTE_ORDER__ + #include "libc/bits/newbie.h" -#endif +#endif /* LIBC_ISYSTEM_ENDIAN_H_ */ diff --git a/libc/isystem/features.h b/libc/isystem/features.h new file mode 100644 index 00000000000..eb3f84a5015 --- /dev/null +++ b/libc/isystem/features.h @@ -0,0 +1,38 @@ +#ifndef COSMOPOLITAN_LIBC_ISYSTEM_FEATURES_H_ +#define COSMOPOLITAN_LIBC_ISYSTEM_FEATURES_H_ + +#if defined(_ALL_SOURCE) && !defined(_GNU_SOURCE) +#define _GNU_SOURCE 1 +#endif + +#if defined(_DEFAULT_SOURCE) && !defined(_BSD_SOURCE) +#define _BSD_SOURCE 1 +#endif + +#if !defined(_POSIX_SOURCE) && !defined(_POSIX_C_SOURCE) && \ + !defined(_XOPEN_SOURCE) && !defined(_GNU_SOURCE) && \ + !defined(_BSD_SOURCE) && !defined(__STRICT_ANSI__) +#define _BSD_SOURCE 1 +#define _XOPEN_SOURCE 700 +#endif + +#if __STDC_VERSION__ >= 199901L +#define __restrict restrict +#elif !defined(__GNUC__) +#define __restrict +#endif + +#if __STDC_VERSION__ >= 199901L || defined(__cplusplus) +#define __inline inline +#elif !defined(__GNUC__) +#define __inline +#endif + +#if __STDC_VERSION__ >= 201112L +#elif defined(__GNUC__) +#define _Noreturn __attribute__((__noreturn__)) +#else +#define _Noreturn +#endif + +#endif /* COSMOPOLITAN_LIBC_ISYSTEM_FEATURES_H_ */ diff --git a/libc/isystem/stdint.h b/libc/isystem/stdint.h index 145c8eb9bb1..5a3dc279882 100644 --- a/libc/isystem/stdint.h +++ b/libc/isystem/stdint.h @@ -1,4 +1,5 @@ #ifndef LIBC_ISYSTEM_STDINT_H_ #define LIBC_ISYSTEM_STDINT_H_ +#include "libc/limits.h" #include "libc/literal.h" #endif diff --git a/libc/isystem/stdio.h b/libc/isystem/stdio.h index 8ef49a187c7..e227eda4d4a 100644 --- a/libc/isystem/stdio.h +++ b/libc/isystem/stdio.h @@ -1,6 +1,8 @@ #ifndef LIBC_ISYSTEM_STDIO_H_ #define LIBC_ISYSTEM_STDIO_H_ +#include "libc/calls/calls.h" #include "libc/fmt/fmt.h" #include "libc/log/log.h" #include "libc/stdio/stdio.h" +#include "libc/stdio/temp.h" #endif diff --git a/libc/isystem/stdlib.h b/libc/isystem/stdlib.h index b887d845356..96aa83a4365 100644 --- a/libc/isystem/stdlib.h +++ b/libc/isystem/stdlib.h @@ -1,9 +1,11 @@ #ifndef LIBC_ISYSTEM_STDLIB_H_ #define LIBC_ISYSTEM_STDLIB_H_ +#include "libc/alg/alg.h" #include "libc/fmt/conv.h" #include "libc/mem/mem.h" #include "libc/rand/rand.h" #include "libc/runtime/runtime.h" #include "libc/stdio/temp.h" #include "libc/sysv/consts/exit.h" +#include "third_party/gdtoa/gdtoa.h" #endif diff --git a/libc/isystem/time.h b/libc/isystem/time.h index aabd49d7b07..22484f93d1c 100644 --- a/libc/isystem/time.h +++ b/libc/isystem/time.h @@ -1,5 +1,6 @@ #ifndef LIBC_ISYSTEM_TIME_H_ #define LIBC_ISYSTEM_TIME_H_ #include "libc/sysv/consts/sched.h" +#include "libc/time/struct/tm.h" #include "libc/time/time.h" #endif diff --git a/libc/isystem/wchar.h b/libc/isystem/wchar.h index 2d3ecb03b43..fd707abc8e0 100644 --- a/libc/isystem/wchar.h +++ b/libc/isystem/wchar.h @@ -1,4 +1,5 @@ #ifndef LIBC_ISYSTEM_WCHAR_H_ #define LIBC_ISYSTEM_WCHAR_H_ #include "libc/str/str.h" +#include "libc/time/time.h" #endif diff --git a/libc/libc.mk b/libc/libc.mk index 8540996062f..143b7aa7b47 100644 --- a/libc/libc.mk +++ b/libc/libc.mk @@ -22,7 +22,6 @@ o/$(MODE)/libc: o/$(MODE)/libc/alg \ o/$(MODE)/libc/mem \ o/$(MODE)/libc/nexgen32e \ o/$(MODE)/libc/nt \ - o/$(MODE)/libc/ohmyplus \ o/$(MODE)/libc/rand \ o/$(MODE)/libc/runtime \ o/$(MODE)/libc/sock \ diff --git a/libc/limits.h b/libc/limits.h index cc222691823..65ff9286ac2 100644 --- a/libc/limits.h +++ b/libc/limits.h @@ -1,5 +1,6 @@ #ifndef COSMOPOLITAN_LIBC_LIMITS_H_ #define COSMOPOLITAN_LIBC_LIMITS_H_ +#define __STDC_LIMIT_MACROS #define UCHAR_MIN 0 #define UCHAR_MAX 255 @@ -32,6 +33,8 @@ #define UINT16_MAX __UINT16_MAX__ #define UINT32_MAX __UINT32_MAX__ #define UINT64_MAX __UINT64_MAX__ +#define INTMAX_MAX __INTMAX_MAX__ +#define UINTMAX_MAX __UINTMAX_MAX__ #define SCHAR_MIN (-SCHAR_MAX - 1) #define SHRT_MIN (-SHRT_MAX - 1) @@ -70,27 +73,18 @@ #define UINT32_MIN 0u #define UINT64_MIN 0ull #define UINTPTR_MIN 0ull +#define UINTMAX_MIN ((uintmax_t)0) #define MB_CUR_MAX 4 #define MB_LEN_MAX 4 -#if !(__ASSEMBLER__ + __LINKER__ + 0) - #if __GNUC__ * 100 + __GNUC_MINOR__ >= 406 || defined(__llvm__) -#define INTMAX_MAX \ - (((intmax_t)0x7fffffffffffffff) << 64 | (intmax_t)0xffffffffffffffff) -#define UINTMAX_MAX \ - (((uintmax_t)0xffffffffffffffff) << 64 | (uintmax_t)0xffffffffffffffff) -#define INT128_MIN INTMAX_MIN -#define INT128_MAX INTMAX_MAX -#define UINTMAX_MIN ((uintmax_t)0) -#define UINT128_MIN ((uintmax_t)0) -#define UINT128_MAX UINTMAX_MAX -#else -#define INTMAX_MAX __INT64_MAX__ -#define UINTMAX_MAX __UINT64_MAX__ -#define UINTMAX_MIN UINT64_MIN +#define INT128_MIN (-INT128_MAX - 1) +#define UINT128_MIN ((uint128_t)0) +#define INT128_MAX \ + ((int128_t)0x7fffffffffffffff << 64 | (int128_t)0xffffffffffffffff) +#define UINT128_MAX \ + ((uint128_t)0xffffffffffffffff << 64 | (uint128_t)0xffffffffffffffff) #endif /* GCC 4.6+ */ -#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ #endif /* COSMOPOLITAN_LIBC_LIMITS_H_ */ diff --git a/libc/literal.h b/libc/literal.h index d2f6ac07704..d9ae4456a7a 100644 --- a/libc/literal.h +++ b/libc/literal.h @@ -1,5 +1,6 @@ #ifndef COSMOPOLITAN_LIBC_LITERAL_H_ #define COSMOPOLITAN_LIBC_LITERAL_H_ +#define __STDC_CONSTANT_MACROS #ifdef __INT8_C #define INT8_C(c) __INT8_C(c) diff --git a/libc/math.h b/libc/math.h index 4bf59a90a74..0087f694c8e 100644 --- a/libc/math.h +++ b/libc/math.h @@ -182,6 +182,8 @@ float fminf(float, float); float fmodf(float, float); float hypotf(float, float); float ldexpf(float, int); +float lgammaf(float); +float lgammaf_r(float, int *); float log10f(float); float log1pf(float); float log2f(float); @@ -205,10 +207,11 @@ float sinhf(float); float sqrtf(float); float tanf(float); float tanhf(float); -float truncf(float); float tgammaf(float); +float truncf(float); int finitef(float); +int finitel(long double); long double acoshl(long double); long double acosl(long double); long double asinhl(long double); @@ -237,6 +240,8 @@ long double fminl(long double, long double); long double fmodl(long double, long double); long double hypotl(long double, long double); long double ldexpl(long double, int); +long double lgammal(long double); +long double lgammal_r(long double, int *); long double log10l(long double); long double log1pl(long double); long double log2l(long double); @@ -260,8 +265,8 @@ long double sinl(long double); long double sqrtl(long double); long double tanhl(long double); long double tanl(long double); +long double tgammal(long double); long double truncl(long double); -int finitel(long double); long lrint(double); long lrintf(float); @@ -283,12 +288,15 @@ long long llroundl(long double); double frexp(double, int *); double modf(double, double *); +double nan(const char *); double remquo(double, double, int *); float frexpf(float, int *); float modff(float, float *); +float nanf(const char *); float remquof(float, float, int *); long double frexpl(long double, int *); long double modfl(long double, long double *); +long double nanl(const char *); long double remquol(long double, long double, int *); void sincos(double, double *, double *); void sincosf(float, float *, float *); diff --git a/libc/mem/get_current_dir_name.c b/libc/mem/get_current_dir_name.c index 4a5668cfe83..7c00f569a6b 100644 --- a/libc/mem/get_current_dir_name.c +++ b/libc/mem/get_current_dir_name.c @@ -28,7 +28,7 @@ * * @return pointer that must be free()'d, or NULL w/ errno */ -nodiscard char *get_current_dir_name(void) { +dontdiscard char *get_current_dir_name(void) { const char *p; if ((p = getenv("PWD")) && _isabspath(p)) { return strdup(p); diff --git a/libc/mem/mem.h b/libc/mem/mem.h index 4d772fd7e10..613702a22d7 100644 --- a/libc/mem/mem.h +++ b/libc/mem/mem.h @@ -15,16 +15,16 @@ void free(void *) libcesque; void *malloc(size_t) attributeallocsize((1)) mallocesque; void *calloc(size_t, size_t) attributeallocsize((1, 2)) mallocesque; void *memalign(size_t, size_t) attributeallocalign((1)) - attributeallocsize((2)) returnspointerwithnoaliases libcesque nodiscard; + attributeallocsize((2)) returnspointerwithnoaliases libcesque dontdiscard; void *realloc(void *, size_t) reallocesque; void *realloc_in_place(void *, size_t) reallocesque; -void *reallocarray(void *, size_t, size_t) nodiscard; +void *reallocarray(void *, size_t, size_t) dontdiscard; void *valloc(size_t) attributeallocsize((1)) vallocesque; void *pvalloc(size_t) vallocesque; char *strdup(const char *) paramsnonnull() mallocesque; char *strndup(const char *, size_t) paramsnonnull() mallocesque; void *aligned_alloc(size_t, size_t) attributeallocsize((1)) - attributeallocsize((2)) returnspointerwithnoaliases libcesque nodiscard; + attributeallocsize((2)) returnspointerwithnoaliases libcesque dontdiscard; int posix_memalign(void **, size_t, size_t); bool __grow(void *, size_t *, size_t, size_t) paramsnonnull((1, 2)) libcesque; @@ -34,7 +34,7 @@ size_t malloc_usable_size(const void *); void **independent_calloc(size_t, size_t, void **); void **independent_comalloc(size_t, size_t *, void **); -wchar_t *wcsdup(const wchar_t *) strlenesque nodiscard; +wchar_t *wcsdup(const wchar_t *) strlenesque dontdiscard; struct mallinfo { size_t arena; /* non-mmapped space allocated from system */ diff --git a/libc/mem/unhexstr.c b/libc/mem/unhexstr.c index f949a36fce9..82499ddef0c 100644 --- a/libc/mem/unhexstr.c +++ b/libc/mem/unhexstr.c @@ -21,7 +21,7 @@ #include "libc/mem/mem.h" #include "libc/str/str.h" -nodiscard void *unhexstr(const char *hexdigs) { +dontdiscard void *unhexstr(const char *hexdigs) { assert(strlen(hexdigs) % 2 == 0); return unhexbuf(malloc(strlen(hexdigs) / 2), strlen(hexdigs) / 2, hexdigs); } diff --git a/libc/nexgen32e/bsf.h b/libc/nexgen32e/bsf.h index 5869080d0a9..8464e095937 100644 --- a/libc/nexgen32e/bsf.h +++ b/libc/nexgen32e/bsf.h @@ -20,7 +20,7 @@ COSMOPOLITAN_C_START_ int bsf(int) pureconst; int bsfl(long) pureconst; int bsfll(long long) pureconst; -int bsfmax(uintmax_t) pureconst; +int bsf128(uintmax_t) pureconst; #if defined(__GNUC__) && !defined(__STRICT_ANSI__) #define bsf(u) \ diff --git a/libc/nexgen32e/bsr.h b/libc/nexgen32e/bsr.h index b694a5b6353..46c479c8445 100644 --- a/libc/nexgen32e/bsr.h +++ b/libc/nexgen32e/bsr.h @@ -20,7 +20,7 @@ COSMOPOLITAN_C_START_ int bsr(int) pureconst; int bsrl(long) pureconst; int bsrll(long long) pureconst; -int bsrmax(uintmax_t) pureconst; +int bsr128(uint128_t) pureconst; #if defined(__GNUC__) && defined(__x86_64__) && !defined(__STRICT_ANSI__) #define bsr(u) \ diff --git a/libc/nexgen32e/bsrmax.S b/libc/nexgen32e/bsr128.S similarity index 98% rename from libc/nexgen32e/bsrmax.S rename to libc/nexgen32e/bsr128.S index 091f355dd98..9a0f1d6b6e7 100644 --- a/libc/nexgen32e/bsrmax.S +++ b/libc/nexgen32e/bsr128.S @@ -33,7 +33,7 @@ // @param rsi:rdi is 128-bit unsigned 𝑥 value // @return eax number in range [0,128) or undef if 𝑥 is 0 // @see also treasure trove of nearly identical functions -bsrmax: .leafprologue +bsr128: .leafprologue .profilable bsr %rsi,%rax jnz 2f @@ -41,4 +41,4 @@ bsrmax: .leafprologue 1: .leafepilogue 2: add $64,%eax jmp 1b - .endfn bsrmax,globl + .endfn bsr128,globl diff --git a/libc/nt/memory.h b/libc/nt/memory.h index c17d3718503..c9ddfaa2a7a 100644 --- a/libc/nt/memory.h +++ b/libc/nt/memory.h @@ -71,12 +71,12 @@ bool32 OfferVirtualMemory(void *inout_VirtualAddress, size_t Size, int Priority); int64_t GetProcessHeap(void); -void *HeapAlloc(int64_t hHeap, uint32_t dwFlags, size_t dwBytes) nodiscard; +void *HeapAlloc(int64_t hHeap, uint32_t dwFlags, size_t dwBytes) dontdiscard; bool32 HeapFree(int64_t hHeap, uint32_t dwFlags, void *opt_lpMem); void *HeapReAlloc(int64_t hHeap, uint32_t dwFlags, void *lpMem, - size_t dwBytes) nodiscard; + size_t dwBytes) dontdiscard; -void *GlobalAlloc(uint32_t uFlags, uint64_t dwBytes) nodiscard; +void *GlobalAlloc(uint32_t uFlags, uint64_t dwBytes) dontdiscard; void *GlobalFree(void *hMem); #if ShouldUseMsabiAttribute() diff --git a/libc/nt/runtime.h b/libc/nt/runtime.h index 6ac4befb10f..39bedab34fd 100644 --- a/libc/nt/runtime.h +++ b/libc/nt/runtime.h @@ -22,7 +22,7 @@ COSMOPOLITAN_C_START_ char16_t *GetCommandLine(void) nosideeffect; -char16_t *GetEnvironmentStrings(void) nodiscard; +char16_t *GetEnvironmentStrings(void) dontdiscard; bool32 FreeEnvironmentStrings(char16_t *) paramsnonnull(); bool32 ReadFile(int64_t hFile, void *lpBuffer, uint32_t nNumberOfBytesToRead, uint32_t *lpNumberOfBytesRead, @@ -35,7 +35,7 @@ bool32 TerminateProcess(int64_t hProcess, uint32_t uExitCode); int64_t GetCurrentProcess(void) pureconst; void ExitProcess(uint32_t uExitCode) wontreturn; uint32_t GetLastError(void) nosideeffect; -bool32 CloseHandle(int64_t hObject) nothrow nocallback; +bool32 CloseHandle(int64_t hObject) dontthrow nocallback; intptr_t GetStdHandle(int64_t nStdHandle) nosideeffect; bool32 SetStdHandle(int64_t nStdHandle, int64_t hHandle); bool32 SetDefaultDllDirectories(unsigned dirflags); diff --git a/libc/nt/winsock.h b/libc/nt/winsock.h index 77890a7259b..7f5b3a1e9db 100644 --- a/libc/nt/winsock.h +++ b/libc/nt/winsock.h @@ -328,7 +328,7 @@ struct NtInterfaceInfo { */ int32_t WSAStartup(uint16_t wVersionRequested, struct NtWsaData *lpWSAData) - paramsnonnull() nodiscard; + paramsnonnull() dontdiscard; int WSACleanup(void); int WSAGetLastError(void); @@ -348,7 +348,7 @@ int __sys_select_nt(int, struct NtFdSet *, struct NtFdSet *, struct NtFdSet *, uint64_t WSASocket(int af, int type, int protocol, const struct NtWsaProtocolInfo *opt_lpProtocolInfo, - const uint32_t opt_group, uint32_t dwFlags) nodiscard; + const uint32_t opt_group, uint32_t dwFlags) dontdiscard; int WSAConnect(uint64_t s, const struct sockaddr *name, const int namelen, const struct NtIovec *opt_lpCallerData, @@ -378,7 +378,7 @@ int64_t WSAAccept(uint64_t s, struct sockaddr *out_addr, int32_t *opt_inout_addrlen, const NtConditionProc opt_lpfnCondition, const uint32_t *opt_dwCallbackData) - paramsnonnull((2)) nodiscard; + paramsnonnull((2)) dontdiscard; int WSASend(uint64_t s, const struct NtIovec *lpBuffers, uint32_t dwBufferCount, uint32_t *opt_out_lpNumberOfBytesSent, uint32_t dwFlags, @@ -440,7 +440,7 @@ int WSANSPIoctl(int64_t hLookup, uint32_t dwControlCode, const struct NtWsaCompletion *opt_lpCompletion) paramsnonnull((3, 5, 7)); -int64_t WSACreateEvent(void) nodiscard; +int64_t WSACreateEvent(void) dontdiscard; bool32 WSACloseEvent(const int64_t hEvent); bool32 WSAResetEvent(const int64_t hEvent); bool32 WSASetEvent(const int64_t hEvent); diff --git a/libc/ohmyplus/ohmyplus.mk b/libc/ohmyplus/ohmyplus.mk deleted file mode 100644 index 312b6b50ce4..00000000000 --- a/libc/ohmyplus/ohmyplus.mk +++ /dev/null @@ -1,56 +0,0 @@ -#-*-mode:makefile-gmake;indent-tabs-mode:t;tab-width:8;coding:utf-8-*-┐ -#───vi: set et ft=make ts=8 tw=8 fenc=utf-8 :vi───────────────────────┘ - -PKGS += LIBC_OHMYPLUS - -LIBC_OHMYPLUS_ARTIFACTS += LIBC_OHMYPLUS_A -LIBC_OHMYPLUS = $(LIBC_OHMYPLUS_A_DEPS) $(LIBC_OHMYPLUS_A) -LIBC_OHMYPLUS_A = o/$(MODE)/libc/ohmyplus/ohmyplus.a -LIBC_OHMYPLUS_A_FILES := $(wildcard libc/ohmyplus/*) -LIBC_OHMYPLUS_A_HDRS = $(filter %.h,$(LIBC_OHMYPLUS_A_FILES)) -LIBC_OHMYPLUS_A_SRCS_S = $(filter %.S,$(LIBC_OHMYPLUS_A_FILES)) -LIBC_OHMYPLUS_A_SRCS_C = $(filter %.c,$(LIBC_OHMYPLUS_A_FILES)) -LIBC_OHMYPLUS_A_SRCS_CXX = $(filter %.cc,$(LIBC_OHMYPLUS_A_FILES)) - -LIBC_OHMYPLUS_A_SRCS = \ - $(LIBC_OHMYPLUS_A_SRCS_S) \ - $(LIBC_OHMYPLUS_A_SRCS_C) \ - $(LIBC_OHMYPLUS_A_SRCS_CXX) - -LIBC_OHMYPLUS_A_OBJS = \ - $(LIBC_OHMYPLUS_A_SRCS_S:%.S=o/$(MODE)/%.o) \ - $(LIBC_OHMYPLUS_A_SRCS_C:%.c=o/$(MODE)/%.o) \ - $(LIBC_OHMYPLUS_A_SRCS_CXX:%.cc=o/$(MODE)/%.o) - -LIBC_OHMYPLUS_A_CHECKS = \ - $(LIBC_OHMYPLUS_A).pkg \ - $(LIBC_OHMYPLUS_A_HDRS:%=o/$(MODE)/%.okk) - -LIBC_OHMYPLUS_A_DIRECTDEPS = \ - LIBC_BITS \ - LIBC_INTRIN \ - LIBC_MEM \ - LIBC_STUBS \ - LIBC_NEXGEN32E - -LIBC_OHMYPLUS_A_DEPS := \ - $(call uniq,$(foreach x,$(LIBC_OHMYPLUS_A_DIRECTDEPS),$($(x)))) - -$(LIBC_OHMYPLUS_A): \ - libc/ohmyplus/ \ - $(LIBC_OHMYPLUS_A).pkg \ - $(LIBC_OHMYPLUS_A_OBJS) - -$(LIBC_OHMYPLUS_A).pkg: \ - $(LIBC_OHMYPLUS_A_OBJS) \ - $(foreach x,$(LIBC_OHMYPLUS_A_DIRECTDEPS),$($(x)_A).pkg) - -LIBC_OHMYPLUS_LIBS = $(foreach x,$(LIBC_OHMYPLUS_ARTIFACTS),$($(x))) -LIBC_OHMYPLUS_SRCS = $(foreach x,$(LIBC_OHMYPLUS_ARTIFACTS),$($(x)_SRCS)) -LIBC_OHMYPLUS_HDRS = $(foreach x,$(LIBC_OHMYPLUS_ARTIFACTS),$($(x)_HDRS)) -LIBC_OHMYPLUS_CHECKS = $(foreach x,$(LIBC_OHMYPLUS_ARTIFACTS),$($(x)_CHECKS)) -LIBC_OHMYPLUS_OBJS = $(foreach x,$(LIBC_OHMYPLUS_ARTIFACTS),$($(x)_OBJS)) -$(LIBC_OHMYPLUS_OBJS): $(BUILD_FILES) libc/ohmyplus/ohmyplus.mk - -.PHONY: o/$(MODE)/libc/ohmyplus -o/$(MODE)/libc/ohmyplus: $(LIBC_OHMYPLUS_CHECKS) diff --git a/libc/ohmyplus/vector.h b/libc/ohmyplus/vector.h deleted file mode 100644 index f4255e93b50..00000000000 --- a/libc/ohmyplus/vector.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef COSMOPOLITAN_LIBC_OHMYPLUS_VECTOR_H_ -#define COSMOPOLITAN_LIBC_OHMYPLUS_VECTOR_H_ -#ifdef __cplusplus -extern "C" { -void __vector_reserve(size_t, size_t, intptr_t **, size_t *); -} /* extern c */ -namespace std { - -template -class vector { - public: - vector() : data_(NULL), size_(0), toto_(0) { - } - vector(size_t n) : data_(NULL), size_(n), toto_(0) { - VectorReserve(n); - } - size_t size() const { - return size_; - } - size_t capacity() const { - return toto_; - } - T &front() { - return data_[0]; - } - T &back() { - return data_[size_ - 1]; - } - void clear() { - size_ = 0; - } - void reserve(size_t n) { - VectorReserve(n); - } - void resize(size_t n) { - reserve((size_ = n)); - } - bool empty() const { - return !size_; - } - T &operator[](size_t i) { - return data_[i]; - } - - private: - T *data_; - size_t size_; - size_t toto_; - void VectorReserve(size_t n) { - __vector_reserve(n, sizeof(T), (intptr_t **)&data_, &toto_); - } -}; - -}; /* namespace std */ -#endif /* __cplusplus */ -#endif /* COSMOPOLITAN_LIBC_OHMYPLUS_VECTOR_H_ */ diff --git a/libc/runtime/gc.h b/libc/runtime/gc.h index 7229b65c957..5f507652ed9 100644 --- a/libc/runtime/gc.h +++ b/libc/runtime/gc.h @@ -10,7 +10,7 @@ void *_gc(void *) hidden; void *_defer(void *, void *) hidden; void __defer(struct StackFrame *, void *, void *) hidden; void __deferer(struct StackFrame *, void *, void *) hidden; -void _gclongjmp(jmp_buf, int) nothrow wontreturn; +void _gclongjmp(jmp_buf, int) dontthrow wontreturn; #if defined(__GNUC__) && !defined(__STRICT_ANSI__) #define _gc(THING) _defer((void *)_weakfree, (void *)(THING)) diff --git a/libc/sock/internal.h b/libc/sock/internal.h index 47209102554..2615b0f62ee 100644 --- a/libc/sock/internal.h +++ b/libc/sock/internal.h @@ -74,15 +74,15 @@ errno_t __dos2errno(uint32_t); void _firewall(const void *, uint32_t) hidden; -int32_t __sys_accept(int32_t, void *, uint32_t *, int) nodiscard hidden; -int32_t __sys_accept4(int32_t, void *, uint32_t *, int) nodiscard hidden; +int32_t __sys_accept(int32_t, void *, uint32_t *, int) dontdiscard hidden; +int32_t __sys_accept4(int32_t, void *, uint32_t *, int) dontdiscard hidden; int32_t __sys_connect(int32_t, const void *, uint32_t) hidden; int32_t __sys_socket(int32_t, int32_t, int32_t) hidden; int32_t __sys_getsockname(int32_t, void *, uint32_t *) hidden; int32_t __sys_getpeername(int32_t, void *, uint32_t *) hidden; int32_t __sys_socketpair(int32_t, int32_t, int32_t, int32_t[2]) hidden; -int32_t sys_accept4(int32_t, void *, uint32_t *, int) nodiscard hidden; +int32_t sys_accept4(int32_t, void *, uint32_t *, int) dontdiscard hidden; int32_t sys_accept(int32_t, void *, uint32_t *) hidden; int32_t sys_bind(int32_t, const void *, uint32_t) hidden; int32_t sys_connect(int32_t, const void *, uint32_t) hidden; diff --git a/libc/stdio/mkostemps.c b/libc/stdio/mkostemps.c index 2159770622e..2efaa0af210 100644 --- a/libc/stdio/mkostemps.c +++ b/libc/stdio/mkostemps.c @@ -21,6 +21,6 @@ /** * Delegates to mkotempsm() w/ owner-only non-execute access. */ -nodiscard int mkostemps(char *template, int suffixlen, unsigned flags) { +dontdiscard int mkostemps(char *template, int suffixlen, unsigned flags) { return mkostempsm(template, suffixlen, flags, 0600); } diff --git a/libc/stdio/mkostempsm.c b/libc/stdio/mkostempsm.c index f42e46f3c55..ff1b43f33f0 100644 --- a/libc/stdio/mkostempsm.c +++ b/libc/stdio/mkostempsm.c @@ -74,8 +74,8 @@ static uint64_t g_mkostemps_reseed; * or -1 w/ errno * @see kTmpPath */ -nodiscard int mkostempsm(char *template, int suffixlen, unsigned flags, - int mode) { +dontdiscard int mkostempsm(char *template, int suffixlen, unsigned flags, + int mode) { if (g_mkostemps_reseed++ % RESEED == 0) g_mkostemps_rand = rand64(); return mkostempsmi(template, suffixlen, flags, &g_mkostemps_rand, mode, open); } diff --git a/libc/stdio/printf.c b/libc/stdio/printf.c index 8c64c6d3255..54e3a2cf348 100644 --- a/libc/stdio/printf.c +++ b/libc/stdio/printf.c @@ -22,9 +22,9 @@ * Formats and writes string to stdout. * * Cosmopolitan supports most of the standard formatting behaviors - * described by `man 3 printf`, in addition to the following: + * described by `man 3 printf`, in addition to the following * - * - `%jd`, `%jx`, etc. are {,u}intmax_t which in Cosmopolitan is 128-bit. + * - `%jjd`, `%jjx`, etc. are {,u}int128_t (cosmopolitan only) * * - `%'d` or `%,d` may be used to insert thousands separators. The prior is * consistent with C; the latter is consistent with Python. diff --git a/libc/stdio/stdio.h b/libc/stdio/stdio.h index 9c11a73befe..c869a377478 100644 --- a/libc/stdio/stdio.h +++ b/libc/stdio/stdio.h @@ -57,9 +57,9 @@ int putchar(int); int puts(const char *); ssize_t getline(char **, size_t *, FILE *) paramsnonnull(); ssize_t getdelim(char **, size_t *, int, FILE *) paramsnonnull(); -FILE *fopen(const char *, const char *) paramsnonnull() nodiscard; -FILE *fdopen(int, const char *) paramsnonnull() nodiscard; -FILE *fmemopen(void *, size_t, const char *) paramsnonnull((3)) nodiscard; +FILE *fopen(const char *, const char *) paramsnonnull() dontdiscard; +FILE *fdopen(int, const char *) paramsnonnull() dontdiscard; +FILE *fmemopen(void *, size_t, const char *) paramsnonnull((3)) dontdiscard; FILE *freopen(const char *, const char *, FILE *) paramsnonnull((2, 3)); size_t fread(void *, size_t, size_t, FILE *) paramsnonnull((4)); size_t fwrite(const void *, size_t, size_t, FILE *) paramsnonnull((4)); @@ -90,16 +90,31 @@ int systemexec(const char *); ╚────────────────────────────────────────────────────────────────────────────│*/ int printf(const char *, ...) printfesque(1) - paramsnonnull((1)) nothrow nocallback; -int vprintf(const char *, va_list) paramsnonnull() nothrow nocallback; + paramsnonnull((1)) dontthrow nocallback; +int vprintf(const char *, va_list) paramsnonnull() dontthrow nocallback; int fprintf(FILE *, const char *, ...) printfesque(2) - paramsnonnull((1, 2)) nothrow nocallback; -int vfprintf(FILE *, const char *, va_list) paramsnonnull() nothrow nocallback; + paramsnonnull((1, 2)) dontthrow nocallback; +int vfprintf(FILE *, const char *, va_list) + paramsnonnull() dontthrow nocallback; int scanf(const char *, ...) scanfesque(1); int vscanf(const char *, va_list); int fscanf(FILE *, const char *, ...) scanfesque(2); int vfscanf(FILE *, const char *, va_list); +int fwprintf(FILE *, const wchar_t *, ...); +int fwscanf(FILE *, const wchar_t *, ...); +int swprintf(wchar_t *, size_t, const wchar_t *, ...); +int swscanf(const wchar_t *, const wchar_t *, ...); +int vfwprintf(FILE *, const wchar_t *, va_list); +int vfwscanf(FILE *, const wchar_t *, va_list); +int vswprintf(wchar_t *, size_t, const wchar_t *, va_list); +int vswscanf(const wchar_t *, const wchar_t *, va_list); +int vwprintf(const wchar_t *, va_list); +int vwscanf(const wchar_t *, va_list); +int wprintf(const wchar_t *, ...); +int wscanf(const wchar_t *, ...); +int fwide(FILE *, int); + /*───────────────────────────────────────────────────────────────────────────│─╗ │ cosmopolitan § standard i/o » optimizations ─╬─│┼ ╚────────────────────────────────────────────────────────────────────────────│*/ diff --git a/libc/stdio/temp.h b/libc/stdio/temp.h index 9b6113f4091..5a1e7544e9b 100644 --- a/libc/stdio/temp.h +++ b/libc/stdio/temp.h @@ -4,16 +4,17 @@ #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ -nodiscard FILE *tmpfile(void); -nodiscard int mkstemp(char *); -nodiscard int mkostemp(char *, unsigned); -nodiscard int mkstemps(char *, int); -nodiscard int mkostemps(char *, int, unsigned); -nodiscard int mkostempsm(char *, int, unsigned, int); +dontdiscard FILE *tmpfile(void); +dontdiscard int mkstemp(char *); +dontdiscard int mkostemp(char *, unsigned); +dontdiscard int mkstemps(char *, int); +dontdiscard int mkostemps(char *, int, unsigned); +dontdiscard int mkostempsm(char *, int, unsigned, int); compatfn char *mktemp(char *); +char *tmpnam(char *); int mkostempsmi(char *, int, unsigned, uint64_t *, int, - int (*)(const char *, int, ...)) hidden nodiscard; + int (*)(const char *, int, ...)) hidden dontdiscard; COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ diff --git a/libc/str/str.h b/libc/str/str.h index fca378aa857..f79c752835a 100644 --- a/libc/str/str.h +++ b/libc/str/str.h @@ -192,7 +192,7 @@ wchar_t *wmempcpy(wchar_t *, const wchar_t *, size_t) memcpyesque; wchar_t *wmemmove(wchar_t *, const wchar_t *, size_t) memcpyesque; void *tinymemccpy(void *, const void *, int, size_t) memcpyesque; void *memmem(const void *, size_t, const void *, size_t) libcesque nosideeffect; -char *strerror(int) returnsnonnull nothrow nocallback; +char *strerror(int) returnsnonnull dontthrow nocallback; long a64l(const char *); char *l64a(long); @@ -254,6 +254,10 @@ typedef unsigned wctype_t; wctype_t wctype(const char *) strlenesque; int iswctype(wint_t, wctype_t) pureconst; +typedef const int *wctrans_t; +wctrans_t wctrans(const char *); +wint_t towctrans(wint_t, wctrans_t); + /*───────────────────────────────────────────────────────────────────────────│─╗ │ cosmopolitan § strings » system ─╬─│┼ ╚────────────────────────────────────────────────────────────────────────────│*/ diff --git a/libc/str/towctrans.c b/libc/str/towctrans.c new file mode 100644 index 00000000000..e1ac46af813 --- /dev/null +++ b/libc/str/towctrans.c @@ -0,0 +1,25 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2022 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/str/str.h" + +wint_t towctrans(wint_t c, wctrans_t t) { + if (t == (wctrans_t)1) return towupper(c); + if (t == (wctrans_t)2) return towlower(c); + return c; +} diff --git a/libc/str/wctrans.c b/libc/str/wctrans.c new file mode 100644 index 00000000000..285d8b556c8 --- /dev/null +++ b/libc/str/wctrans.c @@ -0,0 +1,25 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2022 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/str/str.h" + +wctrans_t wctrans(const char *s) { + if (!strcmp(s, "toupper")) return (wctrans_t)1; + if (!strcmp(s, "tolower")) return (wctrans_t)2; + return 0; +} diff --git a/libc/testlib/ezbench.h b/libc/testlib/ezbench.h index 789e3e3fe23..977321c0812 100644 --- a/libc/testlib/ezbench.h +++ b/libc/testlib/ezbench.h @@ -7,6 +7,7 @@ #include "libc/testlib/testlib.h" #include "libc/time/time.h" #if !(__ASSEMBLER__ + __LINKER__ + 0) +COSMOPOLITAN_C_START_ #define EZBENCH(INIT, EXPR) EZBENCH2(#EXPR, INIT, EXPR) @@ -189,5 +190,7 @@ void __testlib_ezbenchreport_n(const char *, char, size_t, uint64_t); #define EZBENCH_N(NAME, N, EXPR) (void)0 #define EZBENCH_K(NAME, K, EXPR) (void)0 #endif + +COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ #endif /* COSMOPOLITAN_LIBC_TESTLIB_EZBENCH_H_ */ diff --git a/libc/testlib/formatint.c b/libc/testlib/formatint.c index c3c5cda07e2..c9ce6c9268f 100644 --- a/libc/testlib/formatint.c +++ b/libc/testlib/formatint.c @@ -25,7 +25,7 @@ static size_t sbufi_; static char sbufs_[2][256]; -nodiscard testonly char *testlib_formatint(intptr_t x) { +dontdiscard testonly char *testlib_formatint(intptr_t x) { char *str = sbufi_ < ARRAYLEN(sbufs_) ? sbufs_[sbufi_++] : malloc(256); char *p = str; p += sprintf(p, "%ld\t(or %#lx", x, x); diff --git a/libc/testlib/formatrange.c b/libc/testlib/formatrange.c index 479bfa170b6..dd7e80b4c6f 100644 --- a/libc/testlib/formatrange.c +++ b/libc/testlib/formatrange.c @@ -19,6 +19,6 @@ #include "libc/testlib/testlib.h" #include "libc/x/x.h" -nodiscard testonly char *testlib_formatrange(intptr_t beg, intptr_t end) { +dontdiscard testonly char *testlib_formatrange(intptr_t beg, intptr_t end) { return xasprintf("[%#ld,%#ld]", beg, end); } diff --git a/libc/testlib/formatstr.c b/libc/testlib/formatstr.c index 5e9a2446063..a4b9d533ea8 100644 --- a/libc/testlib/formatstr.c +++ b/libc/testlib/formatstr.c @@ -24,7 +24,7 @@ /** * Turns string into code. */ -nodiscard testonly char *testlib_formatstr(size_t cw, const void *s, int n) { +dontdiscard testonly char *testlib_formatstr(size_t cw, const void *s, int n) { if (s) { switch (cw) { case 1: diff --git a/libc/time/time.h b/libc/time/time.h index 17c05ebdc2a..47e498bee4f 100644 --- a/libc/time/time.h +++ b/libc/time/time.h @@ -4,6 +4,7 @@ #include "libc/calls/struct/timespec.h" #include "libc/calls/struct/timeval.h" #include "libc/time/struct/timezone.h" +#include "libc/time/struct/tm.h" #include "libc/time/struct/utimbuf.h" #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ @@ -63,8 +64,9 @@ extern long double (*nowl)(void); long double ConvertTicksToNanos(uint64_t); void RefreshTime(void); -double difftime(int64_t, int64_t) nothrow pureconst; +double difftime(int64_t, int64_t) dontthrow pureconst; char *iso8601(char[hasatleast 20], struct tm *); +size_t wcsftime(wchar_t *, size_t, const wchar_t *, const struct tm *); COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ diff --git a/libc/tinymath/cosdf.c b/libc/tinymath/cosdf.c new file mode 100644 index 00000000000..fb18bfdd391 --- /dev/null +++ b/libc/tinymath/cosdf.c @@ -0,0 +1,71 @@ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ +│vi: set et ft=c ts=8 tw=8 fenc=utf-8 :vi│ +╚──────────────────────────────────────────────────────────────────────────────╝ +│ │ +│ Musl Libc │ +│ Copyright © 2005-2020 Rich Felker, et al. │ +│ │ +│ Permission is hereby granted, free of charge, to any person obtaining │ +│ a copy of this software and associated documentation files (the │ +│ "Software"), to deal in the Software without restriction, including │ +│ without limitation the rights to use, copy, modify, merge, publish, │ +│ distribute, sublicense, and/or sell copies of the Software, and to │ +│ permit persons to whom the Software is furnished to do so, subject to │ +│ the following conditions: │ +│ │ +│ The above copyright notice and this permission notice shall be │ +│ included in all copies or substantial portions of the Software. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ +│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ +│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ +│ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY │ +│ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, │ +│ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE │ +│ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ +│ │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/math.h" + +asm(".ident\t\"\\n\\n\ +fdlibm (fdlibm license)\\n\ +Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.\""); +asm(".ident\t\"\\n\\n\ +Musl libc (MIT License)\\n\ +Copyright 2005-2014 Rich Felker, et. al.\""); +asm(".include \"libc/disclaimer.inc\""); +/* clang-format off */ + +/* origin: FreeBSD /usr/src/lib/msun/src/k_cosf.c */ +/* + * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. + * Debugged and optimized by Bruce D. Evans. + */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ + +/* |cos(x) - c(x)| < 2**-34.1 (~[-5.37e-11, 5.295e-11]). */ +static const double +C0 = -0x1ffffffd0c5e81.0p-54, /* -0.499999997251031003120 */ +C1 = 0x155553e1053a42.0p-57, /* 0.0416666233237390631894 */ +C2 = -0x16c087e80f1e27.0p-62, /* -0.00138867637746099294692 */ +C3 = 0x199342e0ee5069.0p-68; /* 0.0000243904487962774090654 */ + +float __cosdf(double x) +{ + double_t r, w, z; + + /* Try to optimize for parallel evaluation as in __tandf.c. */ + z = x*x; + w = z*z; + r = C2+z*C3; + return ((1.0+z*C0) + w*C1) + (w*z)*r; +} diff --git a/libc/tinymath/gamma.c b/libc/tinymath/gamma.c index 62488c47445..6da9b236c8f 100644 --- a/libc/tinymath/gamma.c +++ b/libc/tinymath/gamma.c @@ -322,6 +322,5 @@ double lgamma_r(double x, int *signgamp) */ double lgamma(double x) { - extern int __signgam; return lgamma_r(x, &__signgam); } diff --git a/libc/tinymath/kernel.internal.h b/libc/tinymath/kernel.internal.h index e968f32b43e..ae09d989fcd 100644 --- a/libc/tinymath/kernel.internal.h +++ b/libc/tinymath/kernel.internal.h @@ -3,6 +3,11 @@ #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ +extern int __signgam; + +float __cosdf(double); +float __sindf(double); +float __tandf(double, int); double __sin(double, double, int); double __tan(double, double, int); double __cos(double, double); diff --git a/libc/tinymath/lgamma.c b/libc/tinymath/lgamma.c new file mode 100644 index 00000000000..dbac09974e1 --- /dev/null +++ b/libc/tinymath/lgamma.c @@ -0,0 +1,24 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2022 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/math.h" +#include "libc/tinymath/kernel.internal.h" + +double lgamma(double x) { + return lgamma_r(x, &__signgam); +} diff --git a/libc/tinymath/lgamma_r.c b/libc/tinymath/lgamma_r.c new file mode 100644 index 00000000000..ac35db77924 --- /dev/null +++ b/libc/tinymath/lgamma_r.c @@ -0,0 +1,321 @@ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ +│vi: set et ft=c ts=8 tw=8 fenc=utf-8 :vi│ +╚──────────────────────────────────────────────────────────────────────────────╝ +│ │ +│ Musl Libc │ +│ Copyright © 2005-2020 Rich Felker, et al. │ +│ │ +│ Permission is hereby granted, free of charge, to any person obtaining │ +│ a copy of this software and associated documentation files (the │ +│ "Software"), to deal in the Software without restriction, including │ +│ without limitation the rights to use, copy, modify, merge, publish, │ +│ distribute, sublicense, and/or sell copies of the Software, and to │ +│ permit persons to whom the Software is furnished to do so, subject to │ +│ the following conditions: │ +│ │ +│ The above copyright notice and this permission notice shall be │ +│ included in all copies or substantial portions of the Software. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ +│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ +│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ +│ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY │ +│ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, │ +│ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE │ +│ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ +│ │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/math.h" +#include "libc/tinymath/kernel.internal.h" + +asm(".ident\t\"\\n\\n\ +fdlibm (fdlibm license)\\n\ +Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.\""); +asm(".ident\t\"\\n\\n\ +Musl libc (MIT License)\\n\ +Copyright 2005-2014 Rich Felker, et. al.\""); +asm(".include \"libc/disclaimer.inc\""); +/* clang-format off */ + +/* origin: FreeBSD /usr/src/lib/msun/src/e_lgamma_r.c */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunSoft, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + * + */ +/* lgamma_r(x, signgamp) + * Reentrant version of the logarithm of the Gamma function + * with user provide pointer for the sign of Gamma(x). + * + * Method: + * 1. Argument Reduction for 0 < x <= 8 + * Since gamma(1+s)=s*gamma(s), for x in [0,8], we may + * reduce x to a number in [1.5,2.5] by + * lgamma(1+s) = log(s) + lgamma(s) + * for example, + * lgamma(7.3) = log(6.3) + lgamma(6.3) + * = log(6.3*5.3) + lgamma(5.3) + * = log(6.3*5.3*4.3*3.3*2.3) + lgamma(2.3) + * 2. Polynomial approximation of lgamma around its + * minimun ymin=1.461632144968362245 to maintain monotonicity. + * On [ymin-0.23, ymin+0.27] (i.e., [1.23164,1.73163]), use + * Let z = x-ymin; + * lgamma(x) = -1.214862905358496078218 + z^2*poly(z) + * where + * poly(z) is a 14 degree polynomial. + * 2. Rational approximation in the primary interval [2,3] + * We use the following approximation: + * s = x-2.0; + * lgamma(x) = 0.5*s + s*P(s)/Q(s) + * with accuracy + * |P/Q - (lgamma(x)-0.5s)| < 2**-61.71 + * Our algorithms are based on the following observation + * + * zeta(2)-1 2 zeta(3)-1 3 + * lgamma(2+s) = s*(1-Euler) + --------- * s - --------- * s + ... + * 2 3 + * + * where Euler = 0.5771... is the Euler constant, which is very + * close to 0.5. + * + * 3. For x>=8, we have + * lgamma(x)~(x-0.5)log(x)-x+0.5*log(2pi)+1/(12x)-1/(360x**3)+.... + * (better formula: + * lgamma(x)~(x-0.5)*(log(x)-1)-.5*(log(2pi)-1) + ...) + * Let z = 1/x, then we approximation + * f(z) = lgamma(x) - (x-0.5)(log(x)-1) + * by + * 3 5 11 + * w = w0 + w1*z + w2*z + w3*z + ... + w6*z + * where + * |w - f(z)| < 2**-58.74 + * + * 4. For negative x, since (G is gamma function) + * -x*G(-x)*G(x) = pi/sin(pi*x), + * we have + * G(x) = pi/(sin(pi*x)*(-x)*G(-x)) + * since G(-x) is positive, sign(G(x)) = sign(sin(pi*x)) for x<0 + * Hence, for x<0, signgam = sign(sin(pi*x)) and + * lgamma(x) = log(|Gamma(x)|) + * = log(pi/(|x*sin(pi*x)|)) - lgamma(-x); + * Note: one should avoid compute pi*(-x) directly in the + * computation of sin(pi*(-x)). + * + * 5. Special Cases + * lgamma(2+s) ~ s*(1-Euler) for tiny s + * lgamma(1) = lgamma(2) = 0 + * lgamma(x) ~ -log(|x|) for tiny x + * lgamma(0) = lgamma(neg.integer) = inf and raise divide-by-zero + * lgamma(inf) = inf + * lgamma(-inf) = inf (bug for bug compatible with C99!?) + * + */ + +static const double +pi = 3.14159265358979311600e+00, /* 0x400921FB, 0x54442D18 */ +a0 = 7.72156649015328655494e-02, /* 0x3FB3C467, 0xE37DB0C8 */ +a1 = 3.22467033424113591611e-01, /* 0x3FD4A34C, 0xC4A60FAD */ +a2 = 6.73523010531292681824e-02, /* 0x3FB13E00, 0x1A5562A7 */ +a3 = 2.05808084325167332806e-02, /* 0x3F951322, 0xAC92547B */ +a4 = 7.38555086081402883957e-03, /* 0x3F7E404F, 0xB68FEFE8 */ +a5 = 2.89051383673415629091e-03, /* 0x3F67ADD8, 0xCCB7926B */ +a6 = 1.19270763183362067845e-03, /* 0x3F538A94, 0x116F3F5D */ +a7 = 5.10069792153511336608e-04, /* 0x3F40B6C6, 0x89B99C00 */ +a8 = 2.20862790713908385557e-04, /* 0x3F2CF2EC, 0xED10E54D */ +a9 = 1.08011567247583939954e-04, /* 0x3F1C5088, 0x987DFB07 */ +a10 = 2.52144565451257326939e-05, /* 0x3EFA7074, 0x428CFA52 */ +a11 = 4.48640949618915160150e-05, /* 0x3F07858E, 0x90A45837 */ +tc = 1.46163214496836224576e+00, /* 0x3FF762D8, 0x6356BE3F */ +tf = -1.21486290535849611461e-01, /* 0xBFBF19B9, 0xBCC38A42 */ +/* tt = -(tail of tf) */ +tt = -3.63867699703950536541e-18, /* 0xBC50C7CA, 0xA48A971F */ +t0 = 4.83836122723810047042e-01, /* 0x3FDEF72B, 0xC8EE38A2 */ +t1 = -1.47587722994593911752e-01, /* 0xBFC2E427, 0x8DC6C509 */ +t2 = 6.46249402391333854778e-02, /* 0x3FB08B42, 0x94D5419B */ +t3 = -3.27885410759859649565e-02, /* 0xBFA0C9A8, 0xDF35B713 */ +t4 = 1.79706750811820387126e-02, /* 0x3F9266E7, 0x970AF9EC */ +t5 = -1.03142241298341437450e-02, /* 0xBF851F9F, 0xBA91EC6A */ +t6 = 6.10053870246291332635e-03, /* 0x3F78FCE0, 0xE370E344 */ +t7 = -3.68452016781138256760e-03, /* 0xBF6E2EFF, 0xB3E914D7 */ +t8 = 2.25964780900612472250e-03, /* 0x3F6282D3, 0x2E15C915 */ +t9 = -1.40346469989232843813e-03, /* 0xBF56FE8E, 0xBF2D1AF1 */ +t10 = 8.81081882437654011382e-04, /* 0x3F4CDF0C, 0xEF61A8E9 */ +t11 = -5.38595305356740546715e-04, /* 0xBF41A610, 0x9C73E0EC */ +t12 = 3.15632070903625950361e-04, /* 0x3F34AF6D, 0x6C0EBBF7 */ +t13 = -3.12754168375120860518e-04, /* 0xBF347F24, 0xECC38C38 */ +t14 = 3.35529192635519073543e-04, /* 0x3F35FD3E, 0xE8C2D3F4 */ +u0 = -7.72156649015328655494e-02, /* 0xBFB3C467, 0xE37DB0C8 */ +u1 = 6.32827064025093366517e-01, /* 0x3FE4401E, 0x8B005DFF */ +u2 = 1.45492250137234768737e+00, /* 0x3FF7475C, 0xD119BD6F */ +u3 = 9.77717527963372745603e-01, /* 0x3FEF4976, 0x44EA8450 */ +u4 = 2.28963728064692451092e-01, /* 0x3FCD4EAE, 0xF6010924 */ +u5 = 1.33810918536787660377e-02, /* 0x3F8B678B, 0xBF2BAB09 */ +v1 = 2.45597793713041134822e+00, /* 0x4003A5D7, 0xC2BD619C */ +v2 = 2.12848976379893395361e+00, /* 0x40010725, 0xA42B18F5 */ +v3 = 7.69285150456672783825e-01, /* 0x3FE89DFB, 0xE45050AF */ +v4 = 1.04222645593369134254e-01, /* 0x3FBAAE55, 0xD6537C88 */ +v5 = 3.21709242282423911810e-03, /* 0x3F6A5ABB, 0x57D0CF61 */ +s0 = -7.72156649015328655494e-02, /* 0xBFB3C467, 0xE37DB0C8 */ +s1 = 2.14982415960608852501e-01, /* 0x3FCB848B, 0x36E20878 */ +s2 = 3.25778796408930981787e-01, /* 0x3FD4D98F, 0x4F139F59 */ +s3 = 1.46350472652464452805e-01, /* 0x3FC2BB9C, 0xBEE5F2F7 */ +s4 = 2.66422703033638609560e-02, /* 0x3F9B481C, 0x7E939961 */ +s5 = 1.84028451407337715652e-03, /* 0x3F5E26B6, 0x7368F239 */ +s6 = 3.19475326584100867617e-05, /* 0x3F00BFEC, 0xDD17E945 */ +r1 = 1.39200533467621045958e+00, /* 0x3FF645A7, 0x62C4AB74 */ +r2 = 7.21935547567138069525e-01, /* 0x3FE71A18, 0x93D3DCDC */ +r3 = 1.71933865632803078993e-01, /* 0x3FC601ED, 0xCCFBDF27 */ +r4 = 1.86459191715652901344e-02, /* 0x3F9317EA, 0x742ED475 */ +r5 = 7.77942496381893596434e-04, /* 0x3F497DDA, 0xCA41A95B */ +r6 = 7.32668430744625636189e-06, /* 0x3EDEBAF7, 0xA5B38140 */ +w0 = 4.18938533204672725052e-01, /* 0x3FDACFE3, 0x90C97D69 */ +w1 = 8.33333333333329678849e-02, /* 0x3FB55555, 0x5555553B */ +w2 = -2.77777777728775536470e-03, /* 0xBF66C16C, 0x16B02E5C */ +w3 = 7.93650558643019558500e-04, /* 0x3F4A019F, 0x98CF38B6 */ +w4 = -5.95187557450339963135e-04, /* 0xBF4380CB, 0x8C0FE741 */ +w5 = 8.36339918996282139126e-04, /* 0x3F4B67BA, 0x4CDAD5D1 */ +w6 = -1.63092934096575273989e-03; /* 0xBF5AB89D, 0x0B9E43E4 */ + +/* sin(pi*x) assuming x > 2^-100, if sin(pi*x)==0 the sign is arbitrary */ +static double sin_pi(double x) +{ + int n; + + /* spurious inexact if odd int */ + x = 2.0*(x*0.5 - floor(x*0.5)); /* x mod 2.0 */ + + n = (int)(x*4.0); + n = (n+1)/2; + x -= n*0.5f; + x *= pi; + + switch (n) { + default: /* case 4: */ + case 0: return __sin(x, 0.0, 0); + case 1: return __cos(x, 0.0); + case 2: return __sin(-x, 0.0, 0); + case 3: return -__cos(x, 0.0); + } +} + +/** + * Returns natural logarithm of absolute value of Gamma function. + */ +double lgamma_r(double x, int *signgamp) +{ + union {double f; uint64_t i;} u = {x}; + double_t t,y,z,nadj,p,p1,p2,p3,q,r,w; + uint32_t ix; + int sign,i; + + /* purge off +-inf, NaN, +-0, tiny and negative arguments */ + *signgamp = 1; + sign = u.i>>63; + ix = u.i>>32 & 0x7fffffff; + if (ix >= 0x7ff00000) + return x*x; + if (ix < (0x3ff-70)<<20) { /* |x|<2**-70, return -log(|x|) */ + if(sign) { + x = -x; + *signgamp = -1; + } + return -log(x); + } + if (sign) { + x = -x; + t = sin_pi(x); + if (t == 0.0) /* -integer */ + return 1.0/(x-x); + if (t > 0.0) + *signgamp = -1; + else + t = -t; + nadj = log(pi/(t*x)); + } + + /* purge off 1 and 2 */ + if ((ix == 0x3ff00000 || ix == 0x40000000) && (uint32_t)u.i == 0) + r = 0; + /* for x < 2.0 */ + else if (ix < 0x40000000) { + if (ix <= 0x3feccccc) { /* lgamma(x) = lgamma(x+1)-log(x) */ + r = -log(x); + if (ix >= 0x3FE76944) { + y = 1.0 - x; + i = 0; + } else if (ix >= 0x3FCDA661) { + y = x - (tc-1.0); + i = 1; + } else { + y = x; + i = 2; + } + } else { + r = 0.0; + if (ix >= 0x3FFBB4C3) { /* [1.7316,2] */ + y = 2.0 - x; + i = 0; + } else if(ix >= 0x3FF3B4C4) { /* [1.23,1.73] */ + y = x - tc; + i = 1; + } else { + y = x - 1.0; + i = 2; + } + } + switch (i) { + case 0: + z = y*y; + p1 = a0+z*(a2+z*(a4+z*(a6+z*(a8+z*a10)))); + p2 = z*(a1+z*(a3+z*(a5+z*(a7+z*(a9+z*a11))))); + p = y*p1+p2; + r += (p-0.5*y); + break; + case 1: + z = y*y; + w = z*y; + p1 = t0+w*(t3+w*(t6+w*(t9 +w*t12))); /* parallel comp */ + p2 = t1+w*(t4+w*(t7+w*(t10+w*t13))); + p3 = t2+w*(t5+w*(t8+w*(t11+w*t14))); + p = z*p1-(tt-w*(p2+y*p3)); + r += tf + p; + break; + case 2: + p1 = y*(u0+y*(u1+y*(u2+y*(u3+y*(u4+y*u5))))); + p2 = 1.0+y*(v1+y*(v2+y*(v3+y*(v4+y*v5)))); + r += -0.5*y + p1/p2; + } + } else if (ix < 0x40200000) { /* x < 8.0 */ + i = (int)x; + y = x - (double)i; + p = y*(s0+y*(s1+y*(s2+y*(s3+y*(s4+y*(s5+y*s6)))))); + q = 1.0+y*(r1+y*(r2+y*(r3+y*(r4+y*(r5+y*r6))))); + r = 0.5*y+p/q; + z = 1.0; /* lgamma(1+s) = log(s) + lgamma(s) */ + switch (i) { + case 7: z *= y + 6.0; /* FALLTHRU */ + case 6: z *= y + 5.0; /* FALLTHRU */ + case 5: z *= y + 4.0; /* FALLTHRU */ + case 4: z *= y + 3.0; /* FALLTHRU */ + case 3: z *= y + 2.0; /* FALLTHRU */ + r += log(z); + break; + } + } else if (ix < 0x43900000) { /* 8.0 <= x < 2**58 */ + t = log(x); + z = 1.0/x; + y = z*z; + w = w0+z*(w1+y*(w2+y*(w3+y*(w4+y*(w5+y*w6))))); + r = (x-0.5)*(t-1.0)+w; + } else /* 2**58 <= x <= inf */ + r = x*(log(x)-1.0); + if (sign) + r = nadj - r; + return r; +} diff --git a/libc/tinymath/lgammaf.c b/libc/tinymath/lgammaf.c new file mode 100644 index 00000000000..641d6976975 --- /dev/null +++ b/libc/tinymath/lgammaf.c @@ -0,0 +1,24 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2022 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/math.h" +#include "libc/tinymath/kernel.internal.h" + +float lgammaf(float x) { + return lgammaf_r(x, &__signgam); +} diff --git a/libc/tinymath/lgammaf_r.c b/libc/tinymath/lgammaf_r.c new file mode 100644 index 00000000000..99f9b5ebf04 --- /dev/null +++ b/libc/tinymath/lgammaf_r.c @@ -0,0 +1,256 @@ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ +│vi: set et ft=c ts=8 tw=8 fenc=utf-8 :vi│ +╚──────────────────────────────────────────────────────────────────────────────╝ +│ │ +│ Musl Libc │ +│ Copyright © 2005-2020 Rich Felker, et al. │ +│ │ +│ Permission is hereby granted, free of charge, to any person obtaining │ +│ a copy of this software and associated documentation files (the │ +│ "Software"), to deal in the Software without restriction, including │ +│ without limitation the rights to use, copy, modify, merge, publish, │ +│ distribute, sublicense, and/or sell copies of the Software, and to │ +│ permit persons to whom the Software is furnished to do so, subject to │ +│ the following conditions: │ +│ │ +│ The above copyright notice and this permission notice shall be │ +│ included in all copies or substantial portions of the Software. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ +│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ +│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ +│ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY │ +│ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, │ +│ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE │ +│ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ +│ │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/math.h" +#include "libc/tinymath/kernel.internal.h" + +asm(".ident\t\"\\n\\n\ +fdlibm (fdlibm license)\\n\ +Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.\""); +asm(".ident\t\"\\n\\n\ +Musl libc (MIT License)\\n\ +Copyright 2005-2014 Rich Felker, et. al.\""); +asm(".include \"libc/disclaimer.inc\""); +/* clang-format off */ + +/* origin: FreeBSD /usr/src/lib/msun/src/e_lgammaf_r.c */ +/* + * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. + */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ + +static const float +pi = 3.1415927410e+00, /* 0x40490fdb */ +a0 = 7.7215664089e-02, /* 0x3d9e233f */ +a1 = 3.2246702909e-01, /* 0x3ea51a66 */ +a2 = 6.7352302372e-02, /* 0x3d89f001 */ +a3 = 2.0580807701e-02, /* 0x3ca89915 */ +a4 = 7.3855509982e-03, /* 0x3bf2027e */ +a5 = 2.8905137442e-03, /* 0x3b3d6ec6 */ +a6 = 1.1927076848e-03, /* 0x3a9c54a1 */ +a7 = 5.1006977446e-04, /* 0x3a05b634 */ +a8 = 2.2086278477e-04, /* 0x39679767 */ +a9 = 1.0801156895e-04, /* 0x38e28445 */ +a10 = 2.5214456400e-05, /* 0x37d383a2 */ +a11 = 4.4864096708e-05, /* 0x383c2c75 */ +tc = 1.4616321325e+00, /* 0x3fbb16c3 */ +tf = -1.2148628384e-01, /* 0xbdf8cdcd */ +/* tt = -(tail of tf) */ +tt = 6.6971006518e-09, /* 0x31e61c52 */ +t0 = 4.8383611441e-01, /* 0x3ef7b95e */ +t1 = -1.4758771658e-01, /* 0xbe17213c */ +t2 = 6.4624942839e-02, /* 0x3d845a15 */ +t3 = -3.2788541168e-02, /* 0xbd064d47 */ +t4 = 1.7970675603e-02, /* 0x3c93373d */ +t5 = -1.0314224288e-02, /* 0xbc28fcfe */ +t6 = 6.1005386524e-03, /* 0x3bc7e707 */ +t7 = -3.6845202558e-03, /* 0xbb7177fe */ +t8 = 2.2596477065e-03, /* 0x3b141699 */ +t9 = -1.4034647029e-03, /* 0xbab7f476 */ +t10 = 8.8108185446e-04, /* 0x3a66f867 */ +t11 = -5.3859531181e-04, /* 0xba0d3085 */ +t12 = 3.1563205994e-04, /* 0x39a57b6b */ +t13 = -3.1275415677e-04, /* 0xb9a3f927 */ +t14 = 3.3552918467e-04, /* 0x39afe9f7 */ +u0 = -7.7215664089e-02, /* 0xbd9e233f */ +u1 = 6.3282704353e-01, /* 0x3f2200f4 */ +u2 = 1.4549225569e+00, /* 0x3fba3ae7 */ +u3 = 9.7771751881e-01, /* 0x3f7a4bb2 */ +u4 = 2.2896373272e-01, /* 0x3e6a7578 */ +u5 = 1.3381091878e-02, /* 0x3c5b3c5e */ +v1 = 2.4559779167e+00, /* 0x401d2ebe */ +v2 = 2.1284897327e+00, /* 0x4008392d */ +v3 = 7.6928514242e-01, /* 0x3f44efdf */ +v4 = 1.0422264785e-01, /* 0x3dd572af */ +v5 = 3.2170924824e-03, /* 0x3b52d5db */ +s0 = -7.7215664089e-02, /* 0xbd9e233f */ +s1 = 2.1498242021e-01, /* 0x3e5c245a */ +s2 = 3.2577878237e-01, /* 0x3ea6cc7a */ +s3 = 1.4635047317e-01, /* 0x3e15dce6 */ +s4 = 2.6642270386e-02, /* 0x3cda40e4 */ +s5 = 1.8402845599e-03, /* 0x3af135b4 */ +s6 = 3.1947532989e-05, /* 0x3805ff67 */ +r1 = 1.3920053244e+00, /* 0x3fb22d3b */ +r2 = 7.2193557024e-01, /* 0x3f38d0c5 */ +r3 = 1.7193385959e-01, /* 0x3e300f6e */ +r4 = 1.8645919859e-02, /* 0x3c98bf54 */ +r5 = 7.7794247773e-04, /* 0x3a4beed6 */ +r6 = 7.3266842264e-06, /* 0x36f5d7bd */ +w0 = 4.1893854737e-01, /* 0x3ed67f1d */ +w1 = 8.3333335817e-02, /* 0x3daaaaab */ +w2 = -2.7777778450e-03, /* 0xbb360b61 */ +w3 = 7.9365057172e-04, /* 0x3a500cfd */ +w4 = -5.9518753551e-04, /* 0xba1c065c */ +w5 = 8.3633989561e-04, /* 0x3a5b3dd2 */ +w6 = -1.6309292987e-03; /* 0xbad5c4e8 */ + +/* sin(pi*x) assuming x > 2^-100, if sin(pi*x)==0 the sign is arbitrary */ +static float sin_pi(float x) +{ + double_t y; + int n; + + /* spurious inexact if odd int */ + x = 2*(x*0.5f - floorf(x*0.5f)); /* x mod 2.0 */ + + n = (int)(x*4); + n = (n+1)/2; + y = x - n*0.5f; + y *= 3.14159265358979323846; + switch (n) { + default: /* case 4: */ + case 0: return __sindf(y); + case 1: return __cosdf(y); + case 2: return __sindf(-y); + case 3: return -__cosdf(y); + } +} + +/** + * Returns natural logarithm of absolute value of Gamma function. + */ +float lgammaf_r(float x, int *signgamp) +{ + union {float f; uint32_t i;} u = {x}; + float t,y,z,nadj,p,p1,p2,p3,q,r,w; + uint32_t ix; + int i,sign; + + /* purge off +-inf, NaN, +-0, tiny and negative arguments */ + *signgamp = 1; + sign = u.i>>31; + ix = u.i & 0x7fffffff; + if (ix >= 0x7f800000) + return x*x; + if (ix < 0x35000000) { /* |x| < 2**-21, return -log(|x|) */ + if (sign) { + *signgamp = -1; + x = -x; + } + return -logf(x); + } + if (sign) { + x = -x; + t = sin_pi(x); + if (t == 0.0f) /* -integer */ + return 1.0f/(x-x); + if (t > 0.0f) + *signgamp = -1; + else + t = -t; + nadj = logf(pi/(t*x)); + } + + /* purge off 1 and 2 */ + if (ix == 0x3f800000 || ix == 0x40000000) + r = 0; + /* for x < 2.0 */ + else if (ix < 0x40000000) { + if (ix <= 0x3f666666) { /* lgamma(x) = lgamma(x+1)-log(x) */ + r = -logf(x); + if (ix >= 0x3f3b4a20) { + y = 1.0f - x; + i = 0; + } else if (ix >= 0x3e6d3308) { + y = x - (tc-1.0f); + i = 1; + } else { + y = x; + i = 2; + } + } else { + r = 0.0f; + if (ix >= 0x3fdda618) { /* [1.7316,2] */ + y = 2.0f - x; + i = 0; + } else if (ix >= 0x3F9da620) { /* [1.23,1.73] */ + y = x - tc; + i = 1; + } else { + y = x - 1.0f; + i = 2; + } + } + switch(i) { + case 0: + z = y*y; + p1 = a0+z*(a2+z*(a4+z*(a6+z*(a8+z*a10)))); + p2 = z*(a1+z*(a3+z*(a5+z*(a7+z*(a9+z*a11))))); + p = y*p1+p2; + r += p - 0.5f*y; + break; + case 1: + z = y*y; + w = z*y; + p1 = t0+w*(t3+w*(t6+w*(t9 +w*t12))); /* parallel comp */ + p2 = t1+w*(t4+w*(t7+w*(t10+w*t13))); + p3 = t2+w*(t5+w*(t8+w*(t11+w*t14))); + p = z*p1-(tt-w*(p2+y*p3)); + r += (tf + p); + break; + case 2: + p1 = y*(u0+y*(u1+y*(u2+y*(u3+y*(u4+y*u5))))); + p2 = 1.0f+y*(v1+y*(v2+y*(v3+y*(v4+y*v5)))); + r += -0.5f*y + p1/p2; + } + } else if (ix < 0x41000000) { /* x < 8.0 */ + i = (int)x; + y = x - (float)i; + p = y*(s0+y*(s1+y*(s2+y*(s3+y*(s4+y*(s5+y*s6)))))); + q = 1.0f+y*(r1+y*(r2+y*(r3+y*(r4+y*(r5+y*r6))))); + r = 0.5f*y+p/q; + z = 1.0f; /* lgamma(1+s) = log(s) + lgamma(s) */ + switch (i) { + case 7: z *= y + 6.0f; /* FALLTHRU */ + case 6: z *= y + 5.0f; /* FALLTHRU */ + case 5: z *= y + 4.0f; /* FALLTHRU */ + case 4: z *= y + 3.0f; /* FALLTHRU */ + case 3: z *= y + 2.0f; /* FALLTHRU */ + r += logf(z); + break; + } + } else if (ix < 0x5c800000) { /* 8.0 <= x < 2**58 */ + t = logf(x); + z = 1.0f/x; + y = z*z; + w = w0+z*(w1+y*(w2+y*(w3+y*(w4+y*(w5+y*w6))))); + r = (x-0.5f)*(t-1.0f)+w; + } else /* 2**58 <= x <= inf */ + r = x*(logf(x)-1.0f); + if (sign) + r = nadj - r; + return r; +} diff --git a/libc/fmt/imaxabs.thunk.S b/libc/tinymath/nan.c similarity index 84% rename from libc/fmt/imaxabs.thunk.S rename to libc/tinymath/nan.c index 6f402513740..a2bc5b0e1ed 100644 --- a/libc/fmt/imaxabs.thunk.S +++ b/libc/tinymath/nan.c @@ -1,7 +1,7 @@ -/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│ -│vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi│ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ ╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ +│ Copyright 2022 Justine Alexandra Roberts Tunney │ │ │ │ Permission to use, copy, modify, and/or distribute this software for │ │ any purpose with or without fee is hereby granted, provided that the │ @@ -16,8 +16,8 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ -#include "libc/macros.internal.h" +#include "libc/math.h" -__imaxabs: - jmp imaxabs - .endfn __imaxabs,globl +double nan(const char *s) { + return NAN; +} diff --git a/libc/tinymath/nanf.c b/libc/tinymath/nanf.c new file mode 100644 index 00000000000..d1023fb6085 --- /dev/null +++ b/libc/tinymath/nanf.c @@ -0,0 +1,23 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2022 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/math.h" + +float nanf(const char *s) { + return NAN; +} diff --git a/libc/tinymath/nanl.c b/libc/tinymath/nanl.c new file mode 100644 index 00000000000..fb16dc09e81 --- /dev/null +++ b/libc/tinymath/nanl.c @@ -0,0 +1,23 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2022 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/math.h" + +long double nanl(const char *s) { + return NAN; +} diff --git a/libc/tinymath/sindf.c b/libc/tinymath/sindf.c new file mode 100644 index 00000000000..3ea45935fc6 --- /dev/null +++ b/libc/tinymath/sindf.c @@ -0,0 +1,72 @@ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ +│vi: set et ft=c ts=8 tw=8 fenc=utf-8 :vi│ +╚──────────────────────────────────────────────────────────────────────────────╝ +│ │ +│ Musl Libc │ +│ Copyright © 2005-2020 Rich Felker, et al. │ +│ │ +│ Permission is hereby granted, free of charge, to any person obtaining │ +│ a copy of this software and associated documentation files (the │ +│ "Software"), to deal in the Software without restriction, including │ +│ without limitation the rights to use, copy, modify, merge, publish, │ +│ distribute, sublicense, and/or sell copies of the Software, and to │ +│ permit persons to whom the Software is furnished to do so, subject to │ +│ the following conditions: │ +│ │ +│ The above copyright notice and this permission notice shall be │ +│ included in all copies or substantial portions of the Software. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ +│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ +│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ +│ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY │ +│ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, │ +│ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE │ +│ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ +│ │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/math.h" + +asm(".ident\t\"\\n\\n\ +fdlibm (fdlibm license)\\n\ +Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.\""); +asm(".ident\t\"\\n\\n\ +Musl libc (MIT License)\\n\ +Copyright 2005-2014 Rich Felker, et. al.\""); +asm(".include \"libc/disclaimer.inc\""); +/* clang-format off */ + +/* origin: FreeBSD /usr/src/lib/msun/src/k_sinf.c */ +/* + * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. + * Optimized by Bruce D. Evans. + */ +/* + * ==================================================== + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + * + * Developed at SunPro, a Sun Microsystems, Inc. business. + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ + +/* |sin(x)/x - s(x)| < 2**-37.5 (~[-4.89e-12, 4.824e-12]). */ +static const double +S1 = -0x15555554cbac77.0p-55, /* -0.166666666416265235595 */ +S2 = 0x111110896efbb2.0p-59, /* 0.0083333293858894631756 */ +S3 = -0x1a00f9e2cae774.0p-65, /* -0.000198393348360966317347 */ +S4 = 0x16cd878c3b46a7.0p-71; /* 0.0000027183114939898219064 */ + +float __sindf(double x) +{ + double_t r, s, w, z; + + /* Try to optimize for parallel evaluation as in __tandf.c. */ + z = x*x; + w = z*z; + r = S3 + z*S4; + s = z*x; + return (x + s*(S1 + z*S2)) + s*w*r; +} diff --git a/libc/tinymath/tandf.c b/libc/tinymath/tandf.c new file mode 100644 index 00000000000..c6a7b06baa5 --- /dev/null +++ b/libc/tinymath/tandf.c @@ -0,0 +1,90 @@ +/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│ +│vi: set et ft=c ts=8 tw=8 fenc=utf-8 :vi│ +╚──────────────────────────────────────────────────────────────────────────────╝ +│ │ +│ Musl Libc │ +│ Copyright © 2005-2020 Rich Felker, et al. │ +│ │ +│ Permission is hereby granted, free of charge, to any person obtaining │ +│ a copy of this software and associated documentation files (the │ +│ "Software"), to deal in the Software without restriction, including │ +│ without limitation the rights to use, copy, modify, merge, publish, │ +│ distribute, sublicense, and/or sell copies of the Software, and to │ +│ permit persons to whom the Software is furnished to do so, subject to │ +│ the following conditions: │ +│ │ +│ The above copyright notice and this permission notice shall be │ +│ included in all copies or substantial portions of the Software. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │ +│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │ +│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │ +│ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY │ +│ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, │ +│ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE │ +│ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ +│ │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/math.h" + +asm(".ident\t\"\\n\\n\ +fdlibm (fdlibm license)\\n\ +Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.\""); +asm(".ident\t\"\\n\\n\ +Musl libc (MIT License)\\n\ +Copyright 2005-2014 Rich Felker, et. al.\""); +asm(".include \"libc/disclaimer.inc\""); +/* clang-format off */ + +/* origin: FreeBSD /usr/src/lib/msun/src/k_tanf.c */ +/* + * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. + * Optimized by Bruce D. Evans. + */ +/* + * ==================================================== + * Copyright 2004 Sun Microsystems, Inc. All Rights Reserved. + * + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ + +/* |tan(x)/x - t(x)| < 2**-25.5 (~[-2e-08, 2e-08]). */ +static const double T[] = { + 0x15554d3418c99f.0p-54, /* 0.333331395030791399758 */ + 0x1112fd38999f72.0p-55, /* 0.133392002712976742718 */ + 0x1b54c91d865afe.0p-57, /* 0.0533812378445670393523 */ + 0x191df3908c33ce.0p-58, /* 0.0245283181166547278873 */ + 0x185dadfcecf44e.0p-61, /* 0.00297435743359967304927 */ + 0x1362b9bf971bcd.0p-59, /* 0.00946564784943673166728 */ +}; + +float __tandf(double x, int odd) +{ + double_t z,r,w,s,t,u; + + z = x*x; + /* + * Split up the polynomial into small independent terms to give + * opportunities for parallel evaluation. The chosen splitting is + * micro-optimized for Athlons (XP, X64). It costs 2 multiplications + * relative to Horner's method on sequential machines. + * + * We add the small terms from lowest degree up for efficiency on + * non-sequential machines (the lowest degree terms tend to be ready + * earlier). Apart from this, we don't care about order of + * operations, and don't need to to care since we have precision to + * spare. However, the chosen splitting is good for accuracy too, + * and would give results as accurate as Horner's method if the + * small terms were added from highest degree down. + */ + r = T[4] + z*T[5]; + t = T[2] + z*T[3]; + w = z*z; + s = z*x; + u = T[0] + z*T[1]; + r = (x + s*u) + (s*w)*(t + w*r); + return odd ? -1.0/r : r; +} diff --git a/libc/unicode/isdigit_l.c b/libc/unicode/isdigit_l.c new file mode 100644 index 00000000000..ec1ec68e0f8 --- /dev/null +++ b/libc/unicode/isdigit_l.c @@ -0,0 +1,24 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2022 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/str/str.h" +#include "libc/unicode/locale.h" + +int isdigit_l(int c, locale_t l) { + return iswdigit(c); +} diff --git a/libc/unicode/isxdigit_l.c b/libc/unicode/isxdigit_l.c new file mode 100644 index 00000000000..b11f4bbc4b6 --- /dev/null +++ b/libc/unicode/isxdigit_l.c @@ -0,0 +1,24 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2022 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/str/str.h" +#include "libc/unicode/locale.h" + +int isxdigit_l(int c, locale_t l) { + return iswxdigit(c); +} diff --git a/libc/unicode/locale.h b/libc/unicode/locale.h index d8f082fbbed..81f1ee1ea52 100644 --- a/libc/unicode/locale.h +++ b/libc/unicode/locale.h @@ -1,5 +1,6 @@ #ifndef COSMOPOLITAN_LIBC_UNICODE_LOCALE_H_ #define COSMOPOLITAN_LIBC_UNICODE_LOCALE_H_ +#include "libc/fmt/conv.h" #define LC_CTYPE 0 #define LC_NUMERIC 1 @@ -19,7 +20,24 @@ #if !(__ASSEMBLER__ + __LINKER__ + 0) COSMOPOLITAN_C_START_ +struct __locale_struct; +typedef struct __locale_struct *locale_t; + char *setlocale(int, const char *); +locale_t uselocale(locale_t); +locale_t newlocale(int, const char *, locale_t); +long long strtoll_l(const char *, char **, int, locale_t); +unsigned long long strtoull_l(const char *, char **, int, locale_t); +long long wcstoll_l(const wchar_t *, wchar_t **, int, locale_t); +unsigned long long wcstoull_l(const wchar_t *, wchar_t **, int, locale_t); +float strtof_l(const char *, char **, locale_t); +float wcstof_l(const wchar_t *, wchar_t **, locale_t); +double wcstod_l(const wchar_t *, wchar_t **, locale_t); +long double wcstold_l(const wchar_t *, wchar_t **, locale_t); +double strtod_l(const char *, char **, locale_t); +long double strtold_l(const char *, char **, locale_t); +int isxdigit_l(int, locale_t); +int isdigit_l(int, locale_t); COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ diff --git a/libc/x/x.h b/libc/x/x.h index a4d2b5ea2ab..a904caa9376 100644 --- a/libc/x/x.h +++ b/libc/x/x.h @@ -14,7 +14,7 @@ COSMOPOLITAN_C_START_ Standard Library veneers for folks not building embedded RTOS */ #define _XPNN paramsnonnull() -#define _XRET nothrow nocallback nodiscard returnsnonnull +#define _XRET dontthrow nocallback dontdiscard returnsnonnull #define _XMAL returnspointerwithnoaliases _XRET #define _XMALPG returnsaligned((PAGESIZE)) _XMAL @@ -38,7 +38,7 @@ char *xvasprintf(const char *, va_list) _XPNN _XMAL; char *xgetline(struct FILE *) _XPNN mallocesque; void *xmalloc(size_t) attributeallocsize((1)) _XMAL; void *xrealloc(void *, size_t) - attributeallocsize((2)) nothrow nocallback nodiscard; + attributeallocsize((2)) dontthrow nocallback dontdiscard; void *xcalloc(size_t, size_t) attributeallocsize((1, 2)) _XMAL; void *xvalloc(size_t) attributeallocsize((1)) _XMALPG; void *xmemalign(size_t, size_t) attributeallocalign((1)) @@ -52,13 +52,13 @@ char *xstrmul(const char *, size_t) paramsnonnull((1)) _XMAL; char *xinet_ntop(int, const void *) _XPNN _XMAL; void *xunbinga(size_t, const char16_t *) attributeallocalign((1)) _XMAL _XRET; void *xunbing(const char16_t *) _XMAL _XRET; -char16_t *utf8toutf16(const char *, size_t, size_t *) nodiscard; -char *utf16toutf8(const char16_t *, size_t, size_t *) nodiscard; -wchar_t *utf8toutf32(const char *, size_t, size_t *) nodiscard; -wchar_t *utf16to32(const char16_t *, size_t, size_t *) nodiscard; -char *xhomedir(void) nodiscard; -char *xstripext(const char *) nodiscard; -char *xstripexts(const char *) nodiscard; +char16_t *utf8toutf16(const char *, size_t, size_t *) dontdiscard; +char *utf16toutf8(const char16_t *, size_t, size_t *) dontdiscard; +wchar_t *utf8toutf32(const char *, size_t, size_t *) dontdiscard; +wchar_t *utf16to32(const char16_t *, size_t, size_t *) dontdiscard; +char *xhomedir(void) dontdiscard; +char *xstripext(const char *) dontdiscard; +char *xstripexts(const char *) dontdiscard; void *xload(bool *, void **, const void *, size_t, size_t); void *xloadzd(bool *, void **, const void *, size_t, size_t, size_t, size_t, uint32_t); @@ -88,7 +88,7 @@ char *xiso8601ts(struct timespec *) mallocesque; void *xslurp(const char *, size_t *) paramsnonnull((1)) returnspointerwithnoaliases - returnsaligned((PAGESIZE)) nodiscard; + returnsaligned((PAGESIZE)) dontdiscard; int xbarf(const char *, const void *, size_t); /*───────────────────────────────────────────────────────────────────────────│─╗ diff --git a/test/libc/alg/critbit0_test.c b/test/libc/alg/critbit0_test.c index cf863c9ceb6..0ee2581c028 100644 --- a/test/libc/alg/critbit0_test.c +++ b/test/libc/alg/critbit0_test.c @@ -29,7 +29,7 @@ struct Bog { const char *p[]; }; -static testonly nodiscard struct Bog *NewBog(unsigned n) { +static testonly dontdiscard struct Bog *NewBog(unsigned n) { struct Bog *res = malloc(sizeof(struct Bog) + sizeof(const char *) * n); res->i = 0; res->n = n; diff --git a/test/libc/fmt/atoi_test.c b/test/libc/fmt/atoi_test.c index 0b491c9dc86..a36ff54e32a 100644 --- a/test/libc/fmt/atoi_test.c +++ b/test/libc/fmt/atoi_test.c @@ -306,24 +306,24 @@ TEST(strtoimax, testEndPtr) { ASSERT_EQ(1, e - p); } -TEST(strtoimax, testLimits) { +TEST(strtoi128, testLimits) { EXPECT_EQ( - ((uintmax_t)0xffffffffffffffff) << 64 | (uintmax_t)0xffffffffffffffff, - strtoimax("-1", NULL, 0)); + ((uint128_t)0xffffffffffffffff) << 64 | (uint128_t)0xffffffffffffffff, + strtoi128("-1", NULL, 0)); EXPECT_EQ( - ((uintmax_t)0x7fffffffffffffff) << 64 | (uintmax_t)0xffffffffffffffff, - strtoimax("0x7fffffffffffffffffffffffffffffff", NULL, 0)); + ((uint128_t)0x7fffffffffffffff) << 64 | (uint128_t)0xffffffffffffffff, + strtoi128("0x7fffffffffffffffffffffffffffffff", NULL, 0)); } -TEST(strtoimax, testOutsideLimit) { +TEST(strtoi128, testOutsideLimit) { errno = 0; EXPECT_EQ( - ((uintmax_t)0x7fffffffffffffff) << 64 | (uintmax_t)0xffffffffffffffff, - strtoimax("0x80000000000000000000000000000000", NULL, 0)); + ((uint128_t)0x7fffffffffffffff) << 64 | (uint128_t)0xffffffffffffffff, + strtoi128("0x80000000000000000000000000000000", NULL, 0)); EXPECT_EQ(ERANGE, errno); errno = 0; - EXPECT_EQ(((uintmax_t)0x8000000000000000) << 64 | 0x0000000000000000, - strtoimax("-0x80000000000000000000000000000001", NULL, 0)); + EXPECT_EQ(((uint128_t)0x8000000000000000) << 64 | 0x0000000000000000, + strtoi128("-0x80000000000000000000000000000001", NULL, 0)); EXPECT_EQ(ERANGE, errno); } @@ -335,6 +335,7 @@ TEST(strtoul, neghex) { TEST(strtoumax, testZero) { EXPECT_EQ(UINTMAX_MIN, strtoumax("0", NULL, 0)); + EXPECT_EQ(UINT128_MIN, strtou128("0", NULL, 0)); } TEST(strtoumax, testDecimal) { EXPECT_EQ(123, strtoumax("123", NULL, 0)); @@ -353,16 +354,16 @@ TEST(strtoumax, testBinary) { EXPECT_EQ(42, strtoumax("0b101010", NULL, 2)); } -TEST(strtoumax, testMaximum) { - EXPECT_EQ(UINTMAX_MAX, - strtoumax("340282366920938463463374607431768211455", NULL, 0)); - EXPECT_EQ(UINTMAX_MAX, - strtoumax("0xffffffffffffffffffffffffffffffff", NULL, 0)); +TEST(strtou128, test128imum) { + EXPECT_EQ(UINT128_MAX, + strtou128("340282366920938463463374607431768211455", NULL, 0)); + EXPECT_EQ(UINT128_MAX, + strtou128("0xffffffffffffffffffffffffffffffff", NULL, 0)); } -TEST(strtoumax, testTwosBane) { - EXPECT_EQ(((uintmax_t)0x8000000000000000) << 64 | 0x0000000000000000, - strtoumax("0x80000000000000000000000000000000", NULL, 0)); +TEST(strtou128, testTwosBane) { + EXPECT_EQ(((uint128_t)0x8000000000000000) << 64 | 0x0000000000000000, + strtou128("0x80000000000000000000000000000000", NULL, 0)); } TEST(wcstol, test) { @@ -566,4 +567,12 @@ BENCH(atoi, bench) { EXPROPRIATE(wcstoimax(VEIL("r", L"100000000"), 0, 10))); EZBENCH2("wcstoumax 10⁸", donothing, EXPROPRIATE(wcstoimax(VEIL("r", L"100000000"), 0, 10))); + EZBENCH2("strtoi128 10⁸", donothing, + EXPROPRIATE(strtoi128(VEIL("r", "100000000"), 0, 10))); + EZBENCH2("strtou128 10⁸", donothing, + EXPROPRIATE(strtoi128(VEIL("r", "100000000"), 0, 10))); + EZBENCH2("wcstoi128 10⁸", donothing, + EXPROPRIATE(wcstoi128(VEIL("r", L"100000000"), 0, 10))); + EZBENCH2("wcstou128 10⁸", donothing, + EXPROPRIATE(wcstoi128(VEIL("r", L"100000000"), 0, 10))); } diff --git a/test/libc/fmt/palandprintf_test.c b/test/libc/fmt/palandprintf_test.c index fd2d24c4df3..4ee153a668d 100644 --- a/test/libc/fmt/palandprintf_test.c +++ b/test/libc/fmt/palandprintf_test.c @@ -572,7 +572,7 @@ TEST(xasprintf, hugeNtoa) { ASSERT_STREQ( "0b1111111111111111111111111111111111111111111111111111111111111111111111" "1111111111111111111111111111111111111111111111111111111111", - gc(xasprintf("%#jb", UINT128_MAX))); + gc(xasprintf("%#jjb", UINT128_MAX))); } TEST(xasprintf, twosBane) { @@ -591,20 +591,19 @@ TEST(snprintf, testFixedWidthString_wontOverrunInput) { free(buf); } -/* TODO(jart): why is this weird in TINY mode? */ -/* TEST(snprintf, testFixedWidthStringIsNull_wontOverrunBuffer) { */ -/* int N = 3; */ -/* char *buf = malloc(N + 1); */ -/* EXPECT_EQ(3, snprintf(buf, N + 1, "%.*s", pushpop(N), pushpop(NULL))); */ -/* EXPECT_STREQ("(nu", buf); */ -/* EXPECT_EQ(3, snprintf(buf, N + 1, "%#.*s", pushpop(N), pushpop(NULL))); */ -/* EXPECT_STREQ("(nu", buf); */ -/* EXPECT_EQ(3, snprintf(buf, N + 1, "%`'.*s", pushpop(N), pushpop(NULL))); */ -/* EXPECT_STREQ("NUL", buf); */ -/* EXPECT_EQ(3, snprintf(buf, N + 1, "%`#.*s", pushpop(N), pushpop(NULL))); */ -/* EXPECT_STREQ("NUL", buf); */ -/* free(buf); */ -/* } */ +TEST(snprintf, testFixedWidthStringIsNull_wontOverrunBuffer) { + int N = 3; + char *buf = malloc(N + 1); + EXPECT_EQ(3, snprintf(buf, N + 1, "%.*s", pushpop(N), pushpop(NULL))); + EXPECT_STREQ("(nu", buf); + EXPECT_EQ(3, snprintf(buf, N + 1, "%#.*s", pushpop(N), pushpop(NULL))); + EXPECT_STREQ("(nu", buf); + EXPECT_EQ(3, snprintf(buf, N + 1, "%`'.*s", pushpop(N), pushpop(NULL))); + EXPECT_STREQ("NUL", buf); + EXPECT_EQ(3, snprintf(buf, N + 1, "%`#.*s", pushpop(N), pushpop(NULL))); + EXPECT_STREQ("NUL", buf); + free(buf); +} TEST(snprintf, twosBaneWithTypePromotion) { int16_t x = 0x8000; @@ -646,14 +645,10 @@ BENCH(palandprintf, bench) { EZBENCH2("INT_MIN %d", donothing, Format("%d", VEIL("r", INT_MIN))); EZBENCH2("INT_MIN %,d", donothing, Format("%,d", VEIL("r", INT_MIN))); EZBENCH2("INT_MIN %ld", donothing, Format("%ld", (long)VEIL("r", INT_MIN))); - EZBENCH2("INT_MIN %jd", donothing, - Format("%jd", (intmax_t)VEIL("r", INT_MIN))); EZBENCH2("LONG_MIN %lx", donothing, Format("%lx", VEIL("r", LONG_MIN))); EZBENCH2("LONG_MIN %ld", donothing, Format("%ld", VEIL("r", LONG_MIN))); - EZBENCH2("LONG_MIN %jd", donothing, - Format("%jd", (intmax_t)VEIL("r", LONG_MIN))); - EZBENCH2("LONG_MIN %jx", donothing, - Format("%jx", (intmax_t)VEIL("r", LONG_MIN))); + EZBENCH2("INT128_MIN %jjd", donothing, Format("%jjd", INT128_MIN)); + EZBENCH2("INT128_MIN %jjx", donothing, Format("%jjx", INT128_MIN)); EZBENCH2("int64toarray 23", donothing, int64toarray_radix10(23, buffer)); EZBENCH2("int64toarray min", donothing, int64toarray_radix10(INT_MIN, buffer)); diff --git a/test/libc/fmt/sscanf_test.c b/test/libc/fmt/sscanf_test.c index 763af0e4a88..7705985d307 100644 --- a/test/libc/fmt/sscanf_test.c +++ b/test/libc/fmt/sscanf_test.c @@ -26,7 +26,7 @@ #define sscanf1(STR, FMT) \ ({ \ errno = 0; \ - intmax_t x = 0; \ + int128_t x = 0; \ EXPECT_EQ(1, sscanf(STR, FMT, &x)); \ x; \ }) @@ -50,11 +50,11 @@ TEST(sscanf, testHex) { EXPECT_EQ(0x123, sscanf1("123", "%x")); EXPECT_EQ(0x123, sscanf1("0x123", "%x")); EXPECT_EQ(0x123, sscanf1("0123", "%x")); - EXPECT_EQ(INTMAX_MAX, - sscanf1("170141183460469231731687303715884105727", "%jd")); - EXPECT_EQ(INTMAX_MIN, - sscanf1("-170141183460469231731687303715884105728", "%jd")); - EXPECT_EQ(UINTMAX_MAX, sscanf1("0xffffffffffffffffffffffffffffffff", "%jx")); + EXPECT_EQ(INT128_MAX, + sscanf1("170141183460469231731687303715884105727", "%jjd")); + EXPECT_EQ(INT128_MIN, + sscanf1("-170141183460469231731687303715884105728", "%jjd")); + EXPECT_EQ(UINT128_MAX, sscanf1("0xffffffffffffffffffffffffffffffff", "%jjx")); } TEST(sscanf, testOctal) { diff --git a/test/libc/mem/test.mk b/test/libc/mem/test.mk index 037d0de9579..63b50a2d43c 100644 --- a/test/libc/mem/test.mk +++ b/test/libc/mem/test.mk @@ -3,61 +3,68 @@ PKGS += TEST_LIBC_MEM -TEST_LIBC_MEM_SRCS := $(wildcard test/libc/mem/*.c) -TEST_LIBC_MEM_SRCS_TEST = $(filter %_test.c,$(TEST_LIBC_MEM_SRCS)) +TEST_LIBC_MEM_FILES := $(wildcard test/libc/mem/*) +TEST_LIBC_MEM_SRCS_C = $(filter %_test.c,$(TEST_LIBC_MEM_FILES)) +TEST_LIBC_MEM_SRCS_CC = $(filter %_test.cc,$(TEST_LIBC_MEM_FILES)) -TEST_LIBC_MEM_OBJS = \ - $(TEST_LIBC_MEM_SRCS:%.c=o/$(MODE)/%.o) +TEST_LIBC_MEM_OBJS = \ + $(TEST_LIBC_MEM_SRCS_C:%.c=o/$(MODE)/%.o) \ + $(TEST_LIBC_MEM_SRCS_CC:%.cc=o/$(MODE)/%.o) -TEST_LIBC_MEM_COMS = \ - $(TEST_LIBC_MEM_SRCS:%.c=o/$(MODE)/%.com) +TEST_LIBC_MEM_COMS = \ + $(TEST_LIBC_MEM_SRCS_C:%.c=o/$(MODE)/%.com) \ + $(TEST_LIBC_MEM_SRCS_CC:%.cc=o/$(MODE)/%.com) -TEST_LIBC_MEM_BINS = \ - $(TEST_LIBC_MEM_COMS) \ +TEST_LIBC_MEM_BINS = \ + $(TEST_LIBC_MEM_COMS) \ $(TEST_LIBC_MEM_COMS:%=%.dbg) -TEST_LIBC_MEM_TESTS = $(TEST_LIBC_MEM_SRCS_TEST:%.c=o/$(MODE)/%.com.ok) - -TEST_LIBC_MEM_CHECKS = \ - $(TEST_LIBC_MEM_SRCS_TEST:%.c=o/$(MODE)/%.com.runs) - -TEST_LIBC_MEM_DIRECTDEPS = \ - LIBC_CALLS \ - LIBC_FMT \ - LIBC_INTRIN \ - LIBC_LOG \ - LIBC_MEM \ - LIBC_NEXGEN32E \ - LIBC_RAND \ - LIBC_RUNTIME \ - LIBC_STDIO \ - LIBC_STR \ - LIBC_STUBS \ - LIBC_SYSV \ - LIBC_TESTLIB \ - THIRD_PARTY_DLMALLOC - -TEST_LIBC_MEM_DEPS := \ +TEST_LIBC_MEM_TESTS = \ + $(TEST_LIBC_MEM_SRCS_C:%.c=o/$(MODE)/%.com.ok) \ + $(TEST_LIBC_MEM_SRCS_CC:%.cc=o/$(MODE)/%.com.ok) + +TEST_LIBC_MEM_CHECKS = \ + $(TEST_LIBC_MEM_SRCS_C:%.c=o/$(MODE)/%.com.runs) \ + $(TEST_LIBC_MEM_SRCS_CC:%.cc=o/$(MODE)/%.com.runs) + +TEST_LIBC_MEM_DIRECTDEPS = \ + LIBC_CALLS \ + LIBC_FMT \ + LIBC_INTRIN \ + LIBC_LOG \ + LIBC_MEM \ + LIBC_NEXGEN32E \ + LIBC_RAND \ + LIBC_RUNTIME \ + LIBC_STDIO \ + LIBC_STR \ + LIBC_STUBS \ + LIBC_SYSV \ + LIBC_TESTLIB \ + THIRD_PARTY_DLMALLOC \ + THIRD_PARTY_LIBCXX + +TEST_LIBC_MEM_DEPS := \ $(call uniq,$(foreach x,$(TEST_LIBC_MEM_DIRECTDEPS),$($(x)))) -o/$(MODE)/test/libc/mem/mem.pkg: \ - $(TEST_LIBC_MEM_OBJS) \ +o/$(MODE)/test/libc/mem/mem.pkg: \ + $(TEST_LIBC_MEM_OBJS) \ $(foreach x,$(TEST_LIBC_MEM_DIRECTDEPS),$($(x)_A).pkg) -o/$(MODE)/test/libc/mem/%.com.dbg: \ - $(TEST_LIBC_MEM_DEPS) \ - o/$(MODE)/test/libc/mem/%.o \ - o/$(MODE)/test/libc/mem/mem.pkg \ - $(LIBC_TESTMAIN) \ - $(CRT) \ +o/$(MODE)/test/libc/mem/%.com.dbg: \ + $(TEST_LIBC_MEM_DEPS) \ + o/$(MODE)/test/libc/mem/%.o \ + o/$(MODE)/test/libc/mem/mem.pkg \ + $(LIBC_TESTMAIN) \ + $(CRT) \ $(APE) @$(APELINK) -$(TEST_LIBC_MEM_OBJS): \ - DEFAULT_CCFLAGS += \ +$(TEST_LIBC_MEM_OBJS): \ + DEFAULT_CCFLAGS += \ -fno-builtin .PHONY: o/$(MODE)/test/libc/mem -o/$(MODE)/test/libc/mem: \ - $(TEST_LIBC_MEM_BINS) \ +o/$(MODE)/test/libc/mem: \ + $(TEST_LIBC_MEM_BINS) \ $(TEST_LIBC_MEM_CHECKS) diff --git a/test/libc/nexgen32e/memeqmask_test.c b/test/libc/nexgen32e/memeqmask_test.c index ef43e7ca2c6..dfedfc68d53 100644 --- a/test/libc/nexgen32e/memeqmask_test.c +++ b/test/libc/nexgen32e/memeqmask_test.c @@ -55,7 +55,7 @@ const char kM[] = "11111111100000000000100000000000" "01111111111111111111111111111110" "00000000000000000000000000000010"; -nodiscard char *binify(uint8_t *data, size_t size) { +dontdiscard char *binify(uint8_t *data, size_t size) { uint8_t b; size_t i, j; char *s, *p; diff --git a/test/libc/sock/poll_test.c b/test/libc/sock/poll_test.c index da9b543f51e..1ae1c8018f1 100644 --- a/test/libc/sock/poll_test.c +++ b/test/libc/sock/poll_test.c @@ -29,7 +29,7 @@ #include "tool/decode/lib/flagger.h" #include "tool/decode/lib/pollnames.h" -nodiscard char *FormatPollFd(struct pollfd p[2]) { +dontdiscard char *FormatPollFd(struct pollfd p[2]) { return xasprintf("fd:%d revents:%s\n" "fd:%d revents:%s\n", p[0].fd, gc(RecreateFlags(kPollNames, p[0].revents)), diff --git a/test/libc/xed/lib.h b/test/libc/xed/lib.h index 97b0c80d2b5..a9d5ebe6f0f 100644 --- a/test/libc/xed/lib.h +++ b/test/libc/xed/lib.h @@ -6,7 +6,7 @@ COSMOPOLITAN_C_START_ int ild(const char16_t *codez); int ildreal(const char16_t *codez); int ildlegacy(const char16_t *codez); -uint8_t *unbingx86op(const char16_t *codez) nodiscard; +uint8_t *unbingx86op(const char16_t *codez) dontdiscard; COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ diff --git a/test/libc/xed/x86ild_lib.c b/test/libc/xed/x86ild_lib.c index c94bc497689..8f362911a38 100644 --- a/test/libc/xed/x86ild_lib.c +++ b/test/libc/xed/x86ild_lib.c @@ -25,7 +25,7 @@ #include "test/libc/xed/lib.h" #include "third_party/xed/x86.h" -testonly nodiscard uint8_t *unbingx86op(const char16_t *codez) { +testonly dontdiscard uint8_t *unbingx86op(const char16_t *codez) { size_t len; len = strlen16(codez); return unbingbuf(xmalloc(ROUNDUP(len, 16)), len, codez, 0x90); diff --git a/third_party/argon2/blake2b.c b/third_party/argon2/blake2b.c index 89ec078abb9..b004e8ef5d7 100644 --- a/third_party/argon2/blake2b.c +++ b/third_party/argon2/blake2b.c @@ -39,7 +39,8 @@ static const uint64_t blake2b_IV[8] = { UINT64_C(0x6a09e667f3bcc908), UINT64_C(0xbb67ae8584caa73b), UINT64_C(0x3c6ef372fe94f82b), UINT64_C(0xa54ff53a5f1d36f1), UINT64_C(0x510e527fade682d1), UINT64_C(0x9b05688c2b3e6c1f), - UINT64_C(0x1f83d9abfb41bd6b), UINT64_C(0x5be0cd19137e2179)}; + UINT64_C(0x1f83d9abfb41bd6b), UINT64_C(0x5be0cd19137e2179), +}; static const unsigned int blake2b_sigma[12][16] = { {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, diff --git a/third_party/chibicc/parse.c b/third_party/chibicc/parse.c index fb6407b4c0b..2d06faee329 100644 --- a/third_party/chibicc/parse.c +++ b/third_party/chibicc/parse.c @@ -555,7 +555,7 @@ static Token *thing_attributes(Token *tok, void *arg) { consume_attribute(&tok, tok, "warn_unused_result") || consume_attribute(&tok, tok, "flatten") || consume_attribute(&tok, tok, "leaf") || - consume_attribute(&tok, tok, "nothrow") || + consume_attribute(&tok, tok, "dontthrow") || consume_attribute(&tok, tok, "optnone") || consume_attribute(&tok, tok, "returns_twice") || consume_attribute(&tok, tok, "nodebug") || diff --git a/third_party/chibicc/preprocess.c b/third_party/chibicc/preprocess.c index 8eda785ca2c..854ca53d650 100644 --- a/third_party/chibicc/preprocess.c +++ b/third_party/chibicc/preprocess.c @@ -1105,6 +1105,10 @@ __INT64_TYPE__\000\ long int\000\ __UINT64_TYPE__\000\ long unsigned int\000\ +__INTMAX_TYPE__\000\ +long int\000\ +__UINTMAX_TYPE__\000\ +long unsigned int\000\ __INTPTR_TYPE__\000\ long int\000\ __UINTPTR_TYPE__\000\ diff --git a/third_party/chibicc/test/common.c b/third_party/chibicc/test/common.c index baada92665e..f2b346b29f2 100644 --- a/third_party/chibicc/test/common.c +++ b/third_party/chibicc/test/common.c @@ -17,8 +17,8 @@ void Assert2(long expected, long actual, char *code, char *func, int line) { void Assert128(__int128 k, __int128 x, char *code, char *func, int line) { if (k != x) { - fprintf(stderr, "%s:%d: %s => want %jd but got %jd\n", func, line, code, k, - x); + fprintf(stderr, "%s:%d: %s => want %jjd but got %jjd\n", func, line, code, + k, x); exit(1); } } diff --git a/third_party/chibicc/test/int128_test.c b/third_party/chibicc/test/int128_test.c index 474b822c825..c84532252da 100644 --- a/third_party/chibicc/test/int128_test.c +++ b/third_party/chibicc/test/int128_test.c @@ -38,8 +38,8 @@ __int128 sub128x6(int f, __int128 a, __int128 b, __int128 c, __int128 d, return f - a - b - c - d - e; } -void lotsOfArgs(const char *file, int line, const char *func, intmax_t beg, - intmax_t end, intmax_t got, const char *gotcode, bool isfatal) { +void lotsOfArgs(const char *file, int line, const char *func, int128_t beg, + int128_t end, int128_t got, const char *gotcode, bool isfatal) { } void testLang128(void) { @@ -8176,7 +8176,7 @@ void testNot128(void) { void testAbi(void) { ASSERT(0, ({ char buf[200]; - sprintf(buf, "%d %d %d %d %032jx %032jx", 1, 2, 3, 4, + sprintf(buf, "%d %d %d %d %032jjx %032jjx", 1, 2, 3, 4, I128(0x1ffffffff, 0x2ffffffff), I128(0x3eeeeeeee, 0x4eeeeeeee)); strcmp("1 2 3 4 00000001ffffffff00000002ffffffff " @@ -8185,7 +8185,7 @@ void testAbi(void) { })); ASSERT(0, ({ char buf[200]; - sprintf(buf, "%d %d %d %d %d %032jx %032jx", 1, 2, 3, 4, 5, + sprintf(buf, "%d %d %d %d %d %032jjx %032jjx", 1, 2, 3, 4, 5, I128(0x1ffffffff, 0x2ffffffff), I128(0x3eeeeeeee, 0x4eeeeeeee)); strcmp("1 2 3 4 5 00000001ffffffff00000002ffffffff " diff --git a/third_party/compiler_rt/int_types.h b/third_party/compiler_rt/int_types.h index dd6c738244e..49a11354fa0 100644 --- a/third_party/compiler_rt/int_types.h +++ b/third_party/compiler_rt/int_types.h @@ -1,5 +1,4 @@ /* clang-format off */ -/* clang-format off */ /* ===-- int_lib.h - configuration header for compiler-rt -----------------=== * * The LLVM Compiler Infrastructure diff --git a/third_party/dlmalloc/dlmalloc.internal.h b/third_party/dlmalloc/dlmalloc.internal.h index 1c8bdd67a28..596a15ac3f2 100644 --- a/third_party/dlmalloc/dlmalloc.internal.h +++ b/third_party/dlmalloc/dlmalloc.internal.h @@ -1290,12 +1290,12 @@ void do_check_malloc_state(mstate) hidden; void *dlmalloc(size_t) hidden attributeallocsize((1)) mallocesque; void *dlcalloc(size_t, size_t) hidden attributeallocsize((1, 2)) mallocesque; -void dlfree(void *) nothrow nocallback hidden; +void dlfree(void *) dontthrow nocallback hidden; void *dlmemalign_impl(mstate, size_t, size_t) hidden; void *dlrealloc(void *, size_t) hidden reallocesque; void *dlrealloc_in_place(void *, size_t) hidden reallocesque; void *dlmemalign(size_t, size_t) hidden attributeallocalign((1)) - attributeallocsize((2)) returnspointerwithnoaliases libcesque nodiscard; + attributeallocsize((2)) returnspointerwithnoaliases libcesque dontdiscard; int dlmalloc_trim(size_t) hidden; size_t dlmalloc_usable_size(const void *) hidden; void **dlindependent_calloc(size_t, size_t, void *[]) hidden; diff --git a/third_party/gdtoa/gdtoa.h b/third_party/gdtoa/gdtoa.h index 42b9a9ac5b4..83d331dd843 100644 --- a/third_party/gdtoa/gdtoa.h +++ b/third_party/gdtoa/gdtoa.h @@ -92,6 +92,10 @@ int strtopxL(const char *, char **, void *); #define strtopxL(s, se, x) strtorxL(s, se, 1, x) #endif +float wcstof(const wchar_t *, wchar_t **); +double wcstod(const wchar_t *, wchar_t **); +long double wcstold(const wchar_t *, wchar_t **); + COSMOPOLITAN_C_END_ #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ #endif /* COSMOPOLITAN_THIRD_PARTY_GDTOA_GDTOA_H_ */ diff --git a/third_party/gdtoa/strtod_l.c b/third_party/gdtoa/strtod_l.c new file mode 100644 index 00000000000..34689400444 --- /dev/null +++ b/third_party/gdtoa/strtod_l.c @@ -0,0 +1,24 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2022 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/unicode/locale.h" +#include "third_party/gdtoa/gdtoa.h" + +double strtod_l(const char *s, char **endptr, locale_t l) { + return strtod(s, endptr); +} diff --git a/third_party/gdtoa/strtof.c b/third_party/gdtoa/strtof.c index 3fb2f251807..4017171b583 100644 --- a/third_party/gdtoa/strtof.c +++ b/third_party/gdtoa/strtof.c @@ -29,6 +29,7 @@ │ THIS SOFTWARE. │ │ │ ╚─────────────────────────────────────────────────────────────────────────────*/ +#include "third_party/gdtoa/gdtoa.h" #include "third_party/gdtoa/gdtoa.internal.h" /* clang-format off */ diff --git a/third_party/gdtoa/strtof_l.c b/third_party/gdtoa/strtof_l.c new file mode 100644 index 00000000000..e302df715a4 --- /dev/null +++ b/third_party/gdtoa/strtof_l.c @@ -0,0 +1,24 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2022 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/unicode/locale.h" +#include "third_party/gdtoa/gdtoa.h" + +float strtof_l(const char *s, char **sp, locale_t l) { + return strtof(s, sp); +} diff --git a/third_party/gdtoa/wcstod.c b/third_party/gdtoa/wcstod.c new file mode 100644 index 00000000000..41b1439e38a --- /dev/null +++ b/third_party/gdtoa/wcstod.c @@ -0,0 +1,27 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2022 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/assert.h" +#include "libc/fmt/conv.h" +#include "libc/runtime/runtime.h" +#include "libc/unicode/locale.h" + +double wcstod(const wchar_t *nptr, wchar_t **endptr) { + assert(!"not implemented"); + abort(); +} diff --git a/third_party/gdtoa/wcstof.c b/third_party/gdtoa/wcstof.c new file mode 100644 index 00000000000..7b1ac07c679 --- /dev/null +++ b/third_party/gdtoa/wcstof.c @@ -0,0 +1,28 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2022 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/assert.h" +#include "libc/fmt/conv.h" +#include "libc/runtime/runtime.h" +#include "libc/unicode/locale.h" +#include "third_party/gdtoa/gdtoa.h" + +float wcstof(const wchar_t *nptr, wchar_t **endptr) { + assert(!"not implemented"); + abort(); +} diff --git a/third_party/gdtoa/wcstold.c b/third_party/gdtoa/wcstold.c new file mode 100644 index 00000000000..b925100eb10 --- /dev/null +++ b/third_party/gdtoa/wcstold.c @@ -0,0 +1,28 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2022 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/assert.h" +#include "libc/fmt/conv.h" +#include "libc/runtime/runtime.h" +#include "libc/unicode/locale.h" +#include "third_party/gdtoa/gdtoa.h" + +long double wcstold(const wchar_t *nptr, wchar_t **endptr) { + assert(!"not implemented"); + abort(); +} diff --git a/third_party/gdtoa/wcstold_l.c b/third_party/gdtoa/wcstold_l.c new file mode 100644 index 00000000000..8b75c0d84c0 --- /dev/null +++ b/third_party/gdtoa/wcstold_l.c @@ -0,0 +1,25 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2022 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/fmt/conv.h" +#include "libc/unicode/locale.h" +#include "third_party/gdtoa/gdtoa.h" + +long double wcstold_l(const wchar_t *nptr, wchar_t **endptr, locale_t l) { + return wcstold(nptr, endptr); +} diff --git a/third_party/libcxx.bak/__bit_reference b/third_party/libcxx.bak/__bit_reference new file mode 100644 index 00000000000..b7fdd2e1b4c --- /dev/null +++ b/third_party/libcxx.bak/__bit_reference @@ -0,0 +1,1281 @@ +// clang-format off +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___BIT_REFERENCE +#define _LIBCPP___BIT_REFERENCE + +#include <__config> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + + +_LIBCPP_BEGIN_NAMESPACE_STD + +template class __bit_iterator; +template class __bit_const_reference; + +template +struct __has_storage_type +{ + static const bool value = false; +}; + +template ::value> +class __bit_reference +{ + typedef typename _Cp::__storage_type __storage_type; + typedef typename _Cp::__storage_pointer __storage_pointer; + + __storage_pointer __seg_; + __storage_type __mask_; + + friend typename _Cp::__self; + + friend class __bit_const_reference<_Cp>; + friend class __bit_iterator<_Cp, false>; +public: + _LIBCPP_INLINE_VISIBILITY operator bool() const _NOEXCEPT + {return static_cast(*__seg_ & __mask_);} + _LIBCPP_INLINE_VISIBILITY bool operator ~() const _NOEXCEPT + {return !static_cast(*this);} + + _LIBCPP_INLINE_VISIBILITY + __bit_reference& operator=(bool __x) _NOEXCEPT + { + if (__x) + *__seg_ |= __mask_; + else + *__seg_ &= ~__mask_; + return *this; + } + + _LIBCPP_INLINE_VISIBILITY + __bit_reference& operator=(const __bit_reference& __x) _NOEXCEPT + {return operator=(static_cast(__x));} + + _LIBCPP_INLINE_VISIBILITY void flip() _NOEXCEPT {*__seg_ ^= __mask_;} + _LIBCPP_INLINE_VISIBILITY __bit_iterator<_Cp, false> operator&() const _NOEXCEPT + {return __bit_iterator<_Cp, false>(__seg_, static_cast(__libcpp_ctz(__mask_)));} +private: + _LIBCPP_INLINE_VISIBILITY + __bit_reference(__storage_pointer __s, __storage_type __m) _NOEXCEPT + : __seg_(__s), __mask_(__m) {} +}; + +template +class __bit_reference<_Cp, false> +{ +}; + +template +inline _LIBCPP_INLINE_VISIBILITY +void +swap(__bit_reference<_Cp> __x, __bit_reference<_Cp> __y) _NOEXCEPT +{ + bool __t = __x; + __x = __y; + __y = __t; +} + +template +inline _LIBCPP_INLINE_VISIBILITY +void +swap(__bit_reference<_Cp> __x, __bit_reference<_Dp> __y) _NOEXCEPT +{ + bool __t = __x; + __x = __y; + __y = __t; +} + +template +inline _LIBCPP_INLINE_VISIBILITY +void +swap(__bit_reference<_Cp> __x, bool& __y) _NOEXCEPT +{ + bool __t = __x; + __x = __y; + __y = __t; +} + +template +inline _LIBCPP_INLINE_VISIBILITY +void +swap(bool& __x, __bit_reference<_Cp> __y) _NOEXCEPT +{ + bool __t = __x; + __x = __y; + __y = __t; +} + +template +class __bit_const_reference +{ + typedef typename _Cp::__storage_type __storage_type; + typedef typename _Cp::__const_storage_pointer __storage_pointer; + + __storage_pointer __seg_; + __storage_type __mask_; + + friend typename _Cp::__self; + friend class __bit_iterator<_Cp, true>; +public: + _LIBCPP_INLINE_VISIBILITY + __bit_const_reference(const __bit_reference<_Cp>& __x) _NOEXCEPT + : __seg_(__x.__seg_), __mask_(__x.__mask_) {} + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR operator bool() const _NOEXCEPT + {return static_cast(*__seg_ & __mask_);} + + _LIBCPP_INLINE_VISIBILITY __bit_iterator<_Cp, true> operator&() const _NOEXCEPT + {return __bit_iterator<_Cp, true>(__seg_, static_cast(__libcpp_ctz(__mask_)));} +private: + _LIBCPP_INLINE_VISIBILITY + _LIBCPP_CONSTEXPR + __bit_const_reference(__storage_pointer __s, __storage_type __m) _NOEXCEPT + : __seg_(__s), __mask_(__m) {} + + __bit_const_reference& operator=(const __bit_const_reference& __x); +}; + +// find + +template +__bit_iterator<_Cp, _IsConst> +__find_bool_true(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type __n) +{ + typedef __bit_iterator<_Cp, _IsConst> _It; + typedef typename _It::__storage_type __storage_type; + static const int __bits_per_word = _It::__bits_per_word; + // do first partial word + if (__first.__ctz_ != 0) + { + __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_); + __storage_type __dn = _VSTD::min(__clz_f, __n); + __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); + __storage_type __b = *__first.__seg_ & __m; + if (__b) + return _It(__first.__seg_, static_cast(_VSTD::__libcpp_ctz(__b))); + if (__n == __dn) + return __first + __n; + __n -= __dn; + ++__first.__seg_; + } + // do middle whole words + for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word) + if (*__first.__seg_) + return _It(__first.__seg_, static_cast(_VSTD::__libcpp_ctz(*__first.__seg_))); + // do last partial word + if (__n > 0) + { + __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); + __storage_type __b = *__first.__seg_ & __m; + if (__b) + return _It(__first.__seg_, static_cast(_VSTD::__libcpp_ctz(__b))); + } + return _It(__first.__seg_, static_cast(__n)); +} + +template +__bit_iterator<_Cp, _IsConst> +__find_bool_false(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type __n) +{ + typedef __bit_iterator<_Cp, _IsConst> _It; + typedef typename _It::__storage_type __storage_type; + const int __bits_per_word = _It::__bits_per_word; + // do first partial word + if (__first.__ctz_ != 0) + { + __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_); + __storage_type __dn = _VSTD::min(__clz_f, __n); + __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); + __storage_type __b = ~*__first.__seg_ & __m; + if (__b) + return _It(__first.__seg_, static_cast(_VSTD::__libcpp_ctz(__b))); + if (__n == __dn) + return __first + __n; + __n -= __dn; + ++__first.__seg_; + } + // do middle whole words + for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word) + { + __storage_type __b = ~*__first.__seg_; + if (__b) + return _It(__first.__seg_, static_cast(_VSTD::__libcpp_ctz(__b))); + } + // do last partial word + if (__n > 0) + { + __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); + __storage_type __b = ~*__first.__seg_ & __m; + if (__b) + return _It(__first.__seg_, static_cast(_VSTD::__libcpp_ctz(__b))); + } + return _It(__first.__seg_, static_cast(__n)); +} + +template +inline _LIBCPP_INLINE_VISIBILITY +__bit_iterator<_Cp, _IsConst> +find(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, const _Tp& __value_) +{ + if (static_cast(__value_)) + return __find_bool_true(__first, static_cast(__last - __first)); + return __find_bool_false(__first, static_cast(__last - __first)); +} + +// count + +template +typename __bit_iterator<_Cp, _IsConst>::difference_type +__count_bool_true(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type __n) +{ + typedef __bit_iterator<_Cp, _IsConst> _It; + typedef typename _It::__storage_type __storage_type; + typedef typename _It::difference_type difference_type; + const int __bits_per_word = _It::__bits_per_word; + difference_type __r = 0; + // do first partial word + if (__first.__ctz_ != 0) + { + __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_); + __storage_type __dn = _VSTD::min(__clz_f, __n); + __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); + __r = _VSTD::__libcpp_popcount(*__first.__seg_ & __m); + __n -= __dn; + ++__first.__seg_; + } + // do middle whole words + for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word) + __r += _VSTD::__libcpp_popcount(*__first.__seg_); + // do last partial word + if (__n > 0) + { + __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); + __r += _VSTD::__libcpp_popcount(*__first.__seg_ & __m); + } + return __r; +} + +template +typename __bit_iterator<_Cp, _IsConst>::difference_type +__count_bool_false(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type __n) +{ + typedef __bit_iterator<_Cp, _IsConst> _It; + typedef typename _It::__storage_type __storage_type; + typedef typename _It::difference_type difference_type; + const int __bits_per_word = _It::__bits_per_word; + difference_type __r = 0; + // do first partial word + if (__first.__ctz_ != 0) + { + __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_); + __storage_type __dn = _VSTD::min(__clz_f, __n); + __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); + __r = _VSTD::__libcpp_popcount(~*__first.__seg_ & __m); + __n -= __dn; + ++__first.__seg_; + } + // do middle whole words + for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word) + __r += _VSTD::__libcpp_popcount(~*__first.__seg_); + // do last partial word + if (__n > 0) + { + __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); + __r += _VSTD::__libcpp_popcount(~*__first.__seg_ & __m); + } + return __r; +} + +template +inline _LIBCPP_INLINE_VISIBILITY +typename __bit_iterator<_Cp, _IsConst>::difference_type +count(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, const _Tp& __value_) +{ + if (static_cast(__value_)) + return __count_bool_true(__first, static_cast(__last - __first)); + return __count_bool_false(__first, static_cast(__last - __first)); +} + +// fill_n + +template +void +__fill_n_false(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n) +{ + typedef __bit_iterator<_Cp, false> _It; + typedef typename _It::__storage_type __storage_type; + const int __bits_per_word = _It::__bits_per_word; + // do first partial word + if (__first.__ctz_ != 0) + { + __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_); + __storage_type __dn = _VSTD::min(__clz_f, __n); + __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); + *__first.__seg_ &= ~__m; + __n -= __dn; + ++__first.__seg_; + } + // do middle whole words + __storage_type __nw = __n / __bits_per_word; + _VSTD::memset(_VSTD::__to_raw_pointer(__first.__seg_), 0, __nw * sizeof(__storage_type)); + __n -= __nw * __bits_per_word; + // do last partial word + if (__n > 0) + { + __first.__seg_ += __nw; + __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); + *__first.__seg_ &= ~__m; + } +} + +template +void +__fill_n_true(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n) +{ + typedef __bit_iterator<_Cp, false> _It; + typedef typename _It::__storage_type __storage_type; + const int __bits_per_word = _It::__bits_per_word; + // do first partial word + if (__first.__ctz_ != 0) + { + __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_); + __storage_type __dn = _VSTD::min(__clz_f, __n); + __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); + *__first.__seg_ |= __m; + __n -= __dn; + ++__first.__seg_; + } + // do middle whole words + __storage_type __nw = __n / __bits_per_word; + _VSTD::memset(_VSTD::__to_raw_pointer(__first.__seg_), -1, __nw * sizeof(__storage_type)); + __n -= __nw * __bits_per_word; + // do last partial word + if (__n > 0) + { + __first.__seg_ += __nw; + __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); + *__first.__seg_ |= __m; + } +} + +template +inline _LIBCPP_INLINE_VISIBILITY +void +fill_n(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n, bool __value_) +{ + if (__n > 0) + { + if (__value_) + __fill_n_true(__first, __n); + else + __fill_n_false(__first, __n); + } +} + +// fill + +template +inline _LIBCPP_INLINE_VISIBILITY +void +fill(__bit_iterator<_Cp, false> __first, __bit_iterator<_Cp, false> __last, bool __value_) +{ + _VSTD::fill_n(__first, static_cast(__last - __first), __value_); +} + +// copy + +template +__bit_iterator<_Cp, false> +__copy_aligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, + __bit_iterator<_Cp, false> __result) +{ + typedef __bit_iterator<_Cp, _IsConst> _In; + typedef typename _In::difference_type difference_type; + typedef typename _In::__storage_type __storage_type; + const int __bits_per_word = _In::__bits_per_word; + difference_type __n = __last - __first; + if (__n > 0) + { + // do first word + if (__first.__ctz_ != 0) + { + unsigned __clz = __bits_per_word - __first.__ctz_; + difference_type __dn = _VSTD::min(static_cast(__clz), __n); + __n -= __dn; + __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz - __dn)); + __storage_type __b = *__first.__seg_ & __m; + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b; + __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word; + __result.__ctz_ = static_cast((__dn + __result.__ctz_) % __bits_per_word); + ++__first.__seg_; + // __first.__ctz_ = 0; + } + // __first.__ctz_ == 0; + // do middle words + __storage_type __nw = __n / __bits_per_word; + _VSTD::memmove(_VSTD::__to_raw_pointer(__result.__seg_), + _VSTD::__to_raw_pointer(__first.__seg_), + __nw * sizeof(__storage_type)); + __n -= __nw * __bits_per_word; + __result.__seg_ += __nw; + // do last word + if (__n > 0) + { + __first.__seg_ += __nw; + __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); + __storage_type __b = *__first.__seg_ & __m; + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b; + __result.__ctz_ = static_cast(__n); + } + } + return __result; +} + +template +__bit_iterator<_Cp, false> +__copy_unaligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, + __bit_iterator<_Cp, false> __result) +{ + typedef __bit_iterator<_Cp, _IsConst> _In; + typedef typename _In::difference_type difference_type; + typedef typename _In::__storage_type __storage_type; + static const int __bits_per_word = _In::__bits_per_word; + difference_type __n = __last - __first; + if (__n > 0) + { + // do first word + if (__first.__ctz_ != 0) + { + unsigned __clz_f = __bits_per_word - __first.__ctz_; + difference_type __dn = _VSTD::min(static_cast(__clz_f), __n); + __n -= __dn; + __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); + __storage_type __b = *__first.__seg_ & __m; + unsigned __clz_r = __bits_per_word - __result.__ctz_; + __storage_type __ddn = _VSTD::min<__storage_type>(__dn, __clz_r); + __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn)); + *__result.__seg_ &= ~__m; + if (__result.__ctz_ > __first.__ctz_) + *__result.__seg_ |= __b << (__result.__ctz_ - __first.__ctz_); + else + *__result.__seg_ |= __b >> (__first.__ctz_ - __result.__ctz_); + __result.__seg_ += (__ddn + __result.__ctz_) / __bits_per_word; + __result.__ctz_ = static_cast((__ddn + __result.__ctz_) % __bits_per_word); + __dn -= __ddn; + if (__dn > 0) + { + __m = ~__storage_type(0) >> (__bits_per_word - __dn); + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b >> (__first.__ctz_ + __ddn); + __result.__ctz_ = static_cast(__dn); + } + ++__first.__seg_; + // __first.__ctz_ = 0; + } + // __first.__ctz_ == 0; + // do middle words + unsigned __clz_r = __bits_per_word - __result.__ctz_; + __storage_type __m = ~__storage_type(0) << __result.__ctz_; + for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_) + { + __storage_type __b = *__first.__seg_; + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b << __result.__ctz_; + ++__result.__seg_; + *__result.__seg_ &= __m; + *__result.__seg_ |= __b >> __clz_r; + } + // do last word + if (__n > 0) + { + __m = ~__storage_type(0) >> (__bits_per_word - __n); + __storage_type __b = *__first.__seg_ & __m; + __storage_type __dn = _VSTD::min(__n, static_cast(__clz_r)); + __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn)); + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b << __result.__ctz_; + __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word; + __result.__ctz_ = static_cast((__dn + __result.__ctz_) % __bits_per_word); + __n -= __dn; + if (__n > 0) + { + __m = ~__storage_type(0) >> (__bits_per_word - __n); + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b >> __dn; + __result.__ctz_ = static_cast(__n); + } + } + } + return __result; +} + +template +inline _LIBCPP_INLINE_VISIBILITY +__bit_iterator<_Cp, false> +copy(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result) +{ + if (__first.__ctz_ == __result.__ctz_) + return __copy_aligned(__first, __last, __result); + return __copy_unaligned(__first, __last, __result); +} + +// copy_backward + +template +__bit_iterator<_Cp, false> +__copy_backward_aligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, + __bit_iterator<_Cp, false> __result) +{ + typedef __bit_iterator<_Cp, _IsConst> _In; + typedef typename _In::difference_type difference_type; + typedef typename _In::__storage_type __storage_type; + const int __bits_per_word = _In::__bits_per_word; + difference_type __n = __last - __first; + if (__n > 0) + { + // do first word + if (__last.__ctz_ != 0) + { + difference_type __dn = _VSTD::min(static_cast(__last.__ctz_), __n); + __n -= __dn; + unsigned __clz = __bits_per_word - __last.__ctz_; + __storage_type __m = (~__storage_type(0) << (__last.__ctz_ - __dn)) & (~__storage_type(0) >> __clz); + __storage_type __b = *__last.__seg_ & __m; + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b; + __result.__ctz_ = static_cast(((-__dn & (__bits_per_word - 1)) + + __result.__ctz_) % __bits_per_word); + // __last.__ctz_ = 0 + } + // __last.__ctz_ == 0 || __n == 0 + // __result.__ctz_ == 0 || __n == 0 + // do middle words + __storage_type __nw = __n / __bits_per_word; + __result.__seg_ -= __nw; + __last.__seg_ -= __nw; + _VSTD::memmove(_VSTD::__to_raw_pointer(__result.__seg_), + _VSTD::__to_raw_pointer(__last.__seg_), + __nw * sizeof(__storage_type)); + __n -= __nw * __bits_per_word; + // do last word + if (__n > 0) + { + __storage_type __m = ~__storage_type(0) << (__bits_per_word - __n); + __storage_type __b = *--__last.__seg_ & __m; + *--__result.__seg_ &= ~__m; + *__result.__seg_ |= __b; + __result.__ctz_ = static_cast(-__n & (__bits_per_word - 1)); + } + } + return __result; +} + +template +__bit_iterator<_Cp, false> +__copy_backward_unaligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, + __bit_iterator<_Cp, false> __result) +{ + typedef __bit_iterator<_Cp, _IsConst> _In; + typedef typename _In::difference_type difference_type; + typedef typename _In::__storage_type __storage_type; + const int __bits_per_word = _In::__bits_per_word; + difference_type __n = __last - __first; + if (__n > 0) + { + // do first word + if (__last.__ctz_ != 0) + { + difference_type __dn = _VSTD::min(static_cast(__last.__ctz_), __n); + __n -= __dn; + unsigned __clz_l = __bits_per_word - __last.__ctz_; + __storage_type __m = (~__storage_type(0) << (__last.__ctz_ - __dn)) & (~__storage_type(0) >> __clz_l); + __storage_type __b = *__last.__seg_ & __m; + unsigned __clz_r = __bits_per_word - __result.__ctz_; + __storage_type __ddn = _VSTD::min(__dn, static_cast(__result.__ctz_)); + if (__ddn > 0) + { + __m = (~__storage_type(0) << (__result.__ctz_ - __ddn)) & (~__storage_type(0) >> __clz_r); + *__result.__seg_ &= ~__m; + if (__result.__ctz_ > __last.__ctz_) + *__result.__seg_ |= __b << (__result.__ctz_ - __last.__ctz_); + else + *__result.__seg_ |= __b >> (__last.__ctz_ - __result.__ctz_); + __result.__ctz_ = static_cast(((-__ddn & (__bits_per_word - 1)) + + __result.__ctz_) % __bits_per_word); + __dn -= __ddn; + } + if (__dn > 0) + { + // __result.__ctz_ == 0 + --__result.__seg_; + __result.__ctz_ = static_cast(-__dn & (__bits_per_word - 1)); + __m = ~__storage_type(0) << __result.__ctz_; + *__result.__seg_ &= ~__m; + __last.__ctz_ -= __dn + __ddn; + *__result.__seg_ |= __b << (__result.__ctz_ - __last.__ctz_); + } + // __last.__ctz_ = 0 + } + // __last.__ctz_ == 0 || __n == 0 + // __result.__ctz_ != 0 || __n == 0 + // do middle words + unsigned __clz_r = __bits_per_word - __result.__ctz_; + __storage_type __m = ~__storage_type(0) >> __clz_r; + for (; __n >= __bits_per_word; __n -= __bits_per_word) + { + __storage_type __b = *--__last.__seg_; + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b >> __clz_r; + *--__result.__seg_ &= __m; + *__result.__seg_ |= __b << __result.__ctz_; + } + // do last word + if (__n > 0) + { + __m = ~__storage_type(0) << (__bits_per_word - __n); + __storage_type __b = *--__last.__seg_ & __m; + __clz_r = __bits_per_word - __result.__ctz_; + __storage_type __dn = _VSTD::min(__n, static_cast(__result.__ctz_)); + __m = (~__storage_type(0) << (__result.__ctz_ - __dn)) & (~__storage_type(0) >> __clz_r); + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b >> (__bits_per_word - __result.__ctz_); + __result.__ctz_ = static_cast(((-__dn & (__bits_per_word - 1)) + + __result.__ctz_) % __bits_per_word); + __n -= __dn; + if (__n > 0) + { + // __result.__ctz_ == 0 + --__result.__seg_; + __result.__ctz_ = static_cast(-__n & (__bits_per_word - 1)); + __m = ~__storage_type(0) << __result.__ctz_; + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b << (__result.__ctz_ - (__bits_per_word - __n - __dn)); + } + } + } + return __result; +} + +template +inline _LIBCPP_INLINE_VISIBILITY +__bit_iterator<_Cp, false> +copy_backward(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result) +{ + if (__last.__ctz_ == __result.__ctz_) + return __copy_backward_aligned(__first, __last, __result); + return __copy_backward_unaligned(__first, __last, __result); +} + +// move + +template +inline _LIBCPP_INLINE_VISIBILITY +__bit_iterator<_Cp, false> +move(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result) +{ + return _VSTD::copy(__first, __last, __result); +} + +// move_backward + +template +inline _LIBCPP_INLINE_VISIBILITY +__bit_iterator<_Cp, false> +move_backward(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result) +{ + return _VSTD::copy_backward(__first, __last, __result); +} + +// swap_ranges + +template +__bit_iterator<__C2, false> +__swap_ranges_aligned(__bit_iterator<__C1, false> __first, __bit_iterator<__C1, false> __last, + __bit_iterator<__C2, false> __result) +{ + typedef __bit_iterator<__C1, false> _I1; + typedef typename _I1::difference_type difference_type; + typedef typename _I1::__storage_type __storage_type; + const int __bits_per_word = _I1::__bits_per_word; + difference_type __n = __last - __first; + if (__n > 0) + { + // do first word + if (__first.__ctz_ != 0) + { + unsigned __clz = __bits_per_word - __first.__ctz_; + difference_type __dn = _VSTD::min(static_cast(__clz), __n); + __n -= __dn; + __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz - __dn)); + __storage_type __b1 = *__first.__seg_ & __m; + *__first.__seg_ &= ~__m; + __storage_type __b2 = *__result.__seg_ & __m; + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b1; + *__first.__seg_ |= __b2; + __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word; + __result.__ctz_ = static_cast((__dn + __result.__ctz_) % __bits_per_word); + ++__first.__seg_; + // __first.__ctz_ = 0; + } + // __first.__ctz_ == 0; + // do middle words + for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_, ++__result.__seg_) + swap(*__first.__seg_, *__result.__seg_); + // do last word + if (__n > 0) + { + __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); + __storage_type __b1 = *__first.__seg_ & __m; + *__first.__seg_ &= ~__m; + __storage_type __b2 = *__result.__seg_ & __m; + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b1; + *__first.__seg_ |= __b2; + __result.__ctz_ = static_cast(__n); + } + } + return __result; +} + +template +__bit_iterator<__C2, false> +__swap_ranges_unaligned(__bit_iterator<__C1, false> __first, __bit_iterator<__C1, false> __last, + __bit_iterator<__C2, false> __result) +{ + typedef __bit_iterator<__C1, false> _I1; + typedef typename _I1::difference_type difference_type; + typedef typename _I1::__storage_type __storage_type; + const int __bits_per_word = _I1::__bits_per_word; + difference_type __n = __last - __first; + if (__n > 0) + { + // do first word + if (__first.__ctz_ != 0) + { + unsigned __clz_f = __bits_per_word - __first.__ctz_; + difference_type __dn = _VSTD::min(static_cast(__clz_f), __n); + __n -= __dn; + __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); + __storage_type __b1 = *__first.__seg_ & __m; + *__first.__seg_ &= ~__m; + unsigned __clz_r = __bits_per_word - __result.__ctz_; + __storage_type __ddn = _VSTD::min<__storage_type>(__dn, __clz_r); + __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn)); + __storage_type __b2 = *__result.__seg_ & __m; + *__result.__seg_ &= ~__m; + if (__result.__ctz_ > __first.__ctz_) + { + unsigned __s = __result.__ctz_ - __first.__ctz_; + *__result.__seg_ |= __b1 << __s; + *__first.__seg_ |= __b2 >> __s; + } + else + { + unsigned __s = __first.__ctz_ - __result.__ctz_; + *__result.__seg_ |= __b1 >> __s; + *__first.__seg_ |= __b2 << __s; + } + __result.__seg_ += (__ddn + __result.__ctz_) / __bits_per_word; + __result.__ctz_ = static_cast((__ddn + __result.__ctz_) % __bits_per_word); + __dn -= __ddn; + if (__dn > 0) + { + __m = ~__storage_type(0) >> (__bits_per_word - __dn); + __b2 = *__result.__seg_ & __m; + *__result.__seg_ &= ~__m; + unsigned __s = __first.__ctz_ + __ddn; + *__result.__seg_ |= __b1 >> __s; + *__first.__seg_ |= __b2 << __s; + __result.__ctz_ = static_cast(__dn); + } + ++__first.__seg_; + // __first.__ctz_ = 0; + } + // __first.__ctz_ == 0; + // do middle words + __storage_type __m = ~__storage_type(0) << __result.__ctz_; + unsigned __clz_r = __bits_per_word - __result.__ctz_; + for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_) + { + __storage_type __b1 = *__first.__seg_; + __storage_type __b2 = *__result.__seg_ & __m; + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b1 << __result.__ctz_; + *__first.__seg_ = __b2 >> __result.__ctz_; + ++__result.__seg_; + __b2 = *__result.__seg_ & ~__m; + *__result.__seg_ &= __m; + *__result.__seg_ |= __b1 >> __clz_r; + *__first.__seg_ |= __b2 << __clz_r; + } + // do last word + if (__n > 0) + { + __m = ~__storage_type(0) >> (__bits_per_word - __n); + __storage_type __b1 = *__first.__seg_ & __m; + *__first.__seg_ &= ~__m; + __storage_type __dn = _VSTD::min<__storage_type>(__n, __clz_r); + __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn)); + __storage_type __b2 = *__result.__seg_ & __m; + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b1 << __result.__ctz_; + *__first.__seg_ |= __b2 >> __result.__ctz_; + __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word; + __result.__ctz_ = static_cast((__dn + __result.__ctz_) % __bits_per_word); + __n -= __dn; + if (__n > 0) + { + __m = ~__storage_type(0) >> (__bits_per_word - __n); + __b2 = *__result.__seg_ & __m; + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b1 >> __dn; + *__first.__seg_ |= __b2 << __dn; + __result.__ctz_ = static_cast(__n); + } + } + } + return __result; +} + +template +inline _LIBCPP_INLINE_VISIBILITY +__bit_iterator<__C2, false> +swap_ranges(__bit_iterator<__C1, false> __first1, __bit_iterator<__C1, false> __last1, + __bit_iterator<__C2, false> __first2) +{ + if (__first1.__ctz_ == __first2.__ctz_) + return __swap_ranges_aligned(__first1, __last1, __first2); + return __swap_ranges_unaligned(__first1, __last1, __first2); +} + +// rotate + +template +struct __bit_array +{ + typedef typename _Cp::difference_type difference_type; + typedef typename _Cp::__storage_type __storage_type; + typedef typename _Cp::__storage_pointer __storage_pointer; + typedef typename _Cp::iterator iterator; + static const unsigned __bits_per_word = _Cp::__bits_per_word; + static const unsigned _Np = 4; + + difference_type __size_; + __storage_type __word_[_Np]; + + _LIBCPP_INLINE_VISIBILITY static difference_type capacity() + {return static_cast(_Np * __bits_per_word);} + _LIBCPP_INLINE_VISIBILITY explicit __bit_array(difference_type __s) : __size_(__s) {} + _LIBCPP_INLINE_VISIBILITY iterator begin() + { + return iterator(pointer_traits<__storage_pointer>::pointer_to(__word_[0]), 0); + } + _LIBCPP_INLINE_VISIBILITY iterator end() + { + return iterator(pointer_traits<__storage_pointer>::pointer_to(__word_[0]) + __size_ / __bits_per_word, + static_cast(__size_ % __bits_per_word)); + } +}; + +template +__bit_iterator<_Cp, false> +rotate(__bit_iterator<_Cp, false> __first, __bit_iterator<_Cp, false> __middle, __bit_iterator<_Cp, false> __last) +{ + typedef __bit_iterator<_Cp, false> _I1; + typedef typename _I1::difference_type difference_type; + difference_type __d1 = __middle - __first; + difference_type __d2 = __last - __middle; + _I1 __r = __first + __d2; + while (__d1 != 0 && __d2 != 0) + { + if (__d1 <= __d2) + { + if (__d1 <= __bit_array<_Cp>::capacity()) + { + __bit_array<_Cp> __b(__d1); + _VSTD::copy(__first, __middle, __b.begin()); + _VSTD::copy(__b.begin(), __b.end(), _VSTD::copy(__middle, __last, __first)); + break; + } + else + { + __bit_iterator<_Cp, false> __mp = _VSTD::swap_ranges(__first, __middle, __middle); + __first = __middle; + __middle = __mp; + __d2 -= __d1; + } + } + else + { + if (__d2 <= __bit_array<_Cp>::capacity()) + { + __bit_array<_Cp> __b(__d2); + _VSTD::copy(__middle, __last, __b.begin()); + _VSTD::copy_backward(__b.begin(), __b.end(), _VSTD::copy_backward(__first, __middle, __last)); + break; + } + else + { + __bit_iterator<_Cp, false> __mp = __first + __d2; + _VSTD::swap_ranges(__first, __mp, __middle); + __first = __mp; + __d1 -= __d2; + } + } + } + return __r; +} + +// equal + +template +bool +__equal_unaligned(__bit_iterator<_Cp, _IC1> __first1, __bit_iterator<_Cp, _IC1> __last1, + __bit_iterator<_Cp, _IC2> __first2) +{ + typedef __bit_iterator<_Cp, _IC1> _It; + typedef typename _It::difference_type difference_type; + typedef typename _It::__storage_type __storage_type; + static const int __bits_per_word = _It::__bits_per_word; + difference_type __n = __last1 - __first1; + if (__n > 0) + { + // do first word + if (__first1.__ctz_ != 0) + { + unsigned __clz_f = __bits_per_word - __first1.__ctz_; + difference_type __dn = _VSTD::min(static_cast(__clz_f), __n); + __n -= __dn; + __storage_type __m = (~__storage_type(0) << __first1.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); + __storage_type __b = *__first1.__seg_ & __m; + unsigned __clz_r = __bits_per_word - __first2.__ctz_; + __storage_type __ddn = _VSTD::min<__storage_type>(__dn, __clz_r); + __m = (~__storage_type(0) << __first2.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn)); + if (__first2.__ctz_ > __first1.__ctz_) + { + if ((*__first2.__seg_ & __m) != (__b << (__first2.__ctz_ - __first1.__ctz_))) + return false; + } + else + { + if ((*__first2.__seg_ & __m) != (__b >> (__first1.__ctz_ - __first2.__ctz_))) + return false; + } + __first2.__seg_ += (__ddn + __first2.__ctz_) / __bits_per_word; + __first2.__ctz_ = static_cast((__ddn + __first2.__ctz_) % __bits_per_word); + __dn -= __ddn; + if (__dn > 0) + { + __m = ~__storage_type(0) >> (__bits_per_word - __dn); + if ((*__first2.__seg_ & __m) != (__b >> (__first1.__ctz_ + __ddn))) + return false; + __first2.__ctz_ = static_cast(__dn); + } + ++__first1.__seg_; + // __first1.__ctz_ = 0; + } + // __first1.__ctz_ == 0; + // do middle words + unsigned __clz_r = __bits_per_word - __first2.__ctz_; + __storage_type __m = ~__storage_type(0) << __first2.__ctz_; + for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first1.__seg_) + { + __storage_type __b = *__first1.__seg_; + if ((*__first2.__seg_ & __m) != (__b << __first2.__ctz_)) + return false; + ++__first2.__seg_; + if ((*__first2.__seg_ & ~__m) != (__b >> __clz_r)) + return false; + } + // do last word + if (__n > 0) + { + __m = ~__storage_type(0) >> (__bits_per_word - __n); + __storage_type __b = *__first1.__seg_ & __m; + __storage_type __dn = _VSTD::min(__n, static_cast(__clz_r)); + __m = (~__storage_type(0) << __first2.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn)); + if ((*__first2.__seg_ & __m) != (__b << __first2.__ctz_)) + return false; + __first2.__seg_ += (__dn + __first2.__ctz_) / __bits_per_word; + __first2.__ctz_ = static_cast((__dn + __first2.__ctz_) % __bits_per_word); + __n -= __dn; + if (__n > 0) + { + __m = ~__storage_type(0) >> (__bits_per_word - __n); + if ((*__first2.__seg_ & __m) != (__b >> __dn)) + return false; + } + } + } + return true; +} + +template +bool +__equal_aligned(__bit_iterator<_Cp, _IC1> __first1, __bit_iterator<_Cp, _IC1> __last1, + __bit_iterator<_Cp, _IC2> __first2) +{ + typedef __bit_iterator<_Cp, _IC1> _It; + typedef typename _It::difference_type difference_type; + typedef typename _It::__storage_type __storage_type; + static const int __bits_per_word = _It::__bits_per_word; + difference_type __n = __last1 - __first1; + if (__n > 0) + { + // do first word + if (__first1.__ctz_ != 0) + { + unsigned __clz = __bits_per_word - __first1.__ctz_; + difference_type __dn = _VSTD::min(static_cast(__clz), __n); + __n -= __dn; + __storage_type __m = (~__storage_type(0) << __first1.__ctz_) & (~__storage_type(0) >> (__clz - __dn)); + if ((*__first2.__seg_ & __m) != (*__first1.__seg_ & __m)) + return false; + ++__first2.__seg_; + ++__first1.__seg_; + // __first1.__ctz_ = 0; + // __first2.__ctz_ = 0; + } + // __first1.__ctz_ == 0; + // __first2.__ctz_ == 0; + // do middle words + for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first1.__seg_, ++__first2.__seg_) + if (*__first2.__seg_ != *__first1.__seg_) + return false; + // do last word + if (__n > 0) + { + __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); + if ((*__first2.__seg_ & __m) != (*__first1.__seg_ & __m)) + return false; + } + } + return true; +} + +template +inline _LIBCPP_INLINE_VISIBILITY +bool +equal(__bit_iterator<_Cp, _IC1> __first1, __bit_iterator<_Cp, _IC1> __last1, __bit_iterator<_Cp, _IC2> __first2) +{ + if (__first1.__ctz_ == __first2.__ctz_) + return __equal_aligned(__first1, __last1, __first2); + return __equal_unaligned(__first1, __last1, __first2); +} + +template +class __bit_iterator +{ +public: + typedef typename _Cp::difference_type difference_type; + typedef bool value_type; + typedef __bit_iterator pointer; + typedef typename conditional<_IsConst, __bit_const_reference<_Cp>, __bit_reference<_Cp> >::type reference; + typedef random_access_iterator_tag iterator_category; + +private: + typedef typename _Cp::__storage_type __storage_type; + typedef typename conditional<_IsConst, typename _Cp::__const_storage_pointer, + typename _Cp::__storage_pointer>::type __storage_pointer; + static const unsigned __bits_per_word = _Cp::__bits_per_word; + + __storage_pointer __seg_; + unsigned __ctz_; + +public: + _LIBCPP_INLINE_VISIBILITY __bit_iterator() _NOEXCEPT +#if _LIBCPP_STD_VER > 11 + : __seg_(nullptr), __ctz_(0) +#endif + {} + + _LIBCPP_INLINE_VISIBILITY + __bit_iterator(const __bit_iterator<_Cp, false>& __it) _NOEXCEPT + : __seg_(__it.__seg_), __ctz_(__it.__ctz_) {} + + _LIBCPP_INLINE_VISIBILITY reference operator*() const _NOEXCEPT + {return reference(__seg_, __storage_type(1) << __ctz_);} + + _LIBCPP_INLINE_VISIBILITY __bit_iterator& operator++() + { + if (__ctz_ != __bits_per_word-1) + ++__ctz_; + else + { + __ctz_ = 0; + ++__seg_; + } + return *this; + } + + _LIBCPP_INLINE_VISIBILITY __bit_iterator operator++(int) + { + __bit_iterator __tmp = *this; + ++(*this); + return __tmp; + } + + _LIBCPP_INLINE_VISIBILITY __bit_iterator& operator--() + { + if (__ctz_ != 0) + --__ctz_; + else + { + __ctz_ = __bits_per_word - 1; + --__seg_; + } + return *this; + } + + _LIBCPP_INLINE_VISIBILITY __bit_iterator operator--(int) + { + __bit_iterator __tmp = *this; + --(*this); + return __tmp; + } + + _LIBCPP_INLINE_VISIBILITY __bit_iterator& operator+=(difference_type __n) + { + if (__n >= 0) + __seg_ += (__n + __ctz_) / __bits_per_word; + else + __seg_ += static_cast(__n - __bits_per_word + __ctz_ + 1) + / static_cast(__bits_per_word); + __n &= (__bits_per_word - 1); + __ctz_ = static_cast((__n + __ctz_) % __bits_per_word); + return *this; + } + + _LIBCPP_INLINE_VISIBILITY __bit_iterator& operator-=(difference_type __n) + { + return *this += -__n; + } + + _LIBCPP_INLINE_VISIBILITY __bit_iterator operator+(difference_type __n) const + { + __bit_iterator __t(*this); + __t += __n; + return __t; + } + + _LIBCPP_INLINE_VISIBILITY __bit_iterator operator-(difference_type __n) const + { + __bit_iterator __t(*this); + __t -= __n; + return __t; + } + + _LIBCPP_INLINE_VISIBILITY + friend __bit_iterator operator+(difference_type __n, const __bit_iterator& __it) {return __it + __n;} + + _LIBCPP_INLINE_VISIBILITY + friend difference_type operator-(const __bit_iterator& __x, const __bit_iterator& __y) + {return (__x.__seg_ - __y.__seg_) * __bits_per_word + __x.__ctz_ - __y.__ctz_;} + + _LIBCPP_INLINE_VISIBILITY reference operator[](difference_type __n) const {return *(*this + __n);} + + _LIBCPP_INLINE_VISIBILITY friend bool operator==(const __bit_iterator& __x, const __bit_iterator& __y) + {return __x.__seg_ == __y.__seg_ && __x.__ctz_ == __y.__ctz_;} + + _LIBCPP_INLINE_VISIBILITY friend bool operator!=(const __bit_iterator& __x, const __bit_iterator& __y) + {return !(__x == __y);} + + _LIBCPP_INLINE_VISIBILITY friend bool operator<(const __bit_iterator& __x, const __bit_iterator& __y) + {return __x.__seg_ < __y.__seg_ || (__x.__seg_ == __y.__seg_ && __x.__ctz_ < __y.__ctz_);} + + _LIBCPP_INLINE_VISIBILITY friend bool operator>(const __bit_iterator& __x, const __bit_iterator& __y) + {return __y < __x;} + + _LIBCPP_INLINE_VISIBILITY friend bool operator<=(const __bit_iterator& __x, const __bit_iterator& __y) + {return !(__y < __x);} + + _LIBCPP_INLINE_VISIBILITY friend bool operator>=(const __bit_iterator& __x, const __bit_iterator& __y) + {return !(__x < __y);} + +private: + _LIBCPP_INLINE_VISIBILITY + __bit_iterator(__storage_pointer __s, unsigned __ctz) _NOEXCEPT + : __seg_(__s), __ctz_(__ctz) {} + + friend typename _Cp::__self; + + friend class __bit_reference<_Cp>; + friend class __bit_const_reference<_Cp>; + friend class __bit_iterator<_Cp, true>; + template friend struct __bit_array; + template friend void __fill_n_false(__bit_iterator<_Dp, false> __first, typename _Dp::size_type __n); + template friend void __fill_n_true(__bit_iterator<_Dp, false> __first, typename _Dp::size_type __n); + template friend __bit_iterator<_Dp, false> __copy_aligned(__bit_iterator<_Dp, _IC> __first, + __bit_iterator<_Dp, _IC> __last, + __bit_iterator<_Dp, false> __result); + template friend __bit_iterator<_Dp, false> __copy_unaligned(__bit_iterator<_Dp, _IC> __first, + __bit_iterator<_Dp, _IC> __last, + __bit_iterator<_Dp, false> __result); + template friend __bit_iterator<_Dp, false> copy(__bit_iterator<_Dp, _IC> __first, + __bit_iterator<_Dp, _IC> __last, + __bit_iterator<_Dp, false> __result); + template friend __bit_iterator<_Dp, false> __copy_backward_aligned(__bit_iterator<_Dp, _IC> __first, + __bit_iterator<_Dp, _IC> __last, + __bit_iterator<_Dp, false> __result); + template friend __bit_iterator<_Dp, false> __copy_backward_unaligned(__bit_iterator<_Dp, _IC> __first, + __bit_iterator<_Dp, _IC> __last, + __bit_iterator<_Dp, false> __result); + template friend __bit_iterator<_Dp, false> copy_backward(__bit_iterator<_Dp, _IC> __first, + __bit_iterator<_Dp, _IC> __last, + __bit_iterator<_Dp, false> __result); + template friend __bit_iterator<__C2, false> __swap_ranges_aligned(__bit_iterator<__C1, false>, + __bit_iterator<__C1, false>, + __bit_iterator<__C2, false>); + template friend __bit_iterator<__C2, false> __swap_ranges_unaligned(__bit_iterator<__C1, false>, + __bit_iterator<__C1, false>, + __bit_iterator<__C2, false>); + template friend __bit_iterator<__C2, false> swap_ranges(__bit_iterator<__C1, false>, + __bit_iterator<__C1, false>, + __bit_iterator<__C2, false>); + template friend __bit_iterator<_Dp, false> rotate(__bit_iterator<_Dp, false>, + __bit_iterator<_Dp, false>, + __bit_iterator<_Dp, false>); + template friend bool __equal_aligned(__bit_iterator<_Dp, _IC1>, + __bit_iterator<_Dp, _IC1>, + __bit_iterator<_Dp, _IC2>); + template friend bool __equal_unaligned(__bit_iterator<_Dp, _IC1>, + __bit_iterator<_Dp, _IC1>, + __bit_iterator<_Dp, _IC2>); + template friend bool equal(__bit_iterator<_Dp, _IC1>, + __bit_iterator<_Dp, _IC1>, + __bit_iterator<_Dp, _IC2>); + template friend __bit_iterator<_Dp, _IC> __find_bool_true(__bit_iterator<_Dp, _IC>, + typename _Dp::size_type); + template friend __bit_iterator<_Dp, _IC> __find_bool_false(__bit_iterator<_Dp, _IC>, + typename _Dp::size_type); + template friend typename __bit_iterator<_Dp, _IC>::difference_type + __count_bool_true(__bit_iterator<_Dp, _IC>, typename _Dp::size_type); + template friend typename __bit_iterator<_Dp, _IC>::difference_type + __count_bool_false(__bit_iterator<_Dp, _IC>, typename _Dp::size_type); +}; + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___BIT_REFERENCE diff --git a/third_party/libcxx.bak/__config b/third_party/libcxx.bak/__config new file mode 100644 index 00000000000..4681140d6b4 --- /dev/null +++ b/third_party/libcxx.bak/__config @@ -0,0 +1,1484 @@ +// clang-format off +// -*- C++ -*- +//===--------------------------- __config ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP_CONFIG +#define _LIBCPP_CONFIG + +#if defined(_MSC_VER) && !defined(__clang__) +# if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# define _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER +# endif +#endif + +#ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER +#pragma GCC system_header +#endif + +#ifdef __cplusplus + +#ifdef __GNUC__ +# define _GNUC_VER (__GNUC__ * 100 + __GNUC_MINOR__) +// The _GNUC_VER_NEW macro better represents the new GCC versioning scheme +// introduced in GCC 5.0. +# define _GNUC_VER_NEW (_GNUC_VER * 10 + __GNUC_PATCHLEVEL__) +#else +# define _GNUC_VER 0 +# define _GNUC_VER_NEW 0 +#endif + +#define _LIBCPP_VERSION 10000 + +#ifndef _LIBCPP_ABI_VERSION +# define _LIBCPP_ABI_VERSION 1 +#endif + +#ifndef __STDC_HOSTED__ +# define _LIBCPP_FREESTANDING +#endif + +#ifndef _LIBCPP_STD_VER +# if __cplusplus <= 201103L +# define _LIBCPP_STD_VER 11 +# elif __cplusplus <= 201402L +# define _LIBCPP_STD_VER 14 +# elif __cplusplus <= 201703L +# define _LIBCPP_STD_VER 17 +# else +# define _LIBCPP_STD_VER 18 // current year, or date of c++2a ratification +# endif +#endif // _LIBCPP_STD_VER + +#if defined(__ELF__) +# define _LIBCPP_OBJECT_FORMAT_ELF 1 +#elif defined(__MACH__) +# define _LIBCPP_OBJECT_FORMAT_MACHO 1 +#elif defined(_WIN32) +# define _LIBCPP_OBJECT_FORMAT_COFF 1 +#elif defined(__wasm__) +# define _LIBCPP_OBJECT_FORMAT_WASM 1 +#else +# error Unknown object file format +#endif + +#if defined(_LIBCPP_ABI_UNSTABLE) || _LIBCPP_ABI_VERSION >= 2 +// Change short string representation so that string data starts at offset 0, +// improving its alignment in some cases. +# define _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT +// Fix deque iterator type in order to support incomplete types. +# define _LIBCPP_ABI_INCOMPLETE_TYPES_IN_DEQUE +// Fix undefined behavior in how std::list stores its linked nodes. +# define _LIBCPP_ABI_LIST_REMOVE_NODE_POINTER_UB +// Fix undefined behavior in how __tree stores its end and parent nodes. +# define _LIBCPP_ABI_TREE_REMOVE_NODE_POINTER_UB +// Fix undefined behavior in how __hash_table stores its pointer types. +# define _LIBCPP_ABI_FIX_UNORDERED_NODE_POINTER_UB +# define _LIBCPP_ABI_FORWARD_LIST_REMOVE_NODE_POINTER_UB +# define _LIBCPP_ABI_FIX_UNORDERED_CONTAINER_SIZE_TYPE +// Don't use a nullptr_t simulation type in C++03 instead using C++11 nullptr +// provided under the alternate keyword __nullptr, which changes the mangling +// of nullptr_t. This option is ABI incompatible with GCC in C++03 mode. +# define _LIBCPP_ABI_ALWAYS_USE_CXX11_NULLPTR +// Define the `pointer_safety` enum as a C++11 strongly typed enumeration +// instead of as a class simulating an enum. If this option is enabled +// `pointer_safety` and `get_pointer_safety()` will no longer be available +// in C++03. +# define _LIBCPP_ABI_POINTER_SAFETY_ENUM_TYPE +// Define a key function for `bad_function_call` in the library, to centralize +// its vtable and typeinfo to libc++ rather than having all other libraries +// using that class define their own copies. +# define _LIBCPP_ABI_BAD_FUNCTION_CALL_KEY_FUNCTION +// Enable optimized version of __do_get_(un)signed which avoids redundant copies. +# define _LIBCPP_ABI_OPTIMIZED_LOCALE_NUM_GET +// Use the smallest possible integer type to represent the index of the variant. +// Previously libc++ used "unsigned int" exclusively. +# define _LIBCPP_ABI_VARIANT_INDEX_TYPE_OPTIMIZATION +// Unstable attempt to provide a more optimized std::function +# define _LIBCPP_ABI_OPTIMIZED_FUNCTION +// All the regex constants must be distinct and nonzero. +# define _LIBCPP_ABI_REGEX_CONSTANTS_NONZERO +#elif _LIBCPP_ABI_VERSION == 1 +# if !defined(_LIBCPP_OBJECT_FORMAT_COFF) +// Enable compiling copies of now inline methods into the dylib to support +// applications compiled against older libraries. This is unnecessary with +// COFF dllexport semantics, since dllexport forces a non-inline definition +// of inline functions to be emitted anyway. Our own non-inline copy would +// conflict with the dllexport-emitted copy, so we disable it. +# define _LIBCPP_DEPRECATED_ABI_LEGACY_LIBRARY_DEFINITIONS_FOR_INLINE_FUNCTIONS +# endif +// Feature macros for disabling pre ABI v1 features. All of these options +// are deprecated. +# if defined(__FreeBSD__) +# define _LIBCPP_DEPRECATED_ABI_DISABLE_PAIR_TRIVIAL_COPY_CTOR +# endif +#endif + +#ifdef _LIBCPP_TRIVIAL_PAIR_COPY_CTOR +#error "_LIBCPP_TRIVIAL_PAIR_COPY_CTOR" is no longer supported. \ + use _LIBCPP_DEPRECATED_ABI_DISABLE_PAIR_TRIVIAL_COPY_CTOR instead +#endif + +#define _LIBCPP_CONCAT1(_LIBCPP_X,_LIBCPP_Y) _LIBCPP_X##_LIBCPP_Y +#define _LIBCPP_CONCAT(_LIBCPP_X,_LIBCPP_Y) _LIBCPP_CONCAT1(_LIBCPP_X,_LIBCPP_Y) + +#ifndef _LIBCPP_ABI_NAMESPACE +# define _LIBCPP_ABI_NAMESPACE _LIBCPP_CONCAT(__,_LIBCPP_ABI_VERSION) +#endif + +#if __cplusplus < 201103L +#define _LIBCPP_CXX03_LANG +#endif + +#ifndef __has_attribute +#define __has_attribute(__x) 0 +#endif + +#ifndef __has_builtin +#define __has_builtin(__x) 0 +#endif + +#ifndef __has_extension +#define __has_extension(__x) 0 +#endif + +#ifndef __has_feature +#define __has_feature(__x) 0 +#endif + +#ifndef __has_cpp_attribute +#define __has_cpp_attribute(__x) 0 +#endif + +// '__is_identifier' returns '0' if '__x' is a reserved identifier provided by +// the compiler and '1' otherwise. +#ifndef __is_identifier +#define __is_identifier(__x) 1 +#endif + +#ifndef __has_declspec_attribute +#define __has_declspec_attribute(__x) 0 +#endif + +#define __has_keyword(__x) !(__is_identifier(__x)) + +#ifndef __has_include +#define __has_include(...) 0 +#endif + +#if defined(__clang__) +# define _LIBCPP_COMPILER_CLANG +# ifndef __apple_build_version__ +# define _LIBCPP_CLANG_VER (__clang_major__ * 100 + __clang_minor__) +# endif +#elif defined(__GNUC__) +# define _LIBCPP_COMPILER_GCC +#elif defined(_MSC_VER) +# define _LIBCPP_COMPILER_MSVC +#elif defined(__IBMCPP__) +# define _LIBCPP_COMPILER_IBM +#endif + +#if defined(_LIBCPP_COMPILER_GCC) && __cplusplus < 201103L +#error "libc++ does not support using GCC with C++03. Please enable C++11" +#endif + +// FIXME: ABI detection should be done via compiler builtin macros. This +// is just a placeholder until Clang implements such macros. For now assume +// that Windows compilers pretending to be MSVC++ target the Microsoft ABI, +// and allow the user to explicitly specify the ABI to handle cases where this +// heuristic falls short. +#if defined(_LIBCPP_ABI_FORCE_ITANIUM) && defined(_LIBCPP_ABI_FORCE_MICROSOFT) +# error "Only one of _LIBCPP_ABI_FORCE_ITANIUM and _LIBCPP_ABI_FORCE_MICROSOFT can be defined" +#elif defined(_LIBCPP_ABI_FORCE_ITANIUM) +# define _LIBCPP_ABI_ITANIUM +#elif defined(_LIBCPP_ABI_FORCE_MICROSOFT) +# define _LIBCPP_ABI_MICROSOFT +#else +# if defined(_WIN32) && defined(_MSC_VER) +# define _LIBCPP_ABI_MICROSOFT +# else +# define _LIBCPP_ABI_ITANIUM +# endif +#endif + +#if defined(_LIBCPP_ABI_MICROSOFT) && !defined(_LIBCPP_NO_VCRUNTIME) +# define _LIBCPP_ABI_VCRUNTIME +#endif + +// Need to detect which libc we're using if we're on Linux. +#if defined(__linux__) +# include +# if defined(__GLIBC_PREREQ) +# define _LIBCPP_GLIBC_PREREQ(a, b) __GLIBC_PREREQ(a, b) +# else +# define _LIBCPP_GLIBC_PREREQ(a, b) 0 +# endif // defined(__GLIBC_PREREQ) +#endif // defined(__linux__) + +#ifdef __LITTLE_ENDIAN__ +# if __LITTLE_ENDIAN__ +# define _LIBCPP_LITTLE_ENDIAN +# endif // __LITTLE_ENDIAN__ +#endif // __LITTLE_ENDIAN__ + +#ifdef __BIG_ENDIAN__ +# if __BIG_ENDIAN__ +# define _LIBCPP_BIG_ENDIAN +# endif // __BIG_ENDIAN__ +#endif // __BIG_ENDIAN__ + +#ifdef __BYTE_ORDER__ +# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +# define _LIBCPP_LITTLE_ENDIAN +# elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ +# define _LIBCPP_BIG_ENDIAN +# endif // __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ +#endif // __BYTE_ORDER__ + +#ifdef __FreeBSD__ +# include +# include +# if _BYTE_ORDER == _LITTLE_ENDIAN +# define _LIBCPP_LITTLE_ENDIAN +# else // _BYTE_ORDER == _LITTLE_ENDIAN +# define _LIBCPP_BIG_ENDIAN +# endif // _BYTE_ORDER == _LITTLE_ENDIAN +# ifndef __LONG_LONG_SUPPORTED +# define _LIBCPP_HAS_NO_LONG_LONG +# endif // __LONG_LONG_SUPPORTED +#endif // __FreeBSD__ + +#ifdef __NetBSD__ +# include +# if _BYTE_ORDER == _LITTLE_ENDIAN +# define _LIBCPP_LITTLE_ENDIAN +# else // _BYTE_ORDER == _LITTLE_ENDIAN +# define _LIBCPP_BIG_ENDIAN +# endif // _BYTE_ORDER == _LITTLE_ENDIAN +# define _LIBCPP_HAS_QUICK_EXIT +#endif // __NetBSD__ + +#if defined(_WIN32) +# define _LIBCPP_WIN32API +# define _LIBCPP_LITTLE_ENDIAN +# define _LIBCPP_SHORT_WCHAR 1 +// Both MinGW and native MSVC provide a "MSVC"-like environment +# define _LIBCPP_MSVCRT_LIKE +// If mingw not explicitly detected, assume using MS C runtime only if +// a MS compatibility version is specified. +# if defined(_MSC_VER) && !defined(__MINGW32__) +# define _LIBCPP_MSVCRT // Using Microsoft's C Runtime library +# endif +# if (defined(_M_AMD64) || defined(__x86_64__)) || (defined(_M_ARM) || defined(__arm__)) +# define _LIBCPP_HAS_BITSCAN64 +# endif +# define _LIBCPP_HAS_OPEN_WITH_WCHAR +# if defined(_LIBCPP_MSVCRT) +# define _LIBCPP_HAS_QUICK_EXIT +# endif + +// Some CRT APIs are unavailable to store apps +# if defined(WINAPI_FAMILY) +# include +# if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && \ + (!defined(WINAPI_PARTITION_SYSTEM) || \ + !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_SYSTEM)) +# define _LIBCPP_WINDOWS_STORE_APP +# endif +# endif +#endif // defined(_WIN32) + +#ifdef __sun__ +# include +# ifdef _LITTLE_ENDIAN +# define _LIBCPP_LITTLE_ENDIAN +# else +# define _LIBCPP_BIG_ENDIAN +# endif +#endif // __sun__ + +#if defined(__CloudABI__) + // Certain architectures provide arc4random(). Prefer using + // arc4random() over /dev/{u,}random to make it possible to obtain + // random data even when using sandboxing mechanisms such as chroots, + // Capsicum, etc. +# define _LIBCPP_USING_ARC4_RANDOM +#elif defined(__Fuchsia__) || defined(__wasi__) +# define _LIBCPP_USING_GETENTROPY +#elif defined(__native_client__) + // NaCl's sandbox (which PNaCl also runs in) doesn't allow filesystem access, + // including accesses to the special files under /dev. C++11's + // std::random_device is instead exposed through a NaCl syscall. +# define _LIBCPP_USING_NACL_RANDOM +#elif defined(_LIBCPP_WIN32API) +# define _LIBCPP_USING_WIN32_RANDOM +#else +# define _LIBCPP_USING_DEV_RANDOM +#endif + +#if !defined(_LIBCPP_LITTLE_ENDIAN) && !defined(_LIBCPP_BIG_ENDIAN) +# include +# if __BYTE_ORDER == __LITTLE_ENDIAN +# define _LIBCPP_LITTLE_ENDIAN +# elif __BYTE_ORDER == __BIG_ENDIAN +# define _LIBCPP_BIG_ENDIAN +# else // __BYTE_ORDER == __BIG_ENDIAN +# error unable to determine endian +# endif +#endif // !defined(_LIBCPP_LITTLE_ENDIAN) && !defined(_LIBCPP_BIG_ENDIAN) + +#if __has_attribute(__no_sanitize__) && !defined(_LIBCPP_COMPILER_GCC) +# define _LIBCPP_NO_CFI __attribute__((__no_sanitize__("cfi"))) +#else +# define _LIBCPP_NO_CFI +#endif + +#if __ISO_C_VISIBLE >= 2011 || __cplusplus >= 201103L +# if defined(__FreeBSD__) +# define _LIBCPP_HAS_QUICK_EXIT +# define _LIBCPP_HAS_C11_FEATURES +# elif defined(__Fuchsia__) || defined(__wasi__) +# define _LIBCPP_HAS_QUICK_EXIT +# define _LIBCPP_HAS_TIMESPEC_GET +# define _LIBCPP_HAS_C11_FEATURES +# elif defined(__linux__) +# if !defined(_LIBCPP_HAS_MUSL_LIBC) +# if _LIBCPP_GLIBC_PREREQ(2, 15) || defined(__BIONIC__) +# define _LIBCPP_HAS_QUICK_EXIT +# endif +# if _LIBCPP_GLIBC_PREREQ(2, 17) +# define _LIBCPP_HAS_C11_FEATURES +# define _LIBCPP_HAS_TIMESPEC_GET +# endif +# else // defined(_LIBCPP_HAS_MUSL_LIBC) +# define _LIBCPP_HAS_QUICK_EXIT +# define _LIBCPP_HAS_TIMESPEC_GET +# define _LIBCPP_HAS_C11_FEATURES +# endif +# endif // __linux__ +#endif + +#ifndef _LIBCPP_CXX03_LANG +# define _LIBCPP_ALIGNOF(_Tp) alignof(_Tp) +#elif defined(_LIBCPP_COMPILER_CLANG) +# define _LIBCPP_ALIGNOF(_Tp) _Alignof(_Tp) +#else +// This definition is potentially buggy, but it's only taken with GCC in C++03, +// which we barely support anyway. See llvm.org/PR39713 +# define _LIBCPP_ALIGNOF(_Tp) __alignof(_Tp) +#endif + +#define _LIBCPP_PREFERRED_ALIGNOF(_Tp) __alignof(_Tp) + +#if defined(_LIBCPP_COMPILER_CLANG) + +// _LIBCPP_ALTERNATE_STRING_LAYOUT is an old name for +// _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT left here for backward compatibility. +#if (defined(__APPLE__) && !defined(__i386__) && !defined(__x86_64__) && \ + (!defined(__arm__) || __ARM_ARCH_7K__ >= 2)) || \ + defined(_LIBCPP_ALTERNATE_STRING_LAYOUT) +#define _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT +#endif + +#if __has_feature(cxx_alignas) +# define _ALIGNAS_TYPE(x) alignas(x) +# define _ALIGNAS(x) alignas(x) +#else +# define _ALIGNAS_TYPE(x) __attribute__((__aligned__(_LIBCPP_ALIGNOF(x)))) +# define _ALIGNAS(x) __attribute__((__aligned__(x))) +#endif + +#if __cplusplus < 201103L +typedef __char16_t char16_t; +typedef __char32_t char32_t; +#endif + +#if !(__has_feature(cxx_exceptions)) && !defined(_LIBCPP_NO_EXCEPTIONS) +#define _LIBCPP_NO_EXCEPTIONS +#endif + +#if !(__has_feature(cxx_rtti)) && !defined(_LIBCPP_NO_RTTI) +#define _LIBCPP_NO_RTTI +#endif + +#if !(__has_feature(cxx_strong_enums)) +#define _LIBCPP_HAS_NO_STRONG_ENUMS +#endif + +#if __has_feature(cxx_attributes) +# define _LIBCPP_NORETURN [[noreturn]] +#else +# define _LIBCPP_NORETURN __attribute__ ((noreturn)) +#endif + +#if !(__has_feature(cxx_lambdas)) +#define _LIBCPP_HAS_NO_LAMBDAS +#endif + +#if !(__has_feature(cxx_nullptr)) +# if (__has_extension(cxx_nullptr) || __has_keyword(__nullptr)) && defined(_LIBCPP_ABI_ALWAYS_USE_CXX11_NULLPTR) +# define nullptr __nullptr +# else +# define _LIBCPP_HAS_NO_NULLPTR +# endif +#endif + +#if !(__has_feature(cxx_rvalue_references)) +#define _LIBCPP_HAS_NO_RVALUE_REFERENCES +#endif + +#if !(__has_feature(cxx_auto_type)) +#define _LIBCPP_HAS_NO_AUTO_TYPE +#endif + +#if !(__has_feature(cxx_variadic_templates)) +#define _LIBCPP_HAS_NO_VARIADICS +#endif + +// Objective-C++ features (opt-in) +#if __has_feature(objc_arc) +#define _LIBCPP_HAS_OBJC_ARC +#endif + +#if __has_feature(objc_arc_weak) +#define _LIBCPP_HAS_OBJC_ARC_WEAK +#endif + +#if !(__has_feature(cxx_relaxed_constexpr)) +#define _LIBCPP_HAS_NO_CXX14_CONSTEXPR +#endif + +#if !(__has_feature(cxx_variable_templates)) +#define _LIBCPP_HAS_NO_VARIABLE_TEMPLATES +#endif + +#if !(__has_feature(cxx_noexcept)) +#define _LIBCPP_HAS_NO_NOEXCEPT +#endif + +#if !defined(_LIBCPP_HAS_NO_ASAN) && !__has_feature(address_sanitizer) +#define _LIBCPP_HAS_NO_ASAN +#endif + +// Allow for build-time disabling of unsigned integer sanitization +#if !defined(_LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK) && __has_attribute(no_sanitize) +#define _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK __attribute__((__no_sanitize__("unsigned-integer-overflow"))) +#endif + +#if __has_builtin(__builtin_launder) +#define _LIBCPP_COMPILER_HAS_BUILTIN_LAUNDER +#endif + +#if !__is_identifier(__has_unique_object_representations) +#define _LIBCPP_HAS_UNIQUE_OBJECT_REPRESENTATIONS +#endif + +#define _LIBCPP_ALWAYS_INLINE __attribute__ ((__always_inline__)) + +// Literal operators ""d and ""y are supported starting with LLVM Clang 8 and AppleClang 10.0.1 +#if (defined(_LIBCPP_CLANG_VER) && _LIBCPP_CLANG_VER < 800) || \ + (defined(__apple_build_version__) && __apple_build_version__ < 10010000) +#define _LIBCPP_HAS_NO_CXX20_CHRONO_LITERALS +#endif + +#define _LIBCPP_DISABLE_EXTENSION_WARNING __extension__ + +#elif defined(_LIBCPP_COMPILER_GCC) + +#define _ALIGNAS(x) __attribute__((__aligned__(x))) +#define _ALIGNAS_TYPE(x) __attribute__((__aligned__(_LIBCPP_ALIGNOF(x)))) + +#define _LIBCPP_NORETURN __attribute__((noreturn)) + +#if !__EXCEPTIONS && !defined(_LIBCPP_NO_EXCEPTIONS) +#define _LIBCPP_NO_EXCEPTIONS +#endif + +// Determine if GCC supports relaxed constexpr +#if !defined(__cpp_constexpr) || __cpp_constexpr < 201304L +#define _LIBCPP_HAS_NO_CXX14_CONSTEXPR +#endif + +// GCC 5 supports variable templates +#if !defined(__cpp_variable_templates) || __cpp_variable_templates < 201304L +#define _LIBCPP_HAS_NO_VARIABLE_TEMPLATES +#endif + +#if !defined(_LIBCPP_HAS_NO_ASAN) && !defined(__SANITIZE_ADDRESS__) +#define _LIBCPP_HAS_NO_ASAN +#endif + +#if _GNUC_VER >= 700 +#define _LIBCPP_COMPILER_HAS_BUILTIN_LAUNDER +#endif + +#if _GNUC_VER >= 700 +#define _LIBCPP_HAS_UNIQUE_OBJECT_REPRESENTATIONS +#endif + +#define _LIBCPP_ALWAYS_INLINE __attribute__ ((__always_inline__)) + +#define _LIBCPP_DISABLE_EXTENSION_WARNING __extension__ + +#elif defined(_LIBCPP_COMPILER_MSVC) + +#define _LIBCPP_TOSTRING2(x) #x +#define _LIBCPP_TOSTRING(x) _LIBCPP_TOSTRING2(x) +#define _LIBCPP_WARNING(x) __pragma(message(__FILE__ "(" _LIBCPP_TOSTRING(__LINE__) ") : warning note: " x)) + +#if _MSC_VER < 1900 +#error "MSVC versions prior to Visual Studio 2015 are not supported" +#endif + +#define _LIBCPP_HAS_NO_CXX14_CONSTEXPR +#define _LIBCPP_HAS_NO_VARIABLE_TEMPLATES +#define __alignof__ __alignof +#define _LIBCPP_NORETURN __declspec(noreturn) +#define _ALIGNAS(x) __declspec(align(x)) +#define _ALIGNAS_TYPE(x) alignas(x) + +#define _LIBCPP_WEAK + +#define _LIBCPP_HAS_NO_ASAN + +#define _LIBCPP_ALWAYS_INLINE __forceinline + +#define _LIBCPP_HAS_NO_VECTOR_EXTENSION + +#define _LIBCPP_DISABLE_EXTENSION_WARNING + +#elif defined(_LIBCPP_COMPILER_IBM) + +#define _ALIGNAS(x) __attribute__((__aligned__(x))) +#define _ALIGNAS_TYPE(x) __attribute__((__aligned__(_LIBCPP_ALIGNOF(x)))) +#define _ATTRIBUTE(x) __attribute__((x)) +#define _LIBCPP_NORETURN __attribute__((noreturn)) + +#define _LIBCPP_HAS_NO_UNICODE_CHARS +#define _LIBCPP_HAS_NO_VARIABLE_TEMPLATES + +#if defined(_AIX) +#define __MULTILOCALE_API +#endif + +#define _LIBCPP_HAS_NO_ASAN + +#define _LIBCPP_ALWAYS_INLINE __attribute__ ((__always_inline__)) + +#define _LIBCPP_HAS_NO_VECTOR_EXTENSION + +#define _LIBCPP_DISABLE_EXTENSION_WARNING + +#endif // _LIBCPP_COMPILER_[CLANG|GCC|MSVC|IBM] + +#if defined(_LIBCPP_OBJECT_FORMAT_COFF) + +#ifdef _DLL +# define _LIBCPP_CRT_FUNC __declspec(dllimport) +#else +# define _LIBCPP_CRT_FUNC +#endif + +#if defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) +# define _LIBCPP_DLL_VIS +# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS +# define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS +# define _LIBCPP_OVERRIDABLE_FUNC_VIS +# define _LIBCPP_EXPORTED_FROM_ABI +#elif defined(_LIBCPP_BUILDING_LIBRARY) +# define _LIBCPP_DLL_VIS __declspec(dllexport) +# if defined(__MINGW32__) +# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS _LIBCPP_DLL_VIS +# define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS +# else +# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS +# define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS _LIBCPP_DLL_VIS +# endif +# define _LIBCPP_OVERRIDABLE_FUNC_VIS _LIBCPP_DLL_VIS +# define _LIBCPP_EXPORTED_FROM_ABI __declspec(dllexport) +#else +# define _LIBCPP_DLL_VIS __declspec(dllimport) +# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS _LIBCPP_DLL_VIS +# define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS +# define _LIBCPP_OVERRIDABLE_FUNC_VIS +# define _LIBCPP_EXPORTED_FROM_ABI __declspec(dllimport) +#endif + +#define _LIBCPP_TYPE_VIS _LIBCPP_DLL_VIS +#define _LIBCPP_FUNC_VIS _LIBCPP_DLL_VIS +#define _LIBCPP_EXCEPTION_ABI _LIBCPP_DLL_VIS +#define _LIBCPP_HIDDEN +#define _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS +#define _LIBCPP_TEMPLATE_VIS +#define _LIBCPP_ENUM_VIS + +#endif // defined(_LIBCPP_OBJECT_FORMAT_COFF) + +#ifndef _LIBCPP_HIDDEN +# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) +# define _LIBCPP_HIDDEN __attribute__ ((__visibility__("hidden"))) +# else +# define _LIBCPP_HIDDEN +# endif +#endif + +#ifndef _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS +# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) +// The inline should be removed once PR32114 is resolved +# define _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS inline _LIBCPP_HIDDEN +# else +# define _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS +# endif +#endif + +#ifndef _LIBCPP_FUNC_VIS +# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) +# define _LIBCPP_FUNC_VIS __attribute__ ((__visibility__("default"))) +# else +# define _LIBCPP_FUNC_VIS +# endif +#endif + +#ifndef _LIBCPP_TYPE_VIS +# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) +# define _LIBCPP_TYPE_VIS __attribute__ ((__visibility__("default"))) +# else +# define _LIBCPP_TYPE_VIS +# endif +#endif + +#ifndef _LIBCPP_TEMPLATE_VIS +# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) +# if __has_attribute(__type_visibility__) +# define _LIBCPP_TEMPLATE_VIS __attribute__ ((__type_visibility__("default"))) +# else +# define _LIBCPP_TEMPLATE_VIS __attribute__ ((__visibility__("default"))) +# endif +# else +# define _LIBCPP_TEMPLATE_VIS +# endif +#endif + +#ifndef _LIBCPP_EXPORTED_FROM_ABI +# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) +# define _LIBCPP_EXPORTED_FROM_ABI __attribute__((__visibility__("default"))) +# else +# define _LIBCPP_EXPORTED_FROM_ABI +# endif +#endif + +#ifndef _LIBCPP_OVERRIDABLE_FUNC_VIS +#define _LIBCPP_OVERRIDABLE_FUNC_VIS _LIBCPP_FUNC_VIS +#endif + +#ifndef _LIBCPP_EXCEPTION_ABI +# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) +# define _LIBCPP_EXCEPTION_ABI __attribute__ ((__visibility__("default"))) +# else +# define _LIBCPP_EXCEPTION_ABI +# endif +#endif + +#ifndef _LIBCPP_ENUM_VIS +# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) && __has_attribute(__type_visibility__) +# define _LIBCPP_ENUM_VIS __attribute__ ((__type_visibility__("default"))) +# else +# define _LIBCPP_ENUM_VIS +# endif +#endif + +#ifndef _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS +# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) && __has_attribute(__type_visibility__) +# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __attribute__ ((__visibility__("default"))) +# else +# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS +# endif +#endif + +#ifndef _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS +#define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS +#endif + +#if __has_attribute(internal_linkage) +# define _LIBCPP_INTERNAL_LINKAGE __attribute__ ((internal_linkage)) +#else +# define _LIBCPP_INTERNAL_LINKAGE _LIBCPP_ALWAYS_INLINE +#endif + +#if __has_attribute(exclude_from_explicit_instantiation) +# define _LIBCPP_EXCLUDE_FROM_EXPLICIT_INSTANTIATION __attribute__ ((__exclude_from_explicit_instantiation__)) +#else + // Try to approximate the effect of exclude_from_explicit_instantiation + // (which is that entities are not assumed to be provided by explicit + // template instantiations in the dylib) by always inlining those entities. +# define _LIBCPP_EXCLUDE_FROM_EXPLICIT_INSTANTIATION _LIBCPP_ALWAYS_INLINE +#endif + +#ifndef _LIBCPP_HIDE_FROM_ABI_PER_TU +# ifndef _LIBCPP_HIDE_FROM_ABI_PER_TU_BY_DEFAULT +# define _LIBCPP_HIDE_FROM_ABI_PER_TU 0 +# else +# define _LIBCPP_HIDE_FROM_ABI_PER_TU 1 +# endif +#endif + +#ifndef _LIBCPP_HAS_MERGED_TYPEINFO_NAMES_DEFAULT +# ifdef _LIBCPP_OBJECT_FORMAT_COFF // Windows binaries can't merge typeinfos. +# define _LIBCPP_HAS_MERGED_TYPEINFO_NAMES_DEFAULT 0 +#else +// TODO: This isn't strictly correct on ELF platforms due to llvm.org/PR37398 +// And we should consider defaulting to OFF. +# define _LIBCPP_HAS_MERGED_TYPEINFO_NAMES_DEFAULT 1 +#endif +#endif + +#ifndef _LIBCPP_HIDE_FROM_ABI +# if _LIBCPP_HIDE_FROM_ABI_PER_TU +# define _LIBCPP_HIDE_FROM_ABI _LIBCPP_HIDDEN _LIBCPP_INTERNAL_LINKAGE +# else +# define _LIBCPP_HIDE_FROM_ABI _LIBCPP_HIDDEN _LIBCPP_EXCLUDE_FROM_EXPLICIT_INSTANTIATION +# endif +#endif + +#ifdef _LIBCPP_BUILDING_LIBRARY +# if _LIBCPP_ABI_VERSION > 1 +# define _LIBCPP_HIDE_FROM_ABI_AFTER_V1 _LIBCPP_HIDE_FROM_ABI +# else +# define _LIBCPP_HIDE_FROM_ABI_AFTER_V1 +# endif +#else +# define _LIBCPP_HIDE_FROM_ABI_AFTER_V1 _LIBCPP_HIDE_FROM_ABI +#endif + +// Just so we can migrate to the new macros gradually. +#define _LIBCPP_INLINE_VISIBILITY _LIBCPP_HIDE_FROM_ABI + +// Inline namespaces are available in Clang/GCC/MSVC regardless of C++ dialect. +#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std { inline namespace _LIBCPP_ABI_NAMESPACE { +#define _LIBCPP_END_NAMESPACE_STD } } +#define _VSTD std::_LIBCPP_ABI_NAMESPACE +_LIBCPP_BEGIN_NAMESPACE_STD _LIBCPP_END_NAMESPACE_STD + +#if _LIBCPP_STD_VER >= 17 +#define _LIBCPP_BEGIN_NAMESPACE_FILESYSTEM \ + _LIBCPP_BEGIN_NAMESPACE_STD inline namespace __fs { namespace filesystem { +#else +#define _LIBCPP_BEGIN_NAMESPACE_FILESYSTEM \ + _LIBCPP_BEGIN_NAMESPACE_STD namespace __fs { namespace filesystem { +#endif + +#define _LIBCPP_END_NAMESPACE_FILESYSTEM \ + _LIBCPP_END_NAMESPACE_STD } } + +#define _VSTD_FS _VSTD::__fs::filesystem + +#ifndef _LIBCPP_PREFERRED_OVERLOAD +# if __has_attribute(__enable_if__) +# define _LIBCPP_PREFERRED_OVERLOAD __attribute__ ((__enable_if__(true, ""))) +# endif +#endif + +#ifndef _LIBCPP_HAS_NO_NOEXCEPT +# define _NOEXCEPT noexcept +# define _NOEXCEPT_(x) noexcept(x) +#else +# define _NOEXCEPT throw() +# define _NOEXCEPT_(x) +#endif + +#ifdef _LIBCPP_HAS_NO_UNICODE_CHARS +typedef unsigned short char16_t; +typedef unsigned int char32_t; +#endif // _LIBCPP_HAS_NO_UNICODE_CHARS + +#ifndef __SIZEOF_INT128__ +#define _LIBCPP_HAS_NO_INT128 +#endif + +#ifdef _LIBCPP_CXX03_LANG +# define static_assert(...) _Static_assert(__VA_ARGS__) +# define decltype(...) __decltype(__VA_ARGS__) +#endif // _LIBCPP_CXX03_LANG + +#ifdef _LIBCPP_CXX03_LANG +# define _LIBCPP_CONSTEXPR +#else +# define _LIBCPP_CONSTEXPR constexpr +#endif + +#ifdef _LIBCPP_CXX03_LANG +# define _LIBCPP_DEFAULT {} +#else +# define _LIBCPP_DEFAULT = default; +#endif + +#ifdef _LIBCPP_CXX03_LANG +# define _LIBCPP_EQUAL_DELETE +#else +# define _LIBCPP_EQUAL_DELETE = delete +#endif + +#ifdef __GNUC__ +# define _LIBCPP_NOALIAS __attribute__((__malloc__)) +#else +# define _LIBCPP_NOALIAS +#endif + +#if __has_feature(cxx_explicit_conversions) || defined(__IBMCPP__) || \ + (!defined(_LIBCPP_CXX03_LANG) && defined(__GNUC__)) // All supported GCC versions +# define _LIBCPP_EXPLICIT explicit +#else +# define _LIBCPP_EXPLICIT +#endif + +#if !__has_builtin(__builtin_operator_new) || !__has_builtin(__builtin_operator_delete) +#define _LIBCPP_HAS_NO_BUILTIN_OPERATOR_NEW_DELETE +#endif + +#ifdef _LIBCPP_HAS_NO_STRONG_ENUMS +# define _LIBCPP_DECLARE_STRONG_ENUM(x) struct _LIBCPP_TYPE_VIS x { enum __lx +# define _LIBCPP_DECLARE_STRONG_ENUM_EPILOG(x) \ + __lx __v_; \ + _LIBCPP_INLINE_VISIBILITY x(__lx __v) : __v_(__v) {} \ + _LIBCPP_INLINE_VISIBILITY explicit x(int __v) : __v_(static_cast<__lx>(__v)) {} \ + _LIBCPP_INLINE_VISIBILITY operator int() const {return __v_;} \ + }; +#else // _LIBCPP_HAS_NO_STRONG_ENUMS +# define _LIBCPP_DECLARE_STRONG_ENUM(x) enum class _LIBCPP_ENUM_VIS x +# define _LIBCPP_DECLARE_STRONG_ENUM_EPILOG(x) +#endif // _LIBCPP_HAS_NO_STRONG_ENUMS + +#ifdef _LIBCPP_DEBUG +# if _LIBCPP_DEBUG == 0 +# define _LIBCPP_DEBUG_LEVEL 1 +# elif _LIBCPP_DEBUG == 1 +# define _LIBCPP_DEBUG_LEVEL 2 +# else +# error Supported values for _LIBCPP_DEBUG are 0 and 1 +# endif +# if !defined(_LIBCPP_BUILDING_LIBRARY) +# define _LIBCPP_EXTERN_TEMPLATE(...) +# endif +#endif + +#ifdef _LIBCPP_DISABLE_EXTERN_TEMPLATE +#define _LIBCPP_EXTERN_TEMPLATE(...) +#define _LIBCPP_EXTERN_TEMPLATE2(...) +#endif + +#ifndef _LIBCPP_EXTERN_TEMPLATE +#define _LIBCPP_EXTERN_TEMPLATE(...) extern template __VA_ARGS__; +#endif + +#ifndef _LIBCPP_EXTERN_TEMPLATE2 +#define _LIBCPP_EXTERN_TEMPLATE2(...) extern template __VA_ARGS__; +#endif + +#if defined(__APPLE__) || defined(__FreeBSD__) || defined(_LIBCPP_MSVCRT_LIKE) || \ + defined(__sun__) || defined(__NetBSD__) || defined(__CloudABI__) +#define _LIBCPP_LOCALE__L_EXTENSIONS 1 +#endif + +#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) +// Most unix variants have catopen. These are the specific ones that don't. +# if !defined(__BIONIC__) && !defined(_NEWLIB_VERSION) +# define _LIBCPP_HAS_CATOPEN 1 +# endif +#endif + +#ifdef __FreeBSD__ +#define _DECLARE_C99_LDBL_MATH 1 +#endif + +// If we are getting operator new from the MSVC CRT, then allocation overloads +// for align_val_t were added in 19.12, aka VS 2017 version 15.3. +#if defined(_LIBCPP_MSVCRT) && defined(_MSC_VER) && _MSC_VER < 1912 +# define _LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION +#elif defined(_LIBCPP_ABI_VCRUNTIME) && !defined(__cpp_aligned_new) + // We're deferring to Microsoft's STL to provide aligned new et al. We don't + // have it unless the language feature test macro is defined. +# define _LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION +#endif + +#if defined(__APPLE__) +# if !defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && \ + defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) +# define __MAC_OS_X_VERSION_MIN_REQUIRED __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ +# endif +#endif // defined(__APPLE__) + +#if !defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION) && \ + (defined(_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION) || \ + (!defined(__cpp_aligned_new) || __cpp_aligned_new < 201606)) +# define _LIBCPP_HAS_NO_ALIGNED_ALLOCATION +#endif + +#if defined(__APPLE__) || defined(__FreeBSD__) +#define _LIBCPP_HAS_DEFAULTRUNELOCALE +#endif + +#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__sun__) +#define _LIBCPP_WCTYPE_IS_MASK +#endif + +#if _LIBCPP_STD_VER <= 17 || !defined(__cpp_char8_t) +#define _LIBCPP_NO_HAS_CHAR8_T +#endif + +// Deprecation macros. +// +// Deprecations warnings are always enabled, except when users explicitly opt-out +// by defining _LIBCPP_DISABLE_DEPRECATION_WARNINGS. +#if !defined(_LIBCPP_DISABLE_DEPRECATION_WARNINGS) +# if __has_attribute(deprecated) +# define _LIBCPP_DEPRECATED __attribute__ ((deprecated)) +# elif _LIBCPP_STD_VER > 11 +# define _LIBCPP_DEPRECATED [[deprecated]] +# else +# define _LIBCPP_DEPRECATED +# endif +#else +# define _LIBCPP_DEPRECATED +#endif + +#if !defined(_LIBCPP_CXX03_LANG) +# define _LIBCPP_DEPRECATED_IN_CXX11 _LIBCPP_DEPRECATED +#else +# define _LIBCPP_DEPRECATED_IN_CXX11 +#endif + +#if _LIBCPP_STD_VER >= 14 +# define _LIBCPP_DEPRECATED_IN_CXX14 _LIBCPP_DEPRECATED +#else +# define _LIBCPP_DEPRECATED_IN_CXX14 +#endif + +#if _LIBCPP_STD_VER >= 17 +# define _LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_DEPRECATED +#else +# define _LIBCPP_DEPRECATED_IN_CXX17 +#endif + +// Macros to enter and leave a state where deprecation warnings are suppressed. +#if !defined(_LIBCPP_SUPPRESS_DEPRECATED_PUSH) && \ + (defined(_LIBCPP_COMPILER_CLANG) || defined(_LIBCPP_COMPILER_GCC)) +# define _LIBCPP_SUPPRESS_DEPRECATED_PUSH \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wdeprecated\"") +# define _LIBCPP_SUPPRESS_DEPRECATED_POP \ + _Pragma("GCC diagnostic pop") +#endif +#if !defined(_LIBCPP_SUPPRESS_DEPRECATED_PUSH) +# define _LIBCPP_SUPPRESS_DEPRECATED_PUSH +# define _LIBCPP_SUPPRESS_DEPRECATED_POP +#endif + +#if _LIBCPP_STD_VER <= 11 +# define _LIBCPP_EXPLICIT_AFTER_CXX11 +#else +# define _LIBCPP_EXPLICIT_AFTER_CXX11 explicit +#endif + +#if _LIBCPP_STD_VER > 11 && !defined(_LIBCPP_HAS_NO_CXX14_CONSTEXPR) +# define _LIBCPP_CONSTEXPR_AFTER_CXX11 constexpr +#else +# define _LIBCPP_CONSTEXPR_AFTER_CXX11 +#endif + +#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_CXX14_CONSTEXPR) +# define _LIBCPP_CONSTEXPR_AFTER_CXX14 constexpr +#else +# define _LIBCPP_CONSTEXPR_AFTER_CXX14 +#endif + +#if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_CXX14_CONSTEXPR) +# define _LIBCPP_CONSTEXPR_AFTER_CXX17 constexpr +#else +# define _LIBCPP_CONSTEXPR_AFTER_CXX17 +#endif + +// The _LIBCPP_NODISCARD_ATTRIBUTE should only be used to define other +// NODISCARD macros to the correct attribute. +#if __has_cpp_attribute(nodiscard) || defined(_LIBCPP_COMPILER_MSVC) +# define _LIBCPP_NODISCARD_ATTRIBUTE [[nodiscard]] +#elif defined(_LIBCPP_COMPILER_CLANG) && !defined(_LIBCPP_CXX03_LANG) +# define _LIBCPP_NODISCARD_ATTRIBUTE [[clang::warn_unused_result]] +#else +// We can't use GCC's [[gnu::warn_unused_result]] and +// __attribute__((warn_unused_result)), because GCC does not silence them via +// (void) cast. +# define _LIBCPP_NODISCARD_ATTRIBUTE +#endif + +// _LIBCPP_NODISCARD_EXT may be used to apply [[nodiscard]] to entities not +// specified as such as an extension. +#if defined(_LIBCPP_ENABLE_NODISCARD) && !defined(_LIBCPP_DISABLE_NODISCARD_EXT) +# define _LIBCPP_NODISCARD_EXT _LIBCPP_NODISCARD_ATTRIBUTE +#else +# define _LIBCPP_NODISCARD_EXT +#endif + +#if !defined(_LIBCPP_DISABLE_NODISCARD_AFTER_CXX17) && \ + (_LIBCPP_STD_VER > 17 || defined(_LIBCPP_ENABLE_NODISCARD)) +# define _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_NODISCARD_ATTRIBUTE +#else +# define _LIBCPP_NODISCARD_AFTER_CXX17 +#endif + +#if _LIBCPP_STD_VER > 14 && defined(__cpp_inline_variables) && (__cpp_inline_variables >= 201606L) +# define _LIBCPP_INLINE_VAR inline +#else +# define _LIBCPP_INLINE_VAR +#endif + +#ifdef _LIBCPP_HAS_NO_RVALUE_REFERENCES +# define _LIBCPP_EXPLICIT_MOVE(x) _VSTD::move(x) +#else +# define _LIBCPP_EXPLICIT_MOVE(x) (x) +#endif + +#ifndef _LIBCPP_CONSTEXPR_IF_NODEBUG +#if defined(_LIBCPP_DEBUG) || defined(_LIBCPP_HAS_NO_CXX14_CONSTEXPR) +#define _LIBCPP_CONSTEXPR_IF_NODEBUG +#else +#define _LIBCPP_CONSTEXPR_IF_NODEBUG constexpr +#endif +#endif + +#if __has_attribute(no_destroy) +# define _LIBCPP_NO_DESTROY __attribute__((__no_destroy__)) +#else +# define _LIBCPP_NO_DESTROY +#endif + +#ifndef _LIBCPP_HAS_NO_ASAN +_LIBCPP_FUNC_VIS extern "C" void __sanitizer_annotate_contiguous_container( + const void *, const void *, const void *, const void *); +#endif + +// Try to find out if RTTI is disabled. +// g++ and cl.exe have RTTI on by default and define a macro when it is. +// g++ only defines the macro in 4.3.2 and onwards. +#if !defined(_LIBCPP_NO_RTTI) +# if defined(__GNUC__) && \ + ((__GNUC__ >= 5) || \ + (__GNUC__ == 4 && (__GNUC_MINOR__ >= 3 || __GNUC_PATCHLEVEL__ >= 2))) && \ + !defined(__GXX_RTTI) +# define _LIBCPP_NO_RTTI +# elif defined(_LIBCPP_COMPILER_MSVC) && !defined(_CPPRTTI) +# define _LIBCPP_NO_RTTI +# endif +#endif + +#ifndef _LIBCPP_WEAK +#define _LIBCPP_WEAK __attribute__((__weak__)) +#endif + +// Thread API +#if !defined(_LIBCPP_HAS_NO_THREADS) && \ + !defined(_LIBCPP_HAS_THREAD_API_PTHREAD) && \ + !defined(_LIBCPP_HAS_THREAD_API_WIN32) && \ + !defined(_LIBCPP_HAS_THREAD_API_EXTERNAL) +# if defined(__FreeBSD__) || \ + defined(__Fuchsia__) || \ + defined(__wasi__) || \ + defined(__NetBSD__) || \ + defined(__linux__) || \ + defined(__GNU__) || \ + defined(__APPLE__) || \ + defined(__CloudABI__) || \ + defined(__sun__) || \ + (defined(__MINGW32__) && __has_include()) +# define _LIBCPP_HAS_THREAD_API_PTHREAD +# elif defined(_LIBCPP_WIN32API) +# define _LIBCPP_HAS_THREAD_API_WIN32 +# else +# error "No thread API" +# endif // _LIBCPP_HAS_THREAD_API +#endif // _LIBCPP_HAS_NO_THREADS + +#if defined(_LIBCPP_HAS_THREAD_API_PTHREAD) +#if defined(__ANDROID__) && __ANDROID_API__ >= 30 +#define _LIBCPP_HAS_COND_CLOCKWAIT +#elif defined(_LIBCPP_GLIBC_PREREQ) +#if _LIBCPP_GLIBC_PREREQ(2, 30) +#define _LIBCPP_HAS_COND_CLOCKWAIT +#endif +#endif +#endif + +#if defined(_LIBCPP_HAS_NO_THREADS) && defined(_LIBCPP_HAS_THREAD_API_PTHREAD) +#error _LIBCPP_HAS_THREAD_API_PTHREAD may only be defined when \ + _LIBCPP_HAS_NO_THREADS is not defined. +#endif + +#if defined(_LIBCPP_HAS_NO_THREADS) && defined(_LIBCPP_HAS_THREAD_API_EXTERNAL) +#error _LIBCPP_HAS_THREAD_API_EXTERNAL may not be defined when \ + _LIBCPP_HAS_NO_THREADS is defined. +#endif + +#if defined(_LIBCPP_HAS_NO_MONOTONIC_CLOCK) && !defined(_LIBCPP_HAS_NO_THREADS) +#error _LIBCPP_HAS_NO_MONOTONIC_CLOCK may only be defined when \ + _LIBCPP_HAS_NO_THREADS is defined. +#endif + +#if defined(__STDCPP_THREADS__) && defined(_LIBCPP_HAS_NO_THREADS) +#error _LIBCPP_HAS_NO_THREADS cannot be set when __STDCPP_THREADS__ is set. +#endif + +#if !defined(_LIBCPP_HAS_NO_THREADS) && !defined(__STDCPP_THREADS__) +#define __STDCPP_THREADS__ 1 +#endif + +// The glibc and Bionic implementation of pthreads implements +// pthread_mutex_destroy as nop for regular mutexes. Additionally, Win32 +// mutexes have no destroy mechanism. +// +// This optimization can't be performed on Apple platforms, where +// pthread_mutex_destroy can allow the kernel to release resources. +// See https://llvm.org/D64298 for details. +// +// TODO(EricWF): Enable this optimization on Bionic after speaking to their +// respective stakeholders. +#if (defined(_LIBCPP_HAS_THREAD_API_PTHREAD) && defined(__GLIBC__)) \ + || defined(_LIBCPP_HAS_THREAD_API_WIN32) +# define _LIBCPP_HAS_TRIVIAL_MUTEX_DESTRUCTION +#endif + +// Destroying a condvar is a nop on Windows. +// +// This optimization can't be performed on Apple platforms, where +// pthread_cond_destroy can allow the kernel to release resources. +// See https://llvm.org/D64298 for details. +// +// TODO(EricWF): This is potentially true for some pthread implementations +// as well. +#if defined(_LIBCPP_HAS_THREAD_API_WIN32) +# define _LIBCPP_HAS_TRIVIAL_CONDVAR_DESTRUCTION +#endif + +// Systems that use capability-based security (FreeBSD with Capsicum, +// Nuxi CloudABI) may only provide local filesystem access (using *at()). +// Functions like open(), rename(), unlink() and stat() should not be +// used, as they attempt to access the global filesystem namespace. +#ifdef __CloudABI__ +#define _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE +#endif + +// CloudABI is intended for running networked services. Processes do not +// have standard input and output channels. +#ifdef __CloudABI__ +#define _LIBCPP_HAS_NO_STDIN +#define _LIBCPP_HAS_NO_STDOUT +#endif + +// Some systems do not provide gets() in their C library, for security reasons. +#ifndef _LIBCPP_C_HAS_NO_GETS +# if defined(_LIBCPP_MSVCRT) || \ + (defined(__FreeBSD_version) && __FreeBSD_version >= 1300043) +# define _LIBCPP_C_HAS_NO_GETS +# endif +#endif + +#if defined(__BIONIC__) || defined(__CloudABI__) || \ + defined(__Fuchsia__) || defined(__wasi__) || defined(_LIBCPP_HAS_MUSL_LIBC) +#define _LIBCPP_PROVIDES_DEFAULT_RUNE_TABLE +#endif + +// Thread-unsafe functions such as strtok() and localtime() +// are not available. +#ifdef __CloudABI__ +#define _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS +#endif + +#if __has_feature(cxx_atomic) || __has_extension(c_atomic) || __has_keyword(_Atomic) +# define _LIBCPP_HAS_C_ATOMIC_IMP +#elif defined(_LIBCPP_COMPILER_GCC) +# define _LIBCPP_HAS_GCC_ATOMIC_IMP +#endif + +#if (!defined(_LIBCPP_HAS_C_ATOMIC_IMP) && \ + !defined(_LIBCPP_HAS_GCC_ATOMIC_IMP) && \ + !defined(_LIBCPP_HAS_EXTERNAL_ATOMIC_IMP)) \ + || defined(_LIBCPP_HAS_NO_THREADS) +# define _LIBCPP_HAS_NO_ATOMIC_HEADER +#else +# ifndef _LIBCPP_ATOMIC_FLAG_TYPE +# define _LIBCPP_ATOMIC_FLAG_TYPE bool +# endif +# ifdef _LIBCPP_FREESTANDING +# define _LIBCPP_ATOMIC_ONLY_USE_BUILTINS +# endif +#endif + +#ifndef _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK +#define _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK +#endif + +#if defined(_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS) +# if defined(__clang__) && __has_attribute(acquire_capability) +// Work around the attribute handling in clang. When both __declspec and +// __attribute__ are present, the processing goes awry preventing the definition +// of the types. +# if !defined(_LIBCPP_OBJECT_FORMAT_COFF) +# define _LIBCPP_HAS_THREAD_SAFETY_ANNOTATIONS +# endif +# endif +#endif + +#if __has_attribute(require_constant_initialization) +# define _LIBCPP_SAFE_STATIC __attribute__((__require_constant_initialization__)) +#else +# define _LIBCPP_SAFE_STATIC +#endif + +#if !__has_builtin(__builtin_addressof) && _GNUC_VER < 700 +#define _LIBCPP_HAS_NO_BUILTIN_ADDRESSOF +#endif + +#if !__has_builtin(__builtin_is_constant_evaluated) && _GNUC_VER < 900 +#define _LIBCPP_HAS_NO_BUILTIN_IS_CONSTANT_EVALUATED +#endif + +#if !defined(_LIBCPP_HAS_NO_OFF_T_FUNCTIONS) +# if defined(_LIBCPP_MSVCRT) || defined(_NEWLIB_VERSION) +# define _LIBCPP_HAS_NO_OFF_T_FUNCTIONS +# endif +#endif + +#if __has_attribute(diagnose_if) && !defined(_LIBCPP_DISABLE_ADDITIONAL_DIAGNOSTICS) +# define _LIBCPP_DIAGNOSE_WARNING(...) \ + __attribute__((diagnose_if(__VA_ARGS__, "warning"))) +# define _LIBCPP_DIAGNOSE_ERROR(...) \ + __attribute__((diagnose_if(__VA_ARGS__, "error"))) +#else +# define _LIBCPP_DIAGNOSE_WARNING(...) +# define _LIBCPP_DIAGNOSE_ERROR(...) +#endif + +// Use a function like macro to imply that it must be followed by a semicolon +#if __cplusplus > 201402L && __has_cpp_attribute(fallthrough) +# define _LIBCPP_FALLTHROUGH() [[fallthrough]] +#elif __has_cpp_attribute(clang::fallthrough) +# define _LIBCPP_FALLTHROUGH() [[clang::fallthrough]] +#elif __has_attribute(fallthough) || _GNUC_VER >= 700 +# define _LIBCPP_FALLTHROUGH() __attribute__((__fallthrough__)) +#else +# define _LIBCPP_FALLTHROUGH() ((void)0) +#endif + +#if __has_attribute(__nodebug__) +#define _LIBCPP_NODEBUG __attribute__((__nodebug__)) +#else +#define _LIBCPP_NODEBUG +#endif + +#ifndef _LIBCPP_NODEBUG_TYPE +#if __has_attribute(__nodebug__) && \ + (defined(_LIBCPP_CLANG_VER) && _LIBCPP_CLANG_VER >= 900) +#define _LIBCPP_NODEBUG_TYPE __attribute__((nodebug)) +#else +#define _LIBCPP_NODEBUG_TYPE +#endif +#endif // !defined(_LIBCPP_NODEBUG_TYPE) + +#if defined(_LIBCPP_ABI_MICROSOFT) && \ + (defined(_LIBCPP_COMPILER_MSVC) || __has_declspec_attribute(empty_bases)) +# define _LIBCPP_DECLSPEC_EMPTY_BASES __declspec(empty_bases) +#else +# define _LIBCPP_DECLSPEC_EMPTY_BASES +#endif + +#if defined(_LIBCPP_ENABLE_CXX17_REMOVED_FEATURES) +#define _LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR +#define _LIBCPP_ENABLE_CXX17_REMOVED_UNEXPECTED_FUNCTIONS +#define _LIBCPP_ENABLE_CXX17_REMOVED_RANDOM_SHUFFLE +#define _LIBCPP_ENABLE_CXX17_REMOVED_BINDERS +#endif // _LIBCPP_ENABLE_CXX17_REMOVED_FEATURES + +#if !defined(__cpp_deduction_guides) || __cpp_deduction_guides < 201611 +#define _LIBCPP_HAS_NO_DEDUCTION_GUIDES +#endif + +#if !__has_keyword(__is_aggregate) && (_GNUC_VER_NEW < 7001) +#define _LIBCPP_HAS_NO_IS_AGGREGATE +#endif + +#if !defined(__cpp_coroutines) || __cpp_coroutines < 201703L +#define _LIBCPP_HAS_NO_COROUTINES +#endif + +// FIXME: Correct this macro when either (A) a feature test macro for the +// spaceship operator is provided, or (B) a compiler provides a complete +// implementation. +#define _LIBCPP_HAS_NO_SPACESHIP_OPERATOR + +// Decide whether to use availability macros. +#if !defined(_LIBCPP_BUILDING_LIBRARY) && \ + !defined(_LIBCPP_DISABLE_AVAILABILITY) && \ + __has_feature(attribute_availability_with_strict) && \ + __has_feature(attribute_availability_in_templates) && \ + __has_extension(pragma_clang_attribute_external_declaration) +# ifdef __APPLE__ +# define _LIBCPP_USE_AVAILABILITY_APPLE +# endif +#endif + +// Define availability macros. +#if defined(_LIBCPP_USE_AVAILABILITY_APPLE) +# define _LIBCPP_AVAILABILITY_SHARED_MUTEX \ + __attribute__((availability(macosx,strict,introduced=10.12))) \ + __attribute__((availability(ios,strict,introduced=10.0))) \ + __attribute__((availability(tvos,strict,introduced=10.0))) \ + __attribute__((availability(watchos,strict,introduced=3.0))) +# define _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS \ + __attribute__((availability(macosx,strict,introduced=10.14))) \ + __attribute__((availability(ios,strict,introduced=12.0))) \ + __attribute__((availability(tvos,strict,introduced=12.0))) \ + __attribute__((availability(watchos,strict,introduced=5.0))) +# define _LIBCPP_AVAILABILITY_BAD_VARIANT_ACCESS \ + _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS +# define _LIBCPP_AVAILABILITY_BAD_ANY_CAST \ + _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS +# define _LIBCPP_AVAILABILITY_UNCAUGHT_EXCEPTIONS \ + __attribute__((availability(macosx,strict,introduced=10.12))) \ + __attribute__((availability(ios,strict,introduced=10.0))) \ + __attribute__((availability(tvos,strict,introduced=10.0))) \ + __attribute__((availability(watchos,strict,introduced=3.0))) +# define _LIBCPP_AVAILABILITY_SIZED_NEW_DELETE \ + __attribute__((availability(macosx,strict,introduced=10.12))) \ + __attribute__((availability(ios,strict,introduced=10.0))) \ + __attribute__((availability(tvos,strict,introduced=10.0))) \ + __attribute__((availability(watchos,strict,introduced=3.0))) +# define _LIBCPP_AVAILABILITY_FUTURE_ERROR \ + __attribute__((availability(ios,strict,introduced=6.0))) +# define _LIBCPP_AVAILABILITY_TYPEINFO_VTABLE \ + __attribute__((availability(macosx,strict,introduced=10.9))) \ + __attribute__((availability(ios,strict,introduced=7.0))) +# define _LIBCPP_AVAILABILITY_LOCALE_CATEGORY \ + __attribute__((availability(macosx,strict,introduced=10.9))) \ + __attribute__((availability(ios,strict,introduced=7.0))) +# define _LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR \ + __attribute__((availability(macosx,strict,introduced=10.9))) \ + __attribute__((availability(ios,strict,introduced=7.0))) +# define _LIBCPP_AVAILABILITY_FILESYSTEM \ + __attribute__((availability(macosx,strict,introduced=10.15))) \ + __attribute__((availability(ios,strict,introduced=13.0))) \ + __attribute__((availability(tvos,strict,introduced=13.0))) \ + __attribute__((availability(watchos,strict,introduced=6.0))) +# define _LIBCPP_AVAILABILITY_FILESYSTEM_PUSH \ + _Pragma("clang attribute push(__attribute__((availability(macosx,strict,introduced=10.15))), apply_to=any(function,record))") \ + _Pragma("clang attribute push(__attribute__((availability(ios,strict,introduced=13.0))), apply_to=any(function,record))") \ + _Pragma("clang attribute push(__attribute__((availability(tvos,strict,introduced=13.0))), apply_to=any(function,record))") \ + _Pragma("clang attribute push(__attribute__((availability(watchos,strict,introduced=6.0))), apply_to=any(function,record))") +# define _LIBCPP_AVAILABILITY_FILESYSTEM_POP \ + _Pragma("clang attribute pop") \ + _Pragma("clang attribute pop") \ + _Pragma("clang attribute pop") \ + _Pragma("clang attribute pop") +#else +# define _LIBCPP_AVAILABILITY_SHARED_MUTEX +# define _LIBCPP_AVAILABILITY_BAD_VARIANT_ACCESS +# define _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS +# define _LIBCPP_AVAILABILITY_BAD_ANY_CAST +# define _LIBCPP_AVAILABILITY_UNCAUGHT_EXCEPTIONS +# define _LIBCPP_AVAILABILITY_SIZED_NEW_DELETE +# define _LIBCPP_AVAILABILITY_FUTURE_ERROR +# define _LIBCPP_AVAILABILITY_TYPEINFO_VTABLE +# define _LIBCPP_AVAILABILITY_LOCALE_CATEGORY +# define _LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR +# define _LIBCPP_AVAILABILITY_FILESYSTEM +# define _LIBCPP_AVAILABILITY_FILESYSTEM_PUSH +# define _LIBCPP_AVAILABILITY_FILESYSTEM_POP +#endif + +// Define availability that depends on _LIBCPP_NO_EXCEPTIONS. +#ifdef _LIBCPP_NO_EXCEPTIONS +# define _LIBCPP_AVAILABILITY_FUTURE +# define _LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST +# define _LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS +# define _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS +#else +# define _LIBCPP_AVAILABILITY_FUTURE _LIBCPP_AVAILABILITY_FUTURE_ERROR +# define _LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST _LIBCPP_AVAILABILITY_BAD_ANY_CAST +# define _LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS +# define _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS _LIBCPP_AVAILABILITY_BAD_VARIANT_ACCESS +#endif + +// The stream API was dropped and re-added in the dylib shipped on macOS +// and iOS. We can only assume the dylib to provide these definitions for +// macosx >= 10.9 and ios >= 7.0. Otherwise, the definitions are available +// from the headers, but not from the dylib. Explicit instantiation +// declarations for streams exist conditionally to this; if we provide +// an explicit instantiation declaration and we try to deploy to a dylib +// that does not provide those symbols, we'll get a load-time error. +#if !defined(_LIBCPP_BUILDING_LIBRARY) && \ + ((defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && \ + __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1090) || \ + (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && \ + __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 70000)) +# define _LIBCPP_DO_NOT_ASSUME_STREAMS_EXPLICIT_INSTANTIATION_IN_DYLIB +#endif + +#if defined(_LIBCPP_COMPILER_IBM) +#define _LIBCPP_HAS_NO_PRAGMA_PUSH_POP_MACRO +#endif + +#if defined(_LIBCPP_HAS_NO_PRAGMA_PUSH_POP_MACRO) +# define _LIBCPP_PUSH_MACROS +# define _LIBCPP_POP_MACROS +#else + // Don't warn about macro conflicts when we can restore them at the + // end of the header. +# ifndef _LIBCPP_DISABLE_MACRO_CONFLICT_WARNINGS +# define _LIBCPP_DISABLE_MACRO_CONFLICT_WARNINGS +# endif +# if defined(_LIBCPP_COMPILER_MSVC) +# define _LIBCPP_PUSH_MACROS \ + __pragma(push_macro("min")) \ + __pragma(push_macro("max")) +# define _LIBCPP_POP_MACROS \ + __pragma(pop_macro("min")) \ + __pragma(pop_macro("max")) +# else +# define _LIBCPP_PUSH_MACROS \ + _Pragma("push_macro(\"min\")") \ + _Pragma("push_macro(\"max\")") +# define _LIBCPP_POP_MACROS \ + _Pragma("pop_macro(\"min\")") \ + _Pragma("pop_macro(\"max\")") +# endif +#endif // defined(_LIBCPP_HAS_NO_PRAGMA_PUSH_POP_MACRO) + +#ifndef _LIBCPP_NO_AUTO_LINK +# if defined(_LIBCPP_ABI_MICROSOFT) && !defined(_LIBCPP_BUILDING_LIBRARY) +# if defined(_DLL) +# pragma comment(lib, "c++.lib") +# else +# pragma comment(lib, "libc++.lib") +# endif +# endif // defined(_LIBCPP_ABI_MICROSOFT) && !defined(_LIBCPP_BUILDING_LIBRARY) +#endif // _LIBCPP_NO_AUTO_LINK + +#define _LIBCPP_UNUSED_VAR(x) ((void)(x)) + +// Configures the fopen close-on-exec mode character, if any. This string will +// be appended to any mode string used by fstream for fopen/fdopen. +// +// Not all platforms support this, but it helps avoid fd-leaks on platforms that +// do. +#if defined(__BIONIC__) +# define _LIBCPP_FOPEN_CLOEXEC_MODE "e" +#else +# define _LIBCPP_FOPEN_CLOEXEC_MODE +#endif + +#endif // __cplusplus + +#endif // _LIBCPP_CONFIG diff --git a/third_party/libcxx.bak/__debug b/third_party/libcxx.bak/__debug new file mode 100644 index 00000000000..4d17dc75c78 --- /dev/null +++ b/third_party/libcxx.bak/__debug @@ -0,0 +1,280 @@ +// clang-format off +// -*- C++ -*- +//===--------------------------- __debug ----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP_DEBUG_H +#define _LIBCPP_DEBUG_H + +#include <__config> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +#if defined(_LIBCPP_HAS_NO_NULLPTR) +# include +#endif + +#if _LIBCPP_DEBUG_LEVEL >= 1 || defined(_LIBCPP_BUILDING_LIBRARY) +# include +# include +# include +#endif + +#if _LIBCPP_DEBUG_LEVEL >= 1 && !defined(_LIBCPP_ASSERT) +# define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : \ + _VSTD::__libcpp_debug_function(_VSTD::__libcpp_debug_info(__FILE__, __LINE__, #x, m))) +#endif + +#if _LIBCPP_DEBUG_LEVEL >= 2 +#ifndef _LIBCPP_DEBUG_ASSERT +#define _LIBCPP_DEBUG_ASSERT(x, m) _LIBCPP_ASSERT(x, m) +#endif +#define _LIBCPP_DEBUG_MODE(...) __VA_ARGS__ +#endif + +#ifndef _LIBCPP_ASSERT +# define _LIBCPP_ASSERT(x, m) ((void)0) +#endif +#ifndef _LIBCPP_DEBUG_ASSERT +# define _LIBCPP_DEBUG_ASSERT(x, m) ((void)0) +#endif +#ifndef _LIBCPP_DEBUG_MODE +#define _LIBCPP_DEBUG_MODE(...) ((void)0) +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +struct _LIBCPP_TEMPLATE_VIS __libcpp_debug_info { + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR + __libcpp_debug_info() + : __file_(nullptr), __line_(-1), __pred_(nullptr), __msg_(nullptr) {} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR + __libcpp_debug_info(const char* __f, int __l, const char* __p, const char* __m) + : __file_(__f), __line_(__l), __pred_(__p), __msg_(__m) {} + + _LIBCPP_FUNC_VIS std::string what() const; + + const char* __file_; + int __line_; + const char* __pred_; + const char* __msg_; +}; + +/// __libcpp_debug_function_type - The type of the assertion failure handler. +typedef void(*__libcpp_debug_function_type)(__libcpp_debug_info const&); + +/// __libcpp_debug_function - The handler function called when a _LIBCPP_ASSERT +/// fails. +extern _LIBCPP_EXPORTED_FROM_ABI __libcpp_debug_function_type __libcpp_debug_function; + +/// __libcpp_abort_debug_function - A debug handler that aborts when called. +_LIBCPP_NORETURN _LIBCPP_FUNC_VIS +void __libcpp_abort_debug_function(__libcpp_debug_info const&); + +/// __libcpp_set_debug_function - Set the debug handler to the specified +/// function. +_LIBCPP_FUNC_VIS +bool __libcpp_set_debug_function(__libcpp_debug_function_type __func); + +#if _LIBCPP_DEBUG_LEVEL >= 2 || defined(_LIBCPP_BUILDING_LIBRARY) + +struct _LIBCPP_TYPE_VIS __c_node; + +struct _LIBCPP_TYPE_VIS __i_node +{ + void* __i_; + __i_node* __next_; + __c_node* __c_; + +#ifndef _LIBCPP_CXX03_LANG + __i_node(const __i_node&) = delete; + __i_node& operator=(const __i_node&) = delete; +#else +private: + __i_node(const __i_node&); + __i_node& operator=(const __i_node&); +public: +#endif + _LIBCPP_INLINE_VISIBILITY + __i_node(void* __i, __i_node* __next, __c_node* __c) + : __i_(__i), __next_(__next), __c_(__c) {} + ~__i_node(); +}; + +struct _LIBCPP_TYPE_VIS __c_node +{ + void* __c_; + __c_node* __next_; + __i_node** beg_; + __i_node** end_; + __i_node** cap_; + +#ifndef _LIBCPP_CXX03_LANG + __c_node(const __c_node&) = delete; + __c_node& operator=(const __c_node&) = delete; +#else +private: + __c_node(const __c_node&); + __c_node& operator=(const __c_node&); +public: +#endif + _LIBCPP_INLINE_VISIBILITY + __c_node(void* __c, __c_node* __next) + : __c_(__c), __next_(__next), beg_(nullptr), end_(nullptr), cap_(nullptr) {} + virtual ~__c_node(); + + virtual bool __dereferenceable(const void*) const = 0; + virtual bool __decrementable(const void*) const = 0; + virtual bool __addable(const void*, ptrdiff_t) const = 0; + virtual bool __subscriptable(const void*, ptrdiff_t) const = 0; + + void __add(__i_node* __i); + _LIBCPP_HIDDEN void __remove(__i_node* __i); +}; + +template +struct _C_node + : public __c_node +{ + _C_node(void* __c, __c_node* __n) + : __c_node(__c, __n) {} + + virtual bool __dereferenceable(const void*) const; + virtual bool __decrementable(const void*) const; + virtual bool __addable(const void*, ptrdiff_t) const; + virtual bool __subscriptable(const void*, ptrdiff_t) const; +}; + +template +inline bool +_C_node<_Cont>::__dereferenceable(const void* __i) const +{ + typedef typename _Cont::const_iterator iterator; + const iterator* __j = static_cast(__i); + _Cont* _Cp = static_cast<_Cont*>(__c_); + return _Cp->__dereferenceable(__j); +} + +template +inline bool +_C_node<_Cont>::__decrementable(const void* __i) const +{ + typedef typename _Cont::const_iterator iterator; + const iterator* __j = static_cast(__i); + _Cont* _Cp = static_cast<_Cont*>(__c_); + return _Cp->__decrementable(__j); +} + +template +inline bool +_C_node<_Cont>::__addable(const void* __i, ptrdiff_t __n) const +{ + typedef typename _Cont::const_iterator iterator; + const iterator* __j = static_cast(__i); + _Cont* _Cp = static_cast<_Cont*>(__c_); + return _Cp->__addable(__j, __n); +} + +template +inline bool +_C_node<_Cont>::__subscriptable(const void* __i, ptrdiff_t __n) const +{ + typedef typename _Cont::const_iterator iterator; + const iterator* __j = static_cast(__i); + _Cont* _Cp = static_cast<_Cont*>(__c_); + return _Cp->__subscriptable(__j, __n); +} + +class _LIBCPP_TYPE_VIS __libcpp_db +{ + __c_node** __cbeg_; + __c_node** __cend_; + size_t __csz_; + __i_node** __ibeg_; + __i_node** __iend_; + size_t __isz_; + + __libcpp_db(); +public: +#ifndef _LIBCPP_CXX03_LANG + __libcpp_db(const __libcpp_db&) = delete; + __libcpp_db& operator=(const __libcpp_db&) = delete; +#else +private: + __libcpp_db(const __libcpp_db&); + __libcpp_db& operator=(const __libcpp_db&); +public: +#endif + ~__libcpp_db(); + + class __db_c_iterator; + class __db_c_const_iterator; + class __db_i_iterator; + class __db_i_const_iterator; + + __db_c_const_iterator __c_end() const; + __db_i_const_iterator __i_end() const; + + typedef __c_node*(_InsertConstruct)(void*, void*, __c_node*); + + template + _LIBCPP_INLINE_VISIBILITY static __c_node* __create_C_node(void *__mem, void *__c, __c_node *__next) { + return ::new(__mem) _C_node<_Cont>(__c, __next); + } + + template + _LIBCPP_INLINE_VISIBILITY + void __insert_c(_Cont* __c) + { + __insert_c(static_cast(__c), &__create_C_node<_Cont>); + } + + void __insert_i(void* __i); + void __insert_c(void* __c, _InsertConstruct* __fn); + void __erase_c(void* __c); + + void __insert_ic(void* __i, const void* __c); + void __iterator_copy(void* __i, const void* __i0); + void __erase_i(void* __i); + + void* __find_c_from_i(void* __i) const; + void __invalidate_all(void* __c); + __c_node* __find_c_and_lock(void* __c) const; + __c_node* __find_c(void* __c) const; + void unlock() const; + + void swap(void* __c1, void* __c2); + + + bool __dereferenceable(const void* __i) const; + bool __decrementable(const void* __i) const; + bool __addable(const void* __i, ptrdiff_t __n) const; + bool __subscriptable(const void* __i, ptrdiff_t __n) const; + bool __less_than_comparable(const void* __i, const void* __j) const; +private: + _LIBCPP_HIDDEN + __i_node* __insert_iterator(void* __i); + _LIBCPP_HIDDEN + __i_node* __find_iterator(const void* __i) const; + + friend _LIBCPP_FUNC_VIS __libcpp_db* __get_db(); +}; + +_LIBCPP_FUNC_VIS __libcpp_db* __get_db(); +_LIBCPP_FUNC_VIS const __libcpp_db* __get_const_db(); + + +#endif // _LIBCPP_DEBUG_LEVEL >= 2 || defined(_LIBCPP_BUILDING_LIBRARY) + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_DEBUG_H + diff --git a/third_party/libcxx.bak/__functional_base b/third_party/libcxx.bak/__functional_base new file mode 100644 index 00000000000..15c92b5517c --- /dev/null +++ b/third_party/libcxx.bak/__functional_base @@ -0,0 +1,653 @@ +// clang-format off +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP_FUNCTIONAL_BASE +#define _LIBCPP_FUNCTIONAL_BASE + +#include <__config> +#include +#include +#include +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +struct _LIBCPP_TEMPLATE_VIS binary_function +{ + typedef _Arg1 first_argument_type; + typedef _Arg2 second_argument_type; + typedef _Result result_type; +}; + +template +struct __has_result_type +{ +private: + struct __two {char __lx; char __lxx;}; + template static __two __test(...); + template static char __test(typename _Up::result_type* = 0); +public: + static const bool value = sizeof(__test<_Tp>(0)) == 1; +}; + +#if _LIBCPP_STD_VER > 11 +template +#else +template +#endif +struct _LIBCPP_TEMPLATE_VIS less : binary_function<_Tp, _Tp, bool> +{ + _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Tp& __x, const _Tp& __y) const + {return __x < __y;} +}; + +#if _LIBCPP_STD_VER > 11 +template <> +struct _LIBCPP_TEMPLATE_VIS less +{ + template + _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY + auto operator()(_T1&& __t, _T2&& __u) const + _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) < _VSTD::forward<_T2>(__u))) + -> decltype (_VSTD::forward<_T1>(__t) < _VSTD::forward<_T2>(__u)) + { return _VSTD::forward<_T1>(__t) < _VSTD::forward<_T2>(__u); } + typedef void is_transparent; +}; +#endif + +// __weak_result_type + +template +struct __derives_from_unary_function +{ +private: + struct __two {char __lx; char __lxx;}; + static __two __test(...); + template + static unary_function<_Ap, _Rp> + __test(const volatile unary_function<_Ap, _Rp>*); +public: + static const bool value = !is_same::value; + typedef decltype(__test((_Tp*)0)) type; +}; + +template +struct __derives_from_binary_function +{ +private: + struct __two {char __lx; char __lxx;}; + static __two __test(...); + template + static binary_function<_A1, _A2, _Rp> + __test(const volatile binary_function<_A1, _A2, _Rp>*); +public: + static const bool value = !is_same::value; + typedef decltype(__test((_Tp*)0)) type; +}; + +template ::value> +struct __maybe_derive_from_unary_function // bool is true + : public __derives_from_unary_function<_Tp>::type +{ +}; + +template +struct __maybe_derive_from_unary_function<_Tp, false> +{ +}; + +template ::value> +struct __maybe_derive_from_binary_function // bool is true + : public __derives_from_binary_function<_Tp>::type +{ +}; + +template +struct __maybe_derive_from_binary_function<_Tp, false> +{ +}; + +template ::value> +struct __weak_result_type_imp // bool is true + : public __maybe_derive_from_unary_function<_Tp>, + public __maybe_derive_from_binary_function<_Tp> +{ + typedef _LIBCPP_NODEBUG_TYPE typename _Tp::result_type result_type; +}; + +template +struct __weak_result_type_imp<_Tp, false> + : public __maybe_derive_from_unary_function<_Tp>, + public __maybe_derive_from_binary_function<_Tp> +{ +}; + +template +struct __weak_result_type + : public __weak_result_type_imp<_Tp> +{ +}; + +// 0 argument case + +template +struct __weak_result_type<_Rp ()> +{ + typedef _LIBCPP_NODEBUG_TYPE _Rp result_type; +}; + +template +struct __weak_result_type<_Rp (&)()> +{ + typedef _LIBCPP_NODEBUG_TYPE _Rp result_type; +}; + +template +struct __weak_result_type<_Rp (*)()> +{ + typedef _LIBCPP_NODEBUG_TYPE _Rp result_type; +}; + +// 1 argument case + +template +struct __weak_result_type<_Rp (_A1)> + : public unary_function<_A1, _Rp> +{ +}; + +template +struct __weak_result_type<_Rp (&)(_A1)> + : public unary_function<_A1, _Rp> +{ +}; + +template +struct __weak_result_type<_Rp (*)(_A1)> + : public unary_function<_A1, _Rp> +{ +}; + +template +struct __weak_result_type<_Rp (_Cp::*)()> + : public unary_function<_Cp*, _Rp> +{ +}; + +template +struct __weak_result_type<_Rp (_Cp::*)() const> + : public unary_function +{ +}; + +template +struct __weak_result_type<_Rp (_Cp::*)() volatile> + : public unary_function +{ +}; + +template +struct __weak_result_type<_Rp (_Cp::*)() const volatile> + : public unary_function +{ +}; + +// 2 argument case + +template +struct __weak_result_type<_Rp (_A1, _A2)> + : public binary_function<_A1, _A2, _Rp> +{ +}; + +template +struct __weak_result_type<_Rp (*)(_A1, _A2)> + : public binary_function<_A1, _A2, _Rp> +{ +}; + +template +struct __weak_result_type<_Rp (&)(_A1, _A2)> + : public binary_function<_A1, _A2, _Rp> +{ +}; + +template +struct __weak_result_type<_Rp (_Cp::*)(_A1)> + : public binary_function<_Cp*, _A1, _Rp> +{ +}; + +template +struct __weak_result_type<_Rp (_Cp::*)(_A1) const> + : public binary_function +{ +}; + +template +struct __weak_result_type<_Rp (_Cp::*)(_A1) volatile> + : public binary_function +{ +}; + +template +struct __weak_result_type<_Rp (_Cp::*)(_A1) const volatile> + : public binary_function +{ +}; + + +#ifndef _LIBCPP_CXX03_LANG +// 3 or more arguments + +template +struct __weak_result_type<_Rp (_A1, _A2, _A3, _A4...)> +{ + typedef _Rp result_type; +}; + +template +struct __weak_result_type<_Rp (&)(_A1, _A2, _A3, _A4...)> +{ + typedef _Rp result_type; +}; + +template +struct __weak_result_type<_Rp (*)(_A1, _A2, _A3, _A4...)> +{ + typedef _Rp result_type; +}; + +template +struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...)> +{ + typedef _Rp result_type; +}; + +template +struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...) const> +{ + typedef _Rp result_type; +}; + +template +struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...) volatile> +{ + typedef _Rp result_type; +}; + +template +struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...) const volatile> +{ + typedef _Rp result_type; +}; + +template +struct __invoke_return +{ + typedef decltype(__invoke(_VSTD::declval<_Tp>(), _VSTD::declval<_Args>()...)) type; +}; + +#else // defined(_LIBCPP_CXX03_LANG) + +#include <__functional_base_03> + +#endif // !defined(_LIBCPP_CXX03_LANG) + + +template +struct __invoke_void_return_wrapper +{ +#ifndef _LIBCPP_CXX03_LANG + template + static _Ret __call(_Args&&... __args) { + return __invoke(_VSTD::forward<_Args>(__args)...); + } +#else + template + static _Ret __call(_Fn __f) { + return __invoke(__f); + } + + template + static _Ret __call(_Fn __f, _A0& __a0) { + return __invoke(__f, __a0); + } + + template + static _Ret __call(_Fn __f, _A0& __a0, _A1& __a1) { + return __invoke(__f, __a0, __a1); + } + + template + static _Ret __call(_Fn __f, _A0& __a0, _A1& __a1, _A2& __a2){ + return __invoke(__f, __a0, __a1, __a2); + } +#endif +}; + +template <> +struct __invoke_void_return_wrapper +{ +#ifndef _LIBCPP_CXX03_LANG + template + static void __call(_Args&&... __args) { + __invoke(_VSTD::forward<_Args>(__args)...); + } +#else + template + static void __call(_Fn __f) { + __invoke(__f); + } + + template + static void __call(_Fn __f, _A0& __a0) { + __invoke(__f, __a0); + } + + template + static void __call(_Fn __f, _A0& __a0, _A1& __a1) { + __invoke(__f, __a0, __a1); + } + + template + static void __call(_Fn __f, _A0& __a0, _A1& __a1, _A2& __a2) { + __invoke(__f, __a0, __a1, __a2); + } +#endif +}; + +template +class _LIBCPP_TEMPLATE_VIS reference_wrapper + : public __weak_result_type<_Tp> +{ +public: + // types + typedef _Tp type; +private: + type* __f_; + +public: + // construct/copy/destroy + _LIBCPP_INLINE_VISIBILITY reference_wrapper(type& __f) _NOEXCEPT + : __f_(_VSTD::addressof(__f)) {} +#ifndef _LIBCPP_CXX03_LANG + private: reference_wrapper(type&&); public: // = delete; // do not bind to temps +#endif + + // access + _LIBCPP_INLINE_VISIBILITY operator type& () const _NOEXCEPT {return *__f_;} + _LIBCPP_INLINE_VISIBILITY type& get() const _NOEXCEPT {return *__f_;} + +#ifndef _LIBCPP_CXX03_LANG + // invoke + template + _LIBCPP_INLINE_VISIBILITY + typename __invoke_of::type + operator() (_ArgTypes&&... __args) const { + return __invoke(get(), _VSTD::forward<_ArgTypes>(__args)...); + } +#else + + _LIBCPP_INLINE_VISIBILITY + typename __invoke_return::type + operator() () const { + return __invoke(get()); + } + + template + _LIBCPP_INLINE_VISIBILITY + typename __invoke_return0::type + operator() (_A0& __a0) const { + return __invoke(get(), __a0); + } + + template + _LIBCPP_INLINE_VISIBILITY + typename __invoke_return0::type + operator() (_A0 const& __a0) const { + return __invoke(get(), __a0); + } + + template + _LIBCPP_INLINE_VISIBILITY + typename __invoke_return1::type + operator() (_A0& __a0, _A1& __a1) const { + return __invoke(get(), __a0, __a1); + } + + template + _LIBCPP_INLINE_VISIBILITY + typename __invoke_return1::type + operator() (_A0 const& __a0, _A1& __a1) const { + return __invoke(get(), __a0, __a1); + } + + template + _LIBCPP_INLINE_VISIBILITY + typename __invoke_return1::type + operator() (_A0& __a0, _A1 const& __a1) const { + return __invoke(get(), __a0, __a1); + } + + template + _LIBCPP_INLINE_VISIBILITY + typename __invoke_return1::type + operator() (_A0 const& __a0, _A1 const& __a1) const { + return __invoke(get(), __a0, __a1); + } + + template + _LIBCPP_INLINE_VISIBILITY + typename __invoke_return2::type + operator() (_A0& __a0, _A1& __a1, _A2& __a2) const { + return __invoke(get(), __a0, __a1, __a2); + } + + template + _LIBCPP_INLINE_VISIBILITY + typename __invoke_return2::type + operator() (_A0 const& __a0, _A1& __a1, _A2& __a2) const { + return __invoke(get(), __a0, __a1, __a2); + } + + template + _LIBCPP_INLINE_VISIBILITY + typename __invoke_return2::type + operator() (_A0& __a0, _A1 const& __a1, _A2& __a2) const { + return __invoke(get(), __a0, __a1, __a2); + } + + template + _LIBCPP_INLINE_VISIBILITY + typename __invoke_return2::type + operator() (_A0& __a0, _A1& __a1, _A2 const& __a2) const { + return __invoke(get(), __a0, __a1, __a2); + } + + template + _LIBCPP_INLINE_VISIBILITY + typename __invoke_return2::type + operator() (_A0 const& __a0, _A1 const& __a1, _A2& __a2) const { + return __invoke(get(), __a0, __a1, __a2); + } + + template + _LIBCPP_INLINE_VISIBILITY + typename __invoke_return2::type + operator() (_A0 const& __a0, _A1& __a1, _A2 const& __a2) const { + return __invoke(get(), __a0, __a1, __a2); + } + + template + _LIBCPP_INLINE_VISIBILITY + typename __invoke_return2::type + operator() (_A0& __a0, _A1 const& __a1, _A2 const& __a2) const { + return __invoke(get(), __a0, __a1, __a2); + } + + template + _LIBCPP_INLINE_VISIBILITY + typename __invoke_return2::type + operator() (_A0 const& __a0, _A1 const& __a1, _A2 const& __a2) const { + return __invoke(get(), __a0, __a1, __a2); + } +#endif // _LIBCPP_CXX03_LANG +}; + + +template +inline _LIBCPP_INLINE_VISIBILITY +reference_wrapper<_Tp> +ref(_Tp& __t) _NOEXCEPT +{ + return reference_wrapper<_Tp>(__t); +} + +template +inline _LIBCPP_INLINE_VISIBILITY +reference_wrapper<_Tp> +ref(reference_wrapper<_Tp> __t) _NOEXCEPT +{ + return ref(__t.get()); +} + +template +inline _LIBCPP_INLINE_VISIBILITY +reference_wrapper +cref(const _Tp& __t) _NOEXCEPT +{ + return reference_wrapper(__t); +} + +template +inline _LIBCPP_INLINE_VISIBILITY +reference_wrapper +cref(reference_wrapper<_Tp> __t) _NOEXCEPT +{ + return cref(__t.get()); +} + +#ifndef _LIBCPP_CXX03_LANG +template void ref(const _Tp&&) = delete; +template void cref(const _Tp&&) = delete; +#endif + +#if _LIBCPP_STD_VER > 11 +template +struct __is_transparent : false_type {}; + +template +struct __is_transparent<_Tp, _Up, + typename __void_t::type> + : true_type {}; +#endif + +// allocator_arg_t + +struct _LIBCPP_TEMPLATE_VIS allocator_arg_t { explicit allocator_arg_t() = default; }; + +#if defined(_LIBCPP_CXX03_LANG) || defined(_LIBCPP_BUILDING_LIBRARY) +extern _LIBCPP_EXPORTED_FROM_ABI const allocator_arg_t allocator_arg; +#else +/* _LIBCPP_INLINE_VAR */ constexpr allocator_arg_t allocator_arg = allocator_arg_t(); +#endif + +// uses_allocator + +template +struct __has_allocator_type +{ +private: + struct __two {char __lx; char __lxx;}; + template static __two __test(...); + template static char __test(typename _Up::allocator_type* = 0); +public: + static const bool value = sizeof(__test<_Tp>(0)) == 1; +}; + +template ::value> +struct __uses_allocator + : public integral_constant::value> +{ +}; + +template +struct __uses_allocator<_Tp, _Alloc, false> + : public false_type +{ +}; + +template +struct _LIBCPP_TEMPLATE_VIS uses_allocator + : public __uses_allocator<_Tp, _Alloc> +{ +}; + +#if _LIBCPP_STD_VER > 14 +template +_LIBCPP_INLINE_VAR constexpr size_t uses_allocator_v = uses_allocator<_Tp, _Alloc>::value; +#endif + +#ifndef _LIBCPP_CXX03_LANG + +// allocator construction + +template +struct __uses_alloc_ctor_imp +{ + typedef _LIBCPP_NODEBUG_TYPE typename __uncvref<_Alloc>::type _RawAlloc; + static const bool __ua = uses_allocator<_Tp, _RawAlloc>::value; + static const bool __ic = + is_constructible<_Tp, allocator_arg_t, _Alloc, _Args...>::value; + static const int value = __ua ? 2 - __ic : 0; +}; + +template +struct __uses_alloc_ctor + : integral_constant::value> + {}; + +template +inline _LIBCPP_INLINE_VISIBILITY +void __user_alloc_construct_impl (integral_constant, _Tp *__storage, const _Allocator &, _Args &&... __args ) +{ + new (__storage) _Tp (_VSTD::forward<_Args>(__args)...); +} + +// FIXME: This should have a version which takes a non-const alloc. +template +inline _LIBCPP_INLINE_VISIBILITY +void __user_alloc_construct_impl (integral_constant, _Tp *__storage, const _Allocator &__a, _Args &&... __args ) +{ + new (__storage) _Tp (allocator_arg, __a, _VSTD::forward<_Args>(__args)...); +} + +// FIXME: This should have a version which takes a non-const alloc. +template +inline _LIBCPP_INLINE_VISIBILITY +void __user_alloc_construct_impl (integral_constant, _Tp *__storage, const _Allocator &__a, _Args &&... __args ) +{ + new (__storage) _Tp (_VSTD::forward<_Args>(__args)..., __a); +} + +#endif // _LIBCPP_CXX03_LANG + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_FUNCTIONAL_BASE diff --git a/third_party/libcxx.bak/__split_buffer b/third_party/libcxx.bak/__split_buffer new file mode 100644 index 00000000000..bff3337c964 --- /dev/null +++ b/third_party/libcxx.bak/__split_buffer @@ -0,0 +1,645 @@ +// clang-format off +// -*- C++ -*- +#ifndef _LIBCPP_SPLIT_BUFFER +#define _LIBCPP_SPLIT_BUFFER + +#include <__config> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +class __split_buffer_common +{ +protected: + void __throw_length_error() const; + void __throw_out_of_range() const; +}; + +template > +struct __split_buffer + : private __split_buffer_common +{ +private: + __split_buffer(const __split_buffer&); + __split_buffer& operator=(const __split_buffer&); +public: + typedef _Tp value_type; + typedef _Allocator allocator_type; + typedef typename remove_reference::type __alloc_rr; + typedef allocator_traits<__alloc_rr> __alloc_traits; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef typename __alloc_traits::size_type size_type; + typedef typename __alloc_traits::difference_type difference_type; + typedef typename __alloc_traits::pointer pointer; + typedef typename __alloc_traits::const_pointer const_pointer; + typedef pointer iterator; + typedef const_pointer const_iterator; + + pointer __first_; + pointer __begin_; + pointer __end_; + __compressed_pair __end_cap_; + + typedef typename add_lvalue_reference::type __alloc_ref; + typedef typename add_lvalue_reference::type __alloc_const_ref; + + _LIBCPP_INLINE_VISIBILITY __alloc_rr& __alloc() _NOEXCEPT {return __end_cap_.second();} + _LIBCPP_INLINE_VISIBILITY const __alloc_rr& __alloc() const _NOEXCEPT {return __end_cap_.second();} + _LIBCPP_INLINE_VISIBILITY pointer& __end_cap() _NOEXCEPT {return __end_cap_.first();} + _LIBCPP_INLINE_VISIBILITY const pointer& __end_cap() const _NOEXCEPT {return __end_cap_.first();} + + _LIBCPP_INLINE_VISIBILITY + __split_buffer() + _NOEXCEPT_(is_nothrow_default_constructible::value); + _LIBCPP_INLINE_VISIBILITY + explicit __split_buffer(__alloc_rr& __a); + _LIBCPP_INLINE_VISIBILITY + explicit __split_buffer(const __alloc_rr& __a); + __split_buffer(size_type __cap, size_type __start, __alloc_rr& __a); + ~__split_buffer(); + +#ifndef _LIBCPP_CXX03_LANG + __split_buffer(__split_buffer&& __c) + _NOEXCEPT_(is_nothrow_move_constructible::value); + __split_buffer(__split_buffer&& __c, const __alloc_rr& __a); + __split_buffer& operator=(__split_buffer&& __c) + _NOEXCEPT_((__alloc_traits::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable::value) || + !__alloc_traits::propagate_on_container_move_assignment::value); +#endif // _LIBCPP_CXX03_LANG + + _LIBCPP_INLINE_VISIBILITY iterator begin() _NOEXCEPT {return __begin_;} + _LIBCPP_INLINE_VISIBILITY const_iterator begin() const _NOEXCEPT {return __begin_;} + _LIBCPP_INLINE_VISIBILITY iterator end() _NOEXCEPT {return __end_;} + _LIBCPP_INLINE_VISIBILITY const_iterator end() const _NOEXCEPT {return __end_;} + + _LIBCPP_INLINE_VISIBILITY + void clear() _NOEXCEPT + {__destruct_at_end(__begin_);} + _LIBCPP_INLINE_VISIBILITY size_type size() const {return static_cast(__end_ - __begin_);} + _LIBCPP_INLINE_VISIBILITY bool empty() const {return __end_ == __begin_;} + _LIBCPP_INLINE_VISIBILITY size_type capacity() const {return static_cast(__end_cap() - __first_);} + _LIBCPP_INLINE_VISIBILITY size_type __front_spare() const {return static_cast(__begin_ - __first_);} + _LIBCPP_INLINE_VISIBILITY size_type __back_spare() const {return static_cast(__end_cap() - __end_);} + + _LIBCPP_INLINE_VISIBILITY reference front() {return *__begin_;} + _LIBCPP_INLINE_VISIBILITY const_reference front() const {return *__begin_;} + _LIBCPP_INLINE_VISIBILITY reference back() {return *(__end_ - 1);} + _LIBCPP_INLINE_VISIBILITY const_reference back() const {return *(__end_ - 1);} + + void reserve(size_type __n); + void shrink_to_fit() _NOEXCEPT; + void push_front(const_reference __x); + _LIBCPP_INLINE_VISIBILITY void push_back(const_reference __x); +#ifndef _LIBCPP_CXX03_LANG + void push_front(value_type&& __x); + void push_back(value_type&& __x); + template + void emplace_back(_Args&&... __args); +#endif // !defined(_LIBCPP_CXX03_LANG) + + _LIBCPP_INLINE_VISIBILITY void pop_front() {__destruct_at_begin(__begin_+1);} + _LIBCPP_INLINE_VISIBILITY void pop_back() {__destruct_at_end(__end_-1);} + + void __construct_at_end(size_type __n); + void __construct_at_end(size_type __n, const_reference __x); + template + typename enable_if + < + __is_input_iterator<_InputIter>::value && + !__is_forward_iterator<_InputIter>::value, + void + >::type + __construct_at_end(_InputIter __first, _InputIter __last); + template + typename enable_if + < + __is_forward_iterator<_ForwardIterator>::value, + void + >::type + __construct_at_end(_ForwardIterator __first, _ForwardIterator __last); + + _LIBCPP_INLINE_VISIBILITY void __destruct_at_begin(pointer __new_begin) + {__destruct_at_begin(__new_begin, is_trivially_destructible());} + _LIBCPP_INLINE_VISIBILITY + void __destruct_at_begin(pointer __new_begin, false_type); + _LIBCPP_INLINE_VISIBILITY + void __destruct_at_begin(pointer __new_begin, true_type); + + _LIBCPP_INLINE_VISIBILITY + void __destruct_at_end(pointer __new_last) _NOEXCEPT + {__destruct_at_end(__new_last, false_type());} + _LIBCPP_INLINE_VISIBILITY + void __destruct_at_end(pointer __new_last, false_type) _NOEXCEPT; + _LIBCPP_INLINE_VISIBILITY + void __destruct_at_end(pointer __new_last, true_type) _NOEXCEPT; + + void swap(__split_buffer& __x) + _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value|| + __is_nothrow_swappable<__alloc_rr>::value); + + bool __invariants() const; + +private: + _LIBCPP_INLINE_VISIBILITY + void __move_assign_alloc(__split_buffer& __c, true_type) + _NOEXCEPT_(is_nothrow_move_assignable::value) + { + __alloc() = _VSTD::move(__c.__alloc()); + } + + _LIBCPP_INLINE_VISIBILITY + void __move_assign_alloc(__split_buffer&, false_type) _NOEXCEPT + {} + + struct _ConstructTransaction { + explicit _ConstructTransaction(pointer* __p, size_type __n) _NOEXCEPT + : __pos_(*__p), __end_(*__p + __n), __dest_(__p) { + } + ~_ConstructTransaction() { + *__dest_ = __pos_; + } + pointer __pos_; + const pointer __end_; + private: + pointer *__dest_; + }; +}; + +template +bool +__split_buffer<_Tp, _Allocator>::__invariants() const +{ + if (__first_ == nullptr) + { + if (__begin_ != nullptr) + return false; + if (__end_ != nullptr) + return false; + if (__end_cap() != nullptr) + return false; + } + else + { + if (__begin_ < __first_) + return false; + if (__end_ < __begin_) + return false; + if (__end_cap() < __end_) + return false; + } + return true; +} + +// Default constructs __n objects starting at __end_ +// throws if construction throws +// Precondition: __n > 0 +// Precondition: size() + __n <= capacity() +// Postcondition: size() == size() + __n +template +void +__split_buffer<_Tp, _Allocator>::__construct_at_end(size_type __n) +{ + _ConstructTransaction __tx(&this->__end_, __n); + for (; __tx.__pos_ != __tx.__end_; ++__tx.__pos_) { + __alloc_traits::construct(this->__alloc(), _VSTD::__to_raw_pointer(__tx.__pos_)); + } +} + +// Copy constructs __n objects starting at __end_ from __x +// throws if construction throws +// Precondition: __n > 0 +// Precondition: size() + __n <= capacity() +// Postcondition: size() == old size() + __n +// Postcondition: [i] == __x for all i in [size() - __n, __n) +template +void +__split_buffer<_Tp, _Allocator>::__construct_at_end(size_type __n, const_reference __x) +{ + _ConstructTransaction __tx(&this->__end_, __n); + for (; __tx.__pos_ != __tx.__end_; ++__tx.__pos_) { + __alloc_traits::construct(this->__alloc(), + _VSTD::__to_raw_pointer(__tx.__pos_), __x); + } +} + +template +template +typename enable_if +< + __is_input_iterator<_InputIter>::value && + !__is_forward_iterator<_InputIter>::value, + void +>::type +__split_buffer<_Tp, _Allocator>::__construct_at_end(_InputIter __first, _InputIter __last) +{ + __alloc_rr& __a = this->__alloc(); + for (; __first != __last; ++__first) + { + if (__end_ == __end_cap()) + { + size_type __old_cap = __end_cap() - __first_; + size_type __new_cap = _VSTD::max(2 * __old_cap, 8); + __split_buffer __buf(__new_cap, 0, __a); + for (pointer __p = __begin_; __p != __end_; ++__p, ++__buf.__end_) + __alloc_traits::construct(__buf.__alloc(), + _VSTD::__to_raw_pointer(__buf.__end_), _VSTD::move(*__p)); + swap(__buf); + } + __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_), *__first); + ++this->__end_; + } +} + +template +template +typename enable_if +< + __is_forward_iterator<_ForwardIterator>::value, + void +>::type +__split_buffer<_Tp, _Allocator>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last) +{ + _ConstructTransaction __tx(&this->__end_, std::distance(__first, __last)); + for (; __tx.__pos_ != __tx.__end_; ++__tx.__pos_, ++__first) { + __alloc_traits::construct(this->__alloc(), + _VSTD::__to_raw_pointer(__tx.__pos_), *__first); + } +} + +template +inline +void +__split_buffer<_Tp, _Allocator>::__destruct_at_begin(pointer __new_begin, false_type) +{ + while (__begin_ != __new_begin) + __alloc_traits::destroy(__alloc(), __to_raw_pointer(__begin_++)); +} + +template +inline +void +__split_buffer<_Tp, _Allocator>::__destruct_at_begin(pointer __new_begin, true_type) +{ + __begin_ = __new_begin; +} + +template +inline _LIBCPP_INLINE_VISIBILITY +void +__split_buffer<_Tp, _Allocator>::__destruct_at_end(pointer __new_last, false_type) _NOEXCEPT +{ + while (__new_last != __end_) + __alloc_traits::destroy(__alloc(), __to_raw_pointer(--__end_)); +} + +template +inline _LIBCPP_INLINE_VISIBILITY +void +__split_buffer<_Tp, _Allocator>::__destruct_at_end(pointer __new_last, true_type) _NOEXCEPT +{ + __end_ = __new_last; +} + +template +__split_buffer<_Tp, _Allocator>::__split_buffer(size_type __cap, size_type __start, __alloc_rr& __a) + : __end_cap_(nullptr, __a) +{ + __first_ = __cap != 0 ? __alloc_traits::allocate(__alloc(), __cap) : nullptr; + __begin_ = __end_ = __first_ + __start; + __end_cap() = __first_ + __cap; +} + +template +inline +__split_buffer<_Tp, _Allocator>::__split_buffer() + _NOEXCEPT_(is_nothrow_default_constructible::value) + : __first_(nullptr), __begin_(nullptr), __end_(nullptr), __end_cap_(nullptr) +{ +} + +template +inline +__split_buffer<_Tp, _Allocator>::__split_buffer(__alloc_rr& __a) + : __first_(nullptr), __begin_(nullptr), __end_(nullptr), __end_cap_(nullptr, __a) +{ +} + +template +inline +__split_buffer<_Tp, _Allocator>::__split_buffer(const __alloc_rr& __a) + : __first_(nullptr), __begin_(nullptr), __end_(nullptr), __end_cap_(nullptr, __a) +{ +} + +template +__split_buffer<_Tp, _Allocator>::~__split_buffer() +{ + clear(); + if (__first_) + __alloc_traits::deallocate(__alloc(), __first_, capacity()); +} + +#ifndef _LIBCPP_CXX03_LANG + +template +__split_buffer<_Tp, _Allocator>::__split_buffer(__split_buffer&& __c) + _NOEXCEPT_(is_nothrow_move_constructible::value) + : __first_(_VSTD::move(__c.__first_)), + __begin_(_VSTD::move(__c.__begin_)), + __end_(_VSTD::move(__c.__end_)), + __end_cap_(_VSTD::move(__c.__end_cap_)) +{ + __c.__first_ = nullptr; + __c.__begin_ = nullptr; + __c.__end_ = nullptr; + __c.__end_cap() = nullptr; +} + +template +__split_buffer<_Tp, _Allocator>::__split_buffer(__split_buffer&& __c, const __alloc_rr& __a) + : __end_cap_(__second_tag(), __a) +{ + if (__a == __c.__alloc()) + { + __first_ = __c.__first_; + __begin_ = __c.__begin_; + __end_ = __c.__end_; + __end_cap() = __c.__end_cap(); + __c.__first_ = nullptr; + __c.__begin_ = nullptr; + __c.__end_ = nullptr; + __c.__end_cap() = nullptr; + } + else + { + size_type __cap = __c.size(); + __first_ = __alloc_traits::allocate(__alloc(), __cap); + __begin_ = __end_ = __first_; + __end_cap() = __first_ + __cap; + typedef move_iterator _Ip; + __construct_at_end(_Ip(__c.begin()), _Ip(__c.end())); + } +} + +template +__split_buffer<_Tp, _Allocator>& +__split_buffer<_Tp, _Allocator>::operator=(__split_buffer&& __c) + _NOEXCEPT_((__alloc_traits::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable::value) || + !__alloc_traits::propagate_on_container_move_assignment::value) +{ + clear(); + shrink_to_fit(); + __first_ = __c.__first_; + __begin_ = __c.__begin_; + __end_ = __c.__end_; + __end_cap() = __c.__end_cap(); + __move_assign_alloc(__c, + integral_constant()); + __c.__first_ = __c.__begin_ = __c.__end_ = __c.__end_cap() = nullptr; + return *this; +} + +#endif // _LIBCPP_CXX03_LANG + +template +void +__split_buffer<_Tp, _Allocator>::swap(__split_buffer& __x) + _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value|| + __is_nothrow_swappable<__alloc_rr>::value) +{ + _VSTD::swap(__first_, __x.__first_); + _VSTD::swap(__begin_, __x.__begin_); + _VSTD::swap(__end_, __x.__end_); + _VSTD::swap(__end_cap(), __x.__end_cap()); + __swap_allocator(__alloc(), __x.__alloc()); +} + +template +void +__split_buffer<_Tp, _Allocator>::reserve(size_type __n) +{ + if (__n < capacity()) + { + __split_buffer __t(__n, 0, __alloc()); + __t.__construct_at_end(move_iterator(__begin_), + move_iterator(__end_)); + _VSTD::swap(__first_, __t.__first_); + _VSTD::swap(__begin_, __t.__begin_); + _VSTD::swap(__end_, __t.__end_); + _VSTD::swap(__end_cap(), __t.__end_cap()); + } +} + +template +void +__split_buffer<_Tp, _Allocator>::shrink_to_fit() _NOEXCEPT +{ + if (capacity() > size()) + { +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + __split_buffer __t(size(), 0, __alloc()); + __t.__construct_at_end(move_iterator(__begin_), + move_iterator(__end_)); + __t.__end_ = __t.__begin_ + (__end_ - __begin_); + _VSTD::swap(__first_, __t.__first_); + _VSTD::swap(__begin_, __t.__begin_); + _VSTD::swap(__end_, __t.__end_); + _VSTD::swap(__end_cap(), __t.__end_cap()); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + } +#endif // _LIBCPP_NO_EXCEPTIONS + } +} + +template +void +__split_buffer<_Tp, _Allocator>::push_front(const_reference __x) +{ + if (__begin_ == __first_) + { + if (__end_ < __end_cap()) + { + difference_type __d = __end_cap() - __end_; + __d = (__d + 1) / 2; + __begin_ = _VSTD::move_backward(__begin_, __end_, __end_ + __d); + __end_ += __d; + } + else + { + size_type __c = max(2 * static_cast(__end_cap() - __first_), 1); + __split_buffer __t(__c, (__c + 3) / 4, __alloc()); + __t.__construct_at_end(move_iterator(__begin_), + move_iterator(__end_)); + _VSTD::swap(__first_, __t.__first_); + _VSTD::swap(__begin_, __t.__begin_); + _VSTD::swap(__end_, __t.__end_); + _VSTD::swap(__end_cap(), __t.__end_cap()); + } + } + __alloc_traits::construct(__alloc(), _VSTD::__to_raw_pointer(__begin_-1), __x); + --__begin_; +} + +#ifndef _LIBCPP_CXX03_LANG + +template +void +__split_buffer<_Tp, _Allocator>::push_front(value_type&& __x) +{ + if (__begin_ == __first_) + { + if (__end_ < __end_cap()) + { + difference_type __d = __end_cap() - __end_; + __d = (__d + 1) / 2; + __begin_ = _VSTD::move_backward(__begin_, __end_, __end_ + __d); + __end_ += __d; + } + else + { + size_type __c = max(2 * static_cast(__end_cap() - __first_), 1); + __split_buffer __t(__c, (__c + 3) / 4, __alloc()); + __t.__construct_at_end(move_iterator(__begin_), + move_iterator(__end_)); + _VSTD::swap(__first_, __t.__first_); + _VSTD::swap(__begin_, __t.__begin_); + _VSTD::swap(__end_, __t.__end_); + _VSTD::swap(__end_cap(), __t.__end_cap()); + } + } + __alloc_traits::construct(__alloc(), _VSTD::__to_raw_pointer(__begin_-1), + _VSTD::move(__x)); + --__begin_; +} + +#endif // _LIBCPP_CXX03_LANG + +template +inline _LIBCPP_INLINE_VISIBILITY +void +__split_buffer<_Tp, _Allocator>::push_back(const_reference __x) +{ + if (__end_ == __end_cap()) + { + if (__begin_ > __first_) + { + difference_type __d = __begin_ - __first_; + __d = (__d + 1) / 2; + __end_ = _VSTD::move(__begin_, __end_, __begin_ - __d); + __begin_ -= __d; + } + else + { + size_type __c = max(2 * static_cast(__end_cap() - __first_), 1); + __split_buffer __t(__c, __c / 4, __alloc()); + __t.__construct_at_end(move_iterator(__begin_), + move_iterator(__end_)); + _VSTD::swap(__first_, __t.__first_); + _VSTD::swap(__begin_, __t.__begin_); + _VSTD::swap(__end_, __t.__end_); + _VSTD::swap(__end_cap(), __t.__end_cap()); + } + } + __alloc_traits::construct(__alloc(), _VSTD::__to_raw_pointer(__end_), __x); + ++__end_; +} + +#ifndef _LIBCPP_CXX03_LANG + +template +void +__split_buffer<_Tp, _Allocator>::push_back(value_type&& __x) +{ + if (__end_ == __end_cap()) + { + if (__begin_ > __first_) + { + difference_type __d = __begin_ - __first_; + __d = (__d + 1) / 2; + __end_ = _VSTD::move(__begin_, __end_, __begin_ - __d); + __begin_ -= __d; + } + else + { + size_type __c = max(2 * static_cast(__end_cap() - __first_), 1); + __split_buffer __t(__c, __c / 4, __alloc()); + __t.__construct_at_end(move_iterator(__begin_), + move_iterator(__end_)); + _VSTD::swap(__first_, __t.__first_); + _VSTD::swap(__begin_, __t.__begin_); + _VSTD::swap(__end_, __t.__end_); + _VSTD::swap(__end_cap(), __t.__end_cap()); + } + } + __alloc_traits::construct(__alloc(), _VSTD::__to_raw_pointer(__end_), + _VSTD::move(__x)); + ++__end_; +} + +template +template +void +__split_buffer<_Tp, _Allocator>::emplace_back(_Args&&... __args) +{ + if (__end_ == __end_cap()) + { + if (__begin_ > __first_) + { + difference_type __d = __begin_ - __first_; + __d = (__d + 1) / 2; + __end_ = _VSTD::move(__begin_, __end_, __begin_ - __d); + __begin_ -= __d; + } + else + { + size_type __c = max(2 * static_cast(__end_cap() - __first_), 1); + __split_buffer __t(__c, __c / 4, __alloc()); + __t.__construct_at_end(move_iterator(__begin_), + move_iterator(__end_)); + _VSTD::swap(__first_, __t.__first_); + _VSTD::swap(__begin_, __t.__begin_); + _VSTD::swap(__end_, __t.__end_); + _VSTD::swap(__end_cap(), __t.__end_cap()); + } + } + __alloc_traits::construct(__alloc(), _VSTD::__to_raw_pointer(__end_), + _VSTD::forward<_Args>(__args)...); + ++__end_; +} + +#endif // _LIBCPP_CXX03_LANG + +template +inline _LIBCPP_INLINE_VISIBILITY +void +swap(__split_buffer<_Tp, _Allocator>& __x, __split_buffer<_Tp, _Allocator>& __y) + _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) +{ + __x.swap(__y); +} + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP_SPLIT_BUFFER diff --git a/third_party/libcxx.bak/__tuple b/third_party/libcxx.bak/__tuple new file mode 100644 index 00000000000..a4ac6f7c920 --- /dev/null +++ b/third_party/libcxx.bak/__tuple @@ -0,0 +1,552 @@ +// clang-format off +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___TUPLE +#define _LIBCPP___TUPLE + +#include <__config> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + + +_LIBCPP_BEGIN_NAMESPACE_STD + +template struct _LIBCPP_TEMPLATE_VIS tuple_size; + +#if !defined(_LIBCPP_CXX03_LANG) +template +using __enable_if_tuple_size_imp = _Tp; + +template +struct _LIBCPP_TEMPLATE_VIS tuple_size<__enable_if_tuple_size_imp< + const _Tp, + typename enable_if::value>::type, + integral_constant)>>> + : public integral_constant::value> {}; + +template +struct _LIBCPP_TEMPLATE_VIS tuple_size<__enable_if_tuple_size_imp< + volatile _Tp, + typename enable_if::value>::type, + integral_constant)>>> + : public integral_constant::value> {}; + +template +struct _LIBCPP_TEMPLATE_VIS tuple_size<__enable_if_tuple_size_imp< + const volatile _Tp, + integral_constant)>>> + : public integral_constant::value> {}; + +#else +template struct _LIBCPP_TEMPLATE_VIS tuple_size : public tuple_size<_Tp> {}; +template struct _LIBCPP_TEMPLATE_VIS tuple_size : public tuple_size<_Tp> {}; +template struct _LIBCPP_TEMPLATE_VIS tuple_size : public tuple_size<_Tp> {}; +#endif + +template struct _LIBCPP_TEMPLATE_VIS tuple_element; + +template +struct _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, const _Tp> +{ + typedef _LIBCPP_NODEBUG_TYPE typename add_const::type>::type type; +}; + +template +struct _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, volatile _Tp> +{ + typedef _LIBCPP_NODEBUG_TYPE typename add_volatile::type>::type type; +}; + +template +struct _LIBCPP_TEMPLATE_VIS tuple_element<_Ip, const volatile _Tp> +{ + typedef _LIBCPP_NODEBUG_TYPE typename add_cv::type>::type type; +}; + +template struct __tuple_like : false_type {}; + +template struct __tuple_like : public __tuple_like<_Tp> {}; +template struct __tuple_like : public __tuple_like<_Tp> {}; +template struct __tuple_like : public __tuple_like<_Tp> {}; + +// tuple specializations + +#ifndef _LIBCPP_CXX03_LANG + +template struct __tuple_indices {}; + +template +struct __integer_sequence { + template