Vendor import of libc++ trunk r290819:
https://llvm.org/svn/llvm-project/libcxx/trunk@290819
This commit is contained in:
parent
b50f154970
commit
53a420fba2
11
.clang-format
Normal file
11
.clang-format
Normal file
@ -0,0 +1,11 @@
|
||||
BasedOnStyle: LLVM
|
||||
|
||||
---
|
||||
Language: Cpp
|
||||
|
||||
AlwaysBreakTemplateDeclarations: true
|
||||
|
||||
# Disable formatting options which may break tests.
|
||||
SortIncludes: false
|
||||
ReflowComments: false
|
||||
---
|
7
.gitignore
vendored
7
.gitignore
vendored
@ -52,3 +52,10 @@ docs/_build/
|
||||
|
||||
# PyBuilder
|
||||
target/
|
||||
|
||||
# MSVC libraries test harness
|
||||
env.lst
|
||||
keep.lst
|
||||
|
||||
# Editor by-products
|
||||
.vscode/
|
||||
|
184
CMakeLists.txt
184
CMakeLists.txt
@ -19,23 +19,17 @@ set(CMAKE_MODULE_PATH
|
||||
${CMAKE_MODULE_PATH}
|
||||
)
|
||||
|
||||
# Find the LLVM sources and simulate LLVM CMake options.
|
||||
include(HandleOutOfTreeLLVM)
|
||||
|
||||
if (LIBCXX_BUILT_STANDALONE)
|
||||
if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
|
||||
project(libcxx CXX C)
|
||||
|
||||
set(PACKAGE_NAME libcxx)
|
||||
set(PACKAGE_VERSION trunk-svn)
|
||||
set(PACKAGE_VERSION 4.0.0svn)
|
||||
set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
|
||||
set(PACKAGE_BUGREPORT "llvm-bugs@lists.llvm.org")
|
||||
endif ()
|
||||
|
||||
if (LIBCXX_BUILT_STANDALONE AND NOT LLVM_FOUND)
|
||||
message(WARNING "UNSUPPORTED LIBCXX CONFIGURATION DETECTED: "
|
||||
"llvm-config not found and LLVM_PATH not defined.\n"
|
||||
"Reconfigure with -DLLVM_CONFIG=path/to/llvm-config "
|
||||
"or -DLLVM_PATH=path/to/llvm-source-root.")
|
||||
# Find the LLVM sources and simulate LLVM CMake options.
|
||||
include(HandleOutOfTreeLLVM)
|
||||
endif()
|
||||
|
||||
# Require out of source build.
|
||||
@ -48,23 +42,49 @@ MACRO_ENSURE_OUT_OF_SOURCE_BUILD(
|
||||
#===============================================================================
|
||||
# Setup CMake Options
|
||||
#===============================================================================
|
||||
include(CMakeDependentOption)
|
||||
|
||||
# Basic options ---------------------------------------------------------------
|
||||
option(LIBCXX_ENABLE_ASSERTIONS "Enable assertions independent of build mode." ON)
|
||||
option(LIBCXX_ENABLE_SHARED "Build libc++ as a shared library." ON)
|
||||
option(LIBCXX_ENABLE_STATIC "Build libc++ as a static library." ON)
|
||||
option(LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY "Build libc++experimental.a" ON)
|
||||
option(LIBCXX_ENABLE_FILESYSTEM
|
||||
"Build filesystem as part of libc++experimental.a" ${LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY})
|
||||
option(LIBCXX_INCLUDE_TESTS "Build the libc++ tests." ${LLVM_INCLUDE_TESTS})
|
||||
|
||||
# Benchmark options -----------------------------------------------------------
|
||||
option(LIBCXX_INCLUDE_BENCHMARKS "Build the libc++ benchmarks and their dependancies" ON)
|
||||
set(LIBCXX_BENCHMARK_NATIVE_STDLIB "" CACHE STRING
|
||||
"Build the benchmarks against the specified native STL.
|
||||
The value must be one of libc++/libstdc++")
|
||||
set(LIBCXX_BENCHMARK_NATIVE_GCC_TOOLCHAIN "" CACHE STRING
|
||||
"Use alternate GCC toolchain when building the native benchmarks")
|
||||
|
||||
if (LIBCXX_BENCHMARK_NATIVE_STDLIB)
|
||||
if (NOT (LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libc++"
|
||||
OR LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libstdc++"))
|
||||
message(FATAL_ERROR "Invalid value for LIBCXX_BENCHMARK_NATIVE_STDLIB: "
|
||||
"'${LIBCXX_BENCHMARK_NATIVE_STDLIB}'")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
option(LIBCXX_INCLUDE_DOCS "Build the libc++ documentation." ${LLVM_INCLUDE_DOCS})
|
||||
set(LIBCXX_LIBDIR_SUFFIX "${LLVM_LIBDIR_SUFFIX}" CACHE STRING
|
||||
"Define suffix of library directory name (32/64)")
|
||||
option(LIBCXX_INSTALL_HEADERS "Install the libc++ headers." ON)
|
||||
option(LIBCXX_INSTALL_LIBRARY "Install the libc++ library." ON)
|
||||
option(LIBCXX_INSTALL_SUPPORT_HEADERS "Install libc++ support headers." ON)
|
||||
option(LIBCXX_INSTALL_EXPERIMENTAL_LIBRARY "Install libc++experimental.a" OFF)
|
||||
cmake_dependent_option(LIBCXX_INSTALL_EXPERIMENTAL_LIBRARY
|
||||
"Install libc++experimental.a" ON
|
||||
"LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY;LIBCXX_INSTALL_LIBRARY" OFF)
|
||||
set(LIBCXX_ABI_VERSION 1 CACHE STRING "ABI version of libc++.")
|
||||
option(LIBCXX_ABI_UNSTABLE "Unstable ABI of libc++." OFF)
|
||||
option(LIBCXX_USE_COMPILER_RT "Use compiler-rt instead of libgcc" OFF)
|
||||
|
||||
if (NOT LIBCXX_ENABLE_SHARED AND NOT LIBCXX_ENABLE_STATIC)
|
||||
message(FATAL_ERROR "libc++ must be built as either a shared or static library.")
|
||||
endif()
|
||||
|
||||
# ABI Library options ---------------------------------------------------------
|
||||
set(LIBCXX_CXX_ABI "${LIBCXX_CXX_ABI}" CACHE STRING
|
||||
@ -74,17 +94,24 @@ set_property(CACHE LIBCXX_CXX_ABI PROPERTY STRINGS ;${CXXABIS})
|
||||
|
||||
# Setup the default options if LIBCXX_CXX_ABI is not specified.
|
||||
if (NOT LIBCXX_CXX_ABI)
|
||||
if (NOT DEFINED LIBCXX_BUILT_STANDALONE AND
|
||||
IS_DIRECTORY "${CMAKE_SOURCE_DIR}/projects/libcxxabi")
|
||||
find_path(
|
||||
LIBCXX_LIBCXXABI_INCLUDES_INTERNAL
|
||||
cxxabi.h
|
||||
PATHS ${LLVM_MAIN_SRC_DIR}/projects/libcxxabi/include
|
||||
${LLVM_MAIN_SRC_DIR}/runtimes/libcxxabi/include
|
||||
NO_DEFAULT_PATH
|
||||
)
|
||||
if (NOT DEFINED LIBCXX_STANDALONE_BUILD AND
|
||||
IS_DIRECTORY "${LIBCXX_LIBCXXABI_INCLUDES_INTERNAL}")
|
||||
set(LIBCXX_CXX_ABI_LIBNAME "libcxxabi")
|
||||
set(LIBCXX_CXX_ABI_INCLUDE_PATHS "${CMAKE_SOURCE_DIR}/projects/libcxxabi/include")
|
||||
set(LIBCXX_CXX_ABI_INCLUDE_PATHS "${LIBCXX_LIBCXXABI_INCLUDES_INTERNAL}")
|
||||
set(LIBCXX_CXX_ABI_INTREE 1)
|
||||
else ()
|
||||
else()
|
||||
set(LIBCXX_CXX_ABI_LIBNAME "none")
|
||||
endif ()
|
||||
else ()
|
||||
endif()
|
||||
else()
|
||||
set(LIBCXX_CXX_ABI_LIBNAME "${LIBCXX_CXX_ABI}")
|
||||
endif ()
|
||||
endif()
|
||||
|
||||
# Use a static copy of the ABI library when linking libc++. This option
|
||||
# cannot be used with LIBCXX_ENABLE_ABI_LINKER_SCRIPT.
|
||||
@ -129,6 +156,9 @@ option(LIBCXX_ENABLE_MONOTONIC_CLOCK
|
||||
This option may only be set to OFF when LIBCXX_ENABLE_THREADS=OFF." ON)
|
||||
option(LIBCXX_HAS_MUSL_LIBC "Build libc++ with support for the Musl C library" OFF)
|
||||
option(LIBCXX_HAS_PTHREAD_API "Ignore auto-detection and force use of pthread API" OFF)
|
||||
option(LIBCXX_HAS_EXTERNAL_THREAD_API
|
||||
"Build libc++ with an externalized threading API.
|
||||
This option may only be set to ON when LIBCXX_ENABLE_THREADS=ON." OFF)
|
||||
|
||||
# Misc options ----------------------------------------------------------------
|
||||
# FIXME: Turn -pedantic back ON. It is currently off because it warns
|
||||
@ -186,6 +216,11 @@ if(LIBCXX_HAS_PTHREAD_API AND NOT LIBCXX_ENABLE_THREADS)
|
||||
" when LIBCXX_ENABLE_THREADS is also set to ON.")
|
||||
endif()
|
||||
|
||||
if(LIBCXX_HAS_EXTERNAL_THREAD_API AND NOT LIBCXX_ENABLE_THREADS)
|
||||
message(FATAL_ERROR "LIBCXX_HAS_EXTERNAL_THREAD_API can only be set to ON"
|
||||
" when LIBCXX_ENABLE_THREADS is also set to ON.")
|
||||
endif()
|
||||
|
||||
# Ensure LLVM_USE_SANITIZER is not specified when LIBCXX_GENERATE_COVERAGE
|
||||
# is ON.
|
||||
if (LLVM_USE_SANITIZER AND LIBCXX_GENERATE_COVERAGE)
|
||||
@ -209,6 +244,9 @@ if (LIBCXX_ENABLE_STATIC_ABI_LIBRARY)
|
||||
else()
|
||||
message(WARNING "LIBCXX_ENABLE_STATIC_ABI_LIBRARY is an experimental option")
|
||||
endif()
|
||||
if (LIBCXX_ENABLE_STATIC AND NOT PYTHONINTERP_FOUND)
|
||||
message(FATAL_ERROR "LIBCXX_ENABLE_STATIC_ABI_LIBRARY requires python but it was not found.")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (LIBCXX_ENABLE_ABI_LINKER_SCRIPT)
|
||||
@ -251,9 +289,13 @@ set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LIBCXX_LIBRARY_DIR})
|
||||
# LIBCXX_CXX_FLAGS: General flags for both the compiler and linker.
|
||||
# LIBCXX_COMPILE_FLAGS: Compile only flags.
|
||||
# LIBCXX_LINK_FLAGS: Linker only flags.
|
||||
# LIBCXX_LIBRARIES: libraries libc++ is linked to.
|
||||
# LIBCXX_INTERFACE_LIBRARIES: Libraries that must be linked when using libc++
|
||||
# These libraries are exposed in the linker script.
|
||||
set(LIBCXX_COMPILE_FLAGS "")
|
||||
set(LIBCXX_LINK_FLAGS "")
|
||||
set(LIBCXX_LIBRARIES "")
|
||||
set(LIBCXX_INTERFACE_LIBRARIES "")
|
||||
|
||||
# Include macros for adding and removing libc++ flags.
|
||||
include(HandleLibcxxFlags)
|
||||
@ -266,10 +308,17 @@ add_target_flags_if(LIBCXX_BUILD_32_BITS "-m32")
|
||||
add_target_flags_if(LIBCXX_TARGET_TRIPLE "-target ${LIBCXX_TARGET_TRIPLE}")
|
||||
add_target_flags_if(LIBCXX_SYSROOT "--sysroot=${LIBCXX_SYSROOT}")
|
||||
add_target_flags_if(LIBCXX_GCC_TOOLCHAIN "-gcc-toolchain ${LIBCXX_GCC_TOOLCHAIN}")
|
||||
if (LIBCXX_TARGET_TRIPLE)
|
||||
set(TARGET_TRIPLE "${LIBCXX_TARGET_TRIPLE}")
|
||||
endif()
|
||||
|
||||
# Configure compiler.
|
||||
include(config-ix)
|
||||
|
||||
if (LIBCXX_USE_COMPILER_RT)
|
||||
list(APPEND LIBCXX_LINK_FLAGS "-rtlib=compiler-rt")
|
||||
endif()
|
||||
|
||||
# Configure coverage options.
|
||||
if (LIBCXX_GENERATE_COVERAGE)
|
||||
include(CodeCoverage)
|
||||
@ -284,9 +333,12 @@ string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
|
||||
|
||||
include(HandleLibCXXABI) # Setup the ABI library flags
|
||||
|
||||
# Remove flags that may have snuck in.
|
||||
remove_flags(-DNDEBUG -UNDEBUG -D_DEBUG
|
||||
-stdlib=libc++ -stdlib=libstdc++ -lc++abi -m32)
|
||||
if (NOT LIBCXX_STANDALONE_BUILD)
|
||||
# Remove flags that may have snuck in.
|
||||
remove_flags(-DNDEBUG -UNDEBUG -D_DEBUG
|
||||
-lc++abi -m32)
|
||||
endif()
|
||||
remove_flags(-stdlib=libc++ -stdlib=libstdc++)
|
||||
|
||||
# FIXME(EricWF): See the FIXME on LIBCXX_ENABLE_PEDANTIC.
|
||||
# Remove the -pedantic flag and -Wno-pedantic and -pedantic-errors
|
||||
@ -294,9 +346,18 @@ remove_flags(-DNDEBUG -UNDEBUG -D_DEBUG
|
||||
remove_flags(-Wno-pedantic -pedantic-errors -pedantic)
|
||||
|
||||
# Required flags ==============================================================
|
||||
add_compile_flags_if_supported(-std=c++11)
|
||||
if (NOT MSVC AND NOT LIBCXX_SUPPORTS_STD_EQ_CXX11_FLAG)
|
||||
message(FATAL_ERROR "C++11 is required but the compiler does not support -std=c++11")
|
||||
set(LIBCXX_STANDARD_VER c++11 CACHE INTERNAL "internal option to change build dialect")
|
||||
if (LIBCXX_HAS_MUSL_LIBC)
|
||||
# musl's pthread implementations uses volatile types in their structs which is
|
||||
# not a constexpr in C++11 but is in C++14, so we use C++14 with musl.
|
||||
set(LIBCXX_STANDARD_VER c++14 CACHE INTERNAL "internal option to change build dialect")
|
||||
endif()
|
||||
add_compile_flags_if_supported(-std=${LIBCXX_STANDARD_VER})
|
||||
mangle_name("LIBCXX_SUPPORTS_STD_EQ_${LIBCXX_STANDARD_VER}_FLAG" SUPPORTS_DIALECT_NAME)
|
||||
if(NOT ${SUPPORTS_DIALECT_NAME})
|
||||
if(NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" AND NOT "${CMAKE_CXX_SIMULATE_ID}" STREQUAL "MSVC")
|
||||
message(FATAL_ERROR "C++11 or greater is required but the compiler does not support ${LIBCXX_STANDARD_VER}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# On all systems the system c++ standard library headers need to be excluded.
|
||||
@ -305,14 +366,30 @@ endif()
|
||||
# headers
|
||||
add_compile_flags_if_supported(-nostdinc++)
|
||||
|
||||
# Hide all inline function definitions which have not explicitly been marked
|
||||
# visible. This prevents new definitions for inline functions from appearing in
|
||||
# the dylib when get ODR used by another function.
|
||||
add_compile_flags_if_supported(-fvisibility-inlines-hidden)
|
||||
|
||||
# Let the library headers know they are currently being used to build the
|
||||
# library.
|
||||
add_definitions(-D_LIBCPP_BUILDING_LIBRARY)
|
||||
|
||||
# Warning flags ===============================================================
|
||||
add_definitions(-D_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
add_compile_flags_if_supported(
|
||||
-Wall -W -Wwrite-strings
|
||||
-Wno-unused-parameter -Wno-long-long -Wno-user-defined-literals
|
||||
-Wno-covered-switch-default
|
||||
-Wall -Wextra -W -Wwrite-strings
|
||||
-Wno-unused-parameter -Wno-long-long
|
||||
-Werror=return-type)
|
||||
if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
|
||||
add_compile_flags_if_supported(
|
||||
-Wno-user-defined-literals
|
||||
-Wno-covered-switch-default)
|
||||
elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
|
||||
add_compile_flags_if_supported(
|
||||
-Wno-literal-suffix
|
||||
-Wno-c++14-compat)
|
||||
endif()
|
||||
if (LIBCXX_ENABLE_WERROR)
|
||||
add_compile_flags_if_supported(-Werror)
|
||||
add_compile_flags_if_supported(-WX)
|
||||
@ -346,6 +423,17 @@ if (NOT LIBCXX_ENABLE_RTTI)
|
||||
add_compile_flags_if_supported(-fno-rtti)
|
||||
endif()
|
||||
|
||||
# Threading flags =============================================================
|
||||
if (LIBCXX_HAS_EXTERNAL_THREAD_API AND LIBCXX_ENABLE_SHARED)
|
||||
# Need to allow unresolved symbols if this is to work with shared library builds
|
||||
if (APPLE)
|
||||
add_link_flags("-undefined dynamic_lookup")
|
||||
else()
|
||||
# Relax this restriction from HandleLLVMOptions
|
||||
string(REPLACE "-Wl,-z,defs" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Assertion flags =============================================================
|
||||
define_if(LIBCXX_ENABLE_ASSERTIONS -UNDEBUG)
|
||||
define_if_not(LIBCXX_ENABLE_ASSERTIONS -DNDEBUG)
|
||||
@ -357,11 +445,21 @@ endif()
|
||||
# Feature flags ===============================================================
|
||||
define_if(MSVC -D_CRT_SECURE_NO_WARNINGS)
|
||||
|
||||
# Modules flags ===============================================================
|
||||
# FIXME The libc++ sources are fundamentally non-modular. They need special
|
||||
# versions of the headers in order to provide C++03 and legacy ABI definitions.
|
||||
# NOTE: The public headers can be used with modules in all other contexts.
|
||||
if (LLVM_ENABLE_MODULES)
|
||||
# Ignore that the rest of the modules flags are now unused.
|
||||
add_compile_flags_if_supported(-Wno-unused-command-line-argument)
|
||||
add_compile_flags(-fno-modules)
|
||||
endif()
|
||||
|
||||
# Sanitizer flags =============================================================
|
||||
|
||||
# Configure for sanitizers. If LIBCXX_BUILT_STANDALONE then we have to do
|
||||
# Configure for sanitizers. If LIBCXX_STANDALONE_BUILD then we have to do
|
||||
# the flag translation ourselves. Othewise LLVM's CMakeList.txt will handle it.
|
||||
if (LIBCXX_BUILT_STANDALONE)
|
||||
if (LIBCXX_STANDALONE_BUILD)
|
||||
set(LLVM_USE_SANITIZER "" CACHE STRING
|
||||
"Define the sanitizer used to build the library and tests")
|
||||
# NOTE: LLVM_USE_SANITIZER checks for a UNIX like system instead of MSVC.
|
||||
@ -407,16 +505,29 @@ config_define_if_not(LIBCXX_ENABLE_MONOTONIC_CLOCK _LIBCPP_HAS_NO_MONOTONIC_CLOC
|
||||
config_define_if_not(LIBCXX_ENABLE_THREAD_UNSAFE_C_FUNCTIONS _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS)
|
||||
|
||||
config_define_if(LIBCXX_HAS_PTHREAD_API _LIBCPP_HAS_THREAD_API_PTHREAD)
|
||||
config_define_if(LIBCXX_HAS_EXTERNAL_THREAD_API _LIBCPP_HAS_THREAD_API_EXTERNAL)
|
||||
config_define_if(LIBCXX_HAS_MUSL_LIBC _LIBCPP_HAS_MUSL_LIBC)
|
||||
|
||||
# By default libc++ on Windows expects to use a shared library, which requires
|
||||
# the headers to use DLL import/export semantics. However when building a
|
||||
# static library only we modify the headers to disable DLL import/export.
|
||||
if (DEFINED WIN32 AND LIBCXX_ENABLE_STATIC AND NOT LIBCXX_ENABLE_SHARED)
|
||||
message(STATUS "Generating custom __config for non-DLL Windows build")
|
||||
config_define(ON _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
|
||||
endif()
|
||||
|
||||
if (LIBCXX_NEEDS_SITE_CONFIG)
|
||||
configure_file(
|
||||
include/__config_site.in
|
||||
${LIBCXX_BINARY_DIR}/__config_site
|
||||
@ONLY)
|
||||
configure_file("include/__config_site.in"
|
||||
"${LIBCXX_BINARY_DIR}/__config_site"
|
||||
@ONLY)
|
||||
|
||||
# Provide the config definitions by included the generated __config_site
|
||||
# file at compile time.
|
||||
add_compile_flags("-include ${LIBCXX_BINARY_DIR}/__config_site")
|
||||
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR "${CMAKE_CXX_SIMULATE_ID}" STREQUAL "MSVC")
|
||||
add_compile_flags("/FI\"${LIBCXX_BINARY_DIR}/__config_site\"")
|
||||
else()
|
||||
add_compile_flags("-include ${LIBCXX_BINARY_DIR}/__config_site")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
#===============================================================================
|
||||
@ -426,8 +537,13 @@ include_directories(include)
|
||||
add_subdirectory(include)
|
||||
add_subdirectory(lib)
|
||||
|
||||
|
||||
if (LIBCXX_INCLUDE_BENCHMARKS)
|
||||
add_subdirectory(benchmarks)
|
||||
endif()
|
||||
if (LIBCXX_INCLUDE_TESTS)
|
||||
add_subdirectory(test)
|
||||
add_subdirectory(lib/abi)
|
||||
endif()
|
||||
if (LIBCXX_INCLUDE_DOCS)
|
||||
add_subdirectory(docs)
|
||||
|
28
NOTES.TXT
Normal file
28
NOTES.TXT
Normal file
@ -0,0 +1,28 @@
|
||||
//===---------------------------------------------------------------------===//
|
||||
// Notes relating to various libc++ tasks
|
||||
//===---------------------------------------------------------------------===//
|
||||
|
||||
This file contains notes about various libc++ tasks and processes.
|
||||
|
||||
//===---------------------------------------------------------------------===//
|
||||
// Post-Release TODO
|
||||
//===---------------------------------------------------------------------===//
|
||||
|
||||
These notes contain a list of things that must be done after branching for
|
||||
an LLVM release.
|
||||
|
||||
1. Update _LIBCPP_VERSION in `__config`
|
||||
2. Update the __libcpp_version file.
|
||||
3. Update the version number in `docs/conf.py`
|
||||
4. Create ABI lists for the previous release under `lib/abi`
|
||||
|
||||
//===---------------------------------------------------------------------===//
|
||||
// Adding a new header TODO
|
||||
//===---------------------------------------------------------------------===//
|
||||
|
||||
These notes contain a list of things that must be done upon adding a new header
|
||||
to libc++.
|
||||
|
||||
1. Add a test under `test/libcxx` that the header defines `_LIBCPP_VERSION`.
|
||||
2. Update `test/libcxx/double_include.sh.cpp` to include the new header.
|
||||
3. Create a submodule in `include/module.modulemap` for the new header.
|
30
TODO.TXT
30
TODO.TXT
@ -1,46 +1,19 @@
|
||||
This is meant to be a general place to list things that should be done "someday"
|
||||
|
||||
3.8 Release Goals
|
||||
=================
|
||||
* LFTS v1 (EricWF, MClow)
|
||||
* Filesystem TS (EricWF)
|
||||
* ASIO TS (MClow)
|
||||
* <regex> Improvements (MClow)
|
||||
* Setup ABI Versioning policy (EricWF)
|
||||
* Fix PR19302 - Fix UB in list and __tree.
|
||||
|
||||
|
||||
ABI Related Tasks
|
||||
=================
|
||||
* Explicitly manage and verify symbols exported from the dylib.
|
||||
* Explore using namespaces for managing symbol visibility.
|
||||
* Introduce and document ABI versioning/evolution policy.
|
||||
|
||||
CXX Runtime Library Tasks
|
||||
=========================
|
||||
* Cleanup #ifdef hell in sources files that supports the different ABI libraries.
|
||||
* Fix that CMake always link to /usr/lib/libc++abi.dylib on OS X.
|
||||
* Fix selection of ABI symbol list on OS X.
|
||||
* Have CMake generate linker scripts for libc++.so that it properly links the
|
||||
runtime library.
|
||||
* Look into mirroring libsupc++'s typeinfo vtable layout when libsupc++/libstdc++
|
||||
is used as the runtime library.
|
||||
* Audit libraries that CMake links into libc++. Are they all required?
|
||||
* Investigate and document interoperability between libc++ and libstdc++ on
|
||||
linux. Do this for every supported c++ runtime library.
|
||||
|
||||
Atomic Related Tasks
|
||||
====================
|
||||
* Enable mixing of clang and GCC atomics internally. Currently some
|
||||
parts of libc++ use atomics only when clang provides them.
|
||||
(see memory@5380 for an example)
|
||||
* Audit use of libatomic builtins in <atomic> with GCC.
|
||||
* future should use <atomic> for synchronization.
|
||||
|
||||
Test Suite Tasks
|
||||
================
|
||||
* Move all libc++ specific tests from test/std into test/libcxx.
|
||||
* Improve how LIT handles compiler warnings.
|
||||
* Improve the quality and portability of the locale test data.
|
||||
* Convert failure tests to use Clang Verify.
|
||||
|
||||
@ -50,7 +23,4 @@ Misc Tasks
|
||||
* run clang-tidy on libc++
|
||||
* Document the "conditionally-supported" bits of libc++
|
||||
* Look at basic_string's move assignment operator, re LWG 2063 and POCMA
|
||||
* libc++ is missing try_emplace
|
||||
* Put a static_assert in std::allocator to deny const/volatile types (LWG 2447)
|
||||
* Document support (or lack of) for C++11 libraries in C++03.
|
||||
* Document supported compilers.
|
||||
|
154
benchmarks/CMakeLists.txt
Normal file
154
benchmarks/CMakeLists.txt
Normal file
@ -0,0 +1,154 @@
|
||||
include(ExternalProject)
|
||||
include(CheckCXXCompilerFlag)
|
||||
|
||||
#==============================================================================
|
||||
# Build Google Benchmark for libc++
|
||||
#==============================================================================
|
||||
|
||||
set(BENCHMARK_LIBCXX_COMPILE_FLAGS
|
||||
-Wno-unused-command-line-argument
|
||||
-nostdinc++
|
||||
-isystem ${LIBCXX_SOURCE_DIR}/include
|
||||
-L${LIBCXX_LIBRARY_DIR}
|
||||
-Wl,-rpath,${LIBCXX_LIBRARY_DIR}
|
||||
)
|
||||
if (DEFINED LIBCXX_CXX_ABI_LIBRARY_PATH)
|
||||
list(APPEND BENCHMARK_LIBCXX_COMPILE_FLAGS
|
||||
-L${LIBCXX_CXX_ABI_LIBRARY_PATH}
|
||||
-Wl,-rpath,${LIBCXX_CXX_ABI_LIBRARY_PATH})
|
||||
endif()
|
||||
split_list(BENCHMARK_LIBCXX_COMPILE_FLAGS)
|
||||
|
||||
ExternalProject_Add(google-benchmark-libcxx
|
||||
EXCLUDE_FROM_ALL ON
|
||||
DEPENDS cxx
|
||||
PREFIX benchmark-libcxx
|
||||
SOURCE_DIR ${LIBCXX_SOURCE_DIR}/utils/google-benchmark
|
||||
INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/benchmark-libcxx
|
||||
CMAKE_CACHE_ARGS
|
||||
-DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER}
|
||||
-DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER}
|
||||
-DCMAKE_BUILD_TYPE:STRING=RELEASE
|
||||
-DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
|
||||
-DCMAKE_CXX_FLAGS:STRING=${BENCHMARK_LIBCXX_COMPILE_FLAGS}
|
||||
-DBENCHMARK_USE_LIBCXX:BOOL=ON
|
||||
-DBENCHMARK_ENABLE_TESTING:BOOL=OFF)
|
||||
|
||||
#==============================================================================
|
||||
# Build Google Benchmark for the native stdlib
|
||||
#==============================================================================
|
||||
set(BENCHMARK_NATIVE_TARGET_FLAGS)
|
||||
if (LIBCXX_BENCHMARK_NATIVE_GCC_TOOLCHAIN)
|
||||
set(BENCHMARK_NATIVE_TARGET_FLAGS
|
||||
-gcc-toolchain ${LIBCXX_BENCHMARK_NATIVE_GCC_TOOLCHAIN})
|
||||
endif()
|
||||
split_list(BENCHMARK_NATIVE_TARGET_FLAGS)
|
||||
|
||||
if (LIBCXX_BENCHMARK_NATIVE_STDLIB)
|
||||
ExternalProject_Add(google-benchmark-native
|
||||
EXCLUDE_FROM_ALL ON
|
||||
PREFIX benchmark-native
|
||||
SOURCE_DIR ${LIBCXX_SOURCE_DIR}/utils/google-benchmark
|
||||
INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/benchmark-native
|
||||
CMAKE_CACHE_ARGS
|
||||
-DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER}
|
||||
-DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER}
|
||||
-DCMAKE_CXX_FLAGS:STRING=${BENCHMARK_NATIVE_TARGET_FLAGS}
|
||||
-DCMAKE_BUILD_TYPE:STRING=RELEASE
|
||||
-DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
|
||||
-DBENCHMARK_ENABLE_TESTING:BOOL=OFF)
|
||||
endif()
|
||||
|
||||
#==============================================================================
|
||||
# Benchmark tests configuration
|
||||
#==============================================================================
|
||||
add_custom_target(cxx-benchmarks)
|
||||
|
||||
set(BENCHMARK_LIBCXX_INSTALL ${CMAKE_CURRENT_BINARY_DIR}/benchmark-libcxx)
|
||||
set(BENCHMARK_NATIVE_INSTALL ${CMAKE_CURRENT_BINARY_DIR}/benchmark-native)
|
||||
set(BENCHMARK_TEST_COMPILE_FLAGS
|
||||
-std=c++14 -O2
|
||||
-I${BENCHMARK_LIBCXX_INSTALL}/include
|
||||
-I${LIBCXX_SOURCE_DIR}/test/support
|
||||
)
|
||||
set(BENCHMARK_TEST_LIBCXX_COMPILE_FLAGS
|
||||
-nostdinc++
|
||||
-isystem ${LIBCXX_SOURCE_DIR}/include
|
||||
${BENCHMARK_TEST_COMPILE_FLAGS}
|
||||
-Wno-user-defined-literals
|
||||
)
|
||||
set(BENCHMARK_TEST_LIBCXX_LINK_FLAGS
|
||||
-nodefaultlibs
|
||||
-L${BENCHMARK_LIBCXX_INSTALL}/lib/
|
||||
)
|
||||
set(BENCHMARK_TEST_NATIVE_COMPILE_FLAGS
|
||||
${BENCHMARK_NATIVE_TARGET_FLAGS}
|
||||
${BENCHMARK_TEST_COMPILE_FLAGS}
|
||||
)
|
||||
set(BENCHMARK_TEST_NATIVE_LINK_FLAGS
|
||||
${BENCHMARK_NATIVE_TARGET_FLAGS}
|
||||
-L${BENCHMARK_NATIVE_INSTALL}/lib
|
||||
)
|
||||
split_list(BENCHMARK_TEST_COMPILE_FLAGS)
|
||||
split_list(BENCHMARK_TEST_LIBCXX_COMPILE_FLAGS)
|
||||
split_list(BENCHMARK_TEST_LIBCXX_LINK_FLAGS)
|
||||
split_list(BENCHMARK_TEST_NATIVE_COMPILE_FLAGS)
|
||||
split_list(BENCHMARK_TEST_NATIVE_LINK_FLAGS)
|
||||
macro(add_benchmark_test name source_file)
|
||||
set(libcxx_target ${name}_libcxx)
|
||||
add_executable(${libcxx_target} EXCLUDE_FROM_ALL ${source_file})
|
||||
add_dependencies(${libcxx_target} cxx google-benchmark-libcxx)
|
||||
add_dependencies(cxx-benchmarks ${libcxx_target})
|
||||
if (LIBCXX_ENABLE_SHARED)
|
||||
target_link_libraries(${libcxx_target} cxx_shared)
|
||||
else()
|
||||
target_link_libraries(${libcxx_target} cxx_static)
|
||||
endif()
|
||||
if (TARGET cxx_experimental)
|
||||
target_link_libraries(${libcxx_target} cxx_experimental)
|
||||
endif()
|
||||
target_link_libraries(${libcxx_target} -lbenchmark)
|
||||
set_target_properties(${libcxx_target}
|
||||
PROPERTIES
|
||||
OUTPUT_NAME "${name}.libcxx.out"
|
||||
COMPILE_FLAGS "${BENCHMARK_TEST_LIBCXX_COMPILE_FLAGS}"
|
||||
LINK_FLAGS "${BENCHMARK_TEST_LIBCXX_LINK_FLAGS}")
|
||||
if (LIBCXX_BENCHMARK_NATIVE_STDLIB)
|
||||
set(native_target ${name}_native)
|
||||
add_executable(${native_target} EXCLUDE_FROM_ALL ${source_file})
|
||||
add_dependencies(${native_target} google-benchmark-native
|
||||
google-benchmark-libcxx)
|
||||
target_link_libraries(${native_target} -lbenchmark)
|
||||
if (LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libstdc++")
|
||||
target_link_libraries(${native_target} -lstdc++fs)
|
||||
elseif (LIBCXX_BENCHMARK_NATIVE_STDLIB STREQUAL "libc++")
|
||||
target_link_libraries(${native_target} -lc++experimental)
|
||||
endif()
|
||||
if (LIBCXX_HAS_PTHREAD_LIB)
|
||||
target_link_libraries(${native_target} -pthread)
|
||||
endif()
|
||||
add_dependencies(cxx-benchmarks ${native_target})
|
||||
set_target_properties(${native_target}
|
||||
PROPERTIES
|
||||
OUTPUT_NAME "${name}.native.out"
|
||||
INCLUDE_DIRECTORIES ""
|
||||
COMPILE_FLAGS "${BENCHMARK_TEST_NATIVE_COMPILE_FLAGS}"
|
||||
LINK_FLAGS "${BENCHMARK_TEST_NATIVE_LINK_FLAGS}")
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
|
||||
#==============================================================================
|
||||
# Register Benchmark tests
|
||||
#==============================================================================
|
||||
file(GLOB BENCHMARK_TESTS "*.bench.cpp")
|
||||
foreach(test_path ${BENCHMARK_TESTS})
|
||||
get_filename_component(test_file "${test_path}" NAME)
|
||||
string(REPLACE ".bench.cpp" "" test_name "${test_file}")
|
||||
if (NOT DEFINED ${test_name}_REPORTED)
|
||||
message(STATUS "Adding Benchmark: ${test_file}")
|
||||
# Only report the adding of the benchmark once.
|
||||
set(${test_name}_REPORTED ON CACHE INTERNAL "")
|
||||
endif()
|
||||
add_benchmark_test(${test_name} ${test_file})
|
||||
endforeach()
|
113
benchmarks/ContainerBenchmarks.hpp
Normal file
113
benchmarks/ContainerBenchmarks.hpp
Normal file
@ -0,0 +1,113 @@
|
||||
#ifndef BENCHMARK_CONTAINER_BENCHMARKS_HPP
|
||||
#define BENCHMARK_CONTAINER_BENCHMARKS_HPP
|
||||
|
||||
#include <cassert>
|
||||
|
||||
#include "benchmark/benchmark_api.h"
|
||||
|
||||
namespace ContainerBenchmarks {
|
||||
|
||||
|
||||
template <class Container, class GenInputs>
|
||||
void BM_ConstructIterIter(benchmark::State& st, Container, GenInputs gen) {
|
||||
auto in = gen(st.range(0));
|
||||
const auto begin = in.begin();
|
||||
const auto end = in.end();
|
||||
benchmark::DoNotOptimize(&in);
|
||||
while (st.KeepRunning()) {
|
||||
Container c(begin, end);
|
||||
benchmark::DoNotOptimize(c.data());
|
||||
}
|
||||
}
|
||||
|
||||
template <class Container, class GenInputs>
|
||||
void BM_InsertValue(benchmark::State& st, Container c, GenInputs gen) {
|
||||
auto in = gen(st.range(0));
|
||||
const auto end = in.end();
|
||||
while (st.KeepRunning()) {
|
||||
c.clear();
|
||||
for (auto it = in.begin(); it != end; ++it) {
|
||||
benchmark::DoNotOptimize(&(*c.insert(*it).first));
|
||||
}
|
||||
benchmark::ClobberMemory();
|
||||
}
|
||||
}
|
||||
|
||||
template <class Container, class GenInputs>
|
||||
void BM_InsertValueRehash(benchmark::State& st, Container c, GenInputs gen) {
|
||||
auto in = gen(st.range(0));
|
||||
const auto end = in.end();
|
||||
while (st.KeepRunning()) {
|
||||
c.clear();
|
||||
c.rehash(16);
|
||||
for (auto it = in.begin(); it != end; ++it) {
|
||||
benchmark::DoNotOptimize(&(*c.insert(*it).first));
|
||||
}
|
||||
benchmark::ClobberMemory();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
template <class Container, class GenInputs>
|
||||
void BM_InsertDuplicate(benchmark::State& st, Container c, GenInputs gen) {
|
||||
auto in = gen(st.range(0));
|
||||
const auto end = in.end();
|
||||
c.insert(in.begin(), in.end());
|
||||
benchmark::DoNotOptimize(&c);
|
||||
benchmark::DoNotOptimize(&in);
|
||||
while (st.KeepRunning()) {
|
||||
for (auto it = in.begin(); it != end; ++it) {
|
||||
benchmark::DoNotOptimize(&(*c.insert(*it).first));
|
||||
}
|
||||
benchmark::ClobberMemory();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
template <class Container, class GenInputs>
|
||||
void BM_EmplaceDuplicate(benchmark::State& st, Container c, GenInputs gen) {
|
||||
auto in = gen(st.range(0));
|
||||
const auto end = in.end();
|
||||
c.insert(in.begin(), in.end());
|
||||
benchmark::DoNotOptimize(&c);
|
||||
benchmark::DoNotOptimize(&in);
|
||||
while (st.KeepRunning()) {
|
||||
for (auto it = in.begin(); it != end; ++it) {
|
||||
benchmark::DoNotOptimize(&(*c.emplace(*it).first));
|
||||
}
|
||||
benchmark::ClobberMemory();
|
||||
}
|
||||
}
|
||||
|
||||
template <class Container, class GenInputs>
|
||||
static void BM_Find(benchmark::State& st, Container c, GenInputs gen) {
|
||||
auto in = gen(st.range(0));
|
||||
c.insert(in.begin(), in.end());
|
||||
benchmark::DoNotOptimize(&(*c.begin()));
|
||||
const auto end = in.data() + in.size();
|
||||
while (st.KeepRunning()) {
|
||||
for (auto it = in.data(); it != end; ++it) {
|
||||
benchmark::DoNotOptimize(&(*c.find(*it)));
|
||||
}
|
||||
benchmark::ClobberMemory();
|
||||
}
|
||||
}
|
||||
|
||||
template <class Container, class GenInputs>
|
||||
static void BM_FindRehash(benchmark::State& st, Container c, GenInputs gen) {
|
||||
c.rehash(8);
|
||||
auto in = gen(st.range(0));
|
||||
c.insert(in.begin(), in.end());
|
||||
benchmark::DoNotOptimize(&(*c.begin()));
|
||||
const auto end = in.data() + in.size();
|
||||
while (st.KeepRunning()) {
|
||||
for (auto it = in.data(); it != end; ++it) {
|
||||
benchmark::DoNotOptimize(&(*c.find(*it)));
|
||||
}
|
||||
benchmark::ClobberMemory();
|
||||
}
|
||||
}
|
||||
|
||||
} // end namespace ContainerBenchmarks
|
||||
|
||||
#endif // BENCHMARK_CONTAINER_BENCHMARKS_HPP
|
142
benchmarks/GenerateInput.hpp
Normal file
142
benchmarks/GenerateInput.hpp
Normal file
@ -0,0 +1,142 @@
|
||||
#ifndef BENCHMARK_GENERATE_INPUT_HPP
|
||||
#define BENCHMARK_GENERATE_INPUT_HPP
|
||||
|
||||
#include <algorithm>
|
||||
#include <random>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <climits>
|
||||
#include <cstddef>
|
||||
|
||||
static const char Letters[] = {
|
||||
'0','1','2','3','4',
|
||||
'5','6','7','8','9',
|
||||
'A','B','C','D','E','F',
|
||||
'G','H','I','J','K',
|
||||
'L','M','N','O','P',
|
||||
'Q','R','S','T','U',
|
||||
'V','W','X','Y','Z',
|
||||
'a','b','c','d','e','f',
|
||||
'g','h','i','j','k',
|
||||
'l','m','n','o','p',
|
||||
'q','r','s','t','u',
|
||||
'v','w','x','y','z'
|
||||
};
|
||||
static const std::size_t LettersSize = sizeof(Letters);
|
||||
|
||||
inline std::default_random_engine& getRandomEngine() {
|
||||
static std::default_random_engine RandEngine(std::random_device{}());
|
||||
return RandEngine;
|
||||
}
|
||||
|
||||
inline char getRandomChar() {
|
||||
std::uniform_int_distribution<> LettersDist(0, LettersSize-1);
|
||||
return Letters[LettersDist(getRandomEngine())];
|
||||
}
|
||||
|
||||
template <class IntT>
|
||||
inline IntT getRandomInteger() {
|
||||
std::uniform_int_distribution<IntT> dist;
|
||||
return dist(getRandomEngine());
|
||||
}
|
||||
|
||||
inline std::string getRandomString(std::size_t Len) {
|
||||
std::string str(Len, 0);
|
||||
std::generate_n(str.begin(), Len, &getRandomChar);
|
||||
return str;
|
||||
}
|
||||
|
||||
template <class IntT>
|
||||
inline std::vector<IntT> getDuplicateIntegerInputs(size_t N) {
|
||||
std::vector<IntT> inputs(N, static_cast<IntT>(-1));
|
||||
return inputs;
|
||||
}
|
||||
|
||||
template <class IntT>
|
||||
inline std::vector<IntT> getSortedIntegerInputs(size_t N) {
|
||||
std::vector<IntT> inputs;
|
||||
for (size_t i=0; i < N; i += 1)
|
||||
inputs.push_back(i);
|
||||
return inputs;
|
||||
}
|
||||
|
||||
template <class IntT>
|
||||
std::vector<IntT> getSortedLargeIntegerInputs(size_t N) {
|
||||
std::vector<IntT> inputs;
|
||||
for (size_t i=0; i < N; ++i) {
|
||||
inputs.push_back(i + N);
|
||||
}
|
||||
return inputs;
|
||||
}
|
||||
|
||||
template <class IntT>
|
||||
std::vector<IntT> getSortedTopBitsIntegerInputs(size_t N) {
|
||||
std::vector<IntT> inputs = getSortedIntegerInputs<IntT>(N);
|
||||
for (auto& E : inputs) E <<= ((sizeof(IntT) / 2) * CHAR_BIT);
|
||||
return inputs;
|
||||
}
|
||||
|
||||
template <class IntT>
|
||||
inline std::vector<IntT> getReverseSortedIntegerInputs(size_t N) {
|
||||
std::vector<IntT> inputs;
|
||||
std::size_t i = N;
|
||||
while (i > 0) {
|
||||
--i;
|
||||
inputs.push_back(i);
|
||||
}
|
||||
return inputs;
|
||||
}
|
||||
|
||||
template <class IntT>
|
||||
std::vector<IntT> getPipeOrganIntegerInputs(size_t N) {
|
||||
std::vector<IntT> v; v.reserve(N);
|
||||
for (size_t i = 0; i < N/2; ++i) v.push_back(i);
|
||||
for (size_t i = N/2; i < N; ++i) v.push_back(N - i);
|
||||
return v;
|
||||
}
|
||||
|
||||
|
||||
template <class IntT>
|
||||
std::vector<IntT> getRandomIntegerInputs(size_t N) {
|
||||
std::vector<IntT> inputs;
|
||||
for (size_t i=0; i < N; ++i) {
|
||||
inputs.push_back(getRandomInteger<IntT>());
|
||||
}
|
||||
return inputs;
|
||||
}
|
||||
|
||||
inline std::vector<std::string> getDuplicateStringInputs(size_t N) {
|
||||
std::vector<std::string> inputs(N, getRandomString(1024));
|
||||
return inputs;
|
||||
}
|
||||
|
||||
inline std::vector<std::string> getRandomStringInputs(size_t N) {
|
||||
std::vector<std::string> inputs;
|
||||
for (size_t i=0; i < N; ++i) {
|
||||
inputs.push_back(getRandomString(1024));
|
||||
}
|
||||
return inputs;
|
||||
}
|
||||
|
||||
inline std::vector<std::string> getSortedStringInputs(size_t N) {
|
||||
std::vector<std::string> inputs = getRandomStringInputs(N);
|
||||
std::sort(inputs.begin(), inputs.end());
|
||||
return inputs;
|
||||
}
|
||||
|
||||
inline std::vector<std::string> getReverseSortedStringInputs(size_t N) {
|
||||
std::vector<std::string> inputs = getSortedStringInputs(N);
|
||||
std::reverse(inputs.begin(), inputs.end());
|
||||
return inputs;
|
||||
}
|
||||
|
||||
inline std::vector<const char*> getRandomCStringInputs(size_t N) {
|
||||
static std::vector<std::string> inputs = getRandomStringInputs(N);
|
||||
std::vector<const char*> cinputs;
|
||||
for (auto const& str : inputs)
|
||||
cinputs.push_back(str.c_str());
|
||||
return cinputs;
|
||||
}
|
||||
|
||||
|
||||
#endif // BENCHMARK_GENERATE_INPUT_HPP
|
62
benchmarks/algorithms.bench.cpp
Normal file
62
benchmarks/algorithms.bench.cpp
Normal file
@ -0,0 +1,62 @@
|
||||
#include <unordered_set>
|
||||
#include <vector>
|
||||
#include <cstdint>
|
||||
|
||||
#include "benchmark/benchmark_api.h"
|
||||
#include "GenerateInput.hpp"
|
||||
|
||||
constexpr std::size_t TestNumInputs = 1024;
|
||||
|
||||
template <class GenInputs>
|
||||
void BM_Sort(benchmark::State& st, GenInputs gen) {
|
||||
using ValueType = typename decltype(gen(0))::value_type;
|
||||
const auto in = gen(st.range(0));
|
||||
std::vector<ValueType> inputs[5];
|
||||
auto reset_inputs = [&]() {
|
||||
for (auto& C : inputs) {
|
||||
C = in;
|
||||
benchmark::DoNotOptimize(C.data());
|
||||
}
|
||||
};
|
||||
reset_inputs();
|
||||
while (st.KeepRunning()) {
|
||||
for (auto& I : inputs) {
|
||||
std::sort(I.data(), I.data() + I.size());
|
||||
benchmark::DoNotOptimize(I.data());
|
||||
}
|
||||
st.PauseTiming();
|
||||
reset_inputs();
|
||||
benchmark::ClobberMemory();
|
||||
st.ResumeTiming();
|
||||
}
|
||||
}
|
||||
|
||||
BENCHMARK_CAPTURE(BM_Sort, random_uint32,
|
||||
getRandomIntegerInputs<uint32_t>)->Arg(TestNumInputs);
|
||||
|
||||
BENCHMARK_CAPTURE(BM_Sort, sorted_ascending_uint32,
|
||||
getSortedIntegerInputs<uint32_t>)->Arg(TestNumInputs);
|
||||
|
||||
BENCHMARK_CAPTURE(BM_Sort, sorted_descending_uint32,
|
||||
getReverseSortedIntegerInputs<uint32_t>)->Arg(TestNumInputs);
|
||||
|
||||
BENCHMARK_CAPTURE(BM_Sort, single_element_uint32,
|
||||
getDuplicateIntegerInputs<uint32_t>)->Arg(TestNumInputs);
|
||||
|
||||
BENCHMARK_CAPTURE(BM_Sort, pipe_organ_uint32,
|
||||
getPipeOrganIntegerInputs<uint32_t>)->Arg(TestNumInputs);
|
||||
|
||||
BENCHMARK_CAPTURE(BM_Sort, random_strings,
|
||||
getRandomStringInputs)->Arg(TestNumInputs);
|
||||
|
||||
BENCHMARK_CAPTURE(BM_Sort, sorted_ascending_strings,
|
||||
getSortedStringInputs)->Arg(TestNumInputs);
|
||||
|
||||
BENCHMARK_CAPTURE(BM_Sort, sorted_descending_strings,
|
||||
getReverseSortedStringInputs)->Arg(TestNumInputs);
|
||||
|
||||
BENCHMARK_CAPTURE(BM_Sort, single_element_strings,
|
||||
getDuplicateStringInputs)->Arg(TestNumInputs);
|
||||
|
||||
|
||||
BENCHMARK_MAIN()
|
138
benchmarks/filesystem.bench.cpp
Normal file
138
benchmarks/filesystem.bench.cpp
Normal file
@ -0,0 +1,138 @@
|
||||
#include <experimental/filesystem>
|
||||
|
||||
#include "benchmark/benchmark_api.h"
|
||||
#include "GenerateInput.hpp"
|
||||
#include "test_iterators.h"
|
||||
|
||||
namespace fs = std::experimental::filesystem;
|
||||
|
||||
static const size_t TestNumInputs = 1024;
|
||||
|
||||
|
||||
template <class GenInputs>
|
||||
void BM_PathConstructString(benchmark::State &st, GenInputs gen) {
|
||||
using namespace fs;
|
||||
const auto in = gen(st.range(0));
|
||||
path PP;
|
||||
for (auto& Part : in)
|
||||
PP /= Part;
|
||||
benchmark::DoNotOptimize(PP.native().data());
|
||||
while (st.KeepRunning()) {
|
||||
const path P(PP.native());
|
||||
benchmark::DoNotOptimize(P.native().data());
|
||||
}
|
||||
}
|
||||
BENCHMARK_CAPTURE(BM_PathConstructString, large_string,
|
||||
getRandomStringInputs)->Arg(TestNumInputs);
|
||||
|
||||
|
||||
template <class GenInputs>
|
||||
void BM_PathConstructCStr(benchmark::State &st, GenInputs gen) {
|
||||
using namespace fs;
|
||||
const auto in = gen(st.range(0));
|
||||
path PP;
|
||||
for (auto& Part : in)
|
||||
PP /= Part;
|
||||
benchmark::DoNotOptimize(PP.native().data());
|
||||
while (st.KeepRunning()) {
|
||||
const path P(PP.native().c_str());
|
||||
benchmark::DoNotOptimize(P.native().data());
|
||||
}
|
||||
}
|
||||
BENCHMARK_CAPTURE(BM_PathConstructCStr, large_string,
|
||||
getRandomStringInputs)->Arg(TestNumInputs);
|
||||
|
||||
|
||||
template <template <class...> class ItType, class GenInputs>
|
||||
void BM_PathConstructIter(benchmark::State &st, GenInputs gen) {
|
||||
using namespace fs;
|
||||
using Iter = ItType<std::string::const_iterator>;
|
||||
const auto in = gen(st.range(0));
|
||||
path PP;
|
||||
for (auto& Part : in)
|
||||
PP /= Part;
|
||||
auto Start = Iter(PP.native().begin());
|
||||
auto End = Iter(PP.native().end());
|
||||
benchmark::DoNotOptimize(PP.native().data());
|
||||
benchmark::DoNotOptimize(Start);
|
||||
benchmark::DoNotOptimize(End);
|
||||
while (st.KeepRunning()) {
|
||||
const path P(Start, End);
|
||||
benchmark::DoNotOptimize(P.native().data());
|
||||
}
|
||||
}
|
||||
template <class GenInputs>
|
||||
void BM_PathConstructInputIter(benchmark::State &st, GenInputs gen) {
|
||||
BM_PathConstructIter<input_iterator>(st, gen);
|
||||
}
|
||||
template <class GenInputs>
|
||||
void BM_PathConstructForwardIter(benchmark::State &st, GenInputs gen) {
|
||||
BM_PathConstructIter<forward_iterator>(st, gen);
|
||||
}
|
||||
BENCHMARK_CAPTURE(BM_PathConstructInputIter, large_string,
|
||||
getRandomStringInputs)->Arg(TestNumInputs);
|
||||
BENCHMARK_CAPTURE(BM_PathConstructForwardIter, large_string,
|
||||
getRandomStringInputs)->Arg(TestNumInputs);
|
||||
|
||||
|
||||
template <class GenInputs>
|
||||
void BM_PathIterateMultipleTimes(benchmark::State &st, GenInputs gen) {
|
||||
using namespace fs;
|
||||
const auto in = gen(st.range(0));
|
||||
path PP;
|
||||
for (auto& Part : in)
|
||||
PP /= Part;
|
||||
benchmark::DoNotOptimize(PP.native().data());
|
||||
while (st.KeepRunning()) {
|
||||
for (auto &E : PP) {
|
||||
benchmark::DoNotOptimize(E.native().data());
|
||||
}
|
||||
benchmark::ClobberMemory();
|
||||
}
|
||||
}
|
||||
BENCHMARK_CAPTURE(BM_PathIterateMultipleTimes, iterate_elements,
|
||||
getRandomStringInputs)->Arg(TestNumInputs);
|
||||
|
||||
|
||||
template <class GenInputs>
|
||||
void BM_PathIterateOnce(benchmark::State &st, GenInputs gen) {
|
||||
using namespace fs;
|
||||
const auto in = gen(st.range(0));
|
||||
path PP;
|
||||
for (auto& Part : in)
|
||||
PP /= Part;
|
||||
benchmark::DoNotOptimize(PP.native().data());
|
||||
while (st.KeepRunning()) {
|
||||
const path P = PP.native();
|
||||
for (auto &E : P) {
|
||||
benchmark::DoNotOptimize(E.native().data());
|
||||
}
|
||||
benchmark::ClobberMemory();
|
||||
}
|
||||
}
|
||||
BENCHMARK_CAPTURE(BM_PathIterateOnce, iterate_elements,
|
||||
getRandomStringInputs)->Arg(TestNumInputs);
|
||||
|
||||
template <class GenInputs>
|
||||
void BM_PathIterateOnceBackwards(benchmark::State &st, GenInputs gen) {
|
||||
using namespace fs;
|
||||
const auto in = gen(st.range(0));
|
||||
path PP;
|
||||
for (auto& Part : in)
|
||||
PP /= Part;
|
||||
benchmark::DoNotOptimize(PP.native().data());
|
||||
while (st.KeepRunning()) {
|
||||
const path P = PP.native();
|
||||
const auto B = P.begin();
|
||||
auto I = P.end();
|
||||
while (I != B) {
|
||||
--I;
|
||||
benchmark::DoNotOptimize(*I);
|
||||
}
|
||||
benchmark::DoNotOptimize(*I);
|
||||
}
|
||||
}
|
||||
BENCHMARK_CAPTURE(BM_PathIterateOnceBackwards, iterate_elements,
|
||||
getRandomStringInputs)->Arg(TestNumInputs);
|
||||
|
||||
BENCHMARK_MAIN()
|
49
benchmarks/string.bench.cpp
Normal file
49
benchmarks/string.bench.cpp
Normal file
@ -0,0 +1,49 @@
|
||||
#include <unordered_set>
|
||||
#include <vector>
|
||||
#include <cstdint>
|
||||
|
||||
#include "benchmark/benchmark_api.h"
|
||||
#include "GenerateInput.hpp"
|
||||
|
||||
constexpr std::size_t MAX_STRING_LEN = 8 << 14;
|
||||
|
||||
// Benchmark when there is no match.
|
||||
static void BM_StringFindNoMatch(benchmark::State &state) {
|
||||
std::string s1(state.range(0), '-');
|
||||
std::string s2(8, '*');
|
||||
while (state.KeepRunning())
|
||||
benchmark::DoNotOptimize(s1.find(s2));
|
||||
}
|
||||
BENCHMARK(BM_StringFindNoMatch)->Range(10, MAX_STRING_LEN);
|
||||
|
||||
// Benchmark when the string matches first time.
|
||||
static void BM_StringFindAllMatch(benchmark::State &state) {
|
||||
std::string s1(MAX_STRING_LEN, '-');
|
||||
std::string s2(state.range(0), '-');
|
||||
while (state.KeepRunning())
|
||||
benchmark::DoNotOptimize(s1.find(s2));
|
||||
}
|
||||
BENCHMARK(BM_StringFindAllMatch)->Range(1, MAX_STRING_LEN);
|
||||
|
||||
// Benchmark when the string matches somewhere in the end.
|
||||
static void BM_StringFindMatch1(benchmark::State &state) {
|
||||
std::string s1(MAX_STRING_LEN / 2, '*');
|
||||
s1 += std::string(state.range(0), '-');
|
||||
std::string s2(state.range(0), '-');
|
||||
while (state.KeepRunning())
|
||||
benchmark::DoNotOptimize(s1.find(s2));
|
||||
}
|
||||
BENCHMARK(BM_StringFindMatch1)->Range(1, MAX_STRING_LEN / 4);
|
||||
|
||||
// Benchmark when the string matches somewhere from middle to the end.
|
||||
static void BM_StringFindMatch2(benchmark::State &state) {
|
||||
std::string s1(MAX_STRING_LEN / 2, '*');
|
||||
s1 += std::string(state.range(0), '-');
|
||||
s1 += std::string(state.range(0), '*');
|
||||
std::string s2(state.range(0), '-');
|
||||
while (state.KeepRunning())
|
||||
benchmark::DoNotOptimize(s1.find(s2));
|
||||
}
|
||||
BENCHMARK(BM_StringFindMatch2)->Range(1, MAX_STRING_LEN / 4);
|
||||
|
||||
BENCHMARK_MAIN()
|
@ -1,44 +1,306 @@
|
||||
#include <unordered_set>
|
||||
#include <vector>
|
||||
#include <functional>
|
||||
#include <cstdint>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
|
||||
#include "benchmark/benchmark_api.h"
|
||||
|
||||
template <class IntT>
|
||||
std::vector<IntT> getInputs(size_t N) {
|
||||
std::vector<IntT> inputs;
|
||||
for (size_t i=0; i < N; ++i) {
|
||||
inputs.push_back(i);
|
||||
}
|
||||
return inputs;
|
||||
#include "ContainerBenchmarks.hpp"
|
||||
#include "GenerateInput.hpp"
|
||||
|
||||
using namespace ContainerBenchmarks;
|
||||
|
||||
constexpr std::size_t TestNumInputs = 1024;
|
||||
|
||||
template <class _Size>
|
||||
inline __attribute__((__always_inline__))
|
||||
_Size loadword(const void* __p) {
|
||||
_Size __r;
|
||||
std::memcpy(&__r, __p, sizeof(__r));
|
||||
return __r;
|
||||
}
|
||||
|
||||
template <class Container, class Inputs>
|
||||
void BM_SetInsert(benchmark::State& st, Container c, Inputs const& in) {
|
||||
const auto end = in.end();
|
||||
inline __attribute__((__always_inline__))
|
||||
std::size_t rotate_by_at_least_1(std::size_t __val, int __shift) {
|
||||
return (__val >> __shift) | (__val << (64 - __shift));
|
||||
}
|
||||
|
||||
inline __attribute__((__always_inline__))
|
||||
std::size_t hash_len_16(std::size_t __u, std::size_t __v) {
|
||||
const std::size_t __mul = 0x9ddfea08eb382d69ULL;
|
||||
std::size_t __a = (__u ^ __v) * __mul;
|
||||
__a ^= (__a >> 47);
|
||||
std::size_t __b = (__v ^ __a) * __mul;
|
||||
__b ^= (__b >> 47);
|
||||
__b *= __mul;
|
||||
return __b;
|
||||
}
|
||||
|
||||
|
||||
template <std::size_t _Len>
|
||||
inline __attribute__((__always_inline__))
|
||||
std::size_t hash_len_0_to_8(const char* __s) {
|
||||
static_assert(_Len == 4 || _Len == 8, "");
|
||||
const uint64_t __a = loadword<uint32_t>(__s);
|
||||
const uint64_t __b = loadword<uint32_t>(__s + _Len - 4);
|
||||
return hash_len_16(_Len + (__a << 3), __b);
|
||||
}
|
||||
|
||||
struct UInt32Hash {
|
||||
UInt32Hash() = default;
|
||||
inline __attribute__((__always_inline__))
|
||||
std::size_t operator()(uint32_t data) const {
|
||||
return hash_len_0_to_8<4>(reinterpret_cast<const char*>(&data));
|
||||
}
|
||||
};
|
||||
|
||||
struct UInt64Hash {
|
||||
UInt64Hash() = default;
|
||||
inline __attribute__((__always_inline__))
|
||||
std::size_t operator()(uint64_t data) const {
|
||||
return hash_len_0_to_8<8>(reinterpret_cast<const char*>(&data));
|
||||
}
|
||||
};
|
||||
|
||||
struct UInt128Hash {
|
||||
UInt128Hash() = default;
|
||||
inline __attribute__((__always_inline__))
|
||||
std::size_t operator()(__uint128_t data) const {
|
||||
const __uint128_t __mask = static_cast<std::size_t>(-1);
|
||||
const std::size_t __a = (std::size_t)(data & __mask);
|
||||
const std::size_t __b = (std::size_t)((data & (__mask << 64)) >> 64);
|
||||
return hash_len_16(__a, rotate_by_at_least_1(__b + 16, 16)) ^ __b;
|
||||
}
|
||||
};
|
||||
|
||||
struct UInt32Hash2 {
|
||||
UInt32Hash2() = default;
|
||||
inline __attribute__((__always_inline__))
|
||||
std::size_t operator()(uint32_t data) const {
|
||||
const uint32_t __m = 0x5bd1e995;
|
||||
const uint32_t __r = 24;
|
||||
uint32_t __h = 4;
|
||||
uint32_t __k = data;
|
||||
__k *= __m;
|
||||
__k ^= __k >> __r;
|
||||
__k *= __m;
|
||||
__h *= __m;
|
||||
__h ^= __k;
|
||||
__h ^= __h >> 13;
|
||||
__h *= __m;
|
||||
__h ^= __h >> 15;
|
||||
return __h;
|
||||
}
|
||||
};
|
||||
|
||||
struct UInt64Hash2 {
|
||||
UInt64Hash2() = default;
|
||||
inline __attribute__((__always_inline__))
|
||||
std::size_t operator()(uint64_t data) const {
|
||||
return hash_len_0_to_8<8>(reinterpret_cast<const char*>(&data));
|
||||
}
|
||||
};
|
||||
|
||||
//----------------------------------------------------------------------------//
|
||||
// BM_Hash
|
||||
// ---------------------------------------------------------------------------//
|
||||
|
||||
template <class HashFn, class GenInputs>
|
||||
void BM_Hash(benchmark::State& st, HashFn fn, GenInputs gen) {
|
||||
auto in = gen(st.range(0));
|
||||
const auto end = in.data() + in.size();
|
||||
std::size_t last_hash = 0;
|
||||
benchmark::DoNotOptimize(&last_hash);
|
||||
while (st.KeepRunning()) {
|
||||
c.clear();
|
||||
for (auto it = in.begin(); it != end; ++it) {
|
||||
benchmark::DoNotOptimize(c.insert(*it));
|
||||
for (auto it = in.data(); it != end; ++it) {
|
||||
benchmark::DoNotOptimize(last_hash += fn(*it));
|
||||
}
|
||||
benchmark::DoNotOptimize(c);
|
||||
benchmark::ClobberMemory();
|
||||
}
|
||||
}
|
||||
BENCHMARK_CAPTURE(BM_SetInsert, uint32_insert,
|
||||
std::unordered_set<uint32_t>{}, getInputs<uint32_t>(1024));
|
||||
|
||||
template <class Container, class Inputs>
|
||||
void BM_SetFind(benchmark::State& st, Container c, Inputs const& in) {
|
||||
c.insert(in.begin(), in.end());
|
||||
const auto end = in.end();
|
||||
while (st.KeepRunning()) {
|
||||
for (auto it = in.begin(); it != end; ++it) {
|
||||
benchmark::DoNotOptimize(c.find(*it));
|
||||
}
|
||||
}
|
||||
}
|
||||
BENCHMARK_CAPTURE(BM_SetFind, uint32_lookup,
|
||||
std::unordered_set<uint32_t>{}, getInputs<uint32_t>(1024));
|
||||
BENCHMARK_CAPTURE(BM_Hash,
|
||||
uint32_random_std_hash,
|
||||
std::hash<uint32_t>{},
|
||||
getRandomIntegerInputs<uint32_t>) -> Arg(TestNumInputs);
|
||||
|
||||
BENCHMARK_CAPTURE(BM_Hash,
|
||||
uint32_random_custom_hash,
|
||||
UInt32Hash{},
|
||||
getRandomIntegerInputs<uint32_t>) -> Arg(TestNumInputs);
|
||||
|
||||
BENCHMARK_CAPTURE(BM_Hash,
|
||||
uint32_top_std_hash,
|
||||
std::hash<uint32_t>{},
|
||||
getSortedTopBitsIntegerInputs<uint32_t>) -> Arg(TestNumInputs);
|
||||
|
||||
BENCHMARK_CAPTURE(BM_Hash,
|
||||
uint32_top_custom_hash,
|
||||
UInt32Hash{},
|
||||
getSortedTopBitsIntegerInputs<uint32_t>) -> Arg(TestNumInputs);
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------//
|
||||
// BM_InsertValue
|
||||
// ---------------------------------------------------------------------------//
|
||||
|
||||
|
||||
// Sorted Assending //
|
||||
BENCHMARK_CAPTURE(BM_InsertValue,
|
||||
unordered_set_uint32,
|
||||
std::unordered_set<uint32_t>{},
|
||||
getRandomIntegerInputs<uint32_t>)->Arg(TestNumInputs);
|
||||
|
||||
BENCHMARK_CAPTURE(BM_InsertValue,
|
||||
unordered_set_uint32_sorted,
|
||||
std::unordered_set<uint32_t>{},
|
||||
getSortedIntegerInputs<uint32_t>)->Arg(TestNumInputs);
|
||||
|
||||
// Top Bytes //
|
||||
BENCHMARK_CAPTURE(BM_InsertValue,
|
||||
unordered_set_top_bits_uint32,
|
||||
std::unordered_set<uint32_t>{},
|
||||
getSortedTopBitsIntegerInputs<uint32_t>)->Arg(TestNumInputs);
|
||||
|
||||
BENCHMARK_CAPTURE(BM_InsertValueRehash,
|
||||
unordered_set_top_bits_uint32,
|
||||
std::unordered_set<uint32_t, UInt32Hash>{},
|
||||
getSortedTopBitsIntegerInputs<uint32_t>)->Arg(TestNumInputs);
|
||||
|
||||
// String //
|
||||
BENCHMARK_CAPTURE(BM_InsertValue,
|
||||
unordered_set_string,
|
||||
std::unordered_set<std::string>{},
|
||||
getRandomStringInputs)->Arg(TestNumInputs);
|
||||
|
||||
BENCHMARK_CAPTURE(BM_InsertValueRehash,
|
||||
unordered_set_string,
|
||||
std::unordered_set<std::string>{},
|
||||
getRandomStringInputs)->Arg(TestNumInputs);
|
||||
|
||||
//----------------------------------------------------------------------------//
|
||||
// BM_Find
|
||||
// ---------------------------------------------------------------------------//
|
||||
|
||||
// Random //
|
||||
BENCHMARK_CAPTURE(BM_Find,
|
||||
unordered_set_random_uint64,
|
||||
std::unordered_set<uint64_t>{},
|
||||
getRandomIntegerInputs<uint64_t>)->Arg(TestNumInputs);
|
||||
|
||||
BENCHMARK_CAPTURE(BM_FindRehash,
|
||||
unordered_set_random_uint64,
|
||||
std::unordered_set<uint64_t, UInt64Hash>{},
|
||||
getRandomIntegerInputs<uint64_t>)->Arg(TestNumInputs);
|
||||
|
||||
// Sorted //
|
||||
BENCHMARK_CAPTURE(BM_Find,
|
||||
unordered_set_sorted_uint64,
|
||||
std::unordered_set<uint64_t>{},
|
||||
getSortedIntegerInputs<uint64_t>)->Arg(TestNumInputs);
|
||||
|
||||
BENCHMARK_CAPTURE(BM_FindRehash,
|
||||
unordered_set_sorted_uint64,
|
||||
std::unordered_set<uint64_t, UInt64Hash>{},
|
||||
getSortedIntegerInputs<uint64_t>)->Arg(TestNumInputs);
|
||||
|
||||
|
||||
// Sorted //
|
||||
#if 1
|
||||
BENCHMARK_CAPTURE(BM_Find,
|
||||
unordered_set_sorted_uint128,
|
||||
std::unordered_set<__uint128_t, UInt128Hash>{},
|
||||
getSortedTopBitsIntegerInputs<__uint128_t>)->Arg(TestNumInputs);
|
||||
|
||||
BENCHMARK_CAPTURE(BM_FindRehash,
|
||||
unordered_set_sorted_uint128,
|
||||
std::unordered_set<__uint128_t, UInt128Hash>{},
|
||||
getSortedTopBitsIntegerInputs<__uint128_t>)->Arg(TestNumInputs);
|
||||
#endif
|
||||
|
||||
// Sorted //
|
||||
BENCHMARK_CAPTURE(BM_Find,
|
||||
unordered_set_sorted_uint32,
|
||||
std::unordered_set<uint32_t>{},
|
||||
getSortedIntegerInputs<uint32_t>)->Arg(TestNumInputs);
|
||||
|
||||
BENCHMARK_CAPTURE(BM_FindRehash,
|
||||
unordered_set_sorted_uint32,
|
||||
std::unordered_set<uint32_t, UInt32Hash2>{},
|
||||
getSortedIntegerInputs<uint32_t>)->Arg(TestNumInputs);
|
||||
|
||||
// Sorted Ascending //
|
||||
BENCHMARK_CAPTURE(BM_Find,
|
||||
unordered_set_sorted_large_uint64,
|
||||
std::unordered_set<uint64_t>{},
|
||||
getSortedLargeIntegerInputs<uint64_t>)->Arg(TestNumInputs);
|
||||
|
||||
BENCHMARK_CAPTURE(BM_FindRehash,
|
||||
unordered_set_sorted_large_uint64,
|
||||
std::unordered_set<uint64_t, UInt64Hash>{},
|
||||
getSortedLargeIntegerInputs<uint64_t>)->Arg(TestNumInputs);
|
||||
|
||||
|
||||
// Top Bits //
|
||||
BENCHMARK_CAPTURE(BM_Find,
|
||||
unordered_set_top_bits_uint64,
|
||||
std::unordered_set<uint64_t>{},
|
||||
getSortedTopBitsIntegerInputs<uint64_t>)->Arg(TestNumInputs);
|
||||
|
||||
BENCHMARK_CAPTURE(BM_FindRehash,
|
||||
unordered_set_top_bits_uint64,
|
||||
std::unordered_set<uint64_t, UInt64Hash>{},
|
||||
getSortedTopBitsIntegerInputs<uint64_t>)->Arg(TestNumInputs);
|
||||
|
||||
// String //
|
||||
BENCHMARK_CAPTURE(BM_Find,
|
||||
unordered_set_string,
|
||||
std::unordered_set<std::string>{},
|
||||
getRandomStringInputs)->Arg(TestNumInputs);
|
||||
|
||||
BENCHMARK_CAPTURE(BM_FindRehash,
|
||||
unordered_set_string,
|
||||
std::unordered_set<std::string>{},
|
||||
getRandomStringInputs)->Arg(TestNumInputs);
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
BENCHMARK_CAPTURE(BM_InsertDuplicate,
|
||||
unordered_set_int,
|
||||
std::unordered_set<int>{},
|
||||
getRandomIntegerInputs<int>)->Arg(TestNumInputs);
|
||||
BENCHMARK_CAPTURE(BM_InsertDuplicate,
|
||||
unordered_set_string,
|
||||
std::unordered_set<std::string>{},
|
||||
getRandomStringInputs)->Arg(TestNumInputs);
|
||||
|
||||
BENCHMARK_CAPTURE(BM_EmplaceDuplicate,
|
||||
unordered_set_int,
|
||||
std::unordered_set<int>{},
|
||||
getRandomIntegerInputs<int>)->Arg(TestNumInputs);
|
||||
BENCHMARK_CAPTURE(BM_EmplaceDuplicate,
|
||||
unordered_set_string,
|
||||
std::unordered_set<std::string>{},
|
||||
getRandomStringInputs)->Arg(TestNumInputs);
|
||||
|
||||
BENCHMARK_CAPTURE(BM_InsertDuplicate,
|
||||
unordered_set_int_insert_arg,
|
||||
std::unordered_set<int>{},
|
||||
getRandomIntegerInputs<int>)->Arg(TestNumInputs);
|
||||
BENCHMARK_CAPTURE(BM_InsertDuplicate,
|
||||
unordered_set_string_insert_arg,
|
||||
std::unordered_set<std::string>{},
|
||||
getRandomStringInputs)->Arg(TestNumInputs);
|
||||
|
||||
BENCHMARK_CAPTURE(BM_EmplaceDuplicate,
|
||||
unordered_set_int_insert_arg,
|
||||
std::unordered_set<int>{},
|
||||
getRandomIntegerInputs<unsigned>)->Arg(TestNumInputs);
|
||||
|
||||
BENCHMARK_CAPTURE(BM_EmplaceDuplicate,
|
||||
unordered_set_string_arg,
|
||||
std::unordered_set<std::string>{},
|
||||
getRandomCStringInputs)->Arg(TestNumInputs);
|
||||
|
||||
BENCHMARK_MAIN()
|
||||
|
42
benchmarks/util_smartptr.bench.cpp
Normal file
42
benchmarks/util_smartptr.bench.cpp
Normal file
@ -0,0 +1,42 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is dual licensed under the MIT and the University of Illinois Open
|
||||
// Source Licenses. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "benchmark/benchmark_api.h"
|
||||
|
||||
static void BM_SharedPtrCreateDestroy(benchmark::State& st) {
|
||||
while (st.KeepRunning()) {
|
||||
auto sp = std::make_shared<int>(42);
|
||||
benchmark::DoNotOptimize(sp.get());
|
||||
}
|
||||
}
|
||||
BENCHMARK(BM_SharedPtrCreateDestroy);
|
||||
|
||||
static void BM_SharedPtrIncDecRef(benchmark::State& st) {
|
||||
auto sp = std::make_shared<int>(42);
|
||||
benchmark::DoNotOptimize(sp.get());
|
||||
while (st.KeepRunning()) {
|
||||
std::shared_ptr<int> sp2(sp);
|
||||
benchmark::ClobberMemory();
|
||||
}
|
||||
}
|
||||
BENCHMARK(BM_SharedPtrIncDecRef);
|
||||
|
||||
static void BM_WeakPtrIncDecRef(benchmark::State& st) {
|
||||
auto sp = std::make_shared<int>(42);
|
||||
benchmark::DoNotOptimize(sp.get());
|
||||
while (st.KeepRunning()) {
|
||||
std::weak_ptr<int> wp(sp);
|
||||
benchmark::ClobberMemory();
|
||||
}
|
||||
}
|
||||
BENCHMARK(BM_WeakPtrIncDecRef);
|
||||
|
||||
BENCHMARK_MAIN()
|
32
benchmarks/vector_operations.bench.cpp
Normal file
32
benchmarks/vector_operations.bench.cpp
Normal file
@ -0,0 +1,32 @@
|
||||
#include <vector>
|
||||
#include <functional>
|
||||
#include <cstdint>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
|
||||
#include "benchmark/benchmark_api.h"
|
||||
|
||||
#include "ContainerBenchmarks.hpp"
|
||||
#include "GenerateInput.hpp"
|
||||
|
||||
using namespace ContainerBenchmarks;
|
||||
|
||||
constexpr std::size_t TestNumInputs = 1024;
|
||||
|
||||
BENCHMARK_CAPTURE(BM_ConstructIterIter,
|
||||
vector_char,
|
||||
std::vector<char>{},
|
||||
getRandomIntegerInputs<char>)->Arg(TestNumInputs);
|
||||
|
||||
BENCHMARK_CAPTURE(BM_ConstructIterIter,
|
||||
vector_size_t,
|
||||
std::vector<size_t>{},
|
||||
getRandomIntegerInputs<size_t>)->Arg(TestNumInputs);
|
||||
|
||||
BENCHMARK_CAPTURE(BM_ConstructIterIter,
|
||||
vector_string,
|
||||
std::vector<std::string>{},
|
||||
getRandomStringInputs)->Arg(TestNumInputs);
|
||||
|
||||
|
||||
BENCHMARK_MAIN()
|
@ -9,10 +9,16 @@ INCLUDE(CheckCXXSourceCompiles)
|
||||
|
||||
function(check_cxx_atomics varname)
|
||||
set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
|
||||
set(CMAKE_REQUIRED_FLAGS "-std=c++11 -nostdinc++ -isystem ${LIBCXX_SOURCE_DIR}/include")
|
||||
set(CMAKE_REQUIRED_FLAGS "-nodefaultlibs -std=c++11 -nostdinc++ -isystem ${LIBCXX_SOURCE_DIR}/include")
|
||||
if (${LIBCXX_GCC_TOOLCHAIN})
|
||||
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} --gcc-toolchain=${LIBCXX_GCC_TOOLCHAIN}")
|
||||
endif()
|
||||
if (CMAKE_C_FLAGS MATCHES -fsanitize OR CMAKE_CXX_FLAGS MATCHES -fsanitize)
|
||||
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -fno-sanitize=all")
|
||||
endif()
|
||||
if (CMAKE_C_FLAGS MATCHES -fsanitize-coverage OR CMAKE_CXX_FLAGS MATCHES -fsanitize-coverage)
|
||||
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -fno-sanitize-coverage=edge,trace-cmp,indirect-calls,8bit-counters")
|
||||
endif()
|
||||
check_cxx_source_compiles("
|
||||
#include <cstdint>
|
||||
#include <atomic>
|
||||
|
@ -28,9 +28,11 @@ macro(setup_abi_lib abidefines abilib abifiles abidirs)
|
||||
set(LIBCXX_CXX_ABI_LIBRARY ${abilib})
|
||||
set(LIBCXX_ABILIB_FILES ${abifiles})
|
||||
|
||||
file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/include")
|
||||
# The place in the build tree where we store out-of-source headers.
|
||||
set(LIBCXX_BUILD_HEADERS_ROOT "${CMAKE_BINARY_DIR}/include/c++-build")
|
||||
file(MAKE_DIRECTORY "${LIBCXX_BUILD_HEADERS_ROOT}")
|
||||
foreach(_d ${abidirs})
|
||||
file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/include/${_d}")
|
||||
file(MAKE_DIRECTORY "${LIBCXX_BUILD_HEADERS_ROOT}/${_d}")
|
||||
endforeach()
|
||||
|
||||
foreach(fpath ${LIBCXX_ABILIB_FILES})
|
||||
@ -41,16 +43,16 @@ macro(setup_abi_lib abidefines abilib abifiles abidirs)
|
||||
get_filename_component(dstdir ${fpath} PATH)
|
||||
get_filename_component(ifile ${fpath} NAME)
|
||||
file(COPY "${incpath}/${fpath}"
|
||||
DESTINATION "${CMAKE_BINARY_DIR}/include/${dstdir}"
|
||||
DESTINATION "${LIBCXX_BUILD_HEADERS_ROOT}/${dstdir}"
|
||||
)
|
||||
if (LIBCXX_INSTALL_HEADERS)
|
||||
install(FILES "${CMAKE_BINARY_DIR}/include/${fpath}"
|
||||
install(FILES "${LIBCXX_BUILD_HEADERS_ROOT}/${fpath}"
|
||||
DESTINATION include/c++/v1/${dstdir}
|
||||
COMPONENT libcxx
|
||||
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
|
||||
)
|
||||
endif()
|
||||
list(APPEND abilib_headers "${CMAKE_BINARY_DIR}/include/${fpath}")
|
||||
list(APPEND abilib_headers "${LIBCXX_BUILD_HEADERS_ROOT}/${fpath}")
|
||||
endif()
|
||||
endforeach()
|
||||
if (NOT found)
|
||||
@ -58,9 +60,7 @@ macro(setup_abi_lib abidefines abilib abifiles abidirs)
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
add_custom_target(LIBCXX_CXX_ABI_DEPS DEPENDS ${abilib_headers})
|
||||
include_directories("${CMAKE_BINARY_DIR}/include")
|
||||
|
||||
include_directories("${LIBCXX_BUILD_HEADERS_ROOT}")
|
||||
endmacro()
|
||||
|
||||
|
||||
|
@ -188,6 +188,14 @@ macro(add_library_flags_if condition)
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
# Add a list of libraries or link flags to 'LIBCXX_LIBRARIES'.
|
||||
macro(add_interface_library)
|
||||
foreach(lib ${ARGN})
|
||||
list(APPEND LIBCXX_LIBRARIES ${lib})
|
||||
list(APPEND LIBCXX_INTERFACE_LIBRARIES ${lib})
|
||||
endforeach()
|
||||
endmacro()
|
||||
|
||||
# Turn a comma separated CMake list into a space separated string.
|
||||
macro(split_list listname)
|
||||
string(REPLACE ";" " " ${listname} "${${listname}}")
|
||||
|
@ -1,15 +1,18 @@
|
||||
macro(find_llvm_parts)
|
||||
# Rely on llvm-config.
|
||||
set(CONFIG_OUTPUT)
|
||||
find_program(LLVM_CONFIG "llvm-config")
|
||||
if(NOT LLVM_CONFIG_PATH)
|
||||
find_program(LLVM_CONFIG_PATH "llvm-config")
|
||||
endif()
|
||||
if(DEFINED LLVM_PATH)
|
||||
set(LLVM_INCLUDE_DIR ${LLVM_INCLUDE_DIR} CACHE PATH "Path to llvm/include")
|
||||
set(LLVM_PATH ${LLVM_PATH} CACHE PATH "Path to LLVM source tree")
|
||||
set(LLVM_MAIN_SRC_DIR ${LLVM_PATH})
|
||||
set(LLVM_CMAKE_PATH "${LLVM_PATH}/cmake/modules")
|
||||
elseif(LLVM_CONFIG)
|
||||
message(STATUS "Found LLVM_CONFIG as ${LLVM_CONFIG}")
|
||||
set(CONFIG_COMMAND ${LLVM_CONFIG}
|
||||
elseif(LLVM_CONFIG_PATH)
|
||||
message(STATUS "Found LLVM_CONFIG_PATH as ${LLVM_CONFIG_PATH}")
|
||||
set(LIBCXX_USING_INSTALLED_LLVM 1)
|
||||
set(CONFIG_COMMAND ${LLVM_CONFIG_PATH}
|
||||
"--includedir"
|
||||
"--prefix"
|
||||
"--src-root")
|
||||
@ -38,34 +41,48 @@ macro(find_llvm_parts)
|
||||
set(LLVM_CMAKE_PATH "${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}/cmake/llvm")
|
||||
else()
|
||||
set(LLVM_FOUND OFF)
|
||||
message(WARNING "UNSUPPORTED LIBCXX CONFIGURATION DETECTED: "
|
||||
"llvm-config not found and LLVM_PATH not defined.\n"
|
||||
"Reconfigure with -DLLVM_CONFIG_PATH=path/to/llvm-config "
|
||||
"or -DLLVM_PATH=path/to/llvm-source-root.")
|
||||
return()
|
||||
endif()
|
||||
|
||||
if (NOT EXISTS ${LLVM_MAIN_SRC_DIR})
|
||||
if (EXISTS "${LLVM_CMAKE_PATH}")
|
||||
list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_PATH}")
|
||||
elseif (EXISTS "${LLVM_MAIN_SRC_DIR}/cmake/modules")
|
||||
list(APPEND CMAKE_MODULE_PATH "${LLVM_MAIN_SRC_DIR}/cmake/modules")
|
||||
else()
|
||||
set(LLVM_FOUND OFF)
|
||||
message(WARNING "Not found: ${LLVM_MAIN_SRC_DIR}")
|
||||
message(WARNING "Neither ${LLVM_CMAKE_PATH} nor ${LLVM_MAIN_SRC_DIR}/cmake/modules found")
|
||||
return()
|
||||
endif()
|
||||
|
||||
if(NOT EXISTS ${LLVM_CMAKE_PATH})
|
||||
set(LLVM_FOUND OFF)
|
||||
message(WARNING "Not found: ${LLVM_CMAKE_PATH}")
|
||||
return()
|
||||
endif()
|
||||
|
||||
list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_PATH}")
|
||||
list(APPEND CMAKE_MODULE_PATH "${LLVM_MAIN_SRC_DIR}/cmake/modules")
|
||||
|
||||
set(LLVM_FOUND ON)
|
||||
endmacro(find_llvm_parts)
|
||||
|
||||
|
||||
if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
|
||||
set(LIBCXX_BUILT_STANDALONE 1)
|
||||
macro(configure_out_of_tree_llvm)
|
||||
message(STATUS "Configuring for standalone build.")
|
||||
set(LIBCXX_STANDALONE_BUILD 1)
|
||||
|
||||
find_llvm_parts()
|
||||
|
||||
# Add LLVM Functions --------------------------------------------------------
|
||||
if (LLVM_FOUND AND LIBCXX_USING_INSTALLED_LLVM)
|
||||
include(LLVMConfig) # For TARGET_TRIPLE
|
||||
else()
|
||||
if (WIN32)
|
||||
set(LLVM_ON_UNIX 0)
|
||||
set(LLVM_ON_WIN32 1)
|
||||
else()
|
||||
set(LLVM_ON_UNIX 1)
|
||||
set(LLVM_ON_WIN32 0)
|
||||
endif()
|
||||
endif()
|
||||
if (LLVM_FOUND)
|
||||
include(AddLLVM OPTIONAL)
|
||||
endif()
|
||||
|
||||
# LLVM Options --------------------------------------------------------------
|
||||
include(FindPythonInterp)
|
||||
if( NOT PYTHONINTERP_FOUND )
|
||||
@ -95,36 +112,14 @@ if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
|
||||
|
||||
# Required doc configuration
|
||||
if (LLVM_ENABLE_SPHINX)
|
||||
message(STATUS "Sphinx enabled.")
|
||||
find_package(Sphinx REQUIRED)
|
||||
else()
|
||||
message(STATUS "Sphinx disabled.")
|
||||
endif()
|
||||
|
||||
# FIXME - This is cribbed from HandleLLVMOptions.cmake.
|
||||
if(WIN32)
|
||||
if (LLVM_ON_UNIX AND NOT APPLE)
|
||||
set(LLVM_HAVE_LINK_VERSION_SCRIPT 1)
|
||||
else()
|
||||
set(LLVM_HAVE_LINK_VERSION_SCRIPT 0)
|
||||
if(CYGWIN)
|
||||
set(LLVM_ON_WIN32 0)
|
||||
set(LLVM_ON_UNIX 1)
|
||||
else(CYGWIN)
|
||||
set(LLVM_ON_WIN32 1)
|
||||
set(LLVM_ON_UNIX 0)
|
||||
endif(CYGWIN)
|
||||
else(WIN32)
|
||||
if(UNIX)
|
||||
set(LLVM_ON_WIN32 0)
|
||||
set(LLVM_ON_UNIX 1)
|
||||
if(APPLE)
|
||||
set(LLVM_HAVE_LINK_VERSION_SCRIPT 0)
|
||||
else(APPLE)
|
||||
set(LLVM_HAVE_LINK_VERSION_SCRIPT 1)
|
||||
endif(APPLE)
|
||||
else(UNIX)
|
||||
MESSAGE(SEND_ERROR "Unable to determine platform")
|
||||
endif(UNIX)
|
||||
endif(WIN32)
|
||||
endif()
|
||||
endmacro(configure_out_of_tree_llvm)
|
||||
|
||||
# Add LLVM Functions --------------------------------------------------------
|
||||
include(AddLLVM OPTIONAL)
|
||||
endif()
|
||||
configure_out_of_tree_llvm()
|
||||
|
@ -1,6 +1,51 @@
|
||||
include(CheckLibraryExists)
|
||||
include(CheckCXXCompilerFlag)
|
||||
include(CheckLibcxxAtomic)
|
||||
|
||||
if(WIN32 AND NOT MINGW)
|
||||
# NOTE(compnerd) this is technically a lie, there is msvcrt, but for now, lets
|
||||
# let the default linking take care of that.
|
||||
set(LIBCXX_HAS_C_LIB NO)
|
||||
else()
|
||||
check_library_exists(c fopen "" LIBCXX_HAS_C_LIB)
|
||||
endif()
|
||||
|
||||
if (NOT LIBCXX_USE_COMPILER_RT)
|
||||
if(WIN32 AND NOT MINGW)
|
||||
set(LIBCXX_HAS_GCC_S_LIB NO)
|
||||
else()
|
||||
check_library_exists(gcc_s __gcc_personality_v0 "" LIBCXX_HAS_GCC_S_LIB)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# libc++ is built with -nodefaultlibs, so we want all our checks to also
|
||||
# use this option, otherwise we may end up with an inconsistency between
|
||||
# the flags we think we require during configuration (if the checks are
|
||||
# performed without -nodefaultlibs) and the flags that are actually
|
||||
# required during compilation (which has the -nodefaultlibs). libc is
|
||||
# required for the link to go through. We remove sanitizers from the
|
||||
# configuration checks to avoid spurious link errors.
|
||||
check_cxx_compiler_flag(-nodefaultlibs LIBCXX_SUPPORTS_NODEFAULTLIBS_FLAG)
|
||||
if (LIBCXX_SUPPORTS_NODEFAULTLIBS_FLAG)
|
||||
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -nodefaultlibs")
|
||||
if (LIBCXX_HAS_C_LIB)
|
||||
list(APPEND CMAKE_REQUIRED_LIBRARIES c)
|
||||
endif ()
|
||||
if (LIBCXX_USE_COMPILER_RT)
|
||||
list(APPEND CMAKE_REQUIRED_LIBRARIES -rtlib=compiler-rt)
|
||||
elseif (LIBCXX_HAS_GCC_S_LIB)
|
||||
list(APPEND CMAKE_REQUIRED_LIBRARIES gcc_s)
|
||||
endif ()
|
||||
if (CMAKE_C_FLAGS MATCHES -fsanitize OR CMAKE_CXX_FLAGS MATCHES -fsanitize)
|
||||
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -fno-sanitize=all")
|
||||
endif ()
|
||||
if (CMAKE_C_FLAGS MATCHES -fsanitize-coverage OR CMAKE_CXX_FLAGS MATCHES -fsanitize-coverage)
|
||||
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -fno-sanitize-coverage=edge,trace-cmp,indirect-calls,8bit-counters")
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
if(NOT WIN32 OR MINGW)
|
||||
include(CheckLibcxxAtomic)
|
||||
endif()
|
||||
|
||||
# Check compiler flags
|
||||
|
||||
@ -13,8 +58,14 @@ check_cxx_compiler_flag(/GR- LIBCXX_HAS_NO_GR_FLAG)
|
||||
|
||||
|
||||
# Check libraries
|
||||
check_library_exists(pthread pthread_create "" LIBCXX_HAS_PTHREAD_LIB)
|
||||
check_library_exists(c fopen "" LIBCXX_HAS_C_LIB)
|
||||
check_library_exists(m ccos "" LIBCXX_HAS_M_LIB)
|
||||
check_library_exists(rt clock_gettime "" LIBCXX_HAS_RT_LIB)
|
||||
check_library_exists(gcc_s __gcc_personality_v0 "" LIBCXX_HAS_GCC_S_LIB)
|
||||
if(WIN32 AND NOT MINGW)
|
||||
# TODO(compnerd) do we want to support an emulation layer that allows for the
|
||||
# use of pthread-win32 or similar libraries to emulate pthreads on Windows?
|
||||
set(LIBCXX_HAS_PTHREAD_LIB NO)
|
||||
set(LIBCXX_HAS_M_LIB NO)
|
||||
set(LIBCXX_HAS_RT_LIB NO)
|
||||
else()
|
||||
check_library_exists(pthread pthread_create "" LIBCXX_HAS_PTHREAD_LIB)
|
||||
check_library_exists(m ccos "" LIBCXX_HAS_M_LIB)
|
||||
check_library_exists(rt clock_gettime "" LIBCXX_HAS_RT_LIB)
|
||||
endif()
|
||||
|
@ -49,7 +49,7 @@ The basic steps needed to build libc++ are:
|
||||
For more information about configuring libc++ see :ref:`CMake Options`.
|
||||
|
||||
* ``make cxx`` --- will build libc++ and libc++abi.
|
||||
* ``make check-libcxx check-libcxxabi`` --- will run the test suites.
|
||||
* ``make check-cxx check-cxxabi`` --- will run the test suites.
|
||||
|
||||
Shared libraries for libc++ and libc++ abi should now be present in llvm/build/lib.
|
||||
See :ref:`using an alternate libc++ installation <alternate libcxx>`
|
||||
@ -60,7 +60,7 @@ The basic steps needed to build libc++ are:
|
||||
careful not to replace it. Remember Use the CMake option ``CMAKE_INSTALL_PREFIX`` to
|
||||
select a safe place to install libc++.
|
||||
|
||||
* ``make install-libcxx install-libcxxabi`` --- Will install the libraries and the headers
|
||||
* ``make install-cxx install-cxxabi`` --- Will install the libraries and the headers
|
||||
|
||||
.. warning::
|
||||
* Replacing your systems libc++ installation could render the system non-functional.
|
||||
@ -144,19 +144,26 @@ libc++ specific options
|
||||
|
||||
**Default**: ``OFF``
|
||||
|
||||
Build libc++ as a 32 bit library. Also see :option:`LLVM_BUILD_32_BITS`.
|
||||
Build libc++ as a 32 bit library. Also see `LLVM_BUILD_32_BITS`.
|
||||
|
||||
.. option:: LIBCXX_ENABLE_SHARED:BOOL
|
||||
|
||||
**Default**: ``ON``
|
||||
|
||||
Build libc++ as a shared library. If ``OFF`` is specified then libc++ is
|
||||
built as a static library.
|
||||
Build libc++ as a shared library. Either `LIBCXX_ENABLE_SHARED` or
|
||||
`LIBCXX_ENABLE_STATIC` has to be enabled.
|
||||
|
||||
.. option:: LIBCXX_ENABLE_STATIC:BOOL
|
||||
|
||||
**Default**: ``ON``
|
||||
|
||||
Build libc++ as a static library. Either `LIBCXX_ENABLE_SHARED` or
|
||||
`LIBCXX_ENABLE_STATIC` has to be enabled.
|
||||
|
||||
.. option:: LIBCXX_LIBDIR_SUFFIX:STRING
|
||||
|
||||
Extra suffix to append to the directory where libraries are to be installed.
|
||||
This option overrides :option:`LLVM_LIBDIR_SUFFIX`.
|
||||
This option overrides `LLVM_LIBDIR_SUFFIX`.
|
||||
|
||||
|
||||
.. _libc++experimental options:
|
||||
@ -172,7 +179,7 @@ libc++experimental Specific Options
|
||||
|
||||
.. option:: LIBCXX_INSTALL_EXPERIMENTAL_LIBRARY:BOOL
|
||||
|
||||
**Default**: ``OFF``
|
||||
**Default**: ``LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY AND LIBCXX_INSTALL_LIBRARY``
|
||||
|
||||
Install libc++experimental.a alongside libc++.
|
||||
|
||||
@ -227,7 +234,7 @@ ABI Library Specific Options
|
||||
libc++abi is the C++ ABI library used.
|
||||
|
||||
|
||||
libc++ Feature options
|
||||
libc++ Feature Options
|
||||
----------------------
|
||||
|
||||
.. option:: LIBCXX_ENABLE_EXCEPTIONS:BOOL
|
||||
@ -242,9 +249,32 @@ libc++ Feature options
|
||||
|
||||
Build libc++ with run time type information.
|
||||
|
||||
.. option:: LIBCXX_INCLUDE_BENCHMARKS:BOOL
|
||||
|
||||
libc++ Feature options
|
||||
----------------------
|
||||
**Default**: ``ON``
|
||||
|
||||
Build the libc++ benchmark tests and the Google Benchmark library needed
|
||||
to support them.
|
||||
|
||||
.. option:: LIBCXX_BENCHMARK_NATIVE_STDLIB:STRING
|
||||
|
||||
**Default**:: ``""``
|
||||
|
||||
**Values**:: ``libc++``, ``libstdc++``
|
||||
|
||||
Build the libc++ benchmark tests and Google Benchmark library against the
|
||||
specified standard library on the platform. On linux this can be used to
|
||||
compare libc++ to libstdc++ by building the benchmark tests against both
|
||||
standard libraries.
|
||||
|
||||
.. option:: LIBCXX_BENCHMARK_NATIVE_GCC_TOOLCHAIN:STRING
|
||||
|
||||
Use the specified GCC toolchain and standard library when building the native
|
||||
stdlib benchmark tests.
|
||||
|
||||
|
||||
libc++ ABI Feature Options
|
||||
--------------------------
|
||||
|
||||
The following options allow building libc++ for a different ABI version.
|
||||
|
||||
|
100
docs/DesignDocs/DebugMode.rst
Normal file
100
docs/DesignDocs/DebugMode.rst
Normal file
@ -0,0 +1,100 @@
|
||||
==========
|
||||
Debug Mode
|
||||
==========
|
||||
|
||||
.. contents::
|
||||
:local
|
||||
|
||||
.. _using-debug-mode:
|
||||
|
||||
Using Debug Mode
|
||||
================
|
||||
|
||||
Libc++ provides a debug mode that enables assertions meant to detect incorrect
|
||||
usage of the standard library. By default these assertions are disabled but
|
||||
they can be enabled using the ``_LIBCPP_DEBUG`` macro.
|
||||
|
||||
**_LIBCPP_DEBUG** Macro
|
||||
-----------------------
|
||||
|
||||
**_LIBCPP_DEBUG**:
|
||||
This macro is used to enable assertions and iterator debugging checks within
|
||||
libc++. By default it is undefined.
|
||||
|
||||
**Values**: ``0``, ``1``
|
||||
|
||||
Defining ``_LIBCPP_DEBUG`` to ``0`` or greater enables most of libc++'s
|
||||
assertions. Defining ``_LIBCPP_DEBUG`` to ``1`` enables "iterator debugging"
|
||||
which provides additional assertions about the validity of iterators used by
|
||||
the program.
|
||||
|
||||
Note that this option has no effect on libc++'s ABI
|
||||
|
||||
**_LIBCPP_DEBUG_USE_EXCEPTIONS**:
|
||||
When this macro is defined ``_LIBCPP_ASSERT`` failures throw
|
||||
``__libcpp_debug_exception`` instead of aborting. Additionally this macro
|
||||
disables exception specifications on functions containing ``_LIBCPP_ASSERT``
|
||||
checks. This allows assertion failures to correctly throw through these
|
||||
functions.
|
||||
|
||||
Handling Assertion Failures
|
||||
---------------------------
|
||||
|
||||
When a debug assertion fails the assertion handler is called via the
|
||||
``std::__libcpp_debug_function`` function pointer. It is possible to override
|
||||
this function pointer using a different handler function. Libc++ provides two
|
||||
different assertion handlers, the default handler
|
||||
``std::__libcpp_abort_debug_handler`` which aborts the program, and
|
||||
``std::__libcpp_throw_debug_handler`` which throws an instance of
|
||||
``std::__libcpp_debug_exception``. Libc++ can be changed to use the throwing
|
||||
assertion handler as follows:
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
#define _LIBCPP_DEBUG 1
|
||||
#include <string>
|
||||
int main() {
|
||||
std::__libcpp_debug_function = std::__libcpp_throw_debug_function;
|
||||
try {
|
||||
std::string::iterator bad_it;
|
||||
std::string str("hello world");
|
||||
str.insert(bad_it, '!'); // causes debug assertion
|
||||
} catch (std::__libcpp_debug_exception const&) {
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
Debug Mode Checks
|
||||
=================
|
||||
|
||||
Libc++'s debug mode offers two levels of checking. The first enables various
|
||||
precondition checks throughout libc++. The second additionally enables
|
||||
"iterator debugging" which checks the validity of iterators used by the program.
|
||||
|
||||
Basic Checks
|
||||
============
|
||||
|
||||
These checks are enabled when ``_LIBCPP_DEBUG`` is defined to either 0 or 1.
|
||||
|
||||
The following checks are enabled by ``_LIBCPP_DEBUG``:
|
||||
|
||||
* FIXME: Update this list
|
||||
|
||||
Iterator Debugging Checks
|
||||
=========================
|
||||
|
||||
These checks are enabled when ``_LIBCPP_DEBUG`` is defined to 1.
|
||||
|
||||
The following containers and STL classes support iterator debugging:
|
||||
|
||||
* ``std::string``
|
||||
* ``std::vector<T>`` (``T != bool``)
|
||||
* ``std::list``
|
||||
* ``std::unordered_map``
|
||||
* ``std::unordered_multimap``
|
||||
* ``std::unordered_set``
|
||||
* ``std::unordered_multiset``
|
||||
|
||||
The remaining containers do not currently support iterator debugging.
|
||||
Patches welcome.
|
127
docs/DesignDocs/VisibilityMacros.rst
Normal file
127
docs/DesignDocs/VisibilityMacros.rst
Normal file
@ -0,0 +1,127 @@
|
||||
========================
|
||||
Symbol Visibility Macros
|
||||
========================
|
||||
|
||||
.. contents::
|
||||
:local:
|
||||
|
||||
Overview
|
||||
========
|
||||
|
||||
Libc++ uses various "visibility" macros in order to provide a stable ABI in
|
||||
both the library and the headers. These macros work by changing the
|
||||
visibility and inlining characteristics of the symbols they are applied to.
|
||||
|
||||
Visibility Macros
|
||||
=================
|
||||
|
||||
**_LIBCPP_HIDDEN**
|
||||
Mark a symbol as hidden so it will not be exported from shared libraries.
|
||||
|
||||
**_LIBCPP_FUNC_VIS**
|
||||
Mark a symbol as being exported by the libc++ library. This attribute must
|
||||
be applied to the declaration of all functions exported by the libc++ dylib.
|
||||
|
||||
**_LIBCPP_OVERRIDABLE_FUNC_VIS**
|
||||
Mark a symbol as being exported by the libc++ library, but allow it to be
|
||||
overridden locally. On non-Windows, this is equivalent to `_LIBCPP_FUNC_VIS`.
|
||||
This macro is applied to all `operator new` and `operator delete` overloads.
|
||||
|
||||
**Windows Behavior**: Any symbol marked `dllimport` cannot be overridden
|
||||
locally, since `dllimport` indicates the symbol should be bound to a separate
|
||||
DLL. All `operator new` and `operator delete` overloads are required to be
|
||||
locally overridable, and therefore must not be marked `dllimport`. On Windows,
|
||||
this macro therefore expands to `__declspec(dllexport)` when building the
|
||||
library and has an empty definition otherwise.
|
||||
|
||||
**_LIBCPP_INLINE_VISIBILITY**
|
||||
Mark a function as hidden and force inlining whenever possible.
|
||||
|
||||
**_LIBCPP_ALWAYS_INLINE**
|
||||
A synonym for `_LIBCPP_INLINE_VISIBILITY`
|
||||
|
||||
**_LIBCPP_TYPE_VIS**
|
||||
Mark a type's typeinfo and vtable as having default visibility.
|
||||
`_LIBCPP_TYPE_VIS`. This macro has no effect on the visibility of the
|
||||
type's member functions. This attribute cannot be used on class templates.
|
||||
|
||||
**GCC Behavior**: GCC does not support Clang's `type_visibility(...)`
|
||||
attribute. With GCC the `visibility(...)` attribute is used and member
|
||||
functions are affected.
|
||||
|
||||
**_LIBCPP_TYPE_VIS_ONLY**
|
||||
The same as `_LIBCPP_TYPE_VIS` except that it may be applied to templates.
|
||||
|
||||
**Windows Behavior**: DLLs do not support dllimport/export on class templates.
|
||||
The macro has an empty definition on this platform.
|
||||
|
||||
Note: This macro should be renamed `_LIBCPP_TEMPLATE_TYPE_VIS`.
|
||||
|
||||
**_LIBCPP_ENUM_VIS**
|
||||
Mark the typeinfo of an enum as having default visibility. This attribute
|
||||
should be applied to all enum declarations.
|
||||
|
||||
**Windows Behavior**: DLLs do not support importing or exporting enumeration
|
||||
typeinfo. The macro has an empty definition on this platform.
|
||||
|
||||
**GCC Behavior**: GCC un-hides the typeinfo for enumerations by default, even
|
||||
if `-fvisibility=hidden` is specified. Additionally applying a visibility
|
||||
attribute to an enum class results in a warning. The macro has an empty
|
||||
definition with GCC.
|
||||
|
||||
**_LIBCPP_EXTERN_TEMPLATE_TYPE_VIS**
|
||||
Mark the member functions, typeinfo, and vtable of the type named in
|
||||
a `_LIBCPP_EXTERN_TEMPLATE` declaration as being exported by the libc++ library.
|
||||
This attribute must be specified on all extern class template declarations.
|
||||
|
||||
This macro is used to override the `_LIBCPP_TYPE_VIS_ONLY` attribute
|
||||
specified on the primary template and to export the member functions produced
|
||||
by the explicit instantiation in the dylib.
|
||||
|
||||
**GCC Behavior**: GCC ignores visibility attributes applied the type in
|
||||
extern template declarations and applying an attribute results in a warning.
|
||||
However since `_LIBCPP_TYPE_VIS_ONLY` is the same as `_LIBCPP_TYPE_VIS` the
|
||||
visibility is already correct. The macro has an empty definition with GCC.
|
||||
|
||||
**Windows Behavior**: `extern template` and `dllexport` are fundamentally
|
||||
incompatible *on a template class* on Windows; the former suppresses
|
||||
instantiation, while the latter forces it. Specifying both on the same
|
||||
declaration makes the template class be instantiated, which is not desirable
|
||||
inside headers. This macro therefore expands to `dllimport` outside of libc++
|
||||
but nothing inside of it (rather than expanding to `dllexport`); instead, the
|
||||
explicit instantiations themselves are marked as exported. Note that this
|
||||
applies *only* to extern template *classes*. Extern template *functions* obey
|
||||
regular import/export semantics, and applying `dllexport` directly to the
|
||||
extern template declaration is the correct thing to do for them.
|
||||
|
||||
**_LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS**
|
||||
Mark the member functions, typeinfo, and vtable of an explicit instantiation
|
||||
of a class template as being exported by the libc++ library. This attribute
|
||||
must be specified on all template class explicit instantiations.
|
||||
|
||||
It is only necessary to mark the explicit instantiation itself (as opposed to
|
||||
the extern template declaration) as exported on Windows, as discussed above.
|
||||
On all other platforms, this macro has an empty definition.
|
||||
|
||||
**_LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY**
|
||||
Mark a member function of a class template as visible and always inline. This
|
||||
macro should only be applied to member functions of class templates that are
|
||||
externally instantiated. It is important that these symbols are not marked
|
||||
as hidden as that will prevent the dylib definition from being found.
|
||||
|
||||
This macro is used to maintain ABI compatibility for symbols that have been
|
||||
historically exported by the libc++ library but are now marked inline.
|
||||
|
||||
**_LIBCPP_EXCEPTION_ABI**
|
||||
Mark the member functions, typeinfo, and vtable of the type as being exported
|
||||
by the libc++ library. This macro must be applied to all *exception types*.
|
||||
Exception types should be defined directly in namespace `std` and not the
|
||||
versioning namespace. This allows throwing and catching some exception types
|
||||
between libc++ and libstdc++.
|
||||
|
||||
Links
|
||||
=====
|
||||
|
||||
* `[cfe-dev] Visibility in libc++ - 1 <http://lists.llvm.org/pipermail/cfe-dev/2013-July/030610.html>`_
|
||||
* `[cfe-dev] Visibility in libc++ - 2 <http://lists.llvm.org/pipermail/cfe-dev/2013-August/031195.html>`_
|
||||
* `[libcxx] Visibility fixes for Windows <http://lists.llvm.org/pipermail/cfe-commits/Week-of-Mon-20130805/085461.html>`_
|
@ -5,7 +5,7 @@
|
||||
# out-of-tree builds.
|
||||
|
||||
# You can set these variables from the command line.
|
||||
SPHINXOPTS =
|
||||
SPHINXOPTS = -n -W
|
||||
SPHINXBUILD = sphinx-build
|
||||
PAPER =
|
||||
BUILDDIR = _build
|
||||
|
@ -98,56 +98,64 @@ configuration. Passing the option on the command line will override the default.
|
||||
|
||||
.. program:: lit
|
||||
|
||||
.. option:: --cxx_under_test=<path/to/compiler>
|
||||
.. option:: cxx_under_test=<path/to/compiler>
|
||||
|
||||
Specify the compiler used to build the tests.
|
||||
|
||||
.. option:: cxx_stdlib_under_test=<stdlib name>
|
||||
|
||||
**Values**: libc++, libstdc++
|
||||
|
||||
Specify the C++ standard library being tested. Unless otherwise specified
|
||||
libc++ is used. This option is intended to allow running the libc++ test
|
||||
suite against other standard library implementations.
|
||||
|
||||
.. option:: std=<standard version>
|
||||
|
||||
**Values**: c++98, c++03, c++11, c++14, c++1z
|
||||
|
||||
Change the standard version used when building the tests.
|
||||
|
||||
.. option:: --libcxx_site_config=<path/to/lit.site.cfg>
|
||||
.. option:: libcxx_site_config=<path/to/lit.site.cfg>
|
||||
|
||||
Specify the site configuration to use when running the tests. This option
|
||||
overrides the enviroment variable LIBCXX_SITE_CONFIG.
|
||||
|
||||
.. option:: --libcxx_headers=<path/to/headers>
|
||||
.. option:: cxx_headers=<path/to/headers>
|
||||
|
||||
Specify the libc++ headers that are tested. By default the headers in the
|
||||
source tree are used.
|
||||
Specify the c++ standard library headers that are tested. By default the
|
||||
headers in the source tree are used.
|
||||
|
||||
.. option:: --cxx_library_root=<path/to/lib/>
|
||||
.. option:: cxx_library_root=<path/to/lib/>
|
||||
|
||||
Specify the directory of the libc++ library to be tested. By default the
|
||||
library folder of the build directory is used. This option cannot be used
|
||||
when use_system_lib is provided.
|
||||
when use_system_cxx_lib is provided.
|
||||
|
||||
|
||||
.. option:: --cxx_runtime_root=<path/to/lib/>
|
||||
.. option:: cxx_runtime_root=<path/to/lib/>
|
||||
|
||||
Specify the directory of the libc++ library to use at runtime. This directory
|
||||
is not added to the linkers search path. This can be used to compile tests
|
||||
against one version of libc++ and run them using another. The default value
|
||||
for this option is `cxx_library_root`. This option cannot be used
|
||||
when use_system_lib is provided.
|
||||
when use_system_cxx_lib is provided.
|
||||
|
||||
.. option:: --use_system_lib=<bool>
|
||||
.. option:: use_system_cxx_lib=<bool>
|
||||
|
||||
**Default**: False
|
||||
|
||||
Enable or disable testing against the installed version of libc++ library.
|
||||
Note: This does not use the installed headers.
|
||||
|
||||
.. option:: --use_lit_shell=<bool>
|
||||
.. option:: use_lit_shell=<bool>
|
||||
|
||||
Enable or disable the use of LIT's internal shell in ShTests. If the
|
||||
environment variable LIT_USE_INTERNAL_SHELL is present then that is used as
|
||||
the default value. Otherwise the default value is True on Windows and False
|
||||
on every other platform.
|
||||
|
||||
.. option:: --no_default_flags=<bool>
|
||||
.. option:: no_default_flags=<bool>
|
||||
|
||||
**Default**: False
|
||||
|
||||
@ -155,16 +163,16 @@ configuration. Passing the option on the command line will override the default.
|
||||
option is used only flags specified using the compile_flags and link_flags
|
||||
will be used.
|
||||
|
||||
.. option:: --compile_flags="<list-of-args>"
|
||||
.. option:: compile_flags="<list-of-args>"
|
||||
|
||||
Specify additional compile flags as a space delimited string.
|
||||
Note: This options should not be used to change the standard version used.
|
||||
|
||||
.. option:: --link_flags="<list-of-args>"
|
||||
.. option:: link_flags="<list-of-args>"
|
||||
|
||||
Specify additional link flags as a space delimited string.
|
||||
|
||||
.. option:: --debug_level=<level>
|
||||
.. option:: debug_level=<level>
|
||||
|
||||
**Values**: 0, 1
|
||||
|
||||
@ -191,10 +199,68 @@ Environment Variables
|
||||
.. envvar:: LIBCXX_SITE_CONFIG=<path/to/lit.site.cfg>
|
||||
|
||||
Specify the site configuration to use when running the tests.
|
||||
Also see :option:`libcxx_site_config`.
|
||||
Also see `libcxx_site_config`.
|
||||
|
||||
.. envvar:: LIBCXX_COLOR_DIAGNOSTICS
|
||||
|
||||
If ``LIBCXX_COLOR_DIAGNOSTICS`` is defined then the test suite will attempt
|
||||
to use color diagnostic outputs from the compiler.
|
||||
Also see :option:`color_diagnostics`.
|
||||
Also see `color_diagnostics`.
|
||||
|
||||
Benchmarks
|
||||
==========
|
||||
|
||||
Libc++ contains benchmark tests separately from the test of the test suite.
|
||||
The benchmarks are written using the `Google Benchmark`_ library, a copy of which
|
||||
is stored in the libc++ repository.
|
||||
|
||||
For more information about using the Google Benchmark library see the
|
||||
`official documentation <https://github.com/google/benchmark>`_.
|
||||
|
||||
.. _`Google Benchmark`: https://github.com/google/benchmark
|
||||
|
||||
Building Benchmarks
|
||||
-------------------
|
||||
|
||||
The benchmark tests are not built by default. The benchmarks can be built using
|
||||
the ``cxx-benchmarks`` target.
|
||||
|
||||
An example build would look like:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ cd build
|
||||
$ cmake [options] <path to libcxx sources>
|
||||
$ make cxx-benchmarks
|
||||
|
||||
This will build all of the benchmarks under ``<libcxx-src>/benchmarks`` to be
|
||||
built against the just-built libc++. The compiled tests are output into
|
||||
``build/benchmarks``.
|
||||
|
||||
The benchmarks can also be built against the platforms native standard library
|
||||
using the ``-DLIBCXX_BUILD_BENCHMARKS_NATIVE_STDLIB=ON`` CMake option. This
|
||||
is useful for comparing the performance of libc++ to other standard libraries.
|
||||
The compiled benchmarks are named ``<test>.libcxx.out`` if they test libc++ and
|
||||
``<test>.native.out`` otherwise.
|
||||
|
||||
Also See:
|
||||
|
||||
* :ref:`Building Libc++ <build instructions>`
|
||||
* :ref:`CMake Options`
|
||||
|
||||
Running Benchmarks
|
||||
------------------
|
||||
|
||||
The benchmarks must be run manually by the user. Currently there is no way
|
||||
to run them as part of the build.
|
||||
|
||||
For example:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ cd build/benchmarks
|
||||
$ make cxx-benchmarks
|
||||
$ ./algorithms.libcxx.out # Runs all the benchmarks
|
||||
$ ./algorithms.libcxx.out --benchmark_filter=BM_Sort.* # Only runs the sort benchmarks
|
||||
|
||||
For more information about running benchmarks see `Google Benchmark`_.
|
||||
|
@ -123,3 +123,53 @@ supported by libc++ they may be useful to users.
|
||||
Known 3rd Party Implementations Include:
|
||||
|
||||
* `Koutheir's libc++ pretty-printers <https://github.com/koutheir/libcxx-pretty-printers>`_.
|
||||
|
||||
|
||||
Libc++ Configuration Macros
|
||||
===========================
|
||||
|
||||
Libc++ provides a number of configuration macros which can be used to enable
|
||||
or disable extended libc++ behavior, including enabling "debug mode" or
|
||||
thread safety annotations.
|
||||
|
||||
**_LIBCPP_DEBUG**:
|
||||
See :ref:`using-debug-mode` for more information.
|
||||
|
||||
**_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS**:
|
||||
This macro is used to enable -Wthread-safety annotations on libc++'s
|
||||
``std::mutex`` and ``std::lock_guard``. By default these annotations are
|
||||
disabled and must be manually enabled by the user.
|
||||
|
||||
**_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS**:
|
||||
This macro is used to disable all visibility annotations inside libc++.
|
||||
Defining this macro and then building libc++ with hidden visibility gives a
|
||||
build of libc++ which does not export any symbols, which can be useful when
|
||||
building statically for inclusion into another library.
|
||||
|
||||
**_LIBCPP_ENABLE_TUPLE_IMPLICIT_REDUCED_ARITY_EXTENSION**:
|
||||
This macro is used to re-enable an extension in `std::tuple` which allowed
|
||||
it to be implicitly constructed from fewer initializers than contained
|
||||
elements. Elements without an initializer are default constructed. For example:
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
std::tuple<std::string, int, std::error_code> foo() {
|
||||
return {"hello world", 42}; // default constructs error_code
|
||||
}
|
||||
|
||||
|
||||
Since libc++ 4.0 this extension has been disabled by default. This macro
|
||||
may be defined to re-enable it in order to support existing code that depends
|
||||
on the extension. New use of this extension should be discouraged.
|
||||
See `PR 27374 <http://llvm.org/PR27374>`_ for more information.
|
||||
|
||||
Note: The "reduced-arity-initialization" extension is still offered but only
|
||||
for explicit conversions. Example:
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
auto foo() {
|
||||
using Tup = std::tuple<std::string, int, std::error_code>;
|
||||
return Tup{"hello world", 42}; // explicit constructor called. OK.
|
||||
}
|
||||
|
||||
|
@ -47,9 +47,9 @@ copyright = u'2011-2016, LLVM Project'
|
||||
# built documents.
|
||||
#
|
||||
# The short X.Y version.
|
||||
version = '3.9'
|
||||
version = '4.0'
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = '3.9'
|
||||
release = '4.0'
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
|
@ -127,13 +127,14 @@ Design Documents
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
DesignDocs/DebugMode
|
||||
DesignDocs/CapturingConfigInfo
|
||||
DesignDocs/ABIVersioning
|
||||
DesignDocs/VisibilityMacros
|
||||
|
||||
|
||||
* `<atomic> design <http://libcxx.llvm.org/atomic_design.html>`_
|
||||
* `<type_traits> design <http://libcxx.llvm.org/type_traits_design.html>`_
|
||||
* `Status of debug mode <http://libcxx.llvm.org/debug_mode.html>`_
|
||||
* `Notes by Marshall Clow`__
|
||||
|
||||
.. __: https://cplusplusmusings.wordpress.com/2012/07/05/clang-and-standard-libraries-on-mac-os-x/
|
||||
|
@ -10,16 +10,18 @@ set(LIBCXX_HEADER_PATTERN
|
||||
${LIBCXX_SUPPORT_HEADER_PATTERN}
|
||||
)
|
||||
|
||||
file(COPY .
|
||||
DESTINATION "${CMAKE_BINARY_DIR}/include/c++/v1"
|
||||
FILES_MATCHING
|
||||
${LIBCXX_HEADER_PATTERN}
|
||||
)
|
||||
if(NOT LIBCXX_USING_INSTALLED_LLVM AND LLVM_BINARY_DIR)
|
||||
file(COPY .
|
||||
DESTINATION "${LLVM_BINARY_DIR}/include/c++/v1"
|
||||
FILES_MATCHING
|
||||
${LIBCXX_HEADER_PATTERN}
|
||||
)
|
||||
endif()
|
||||
|
||||
if (LIBCXX_INSTALL_HEADERS)
|
||||
install(DIRECTORY .
|
||||
DESTINATION include/c++/v1
|
||||
COMPONENT libcxx-headers
|
||||
COMPONENT cxx-headers
|
||||
FILES_MATCHING
|
||||
${LIBCXX_HEADER_PATTERN}
|
||||
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
|
||||
@ -27,7 +29,7 @@ if (LIBCXX_INSTALL_HEADERS)
|
||||
|
||||
if (LIBCXX_NEEDS_SITE_CONFIG)
|
||||
set(UNIX_CAT cat)
|
||||
if (WIN32)
|
||||
if("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows")
|
||||
set(UNIX_CAT type)
|
||||
endif()
|
||||
# Generate and install a custom __config header. The new header is created
|
||||
@ -47,17 +49,20 @@ if (LIBCXX_INSTALL_HEADERS)
|
||||
DESTINATION include/c++/v1
|
||||
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
|
||||
RENAME __config
|
||||
COMPONENT libcxx-headers)
|
||||
COMPONENT cxx-headers)
|
||||
endif()
|
||||
|
||||
if (NOT CMAKE_CONFIGURATION_TYPES)
|
||||
# this target is just needed as a placeholder for the distribution target
|
||||
add_custom_target(libcxx-headers)
|
||||
add_custom_target(install-libcxx-headers
|
||||
DEPENDS libcxx-headers ${generated_config_deps}
|
||||
add_custom_target(cxx-headers)
|
||||
add_custom_target(install-cxx-headers
|
||||
DEPENDS cxx-headers ${generated_config_deps}
|
||||
COMMAND "${CMAKE_COMMAND}"
|
||||
-DCMAKE_INSTALL_COMPONENT=libcxx-headers
|
||||
-DCMAKE_INSTALL_COMPONENT=cxx-headers
|
||||
-P "${CMAKE_BINARY_DIR}/cmake_install.cmake")
|
||||
|
||||
add_custom_target(libcxx-headers)
|
||||
add_custom_target(install-libcxx-headers DEPENDS install-cxx-headers)
|
||||
endif()
|
||||
|
||||
endif()
|
||||
|
@ -163,7 +163,7 @@ __find_bool_true(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type
|
||||
{
|
||||
typedef __bit_iterator<_Cp, _IsConst> _It;
|
||||
typedef typename _It::__storage_type __storage_type;
|
||||
static const unsigned __bits_per_word = _It::__bits_per_word;
|
||||
static const int __bits_per_word = _It::__bits_per_word;
|
||||
// do first partial word
|
||||
if (__first.__ctz_ != 0)
|
||||
{
|
||||
@ -199,7 +199,7 @@ __find_bool_false(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type
|
||||
{
|
||||
typedef __bit_iterator<_Cp, _IsConst> _It;
|
||||
typedef typename _It::__storage_type __storage_type;
|
||||
static const unsigned __bits_per_word = _It::__bits_per_word;
|
||||
const int __bits_per_word = _It::__bits_per_word;
|
||||
// do first partial word
|
||||
if (__first.__ctz_ != 0)
|
||||
{
|
||||
@ -251,7 +251,7 @@ __count_bool_true(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type
|
||||
typedef __bit_iterator<_Cp, _IsConst> _It;
|
||||
typedef typename _It::__storage_type __storage_type;
|
||||
typedef typename _It::difference_type difference_type;
|
||||
static const unsigned __bits_per_word = _It::__bits_per_word;
|
||||
const int __bits_per_word = _It::__bits_per_word;
|
||||
difference_type __r = 0;
|
||||
// do first partial word
|
||||
if (__first.__ctz_ != 0)
|
||||
@ -282,7 +282,7 @@ __count_bool_false(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_typ
|
||||
typedef __bit_iterator<_Cp, _IsConst> _It;
|
||||
typedef typename _It::__storage_type __storage_type;
|
||||
typedef typename _It::difference_type difference_type;
|
||||
static const unsigned __bits_per_word = _It::__bits_per_word;
|
||||
const int __bits_per_word = _It::__bits_per_word;
|
||||
difference_type __r = 0;
|
||||
// do first partial word
|
||||
if (__first.__ctz_ != 0)
|
||||
@ -324,7 +324,7 @@ __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;
|
||||
static const unsigned __bits_per_word = _It::__bits_per_word;
|
||||
const int __bits_per_word = _It::__bits_per_word;
|
||||
// do first partial word
|
||||
if (__first.__ctz_ != 0)
|
||||
{
|
||||
@ -354,7 +354,7 @@ __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;
|
||||
static const unsigned __bits_per_word = _It::__bits_per_word;
|
||||
const int __bits_per_word = _It::__bits_per_word;
|
||||
// do first partial word
|
||||
if (__first.__ctz_ != 0)
|
||||
{
|
||||
@ -412,7 +412,7 @@ __copy_aligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsCon
|
||||
typedef __bit_iterator<_Cp, _IsConst> _In;
|
||||
typedef typename _In::difference_type difference_type;
|
||||
typedef typename _In::__storage_type __storage_type;
|
||||
static const unsigned __bits_per_word = _In::__bits_per_word;
|
||||
const int __bits_per_word = _In::__bits_per_word;
|
||||
difference_type __n = __last - __first;
|
||||
if (__n > 0)
|
||||
{
|
||||
@ -461,7 +461,7 @@ __copy_unaligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsC
|
||||
typedef __bit_iterator<_Cp, _IsConst> _In;
|
||||
typedef typename _In::difference_type difference_type;
|
||||
typedef typename _In::__storage_type __storage_type;
|
||||
static const unsigned __bits_per_word = _In::__bits_per_word;
|
||||
static const int __bits_per_word = _In::__bits_per_word;
|
||||
difference_type __n = __last - __first;
|
||||
if (__n > 0)
|
||||
{
|
||||
@ -551,7 +551,7 @@ __copy_backward_aligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_C
|
||||
typedef __bit_iterator<_Cp, _IsConst> _In;
|
||||
typedef typename _In::difference_type difference_type;
|
||||
typedef typename _In::__storage_type __storage_type;
|
||||
static const unsigned __bits_per_word = _In::__bits_per_word;
|
||||
const int __bits_per_word = _In::__bits_per_word;
|
||||
difference_type __n = __last - __first;
|
||||
if (__n > 0)
|
||||
{
|
||||
@ -600,7 +600,7 @@ __copy_backward_unaligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<
|
||||
typedef __bit_iterator<_Cp, _IsConst> _In;
|
||||
typedef typename _In::difference_type difference_type;
|
||||
typedef typename _In::__storage_type __storage_type;
|
||||
static const unsigned __bits_per_word = _In::__bits_per_word;
|
||||
const int __bits_per_word = _In::__bits_per_word;
|
||||
difference_type __n = __last - __first;
|
||||
if (__n > 0)
|
||||
{
|
||||
@ -718,7 +718,7 @@ __swap_ranges_aligned(__bit_iterator<__C1, false> __first, __bit_iterator<__C1,
|
||||
typedef __bit_iterator<__C1, false> _I1;
|
||||
typedef typename _I1::difference_type difference_type;
|
||||
typedef typename _I1::__storage_type __storage_type;
|
||||
static const unsigned __bits_per_word = _I1::__bits_per_word;
|
||||
const int __bits_per_word = _I1::__bits_per_word;
|
||||
difference_type __n = __last - __first;
|
||||
if (__n > 0)
|
||||
{
|
||||
@ -768,7 +768,7 @@ __swap_ranges_unaligned(__bit_iterator<__C1, false> __first, __bit_iterator<__C1
|
||||
typedef __bit_iterator<__C1, false> _I1;
|
||||
typedef typename _I1::difference_type difference_type;
|
||||
typedef typename _I1::__storage_type __storage_type;
|
||||
static const unsigned __bits_per_word = _I1::__bits_per_word;
|
||||
const int __bits_per_word = _I1::__bits_per_word;
|
||||
difference_type __n = __last - __first;
|
||||
if (__n > 0)
|
||||
{
|
||||
@ -959,7 +959,7 @@ __equal_unaligned(__bit_iterator<_Cp, _IC1> __first1, __bit_iterator<_Cp, _IC1>
|
||||
typedef __bit_iterator<_Cp, _IC1> _It;
|
||||
typedef typename _It::difference_type difference_type;
|
||||
typedef typename _It::__storage_type __storage_type;
|
||||
static const unsigned __bits_per_word = _It::__bits_per_word;
|
||||
static const int __bits_per_word = _It::__bits_per_word;
|
||||
difference_type __n = __last1 - __first1;
|
||||
if (__n > 0)
|
||||
{
|
||||
@ -1041,7 +1041,7 @@ __equal_aligned(__bit_iterator<_Cp, _IC1> __first1, __bit_iterator<_Cp, _IC1> __
|
||||
typedef __bit_iterator<_Cp, _IC1> _It;
|
||||
typedef typename _It::difference_type difference_type;
|
||||
typedef typename _It::__storage_type __storage_type;
|
||||
static const unsigned __bits_per_word = _It::__bits_per_word;
|
||||
static const int __bits_per_word = _It::__bits_per_word;
|
||||
difference_type __n = __last1 - __first1;
|
||||
if (__n > 0)
|
||||
{
|
||||
|
373
include/__config
373
include/__config
@ -27,14 +27,14 @@
|
||||
#define _GNUC_VER 0
|
||||
#endif
|
||||
|
||||
#define _LIBCPP_VERSION 3900
|
||||
#define _LIBCPP_VERSION 4000
|
||||
|
||||
#ifndef _LIBCPP_ABI_VERSION
|
||||
#define _LIBCPP_ABI_VERSION 1
|
||||
#endif
|
||||
|
||||
#if defined(_LIBCPP_ABI_UNSTABLE) || _LIBCPP_ABI_VERSION >= 2
|
||||
// Change short string represention so that string data starts at offset 0,
|
||||
// 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.
|
||||
@ -43,9 +43,15 @@
|
||||
#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 it's 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
|
||||
#define _LIBCPP_ABI_VARIADIC_LOCK_GUARD
|
||||
// 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
|
||||
#elif _LIBCPP_ABI_VERSION == 1
|
||||
// Feature macros for disabling pre ABI v1 features. All of these options
|
||||
// are deprecated.
|
||||
@ -64,6 +70,9 @@
|
||||
|
||||
#define _LIBCPP_NAMESPACE _LIBCPP_CONCAT(__,_LIBCPP_ABI_VERSION)
|
||||
|
||||
#if __cplusplus < 201103L
|
||||
#define _LIBCPP_CXX03_LANG
|
||||
#endif
|
||||
|
||||
#ifndef __has_attribute
|
||||
#define __has_attribute(__x) 0
|
||||
@ -83,6 +92,13 @@
|
||||
#define __is_identifier(__x) 1
|
||||
#endif
|
||||
|
||||
// Need to detect which libc we're using if we're on Linux.
|
||||
#if defined(__linux__)
|
||||
#include <features.h>
|
||||
#if !defined(__GLIBC_PREREQ)
|
||||
#define __GLIBC_PREREQ(a, b) 0
|
||||
#endif // !defined(__GLIBC_PREREQ)
|
||||
#endif // defined(__linux__)
|
||||
|
||||
#ifdef __LITTLE_ENDIAN__
|
||||
#if __LITTLE_ENDIAN__
|
||||
@ -200,90 +216,6 @@
|
||||
#define _LIBCPP_NO_CFI
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
|
||||
// only really useful for a DLL
|
||||
#ifdef _LIBCPP_DLL // this should be a compiler builtin define ideally...
|
||||
# ifdef cxx_EXPORTS
|
||||
# define _LIBCPP_HIDDEN
|
||||
# define _LIBCPP_FUNC_VIS __declspec(dllexport)
|
||||
# define _LIBCPP_TYPE_VIS __declspec(dllexport)
|
||||
# else
|
||||
# define _LIBCPP_HIDDEN
|
||||
# define _LIBCPP_FUNC_VIS __declspec(dllimport)
|
||||
# define _LIBCPP_TYPE_VIS __declspec(dllimport)
|
||||
# endif
|
||||
#else
|
||||
# define _LIBCPP_HIDDEN
|
||||
# define _LIBCPP_FUNC_VIS
|
||||
# define _LIBCPP_TYPE_VIS
|
||||
#endif
|
||||
|
||||
#define _LIBCPP_TYPE_VIS_ONLY
|
||||
#define _LIBCPP_FUNC_VIS_ONLY
|
||||
|
||||
#ifndef _LIBCPP_INLINE_VISIBILITY
|
||||
# ifdef _LIBCPP_MSVC
|
||||
# define _LIBCPP_INLINE_VISIBILITY __forceinline
|
||||
# else // MinGW GCC and Clang
|
||||
# define _LIBCPP_INLINE_VISIBILITY __attribute__ ((__always_inline__))
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_EXCEPTION_ABI
|
||||
#define _LIBCPP_EXCEPTION_ABI _LIBCPP_TYPE_VIS
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_ALWAYS_INLINE
|
||||
# ifdef _LIBCPP_MSVC
|
||||
# define _LIBCPP_ALWAYS_INLINE __forceinline
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#endif // _WIN32
|
||||
|
||||
#ifndef _LIBCPP_HIDDEN
|
||||
#define _LIBCPP_HIDDEN __attribute__ ((__visibility__("hidden")))
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_FUNC_VIS
|
||||
#define _LIBCPP_FUNC_VIS __attribute__ ((__visibility__("default")))
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_TYPE_VIS
|
||||
# if __has_attribute(__type_visibility__)
|
||||
# define _LIBCPP_TYPE_VIS __attribute__ ((__type_visibility__("default")))
|
||||
# else
|
||||
# define _LIBCPP_TYPE_VIS __attribute__ ((__visibility__("default")))
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_PREFERRED_OVERLOAD
|
||||
# if __has_attribute(__enable_if__)
|
||||
# define _LIBCPP_PREFERRED_OVERLOAD __attribute__ ((__enable_if__(true, "")))
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_TYPE_VIS_ONLY
|
||||
# define _LIBCPP_TYPE_VIS_ONLY _LIBCPP_TYPE_VIS
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_FUNC_VIS_ONLY
|
||||
# define _LIBCPP_FUNC_VIS_ONLY _LIBCPP_FUNC_VIS
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_INLINE_VISIBILITY
|
||||
#define _LIBCPP_INLINE_VISIBILITY __attribute__ ((__visibility__("hidden"), __always_inline__))
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_EXCEPTION_ABI
|
||||
#define _LIBCPP_EXCEPTION_ABI __attribute__ ((__visibility__("default")))
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_ALWAYS_INLINE
|
||||
#define _LIBCPP_ALWAYS_INLINE __attribute__ ((__visibility__("hidden"), __always_inline__))
|
||||
#endif
|
||||
|
||||
#if defined(__clang__)
|
||||
|
||||
// _LIBCPP_ALTERNATE_STRING_LAYOUT is an old name for
|
||||
@ -302,10 +234,6 @@
|
||||
# define _ALIGNAS(x) __attribute__((__aligned__(x)))
|
||||
#endif
|
||||
|
||||
#if !__has_feature(cxx_alias_templates)
|
||||
#define _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#endif
|
||||
|
||||
#if __cplusplus < 201103L
|
||||
typedef __char16_t char16_t;
|
||||
typedef __char32_t char32_t;
|
||||
@ -333,14 +261,6 @@ typedef __char32_t char32_t;
|
||||
# define _LIBCPP_NORETURN __attribute__ ((noreturn))
|
||||
#endif
|
||||
|
||||
#if !(__has_feature(cxx_default_function_template_args))
|
||||
#define _LIBCPP_HAS_NO_DEFAULT_FUNCTION_TEMPLATE_ARGS
|
||||
#endif
|
||||
|
||||
#if !(__has_feature(cxx_defaulted_functions))
|
||||
#define _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
#endif // !(__has_feature(cxx_defaulted_functions))
|
||||
|
||||
#if !(__has_feature(cxx_deleted_functions))
|
||||
#define _LIBCPP_HAS_NO_DELETED_FUNCTIONS
|
||||
#endif // !(__has_feature(cxx_deleted_functions))
|
||||
@ -350,33 +270,25 @@ typedef __char32_t char32_t;
|
||||
#endif
|
||||
|
||||
#if !(__has_feature(cxx_nullptr))
|
||||
#define _LIBCPP_HAS_NO_NULLPTR
|
||||
# if __has_extension(cxx_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_static_assert))
|
||||
#define _LIBCPP_HAS_NO_STATIC_ASSERT
|
||||
#endif
|
||||
|
||||
#if !(__has_feature(cxx_auto_type))
|
||||
#define _LIBCPP_HAS_NO_AUTO_TYPE
|
||||
#endif
|
||||
|
||||
#if !(__has_feature(cxx_access_control_sfinae)) || !__has_feature(cxx_trailing_return)
|
||||
#define _LIBCPP_HAS_NO_ADVANCED_SFINAE
|
||||
#endif
|
||||
|
||||
#if !(__has_feature(cxx_variadic_templates))
|
||||
#define _LIBCPP_HAS_NO_VARIADICS
|
||||
#endif
|
||||
|
||||
#if !(__has_feature(cxx_trailing_return))
|
||||
#define _LIBCPP_HAS_NO_TRAILING_RETURN
|
||||
#endif
|
||||
|
||||
#if !(__has_feature(cxx_generalized_initializers))
|
||||
#define _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
||||
#endif
|
||||
@ -415,12 +327,12 @@ typedef __char32_t char32_t;
|
||||
#if defined(__FreeBSD__)
|
||||
#define _LIBCPP_HAS_QUICK_EXIT
|
||||
#define _LIBCPP_HAS_C11_FEATURES
|
||||
#elif defined(__ANDROID__)
|
||||
#elif defined(__Fuchsia__)
|
||||
#define _LIBCPP_HAS_QUICK_EXIT
|
||||
#define _LIBCPP_HAS_C11_FEATURES
|
||||
#elif defined(__linux__)
|
||||
#if !defined(_LIBCPP_HAS_MUSL_LIBC)
|
||||
# include <features.h>
|
||||
#if __GLIBC_PREREQ(2, 15)
|
||||
#if __GLIBC_PREREQ(2, 15) || defined(__BIONIC__)
|
||||
#define _LIBCPP_HAS_QUICK_EXIT
|
||||
#endif
|
||||
#if __GLIBC_PREREQ(2, 17)
|
||||
@ -504,34 +416,25 @@ namespace std {
|
||||
#endif
|
||||
|
||||
#ifndef __GXX_EXPERIMENTAL_CXX0X__
|
||||
|
||||
#define _LIBCPP_HAS_NO_ADVANCED_SFINAE
|
||||
#define _LIBCPP_HAS_NO_DECLTYPE
|
||||
#define _LIBCPP_HAS_NO_DEFAULT_FUNCTION_TEMPLATE_ARGS
|
||||
#define _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
#define _LIBCPP_HAS_NO_DELETED_FUNCTIONS
|
||||
#define _LIBCPP_HAS_NO_NULLPTR
|
||||
#define _LIBCPP_HAS_NO_STATIC_ASSERT
|
||||
#define _LIBCPP_HAS_NO_UNICODE_CHARS
|
||||
#define _LIBCPP_HAS_NO_VARIADICS
|
||||
#define _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
#define _LIBCPP_HAS_NO_STRONG_ENUMS
|
||||
#define _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#define _LIBCPP_HAS_NO_NOEXCEPT
|
||||
|
||||
#else // __GXX_EXPERIMENTAL_CXX0X__
|
||||
|
||||
#if _GNUC_VER < 403
|
||||
#define _LIBCPP_HAS_NO_DEFAULT_FUNCTION_TEMPLATE_ARGS
|
||||
#define _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
#define _LIBCPP_HAS_NO_STATIC_ASSERT
|
||||
#endif
|
||||
|
||||
|
||||
#if _GNUC_VER < 404
|
||||
#define _LIBCPP_HAS_NO_DECLTYPE
|
||||
#define _LIBCPP_HAS_NO_DELETED_FUNCTIONS
|
||||
#define _LIBCPP_HAS_NO_TRAILING_RETURN
|
||||
#define _LIBCPP_HAS_NO_UNICODE_CHARS
|
||||
#define _LIBCPP_HAS_NO_VARIADICS
|
||||
#define _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
||||
@ -540,12 +443,6 @@ namespace std {
|
||||
#if _GNUC_VER < 406
|
||||
#define _LIBCPP_HAS_NO_NOEXCEPT
|
||||
#define _LIBCPP_HAS_NO_NULLPTR
|
||||
#define _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#endif
|
||||
|
||||
#if _GNUC_VER < 407
|
||||
#define _LIBCPP_HAS_NO_ADVANCED_SFINAE
|
||||
#define _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
#endif
|
||||
|
||||
#endif // __GXX_EXPERIMENTAL_CXX0X__
|
||||
@ -566,21 +463,17 @@ using namespace _LIBCPP_NAMESPACE __attribute__((__strong__));
|
||||
|
||||
#elif defined(_LIBCPP_MSVC)
|
||||
|
||||
#define _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#define _LIBCPP_HAS_NO_CONSTEXPR
|
||||
#define _LIBCPP_HAS_NO_CXX14_CONSTEXPR
|
||||
#define _LIBCPP_HAS_NO_VARIABLE_TEMPLATES
|
||||
#define _LIBCPP_HAS_NO_UNICODE_CHARS
|
||||
#define _LIBCPP_HAS_NO_DELETED_FUNCTIONS
|
||||
#define _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
#define _LIBCPP_HAS_NO_NOEXCEPT
|
||||
#define __alignof__ __alignof
|
||||
#define _LIBCPP_NORETURN __declspec(noreturn)
|
||||
#define _ALIGNAS(x) __declspec(align(x))
|
||||
#define _LIBCPP_HAS_NO_VARIADICS
|
||||
|
||||
|
||||
|
||||
#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std {
|
||||
#define _LIBCPP_END_NAMESPACE_STD }
|
||||
#define _VSTD std
|
||||
@ -598,9 +491,6 @@ namespace std {
|
||||
#define _ATTRIBUTE(x) __attribute__((x))
|
||||
#define _LIBCPP_NORETURN __attribute__((noreturn))
|
||||
|
||||
#define _LIBCPP_HAS_NO_DEFAULT_FUNCTION_TEMPLATE_ARGS
|
||||
#define _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#define _LIBCPP_HAS_NO_ADVANCED_SFINAE
|
||||
#define _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
||||
#define _LIBCPP_HAS_NO_NOEXCEPT
|
||||
#define _LIBCPP_HAS_NO_NULLPTR
|
||||
@ -626,6 +516,141 @@ namespace std {
|
||||
|
||||
#endif // __clang__ || __GNUC__ || _MSC_VER || __IBMCPP__
|
||||
|
||||
|
||||
#ifdef _WIN32
|
||||
#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
|
||||
#elif defined(_LIBCPP_BUILDING_LIBRARY)
|
||||
# define _LIBCPP_DLL_VIS __declspec(dllexport)
|
||||
# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
|
||||
# define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS _LIBCPP_DLL_VIS
|
||||
# define _LIBCPP_OVERRIDABLE_FUNC_VIS _LIBCPP_DLL_VIS
|
||||
#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
|
||||
#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_TYPE_VIS_ONLY
|
||||
#define _LIBCPP_FUNC_VIS_ONLY
|
||||
#define _LIBCPP_ENUM_VIS
|
||||
#if defined(_LIBCPP_MSVC)
|
||||
# define _LIBCPP_INLINE_VISIBILITY __forceinline
|
||||
# define _LIBCPP_ALWAYS_INLINE __forceinline
|
||||
# define _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY __forceinline
|
||||
#else
|
||||
# define _LIBCPP_INLINE_VISIBILITY __attribute__ ((__always_inline__))
|
||||
# define _LIBCPP_ALWAYS_INLINE __attribute__ ((__always_inline__))
|
||||
# define _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY __attribute__ ((__always_inline__))
|
||||
#endif
|
||||
#endif // _WIN32
|
||||
|
||||
#ifndef _LIBCPP_HIDDEN
|
||||
#if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
|
||||
#define _LIBCPP_HIDDEN __attribute__ ((__visibility__("hidden")))
|
||||
#else
|
||||
#define _LIBCPP_HIDDEN
|
||||
#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)
|
||||
# if __has_attribute(__type_visibility__)
|
||||
# define _LIBCPP_TYPE_VIS __attribute__ ((__type_visibility__("default")))
|
||||
# else
|
||||
# define _LIBCPP_TYPE_VIS __attribute__ ((__visibility__("default")))
|
||||
# endif
|
||||
# else
|
||||
# define _LIBCPP_TYPE_VIS
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_TYPE_VIS_ONLY
|
||||
# define _LIBCPP_TYPE_VIS_ONLY _LIBCPP_TYPE_VIS
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_FUNC_VIS_ONLY
|
||||
# define _LIBCPP_FUNC_VIS_ONLY _LIBCPP_FUNC_VIS
|
||||
#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__ ((__type_visibility__("default")))
|
||||
# else
|
||||
# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS
|
||||
# define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_INLINE_VISIBILITY
|
||||
#if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
|
||||
#define _LIBCPP_INLINE_VISIBILITY __attribute__ ((__visibility__("hidden"), __always_inline__))
|
||||
#else
|
||||
#define _LIBCPP_INLINE_VISIBILITY __attribute__ ((__always_inline__))
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_ALWAYS_INLINE
|
||||
#if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
|
||||
#define _LIBCPP_ALWAYS_INLINE __attribute__ ((__visibility__("hidden"), __always_inline__))
|
||||
#else
|
||||
#define _LIBCPP_ALWAYS_INLINE __attribute__ ((__always_inline__))
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
|
||||
# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
|
||||
# define _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY __attribute__((__visibility__("default"), __always_inline__))
|
||||
# else
|
||||
# define _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY __attribute__((__always_inline__))
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#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)
|
||||
@ -634,6 +659,17 @@ namespace std {
|
||||
# define _NOEXCEPT_(x)
|
||||
#endif
|
||||
|
||||
#if defined(_LIBCPP_DEBUG_USE_EXCEPTIONS)
|
||||
# if !defined(_LIBCPP_DEBUG)
|
||||
# error cannot use _LIBCPP_DEBUG_USE_EXCEPTIONS unless _LIBCPP_DEBUG is defined
|
||||
# endif
|
||||
# define _NOEXCEPT_DEBUG noexcept(false)
|
||||
# define _NOEXCEPT_DEBUG_(x) noexcept(false)
|
||||
#else
|
||||
# define _NOEXCEPT_DEBUG _NOEXCEPT
|
||||
# define _NOEXCEPT_DEBUG_(x) _NOEXCEPT_(x)
|
||||
#endif
|
||||
|
||||
#ifdef _LIBCPP_HAS_NO_UNICODE_CHARS
|
||||
typedef unsigned short char16_t;
|
||||
typedef unsigned int char32_t;
|
||||
@ -643,8 +679,10 @@ typedef unsigned int char32_t;
|
||||
#define _LIBCPP_HAS_NO_INT128
|
||||
#endif
|
||||
|
||||
#ifdef _LIBCPP_HAS_NO_STATIC_ASSERT
|
||||
|
||||
#ifdef _LIBCPP_CXX03_LANG
|
||||
# if __has_extension(c_static_assert)
|
||||
# define static_assert(__b, __m) _Static_assert(__b, __m)
|
||||
# else
|
||||
extern "C++" {
|
||||
template <bool> struct __static_assert_test;
|
||||
template <> struct __static_assert_test<true> {};
|
||||
@ -653,8 +691,8 @@ template <unsigned> struct __static_assert_check {};
|
||||
#define static_assert(__b, __m) \
|
||||
typedef __static_assert_check<sizeof(__static_assert_test<(__b)>)> \
|
||||
_LIBCPP_CONCAT(__t, __LINE__)
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_STATIC_ASSERT
|
||||
# endif // __has_extension(c_static_assert)
|
||||
#endif // _LIBCPP_CXX03_LANG
|
||||
|
||||
#ifdef _LIBCPP_HAS_NO_DECLTYPE
|
||||
// GCC 4.6 provides __decltype in all standard modes.
|
||||
@ -671,7 +709,7 @@ template <unsigned> struct __static_assert_check {};
|
||||
#define _LIBCPP_CONSTEXPR constexpr
|
||||
#endif
|
||||
|
||||
#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
#ifdef _LIBCPP_CXX03_LANG
|
||||
#define _LIBCPP_DEFAULT {}
|
||||
#else
|
||||
#define _LIBCPP_DEFAULT = default;
|
||||
@ -689,7 +727,8 @@ template <unsigned> struct __static_assert_check {};
|
||||
#define _NOALIAS
|
||||
#endif
|
||||
|
||||
#if __has_feature(cxx_explicit_conversions) || defined(__IBMCPP__)
|
||||
#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
|
||||
@ -708,7 +747,7 @@ template <unsigned> struct __static_assert_check {};
|
||||
_LIBCPP_ALWAYS_INLINE operator int() const {return __v_;} \
|
||||
};
|
||||
#else // _LIBCPP_HAS_NO_STRONG_ENUMS
|
||||
#define _LIBCPP_DECLARE_STRONG_ENUM(x) enum class _LIBCPP_TYPE_VIS x
|
||||
#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
|
||||
|
||||
@ -742,7 +781,7 @@ template <unsigned> struct __static_assert_check {};
|
||||
|
||||
#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__))
|
||||
// Most unix variants have catopen. These are the specific ones that don't.
|
||||
#if !defined(_WIN32) && !defined(__ANDROID__) && !defined(_NEWLIB_VERSION)
|
||||
#if !defined(_WIN32) && !defined(__BIONIC__) && !defined(_NEWLIB_VERSION)
|
||||
#define _LIBCPP_HAS_CATOPEN 1
|
||||
#endif
|
||||
#endif
|
||||
@ -795,6 +834,11 @@ template <unsigned> struct __static_assert_check {};
|
||||
#define _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
#endif
|
||||
|
||||
// FIXME: Remove all usages of this macro once compilers catch up.
|
||||
#if !defined(__cpp_inline_variables) || (__cpp_inline_variables < 201606L)
|
||||
# define _LIBCPP_HAS_NO_INLINE_VARIABLES
|
||||
#endif
|
||||
|
||||
#ifdef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
# define _LIBCPP_EXPLICIT_MOVE(x) _VSTD::move(x)
|
||||
#else
|
||||
@ -802,7 +846,7 @@ template <unsigned> struct __static_assert_check {};
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_ASAN
|
||||
extern "C" void __sanitizer_annotate_contiguous_container(
|
||||
_LIBCPP_FUNC_VIS extern "C" void __sanitizer_annotate_contiguous_container(
|
||||
const void *, const void *, const void *, const void *);
|
||||
#endif
|
||||
|
||||
@ -823,8 +867,11 @@ extern "C" void __sanitizer_annotate_contiguous_container(
|
||||
#endif
|
||||
|
||||
// Thread API
|
||||
#if !defined(_LIBCPP_HAS_NO_THREADS) && !defined(_LIBCPP_HAS_THREAD_API_PTHREAD)
|
||||
#if !defined(_LIBCPP_HAS_NO_THREADS) && \
|
||||
!defined(_LIBCPP_HAS_THREAD_API_PTHREAD) && \
|
||||
!defined(_LIBCPP_HAS_THREAD_API_EXTERNAL)
|
||||
# if defined(__FreeBSD__) || \
|
||||
defined(__Fuchsia__) || \
|
||||
defined(__NetBSD__) || \
|
||||
defined(__linux__) || \
|
||||
defined(__APPLE__) || \
|
||||
@ -841,6 +888,11 @@ extern "C" void __sanitizer_annotate_contiguous_container(
|
||||
_LIBCPP_HAS_NO_THREADS is not defined.
|
||||
#endif
|
||||
|
||||
#if defined(_LIBCPP_HAS_NO_THREADS) && defined(_LIBCPP_HAS_THREAD_API_EXTERNAL)
|
||||
# error _LIBCPP_HAS_EXTERNAL_THREAD_API 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.
|
||||
@ -861,11 +913,12 @@ extern "C" void __sanitizer_annotate_contiguous_container(
|
||||
#define _LIBCPP_HAS_NO_STDOUT
|
||||
#endif
|
||||
|
||||
#if defined(__ANDROID__) || defined(__CloudABI__) || defined(_LIBCPP_HAS_MUSL_LIBC)
|
||||
#if defined(__BIONIC__) || defined(__CloudABI__) || \
|
||||
defined(_LIBCPP_HAS_MUSL_LIBC)
|
||||
#define _LIBCPP_PROVIDES_DEFAULT_RUNE_TABLE
|
||||
#endif
|
||||
|
||||
// Thread-unsafe functions such as strtok(), mbtowc() and localtime()
|
||||
// Thread-unsafe functions such as strtok() and localtime()
|
||||
// are not available.
|
||||
#ifdef __CloudABI__
|
||||
#define _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS
|
||||
@ -886,19 +939,27 @@ extern "C" void __sanitizer_annotate_contiguous_container(
|
||||
#define _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
|
||||
#endif
|
||||
|
||||
#if __cplusplus < 201103L
|
||||
#define _LIBCPP_CXX03_LANG
|
||||
#else
|
||||
#if defined(_LIBCPP_HAS_NO_VARIADIC_TEMPLATES) || defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES)
|
||||
#error Libc++ requires a feature complete C++11 compiler in C++11 or greater.
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if (defined(_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS) && defined(__clang__) \
|
||||
&& __has_attribute(acquire_capability))
|
||||
#define _LIBCPP_HAS_THREAD_SAFETY_ANNOTATIONS
|
||||
#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 !defined(_LIBCPP_HAS_NO_OFF_T_FUNCTIONS)
|
||||
#if defined(_WIN32) || defined(_NEWLIB_VERSION)
|
||||
#define _LIBCPP_HAS_NO_OFF_T_FUNCTIONS
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif // __cplusplus
|
||||
|
||||
#endif // _LIBCPP_CONFIG
|
||||
|
@ -20,5 +20,7 @@
|
||||
#cmakedefine _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS
|
||||
#cmakedefine _LIBCPP_HAS_MUSL_LIBC
|
||||
#cmakedefine _LIBCPP_HAS_THREAD_API_PTHREAD
|
||||
#cmakedefine _LIBCPP_HAS_THREAD_API_EXTERNAL
|
||||
#cmakedefine _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS
|
||||
|
||||
#endif // _LIBCPP_CONFIG_SITE
|
||||
|
102
include/__debug
102
include/__debug
@ -17,23 +17,103 @@
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 1
|
||||
#if defined(_LIBCPP_HAS_NO_NULLPTR)
|
||||
# include <cstddef>
|
||||
#endif
|
||||
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 1 || defined(_LIBCPP_BUILDING_LIBRARY)
|
||||
# include <cstdlib>
|
||||
# include <cstdio>
|
||||
# include <cstddef>
|
||||
# ifndef _LIBCPP_ASSERT
|
||||
# define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : (_VSTD::fprintf(stderr, "%s\n", m), _VSTD::abort()))
|
||||
# endif
|
||||
# include <exception>
|
||||
#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
|
||||
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
#if _LIBCPP_DEBUG_LEVEL < 1
|
||||
class _LIBCPP_EXCEPTION_ABI __libcpp_debug_exception;
|
||||
#endif
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
struct _LIBCPP_TYPE_VIS_ONLY __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) {}
|
||||
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_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_throw_debug_function - A debug handler that throws
|
||||
/// an instance of __libcpp_debug_exception when called.
|
||||
_LIBCPP_NORETURN _LIBCPP_FUNC_VIS
|
||||
void __libcpp_throw_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);
|
||||
|
||||
// Setup the throwing debug handler during dynamic initialization.
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 1 && defined(_LIBCPP_DEBUG_USE_EXCEPTIONS)
|
||||
# if defined(_LIBCPP_NO_EXCEPTIONS)
|
||||
# error _LIBCPP_DEBUG_USE_EXCEPTIONS cannot be used when exceptions are disabled.
|
||||
# endif
|
||||
static bool __init_dummy = __libcpp_set_debug_function(__libcpp_throw_debug_function);
|
||||
#endif
|
||||
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 1 || defined(_LIBCPP_BUILDING_LIBRARY)
|
||||
class _LIBCPP_EXCEPTION_ABI __libcpp_debug_exception : public exception {
|
||||
public:
|
||||
__libcpp_debug_exception() _NOEXCEPT;
|
||||
explicit __libcpp_debug_exception(__libcpp_debug_info const& __i);
|
||||
__libcpp_debug_exception(__libcpp_debug_exception const&);
|
||||
~__libcpp_debug_exception() _NOEXCEPT;
|
||||
const char* what() const _NOEXCEPT;
|
||||
private:
|
||||
struct __libcpp_debug_exception_imp;
|
||||
__libcpp_debug_exception_imp *__imp_;
|
||||
};
|
||||
#endif
|
||||
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2 || defined(_LIBCPP_BUILDING_LIBRARY)
|
||||
|
||||
struct _LIBCPP_TYPE_VIS __c_node;
|
||||
|
||||
struct _LIBCPP_TYPE_VIS __i_node
|
||||
@ -102,7 +182,7 @@ struct _C_node
|
||||
};
|
||||
|
||||
template <class _Cont>
|
||||
bool
|
||||
inline bool
|
||||
_C_node<_Cont>::__dereferenceable(const void* __i) const
|
||||
{
|
||||
typedef typename _Cont::const_iterator iterator;
|
||||
@ -112,7 +192,7 @@ _C_node<_Cont>::__dereferenceable(const void* __i) const
|
||||
}
|
||||
|
||||
template <class _Cont>
|
||||
bool
|
||||
inline bool
|
||||
_C_node<_Cont>::__decrementable(const void* __i) const
|
||||
{
|
||||
typedef typename _Cont::const_iterator iterator;
|
||||
@ -122,7 +202,7 @@ _C_node<_Cont>::__decrementable(const void* __i) const
|
||||
}
|
||||
|
||||
template <class _Cont>
|
||||
bool
|
||||
inline bool
|
||||
_C_node<_Cont>::__addable(const void* __i, ptrdiff_t __n) const
|
||||
{
|
||||
typedef typename _Cont::const_iterator iterator;
|
||||
@ -132,7 +212,7 @@ _C_node<_Cont>::__addable(const void* __i, ptrdiff_t __n) const
|
||||
}
|
||||
|
||||
template <class _Cont>
|
||||
bool
|
||||
inline bool
|
||||
_C_node<_Cont>::__subscriptable(const void* __i, ptrdiff_t __n) const
|
||||
{
|
||||
typedef typename _Cont::const_iterator iterator;
|
||||
@ -214,9 +294,9 @@ _LIBCPP_FUNC_VIS __libcpp_db* __get_db();
|
||||
_LIBCPP_FUNC_VIS const __libcpp_db* __get_const_db();
|
||||
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
#endif // _LIBCPP_DEBUG_LEVEL >= 2 || defined(_LIBCPP_BUILDING_LIBRARY)
|
||||
|
||||
#endif
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP_DEBUG_H
|
||||
|
||||
|
@ -642,6 +642,8 @@ template<class _Rp>
|
||||
void
|
||||
function<_Rp()>::swap(function& __f)
|
||||
{
|
||||
if (_VSTD::addressof(__f) == this)
|
||||
return;
|
||||
if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_)
|
||||
{
|
||||
typename aligned_storage<sizeof(__buf_)>::type __tempbuf;
|
||||
@ -679,10 +681,8 @@ template<class _Rp>
|
||||
_Rp
|
||||
function<_Rp()>::operator()() const
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
if (__f_ == 0)
|
||||
throw bad_function_call();
|
||||
#endif // _LIBCPP_NO_EXCEPTIONS
|
||||
__throw_bad_function_call();
|
||||
return (*__f_)();
|
||||
}
|
||||
|
||||
@ -918,6 +918,8 @@ template<class _Rp, class _A0>
|
||||
void
|
||||
function<_Rp(_A0)>::swap(function& __f)
|
||||
{
|
||||
if (_VSTD::addressof(__f) == this)
|
||||
return;
|
||||
if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_)
|
||||
{
|
||||
typename aligned_storage<sizeof(__buf_)>::type __tempbuf;
|
||||
@ -955,10 +957,8 @@ template<class _Rp, class _A0>
|
||||
_Rp
|
||||
function<_Rp(_A0)>::operator()(_A0 __a0) const
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
if (__f_ == 0)
|
||||
throw bad_function_call();
|
||||
#endif // _LIBCPP_NO_EXCEPTIONS
|
||||
__throw_bad_function_call();
|
||||
return (*__f_)(__a0);
|
||||
}
|
||||
|
||||
@ -1194,6 +1194,8 @@ template<class _Rp, class _A0, class _A1>
|
||||
void
|
||||
function<_Rp(_A0, _A1)>::swap(function& __f)
|
||||
{
|
||||
if (_VSTD::addressof(__f) == this)
|
||||
return;
|
||||
if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_)
|
||||
{
|
||||
typename aligned_storage<sizeof(__buf_)>::type __tempbuf;
|
||||
@ -1231,10 +1233,8 @@ template<class _Rp, class _A0, class _A1>
|
||||
_Rp
|
||||
function<_Rp(_A0, _A1)>::operator()(_A0 __a0, _A1 __a1) const
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
if (__f_ == 0)
|
||||
throw bad_function_call();
|
||||
#endif // _LIBCPP_NO_EXCEPTIONS
|
||||
__throw_bad_function_call();
|
||||
return (*__f_)(__a0, __a1);
|
||||
}
|
||||
|
||||
@ -1470,6 +1470,8 @@ template<class _Rp, class _A0, class _A1, class _A2>
|
||||
void
|
||||
function<_Rp(_A0, _A1, _A2)>::swap(function& __f)
|
||||
{
|
||||
if (_VSTD::addressof(__f) == this)
|
||||
return;
|
||||
if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_)
|
||||
{
|
||||
typename aligned_storage<sizeof(__buf_)>::type __tempbuf;
|
||||
@ -1507,10 +1509,8 @@ template<class _Rp, class _A0, class _A1, class _A2>
|
||||
_Rp
|
||||
function<_Rp(_A0, _A1, _A2)>::operator()(_A0 __a0, _A1 __a1, _A2 __a2) const
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
if (__f_ == 0)
|
||||
throw bad_function_call();
|
||||
#endif // _LIBCPP_NO_EXCEPTIONS
|
||||
__throw_bad_function_call();
|
||||
return (*__f_)(__a0, __a1, __a2);
|
||||
}
|
||||
|
||||
|
@ -625,6 +625,11 @@ struct _LIBCPP_TYPE_VIS_ONLY uses_allocator
|
||||
{
|
||||
};
|
||||
|
||||
#if _LIBCPP_STD_VER > 14
|
||||
template <class _Tp, class _Alloc>
|
||||
constexpr size_t uses_allocator_v = uses_allocator<_Tp, _Alloc>::value;
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
||||
|
||||
// allocator construction
|
||||
@ -632,7 +637,8 @@ struct _LIBCPP_TYPE_VIS_ONLY uses_allocator
|
||||
template <class _Tp, class _Alloc, class ..._Args>
|
||||
struct __uses_alloc_ctor_imp
|
||||
{
|
||||
static const bool __ua = uses_allocator<_Tp, _Alloc>::value;
|
||||
typedef 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;
|
||||
@ -650,6 +656,7 @@ void __user_alloc_construct_impl (integral_constant<int, 0>, _Tp *__storage, con
|
||||
new (__storage) _Tp (_VSTD::forward<_Args>(__args)...);
|
||||
}
|
||||
|
||||
// FIXME: This should have a version which takes a non-const alloc.
|
||||
template <class _Tp, class _Allocator, class... _Args>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void __user_alloc_construct_impl (integral_constant<int, 1>, _Tp *__storage, const _Allocator &__a, _Args &&... __args )
|
||||
@ -657,6 +664,7 @@ void __user_alloc_construct_impl (integral_constant<int, 1>, _Tp *__storage, con
|
||||
new (__storage) _Tp (allocator_arg, __a, _VSTD::forward<_Args>(__args)...);
|
||||
}
|
||||
|
||||
// FIXME: This should have a version which takes a non-const alloc.
|
||||
template <class _Tp, class _Allocator, class... _Args>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void __user_alloc_construct_impl (integral_constant<int, 2>, _Tp *__storage, const _Allocator &__a, _Args &&... __args )
|
||||
@ -664,6 +672,7 @@ void __user_alloc_construct_impl (integral_constant<int, 2>, _Tp *__storage, con
|
||||
new (__storage) _Tp (_VSTD::forward<_Args>(__args)..., __a);
|
||||
}
|
||||
|
||||
// FIXME: Theis should have a version which takes a non-const alloc.
|
||||
template <class _Tp, class _Allocator, class... _Args>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void __user_alloc_construct (_Tp *__storage, const _Allocator &__a, _Args &&... __args)
|
||||
|
File diff suppressed because it is too large
Load Diff
1
include/__libcpp_version
Normal file
1
include/__libcpp_version
Normal file
@ -0,0 +1 @@
|
||||
4000
|
@ -165,10 +165,9 @@ template <class _Facet>
|
||||
locale
|
||||
locale::combine(const locale& __other) const
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
if (!_VSTD::has_facet<_Facet>(__other))
|
||||
throw runtime_error("locale::combine: locale missing facet");
|
||||
#endif // _LIBCPP_NO_EXCEPTIONS
|
||||
__throw_runtime_error("locale::combine: locale missing facet");
|
||||
|
||||
return locale(*this, &const_cast<_Facet&>(_VSTD::use_facet<_Facet>(__other)));
|
||||
}
|
||||
|
||||
@ -270,8 +269,8 @@ collate<_CharT>::do_hash(const char_type* __lo, const char_type* __hi) const
|
||||
return static_cast<long>(__h);
|
||||
}
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS collate<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS collate<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS collate<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS collate<wchar_t>)
|
||||
|
||||
// template <class CharT> class collate_byname;
|
||||
|
||||
@ -1179,12 +1178,12 @@ codecvt_byname<_InternT, _ExternT, _StateT>::~codecvt_byname()
|
||||
{
|
||||
}
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS codecvt_byname<char, char, mbstate_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS codecvt_byname<wchar_t, char, mbstate_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS codecvt_byname<char16_t, char, mbstate_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS codecvt_byname<char32_t, char, mbstate_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char, char, mbstate_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<wchar_t, char, mbstate_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char16_t, char, mbstate_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char32_t, char, mbstate_t>)
|
||||
|
||||
_LIBCPP_FUNC_VIS void __throw_runtime_error(const char*);
|
||||
_LIBCPP_NORETURN _LIBCPP_FUNC_VIS void __throw_runtime_error(const char*);
|
||||
|
||||
template <size_t _Np>
|
||||
struct __narrow_to_utf8
|
||||
|
@ -43,7 +43,7 @@ class _LIBCPP_TYPE_VIS _LIBCPP_THREAD_SAFETY_ANNOTATION(capability("mutex")) mut
|
||||
public:
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
#ifndef _LIBCPP_HAS_NO_CONSTEXPR
|
||||
constexpr mutex() _NOEXCEPT _LIBCPP_DEFAULT
|
||||
constexpr mutex() _NOEXCEPT = default;
|
||||
#else
|
||||
mutex() _NOEXCEPT {__m_ = (__libcpp_mutex_t)_LIBCPP_MUTEX_INITIALIZER;}
|
||||
#endif
|
||||
@ -300,7 +300,7 @@ class _LIBCPP_TYPE_VIS condition_variable
|
||||
public:
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
#ifndef _LIBCPP_HAS_NO_CONSTEXPR
|
||||
constexpr condition_variable() _NOEXCEPT _LIBCPP_DEFAULT
|
||||
constexpr condition_variable() _NOEXCEPT = default;
|
||||
#else
|
||||
condition_variable() _NOEXCEPT {__cv_ = (__libcpp_condvar_t)_LIBCPP_CONDVAR_INITIALIZER;}
|
||||
#endif
|
||||
|
@ -42,10 +42,6 @@ struct _LIBCPP_TYPE_VIS_ONLY nullptr_t
|
||||
|
||||
friend _LIBCPP_ALWAYS_INLINE _LIBCPP_CONSTEXPR bool operator==(nullptr_t, nullptr_t) {return true;}
|
||||
friend _LIBCPP_ALWAYS_INLINE _LIBCPP_CONSTEXPR bool operator!=(nullptr_t, nullptr_t) {return false;}
|
||||
friend _LIBCPP_ALWAYS_INLINE _LIBCPP_CONSTEXPR bool operator<(nullptr_t, nullptr_t) {return false;}
|
||||
friend _LIBCPP_ALWAYS_INLINE _LIBCPP_CONSTEXPR bool operator<=(nullptr_t, nullptr_t) {return true;}
|
||||
friend _LIBCPP_ALWAYS_INLINE _LIBCPP_CONSTEXPR bool operator>(nullptr_t, nullptr_t) {return false;}
|
||||
friend _LIBCPP_ALWAYS_INLINE _LIBCPP_CONSTEXPR bool operator>=(nullptr_t, nullptr_t) {return true;}
|
||||
};
|
||||
|
||||
inline _LIBCPP_ALWAYS_INLINE _LIBCPP_CONSTEXPR nullptr_t __get_nullptr_t() {return nullptr_t(0);}
|
||||
|
@ -11,6 +11,7 @@
|
||||
#define _LIBCPP___REFSTRING
|
||||
|
||||
#include <__config>
|
||||
#include <stdexcept>
|
||||
#include <cstddef>
|
||||
#include <cstring>
|
||||
#ifdef __APPLE__
|
||||
@ -20,119 +21,106 @@
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
class _LIBCPP_HIDDEN __libcpp_refstring
|
||||
namespace __refstring_imp { namespace {
|
||||
typedef int count_t;
|
||||
|
||||
struct _Rep_base {
|
||||
std::size_t len;
|
||||
std::size_t cap;
|
||||
count_t count;
|
||||
};
|
||||
|
||||
inline _Rep_base* rep_from_data(const char *data_) noexcept {
|
||||
char *data = const_cast<char *>(data_);
|
||||
return reinterpret_cast<_Rep_base *>(data - sizeof(_Rep_base));
|
||||
}
|
||||
|
||||
inline char * data_from_rep(_Rep_base *rep) noexcept {
|
||||
char *data = reinterpret_cast<char *>(rep);
|
||||
return data + sizeof(*rep);
|
||||
}
|
||||
|
||||
#if defined(__APPLE__)
|
||||
inline
|
||||
const char* compute_gcc_empty_string_storage() _NOEXCEPT
|
||||
{
|
||||
private:
|
||||
const char* str_;
|
||||
void* handle = dlopen("/usr/lib/libstdc++.6.dylib", RTLD_NOLOAD);
|
||||
if (handle == nullptr)
|
||||
return nullptr;
|
||||
void* sym = dlsym(handle, "_ZNSs4_Rep20_S_empty_rep_storageE");
|
||||
if (sym == nullptr)
|
||||
return nullptr;
|
||||
return data_from_rep(reinterpret_cast<_Rep_base *>(sym));
|
||||
}
|
||||
|
||||
typedef int count_t;
|
||||
|
||||
struct _Rep_base
|
||||
{
|
||||
std::size_t len;
|
||||
std::size_t cap;
|
||||
count_t count;
|
||||
};
|
||||
|
||||
static
|
||||
_Rep_base*
|
||||
rep_from_data(const char *data_) _NOEXCEPT
|
||||
{
|
||||
char *data = const_cast<char *>(data_);
|
||||
return reinterpret_cast<_Rep_base *>(data - sizeof(_Rep_base));
|
||||
}
|
||||
static
|
||||
char *
|
||||
data_from_rep(_Rep_base *rep) _NOEXCEPT
|
||||
{
|
||||
char *data = reinterpret_cast<char *>(rep);
|
||||
return data + sizeof(*rep);
|
||||
}
|
||||
|
||||
#ifdef __APPLE__
|
||||
static
|
||||
const char*
|
||||
compute_gcc_empty_string_storage() _NOEXCEPT
|
||||
{
|
||||
void* handle = dlopen("/usr/lib/libstdc++.6.dylib", RTLD_NOLOAD);
|
||||
if (handle == nullptr)
|
||||
return nullptr;
|
||||
void* sym = dlsym(handle, "_ZNSs4_Rep20_S_empty_rep_storageE");
|
||||
if (sym == nullptr)
|
||||
return nullptr;
|
||||
return data_from_rep(reinterpret_cast<_Rep_base *>(sym));
|
||||
}
|
||||
|
||||
static
|
||||
const char*
|
||||
get_gcc_empty_string_storage() _NOEXCEPT
|
||||
{
|
||||
static const char* p = compute_gcc_empty_string_storage();
|
||||
return p;
|
||||
}
|
||||
|
||||
bool
|
||||
uses_refcount() const
|
||||
{
|
||||
return str_ != get_gcc_empty_string_storage();
|
||||
}
|
||||
#else
|
||||
bool
|
||||
uses_refcount() const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
inline
|
||||
const char*
|
||||
get_gcc_empty_string_storage() _NOEXCEPT
|
||||
{
|
||||
static const char* p = compute_gcc_empty_string_storage();
|
||||
return p;
|
||||
}
|
||||
#endif
|
||||
|
||||
public:
|
||||
explicit __libcpp_refstring(const char* msg) {
|
||||
std::size_t len = strlen(msg);
|
||||
_Rep_base* rep = static_cast<_Rep_base *>(::operator new(sizeof(*rep) + len + 1));
|
||||
rep->len = len;
|
||||
rep->cap = len;
|
||||
rep->count = 0;
|
||||
char *data = data_from_rep(rep);
|
||||
std::memcpy(data, msg, len + 1);
|
||||
str_ = data;
|
||||
}
|
||||
}} // namespace __refstring_imp
|
||||
|
||||
__libcpp_refstring(const __libcpp_refstring& s) _NOEXCEPT : str_(s.str_)
|
||||
{
|
||||
if (uses_refcount())
|
||||
__sync_add_and_fetch(&rep_from_data(str_)->count, 1);
|
||||
}
|
||||
using namespace __refstring_imp;
|
||||
|
||||
__libcpp_refstring& operator=(const __libcpp_refstring& s) _NOEXCEPT
|
||||
inline
|
||||
__libcpp_refstring::__libcpp_refstring(const char* msg) {
|
||||
std::size_t len = strlen(msg);
|
||||
_Rep_base* rep = static_cast<_Rep_base *>(::operator new(sizeof(*rep) + len + 1));
|
||||
rep->len = len;
|
||||
rep->cap = len;
|
||||
rep->count = 0;
|
||||
char *data = data_from_rep(rep);
|
||||
std::memcpy(data, msg, len + 1);
|
||||
__imp_ = data;
|
||||
}
|
||||
|
||||
inline
|
||||
__libcpp_refstring::__libcpp_refstring(const __libcpp_refstring &s) _NOEXCEPT
|
||||
: __imp_(s.__imp_)
|
||||
{
|
||||
if (__uses_refcount())
|
||||
__sync_add_and_fetch(&rep_from_data(__imp_)->count, 1);
|
||||
}
|
||||
|
||||
inline
|
||||
__libcpp_refstring& __libcpp_refstring::operator=(__libcpp_refstring const& s) _NOEXCEPT {
|
||||
bool adjust_old_count = __uses_refcount();
|
||||
struct _Rep_base *old_rep = rep_from_data(__imp_);
|
||||
__imp_ = s.__imp_;
|
||||
if (__uses_refcount())
|
||||
__sync_add_and_fetch(&rep_from_data(__imp_)->count, 1);
|
||||
if (adjust_old_count)
|
||||
{
|
||||
bool adjust_old_count = uses_refcount();
|
||||
struct _Rep_base *old_rep = rep_from_data(str_);
|
||||
str_ = s.str_;
|
||||
if (uses_refcount())
|
||||
__sync_add_and_fetch(&rep_from_data(str_)->count, 1);
|
||||
if (adjust_old_count)
|
||||
if (__sync_add_and_fetch(&old_rep->count, count_t(-1)) < 0)
|
||||
{
|
||||
if (__sync_add_and_fetch(&old_rep->count, count_t(-1)) < 0)
|
||||
{
|
||||
::operator delete(old_rep);
|
||||
}
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
~__libcpp_refstring()
|
||||
{
|
||||
if (uses_refcount())
|
||||
{
|
||||
_Rep_base* rep = rep_from_data(str_);
|
||||
if (__sync_add_and_fetch(&rep->count, count_t(-1)) < 0)
|
||||
{
|
||||
::operator delete(rep);
|
||||
}
|
||||
::operator delete(old_rep);
|
||||
}
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
const char* c_str() const _NOEXCEPT {return str_;}
|
||||
};
|
||||
inline
|
||||
__libcpp_refstring::~__libcpp_refstring() {
|
||||
if (__uses_refcount()) {
|
||||
_Rep_base* rep = rep_from_data(__imp_);
|
||||
if (__sync_add_and_fetch(&rep->count, count_t(-1)) < 0) {
|
||||
::operator delete(rep);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
inline
|
||||
bool __libcpp_refstring::__uses_refcount() const {
|
||||
#ifdef __APPLE__
|
||||
return __imp_ != get_gcc_empty_string_storage();
|
||||
#else
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
|
@ -297,7 +297,7 @@ __stdoutbuf<_CharT>::overflow(int_type __c)
|
||||
return traits_type::eof();
|
||||
if (__r == codecvt_base::partial)
|
||||
{
|
||||
pbase = (char_type*)__e;
|
||||
pbase = const_cast<char_type*>(__e);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
766
include/__string
Normal file
766
include/__string
Normal file
@ -0,0 +1,766 @@
|
||||
// -*- C++ -*-
|
||||
//===-------------------------- __string ----------------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef _LIBCPP___STRING
|
||||
#define _LIBCPP___STRING
|
||||
|
||||
/*
|
||||
string synopsis
|
||||
|
||||
namespace std
|
||||
{
|
||||
|
||||
template <class charT>
|
||||
struct char_traits
|
||||
{
|
||||
typedef charT char_type;
|
||||
typedef ... int_type;
|
||||
typedef streamoff off_type;
|
||||
typedef streampos pos_type;
|
||||
typedef mbstate_t state_type;
|
||||
|
||||
static void assign(char_type& c1, const char_type& c2) noexcept;
|
||||
static constexpr bool eq(char_type c1, char_type c2) noexcept;
|
||||
static constexpr bool lt(char_type c1, char_type c2) noexcept;
|
||||
|
||||
static int compare(const char_type* s1, const char_type* s2, size_t n);
|
||||
static size_t length(const char_type* s);
|
||||
static const char_type* find(const char_type* s, size_t n, const char_type& a);
|
||||
static char_type* move(char_type* s1, const char_type* s2, size_t n);
|
||||
static char_type* copy(char_type* s1, const char_type* s2, size_t n);
|
||||
static char_type* assign(char_type* s, size_t n, char_type a);
|
||||
|
||||
static constexpr int_type not_eof(int_type c) noexcept;
|
||||
static constexpr char_type to_char_type(int_type c) noexcept;
|
||||
static constexpr int_type to_int_type(char_type c) noexcept;
|
||||
static constexpr bool eq_int_type(int_type c1, int_type c2) noexcept;
|
||||
static constexpr int_type eof() noexcept;
|
||||
};
|
||||
|
||||
template <> struct char_traits<char>;
|
||||
template <> struct char_traits<wchar_t>;
|
||||
|
||||
} // std
|
||||
|
||||
*/
|
||||
|
||||
#include <__config>
|
||||
#include <algorithm> // for search and min
|
||||
#include <cstdio> // For EOF.
|
||||
#include <memory> // for __murmur2_or_cityhash
|
||||
|
||||
#include <__undef_min_max>
|
||||
|
||||
#include <__debug>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
// char_traits
|
||||
|
||||
template <class _CharT>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY char_traits
|
||||
{
|
||||
typedef _CharT char_type;
|
||||
typedef int int_type;
|
||||
typedef streamoff off_type;
|
||||
typedef streampos pos_type;
|
||||
typedef mbstate_t state_type;
|
||||
|
||||
static inline void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
|
||||
{__c1 = __c2;}
|
||||
static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
|
||||
{return __c1 == __c2;}
|
||||
static inline _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
|
||||
{return __c1 < __c2;}
|
||||
|
||||
static int compare(const char_type* __s1, const char_type* __s2, size_t __n);
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
static size_t length(const char_type* __s);
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
static const char_type* find(const char_type* __s, size_t __n, const char_type& __a);
|
||||
static char_type* move(char_type* __s1, const char_type* __s2, size_t __n);
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n);
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
static char_type* assign(char_type* __s, size_t __n, char_type __a);
|
||||
|
||||
static inline _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
|
||||
{return eq_int_type(__c, eof()) ? ~eof() : __c;}
|
||||
static inline _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
|
||||
{return char_type(__c);}
|
||||
static inline _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
|
||||
{return int_type(__c);}
|
||||
static inline _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
|
||||
{return __c1 == __c2;}
|
||||
static inline _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
|
||||
{return int_type(EOF);}
|
||||
};
|
||||
|
||||
template <class _CharT>
|
||||
int
|
||||
char_traits<_CharT>::compare(const char_type* __s1, const char_type* __s2, size_t __n)
|
||||
{
|
||||
for (; __n; --__n, ++__s1, ++__s2)
|
||||
{
|
||||
if (lt(*__s1, *__s2))
|
||||
return -1;
|
||||
if (lt(*__s2, *__s1))
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
template <class _CharT>
|
||||
inline
|
||||
size_t
|
||||
char_traits<_CharT>::length(const char_type* __s)
|
||||
{
|
||||
size_t __len = 0;
|
||||
for (; !eq(*__s, char_type(0)); ++__s)
|
||||
++__len;
|
||||
return __len;
|
||||
}
|
||||
|
||||
template <class _CharT>
|
||||
inline
|
||||
const _CharT*
|
||||
char_traits<_CharT>::find(const char_type* __s, size_t __n, const char_type& __a)
|
||||
{
|
||||
for (; __n; --__n)
|
||||
{
|
||||
if (eq(*__s, __a))
|
||||
return __s;
|
||||
++__s;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
template <class _CharT>
|
||||
_CharT*
|
||||
char_traits<_CharT>::move(char_type* __s1, const char_type* __s2, size_t __n)
|
||||
{
|
||||
char_type* __r = __s1;
|
||||
if (__s1 < __s2)
|
||||
{
|
||||
for (; __n; --__n, ++__s1, ++__s2)
|
||||
assign(*__s1, *__s2);
|
||||
}
|
||||
else if (__s2 < __s1)
|
||||
{
|
||||
__s1 += __n;
|
||||
__s2 += __n;
|
||||
for (; __n; --__n)
|
||||
assign(*--__s1, *--__s2);
|
||||
}
|
||||
return __r;
|
||||
}
|
||||
|
||||
template <class _CharT>
|
||||
inline
|
||||
_CharT*
|
||||
char_traits<_CharT>::copy(char_type* __s1, const char_type* __s2, size_t __n)
|
||||
{
|
||||
_LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
|
||||
char_type* __r = __s1;
|
||||
for (; __n; --__n, ++__s1, ++__s2)
|
||||
assign(*__s1, *__s2);
|
||||
return __r;
|
||||
}
|
||||
|
||||
template <class _CharT>
|
||||
inline
|
||||
_CharT*
|
||||
char_traits<_CharT>::assign(char_type* __s, size_t __n, char_type __a)
|
||||
{
|
||||
char_type* __r = __s;
|
||||
for (; __n; --__n, ++__s)
|
||||
assign(*__s, __a);
|
||||
return __r;
|
||||
}
|
||||
|
||||
// char_traits<char>
|
||||
|
||||
template <>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY char_traits<char>
|
||||
{
|
||||
typedef char char_type;
|
||||
typedef int int_type;
|
||||
typedef streamoff off_type;
|
||||
typedef streampos pos_type;
|
||||
typedef mbstate_t state_type;
|
||||
|
||||
static inline void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
|
||||
{__c1 = __c2;}
|
||||
static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
|
||||
{return __c1 == __c2;}
|
||||
static inline _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
|
||||
{return (unsigned char)__c1 < (unsigned char)__c2;}
|
||||
|
||||
static inline int compare(const char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT
|
||||
{return __n == 0 ? 0 : memcmp(__s1, __s2, __n);}
|
||||
static inline size_t length(const char_type* __s) _NOEXCEPT {return strlen(__s);}
|
||||
static inline const char_type* find(const char_type* __s, size_t __n, const char_type& __a) _NOEXCEPT
|
||||
{return __n == 0 ? NULL : (const char_type*) memchr(__s, to_int_type(__a), __n);}
|
||||
static inline char_type* move(char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT
|
||||
{return __n == 0 ? __s1 : (char_type*) memmove(__s1, __s2, __n);}
|
||||
static inline char_type* copy(char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT
|
||||
{
|
||||
_LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
|
||||
return __n == 0 ? __s1 : (char_type*)memcpy(__s1, __s2, __n);
|
||||
}
|
||||
static inline char_type* assign(char_type* __s, size_t __n, char_type __a) _NOEXCEPT
|
||||
{return __n == 0 ? __s : (char_type*)memset(__s, to_int_type(__a), __n);}
|
||||
|
||||
static inline _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
|
||||
{return eq_int_type(__c, eof()) ? ~eof() : __c;}
|
||||
static inline _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
|
||||
{return char_type(__c);}
|
||||
static inline _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
|
||||
{return int_type((unsigned char)__c);}
|
||||
static inline _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
|
||||
{return __c1 == __c2;}
|
||||
static inline _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
|
||||
{return int_type(EOF);}
|
||||
};
|
||||
|
||||
// char_traits<wchar_t>
|
||||
|
||||
template <>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY char_traits<wchar_t>
|
||||
{
|
||||
typedef wchar_t char_type;
|
||||
typedef wint_t int_type;
|
||||
typedef streamoff off_type;
|
||||
typedef streampos pos_type;
|
||||
typedef mbstate_t state_type;
|
||||
|
||||
static inline void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
|
||||
{__c1 = __c2;}
|
||||
static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
|
||||
{return __c1 == __c2;}
|
||||
static inline _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
|
||||
{return __c1 < __c2;}
|
||||
|
||||
static inline int compare(const char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT
|
||||
{return __n == 0 ? 0 : wmemcmp(__s1, __s2, __n);}
|
||||
static inline size_t length(const char_type* __s) _NOEXCEPT
|
||||
{return wcslen(__s);}
|
||||
static inline const char_type* find(const char_type* __s, size_t __n, const char_type& __a) _NOEXCEPT
|
||||
{return __n == 0 ? NULL : (const char_type*)wmemchr(__s, __a, __n);}
|
||||
static inline char_type* move(char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT
|
||||
{return __n == 0 ? __s1 : (char_type*)wmemmove(__s1, __s2, __n);}
|
||||
static inline char_type* copy(char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT
|
||||
{
|
||||
_LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
|
||||
return __n == 0 ? __s1 : (char_type*)wmemcpy(__s1, __s2, __n);
|
||||
}
|
||||
static inline char_type* assign(char_type* __s, size_t __n, char_type __a) _NOEXCEPT
|
||||
{return __n == 0 ? __s : (char_type*)wmemset(__s, __a, __n);}
|
||||
|
||||
static inline _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
|
||||
{return eq_int_type(__c, eof()) ? ~eof() : __c;}
|
||||
static inline _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
|
||||
{return char_type(__c);}
|
||||
static inline _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
|
||||
{return int_type(__c);}
|
||||
static inline _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
|
||||
{return __c1 == __c2;}
|
||||
static inline _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
|
||||
{return int_type(WEOF);}
|
||||
};
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
|
||||
|
||||
template <>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY char_traits<char16_t>
|
||||
{
|
||||
typedef char16_t char_type;
|
||||
typedef uint_least16_t int_type;
|
||||
typedef streamoff off_type;
|
||||
typedef u16streampos pos_type;
|
||||
typedef mbstate_t state_type;
|
||||
|
||||
static inline void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
|
||||
{__c1 = __c2;}
|
||||
static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
|
||||
{return __c1 == __c2;}
|
||||
static inline _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
|
||||
{return __c1 < __c2;}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
static int compare(const char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT;
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
static size_t length(const char_type* __s) _NOEXCEPT;
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
static const char_type* find(const char_type* __s, size_t __n, const char_type& __a) _NOEXCEPT;
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
static char_type* move(char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT;
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT;
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
static char_type* assign(char_type* __s, size_t __n, char_type __a) _NOEXCEPT;
|
||||
|
||||
static inline _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
|
||||
{return eq_int_type(__c, eof()) ? ~eof() : __c;}
|
||||
static inline _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
|
||||
{return char_type(__c);}
|
||||
static inline _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
|
||||
{return int_type(__c);}
|
||||
static inline _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
|
||||
{return __c1 == __c2;}
|
||||
static inline _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
|
||||
{return int_type(0xFFFF);}
|
||||
};
|
||||
|
||||
inline
|
||||
int
|
||||
char_traits<char16_t>::compare(const char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT
|
||||
{
|
||||
for (; __n; --__n, ++__s1, ++__s2)
|
||||
{
|
||||
if (lt(*__s1, *__s2))
|
||||
return -1;
|
||||
if (lt(*__s2, *__s1))
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
inline
|
||||
size_t
|
||||
char_traits<char16_t>::length(const char_type* __s) _NOEXCEPT
|
||||
{
|
||||
size_t __len = 0;
|
||||
for (; !eq(*__s, char_type(0)); ++__s)
|
||||
++__len;
|
||||
return __len;
|
||||
}
|
||||
|
||||
inline
|
||||
const char16_t*
|
||||
char_traits<char16_t>::find(const char_type* __s, size_t __n, const char_type& __a) _NOEXCEPT
|
||||
{
|
||||
for (; __n; --__n)
|
||||
{
|
||||
if (eq(*__s, __a))
|
||||
return __s;
|
||||
++__s;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
inline
|
||||
char16_t*
|
||||
char_traits<char16_t>::move(char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT
|
||||
{
|
||||
char_type* __r = __s1;
|
||||
if (__s1 < __s2)
|
||||
{
|
||||
for (; __n; --__n, ++__s1, ++__s2)
|
||||
assign(*__s1, *__s2);
|
||||
}
|
||||
else if (__s2 < __s1)
|
||||
{
|
||||
__s1 += __n;
|
||||
__s2 += __n;
|
||||
for (; __n; --__n)
|
||||
assign(*--__s1, *--__s2);
|
||||
}
|
||||
return __r;
|
||||
}
|
||||
|
||||
inline
|
||||
char16_t*
|
||||
char_traits<char16_t>::copy(char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT
|
||||
{
|
||||
_LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
|
||||
char_type* __r = __s1;
|
||||
for (; __n; --__n, ++__s1, ++__s2)
|
||||
assign(*__s1, *__s2);
|
||||
return __r;
|
||||
}
|
||||
|
||||
inline
|
||||
char16_t*
|
||||
char_traits<char16_t>::assign(char_type* __s, size_t __n, char_type __a) _NOEXCEPT
|
||||
{
|
||||
char_type* __r = __s;
|
||||
for (; __n; --__n, ++__s)
|
||||
assign(*__s, __a);
|
||||
return __r;
|
||||
}
|
||||
|
||||
template <>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY char_traits<char32_t>
|
||||
{
|
||||
typedef char32_t char_type;
|
||||
typedef uint_least32_t int_type;
|
||||
typedef streamoff off_type;
|
||||
typedef u32streampos pos_type;
|
||||
typedef mbstate_t state_type;
|
||||
|
||||
static inline void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT
|
||||
{__c1 = __c2;}
|
||||
static inline _LIBCPP_CONSTEXPR bool eq(char_type __c1, char_type __c2) _NOEXCEPT
|
||||
{return __c1 == __c2;}
|
||||
static inline _LIBCPP_CONSTEXPR bool lt(char_type __c1, char_type __c2) _NOEXCEPT
|
||||
{return __c1 < __c2;}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
static int compare(const char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT;
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
static size_t length(const char_type* __s) _NOEXCEPT;
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
static const char_type* find(const char_type* __s, size_t __n, const char_type& __a) _NOEXCEPT;
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
static char_type* move(char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT;
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT;
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
static char_type* assign(char_type* __s, size_t __n, char_type __a) _NOEXCEPT;
|
||||
|
||||
static inline _LIBCPP_CONSTEXPR int_type not_eof(int_type __c) _NOEXCEPT
|
||||
{return eq_int_type(__c, eof()) ? ~eof() : __c;}
|
||||
static inline _LIBCPP_CONSTEXPR char_type to_char_type(int_type __c) _NOEXCEPT
|
||||
{return char_type(__c);}
|
||||
static inline _LIBCPP_CONSTEXPR int_type to_int_type(char_type __c) _NOEXCEPT
|
||||
{return int_type(__c);}
|
||||
static inline _LIBCPP_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT
|
||||
{return __c1 == __c2;}
|
||||
static inline _LIBCPP_CONSTEXPR int_type eof() _NOEXCEPT
|
||||
{return int_type(0xFFFFFFFF);}
|
||||
};
|
||||
|
||||
inline
|
||||
int
|
||||
char_traits<char32_t>::compare(const char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT
|
||||
{
|
||||
for (; __n; --__n, ++__s1, ++__s2)
|
||||
{
|
||||
if (lt(*__s1, *__s2))
|
||||
return -1;
|
||||
if (lt(*__s2, *__s1))
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
inline
|
||||
size_t
|
||||
char_traits<char32_t>::length(const char_type* __s) _NOEXCEPT
|
||||
{
|
||||
size_t __len = 0;
|
||||
for (; !eq(*__s, char_type(0)); ++__s)
|
||||
++__len;
|
||||
return __len;
|
||||
}
|
||||
|
||||
inline
|
||||
const char32_t*
|
||||
char_traits<char32_t>::find(const char_type* __s, size_t __n, const char_type& __a) _NOEXCEPT
|
||||
{
|
||||
for (; __n; --__n)
|
||||
{
|
||||
if (eq(*__s, __a))
|
||||
return __s;
|
||||
++__s;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
inline
|
||||
char32_t*
|
||||
char_traits<char32_t>::move(char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT
|
||||
{
|
||||
char_type* __r = __s1;
|
||||
if (__s1 < __s2)
|
||||
{
|
||||
for (; __n; --__n, ++__s1, ++__s2)
|
||||
assign(*__s1, *__s2);
|
||||
}
|
||||
else if (__s2 < __s1)
|
||||
{
|
||||
__s1 += __n;
|
||||
__s2 += __n;
|
||||
for (; __n; --__n)
|
||||
assign(*--__s1, *--__s2);
|
||||
}
|
||||
return __r;
|
||||
}
|
||||
|
||||
inline
|
||||
char32_t*
|
||||
char_traits<char32_t>::copy(char_type* __s1, const char_type* __s2, size_t __n) _NOEXCEPT
|
||||
{
|
||||
_LIBCPP_ASSERT(__s2 < __s1 || __s2 >= __s1+__n, "char_traits::copy overlapped range");
|
||||
char_type* __r = __s1;
|
||||
for (; __n; --__n, ++__s1, ++__s2)
|
||||
assign(*__s1, *__s2);
|
||||
return __r;
|
||||
}
|
||||
|
||||
inline
|
||||
char32_t*
|
||||
char_traits<char32_t>::assign(char_type* __s, size_t __n, char_type __a) _NOEXCEPT
|
||||
{
|
||||
char_type* __r = __s;
|
||||
for (; __n; --__n, ++__s)
|
||||
assign(*__s, __a);
|
||||
return __r;
|
||||
}
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
|
||||
|
||||
// helper fns for basic_string and string_view
|
||||
|
||||
// __str_find
|
||||
template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
|
||||
inline _SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
||||
__str_find(const _CharT *__p, _SizeT __sz,
|
||||
_CharT __c, _SizeT __pos) _NOEXCEPT
|
||||
{
|
||||
if (__pos >= __sz)
|
||||
return __npos;
|
||||
const _CharT* __r = _Traits::find(__p + __pos, __sz - __pos, __c);
|
||||
if (__r == 0)
|
||||
return __npos;
|
||||
return static_cast<_SizeT>(__r - __p);
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
inline _LIBCPP_CONSTEXPR_AFTER_CXX11 const _CharT *
|
||||
__search_substring(const _CharT *__first1, const _CharT *__last1,
|
||||
const _CharT *__first2, const _CharT *__last2) {
|
||||
// Take advantage of knowing source and pattern lengths.
|
||||
// Stop short when source is smaller than pattern.
|
||||
const ptrdiff_t __len2 = __last2 - __first2;
|
||||
if (__len2 == 0)
|
||||
return __first1;
|
||||
|
||||
ptrdiff_t __len1 = __last1 - __first1;
|
||||
if (__len1 < __len2)
|
||||
return __last1;
|
||||
|
||||
// First element of __first2 is loop invariant.
|
||||
_CharT __f2 = *__first2;
|
||||
while (true) {
|
||||
__len1 = __last1 - __first1;
|
||||
// Check whether __first1 still has at least __len2 bytes.
|
||||
if (__len1 < __len2)
|
||||
return __last1;
|
||||
|
||||
// Find __f2 the first byte matching in __first1.
|
||||
__first1 = _Traits::find(__first1, __len1 - __len2 + 1, __f2);
|
||||
if (__first1 == 0)
|
||||
return __last1;
|
||||
|
||||
// It is faster to compare from the first byte of __first1 even if we
|
||||
// already know that it matches the first byte of __first2: this is because
|
||||
// __first2 is most likely aligned, as it is user's "pattern" string, and
|
||||
// __first1 + 1 is most likely not aligned, as the match is in the middle of
|
||||
// the string.
|
||||
if (_Traits::compare(__first1, __first2, __len2) == 0)
|
||||
return __first1;
|
||||
|
||||
++__first1;
|
||||
}
|
||||
}
|
||||
|
||||
template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
|
||||
inline _SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
||||
__str_find(const _CharT *__p, _SizeT __sz,
|
||||
const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
|
||||
{
|
||||
if (__pos > __sz)
|
||||
return __npos;
|
||||
|
||||
if (__n == 0) // There is nothing to search, just return __pos.
|
||||
return __pos;
|
||||
|
||||
const _CharT *__r = __search_substring<_CharT, _Traits>(
|
||||
__p + __pos, __p + __sz, __s, __s + __n);
|
||||
|
||||
if (__r == __p + __sz)
|
||||
return __npos;
|
||||
return static_cast<_SizeT>(__r - __p);
|
||||
}
|
||||
|
||||
|
||||
// __str_rfind
|
||||
|
||||
template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
|
||||
inline _SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
||||
__str_rfind(const _CharT *__p, _SizeT __sz,
|
||||
_CharT __c, _SizeT __pos) _NOEXCEPT
|
||||
{
|
||||
if (__sz < 1)
|
||||
return __npos;
|
||||
if (__pos < __sz)
|
||||
++__pos;
|
||||
else
|
||||
__pos = __sz;
|
||||
for (const _CharT* __ps = __p + __pos; __ps != __p;)
|
||||
{
|
||||
if (_Traits::eq(*--__ps, __c))
|
||||
return static_cast<_SizeT>(__ps - __p);
|
||||
}
|
||||
return __npos;
|
||||
}
|
||||
|
||||
template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
|
||||
inline _SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
||||
__str_rfind(const _CharT *__p, _SizeT __sz,
|
||||
const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
|
||||
{
|
||||
__pos = _VSTD::min(__pos, __sz);
|
||||
if (__n < __sz - __pos)
|
||||
__pos += __n;
|
||||
else
|
||||
__pos = __sz;
|
||||
const _CharT* __r = _VSTD::__find_end(
|
||||
__p, __p + __pos, __s, __s + __n, _Traits::eq,
|
||||
random_access_iterator_tag(), random_access_iterator_tag());
|
||||
if (__n > 0 && __r == __p + __pos)
|
||||
return __npos;
|
||||
return static_cast<_SizeT>(__r - __p);
|
||||
}
|
||||
|
||||
// __str_find_first_of
|
||||
template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
|
||||
inline _SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
||||
__str_find_first_of(const _CharT *__p, _SizeT __sz,
|
||||
const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
|
||||
{
|
||||
if (__pos >= __sz || __n == 0)
|
||||
return __npos;
|
||||
const _CharT* __r = _VSTD::__find_first_of_ce
|
||||
(__p + __pos, __p + __sz, __s, __s + __n, _Traits::eq );
|
||||
if (__r == __p + __sz)
|
||||
return __npos;
|
||||
return static_cast<_SizeT>(__r - __p);
|
||||
}
|
||||
|
||||
|
||||
// __str_find_last_of
|
||||
template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
|
||||
inline _SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
||||
__str_find_last_of(const _CharT *__p, _SizeT __sz,
|
||||
const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
|
||||
{
|
||||
if (__n != 0)
|
||||
{
|
||||
if (__pos < __sz)
|
||||
++__pos;
|
||||
else
|
||||
__pos = __sz;
|
||||
for (const _CharT* __ps = __p + __pos; __ps != __p;)
|
||||
{
|
||||
const _CharT* __r = _Traits::find(__s, __n, *--__ps);
|
||||
if (__r)
|
||||
return static_cast<_SizeT>(__ps - __p);
|
||||
}
|
||||
}
|
||||
return __npos;
|
||||
}
|
||||
|
||||
|
||||
// __str_find_first_not_of
|
||||
template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
|
||||
inline _SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
||||
__str_find_first_not_of(const _CharT *__p, _SizeT __sz,
|
||||
const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
|
||||
{
|
||||
if (__pos < __sz)
|
||||
{
|
||||
const _CharT* __pe = __p + __sz;
|
||||
for (const _CharT* __ps = __p + __pos; __ps != __pe; ++__ps)
|
||||
if (_Traits::find(__s, __n, *__ps) == 0)
|
||||
return static_cast<_SizeT>(__ps - __p);
|
||||
}
|
||||
return __npos;
|
||||
}
|
||||
|
||||
|
||||
template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
|
||||
inline _SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
||||
__str_find_first_not_of(const _CharT *__p, _SizeT __sz,
|
||||
_CharT __c, _SizeT __pos) _NOEXCEPT
|
||||
{
|
||||
if (__pos < __sz)
|
||||
{
|
||||
const _CharT* __pe = __p + __sz;
|
||||
for (const _CharT* __ps = __p + __pos; __ps != __pe; ++__ps)
|
||||
if (!_Traits::eq(*__ps, __c))
|
||||
return static_cast<_SizeT>(__ps - __p);
|
||||
}
|
||||
return __npos;
|
||||
}
|
||||
|
||||
|
||||
// __str_find_last_not_of
|
||||
template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
|
||||
inline _SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
||||
__str_find_last_not_of(const _CharT *__p, _SizeT __sz,
|
||||
const _CharT* __s, _SizeT __pos, _SizeT __n) _NOEXCEPT
|
||||
{
|
||||
if (__pos < __sz)
|
||||
++__pos;
|
||||
else
|
||||
__pos = __sz;
|
||||
for (const _CharT* __ps = __p + __pos; __ps != __p;)
|
||||
if (_Traits::find(__s, __n, *--__ps) == 0)
|
||||
return static_cast<_SizeT>(__ps - __p);
|
||||
return __npos;
|
||||
}
|
||||
|
||||
|
||||
template<class _CharT, class _SizeT, class _Traits, _SizeT __npos>
|
||||
inline _SizeT _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
||||
__str_find_last_not_of(const _CharT *__p, _SizeT __sz,
|
||||
_CharT __c, _SizeT __pos) _NOEXCEPT
|
||||
{
|
||||
if (__pos < __sz)
|
||||
++__pos;
|
||||
else
|
||||
__pos = __sz;
|
||||
for (const _CharT* __ps = __p + __pos; __ps != __p;)
|
||||
if (!_Traits::eq(*--__ps, __c))
|
||||
return static_cast<_SizeT>(__ps - __p);
|
||||
return __npos;
|
||||
}
|
||||
|
||||
template<class _Ptr>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
size_t __do_string_hash(_Ptr __p, _Ptr __e)
|
||||
{
|
||||
typedef typename iterator_traits<_Ptr>::value_type value_type;
|
||||
return __murmur2_or_cityhash<size_t>()(__p, (__e-__p)*sizeof(value_type));
|
||||
}
|
||||
|
||||
template <class _CharT, class _Iter, class _Traits=char_traits<_CharT> >
|
||||
struct __quoted_output_proxy
|
||||
{
|
||||
_Iter __first;
|
||||
_Iter __last;
|
||||
_CharT __delim;
|
||||
_CharT __escape;
|
||||
|
||||
__quoted_output_proxy(_Iter __f, _Iter __l, _CharT __d, _CharT __e)
|
||||
: __first(__f), __last(__l), __delim(__d), __escape(__e) {}
|
||||
// This would be a nice place for a string_ref
|
||||
};
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP___STRING
|
@ -19,20 +19,91 @@
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_THREADS
|
||||
|
||||
#if defined(_LIBCPP_HAS_THREAD_API_PTHREAD)
|
||||
#ifndef __libcpp_has_include
|
||||
#ifndef __has_include
|
||||
#define __libcpp_has_include(x) 0
|
||||
#else
|
||||
#define __libcpp_has_include(x) __has_include(x)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(_LIBCPP_HAS_THREAD_API_EXTERNAL) && \
|
||||
__libcpp_has_include(<__external_threading>)
|
||||
#include <__external_threading>
|
||||
#else
|
||||
#include <pthread.h>
|
||||
#include <sched.h>
|
||||
|
||||
#if defined(_LIBCPP_HAS_THREAD_API_EXTERNAL)
|
||||
#define _LIBCPP_THREAD_ABI_VISIBILITY _LIBCPP_FUNC_VIS
|
||||
#else
|
||||
#define _LIBCPP_THREAD_ABI_VISIBILITY inline _LIBCPP_INLINE_VISIBILITY
|
||||
#endif
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
#if defined(_LIBCPP_HAS_THREAD_API_PTHREAD)
|
||||
|
||||
// Mutex
|
||||
#define _LIBCPP_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
|
||||
typedef pthread_mutex_t __libcpp_mutex_t;
|
||||
#define _LIBCPP_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
|
||||
|
||||
_LIBCPP_THREAD_ABI_VISIBILITY
|
||||
int __libcpp_recursive_mutex_init(__libcpp_mutex_t* __m);
|
||||
_LIBCPP_THREAD_ABI_VISIBILITY
|
||||
int __libcpp_mutex_lock(__libcpp_mutex_t* __m);
|
||||
_LIBCPP_THREAD_ABI_VISIBILITY
|
||||
int __libcpp_mutex_trylock(__libcpp_mutex_t* __m);
|
||||
_LIBCPP_THREAD_ABI_VISIBILITY
|
||||
int __libcpp_mutex_unlock(__libcpp_mutex_t* __m);
|
||||
_LIBCPP_THREAD_ABI_VISIBILITY
|
||||
int __libcpp_mutex_destroy(__libcpp_mutex_t* __m);
|
||||
|
||||
// Condition variable
|
||||
typedef pthread_cond_t __libcpp_condvar_t;
|
||||
#define _LIBCPP_CONDVAR_INITIALIZER PTHREAD_COND_INITIALIZER
|
||||
_LIBCPP_THREAD_ABI_VISIBILITY
|
||||
int __libcpp_condvar_signal(__libcpp_condvar_t* __cv);
|
||||
_LIBCPP_THREAD_ABI_VISIBILITY
|
||||
int __libcpp_condvar_broadcast(__libcpp_condvar_t* __cv);
|
||||
_LIBCPP_THREAD_ABI_VISIBILITY
|
||||
int __libcpp_condvar_wait(__libcpp_condvar_t* __cv, __libcpp_mutex_t* __m);
|
||||
_LIBCPP_THREAD_ABI_VISIBILITY
|
||||
int __libcpp_condvar_timedwait(__libcpp_condvar_t* __cv, __libcpp_mutex_t* __m, timespec* __ts);
|
||||
_LIBCPP_THREAD_ABI_VISIBILITY
|
||||
int __libcpp_condvar_destroy(__libcpp_condvar_t* __cv);
|
||||
|
||||
// Thread id
|
||||
typedef pthread_t __libcpp_thread_id;
|
||||
_LIBCPP_THREAD_ABI_VISIBILITY
|
||||
bool __libcpp_thread_id_equal(__libcpp_thread_id t1, __libcpp_thread_id t2);
|
||||
_LIBCPP_THREAD_ABI_VISIBILITY
|
||||
bool __libcpp_thread_id_less(__libcpp_thread_id t1, __libcpp_thread_id t2);
|
||||
|
||||
// Thread
|
||||
typedef pthread_t __libcpp_thread_t;
|
||||
_LIBCPP_THREAD_ABI_VISIBILITY
|
||||
int __libcpp_thread_create(__libcpp_thread_t* __t, void* (*__func)(void*), void* __arg);
|
||||
_LIBCPP_THREAD_ABI_VISIBILITY
|
||||
__libcpp_thread_id __libcpp_thread_get_current_id();
|
||||
_LIBCPP_THREAD_ABI_VISIBILITY
|
||||
__libcpp_thread_id __libcpp_thread_get_id(const __libcpp_thread_t* __t);
|
||||
_LIBCPP_THREAD_ABI_VISIBILITY
|
||||
int __libcpp_thread_join(__libcpp_thread_t* __t);
|
||||
_LIBCPP_THREAD_ABI_VISIBILITY
|
||||
int __libcpp_thread_detach(__libcpp_thread_t* __t);
|
||||
_LIBCPP_THREAD_ABI_VISIBILITY
|
||||
void __libcpp_thread_yield();
|
||||
|
||||
// Thread local storage
|
||||
typedef pthread_key_t __libcpp_tls_key;
|
||||
_LIBCPP_THREAD_ABI_VISIBILITY
|
||||
int __libcpp_tls_create(__libcpp_tls_key* __key, void (*__at_exit)(void*));
|
||||
_LIBCPP_THREAD_ABI_VISIBILITY
|
||||
void* __libcpp_tls_get(__libcpp_tls_key __key);
|
||||
_LIBCPP_THREAD_ABI_VISIBILITY
|
||||
void __libcpp_tls_set(__libcpp_tls_key __key, void* __p);
|
||||
|
||||
#if defined(_LIBCPP_HAS_THREAD_API_PTHREAD) || defined(_LIBCPP_BUILDING_EXTERNAL_THREADS)
|
||||
|
||||
inline _LIBCPP_ALWAYS_INLINE
|
||||
int __libcpp_recursive_mutex_init(__libcpp_mutex_t* __m)
|
||||
{
|
||||
pthread_mutexattr_t attr;
|
||||
@ -59,147 +130,117 @@ int __libcpp_recursive_mutex_init(__libcpp_mutex_t* __m)
|
||||
return 0;
|
||||
}
|
||||
|
||||
inline _LIBCPP_ALWAYS_INLINE
|
||||
int __libcpp_mutex_lock(__libcpp_mutex_t* __m)
|
||||
{
|
||||
return pthread_mutex_lock(__m);
|
||||
}
|
||||
|
||||
inline _LIBCPP_ALWAYS_INLINE
|
||||
int __libcpp_mutex_trylock(__libcpp_mutex_t* __m)
|
||||
{
|
||||
return pthread_mutex_trylock(__m);
|
||||
}
|
||||
|
||||
inline _LIBCPP_ALWAYS_INLINE
|
||||
int __libcpp_mutex_unlock(__libcpp_mutex_t* __m)
|
||||
{
|
||||
return pthread_mutex_unlock(__m);
|
||||
}
|
||||
|
||||
inline _LIBCPP_ALWAYS_INLINE
|
||||
int __libcpp_mutex_destroy(__libcpp_mutex_t* __m)
|
||||
{
|
||||
return pthread_mutex_destroy(__m);
|
||||
}
|
||||
|
||||
// Condition variable
|
||||
#define _LIBCPP_CONDVAR_INITIALIZER PTHREAD_COND_INITIALIZER
|
||||
typedef pthread_cond_t __libcpp_condvar_t;
|
||||
|
||||
inline _LIBCPP_ALWAYS_INLINE
|
||||
int __libcpp_condvar_signal(__libcpp_condvar_t* __cv)
|
||||
{
|
||||
return pthread_cond_signal(__cv);
|
||||
}
|
||||
|
||||
inline _LIBCPP_ALWAYS_INLINE
|
||||
int __libcpp_condvar_broadcast(__libcpp_condvar_t* __cv)
|
||||
{
|
||||
return pthread_cond_broadcast(__cv);
|
||||
}
|
||||
|
||||
inline _LIBCPP_ALWAYS_INLINE
|
||||
int __libcpp_condvar_wait(__libcpp_condvar_t* __cv, __libcpp_mutex_t* __m)
|
||||
{
|
||||
return pthread_cond_wait(__cv, __m);
|
||||
}
|
||||
|
||||
inline _LIBCPP_ALWAYS_INLINE
|
||||
int __libcpp_condvar_timedwait(__libcpp_condvar_t* __cv, __libcpp_mutex_t* __m, timespec* __ts)
|
||||
{
|
||||
return pthread_cond_timedwait(__cv, __m, __ts);
|
||||
}
|
||||
|
||||
inline _LIBCPP_ALWAYS_INLINE
|
||||
int __libcpp_condvar_destroy(__libcpp_condvar_t* __cv)
|
||||
{
|
||||
return pthread_cond_destroy(__cv);
|
||||
}
|
||||
|
||||
// Thread id
|
||||
typedef pthread_t __libcpp_thread_id;
|
||||
|
||||
// Returns non-zero if the thread ids are equal, otherwise 0
|
||||
inline _LIBCPP_ALWAYS_INLINE
|
||||
bool __libcpp_thread_id_equal(__libcpp_thread_id t1, __libcpp_thread_id t2)
|
||||
{
|
||||
return pthread_equal(t1, t2) != 0;
|
||||
}
|
||||
|
||||
// Returns non-zero if t1 < t2, otherwise 0
|
||||
inline _LIBCPP_ALWAYS_INLINE
|
||||
bool __libcpp_thread_id_less(__libcpp_thread_id t1, __libcpp_thread_id t2)
|
||||
{
|
||||
return t1 < t2;
|
||||
}
|
||||
|
||||
// Thread
|
||||
typedef pthread_t __libcpp_thread_t;
|
||||
|
||||
inline _LIBCPP_ALWAYS_INLINE
|
||||
int __libcpp_thread_create(__libcpp_thread_t* __t, void* (*__func)(void*), void* __arg)
|
||||
{
|
||||
return pthread_create(__t, 0, __func, __arg);
|
||||
}
|
||||
|
||||
inline _LIBCPP_ALWAYS_INLINE
|
||||
__libcpp_thread_id __libcpp_thread_get_current_id()
|
||||
{
|
||||
return pthread_self();
|
||||
}
|
||||
|
||||
inline _LIBCPP_ALWAYS_INLINE
|
||||
__libcpp_thread_id __libcpp_thread_get_id(const __libcpp_thread_t* __t)
|
||||
{
|
||||
return *__t;
|
||||
}
|
||||
|
||||
inline _LIBCPP_ALWAYS_INLINE
|
||||
int __libcpp_thread_join(__libcpp_thread_t* __t)
|
||||
{
|
||||
return pthread_join(*__t, 0);
|
||||
}
|
||||
|
||||
inline _LIBCPP_ALWAYS_INLINE
|
||||
int __libcpp_thread_detach(__libcpp_thread_t* __t)
|
||||
{
|
||||
return pthread_detach(*__t);
|
||||
}
|
||||
|
||||
inline _LIBCPP_ALWAYS_INLINE
|
||||
void __libcpp_thread_yield()
|
||||
{
|
||||
sched_yield();
|
||||
}
|
||||
|
||||
// Thread local storage
|
||||
typedef pthread_key_t __libcpp_tl_key;
|
||||
|
||||
inline _LIBCPP_ALWAYS_INLINE
|
||||
int __libcpp_tl_create(__libcpp_tl_key* __key, void (*__at_exit)(void*))
|
||||
int __libcpp_tls_create(__libcpp_tls_key* __key, void (*__at_exit)(void*))
|
||||
{
|
||||
return pthread_key_create(__key, __at_exit);
|
||||
}
|
||||
|
||||
inline _LIBCPP_ALWAYS_INLINE
|
||||
void* __libcpp_tl_get(__libcpp_tl_key __key)
|
||||
void* __libcpp_tls_get(__libcpp_tls_key __key)
|
||||
{
|
||||
return pthread_getspecific(__key);
|
||||
}
|
||||
|
||||
inline _LIBCPP_ALWAYS_INLINE
|
||||
void __libcpp_tl_set(__libcpp_tl_key __key, void* __p)
|
||||
void __libcpp_tls_set(__libcpp_tls_key __key, void* __p)
|
||||
{
|
||||
pthread_setspecific(__key, __p);
|
||||
}
|
||||
|
||||
#else // !_LIBCPP_HAS_THREAD_API_PTHREAD
|
||||
#error "No thread API selected."
|
||||
#endif
|
||||
#endif // _LIBCPP_HAS_THREAD_API_PTHREAD || _LIBCPP_BUILDING_EXTERNAL_THREADS
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // !_LIBCPP_HAS_THREAD_API_EXTERNAL || !__libcpp_has_include(<__external_threading>)
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_THREADS
|
||||
|
||||
#endif // _LIBCPP_THREADING_SUPPORT
|
||||
|
@ -1106,19 +1106,22 @@ public:
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
size_type max_size() const _NOEXCEPT
|
||||
{return __node_traits::max_size(__node_alloc());}
|
||||
{return std::min<size_type>(
|
||||
__node_traits::max_size(__node_alloc()),
|
||||
numeric_limits<difference_type >::max());}
|
||||
|
||||
void clear() _NOEXCEPT;
|
||||
|
||||
void swap(__tree& __t)
|
||||
#if _LIBCPP_STD_VER <= 11
|
||||
_NOEXCEPT_(
|
||||
__is_nothrow_swappable<value_compare>::value
|
||||
#if _LIBCPP_STD_VER <= 11
|
||||
&& (!__node_traits::propagate_on_container_swap::value ||
|
||||
__is_nothrow_swappable<__node_allocator>::value)
|
||||
#endif
|
||||
);
|
||||
|
||||
#else
|
||||
_NOEXCEPT_(__is_nothrow_swappable<value_compare>::value);
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
template <class _Key, class ..._Args>
|
||||
@ -1425,7 +1428,7 @@ private:
|
||||
__node_alloc() = __t.__node_alloc();
|
||||
}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
void __copy_assign_alloc(const __tree& __t, false_type) {}
|
||||
void __copy_assign_alloc(const __tree&, false_type) {}
|
||||
|
||||
void __move_assign(__tree& __t, false_type);
|
||||
void __move_assign(__tree& __t, true_type)
|
||||
@ -1445,7 +1448,7 @@ private:
|
||||
_NOEXCEPT_(is_nothrow_move_assignable<__node_allocator>::value)
|
||||
{__node_alloc() = _VSTD::move(__t.__node_alloc());}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
void __move_assign_alloc(__tree& __t, false_type) _NOEXCEPT {}
|
||||
void __move_assign_alloc(__tree&, false_type) _NOEXCEPT {}
|
||||
|
||||
__node_pointer __detach();
|
||||
static __node_pointer __detach(__node_pointer);
|
||||
@ -1797,13 +1800,15 @@ __tree<_Tp, _Compare, _Allocator>::destroy(__node_pointer __nd) _NOEXCEPT
|
||||
template <class _Tp, class _Compare, class _Allocator>
|
||||
void
|
||||
__tree<_Tp, _Compare, _Allocator>::swap(__tree& __t)
|
||||
#if _LIBCPP_STD_VER <= 11
|
||||
_NOEXCEPT_(
|
||||
__is_nothrow_swappable<value_compare>::value
|
||||
#if _LIBCPP_STD_VER <= 11
|
||||
&& (!__node_traits::propagate_on_container_swap::value ||
|
||||
__is_nothrow_swappable<__node_allocator>::value)
|
||||
#endif
|
||||
)
|
||||
#else
|
||||
_NOEXCEPT_(__is_nothrow_swappable<value_compare>::value)
|
||||
#endif
|
||||
{
|
||||
using _VSTD::swap;
|
||||
swap(__begin_node_, __t.__begin_node_);
|
||||
|
107
include/__tuple
107
include/__tuple
@ -22,7 +22,7 @@
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _Tp> class _LIBCPP_TYPE_VIS_ONLY tuple_size;
|
||||
template <class _Tp> class _LIBCPP_TYPE_VIS_ONLY tuple_size {};
|
||||
|
||||
template <class _Tp>
|
||||
class _LIBCPP_TYPE_VIS_ONLY tuple_size<const _Tp>
|
||||
@ -146,6 +146,12 @@ template <class ..._Tp> class _LIBCPP_TYPE_VIS_ONLY tuple;
|
||||
|
||||
template <class... _Tp> struct __tuple_like<tuple<_Tp...> > : true_type {};
|
||||
|
||||
template <class ..._Tp>
|
||||
class _LIBCPP_TYPE_VIS_ONLY tuple_size<tuple<_Tp...> >
|
||||
: public integral_constant<size_t, sizeof...(_Tp)>
|
||||
{
|
||||
};
|
||||
|
||||
template <size_t _Ip, class ..._Tp>
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
typename tuple_element<_Ip, tuple<_Tp...> >::type&
|
||||
@ -368,7 +374,7 @@ template <bool ..._Preds>
|
||||
struct __all_dummy;
|
||||
|
||||
template <bool ..._Pred>
|
||||
using __all = is_same<__all_dummy<_Pred...>, __all_dummy<(_Pred, true)...>>;
|
||||
using __all = is_same<__all_dummy<_Pred...>, __all_dummy<((void)_Pred, true)...>>;
|
||||
|
||||
struct __tuple_sfinae_base {
|
||||
template <template <class, class...> class _Trait,
|
||||
@ -431,8 +437,105 @@ struct __tuple_assignable<_Tp, _Up, true, true>
|
||||
>
|
||||
{};
|
||||
|
||||
|
||||
template <size_t _Ip, class ..._Tp>
|
||||
class _LIBCPP_TYPE_VIS_ONLY tuple_element<_Ip, tuple<_Tp...> >
|
||||
{
|
||||
public:
|
||||
typedef typename tuple_element<_Ip, __tuple_types<_Tp...> >::type type;
|
||||
};
|
||||
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
template <size_t _Ip, class ..._Tp>
|
||||
using tuple_element_t = typename tuple_element <_Ip, _Tp...>::type;
|
||||
#endif
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_VARIADICS
|
||||
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
template <bool _IsTuple, class _SizeTrait, size_t _Expected>
|
||||
struct __tuple_like_with_size_imp : false_type {};
|
||||
|
||||
template <class _SizeTrait, size_t _Expected>
|
||||
struct __tuple_like_with_size_imp<true, _SizeTrait, _Expected>
|
||||
: integral_constant<bool, _SizeTrait::value == _Expected> {};
|
||||
|
||||
template <class _Tuple, size_t _ExpectedSize,
|
||||
class _RawTuple = typename __uncvref<_Tuple>::type>
|
||||
using __tuple_like_with_size = __tuple_like_with_size_imp<
|
||||
__tuple_like<_RawTuple>::value,
|
||||
tuple_size<_RawTuple>, _ExpectedSize
|
||||
>;
|
||||
|
||||
struct _LIBCPP_TYPE_VIS __check_tuple_constructor_fail {
|
||||
template <class ...>
|
||||
static constexpr bool __enable_default() { return false; }
|
||||
template <class ...>
|
||||
static constexpr bool __enable_explicit() { return false; }
|
||||
template <class ...>
|
||||
static constexpr bool __enable_implicit() { return false; }
|
||||
template <class ...>
|
||||
static constexpr bool __enable_assign() { return false; }
|
||||
};
|
||||
#endif
|
||||
|
||||
#if _LIBCPP_STD_VER > 14
|
||||
|
||||
template <bool _CanCopy, bool _CanMove>
|
||||
struct __sfinae_ctor_base {};
|
||||
template <>
|
||||
struct __sfinae_ctor_base<false, false> {
|
||||
__sfinae_ctor_base() = default;
|
||||
__sfinae_ctor_base(__sfinae_ctor_base const&) = delete;
|
||||
__sfinae_ctor_base(__sfinae_ctor_base &&) = delete;
|
||||
__sfinae_ctor_base& operator=(__sfinae_ctor_base const&) = default;
|
||||
__sfinae_ctor_base& operator=(__sfinae_ctor_base&&) = default;
|
||||
};
|
||||
template <>
|
||||
struct __sfinae_ctor_base<true, false> {
|
||||
__sfinae_ctor_base() = default;
|
||||
__sfinae_ctor_base(__sfinae_ctor_base const&) = default;
|
||||
__sfinae_ctor_base(__sfinae_ctor_base &&) = delete;
|
||||
__sfinae_ctor_base& operator=(__sfinae_ctor_base const&) = default;
|
||||
__sfinae_ctor_base& operator=(__sfinae_ctor_base&&) = default;
|
||||
};
|
||||
template <>
|
||||
struct __sfinae_ctor_base<false, true> {
|
||||
__sfinae_ctor_base() = default;
|
||||
__sfinae_ctor_base(__sfinae_ctor_base const&) = delete;
|
||||
__sfinae_ctor_base(__sfinae_ctor_base &&) = default;
|
||||
__sfinae_ctor_base& operator=(__sfinae_ctor_base const&) = default;
|
||||
__sfinae_ctor_base& operator=(__sfinae_ctor_base&&) = default;
|
||||
};
|
||||
|
||||
template <bool _CanCopy, bool _CanMove>
|
||||
struct __sfinae_assign_base {};
|
||||
template <>
|
||||
struct __sfinae_assign_base<false, false> {
|
||||
__sfinae_assign_base() = default;
|
||||
__sfinae_assign_base(__sfinae_assign_base const&) = default;
|
||||
__sfinae_assign_base(__sfinae_assign_base &&) = default;
|
||||
__sfinae_assign_base& operator=(__sfinae_assign_base const&) = delete;
|
||||
__sfinae_assign_base& operator=(__sfinae_assign_base&&) = delete;
|
||||
};
|
||||
template <>
|
||||
struct __sfinae_assign_base<true, false> {
|
||||
__sfinae_assign_base() = default;
|
||||
__sfinae_assign_base(__sfinae_assign_base const&) = default;
|
||||
__sfinae_assign_base(__sfinae_assign_base &&) = default;
|
||||
__sfinae_assign_base& operator=(__sfinae_assign_base const&) = default;
|
||||
__sfinae_assign_base& operator=(__sfinae_assign_base&&) = delete;
|
||||
};
|
||||
template <>
|
||||
struct __sfinae_assign_base<false, true> {
|
||||
__sfinae_assign_base() = default;
|
||||
__sfinae_assign_base(__sfinae_assign_base const&) = default;
|
||||
__sfinae_assign_base(__sfinae_assign_base &&) = default;
|
||||
__sfinae_assign_base& operator=(__sfinae_assign_base const&) = delete;
|
||||
__sfinae_assign_base& operator=(__sfinae_assign_base&&) = default;
|
||||
};
|
||||
#endif // _LIBCPP_STD_VER > 14
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP___TUPLE
|
||||
|
@ -89,7 +89,7 @@ template <class InputIterator1, class InputIterator2>
|
||||
|
||||
template <class InputIterator1, class InputIterator2>
|
||||
pair<InputIterator1, InputIterator2>
|
||||
mismatch(InputIterator1 first1, InputIterator1 last1,
|
||||
mismatch(InputIterator1 first1, InputIterator1 last1,
|
||||
InputIterator2 first2, InputIterator2 last2); // **C++14**
|
||||
|
||||
template <class InputIterator1, class InputIterator2, class BinaryPredicate>
|
||||
@ -109,7 +109,7 @@ template <class InputIterator1, class InputIterator2>
|
||||
|
||||
template <class InputIterator1, class InputIterator2>
|
||||
bool
|
||||
equal(InputIterator1 first1, InputIterator1 last1,
|
||||
equal(InputIterator1 first1, InputIterator1 last1,
|
||||
InputIterator2 first2, InputIterator2 last2); // **C++14**
|
||||
|
||||
template <class InputIterator1, class InputIterator2, class BinaryPredicate>
|
||||
@ -288,6 +288,12 @@ template <class RandomAccessIterator, class RandomNumberGenerator>
|
||||
random_shuffle(RandomAccessIterator first, RandomAccessIterator last,
|
||||
RandomNumberGenerator& rand); // deprecated in C++14
|
||||
|
||||
template<class PopulationIterator, class SampleIterator,
|
||||
class Distance, class UniformRandomBitGenerator>
|
||||
SampleIterator sample(PopulationIterator first, PopulationIterator last,
|
||||
SampleIterator out, Distance n,
|
||||
UniformRandomBitGenerator&& g); // C++17
|
||||
|
||||
template<class RandomAccessIterator, class UniformRandomNumberGenerator>
|
||||
void shuffle(RandomAccessIterator first, RandomAccessIterator last,
|
||||
UniformRandomNumberGenerator&& g);
|
||||
@ -688,7 +694,7 @@ struct __equal_to<_T1, const _T1>
|
||||
template <class _T1, class _T2 = _T1>
|
||||
struct __less
|
||||
{
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
@ -749,14 +755,28 @@ struct __debug_less
|
||||
{
|
||||
_Compare __comp_;
|
||||
__debug_less(_Compare& __c) : __comp_(__c) {}
|
||||
|
||||
template <class _Tp, class _Up>
|
||||
bool operator()(const _Tp& __x, const _Up& __y)
|
||||
{
|
||||
bool __r = __comp_(__x, __y);
|
||||
if (__r)
|
||||
_LIBCPP_ASSERT(!__comp_(__y, __x), "Comparator does not induce a strict weak ordering");
|
||||
__do_compare_assert(0, __y, __x);
|
||||
return __r;
|
||||
}
|
||||
|
||||
template <class _LHS, class _RHS>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
decltype((void)_VSTD::declval<_Compare&>()(
|
||||
_VSTD::declval<_LHS const&>(), _VSTD::declval<_RHS const&>()))
|
||||
__do_compare_assert(int, _LHS const& __l, _RHS const& __r) {
|
||||
_LIBCPP_ASSERT(!__comp_(__l, __r),
|
||||
"Comparator does not induce a strict weak ordering");
|
||||
}
|
||||
|
||||
template <class _LHS, class _RHS>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void __do_compare_assert(long, _LHS const&, _RHS const&) {}
|
||||
};
|
||||
|
||||
#endif // _LIBCPP_DEBUG
|
||||
@ -857,7 +877,7 @@ for_each(_InputIterator __first, _InputIterator __last, _Function __f)
|
||||
{
|
||||
for (; __first != __last; ++__first)
|
||||
__f(*__first);
|
||||
return _LIBCPP_EXPLICIT_MOVE(__f); // explicitly moved for (emulated) C++03
|
||||
return __f;
|
||||
}
|
||||
|
||||
// find
|
||||
@ -1215,7 +1235,7 @@ equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first
|
||||
template <class _BinaryPredicate, class _InputIterator1, class _InputIterator2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
__equal(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||
__equal(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||
_InputIterator2 __first2, _InputIterator2 __last2, _BinaryPredicate __pred,
|
||||
input_iterator_tag, input_iterator_tag )
|
||||
{
|
||||
@ -1228,8 +1248,8 @@ __equal(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||
template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
__equal(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
|
||||
_RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
|
||||
__equal(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
|
||||
_RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
|
||||
random_access_iterator_tag, random_access_iterator_tag )
|
||||
{
|
||||
if ( _VSTD::distance(__first1, __last1) != _VSTD::distance(__first2, __last2))
|
||||
@ -1242,11 +1262,11 @@ __equal(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
|
||||
template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
equal(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||
equal(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||
_InputIterator2 __first2, _InputIterator2 __last2, _BinaryPredicate __pred )
|
||||
{
|
||||
return _VSTD::__equal<typename add_lvalue_reference<_BinaryPredicate>::type>
|
||||
(__first1, __last1, __first2, __last2, __pred,
|
||||
(__first1, __last1, __first2, __last2, __pred,
|
||||
typename iterator_traits<_InputIterator1>::iterator_category(),
|
||||
typename iterator_traits<_InputIterator2>::iterator_category());
|
||||
}
|
||||
@ -1254,7 +1274,7 @@ equal(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||
template <class _InputIterator1, class _InputIterator2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
equal(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||
equal(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||
_InputIterator2 __first2, _InputIterator2 __last2)
|
||||
{
|
||||
typedef typename iterator_traits<_InputIterator1>::value_type __v1;
|
||||
@ -1328,7 +1348,7 @@ is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
|
||||
template<class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
|
||||
bool
|
||||
__is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
|
||||
_ForwardIterator2 __first2, _ForwardIterator2 __last2,
|
||||
_ForwardIterator2 __first2, _ForwardIterator2 __last2,
|
||||
_BinaryPredicate __pred,
|
||||
forward_iterator_tag, forward_iterator_tag )
|
||||
{
|
||||
@ -1379,7 +1399,7 @@ __next_iter:;
|
||||
template<class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
|
||||
bool
|
||||
__is_permutation(_RandomAccessIterator1 __first1, _RandomAccessIterator2 __last1,
|
||||
_RandomAccessIterator1 __first2, _RandomAccessIterator2 __last2,
|
||||
_RandomAccessIterator1 __first2, _RandomAccessIterator2 __last2,
|
||||
_BinaryPredicate __pred,
|
||||
random_access_iterator_tag, random_access_iterator_tag )
|
||||
{
|
||||
@ -1458,7 +1478,7 @@ __search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
|
||||
}
|
||||
|
||||
template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
pair<_RandomAccessIterator1, _RandomAccessIterator1>
|
||||
__search(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
|
||||
_RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
|
||||
@ -1474,9 +1494,9 @@ __search(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
|
||||
if (__len1 < __len2)
|
||||
return make_pair(__last1, __last1);
|
||||
const _RandomAccessIterator1 __s = __last1 - (__len2 - 1); // Start of pattern match can't go beyond here
|
||||
|
||||
while (true)
|
||||
{
|
||||
#if !_LIBCPP_UNROLL_LOOPS
|
||||
while (true)
|
||||
{
|
||||
if (__first1 == __s)
|
||||
@ -1485,40 +1505,9 @@ __search(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
|
||||
break;
|
||||
++__first1;
|
||||
}
|
||||
#else // !_LIBCPP_UNROLL_LOOPS
|
||||
for (_D1 __loop_unroll = (__s - __first1) / 4; __loop_unroll > 0; --__loop_unroll)
|
||||
{
|
||||
if (__pred(*__first1, *__first2))
|
||||
goto __phase2;
|
||||
if (__pred(*++__first1, *__first2))
|
||||
goto __phase2;
|
||||
if (__pred(*++__first1, *__first2))
|
||||
goto __phase2;
|
||||
if (__pred(*++__first1, *__first2))
|
||||
goto __phase2;
|
||||
++__first1;
|
||||
}
|
||||
switch (__s - __first1)
|
||||
{
|
||||
case 3:
|
||||
if (__pred(*__first1, *__first2))
|
||||
break;
|
||||
++__first1;
|
||||
case 2:
|
||||
if (__pred(*__first1, *__first2))
|
||||
break;
|
||||
++__first1;
|
||||
case 1:
|
||||
if (__pred(*__first1, *__first2))
|
||||
break;
|
||||
case 0:
|
||||
return make_pair(__last1, __last1);
|
||||
}
|
||||
__phase2:
|
||||
#endif // !_LIBCPP_UNROLL_LOOPS
|
||||
|
||||
_RandomAccessIterator1 __m1 = __first1;
|
||||
_RandomAccessIterator2 __m2 = __first2;
|
||||
#if !_LIBCPP_UNROLL_LOOPS
|
||||
while (true)
|
||||
{
|
||||
if (++__m2 == __last2)
|
||||
@ -1530,43 +1519,6 @@ __search(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
|
||||
break;
|
||||
}
|
||||
}
|
||||
#else // !_LIBCPP_UNROLL_LOOPS
|
||||
++__m2;
|
||||
++__m1;
|
||||
for (_D2 __loop_unroll = (__last2 - __m2) / 4; __loop_unroll > 0; --__loop_unroll)
|
||||
{
|
||||
if (!__pred(*__m1, *__m2))
|
||||
goto __continue;
|
||||
if (!__pred(*++__m1, *++__m2))
|
||||
goto __continue;
|
||||
if (!__pred(*++__m1, *++__m2))
|
||||
goto __continue;
|
||||
if (!__pred(*++__m1, *++__m2))
|
||||
goto __continue;
|
||||
++__m1;
|
||||
++__m2;
|
||||
}
|
||||
switch (__last2 - __m2)
|
||||
{
|
||||
case 3:
|
||||
if (!__pred(*__m1, *__m2))
|
||||
break;
|
||||
++__m1;
|
||||
++__m2;
|
||||
case 2:
|
||||
if (!__pred(*__m1, *__m2))
|
||||
break;
|
||||
++__m1;
|
||||
++__m2;
|
||||
case 1:
|
||||
if (!__pred(*__m1, *__m2))
|
||||
break;
|
||||
case 0:
|
||||
return make_pair(__first1, __first1 + __len2);
|
||||
}
|
||||
__continue:
|
||||
++__first1;
|
||||
#endif // !_LIBCPP_UNROLL_LOOPS
|
||||
}
|
||||
}
|
||||
|
||||
@ -1729,6 +1681,20 @@ __unwrap_iter(__wrap_iter<_Tp*> __i)
|
||||
return __i.base();
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
typename enable_if
|
||||
<
|
||||
is_trivially_copy_assignable<_Tp>::value,
|
||||
__wrap_iter<_Tp*>
|
||||
>::type
|
||||
__unwrap_iter(__wrap_iter<_Tp*> __i)
|
||||
{
|
||||
return __i;
|
||||
}
|
||||
|
||||
#endif // _LIBCPP_DEBUG_LEVEL < 2
|
||||
|
||||
template <class _InputIterator, class _OutputIterator>
|
||||
@ -1802,7 +1768,9 @@ _BidirectionalIterator2
|
||||
copy_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last,
|
||||
_BidirectionalIterator2 __result)
|
||||
{
|
||||
return _VSTD::__copy_backward(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result));
|
||||
return _VSTD::__copy_backward(__unwrap_iter(__first),
|
||||
__unwrap_iter(__last),
|
||||
__unwrap_iter(__result));
|
||||
}
|
||||
|
||||
// copy_if
|
||||
@ -2417,7 +2385,7 @@ __rotate_forward(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIt
|
||||
template<typename _Integral>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_Integral
|
||||
__gcd(_Integral __x, _Integral __y)
|
||||
__algo_gcd(_Integral __x, _Integral __y)
|
||||
{
|
||||
do
|
||||
{
|
||||
@ -2442,7 +2410,7 @@ __rotate_gcd(_RandomAccessIterator __first, _RandomAccessIterator __middle, _Ran
|
||||
_VSTD::swap_ranges(__first, __middle, __middle);
|
||||
return __middle;
|
||||
}
|
||||
const difference_type __g = _VSTD::__gcd(__m1, __m2);
|
||||
const difference_type __g = _VSTD::__algo_gcd(__m1, __m2);
|
||||
for (_RandomAccessIterator __p = __first + __g; __p != __first;)
|
||||
{
|
||||
value_type __t(_VSTD::move(*--__p));
|
||||
@ -2785,7 +2753,7 @@ minmax(initializer_list<_Tp> __t, _Compare __comp)
|
||||
__result.second = *__first;
|
||||
++__first;
|
||||
}
|
||||
|
||||
|
||||
while (__first != __last)
|
||||
{
|
||||
_Tp __prev = *__first++;
|
||||
@ -2797,7 +2765,7 @@ minmax(initializer_list<_Tp> __t, _Compare __comp)
|
||||
if ( __comp(__prev, __result.first)) __result.first = __prev;
|
||||
if (!__comp(*__first, __result.second)) __result.second = *__first;
|
||||
}
|
||||
|
||||
|
||||
__first++;
|
||||
}
|
||||
return __result;
|
||||
@ -3128,6 +3096,78 @@ random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
|
||||
}
|
||||
}
|
||||
|
||||
template <class _PopulationIterator, class _SampleIterator, class _Distance,
|
||||
class _UniformRandomNumberGenerator>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_SampleIterator __sample(_PopulationIterator __first,
|
||||
_PopulationIterator __last, _SampleIterator __out,
|
||||
_Distance __n,
|
||||
_UniformRandomNumberGenerator & __g,
|
||||
input_iterator_tag) {
|
||||
|
||||
_Distance __k = 0;
|
||||
for (; __first != __last && __k < __n; ++__first, (void)++__k)
|
||||
__out[__k] = *__first;
|
||||
_Distance __sz = __k;
|
||||
for (; __first != __last; ++__first, (void)++__k) {
|
||||
_Distance __r = _VSTD::uniform_int_distribution<_Distance>(0, __k)(__g);
|
||||
if (__r < __sz)
|
||||
__out[__r] = *__first;
|
||||
}
|
||||
return __out + _VSTD::min(__n, __k);
|
||||
}
|
||||
|
||||
template <class _PopulationIterator, class _SampleIterator, class _Distance,
|
||||
class _UniformRandomNumberGenerator>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_SampleIterator __sample(_PopulationIterator __first,
|
||||
_PopulationIterator __last, _SampleIterator __out,
|
||||
_Distance __n,
|
||||
_UniformRandomNumberGenerator& __g,
|
||||
forward_iterator_tag) {
|
||||
_Distance __unsampled_sz = _VSTD::distance(__first, __last);
|
||||
for (__n = _VSTD::min(__n, __unsampled_sz); __n != 0; ++__first) {
|
||||
_Distance __r =
|
||||
_VSTD::uniform_int_distribution<_Distance>(0, --__unsampled_sz)(__g);
|
||||
if (__r < __n) {
|
||||
*__out++ = *__first;
|
||||
--__n;
|
||||
}
|
||||
}
|
||||
return __out;
|
||||
}
|
||||
|
||||
template <class _PopulationIterator, class _SampleIterator, class _Distance,
|
||||
class _UniformRandomNumberGenerator>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_SampleIterator __sample(_PopulationIterator __first,
|
||||
_PopulationIterator __last, _SampleIterator __out,
|
||||
_Distance __n, _UniformRandomNumberGenerator& __g) {
|
||||
typedef typename iterator_traits<_PopulationIterator>::iterator_category
|
||||
_PopCategory;
|
||||
typedef typename iterator_traits<_PopulationIterator>::difference_type
|
||||
_Difference;
|
||||
static_assert(__is_forward_iterator<_PopulationIterator>::value ||
|
||||
__is_random_access_iterator<_SampleIterator>::value,
|
||||
"SampleIterator must meet the requirements of RandomAccessIterator");
|
||||
typedef typename common_type<_Distance, _Difference>::type _CommonType;
|
||||
_LIBCPP_ASSERT(__n >= 0, "N must be a positive number.");
|
||||
return _VSTD::__sample(
|
||||
__first, __last, __out, _CommonType(__n),
|
||||
__g, _PopCategory());
|
||||
}
|
||||
|
||||
#if _LIBCPP_STD_VER > 14
|
||||
template <class _PopulationIterator, class _SampleIterator, class _Distance,
|
||||
class _UniformRandomNumberGenerator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_SampleIterator sample(_PopulationIterator __first,
|
||||
_PopulationIterator __last, _SampleIterator __out,
|
||||
_Distance __n, _UniformRandomNumberGenerator&& __g) {
|
||||
return _VSTD::__sample(__first, __last, __out, __n, __g);
|
||||
}
|
||||
#endif // _LIBCPP_STD_VER > 14
|
||||
|
||||
template<class _RandomAccessIterator, class _UniformRandomNumberGenerator>
|
||||
void shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
@ -4423,7 +4463,7 @@ __buffered_inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator
|
||||
::new(__p) value_type(_VSTD::move(*__i));
|
||||
typedef reverse_iterator<_BidirectionalIterator> _RBi;
|
||||
typedef reverse_iterator<value_type*> _Rv;
|
||||
__half_inplace_merge(_Rv(__p), _Rv(__buff),
|
||||
__half_inplace_merge(_Rv(__p), _Rv(__buff),
|
||||
_RBi(__middle), _RBi(__first),
|
||||
_RBi(__last), __negate<_Compare>(__comp));
|
||||
}
|
||||
@ -4871,7 +4911,8 @@ push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
|
||||
|
||||
template <class _Compare, class _RandomAccessIterator>
|
||||
void
|
||||
__sift_down(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
|
||||
__sift_down(_RandomAccessIterator __first, _RandomAccessIterator /*__last*/,
|
||||
_Compare __comp,
|
||||
typename iterator_traits<_RandomAccessIterator>::difference_type __len,
|
||||
_RandomAccessIterator __start)
|
||||
{
|
||||
|
663
include/any
Normal file
663
include/any
Normal file
@ -0,0 +1,663 @@
|
||||
// -*- C++ -*-
|
||||
//===------------------------------ any -----------------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef _LIBCPP_ANY
|
||||
#define _LIBCPP_ANY
|
||||
|
||||
/*
|
||||
any synopsis
|
||||
|
||||
namespace std {
|
||||
|
||||
class bad_any_cast : public bad_cast
|
||||
{
|
||||
public:
|
||||
virtual const char* what() const noexcept;
|
||||
};
|
||||
|
||||
class any
|
||||
{
|
||||
public:
|
||||
|
||||
// 6.3.1 any construct/destruct
|
||||
any() noexcept;
|
||||
|
||||
any(const any& other);
|
||||
any(any&& other) noexcept;
|
||||
|
||||
template <class ValueType>
|
||||
any(ValueType&& value);
|
||||
|
||||
~any();
|
||||
|
||||
// 6.3.2 any assignments
|
||||
any& operator=(const any& rhs);
|
||||
any& operator=(any&& rhs) noexcept;
|
||||
|
||||
template <class ValueType>
|
||||
any& operator=(ValueType&& rhs);
|
||||
|
||||
// 6.3.3 any modifiers
|
||||
void reset() noexcept;
|
||||
void swap(any& rhs) noexcept;
|
||||
|
||||
// 6.3.4 any observers
|
||||
bool has_value() const noexcept;
|
||||
const type_info& type() const noexcept;
|
||||
};
|
||||
|
||||
// 6.4 Non-member functions
|
||||
void swap(any& x, any& y) noexcept;
|
||||
|
||||
template <class T, class ...Args>
|
||||
any make_any(Args&& ...args);
|
||||
template <class T, class U, class ...Args>
|
||||
any make_any(initializer_list<U>, Args&& ...args);
|
||||
|
||||
template<class ValueType>
|
||||
ValueType any_cast(const any& operand);
|
||||
template<class ValueType>
|
||||
ValueType any_cast(any& operand);
|
||||
template<class ValueType>
|
||||
ValueType any_cast(any&& operand);
|
||||
|
||||
template<class ValueType>
|
||||
const ValueType* any_cast(const any* operand) noexcept;
|
||||
template<class ValueType>
|
||||
ValueType* any_cast(any* operand) noexcept;
|
||||
|
||||
} // namespace fundamentals_v1
|
||||
} // namespace experimental
|
||||
} // namespace std
|
||||
|
||||
*/
|
||||
|
||||
#include <experimental/__config>
|
||||
#include <memory>
|
||||
#include <new>
|
||||
#include <typeinfo>
|
||||
#include <type_traits>
|
||||
#include <cstdlib>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
namespace std {
|
||||
class _LIBCPP_EXCEPTION_ABI bad_any_cast : public bad_cast
|
||||
{
|
||||
public:
|
||||
virtual const char* what() const _NOEXCEPT;
|
||||
};
|
||||
} // namespace std
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
#if _LIBCPP_STD_VER > 14
|
||||
|
||||
_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
|
||||
void __throw_bad_any_cast()
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw bad_any_cast();
|
||||
#else
|
||||
_VSTD::abort();
|
||||
#endif
|
||||
}
|
||||
|
||||
// Forward declarations
|
||||
class _LIBCPP_TYPE_VIS_ONLY any;
|
||||
|
||||
template <class _ValueType>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
add_pointer_t<add_const_t<_ValueType>>
|
||||
any_cast(any const *) _NOEXCEPT;
|
||||
|
||||
template <class _ValueType>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
add_pointer_t<_ValueType> any_cast(any *) _NOEXCEPT;
|
||||
|
||||
namespace __any_imp
|
||||
{
|
||||
using _Buffer = aligned_storage_t<3*sizeof(void*), alignment_of<void*>::value>;
|
||||
|
||||
template <class _Tp>
|
||||
using _IsSmallObject = integral_constant<bool
|
||||
, sizeof(_Tp) <= sizeof(_Buffer)
|
||||
&& alignment_of<_Buffer>::value
|
||||
% alignment_of<_Tp>::value == 0
|
||||
&& is_nothrow_move_constructible<_Tp>::value
|
||||
>;
|
||||
|
||||
enum class _Action {
|
||||
_Destroy,
|
||||
_Copy,
|
||||
_Move,
|
||||
_Get,
|
||||
_TypeInfo
|
||||
};
|
||||
|
||||
template <class _Tp> struct _SmallHandler;
|
||||
template <class _Tp> struct _LargeHandler;
|
||||
|
||||
template <class _Tp>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY __unique_typeinfo { static constexpr int __id = 0; };
|
||||
template <class _Tp> constexpr int __unique_typeinfo<_Tp>::__id;
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
constexpr const void* __get_fallback_typeid() {
|
||||
return &__unique_typeinfo<decay_t<_Tp>>::__id;
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool __compare_typeid(type_info const* __id, const void* __fallback_id)
|
||||
{
|
||||
#if !defined(_LIBCPP_NO_RTTI)
|
||||
if (__id && *__id == typeid(_Tp))
|
||||
return true;
|
||||
#endif
|
||||
if (!__id && __fallback_id == __any_imp::__get_fallback_typeid<_Tp>())
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
using _Handler = conditional_t<
|
||||
_IsSmallObject<_Tp>::value, _SmallHandler<_Tp>, _LargeHandler<_Tp>>;
|
||||
|
||||
} // namespace __any_imp
|
||||
|
||||
class _LIBCPP_TYPE_VIS_ONLY any
|
||||
{
|
||||
public:
|
||||
// construct/destruct
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
constexpr any() _NOEXCEPT : __h(nullptr) {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
any(any const & __other) : __h(nullptr)
|
||||
{
|
||||
if (__other.__h) __other.__call(_Action::_Copy, this);
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
any(any && __other) _NOEXCEPT : __h(nullptr)
|
||||
{
|
||||
if (__other.__h) __other.__call(_Action::_Move, this);
|
||||
}
|
||||
|
||||
template <
|
||||
class _ValueType
|
||||
, class _Tp = decay_t<_ValueType>
|
||||
, class = enable_if_t<
|
||||
!is_same<_Tp, any>::value &&
|
||||
!__is_inplace_type<_ValueType>::value &&
|
||||
is_copy_constructible<_Tp>::value>
|
||||
>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
any(_ValueType && __value);
|
||||
|
||||
template <class _ValueType, class ..._Args,
|
||||
class _Tp = decay_t<_ValueType>,
|
||||
class = enable_if_t<
|
||||
is_constructible<_Tp, _Args...>::value &&
|
||||
is_copy_constructible<_Tp>::value
|
||||
>
|
||||
>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit any(in_place_type_t<_ValueType>, _Args&&... __args);
|
||||
|
||||
template <class _ValueType, class _Up, class ..._Args,
|
||||
class _Tp = decay_t<_ValueType>,
|
||||
class = enable_if_t<
|
||||
is_constructible<_Tp, initializer_list<_Up>&, _Args...>::value &&
|
||||
is_copy_constructible<_Tp>::value>
|
||||
>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit any(in_place_type_t<_ValueType>, initializer_list<_Up>, _Args&&... __args);
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
~any() { this->reset(); }
|
||||
|
||||
// assignments
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
any & operator=(any const & __rhs) {
|
||||
any(__rhs).swap(*this);
|
||||
return *this;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
any & operator=(any && __rhs) _NOEXCEPT {
|
||||
any(_VSTD::move(__rhs)).swap(*this);
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <
|
||||
class _ValueType
|
||||
, class _Tp = decay_t<_ValueType>
|
||||
, class = enable_if_t<
|
||||
!is_same<_Tp, any>::value
|
||||
&& is_copy_constructible<_Tp>::value>
|
||||
>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
any & operator=(_ValueType && __rhs);
|
||||
|
||||
template <class _ValueType, class ..._Args,
|
||||
class _Tp = decay_t<_ValueType>,
|
||||
class = enable_if_t<
|
||||
is_constructible<_Tp, _Args...>::value &&
|
||||
is_copy_constructible<_Tp>::value>
|
||||
>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
void emplace(_Args&&... args);
|
||||
|
||||
template <class _ValueType, class _Up, class ..._Args,
|
||||
class _Tp = decay_t<_ValueType>,
|
||||
class = enable_if_t<
|
||||
is_constructible<_Tp, initializer_list<_Up>&, _Args...>::value &&
|
||||
is_copy_constructible<_Tp>::value>
|
||||
>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
void emplace(initializer_list<_Up>, _Args&&...);
|
||||
|
||||
// 6.3.3 any modifiers
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
void reset() _NOEXCEPT { if (__h) this->__call(_Action::_Destroy); }
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
void swap(any & __rhs) _NOEXCEPT;
|
||||
|
||||
// 6.3.4 any observers
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
bool has_value() const _NOEXCEPT { return __h != nullptr; }
|
||||
|
||||
#if !defined(_LIBCPP_NO_RTTI)
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
const type_info & type() const _NOEXCEPT {
|
||||
if (__h) {
|
||||
return *static_cast<type_info const *>(this->__call(_Action::_TypeInfo));
|
||||
} else {
|
||||
return typeid(void);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
private:
|
||||
typedef __any_imp::_Action _Action;
|
||||
using _HandleFuncPtr = void* (*)(_Action, any const *, any *, const type_info *,
|
||||
const void* __fallback_info);
|
||||
|
||||
union _Storage {
|
||||
constexpr _Storage() : __ptr(nullptr) {}
|
||||
void * __ptr;
|
||||
__any_imp::_Buffer __buf;
|
||||
};
|
||||
|
||||
_LIBCPP_ALWAYS_INLINE
|
||||
void * __call(_Action __a, any * __other = nullptr,
|
||||
type_info const * __info = nullptr,
|
||||
const void* __fallback_info = nullptr) const
|
||||
{
|
||||
return __h(__a, this, __other, __info, __fallback_info);
|
||||
}
|
||||
|
||||
_LIBCPP_ALWAYS_INLINE
|
||||
void * __call(_Action __a, any * __other = nullptr,
|
||||
type_info const * __info = nullptr,
|
||||
const void* __fallback_info = nullptr)
|
||||
{
|
||||
return __h(__a, this, __other, __info, __fallback_info);
|
||||
}
|
||||
|
||||
template <class>
|
||||
friend struct __any_imp::_SmallHandler;
|
||||
template <class>
|
||||
friend struct __any_imp::_LargeHandler;
|
||||
|
||||
template <class _ValueType>
|
||||
friend add_pointer_t<add_const_t<_ValueType>>
|
||||
any_cast(any const *) _NOEXCEPT;
|
||||
|
||||
template <class _ValueType>
|
||||
friend add_pointer_t<_ValueType>
|
||||
any_cast(any *) _NOEXCEPT;
|
||||
|
||||
_HandleFuncPtr __h = nullptr;
|
||||
_Storage __s;
|
||||
};
|
||||
|
||||
namespace __any_imp
|
||||
{
|
||||
template <class _Tp>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY _SmallHandler
|
||||
{
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
static void* __handle(_Action __act, any const * __this, any * __other,
|
||||
type_info const * __info, const void* __fallback_info)
|
||||
{
|
||||
switch (__act)
|
||||
{
|
||||
case _Action::_Destroy:
|
||||
__destroy(const_cast<any &>(*__this));
|
||||
return nullptr;
|
||||
case _Action::_Copy:
|
||||
__copy(*__this, *__other);
|
||||
return nullptr;
|
||||
case _Action::_Move:
|
||||
__move(const_cast<any &>(*__this), *__other);
|
||||
return nullptr;
|
||||
case _Action::_Get:
|
||||
return __get(const_cast<any &>(*__this), __info, __fallback_info);
|
||||
case _Action::_TypeInfo:
|
||||
return __type_info();
|
||||
}
|
||||
}
|
||||
|
||||
template <class ..._Args>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
static void __create(any & __dest, _Args&&... __args) {
|
||||
::new (static_cast<void*>(&__dest.__s.__buf)) _Tp(_VSTD::forward<_Args>(__args)...);
|
||||
__dest.__h = &_SmallHandler::__handle;
|
||||
}
|
||||
|
||||
private:
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
static void __destroy(any & __this) {
|
||||
_Tp & __value = *static_cast<_Tp *>(static_cast<void*>(&__this.__s.__buf));
|
||||
__value.~_Tp();
|
||||
__this.__h = nullptr;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
static void __copy(any const & __this, any & __dest) {
|
||||
_SmallHandler::__create(__dest, *static_cast<_Tp const *>(
|
||||
static_cast<void const *>(&__this.__s.__buf)));
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
static void __move(any & __this, any & __dest) {
|
||||
_SmallHandler::__create(__dest, _VSTD::move(
|
||||
*static_cast<_Tp*>(static_cast<void*>(&__this.__s.__buf))));
|
||||
__destroy(__this);
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
static void* __get(any & __this,
|
||||
type_info const * __info,
|
||||
const void* __fallback_id)
|
||||
{
|
||||
if (__any_imp::__compare_typeid<_Tp>(__info, __fallback_id))
|
||||
return static_cast<void*>(&__this.__s.__buf);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
static void* __type_info()
|
||||
{
|
||||
#if !defined(_LIBCPP_NO_RTTI)
|
||||
return const_cast<void*>(static_cast<void const *>(&typeid(_Tp)));
|
||||
#else
|
||||
return nullptr;
|
||||
#endif
|
||||
}
|
||||
};
|
||||
|
||||
template <class _Tp>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY _LargeHandler
|
||||
{
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
static void* __handle(_Action __act, any const * __this,
|
||||
any * __other, type_info const * __info,
|
||||
void const* __fallback_info)
|
||||
{
|
||||
switch (__act)
|
||||
{
|
||||
case _Action::_Destroy:
|
||||
__destroy(const_cast<any &>(*__this));
|
||||
return nullptr;
|
||||
case _Action::_Copy:
|
||||
__copy(*__this, *__other);
|
||||
return nullptr;
|
||||
case _Action::_Move:
|
||||
__move(const_cast<any &>(*__this), *__other);
|
||||
return nullptr;
|
||||
case _Action::_Get:
|
||||
return __get(const_cast<any &>(*__this), __info, __fallback_info);
|
||||
case _Action::_TypeInfo:
|
||||
return __type_info();
|
||||
}
|
||||
}
|
||||
|
||||
template <class ..._Args>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
static void __create(any & __dest, _Args&&... __args) {
|
||||
typedef allocator<_Tp> _Alloc;
|
||||
typedef __allocator_destructor<_Alloc> _Dp;
|
||||
_Alloc __a;
|
||||
unique_ptr<_Tp, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
|
||||
::new ((void*)__hold.get()) _Tp(_VSTD::forward<_Args>(__args)...);
|
||||
__dest.__s.__ptr = __hold.release();
|
||||
__dest.__h = &_LargeHandler::__handle;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
static void __destroy(any & __this){
|
||||
delete static_cast<_Tp*>(__this.__s.__ptr);
|
||||
__this.__h = nullptr;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
static void __copy(any const & __this, any & __dest) {
|
||||
_LargeHandler::__create(__dest, *static_cast<_Tp const *>(__this.__s.__ptr));
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
static void __move(any & __this, any & __dest) {
|
||||
__dest.__s.__ptr = __this.__s.__ptr;
|
||||
__dest.__h = &_LargeHandler::__handle;
|
||||
__this.__h = nullptr;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
static void* __get(any & __this, type_info const * __info,
|
||||
void const* __fallback_info)
|
||||
{
|
||||
if (__any_imp::__compare_typeid<_Tp>(__info, __fallback_info))
|
||||
return static_cast<void*>(__this.__s.__ptr);
|
||||
return nullptr;
|
||||
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
static void* __type_info()
|
||||
{
|
||||
#if !defined(_LIBCPP_NO_RTTI)
|
||||
return const_cast<void*>(static_cast<void const *>(&typeid(_Tp)));
|
||||
#else
|
||||
return nullptr;
|
||||
#endif
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace __any_imp
|
||||
|
||||
|
||||
template <class _ValueType, class _Tp, class>
|
||||
any::any(_ValueType && __v) : __h(nullptr)
|
||||
{
|
||||
__any_imp::_Handler<_Tp>::__create(*this, _VSTD::forward<_ValueType>(__v));
|
||||
}
|
||||
|
||||
template <class _ValueType, class ..._Args, class _Tp, class>
|
||||
any::any(in_place_type_t<_ValueType>, _Args&&... __args) {
|
||||
__any_imp::_Handler<_Tp>::__create(*this, _VSTD::forward<_Args>(__args)...);
|
||||
};
|
||||
|
||||
template <class _ValueType, class _Up, class ..._Args, class _Tp, class>
|
||||
any::any(in_place_type_t<_ValueType>, initializer_list<_Up> __il, _Args&&... __args) {
|
||||
__any_imp::_Handler<_Tp>::__create(*this, __il, _VSTD::forward<_Args>(__args)...);
|
||||
}
|
||||
|
||||
template <class _ValueType, class, class>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
any & any::operator=(_ValueType && __v)
|
||||
{
|
||||
any(_VSTD::forward<_ValueType>(__v)).swap(*this);
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <class _ValueType, class ..._Args, class _Tp, class>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void any::emplace(_Args&&... __args) {
|
||||
reset();
|
||||
__any_imp::_Handler<_Tp>::__create(*this, _VSTD::forward<_Args>(__args)...);
|
||||
}
|
||||
|
||||
template <class _ValueType, class _Up, class ..._Args, class _Tp, class>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void any::emplace(initializer_list<_Up> __il, _Args&&... __args) {
|
||||
reset();
|
||||
__any_imp::_Handler<_Tp>::__create(*this, __il, _VSTD::forward<_Args>(__args)...);
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void any::swap(any & __rhs) _NOEXCEPT
|
||||
{
|
||||
if (this == &__rhs)
|
||||
return;
|
||||
if (__h && __rhs.__h) {
|
||||
any __tmp;
|
||||
__rhs.__call(_Action::_Move, &__tmp);
|
||||
this->__call(_Action::_Move, &__rhs);
|
||||
__tmp.__call(_Action::_Move, this);
|
||||
}
|
||||
else if (__h) {
|
||||
this->__call(_Action::_Move, &__rhs);
|
||||
}
|
||||
else if (__rhs.__h) {
|
||||
__rhs.__call(_Action::_Move, this);
|
||||
}
|
||||
}
|
||||
|
||||
// 6.4 Non-member functions
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void swap(any & __lhs, any & __rhs) _NOEXCEPT
|
||||
{
|
||||
__lhs.swap(__rhs);
|
||||
}
|
||||
|
||||
template <class _Tp, class ..._Args>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
any make_any(_Args&&... __args) {
|
||||
return any(in_place_type<_Tp>, _VSTD::forward<_Args>(__args)...);
|
||||
}
|
||||
|
||||
template <class _Tp, class _Up, class ..._Args>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
any make_any(initializer_list<_Up> __il, _Args&&... __args) {
|
||||
return any(in_place_type<_Tp>, __il, _VSTD::forward<_Args>(__args)...);
|
||||
}
|
||||
|
||||
template <class _ValueType>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_ValueType any_cast(any const & __v)
|
||||
{
|
||||
using _RawValueType = __uncvref_t<_ValueType>;
|
||||
static_assert(is_constructible<_ValueType, _RawValueType const &>::value,
|
||||
"ValueType is required to be a const lvalue reference "
|
||||
"or a CopyConstructible type");
|
||||
auto __tmp = _VSTD::any_cast<add_const_t<_RawValueType>>(&__v);
|
||||
if (__tmp == nullptr)
|
||||
__throw_bad_any_cast();
|
||||
return static_cast<_ValueType>(*__tmp);
|
||||
}
|
||||
|
||||
template <class _ValueType>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_ValueType any_cast(any & __v)
|
||||
{
|
||||
using _RawValueType = __uncvref_t<_ValueType>;
|
||||
static_assert(is_constructible<_ValueType, _RawValueType &>::value,
|
||||
"ValueType is required to be an lvalue reference "
|
||||
"or a CopyConstructible type");
|
||||
auto __tmp = _VSTD::any_cast<_RawValueType>(&__v);
|
||||
if (__tmp == nullptr)
|
||||
__throw_bad_any_cast();
|
||||
return static_cast<_ValueType>(*__tmp);
|
||||
}
|
||||
|
||||
template <class _ValueType>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_ValueType any_cast(any && __v)
|
||||
{
|
||||
using _RawValueType = __uncvref_t<_ValueType>;
|
||||
static_assert(is_constructible<_ValueType, _RawValueType>::value,
|
||||
"ValueType is required to be an rvalue reference "
|
||||
"or a CopyConstructible type");
|
||||
auto __tmp = _VSTD::any_cast<_RawValueType>(&__v);
|
||||
if (__tmp == nullptr)
|
||||
__throw_bad_any_cast();
|
||||
return static_cast<_ValueType>(_VSTD::move(*__tmp));
|
||||
}
|
||||
|
||||
template <class _ValueType>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
add_pointer_t<add_const_t<_ValueType>>
|
||||
any_cast(any const * __any) _NOEXCEPT
|
||||
{
|
||||
static_assert(!is_reference<_ValueType>::value,
|
||||
"_ValueType may not be a reference.");
|
||||
return _VSTD::any_cast<_ValueType>(const_cast<any *>(__any));
|
||||
}
|
||||
|
||||
template <class _RetType>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_RetType __pointer_or_func_cast(void* __p, /*IsFunction*/false_type) noexcept {
|
||||
return static_cast<_RetType>(__p);
|
||||
}
|
||||
|
||||
template <class _RetType>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_RetType __pointer_or_func_cast(void*, /*IsFunction*/true_type) noexcept {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
template <class _ValueType>
|
||||
add_pointer_t<_ValueType>
|
||||
any_cast(any * __any) _NOEXCEPT
|
||||
{
|
||||
using __any_imp::_Action;
|
||||
static_assert(!is_reference<_ValueType>::value,
|
||||
"_ValueType may not be a reference.");
|
||||
typedef typename add_pointer<_ValueType>::type _ReturnType;
|
||||
if (__any && __any->__h) {
|
||||
void *__p = __any->__call(_Action::_Get, nullptr,
|
||||
#if !defined(_LIBCPP_NO_RTTI)
|
||||
&typeid(_ValueType),
|
||||
#else
|
||||
nullptr,
|
||||
#endif
|
||||
__any_imp::__get_fallback_typeid<_ValueType>());
|
||||
return _VSTD::__pointer_or_func_cast<_ReturnType>(
|
||||
__p, is_function<_ValueType>{});
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
#endif // _LIBCPP_STD_VER > 14
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP_ANY
|
@ -108,9 +108,6 @@ template <size_t I, class T, size_t N> const T&& get(const array<T, N>&&) noexce
|
||||
#include <iterator>
|
||||
#include <algorithm>
|
||||
#include <stdexcept>
|
||||
#if defined(_LIBCPP_NO_EXCEPTIONS)
|
||||
#include <cassert>
|
||||
#endif
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
@ -209,11 +206,8 @@ typename array<_Tp, _Size>::reference
|
||||
array<_Tp, _Size>::at(size_type __n)
|
||||
{
|
||||
if (__n >= _Size)
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw out_of_range("array::at");
|
||||
#else
|
||||
assert(!"array::at out_of_range");
|
||||
#endif
|
||||
__throw_out_of_range("array::at");
|
||||
|
||||
return __elems_[__n];
|
||||
}
|
||||
|
||||
@ -223,11 +217,7 @@ typename array<_Tp, _Size>::const_reference
|
||||
array<_Tp, _Size>::at(size_type __n) const
|
||||
{
|
||||
if (__n >= _Size)
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw out_of_range("array::at");
|
||||
#else
|
||||
assert(!"array::at out_of_range");
|
||||
#endif
|
||||
__throw_out_of_range("array::at");
|
||||
return __elems_[__n];
|
||||
}
|
||||
|
||||
|
@ -557,7 +557,6 @@ void atomic_signal_fence(memory_order m) noexcept;
|
||||
#endif
|
||||
|
||||
#if _LIBCPP_STD_VER > 14
|
||||
// FIXME: use the right feature test macro value as chose by SG10.
|
||||
# define __cpp_lib_atomic_is_always_lock_free 201603L
|
||||
#endif
|
||||
|
||||
@ -580,11 +579,11 @@ struct __gcc_atomic_t {
|
||||
#endif
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
#ifndef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
__gcc_atomic_t() _NOEXCEPT = default;
|
||||
#else
|
||||
__gcc_atomic_t() _NOEXCEPT : __a_value() {}
|
||||
#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
#endif // _LIBCPP_CXX03_LANG
|
||||
_LIBCPP_CONSTEXPR explicit __gcc_atomic_t(_Tp value) _NOEXCEPT
|
||||
: __a_value(value) {}
|
||||
_Tp __a_value;
|
||||
@ -936,11 +935,11 @@ struct __atomic_base // false
|
||||
{return __c11_atomic_compare_exchange_strong(&__a_, &__e, __d, __m, __m);}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
#ifndef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
__atomic_base() _NOEXCEPT = default;
|
||||
#else
|
||||
__atomic_base() _NOEXCEPT : __a_() {}
|
||||
#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
#endif // _LIBCPP_CXX03_LANG
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_CONSTEXPR __atomic_base(_Tp __d) _NOEXCEPT : __a_(__d) {}
|
||||
@ -1691,11 +1690,11 @@ typedef struct atomic_flag
|
||||
{__c11_atomic_store(&__a_, false, __m);}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
#ifndef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
atomic_flag() _NOEXCEPT = default;
|
||||
#else
|
||||
atomic_flag() _NOEXCEPT : __a_() {}
|
||||
#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
#endif // _LIBCPP_CXX03_LANG
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
atomic_flag(bool __b) _NOEXCEPT : __a_(__b) {} // EXTENSION
|
||||
|
@ -125,9 +125,6 @@ template <size_t N> struct hash<std::bitset<N>>;
|
||||
#include <stdexcept>
|
||||
#include <iosfwd>
|
||||
#include <__functional_base>
|
||||
#if defined(_LIBCPP_NO_EXCEPTIONS)
|
||||
#include <cassert>
|
||||
#endif
|
||||
|
||||
#include <__undef_min_max>
|
||||
|
||||
@ -262,7 +259,7 @@ __bitset<_N_words, _Size>::__bitset(unsigned long long __v) _NOEXCEPT
|
||||
#if __SIZEOF_SIZE_T__ == 8
|
||||
: __first_{__v}
|
||||
#elif __SIZEOF_SIZE_T__ == 4
|
||||
: __first_{__v, __v >> __bits_per_word}
|
||||
: __first_{static_cast<__storage_type>(__v), static_cast<__storage_type>(__v >> __bits_per_word)}
|
||||
#else
|
||||
#error This constructor has not been ported to this platform
|
||||
#endif
|
||||
@ -326,11 +323,8 @@ __bitset<_N_words, _Size>::to_ulong(false_type) const
|
||||
const_iterator __e = __make_iter(_Size);
|
||||
const_iterator __i = _VSTD::find(__make_iter(sizeof(unsigned long) * CHAR_BIT), __e, true);
|
||||
if (__i != __e)
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw overflow_error("bitset to_ulong overflow error");
|
||||
#else
|
||||
assert(!"bitset to_ulong overflow error");
|
||||
#endif
|
||||
__throw_overflow_error("bitset to_ulong overflow error");
|
||||
|
||||
return __first_[0];
|
||||
}
|
||||
|
||||
@ -349,11 +343,8 @@ __bitset<_N_words, _Size>::to_ullong(false_type) const
|
||||
const_iterator __e = __make_iter(_Size);
|
||||
const_iterator __i = _VSTD::find(__make_iter(sizeof(unsigned long long) * CHAR_BIT), __e, true);
|
||||
if (__i != __e)
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw overflow_error("bitset to_ullong overflow error");
|
||||
#else
|
||||
assert(!"bitset to_ullong overflow error");
|
||||
#endif
|
||||
__throw_overflow_error("bitset to_ullong overflow error");
|
||||
|
||||
return to_ullong(true_type());
|
||||
}
|
||||
|
||||
@ -763,11 +754,8 @@ bitset<_Size>::bitset(const _CharT* __str,
|
||||
size_t __rlen = _VSTD::min(__n, char_traits<_CharT>::length(__str));
|
||||
for (size_t __i = 0; __i < __rlen; ++__i)
|
||||
if (__str[__i] != __zero && __str[__i] != __one)
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw invalid_argument("bitset string ctor has invalid argument");
|
||||
#else
|
||||
assert(!"bitset string ctor has invalid argument");
|
||||
#endif
|
||||
__throw_invalid_argument("bitset string ctor has invalid argument");
|
||||
|
||||
size_t _Mp = _VSTD::min(__rlen, _Size);
|
||||
size_t __i = 0;
|
||||
for (; __i < _Mp; ++__i)
|
||||
@ -789,19 +777,13 @@ bitset<_Size>::bitset(const basic_string<_CharT,_Traits,_Allocator>& __str,
|
||||
_CharT __zero, _CharT __one)
|
||||
{
|
||||
if (__pos > __str.size())
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw out_of_range("bitset string pos out of range");
|
||||
#else
|
||||
assert(!"bitset string pos out of range");
|
||||
#endif
|
||||
__throw_out_of_range("bitset string pos out of range");
|
||||
|
||||
size_t __rlen = _VSTD::min(__n, __str.size() - __pos);
|
||||
for (size_t __i = __pos; __i < __pos + __rlen; ++__i)
|
||||
if (!_Traits::eq(__str[__i], __zero) && !_Traits::eq(__str[__i], __one))
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw invalid_argument("bitset string ctor has invalid argument");
|
||||
#else
|
||||
assert(!"bitset string ctor has invalid argument");
|
||||
#endif
|
||||
__throw_invalid_argument("bitset string ctor has invalid argument");
|
||||
|
||||
size_t _Mp = _VSTD::min(__rlen, _Size);
|
||||
size_t __i = 0;
|
||||
for (; __i < _Mp; ++__i)
|
||||
@ -876,11 +858,8 @@ bitset<_Size>&
|
||||
bitset<_Size>::set(size_t __pos, bool __val)
|
||||
{
|
||||
if (__pos >= _Size)
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw out_of_range("bitset set argument out of range");
|
||||
#else
|
||||
assert(!"bitset set argument out of range");
|
||||
#endif
|
||||
__throw_out_of_range("bitset set argument out of range");
|
||||
|
||||
(*this)[__pos] = __val;
|
||||
return *this;
|
||||
}
|
||||
@ -899,11 +878,8 @@ bitset<_Size>&
|
||||
bitset<_Size>::reset(size_t __pos)
|
||||
{
|
||||
if (__pos >= _Size)
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw out_of_range("bitset reset argument out of range");
|
||||
#else
|
||||
assert(!"bitset reset argument out of range");
|
||||
#endif
|
||||
__throw_out_of_range("bitset reset argument out of range");
|
||||
|
||||
(*this)[__pos] = false;
|
||||
return *this;
|
||||
}
|
||||
@ -932,11 +908,8 @@ bitset<_Size>&
|
||||
bitset<_Size>::flip(size_t __pos)
|
||||
{
|
||||
if (__pos >= _Size)
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw out_of_range("bitset flip argument out of range");
|
||||
#else
|
||||
assert(!"bitset flip argument out of range");
|
||||
#endif
|
||||
__throw_out_of_range("bitset flip argument out of range");
|
||||
|
||||
reference r = base::__make_ref(__pos);
|
||||
r = ~r;
|
||||
return *this;
|
||||
@ -1027,11 +1000,8 @@ bool
|
||||
bitset<_Size>::test(size_t __pos) const
|
||||
{
|
||||
if (__pos >= _Size)
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw out_of_range("bitset test argument out of range");
|
||||
#else
|
||||
assert(!"bitset test argument out of range");
|
||||
#endif
|
||||
__throw_out_of_range("bitset test argument out of range");
|
||||
|
||||
return (*this)[__pos];
|
||||
}
|
||||
|
||||
|
@ -529,7 +529,7 @@ private:
|
||||
public:
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
#ifndef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
duration() = default;
|
||||
#else
|
||||
duration() {}
|
||||
@ -1026,7 +1026,8 @@ inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type>
|
||||
operator-(const time_point<_Clock, _Duration1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
|
||||
{
|
||||
return __lhs + (-__rhs);
|
||||
typedef time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type> _Ret;
|
||||
return _Ret(__lhs.time_since_epoch() -__rhs);
|
||||
}
|
||||
|
||||
// duration operator-(time_point x, time_point y);
|
||||
|
102
include/cmath
102
include/cmath
@ -331,7 +331,6 @@ using ::double_t;
|
||||
using ::abs;
|
||||
#endif
|
||||
|
||||
#ifndef __sun__
|
||||
using ::acos;
|
||||
using ::acosf;
|
||||
using ::asin;
|
||||
@ -346,58 +345,47 @@ using ::cos;
|
||||
using ::cosf;
|
||||
using ::cosh;
|
||||
using ::coshf;
|
||||
#endif // __sun__
|
||||
|
||||
using ::exp;
|
||||
using ::expf;
|
||||
|
||||
#ifndef __sun__
|
||||
using ::fabs;
|
||||
using ::fabsf;
|
||||
using ::floor;
|
||||
using ::floorf;
|
||||
#endif //__sun__
|
||||
|
||||
using ::fmod;
|
||||
using ::fmodf;
|
||||
|
||||
#ifndef __sun__
|
||||
using ::frexp;
|
||||
using ::frexpf;
|
||||
using ::ldexp;
|
||||
using ::ldexpf;
|
||||
#endif // __sun__
|
||||
|
||||
using ::log;
|
||||
using ::logf;
|
||||
|
||||
#ifndef __sun__
|
||||
using ::log10;
|
||||
using ::log10f;
|
||||
using ::modf;
|
||||
using ::modff;
|
||||
#endif // __sun__
|
||||
|
||||
using ::pow;
|
||||
using ::powf;
|
||||
|
||||
#ifndef __sun__
|
||||
using ::sin;
|
||||
using ::sinf;
|
||||
using ::sinh;
|
||||
using ::sinhf;
|
||||
#endif // __sun__
|
||||
|
||||
using ::sqrt;
|
||||
using ::sqrtf;
|
||||
using ::tan;
|
||||
using ::tanf;
|
||||
|
||||
#ifndef __sun__
|
||||
using ::tanh;
|
||||
using ::tanhf;
|
||||
|
||||
#ifndef _LIBCPP_MSVCRT
|
||||
using ::acosh;
|
||||
using ::acoshf;
|
||||
using ::asinh;
|
||||
@ -406,7 +394,6 @@ using ::atanh;
|
||||
using ::atanhf;
|
||||
using ::cbrt;
|
||||
using ::cbrtf;
|
||||
#endif
|
||||
|
||||
using ::copysign;
|
||||
using ::copysignf;
|
||||
@ -449,14 +436,10 @@ using ::lrintf;
|
||||
using ::lround;
|
||||
using ::lroundf;
|
||||
#endif // _LIBCPP_MSVCRT
|
||||
#endif // __sun__
|
||||
|
||||
#ifndef _LIBCPP_MSVCRT
|
||||
using ::nan;
|
||||
using ::nanf;
|
||||
#endif // _LIBCPP_MSVCRT
|
||||
|
||||
#ifndef __sun__
|
||||
#ifndef _LIBCPP_MSVCRT
|
||||
using ::nearbyint;
|
||||
using ::nearbyintf;
|
||||
@ -504,13 +487,11 @@ using ::sinhl;
|
||||
using ::sqrtl;
|
||||
using ::tanl;
|
||||
|
||||
#ifndef _LIBCPP_MSVCRT
|
||||
using ::tanhl;
|
||||
using ::acoshl;
|
||||
using ::asinhl;
|
||||
using ::atanhl;
|
||||
using ::cbrtl;
|
||||
#endif // !_LIBCPP_MSVCRT
|
||||
|
||||
using ::copysignl;
|
||||
|
||||
@ -547,11 +528,6 @@ using ::tgammal;
|
||||
using ::truncl;
|
||||
#endif // !_LIBCPP_MSVCRT
|
||||
|
||||
#else
|
||||
using ::lgamma;
|
||||
using ::lgammaf;
|
||||
#endif // __sun__
|
||||
|
||||
#if _LIBCPP_STD_VER > 14
|
||||
inline _LIBCPP_INLINE_VISIBILITY float hypot( float x, float y, float z ) { return sqrt(x*x + y*y + z*z); }
|
||||
inline _LIBCPP_INLINE_VISIBILITY double hypot( double x, double y, double z ) { return sqrt(x*x + y*y + z*z); }
|
||||
@ -559,23 +535,83 @@ inline _LIBCPP_INLINE_VISIBILITY long double hypot( long double x, long double y
|
||||
|
||||
template <class _A1, class _A2, class _A3>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
typename std::__lazy_enable_if
|
||||
typename __lazy_enable_if
|
||||
<
|
||||
std::is_arithmetic<_A1>::value &&
|
||||
std::is_arithmetic<_A2>::value &&
|
||||
std::is_arithmetic<_A3>::value,
|
||||
std::__promote<_A1, _A2, _A3>
|
||||
is_arithmetic<_A1>::value &&
|
||||
is_arithmetic<_A2>::value &&
|
||||
is_arithmetic<_A3>::value,
|
||||
__promote<_A1, _A2, _A3>
|
||||
>::type
|
||||
hypot(_A1 __lcpp_x, _A2 __lcpp_y, _A3 __lcpp_z) _NOEXCEPT
|
||||
{
|
||||
typedef typename std::__promote<_A1, _A2, _A3>::type __result_type;
|
||||
static_assert((!(std::is_same<_A1, __result_type>::value &&
|
||||
std::is_same<_A2, __result_type>::value &&
|
||||
std::is_same<_A3, __result_type>::value)), "");
|
||||
typedef typename __promote<_A1, _A2, _A3>::type __result_type;
|
||||
static_assert((!(is_same<_A1, __result_type>::value &&
|
||||
is_same<_A2, __result_type>::value &&
|
||||
is_same<_A3, __result_type>::value)), "");
|
||||
return hypot((__result_type)__lcpp_x, (__result_type)__lcpp_y, (__result_type)__lcpp_z);
|
||||
}
|
||||
#endif
|
||||
|
||||
template <class _A1>
|
||||
_LIBCPP_ALWAYS_INLINE
|
||||
_LIBCPP_CONSTEXPR typename enable_if<is_floating_point<_A1>::value, bool>::type
|
||||
__libcpp_isnan(_A1 __lcpp_x) _NOEXCEPT
|
||||
{
|
||||
#if __has_builtin(__builtin_isnan)
|
||||
return __builtin_isnan(__lcpp_x);
|
||||
#else
|
||||
return isnan(__lcpp_x);
|
||||
#endif
|
||||
}
|
||||
|
||||
template <class _A1>
|
||||
_LIBCPP_ALWAYS_INLINE
|
||||
_LIBCPP_CONSTEXPR typename enable_if<!is_floating_point<_A1>::value, bool>::type
|
||||
__libcpp_isnan(_A1 __lcpp_x) _NOEXCEPT
|
||||
{
|
||||
return isnan(__lcpp_x);
|
||||
}
|
||||
|
||||
template <class _A1>
|
||||
_LIBCPP_ALWAYS_INLINE
|
||||
_LIBCPP_CONSTEXPR typename enable_if<is_floating_point<_A1>::value, bool>::type
|
||||
__libcpp_isinf(_A1 __lcpp_x) _NOEXCEPT
|
||||
{
|
||||
#if __has_builtin(__builtin_isinf)
|
||||
return __builtin_isinf(__lcpp_x);
|
||||
#else
|
||||
return isinf(__lcpp_x);
|
||||
#endif
|
||||
}
|
||||
|
||||
template <class _A1>
|
||||
_LIBCPP_ALWAYS_INLINE
|
||||
_LIBCPP_CONSTEXPR typename enable_if<!is_floating_point<_A1>::value, bool>::type
|
||||
__libcpp_isinf(_A1 __lcpp_x) _NOEXCEPT
|
||||
{
|
||||
return isinf(__lcpp_x);
|
||||
}
|
||||
|
||||
template <class _A1>
|
||||
_LIBCPP_ALWAYS_INLINE
|
||||
_LIBCPP_CONSTEXPR typename enable_if<is_floating_point<_A1>::value, bool>::type
|
||||
__libcpp_isfinite(_A1 __lcpp_x) _NOEXCEPT
|
||||
{
|
||||
#if __has_builtin(__builtin_isfinite)
|
||||
return __builtin_isfinite(__lcpp_x);
|
||||
#else
|
||||
return isfinite(__lcpp_x);
|
||||
#endif
|
||||
}
|
||||
|
||||
template <class _A1>
|
||||
_LIBCPP_ALWAYS_INLINE
|
||||
_LIBCPP_CONSTEXPR typename enable_if<!is_floating_point<_A1>::value, bool>::type
|
||||
__libcpp_isfinite(_A1 __lcpp_x) _NOEXCEPT
|
||||
{
|
||||
return isfinite(__lcpp_x);
|
||||
}
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP_CMATH
|
||||
|
369
include/complex
369
include/complex
@ -245,9 +245,6 @@ template<class T, class charT, class traits>
|
||||
#include <stdexcept>
|
||||
#include <cmath>
|
||||
#include <sstream>
|
||||
#if defined(_LIBCPP_NO_EXCEPTIONS)
|
||||
#include <cassert>
|
||||
#endif
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
@ -602,39 +599,39 @@ operator*(const complex<_Tp>& __z, const complex<_Tp>& __w)
|
||||
_Tp __bc = __b * __c;
|
||||
_Tp __x = __ac - __bd;
|
||||
_Tp __y = __ad + __bc;
|
||||
if (isnan(__x) && isnan(__y))
|
||||
if (__libcpp_isnan(__x) && __libcpp_isnan(__y))
|
||||
{
|
||||
bool __recalc = false;
|
||||
if (isinf(__a) || isinf(__b))
|
||||
if (__libcpp_isinf(__a) || __libcpp_isinf(__b))
|
||||
{
|
||||
__a = copysign(isinf(__a) ? _Tp(1) : _Tp(0), __a);
|
||||
__b = copysign(isinf(__b) ? _Tp(1) : _Tp(0), __b);
|
||||
if (isnan(__c))
|
||||
__a = copysign(__libcpp_isinf(__a) ? _Tp(1) : _Tp(0), __a);
|
||||
__b = copysign(__libcpp_isinf(__b) ? _Tp(1) : _Tp(0), __b);
|
||||
if (__libcpp_isnan(__c))
|
||||
__c = copysign(_Tp(0), __c);
|
||||
if (isnan(__d))
|
||||
if (__libcpp_isnan(__d))
|
||||
__d = copysign(_Tp(0), __d);
|
||||
__recalc = true;
|
||||
}
|
||||
if (isinf(__c) || isinf(__d))
|
||||
if (__libcpp_isinf(__c) || __libcpp_isinf(__d))
|
||||
{
|
||||
__c = copysign(isinf(__c) ? _Tp(1) : _Tp(0), __c);
|
||||
__d = copysign(isinf(__d) ? _Tp(1) : _Tp(0), __d);
|
||||
if (isnan(__a))
|
||||
__c = copysign(__libcpp_isinf(__c) ? _Tp(1) : _Tp(0), __c);
|
||||
__d = copysign(__libcpp_isinf(__d) ? _Tp(1) : _Tp(0), __d);
|
||||
if (__libcpp_isnan(__a))
|
||||
__a = copysign(_Tp(0), __a);
|
||||
if (isnan(__b))
|
||||
if (__libcpp_isnan(__b))
|
||||
__b = copysign(_Tp(0), __b);
|
||||
__recalc = true;
|
||||
}
|
||||
if (!__recalc && (isinf(__ac) || isinf(__bd) ||
|
||||
isinf(__ad) || isinf(__bc)))
|
||||
if (!__recalc && (__libcpp_isinf(__ac) || __libcpp_isinf(__bd) ||
|
||||
__libcpp_isinf(__ad) || __libcpp_isinf(__bc)))
|
||||
{
|
||||
if (isnan(__a))
|
||||
if (__libcpp_isnan(__a))
|
||||
__a = copysign(_Tp(0), __a);
|
||||
if (isnan(__b))
|
||||
if (__libcpp_isnan(__b))
|
||||
__b = copysign(_Tp(0), __b);
|
||||
if (isnan(__c))
|
||||
if (__libcpp_isnan(__c))
|
||||
__c = copysign(_Tp(0), __c);
|
||||
if (isnan(__d))
|
||||
if (__libcpp_isnan(__d))
|
||||
__d = copysign(_Tp(0), __d);
|
||||
__recalc = true;
|
||||
}
|
||||
@ -677,7 +674,7 @@ operator/(const complex<_Tp>& __z, const complex<_Tp>& __w)
|
||||
_Tp __c = __w.real();
|
||||
_Tp __d = __w.imag();
|
||||
_Tp __logbw = logb(fmax(fabs(__c), fabs(__d)));
|
||||
if (isfinite(__logbw))
|
||||
if (__libcpp_isfinite(__logbw))
|
||||
{
|
||||
__ilogbw = static_cast<int>(__logbw);
|
||||
__c = scalbn(__c, -__ilogbw);
|
||||
@ -686,24 +683,24 @@ operator/(const complex<_Tp>& __z, const complex<_Tp>& __w)
|
||||
_Tp __denom = __c * __c + __d * __d;
|
||||
_Tp __x = scalbn((__a * __c + __b * __d) / __denom, -__ilogbw);
|
||||
_Tp __y = scalbn((__b * __c - __a * __d) / __denom, -__ilogbw);
|
||||
if (isnan(__x) && isnan(__y))
|
||||
if (__libcpp_isnan(__x) && __libcpp_isnan(__y))
|
||||
{
|
||||
if ((__denom == _Tp(0)) && (!isnan(__a) || !isnan(__b)))
|
||||
if ((__denom == _Tp(0)) && (!__libcpp_isnan(__a) || !__libcpp_isnan(__b)))
|
||||
{
|
||||
__x = copysign(_Tp(INFINITY), __c) * __a;
|
||||
__y = copysign(_Tp(INFINITY), __c) * __b;
|
||||
}
|
||||
else if ((isinf(__a) || isinf(__b)) && isfinite(__c) && isfinite(__d))
|
||||
else if ((__libcpp_isinf(__a) || __libcpp_isinf(__b)) && __libcpp_isfinite(__c) && __libcpp_isfinite(__d))
|
||||
{
|
||||
__a = copysign(isinf(__a) ? _Tp(1) : _Tp(0), __a);
|
||||
__b = copysign(isinf(__b) ? _Tp(1) : _Tp(0), __b);
|
||||
__a = copysign(__libcpp_isinf(__a) ? _Tp(1) : _Tp(0), __a);
|
||||
__b = copysign(__libcpp_isinf(__b) ? _Tp(1) : _Tp(0), __b);
|
||||
__x = _Tp(INFINITY) * (__a * __c + __b * __d);
|
||||
__y = _Tp(INFINITY) * (__b * __c - __a * __d);
|
||||
}
|
||||
else if (isinf(__logbw) && __logbw > _Tp(0) && isfinite(__a) && isfinite(__b))
|
||||
else if (__libcpp_isinf(__logbw) && __logbw > _Tp(0) && __libcpp_isfinite(__a) && __libcpp_isfinite(__b))
|
||||
{
|
||||
__c = copysign(isinf(__c) ? _Tp(1) : _Tp(0), __c);
|
||||
__d = copysign(isinf(__d) ? _Tp(1) : _Tp(0), __d);
|
||||
__c = copysign(__libcpp_isinf(__c) ? _Tp(1) : _Tp(0), __c);
|
||||
__d = copysign(__libcpp_isinf(__d) ? _Tp(1) : _Tp(0), __d);
|
||||
__x = _Tp(0) * (__a * __c + __b * __d);
|
||||
__y = _Tp(0) * (__b * __c - __a * __d);
|
||||
}
|
||||
@ -795,6 +792,27 @@ operator!=(const _Tp& __x, const complex<_Tp>& __y)
|
||||
|
||||
// 26.3.7 values:
|
||||
|
||||
template <class _Tp, bool = is_integral<_Tp>::value,
|
||||
bool = is_floating_point<_Tp>::value
|
||||
>
|
||||
struct __libcpp_complex_overload_traits {};
|
||||
|
||||
// Integral Types
|
||||
template <class _Tp>
|
||||
struct __libcpp_complex_overload_traits<_Tp, true, false>
|
||||
{
|
||||
typedef double _ValueType;
|
||||
typedef complex<double> _ComplexType;
|
||||
};
|
||||
|
||||
// Floating point types
|
||||
template <class _Tp>
|
||||
struct __libcpp_complex_overload_traits<_Tp, false, true>
|
||||
{
|
||||
typedef _Tp _ValueType;
|
||||
typedef complex<_Tp> _ComplexType;
|
||||
};
|
||||
|
||||
// real
|
||||
|
||||
template<class _Tp>
|
||||
@ -805,35 +823,10 @@ real(const complex<_Tp>& __c)
|
||||
return __c.real();
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
long double
|
||||
real(long double __re)
|
||||
{
|
||||
return __re;
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
double
|
||||
real(double __re)
|
||||
{
|
||||
return __re;
|
||||
}
|
||||
|
||||
template<class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
typename enable_if
|
||||
<
|
||||
is_integral<_Tp>::value,
|
||||
double
|
||||
>::type
|
||||
real(_Tp __re)
|
||||
{
|
||||
return __re;
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
float
|
||||
real(float __re)
|
||||
typename __libcpp_complex_overload_traits<_Tp>::_ValueType
|
||||
real(_Tp __re)
|
||||
{
|
||||
return __re;
|
||||
}
|
||||
@ -848,35 +841,10 @@ imag(const complex<_Tp>& __c)
|
||||
return __c.imag();
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
long double
|
||||
imag(long double __re)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
double
|
||||
imag(double __re)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
template<class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
typename enable_if
|
||||
<
|
||||
is_integral<_Tp>::value,
|
||||
double
|
||||
>::type
|
||||
imag(_Tp __re)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
float
|
||||
imag(float __re)
|
||||
typename __libcpp_complex_overload_traits<_Tp>::_ValueType
|
||||
imag(_Tp)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
@ -901,25 +869,22 @@ arg(const complex<_Tp>& __c)
|
||||
return atan2(__c.imag(), __c.real());
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
long double
|
||||
arg(long double __re)
|
||||
typename enable_if<
|
||||
is_same<_Tp, long double>::value,
|
||||
long double
|
||||
>::type
|
||||
arg(_Tp __re)
|
||||
{
|
||||
return atan2l(0.L, __re);
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
double
|
||||
arg(double __re)
|
||||
{
|
||||
return atan2(0., __re);
|
||||
}
|
||||
|
||||
template<class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
typename enable_if
|
||||
<
|
||||
is_integral<_Tp>::value,
|
||||
is_integral<_Tp>::value || is_same<_Tp, double>::value,
|
||||
double
|
||||
>::type
|
||||
arg(_Tp __re)
|
||||
@ -927,9 +892,13 @@ arg(_Tp __re)
|
||||
return atan2(0., __re);
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
float
|
||||
arg(float __re)
|
||||
typename enable_if<
|
||||
is_same<_Tp, float>::value,
|
||||
float
|
||||
>::type
|
||||
arg(_Tp __re)
|
||||
{
|
||||
return atan2f(0.F, __re);
|
||||
}
|
||||
@ -941,44 +910,20 @@ inline _LIBCPP_INLINE_VISIBILITY
|
||||
_Tp
|
||||
norm(const complex<_Tp>& __c)
|
||||
{
|
||||
if (isinf(__c.real()))
|
||||
if (__libcpp_isinf(__c.real()))
|
||||
return abs(__c.real());
|
||||
if (isinf(__c.imag()))
|
||||
if (__libcpp_isinf(__c.imag()))
|
||||
return abs(__c.imag());
|
||||
return __c.real() * __c.real() + __c.imag() * __c.imag();
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
long double
|
||||
norm(long double __re)
|
||||
{
|
||||
return __re * __re;
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
double
|
||||
norm(double __re)
|
||||
{
|
||||
return __re * __re;
|
||||
}
|
||||
|
||||
template<class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
typename enable_if
|
||||
<
|
||||
is_integral<_Tp>::value,
|
||||
double
|
||||
>::type
|
||||
typename __libcpp_complex_overload_traits<_Tp>::_ValueType
|
||||
norm(_Tp __re)
|
||||
{
|
||||
return (double)__re * __re;
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
float
|
||||
norm(float __re)
|
||||
{
|
||||
return __re * __re;
|
||||
typedef typename __libcpp_complex_overload_traits<_Tp>::_ValueType _ValueType;
|
||||
return static_cast<_ValueType>(__re) * __re;
|
||||
}
|
||||
|
||||
// conj
|
||||
@ -991,38 +936,16 @@ conj(const complex<_Tp>& __c)
|
||||
return complex<_Tp>(__c.real(), -__c.imag());
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
complex<long double>
|
||||
conj(long double __re)
|
||||
{
|
||||
return complex<long double>(__re);
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
complex<double>
|
||||
conj(double __re)
|
||||
{
|
||||
return complex<double>(__re);
|
||||
}
|
||||
|
||||
template<class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
typename enable_if
|
||||
<
|
||||
is_integral<_Tp>::value,
|
||||
complex<double>
|
||||
>::type
|
||||
typename __libcpp_complex_overload_traits<_Tp>::_ComplexType
|
||||
conj(_Tp __re)
|
||||
{
|
||||
return complex<double>(__re);
|
||||
typedef typename __libcpp_complex_overload_traits<_Tp>::_ComplexType _ComplexType;
|
||||
return _ComplexType(__re);
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
complex<float>
|
||||
conj(float __re)
|
||||
{
|
||||
return complex<float>(__re);
|
||||
}
|
||||
|
||||
|
||||
// proj
|
||||
|
||||
@ -1032,48 +955,36 @@ complex<_Tp>
|
||||
proj(const complex<_Tp>& __c)
|
||||
{
|
||||
std::complex<_Tp> __r = __c;
|
||||
if (isinf(__c.real()) || isinf(__c.imag()))
|
||||
if (__libcpp_isinf(__c.real()) || __libcpp_isinf(__c.imag()))
|
||||
__r = complex<_Tp>(INFINITY, copysign(_Tp(0), __c.imag()));
|
||||
return __r;
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
complex<long double>
|
||||
proj(long double __re)
|
||||
typename enable_if
|
||||
<
|
||||
is_floating_point<_Tp>::value,
|
||||
typename __libcpp_complex_overload_traits<_Tp>::_ComplexType
|
||||
>::type
|
||||
proj(_Tp __re)
|
||||
{
|
||||
if (isinf(__re))
|
||||
if (__libcpp_isinf(__re))
|
||||
__re = abs(__re);
|
||||
return complex<long double>(__re);
|
||||
return complex<_Tp>(__re);
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
complex<double>
|
||||
proj(double __re)
|
||||
{
|
||||
if (isinf(__re))
|
||||
__re = abs(__re);
|
||||
return complex<double>(__re);
|
||||
}
|
||||
|
||||
template<class _Tp>
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
typename enable_if
|
||||
<
|
||||
is_integral<_Tp>::value,
|
||||
complex<double>
|
||||
typename __libcpp_complex_overload_traits<_Tp>::_ComplexType
|
||||
>::type
|
||||
proj(_Tp __re)
|
||||
{
|
||||
return complex<double>(__re);
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
complex<float>
|
||||
proj(float __re)
|
||||
{
|
||||
if (isinf(__re))
|
||||
__re = abs(__re);
|
||||
return complex<float>(__re);
|
||||
typedef typename __libcpp_complex_overload_traits<_Tp>::_ComplexType _ComplexType;
|
||||
return _ComplexType(__re);
|
||||
}
|
||||
|
||||
// polar
|
||||
@ -1082,25 +993,25 @@ template<class _Tp>
|
||||
complex<_Tp>
|
||||
polar(const _Tp& __rho, const _Tp& __theta = _Tp(0))
|
||||
{
|
||||
if (isnan(__rho) || signbit(__rho))
|
||||
if (__libcpp_isnan(__rho) || signbit(__rho))
|
||||
return complex<_Tp>(_Tp(NAN), _Tp(NAN));
|
||||
if (isnan(__theta))
|
||||
if (__libcpp_isnan(__theta))
|
||||
{
|
||||
if (isinf(__rho))
|
||||
if (__libcpp_isinf(__rho))
|
||||
return complex<_Tp>(__rho, __theta);
|
||||
return complex<_Tp>(__theta, __theta);
|
||||
}
|
||||
if (isinf(__theta))
|
||||
if (__libcpp_isinf(__theta))
|
||||
{
|
||||
if (isinf(__rho))
|
||||
if (__libcpp_isinf(__rho))
|
||||
return complex<_Tp>(__rho, _Tp(NAN));
|
||||
return complex<_Tp>(_Tp(NAN), _Tp(NAN));
|
||||
}
|
||||
_Tp __x = __rho * cos(__theta);
|
||||
if (isnan(__x))
|
||||
if (__libcpp_isnan(__x))
|
||||
__x = 0;
|
||||
_Tp __y = __rho * sin(__theta);
|
||||
if (isnan(__y))
|
||||
if (__libcpp_isnan(__y))
|
||||
__y = 0;
|
||||
return complex<_Tp>(__x, __y);
|
||||
}
|
||||
@ -1131,13 +1042,13 @@ template<class _Tp>
|
||||
complex<_Tp>
|
||||
sqrt(const complex<_Tp>& __x)
|
||||
{
|
||||
if (isinf(__x.imag()))
|
||||
if (__libcpp_isinf(__x.imag()))
|
||||
return complex<_Tp>(_Tp(INFINITY), __x.imag());
|
||||
if (isinf(__x.real()))
|
||||
if (__libcpp_isinf(__x.real()))
|
||||
{
|
||||
if (__x.real() > _Tp(0))
|
||||
return complex<_Tp>(__x.real(), isnan(__x.imag()) ? __x.imag() : copysign(_Tp(0), __x.imag()));
|
||||
return complex<_Tp>(isnan(__x.imag()) ? __x.imag() : _Tp(0), copysign(__x.real(), __x.imag()));
|
||||
return complex<_Tp>(__x.real(), __libcpp_isnan(__x.imag()) ? __x.imag() : copysign(_Tp(0), __x.imag()));
|
||||
return complex<_Tp>(__libcpp_isnan(__x.imag()) ? __x.imag() : _Tp(0), copysign(__x.real(), __x.imag()));
|
||||
}
|
||||
return polar(sqrt(abs(__x)), arg(__x) / _Tp(2));
|
||||
}
|
||||
@ -1149,21 +1060,21 @@ complex<_Tp>
|
||||
exp(const complex<_Tp>& __x)
|
||||
{
|
||||
_Tp __i = __x.imag();
|
||||
if (isinf(__x.real()))
|
||||
if (__libcpp_isinf(__x.real()))
|
||||
{
|
||||
if (__x.real() < _Tp(0))
|
||||
{
|
||||
if (!isfinite(__i))
|
||||
if (!__libcpp_isfinite(__i))
|
||||
__i = _Tp(1);
|
||||
}
|
||||
else if (__i == 0 || !isfinite(__i))
|
||||
else if (__i == 0 || !__libcpp_isfinite(__i))
|
||||
{
|
||||
if (isinf(__i))
|
||||
if (__libcpp_isinf(__i))
|
||||
__i = _Tp(NAN);
|
||||
return complex<_Tp>(__x.real(), __i);
|
||||
}
|
||||
}
|
||||
else if (isnan(__x.real()) && __x.imag() == 0)
|
||||
else if (__libcpp_isnan(__x.real()) && __x.imag() == 0)
|
||||
return __x;
|
||||
_Tp __e = exp(__x.real());
|
||||
return complex<_Tp>(__e * cos(__i), __e * sin(__i));
|
||||
@ -1221,23 +1132,23 @@ complex<_Tp>
|
||||
asinh(const complex<_Tp>& __x)
|
||||
{
|
||||
const _Tp __pi(atan2(+0., -0.));
|
||||
if (isinf(__x.real()))
|
||||
if (__libcpp_isinf(__x.real()))
|
||||
{
|
||||
if (isnan(__x.imag()))
|
||||
if (__libcpp_isnan(__x.imag()))
|
||||
return __x;
|
||||
if (isinf(__x.imag()))
|
||||
if (__libcpp_isinf(__x.imag()))
|
||||
return complex<_Tp>(__x.real(), copysign(__pi * _Tp(0.25), __x.imag()));
|
||||
return complex<_Tp>(__x.real(), copysign(_Tp(0), __x.imag()));
|
||||
}
|
||||
if (isnan(__x.real()))
|
||||
if (__libcpp_isnan(__x.real()))
|
||||
{
|
||||
if (isinf(__x.imag()))
|
||||
if (__libcpp_isinf(__x.imag()))
|
||||
return complex<_Tp>(__x.imag(), __x.real());
|
||||
if (__x.imag() == 0)
|
||||
return __x;
|
||||
return complex<_Tp>(__x.real(), __x.real());
|
||||
}
|
||||
if (isinf(__x.imag()))
|
||||
if (__libcpp_isinf(__x.imag()))
|
||||
return complex<_Tp>(copysign(__x.imag(), __x.real()), copysign(__pi/_Tp(2), __x.imag()));
|
||||
complex<_Tp> __z = log(__x + sqrt(pow(__x, _Tp(2)) + _Tp(1)));
|
||||
return complex<_Tp>(copysign(__z.real(), __x.real()), copysign(__z.imag(), __x.imag()));
|
||||
@ -1250,11 +1161,11 @@ complex<_Tp>
|
||||
acosh(const complex<_Tp>& __x)
|
||||
{
|
||||
const _Tp __pi(atan2(+0., -0.));
|
||||
if (isinf(__x.real()))
|
||||
if (__libcpp_isinf(__x.real()))
|
||||
{
|
||||
if (isnan(__x.imag()))
|
||||
if (__libcpp_isnan(__x.imag()))
|
||||
return complex<_Tp>(abs(__x.real()), __x.imag());
|
||||
if (isinf(__x.imag()))
|
||||
if (__libcpp_isinf(__x.imag()))
|
||||
{
|
||||
if (__x.real() > 0)
|
||||
return complex<_Tp>(__x.real(), copysign(__pi * _Tp(0.25), __x.imag()));
|
||||
@ -1265,13 +1176,13 @@ acosh(const complex<_Tp>& __x)
|
||||
return complex<_Tp>(-__x.real(), copysign(__pi, __x.imag()));
|
||||
return complex<_Tp>(__x.real(), copysign(_Tp(0), __x.imag()));
|
||||
}
|
||||
if (isnan(__x.real()))
|
||||
if (__libcpp_isnan(__x.real()))
|
||||
{
|
||||
if (isinf(__x.imag()))
|
||||
if (__libcpp_isinf(__x.imag()))
|
||||
return complex<_Tp>(abs(__x.imag()), __x.real());
|
||||
return complex<_Tp>(__x.real(), __x.real());
|
||||
}
|
||||
if (isinf(__x.imag()))
|
||||
if (__libcpp_isinf(__x.imag()))
|
||||
return complex<_Tp>(abs(__x.imag()), copysign(__pi/_Tp(2), __x.imag()));
|
||||
complex<_Tp> __z = log(__x + sqrt(pow(__x, _Tp(2)) - _Tp(1)));
|
||||
return complex<_Tp>(copysign(__z.real(), _Tp(0)), copysign(__z.imag(), __x.imag()));
|
||||
@ -1284,21 +1195,21 @@ complex<_Tp>
|
||||
atanh(const complex<_Tp>& __x)
|
||||
{
|
||||
const _Tp __pi(atan2(+0., -0.));
|
||||
if (isinf(__x.imag()))
|
||||
if (__libcpp_isinf(__x.imag()))
|
||||
{
|
||||
return complex<_Tp>(copysign(_Tp(0), __x.real()), copysign(__pi/_Tp(2), __x.imag()));
|
||||
}
|
||||
if (isnan(__x.imag()))
|
||||
if (__libcpp_isnan(__x.imag()))
|
||||
{
|
||||
if (isinf(__x.real()) || __x.real() == 0)
|
||||
if (__libcpp_isinf(__x.real()) || __x.real() == 0)
|
||||
return complex<_Tp>(copysign(_Tp(0), __x.real()), __x.imag());
|
||||
return complex<_Tp>(__x.imag(), __x.imag());
|
||||
}
|
||||
if (isnan(__x.real()))
|
||||
if (__libcpp_isnan(__x.real()))
|
||||
{
|
||||
return complex<_Tp>(__x.real(), __x.real());
|
||||
}
|
||||
if (isinf(__x.real()))
|
||||
if (__libcpp_isinf(__x.real()))
|
||||
{
|
||||
return complex<_Tp>(copysign(_Tp(0), __x.real()), copysign(__pi/_Tp(2), __x.imag()));
|
||||
}
|
||||
@ -1316,11 +1227,11 @@ template<class _Tp>
|
||||
complex<_Tp>
|
||||
sinh(const complex<_Tp>& __x)
|
||||
{
|
||||
if (isinf(__x.real()) && !isfinite(__x.imag()))
|
||||
if (__libcpp_isinf(__x.real()) && !__libcpp_isfinite(__x.imag()))
|
||||
return complex<_Tp>(__x.real(), _Tp(NAN));
|
||||
if (__x.real() == 0 && !isfinite(__x.imag()))
|
||||
if (__x.real() == 0 && !__libcpp_isfinite(__x.imag()))
|
||||
return complex<_Tp>(__x.real(), _Tp(NAN));
|
||||
if (__x.imag() == 0 && !isfinite(__x.real()))
|
||||
if (__x.imag() == 0 && !__libcpp_isfinite(__x.real()))
|
||||
return __x;
|
||||
return complex<_Tp>(sinh(__x.real()) * cos(__x.imag()), cosh(__x.real()) * sin(__x.imag()));
|
||||
}
|
||||
@ -1331,13 +1242,13 @@ template<class _Tp>
|
||||
complex<_Tp>
|
||||
cosh(const complex<_Tp>& __x)
|
||||
{
|
||||
if (isinf(__x.real()) && !isfinite(__x.imag()))
|
||||
if (__libcpp_isinf(__x.real()) && !__libcpp_isfinite(__x.imag()))
|
||||
return complex<_Tp>(abs(__x.real()), _Tp(NAN));
|
||||
if (__x.real() == 0 && !isfinite(__x.imag()))
|
||||
if (__x.real() == 0 && !__libcpp_isfinite(__x.imag()))
|
||||
return complex<_Tp>(_Tp(NAN), __x.real());
|
||||
if (__x.real() == 0 && __x.imag() == 0)
|
||||
return complex<_Tp>(_Tp(1), __x.imag());
|
||||
if (__x.imag() == 0 && !isfinite(__x.real()))
|
||||
if (__x.imag() == 0 && !__libcpp_isfinite(__x.real()))
|
||||
return complex<_Tp>(abs(__x.real()), __x.imag());
|
||||
return complex<_Tp>(cosh(__x.real()) * cos(__x.imag()), sinh(__x.real()) * sin(__x.imag()));
|
||||
}
|
||||
@ -1348,19 +1259,19 @@ template<class _Tp>
|
||||
complex<_Tp>
|
||||
tanh(const complex<_Tp>& __x)
|
||||
{
|
||||
if (isinf(__x.real()))
|
||||
if (__libcpp_isinf(__x.real()))
|
||||
{
|
||||
if (!isfinite(__x.imag()))
|
||||
if (!__libcpp_isfinite(__x.imag()))
|
||||
return complex<_Tp>(_Tp(1), _Tp(0));
|
||||
return complex<_Tp>(_Tp(1), copysign(_Tp(0), sin(_Tp(2) * __x.imag())));
|
||||
}
|
||||
if (isnan(__x.real()) && __x.imag() == 0)
|
||||
if (__libcpp_isnan(__x.real()) && __x.imag() == 0)
|
||||
return __x;
|
||||
_Tp __2r(_Tp(2) * __x.real());
|
||||
_Tp __2i(_Tp(2) * __x.imag());
|
||||
_Tp __d(cosh(__2r) + cos(__2i));
|
||||
_Tp __2rsh(sinh(__2r));
|
||||
if (isinf(__2rsh) && isinf(__d))
|
||||
if (__libcpp_isinf(__2rsh) && __libcpp_isinf(__d))
|
||||
return complex<_Tp>(__2rsh > _Tp(0) ? _Tp(1) : _Tp(-1),
|
||||
__2i > _Tp(0) ? _Tp(0) : _Tp(-0.));
|
||||
return complex<_Tp>(__2rsh/__d, sin(__2i)/__d);
|
||||
@ -1383,11 +1294,11 @@ complex<_Tp>
|
||||
acos(const complex<_Tp>& __x)
|
||||
{
|
||||
const _Tp __pi(atan2(+0., -0.));
|
||||
if (isinf(__x.real()))
|
||||
if (__libcpp_isinf(__x.real()))
|
||||
{
|
||||
if (isnan(__x.imag()))
|
||||
if (__libcpp_isnan(__x.imag()))
|
||||
return complex<_Tp>(__x.imag(), __x.real());
|
||||
if (isinf(__x.imag()))
|
||||
if (__libcpp_isinf(__x.imag()))
|
||||
{
|
||||
if (__x.real() < _Tp(0))
|
||||
return complex<_Tp>(_Tp(0.75) * __pi, -__x.imag());
|
||||
@ -1397,13 +1308,13 @@ acos(const complex<_Tp>& __x)
|
||||
return complex<_Tp>(__pi, signbit(__x.imag()) ? -__x.real() : __x.real());
|
||||
return complex<_Tp>(_Tp(0), signbit(__x.imag()) ? __x.real() : -__x.real());
|
||||
}
|
||||
if (isnan(__x.real()))
|
||||
if (__libcpp_isnan(__x.real()))
|
||||
{
|
||||
if (isinf(__x.imag()))
|
||||
if (__libcpp_isinf(__x.imag()))
|
||||
return complex<_Tp>(__x.real(), -__x.imag());
|
||||
return complex<_Tp>(__x.real(), __x.real());
|
||||
}
|
||||
if (isinf(__x.imag()))
|
||||
if (__libcpp_isinf(__x.imag()))
|
||||
return complex<_Tp>(__pi/_Tp(2), -__x.imag());
|
||||
if (__x.real() == 0 && (__x.imag() == 0 || isnan(__x.imag())))
|
||||
return complex<_Tp>(__pi/_Tp(2), -__x.imag());
|
||||
|
@ -98,6 +98,9 @@ void perror(const char* s);
|
||||
|
||||
#include <__config>
|
||||
#include <stdio.h>
|
||||
#if defined(_LIBCPP_MSVCRT)
|
||||
#include <crtversion.h>
|
||||
#endif
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
@ -118,11 +121,9 @@ using ::fscanf;
|
||||
using ::snprintf;
|
||||
using ::sprintf;
|
||||
using ::sscanf;
|
||||
#ifndef _LIBCPP_MSVCRT
|
||||
using ::vfprintf;
|
||||
using ::vfscanf;
|
||||
using ::vsscanf;
|
||||
#endif // _LIBCPP_MSVCRT
|
||||
using ::vsnprintf;
|
||||
using ::vsprintf;
|
||||
using ::fgetc;
|
||||
@ -155,7 +156,8 @@ using ::tmpnam;
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_STDIN
|
||||
using ::getchar;
|
||||
#if _LIBCPP_STD_VER <= 11
|
||||
#if _LIBCPP_STD_VER <= 11 && \
|
||||
(!defined(_VC_CRT_MAJOR_VERSION) || _VC_CRT_MAJOR_VERSION < 14)
|
||||
using ::gets;
|
||||
#endif
|
||||
using ::scanf;
|
||||
|
@ -89,6 +89,12 @@ void *aligned_alloc(size_t alignment, size_t size); // C11
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#ifdef __GNUC__
|
||||
#define _LIBCPP_UNREACHABLE() __builtin_unreachable()
|
||||
#else
|
||||
#define _LIBCPP_UNREACHABLE() _VSTD::abort()
|
||||
#endif
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
using ::size_t;
|
||||
@ -138,11 +144,9 @@ using ::ldiv;
|
||||
#ifndef _LIBCPP_HAS_NO_LONG_LONG
|
||||
using ::lldiv;
|
||||
#endif // _LIBCPP_HAS_NO_LONG_LONG
|
||||
#ifndef _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS
|
||||
using ::mblen;
|
||||
using ::mbtowc;
|
||||
using ::wctomb;
|
||||
#endif
|
||||
using ::mbstowcs;
|
||||
using ::wcstombs;
|
||||
#ifdef _LIBCPP_HAS_QUICK_EXIT
|
||||
|
@ -123,11 +123,9 @@ using ::fwscanf;
|
||||
using ::swprintf;
|
||||
using ::vfwprintf;
|
||||
using ::vswprintf;
|
||||
#ifndef _LIBCPP_MSVCRT
|
||||
using ::swscanf;
|
||||
using ::vfwscanf;
|
||||
using ::vswscanf;
|
||||
#endif // _LIBCPP_MSVCRT
|
||||
using ::fgetwc;
|
||||
using ::fgetws;
|
||||
using ::fputwc;
|
||||
@ -137,10 +135,8 @@ using ::getwc;
|
||||
using ::putwc;
|
||||
using ::ungetwc;
|
||||
using ::wcstod;
|
||||
#ifndef _LIBCPP_MSVCRT
|
||||
using ::wcstof;
|
||||
using ::wcstold;
|
||||
#endif // _LIBCPP_MSVCRT
|
||||
using ::wcstol;
|
||||
#ifndef _LIBCPP_HAS_NO_LONG_LONG
|
||||
using ::wcstoll;
|
||||
@ -182,9 +178,7 @@ using ::wcsrtombs;
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_STDIN
|
||||
using ::getwchar;
|
||||
#ifndef _LIBCPP_MSVCRT
|
||||
using ::vwscanf;
|
||||
#endif // _LIBCPP_MSVCRT
|
||||
using ::wscanf;
|
||||
#endif
|
||||
|
||||
|
@ -110,8 +110,8 @@ public:
|
||||
void push_front(value_type&& v);
|
||||
void push_back(const value_type& v);
|
||||
void push_back(value_type&& v);
|
||||
template <class... Args> void emplace_front(Args&&... args);
|
||||
template <class... Args> void emplace_back(Args&&... args);
|
||||
template <class... Args> reference emplace_front(Args&&... args);
|
||||
template <class... Args> reference emplace_back(Args&&... args);
|
||||
template <class... Args> iterator emplace(const_iterator p, Args&&... args);
|
||||
iterator insert(const_iterator p, const value_type& v);
|
||||
iterator insert(const_iterator p, value_type&& v);
|
||||
@ -895,26 +895,22 @@ template <bool>
|
||||
class __deque_base_common
|
||||
{
|
||||
protected:
|
||||
void __throw_length_error() const;
|
||||
void __throw_out_of_range() const;
|
||||
_LIBCPP_NORETURN void __throw_length_error() const;
|
||||
_LIBCPP_NORETURN void __throw_out_of_range() const;
|
||||
};
|
||||
|
||||
template <bool __b>
|
||||
void
|
||||
__deque_base_common<__b>::__throw_length_error() const
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw length_error("deque");
|
||||
#endif
|
||||
_VSTD::__throw_length_error("deque");
|
||||
}
|
||||
|
||||
template <bool __b>
|
||||
void
|
||||
__deque_base_common<__b>::__throw_out_of_range() const
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw out_of_range("deque");
|
||||
#endif
|
||||
_VSTD::__throw_out_of_range("deque");
|
||||
}
|
||||
|
||||
template <class _Tp, class _Allocator>
|
||||
@ -1314,7 +1310,9 @@ public:
|
||||
size_type size() const _NOEXCEPT {return __base::size();}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
size_type max_size() const _NOEXCEPT
|
||||
{return __alloc_traits::max_size(__base::__alloc());}
|
||||
{return std::min<size_type>(
|
||||
__alloc_traits::max_size(__base::__alloc()),
|
||||
numeric_limits<difference_type>::max());}
|
||||
void resize(size_type __n);
|
||||
void resize(size_type __n, const value_type& __v);
|
||||
void shrink_to_fit() _NOEXCEPT;
|
||||
@ -1344,8 +1342,8 @@ public:
|
||||
void push_back(const value_type& __v);
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
||||
template <class... _Args> void emplace_front(_Args&&... __args);
|
||||
template <class... _Args> void emplace_back(_Args&&... __args);
|
||||
template <class... _Args> reference emplace_front(_Args&&... __args);
|
||||
template <class... _Args> reference emplace_back(_Args&&... __args);
|
||||
template <class... _Args> iterator emplace(const_iterator __p, _Args&&... __args);
|
||||
#endif // _LIBCPP_HAS_NO_VARIADICS
|
||||
void push_front(value_type&& __v);
|
||||
@ -1824,15 +1822,17 @@ deque<_Tp, _Allocator>::push_back(value_type&& __v)
|
||||
|
||||
template <class _Tp, class _Allocator>
|
||||
template <class... _Args>
|
||||
void
|
||||
typename deque<_Tp, _Allocator>::reference
|
||||
deque<_Tp, _Allocator>::emplace_back(_Args&&... __args)
|
||||
{
|
||||
allocator_type& __a = __base::__alloc();
|
||||
if (__back_spare() == 0)
|
||||
__add_back_capacity();
|
||||
// __back_spare() >= 1
|
||||
__alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), _VSTD::forward<_Args>(__args)...);
|
||||
__alloc_traits::construct(__a, _VSTD::addressof(*__base::end()),
|
||||
_VSTD::forward<_Args>(__args)...);
|
||||
++__base::size();
|
||||
return *--__base::end();
|
||||
}
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_VARIADICS
|
||||
@ -1870,7 +1870,7 @@ deque<_Tp, _Allocator>::push_front(value_type&& __v)
|
||||
|
||||
template <class _Tp, class _Allocator>
|
||||
template <class... _Args>
|
||||
void
|
||||
typename deque<_Tp, _Allocator>::reference
|
||||
deque<_Tp, _Allocator>::emplace_front(_Args&&... __args)
|
||||
{
|
||||
allocator_type& __a = __base::__alloc();
|
||||
@ -1880,6 +1880,7 @@ deque<_Tp, _Allocator>::emplace_front(_Args&&... __args)
|
||||
__alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), _VSTD::forward<_Args>(__args)...);
|
||||
--__base::__start_;
|
||||
++__base::size();
|
||||
return *__base::begin();
|
||||
}
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_VARIADICS
|
||||
@ -2734,7 +2735,7 @@ deque<_Tp, _Allocator>::erase(const_iterator __f)
|
||||
difference_type __pos = __f - __b;
|
||||
iterator __p = __b + __pos;
|
||||
allocator_type& __a = __base::__alloc();
|
||||
if (__pos <= (__base::size() - 1) / 2)
|
||||
if (static_cast<size_t>(__pos) <= (__base::size() - 1) / 2)
|
||||
{ // erase from front
|
||||
_VSTD::move_backward(__b, __p, _VSTD::next(__p));
|
||||
__alloc_traits::destroy(__a, _VSTD::addressof(*__b));
|
||||
@ -2772,7 +2773,7 @@ deque<_Tp, _Allocator>::erase(const_iterator __f, const_iterator __l)
|
||||
if (__n > 0)
|
||||
{
|
||||
allocator_type& __a = __base::__alloc();
|
||||
if (__pos <= (__base::size() - __n) / 2)
|
||||
if (static_cast<size_t>(__pos) <= (__base::size() - __n) / 2)
|
||||
{ // erase from front
|
||||
iterator __i = _VSTD::move_backward(__b, __p, __p + __n);
|
||||
for (; __b != __i; ++__b)
|
||||
|
@ -79,11 +79,8 @@ template <class E> void rethrow_if_nested(const E& e);
|
||||
|
||||
#include <__config>
|
||||
#include <cstddef>
|
||||
#include <type_traits>
|
||||
#if defined(_LIBCPP_NO_EXCEPTIONS)
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#endif
|
||||
#include <type_traits>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
@ -165,7 +162,10 @@ make_exception_ptr(_Ep __e) _NOEXCEPT
|
||||
{
|
||||
return current_exception();
|
||||
}
|
||||
#endif // _LIBCPP_NO_EXCEPTIONS
|
||||
#else
|
||||
((void)__e);
|
||||
_VSTD::abort();
|
||||
#endif
|
||||
}
|
||||
|
||||
// nested_exception
|
||||
@ -209,6 +209,9 @@ throw_with_nested (_Tp& __t, typename enable_if<
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw __nested<typename remove_reference<_Tp>::type>(_VSTD::forward<_Tp>(__t));
|
||||
#else
|
||||
((void)__t);
|
||||
// FIXME: Make this abort.
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -229,6 +232,9 @@ throw_with_nested (_Tp& __t, typename enable_if<
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw _VSTD::forward<_Tp>(__t);
|
||||
#else
|
||||
((void)__t);
|
||||
// FIXME: Make this abort
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -255,19 +261,4 @@ rethrow_if_nested(const _Ep&, typename enable_if<
|
||||
|
||||
} // std
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _Exception>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
inline void __libcpp_throw(_Exception const& __e) {
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw __e;
|
||||
#else
|
||||
_VSTD::fprintf(stderr, "%s\n", __e.what());
|
||||
_VSTD::abort();
|
||||
#endif
|
||||
}
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP_EXCEPTION
|
||||
|
@ -58,61 +58,11 @@ _ForwardIterator search(_ForwardIterator __f, _ForwardIterator __l, const _Searc
|
||||
|
||||
template <class _PopulationIterator, class _SampleIterator, class _Distance,
|
||||
class _UniformRandomNumberGenerator>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_SampleIterator __sample(_PopulationIterator __first,
|
||||
_PopulationIterator __last, _SampleIterator __out,
|
||||
_Distance __n,
|
||||
_UniformRandomNumberGenerator &&__g,
|
||||
input_iterator_tag) {
|
||||
|
||||
_Distance __k = 0;
|
||||
for (; __first != __last && __k < __n; ++__first, (void)++__k)
|
||||
__out[__k] = *__first;
|
||||
_Distance __sz = __k;
|
||||
for (; __first != __last; ++__first, (void)++__k) {
|
||||
_Distance __r = _VSTD::uniform_int_distribution<_Distance>(0, __k)(__g);
|
||||
if (__r < __sz)
|
||||
__out[__r] = *__first;
|
||||
}
|
||||
return __out + _VSTD::min(__n, __k);
|
||||
}
|
||||
|
||||
template <class _PopulationIterator, class _SampleIterator, class _Distance,
|
||||
class _UniformRandomNumberGenerator>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_SampleIterator __sample(_PopulationIterator __first,
|
||||
_PopulationIterator __last, _SampleIterator __out,
|
||||
_Distance __n,
|
||||
_UniformRandomNumberGenerator &&__g,
|
||||
forward_iterator_tag) {
|
||||
_Distance __unsampled_sz = _VSTD::distance(__first, __last);
|
||||
for (__n = _VSTD::min(__n, __unsampled_sz); __n != 0; ++__first) {
|
||||
_Distance __r =
|
||||
_VSTD::uniform_int_distribution<_Distance>(0, --__unsampled_sz)(__g);
|
||||
if (__r < __n) {
|
||||
*__out++ = *__first;
|
||||
--__n;
|
||||
}
|
||||
}
|
||||
return __out;
|
||||
}
|
||||
|
||||
template <class _PopulationIterator, class _SampleIterator, class _Distance,
|
||||
class _UniformRandomNumberGenerator>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_SampleIterator sample(_PopulationIterator __first,
|
||||
_PopulationIterator __last, _SampleIterator __out,
|
||||
_Distance __n, _UniformRandomNumberGenerator &&__g) {
|
||||
typedef typename iterator_traits<_PopulationIterator>::iterator_category
|
||||
_PopCategory;
|
||||
typedef typename iterator_traits<_PopulationIterator>::difference_type
|
||||
_Difference;
|
||||
typedef typename common_type<_Distance, _Difference>::type _CommonType;
|
||||
_LIBCPP_ASSERT(__n >= 0, "N must be a positive number.");
|
||||
return _VSTD_LFTS::__sample(
|
||||
__first, __last, __out, _CommonType(__n),
|
||||
_VSTD::forward<_UniformRandomNumberGenerator>(__g),
|
||||
_PopCategory());
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_SampleIterator sample(_PopulationIterator __first, _PopulationIterator __last,
|
||||
_SampleIterator __out, _Distance __n,
|
||||
_UniformRandomNumberGenerator &&__g) {
|
||||
return _VSTD::__sample(__first, __last, __out, __n, __g);
|
||||
}
|
||||
|
||||
_LIBCPP_END_NAMESPACE_LFTS
|
||||
|
@ -82,7 +82,6 @@ inline namespace fundamentals_v1 {
|
||||
#include <typeinfo>
|
||||
#include <type_traits>
|
||||
#include <cstdlib>
|
||||
#include <cassert>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
@ -98,13 +97,13 @@ public:
|
||||
|
||||
#if _LIBCPP_STD_VER > 11 // C++ > 11
|
||||
|
||||
_LIBCPP_NORETURN _LIBCPP_INLINE_VISIBILITY
|
||||
inline void __throw_bad_any_cast()
|
||||
_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
|
||||
void __throw_bad_any_cast()
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw bad_any_cast();
|
||||
#else
|
||||
assert(!"bad_any_cast");
|
||||
_VSTD::abort();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -106,10 +106,6 @@ public:
|
||||
|
||||
#include <__undef___deallocate>
|
||||
|
||||
#if defined(_LIBCPP_NO_EXCEPTIONS)
|
||||
#include <cassert>
|
||||
#endif
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
@ -142,13 +138,8 @@ private:
|
||||
static inline _LIBCPP_INLINE_VISIBILITY value_type* __allocate ( size_t count )
|
||||
{
|
||||
if ( numeric_limits<size_t>::max() / sizeof (value_type) <= count )
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw bad_array_length();
|
||||
#else
|
||||
assert(!"dynarray::allocation");
|
||||
#endif
|
||||
}
|
||||
__throw_bad_array_length();
|
||||
|
||||
return static_cast<value_type *> (_VSTD::__allocate (sizeof(value_type) * count));
|
||||
}
|
||||
|
||||
@ -283,13 +274,8 @@ typename dynarray<_Tp>::reference
|
||||
dynarray<_Tp>::at(size_type __n)
|
||||
{
|
||||
if (__n >= __size_)
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw out_of_range("dynarray::at");
|
||||
#else
|
||||
assert(!"dynarray::at out_of_range");
|
||||
#endif
|
||||
}
|
||||
__throw_out_of_range("dynarray::at");
|
||||
|
||||
return data()[__n];
|
||||
}
|
||||
|
||||
@ -299,13 +285,8 @@ typename dynarray<_Tp>::const_reference
|
||||
dynarray<_Tp>::at(size_type __n) const
|
||||
{
|
||||
if (__n >= __size_)
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw out_of_range("dynarray::at");
|
||||
#else
|
||||
assert(!"dynarray::at out_of_range");
|
||||
#endif
|
||||
}
|
||||
__throw_out_of_range("dynarray::at");
|
||||
|
||||
return data()[__n];
|
||||
}
|
||||
|
||||
|
@ -228,7 +228,7 @@
|
||||
#include <system_error>
|
||||
#include <utility>
|
||||
#include <iomanip> // for quoted
|
||||
#include <experimental/string_view>
|
||||
#include <string_view>
|
||||
|
||||
#include <__debug>
|
||||
|
||||
@ -249,7 +249,7 @@ struct _LIBCPP_TYPE_VIS space_info
|
||||
uintmax_t available;
|
||||
};
|
||||
|
||||
enum class _LIBCPP_TYPE_VIS file_type : signed char
|
||||
enum class _LIBCPP_ENUM_VIS file_type : signed char
|
||||
{
|
||||
none = 0,
|
||||
not_found = -1,
|
||||
@ -263,7 +263,7 @@ enum class _LIBCPP_TYPE_VIS file_type : signed char
|
||||
unknown = 8
|
||||
};
|
||||
|
||||
enum class _LIBCPP_TYPE_VIS perms : unsigned
|
||||
enum class _LIBCPP_ENUM_VIS perms : unsigned
|
||||
{
|
||||
none = 0,
|
||||
|
||||
@ -323,7 +323,7 @@ _LIBCPP_INLINE_VISIBILITY
|
||||
inline perms& operator^=(perms& _LHS, perms _RHS)
|
||||
{ return _LHS = _LHS ^ _RHS; }
|
||||
|
||||
enum class _LIBCPP_TYPE_VIS copy_options : unsigned short
|
||||
enum class _LIBCPP_ENUM_VIS copy_options : unsigned short
|
||||
{
|
||||
none = 0,
|
||||
skip_existing = 1,
|
||||
@ -367,7 +367,7 @@ inline copy_options& operator^=(copy_options& _LHS, copy_options _RHS)
|
||||
{ return _LHS = _LHS ^ _RHS; }
|
||||
|
||||
|
||||
enum class directory_options : unsigned char
|
||||
enum class _LIBCPP_ENUM_VIS directory_options : unsigned char
|
||||
{
|
||||
none = 0,
|
||||
follow_directory_symlink = 1,
|
||||
@ -453,6 +453,9 @@ class _LIBCPP_TYPE_VIS directory_entry;
|
||||
template <class _Tp> struct __can_convert_char {
|
||||
static const bool value = false;
|
||||
};
|
||||
template <class _Tp> struct __can_convert_char<const _Tp>
|
||||
: public __can_convert_char<_Tp> {
|
||||
};
|
||||
template <> struct __can_convert_char<char> {
|
||||
static const bool value = true;
|
||||
using __char_type = char;
|
||||
@ -498,6 +501,21 @@ struct __is_pathable_string<basic_string<_ECharT, _Traits, _Alloc>,
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
template <class _ECharT, class _Traits>
|
||||
struct __is_pathable_string<basic_string_view<_ECharT, _Traits>,
|
||||
_Void<typename __can_convert_char<_ECharT>::__char_type>>
|
||||
: public __can_convert_char<_ECharT>
|
||||
{
|
||||
using _Str = basic_string_view<_ECharT, _Traits>;
|
||||
using _Base = __can_convert_char<_ECharT>;
|
||||
static _ECharT const* __range_begin(_Str const& __s) { return __s.data(); }
|
||||
static _ECharT const* __range_end(_Str const& __s) { return __s.data() + __s.length(); }
|
||||
static _ECharT __first_or_null(_Str const& __s) {
|
||||
return __s.empty() ? _ECharT{} : __s[0];
|
||||
}
|
||||
};
|
||||
|
||||
template <class _Source,
|
||||
class _DS = typename decay<_Source>::type,
|
||||
class _UnqualPtrType = typename remove_const<
|
||||
@ -605,12 +623,22 @@ struct _PathCVT {
|
||||
|
||||
template <>
|
||||
struct _PathCVT<char> {
|
||||
|
||||
template <class _Iter>
|
||||
static void __append_range(string& __dest, _Iter __b, _Iter __e) {
|
||||
static typename enable_if<
|
||||
__is_exactly_input_iterator<_Iter>::value
|
||||
>::type __append_range(string& __dest, _Iter __b, _Iter __e) {
|
||||
for (; __b != __e; ++__b)
|
||||
__dest.push_back(*__b);
|
||||
}
|
||||
|
||||
template <class _Iter>
|
||||
static typename enable_if<
|
||||
__is_forward_iterator<_Iter>::value
|
||||
>::type __append_range(string& __dest, _Iter __b, _Iter __e) {
|
||||
__dest.__append_forward_unsafe(__b, __e);
|
||||
}
|
||||
|
||||
template <class _Iter>
|
||||
static void __append_range(string& __dest, _Iter __b, _NullSentinal) {
|
||||
const char __sentinal = char{};
|
||||
@ -622,7 +650,8 @@ struct _PathCVT<char> {
|
||||
static void __append_source(string& __dest, _Source const& __s)
|
||||
{
|
||||
using _Traits = __is_pathable<_Source>;
|
||||
__append_range(__dest, _Traits::__range_begin(__s), _Traits::__range_end(__s));
|
||||
__append_range(__dest, _Traits::__range_begin(__s),
|
||||
_Traits::__range_end(__s));
|
||||
}
|
||||
};
|
||||
|
||||
@ -642,6 +671,7 @@ class _LIBCPP_TYPE_VIS path
|
||||
public:
|
||||
typedef char value_type;
|
||||
typedef basic_string<value_type> string_type;
|
||||
typedef _VSTD::string_view __string_view;
|
||||
static _LIBCPP_CONSTEXPR value_type preferred_separator = '/';
|
||||
|
||||
// constructors and destructor
|
||||
@ -740,6 +770,8 @@ private:
|
||||
public:
|
||||
// appends
|
||||
path& operator/=(const path& __p) {
|
||||
_LIBCPP_ASSERT(!__p.has_root_name(),
|
||||
"cannot append to a path with a root name");
|
||||
__append_sep_if_needed(__p.empty() ? char{} : __p.__pn_[0]);
|
||||
__pn_ += __p.native();
|
||||
return *this;
|
||||
@ -787,6 +819,12 @@ public:
|
||||
return *this;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
path& operator+=(__string_view __x) {
|
||||
__pn_ += __x;
|
||||
return *this;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
path& operator+=(const value_type* __x) {
|
||||
__pn_ += __x;
|
||||
@ -799,7 +837,6 @@ public:
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
template <class _ECharT>
|
||||
typename enable_if<__can_convert_char<_ECharT>::value, path&>::type
|
||||
operator+=(_ECharT __x)
|
||||
@ -837,7 +874,15 @@ public:
|
||||
}
|
||||
|
||||
path& make_preferred() { return *this; }
|
||||
path& remove_filename() { return *this = parent_path(); }
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
path& remove_filename() {
|
||||
if (__pn_.size() == __root_path_raw().size())
|
||||
clear();
|
||||
else
|
||||
__pn_ = __parent_path();
|
||||
return *this;
|
||||
}
|
||||
|
||||
path& replace_filename(const path& __replacement) {
|
||||
remove_filename();
|
||||
@ -896,37 +941,39 @@ public:
|
||||
std::u32string generic_u32string() const { return string<char32_t>(); }
|
||||
|
||||
private:
|
||||
_LIBCPP_FUNC_VIS int __compare(const value_type*) const;
|
||||
_LIBCPP_FUNC_VIS string_view __root_name() const;
|
||||
_LIBCPP_FUNC_VIS string_view __root_directory() const;
|
||||
_LIBCPP_FUNC_VIS string_view __relative_path() const;
|
||||
_LIBCPP_FUNC_VIS string_view __parent_path() const;
|
||||
_LIBCPP_FUNC_VIS string_view __filename() const;
|
||||
_LIBCPP_FUNC_VIS string_view __stem() const;
|
||||
_LIBCPP_FUNC_VIS string_view __extension() const;
|
||||
_LIBCPP_FUNC_VIS int __compare(__string_view) const;
|
||||
_LIBCPP_FUNC_VIS __string_view __root_name() const;
|
||||
_LIBCPP_FUNC_VIS __string_view __root_directory() const;
|
||||
_LIBCPP_FUNC_VIS __string_view __root_path_raw() const;
|
||||
_LIBCPP_FUNC_VIS __string_view __relative_path() const;
|
||||
_LIBCPP_FUNC_VIS __string_view __parent_path() const;
|
||||
_LIBCPP_FUNC_VIS __string_view __filename() const;
|
||||
_LIBCPP_FUNC_VIS __string_view __stem() const;
|
||||
_LIBCPP_FUNC_VIS __string_view __extension() const;
|
||||
|
||||
public:
|
||||
// compare
|
||||
_LIBCPP_INLINE_VISIBILITY int compare(const path& __p) const _NOEXCEPT { return __compare(__p.c_str());}
|
||||
_LIBCPP_INLINE_VISIBILITY int compare(const string_type& __s) const { return __compare(__s.c_str()); }
|
||||
_LIBCPP_INLINE_VISIBILITY int compare(const path& __p) const _NOEXCEPT { return __compare(__p.__pn_);}
|
||||
_LIBCPP_INLINE_VISIBILITY int compare(const string_type& __s) const { return __compare(__s); }
|
||||
_LIBCPP_INLINE_VISIBILITY int compare(__string_view __s) const { return __compare(__s); }
|
||||
_LIBCPP_INLINE_VISIBILITY int compare(const value_type* __s) const { return __compare(__s); }
|
||||
|
||||
// decomposition
|
||||
_LIBCPP_INLINE_VISIBILITY path root_name() const { return __root_name().to_string(); }
|
||||
_LIBCPP_INLINE_VISIBILITY path root_directory() const { return __root_directory().to_string(); }
|
||||
_LIBCPP_INLINE_VISIBILITY path root_path() const { return root_name().append(__root_directory().to_string()); }
|
||||
_LIBCPP_INLINE_VISIBILITY path relative_path() const { return __relative_path().to_string(); }
|
||||
_LIBCPP_INLINE_VISIBILITY path parent_path() const { return __parent_path().to_string(); }
|
||||
_LIBCPP_INLINE_VISIBILITY path filename() const { return __filename().to_string(); }
|
||||
_LIBCPP_INLINE_VISIBILITY path stem() const { return __stem().to_string();}
|
||||
_LIBCPP_INLINE_VISIBILITY path extension() const { return __extension().to_string(); }
|
||||
_LIBCPP_INLINE_VISIBILITY path root_name() const { return string_type(__root_name()); }
|
||||
_LIBCPP_INLINE_VISIBILITY path root_directory() const { return string_type(__root_directory()); }
|
||||
_LIBCPP_INLINE_VISIBILITY path root_path() const { return root_name().append(string_type(__root_directory())); }
|
||||
_LIBCPP_INLINE_VISIBILITY path relative_path() const { return string_type(__relative_path()); }
|
||||
_LIBCPP_INLINE_VISIBILITY path parent_path() const { return string_type(__parent_path()); }
|
||||
_LIBCPP_INLINE_VISIBILITY path filename() const { return string_type(__filename()); }
|
||||
_LIBCPP_INLINE_VISIBILITY path stem() const { return string_type(__stem());}
|
||||
_LIBCPP_INLINE_VISIBILITY path extension() const { return string_type(__extension()); }
|
||||
|
||||
// query
|
||||
_LIBCPP_INLINE_VISIBILITY bool empty() const _NOEXCEPT { return __pn_.empty(); }
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY bool has_root_name() const { return !__root_name().empty(); }
|
||||
_LIBCPP_INLINE_VISIBILITY bool has_root_directory() const { return !__root_directory().empty(); }
|
||||
_LIBCPP_INLINE_VISIBILITY bool has_root_path() const { return !(__root_name().empty() && __root_directory().empty()); }
|
||||
_LIBCPP_INLINE_VISIBILITY bool has_root_path() const { return !__root_path_raw().empty(); }
|
||||
_LIBCPP_INLINE_VISIBILITY bool has_relative_path() const { return !__relative_path().empty(); }
|
||||
_LIBCPP_INLINE_VISIBILITY bool has_parent_path() const { return !__parent_path().empty(); }
|
||||
_LIBCPP_INLINE_VISIBILITY bool has_filename() const { return !__filename().empty(); }
|
||||
@ -945,7 +992,7 @@ public:
|
||||
|
||||
private:
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
path& __assign_view(string_view const& __s) noexcept { __pn_ = __s.to_string(); return *this; }
|
||||
path& __assign_view(__string_view const& __s) noexcept { __pn_ = string_type(__s); return *this; }
|
||||
string_type __pn_;
|
||||
};
|
||||
|
||||
@ -1047,7 +1094,8 @@ public:
|
||||
typedef const path& reference;
|
||||
public:
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
iterator() : __elem_(), __path_ptr_(nullptr), __pos_(0) {}
|
||||
iterator() : __stashed_elem_(), __path_ptr_(nullptr),
|
||||
__entry_(), __state_(__singular) {}
|
||||
|
||||
iterator(const iterator&) = default;
|
||||
~iterator() = default;
|
||||
@ -1056,16 +1104,20 @@ public:
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
reference operator*() const {
|
||||
return __elem_;
|
||||
return __stashed_elem_;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
pointer operator->() const {
|
||||
return &__elem_;
|
||||
return &__stashed_elem_;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
iterator& operator++() {
|
||||
_LIBCPP_ASSERT(__state_ != __singular,
|
||||
"attempting to increment a singular iterator");
|
||||
_LIBCPP_ASSERT(__state_ != __at_end,
|
||||
"attempting to increment the end iterator");
|
||||
return __increment();
|
||||
}
|
||||
|
||||
@ -1078,6 +1130,10 @@ public:
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
iterator& operator--() {
|
||||
_LIBCPP_ASSERT(__state_ != __singular,
|
||||
"attempting to decrement a singular iterator");
|
||||
_LIBCPP_ASSERT(__entry_.data() != __path_ptr_->native().data(),
|
||||
"attempting to decrement the begin iterator");
|
||||
return __decrement();
|
||||
}
|
||||
|
||||
@ -1090,20 +1146,26 @@ public:
|
||||
|
||||
private:
|
||||
friend class path;
|
||||
|
||||
static constexpr unsigned char __singular = 0;
|
||||
static constexpr unsigned char __at_end = 6;
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
friend bool operator==(const iterator&, const iterator&);
|
||||
|
||||
_LIBCPP_FUNC_VIS iterator& __increment();
|
||||
_LIBCPP_FUNC_VIS iterator& __decrement();
|
||||
|
||||
path __elem_;
|
||||
path __stashed_elem_;
|
||||
const path* __path_ptr_;
|
||||
size_t __pos_;
|
||||
path::__string_view __entry_;
|
||||
unsigned char __state_;
|
||||
};
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool operator==(const path::iterator& __lhs, const path::iterator& __rhs) {
|
||||
return __lhs.__path_ptr_ == __rhs.__path_ptr_ &&
|
||||
__lhs.__pos_ == __rhs.__pos_;
|
||||
__lhs.__entry_.data() == __rhs.__entry_.data();
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
@ -1154,6 +1216,21 @@ private:
|
||||
shared_ptr<_Storage> __paths_;
|
||||
};
|
||||
|
||||
template <class... _Args>
|
||||
_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
void __throw_filesystem_error(_Args && ...__args)
|
||||
{
|
||||
throw filesystem_error(std::forward<_Args>(__args)...);
|
||||
}
|
||||
#else
|
||||
void __throw_filesystem_error(_Args&&...)
|
||||
{
|
||||
_VSTD::abort();
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
// operational functions
|
||||
|
||||
_LIBCPP_FUNC_VIS
|
||||
@ -1865,6 +1942,7 @@ public:
|
||||
{ return __increment(&__ec); }
|
||||
|
||||
private:
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
friend bool operator==(const directory_iterator& __lhs,
|
||||
const directory_iterator& __rhs) _NOEXCEPT;
|
||||
|
||||
@ -2014,6 +2092,7 @@ private:
|
||||
_LIBCPP_FUNC_VIS
|
||||
void __pop(error_code* __ec=nullptr);
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
friend bool operator==(const recursive_directory_iterator&,
|
||||
const recursive_directory_iterator&) _NOEXCEPT;
|
||||
|
||||
@ -2023,9 +2102,9 @@ private:
|
||||
}; // class recursive_directory_iterator
|
||||
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
inline bool operator==(const recursive_directory_iterator& __lhs,
|
||||
const recursive_directory_iterator& __rhs) _NOEXCEPT
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool operator==(const recursive_directory_iterator& __lhs,
|
||||
const recursive_directory_iterator& __rhs) _NOEXCEPT
|
||||
{
|
||||
return __lhs.__imp_ == __rhs.__imp_;
|
||||
}
|
||||
|
@ -182,9 +182,9 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_ValueType* allocate(size_t __n) {
|
||||
if (__n > max_size()) {
|
||||
__libcpp_throw(length_error(
|
||||
__throw_length_error(
|
||||
"std::experimental::pmr::polymorphic_allocator<T>::allocate(size_t n)"
|
||||
" 'n' exceeds maximum supported size"));
|
||||
" 'n' exceeds maximum supported size");
|
||||
}
|
||||
return static_cast<_ValueType*>(
|
||||
__res_->allocate(__n * sizeof(_ValueType), alignof(_ValueType))
|
||||
@ -383,9 +383,9 @@ protected:
|
||||
virtual void * do_allocate(size_t __bytes, size_t)
|
||||
{
|
||||
if (__bytes > __max_size()) {
|
||||
__libcpp_throw(length_error(
|
||||
__throw_length_error(
|
||||
"std::experimental::pmr::resource_adaptor<T>::do_allocate(size_t bytes, size_t align)"
|
||||
" 'bytes' exceeds maximum supported size"));
|
||||
" 'bytes' exceeds maximum supported size");
|
||||
}
|
||||
size_t __s = __aligned_allocation_size(__bytes, _MaxAlign) / _MaxAlign;
|
||||
return __alloc_.allocate(__s);
|
||||
|
103
include/experimental/numeric
Normal file
103
include/experimental/numeric
Normal file
@ -0,0 +1,103 @@
|
||||
// -*- C++ -*-
|
||||
//===--------------------------- numeric ----------------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is dual licensed under the MIT and the University of Illinois Open
|
||||
// Source Licenses. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef _LIBCPP_EXPERIMENTAL_NUMERIC
|
||||
#define _LIBCPP_EXPERIMENTAL_NUMERIC
|
||||
/*
|
||||
experimental/numeric synopsis
|
||||
|
||||
// C++1z
|
||||
namespace std {
|
||||
namespace experimental {
|
||||
inline namespace fundamentals_v2 {
|
||||
|
||||
// 13.1.2, Greatest common divisor
|
||||
template<class M, class N>
|
||||
constexpr common_type_t<M,N> gcd(M m, N n);
|
||||
|
||||
// 13.1.3, Least common multiple
|
||||
template<class M, class N>
|
||||
constexpr common_type_t<M,N> lcm(M m, N n);
|
||||
|
||||
} // namespace fundamentals_v2
|
||||
} // namespace experimental
|
||||
} // namespace std
|
||||
|
||||
*/
|
||||
|
||||
#include <experimental/__config>
|
||||
#include <numeric>
|
||||
#include <type_traits> // is_integral
|
||||
#include <limits> // numeric_limits
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_LFTS_V2
|
||||
|
||||
template <typename _Tp, bool _IsSigned = is_signed<_Tp>::value> struct __abs;
|
||||
|
||||
template <typename _Tp>
|
||||
struct __abs<_Tp, true> {
|
||||
_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
|
||||
_Tp operator()(_Tp __t) const noexcept { return __t >= 0 ? __t : -__t; }
|
||||
};
|
||||
|
||||
template <typename _Tp>
|
||||
struct __abs<_Tp, false> {
|
||||
_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
|
||||
_Tp operator()(_Tp __t) const noexcept { return __t; }
|
||||
};
|
||||
|
||||
|
||||
template<class _Tp>
|
||||
_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
|
||||
_Tp __gcd(_Tp __m, _Tp __n)
|
||||
{
|
||||
static_assert((!is_signed<_Tp>::value), "" );
|
||||
return __n == 0 ? __m : __gcd<_Tp>(__n, __m % __n);
|
||||
}
|
||||
|
||||
|
||||
template<class _Tp, class _Up>
|
||||
_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
|
||||
common_type_t<_Tp,_Up>
|
||||
gcd(_Tp __m, _Up __n)
|
||||
{
|
||||
static_assert((is_integral<_Tp>::value && is_integral<_Up>::value), "Arguments to gcd must be integer types");
|
||||
using _Rp = common_type_t<_Tp,_Up>;
|
||||
using _Wp = make_unsigned_t<_Rp>;
|
||||
return static_cast<_Rp>(__gcd(static_cast<_Wp>(__abs<_Tp>()(__m)),
|
||||
static_cast<_Wp>(__abs<_Up>()(__n))));
|
||||
}
|
||||
|
||||
template<class _Tp, class _Up>
|
||||
_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
|
||||
common_type_t<_Tp,_Up>
|
||||
lcm(_Tp __m, _Up __n)
|
||||
{
|
||||
static_assert((is_integral<_Tp>::value && is_integral<_Up>::value), "Arguments to lcm must be integer types");
|
||||
if (__m == 0 || __n == 0)
|
||||
return 0;
|
||||
|
||||
using _Rp = common_type_t<_Tp,_Up>;
|
||||
_Rp __val1 = __abs<_Tp>()(__m) / gcd(__m,__n);
|
||||
_Up __val2 = __abs<_Up>()(__n);
|
||||
_LIBCPP_ASSERT((numeric_limits<_Rp>::max() / __val1 > __val2), "Overflow in lcm");
|
||||
return __val1 * __val2;
|
||||
}
|
||||
|
||||
_LIBCPP_END_NAMESPACE_LFTS_V2
|
||||
|
||||
#endif /* _LIBCPP_STD_VER > 11 */
|
||||
#endif /* _LIBCPP_EXPERIMENTAL_NUMERIC */
|
@ -8,8 +8,8 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef _LIBCPP_OPTIONAL
|
||||
#define _LIBCPP_OPTIONAL
|
||||
#ifndef _LIBCPP_EXPERIMENTAL_OPTIONAL
|
||||
#define _LIBCPP_EXPERIMENTAL_OPTIONAL
|
||||
|
||||
/*
|
||||
optional synopsis
|
||||
@ -211,7 +211,7 @@ protected:
|
||||
: __engaged_(__x.__engaged_)
|
||||
{
|
||||
if (__engaged_)
|
||||
::new(_VSTD::addressof(__val_)) value_type(__x.__val_);
|
||||
::new((void*)_VSTD::addressof(__val_)) value_type(__x.__val_);
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
@ -220,7 +220,7 @@ protected:
|
||||
: __engaged_(__x.__engaged_)
|
||||
{
|
||||
if (__engaged_)
|
||||
::new(_VSTD::addressof(__val_)) value_type(_VSTD::move(__x.__val_));
|
||||
::new((void*)_VSTD::addressof(__val_)) value_type(_VSTD::move(__x.__val_));
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
@ -262,7 +262,7 @@ protected:
|
||||
: __engaged_(__x.__engaged_)
|
||||
{
|
||||
if (__engaged_)
|
||||
::new(_VSTD::addressof(__val_)) value_type(__x.__val_);
|
||||
::new((void*)_VSTD::addressof(__val_)) value_type(__x.__val_);
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
@ -271,7 +271,7 @@ protected:
|
||||
: __engaged_(__x.__engaged_)
|
||||
{
|
||||
if (__engaged_)
|
||||
::new(_VSTD::addressof(__val_)) value_type(_VSTD::move(__x.__val_));
|
||||
::new((void*)_VSTD::addressof(__val_)) value_type(_VSTD::move(__x.__val_));
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
@ -368,7 +368,7 @@ public:
|
||||
if (this->__engaged_)
|
||||
this->__val_.~value_type();
|
||||
else
|
||||
::new(_VSTD::addressof(this->__val_)) value_type(__opt.__val_);
|
||||
::new((void*)_VSTD::addressof(this->__val_)) value_type(__opt.__val_);
|
||||
this->__engaged_ = __opt.__engaged_;
|
||||
}
|
||||
return *this;
|
||||
@ -390,7 +390,8 @@ public:
|
||||
if (this->__engaged_)
|
||||
this->__val_.~value_type();
|
||||
else
|
||||
::new(_VSTD::addressof(this->__val_)) value_type(_VSTD::move(__opt.__val_));
|
||||
::new((void*)_VSTD::addressof(this->__val_))
|
||||
value_type(_VSTD::move(__opt.__val_));
|
||||
this->__engaged_ = __opt.__engaged_;
|
||||
}
|
||||
return *this;
|
||||
@ -412,7 +413,7 @@ public:
|
||||
this->__val_ = _VSTD::forward<_Up>(__v);
|
||||
else
|
||||
{
|
||||
::new(_VSTD::addressof(this->__val_)) value_type(_VSTD::forward<_Up>(__v));
|
||||
::new((void*)_VSTD::addressof(this->__val_)) value_type(_VSTD::forward<_Up>(__v));
|
||||
this->__engaged_ = true;
|
||||
}
|
||||
return *this;
|
||||
@ -429,7 +430,8 @@ public:
|
||||
emplace(_Args&&... __args)
|
||||
{
|
||||
*this = nullopt;
|
||||
::new(_VSTD::addressof(this->__val_)) value_type(_VSTD::forward<_Args>(__args)...);
|
||||
::new((void*)_VSTD::addressof(this->__val_))
|
||||
value_type(_VSTD::forward<_Args>(__args)...);
|
||||
this->__engaged_ = true;
|
||||
}
|
||||
|
||||
@ -444,7 +446,8 @@ public:
|
||||
emplace(initializer_list<_Up> __il, _Args&&... __args)
|
||||
{
|
||||
*this = nullopt;
|
||||
::new(_VSTD::addressof(this->__val_)) value_type(__il, _VSTD::forward<_Args>(__args)...);
|
||||
::new((void*)_VSTD::addressof(this->__val_))
|
||||
value_type(__il, _VSTD::forward<_Args>(__args)...);
|
||||
this->__engaged_ = true;
|
||||
}
|
||||
|
||||
@ -464,12 +467,14 @@ public:
|
||||
{
|
||||
if (this->__engaged_)
|
||||
{
|
||||
::new(_VSTD::addressof(__opt.__val_)) value_type(_VSTD::move(this->__val_));
|
||||
::new((void*)_VSTD::addressof(__opt.__val_))
|
||||
value_type(_VSTD::move(this->__val_));
|
||||
this->__val_.~value_type();
|
||||
}
|
||||
else
|
||||
{
|
||||
::new(_VSTD::addressof(this->__val_)) value_type(_VSTD::move(__opt.__val_));
|
||||
::new((void*)_VSTD::addressof(this->__val_))
|
||||
value_type(_VSTD::move(__opt.__val_));
|
||||
__opt.__val_.~value_type();
|
||||
}
|
||||
swap(this->__engaged_, __opt.__engaged_);
|
||||
@ -482,7 +487,11 @@ public:
|
||||
operator->() const
|
||||
{
|
||||
_LIBCPP_ASSERT(this->__engaged_, "optional operator-> called for disengaged value");
|
||||
#ifndef _LIBCPP_HAS_NO_BUILTIN_ADDRESSOF
|
||||
return __builtin_addressof(this->__val_);
|
||||
#else
|
||||
return __operator_arrow(__has_operator_addressof<value_type>{});
|
||||
#endif
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
@ -513,15 +522,21 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
constexpr explicit operator bool() const noexcept {return this->__engaged_;}
|
||||
|
||||
_LIBCPP_NORETURN _LIBCPP_INLINE_VISIBILITY
|
||||
constexpr void __throw_bad_optional_access() const
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw bad_optional_access();
|
||||
#else
|
||||
_VSTD::abort();
|
||||
#endif
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
constexpr value_type const& value() const
|
||||
{
|
||||
if (!this->__engaged_)
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw bad_optional_access();
|
||||
#else
|
||||
assert(!"bad optional access");
|
||||
#endif
|
||||
__throw_bad_optional_access();
|
||||
return this->__val_;
|
||||
}
|
||||
|
||||
@ -529,11 +544,7 @@ public:
|
||||
value_type& value()
|
||||
{
|
||||
if (!this->__engaged_)
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw bad_optional_access();
|
||||
#else
|
||||
assert(!"bad optional access");
|
||||
#endif
|
||||
__throw_bad_optional_access();
|
||||
return this->__val_;
|
||||
}
|
||||
|
||||
@ -710,7 +721,7 @@ template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
constexpr
|
||||
bool
|
||||
operator<=(nullopt_t, const optional<_Tp>& __x) noexcept
|
||||
operator<=(nullopt_t, const optional<_Tp>&) noexcept
|
||||
{
|
||||
return true;
|
||||
}
|
||||
@ -728,7 +739,7 @@ template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
constexpr
|
||||
bool
|
||||
operator>(nullopt_t, const optional<_Tp>& __x) noexcept
|
||||
operator>(nullopt_t, const optional<_Tp>&) noexcept
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@ -899,4 +910,4 @@ _LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP_STD_VER > 11
|
||||
|
||||
#endif // _LIBCPP_OPTIONAL
|
||||
#endif // _LIBCPP_EXPERIMENTAL_OPTIONAL
|
||||
|
@ -123,8 +123,14 @@ _LIBCPP_BEGIN_NAMESPACE_LFTS_V2
|
||||
|
||||
template <class _Tp>
|
||||
class propagate_const;
|
||||
template <class _Up> _LIBCPP_CONSTEXPR const _Up& get_underlying(const propagate_const<_Up>& __pu) _NOEXCEPT;
|
||||
template <class _Up> _LIBCPP_CONSTEXPR _Up& get_underlying(propagate_const<_Up>& __pu) _NOEXCEPT;
|
||||
|
||||
template <class _Up>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
const _Up& get_underlying(const propagate_const<_Up>& __pu) _NOEXCEPT;
|
||||
|
||||
template <class _Up>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
_Up& get_underlying(propagate_const<_Up>& __pu) _NOEXCEPT;
|
||||
|
||||
template <class _Tp>
|
||||
class propagate_const
|
||||
@ -462,14 +468,12 @@ _LIBCPP_CONSTEXPR void swap(propagate_const<_Tp>& __pc1, propagate_const<_Tp>& _
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_CONSTEXPR const _Tp& get_underlying(const propagate_const<_Tp>& __pt) _NOEXCEPT
|
||||
{
|
||||
return __pt.__t_;
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_CONSTEXPR _Tp& get_underlying(propagate_const<_Tp>& __pt) _NOEXCEPT
|
||||
{
|
||||
return __pt.__t_;
|
||||
|
@ -281,7 +281,7 @@ _LIBCPP_BEGIN_NAMESPACE_LFTS
|
||||
const_reference at(size_type __pos) const
|
||||
{
|
||||
return __pos >= size()
|
||||
? (__libcpp_throw(out_of_range("string_view::at")), __data[0])
|
||||
? (__throw_out_of_range("string_view::at"), __data[0])
|
||||
: __data[__pos];
|
||||
}
|
||||
|
||||
@ -352,7 +352,7 @@ _LIBCPP_BEGIN_NAMESPACE_LFTS
|
||||
size_type copy(_CharT* __s, size_type __n, size_type __pos = 0) const
|
||||
{
|
||||
if ( __pos > size())
|
||||
__libcpp_throw(out_of_range("string_view::copy"));
|
||||
__throw_out_of_range("string_view::copy");
|
||||
size_type __rlen = _VSTD::min( __n, size() - __pos );
|
||||
_VSTD::copy_n(begin() + __pos, __rlen, __s );
|
||||
return __rlen;
|
||||
@ -362,11 +362,11 @@ _LIBCPP_BEGIN_NAMESPACE_LFTS
|
||||
basic_string_view substr(size_type __pos = 0, size_type __n = npos) const
|
||||
{
|
||||
// if (__pos > size())
|
||||
// throw out_of_range("string_view::substr");
|
||||
// __throw_out_of_range("string_view::substr");
|
||||
// size_type __rlen = _VSTD::min( __n, size() - __pos );
|
||||
// return basic_string_view(data() + __pos, __rlen);
|
||||
return __pos > size()
|
||||
? (__libcpp_throw((out_of_range("string_view::substr"))), basic_string_view())
|
||||
? (__throw_out_of_range("string_view::substr"), basic_string_view())
|
||||
: basic_string_view(data() + __pos, _VSTD::min(__n, size() - __pos));
|
||||
}
|
||||
|
||||
|
@ -172,6 +172,45 @@ inline namespace fundamentals_v1 {
|
||||
template <class T>
|
||||
using raw_invocation_type_t = typename raw_invocation_type<T>::type;
|
||||
|
||||
// 3.3.3, Logical operator traits
|
||||
template<class... B> struct conjunction;
|
||||
template<class... B> constexpr bool conjunction_v = conjunction<B...>::value;
|
||||
template<class... B> struct disjunction;
|
||||
template<class... B> constexpr bool disjunction_v = disjunction<B...>::value;
|
||||
template<class B> struct negation;
|
||||
template<class B> constexpr bool negation_v = negation<B>::value;
|
||||
|
||||
// 3.3.4, Detection idiom
|
||||
template <class...> using void_t = void;
|
||||
|
||||
struct nonesuch {
|
||||
nonesuch() = delete;
|
||||
~nonesuch() = delete;
|
||||
nonesuch(nonesuch const&) = delete;
|
||||
void operator=(nonesuch const&) = delete;
|
||||
};
|
||||
|
||||
template <template<class...> class Op, class... Args>
|
||||
using is_detected = see below;
|
||||
template <template<class...> class Op, class... Args>
|
||||
constexpr bool is_detected_v = is_detected<Op, Args...>::value;
|
||||
template <template<class...> class Op, class... Args>
|
||||
using detected_t = see below;
|
||||
template <class Default, template<class...> class Op, class... Args>
|
||||
using detected_or = see below;
|
||||
template <class Default, template<class...> class Op, class... Args>
|
||||
using detected_or_t = typename detected_or<Default, Op, Args...>::type;
|
||||
template <class Expected, template<class...> class Op, class... Args>
|
||||
using is_detected_exact = is_same<Expected, detected_t<Op, Args...>>;
|
||||
template <class Expected, template<class...> class Op, class... Args>
|
||||
constexpr bool is_detected_exact_v
|
||||
= is_detected_exact<Expected, Op, Args...>::value;
|
||||
template <class To, template<class...> class Op, class... Args>
|
||||
using is_detected_convertible = is_convertible<detected_t<Op, Args...>, To>;
|
||||
template <class To, template<class...> class Op, class... Args>
|
||||
constexpr bool is_detected_convertible_v
|
||||
= is_detected_convertible<To, Op, Args...>::value;
|
||||
|
||||
} // namespace fundamentals_v1
|
||||
} // namespace experimental
|
||||
} // namespace std
|
||||
@ -420,6 +459,70 @@ template <class _Tp>
|
||||
using raw_invocation_type_t = typename raw_invocation_type<_Tp>::type;
|
||||
*/
|
||||
|
||||
// 3.3.3, Logical operator traits
|
||||
template <class...> using void_t = void;
|
||||
|
||||
template <class... _Args>
|
||||
struct conjunction : _VSTD::__and_<_Args...> {};
|
||||
template <class... _Args>
|
||||
_LIBCPP_CONSTEXPR bool conjunction_v = conjunction<_Args...>::value;
|
||||
|
||||
template <class... _Args>
|
||||
struct disjunction : _VSTD::__or_<_Args...> {};
|
||||
template <class... _Args>
|
||||
_LIBCPP_CONSTEXPR bool disjunction_v = disjunction<_Args...>::value;
|
||||
|
||||
template <class _Tp>
|
||||
struct negation : _VSTD::__not_<_Tp> {};
|
||||
template<class _Tp>
|
||||
_LIBCPP_CONSTEXPR bool negation_v = negation<_Tp>::value;
|
||||
|
||||
// 3.3.4, Detection idiom
|
||||
template <class...> using void_t = void;
|
||||
|
||||
struct nonesuch {
|
||||
nonesuch() = delete;
|
||||
~nonesuch() = delete;
|
||||
nonesuch (nonesuch const&) = delete;
|
||||
void operator=(nonesuch const&) = delete;
|
||||
};
|
||||
|
||||
template <class _Default, class _AlwaysVoid, template <class...> class _Op, class... _Args>
|
||||
struct _DETECTOR {
|
||||
using value_t = false_type;
|
||||
using type = _Default;
|
||||
};
|
||||
|
||||
template <class _Default, template <class...> class _Op, class... _Args>
|
||||
struct _DETECTOR<_Default, void_t<_Op<_Args...>>, _Op, _Args...> {
|
||||
using value_t = true_type;
|
||||
using type = _Op<_Args...>;
|
||||
};
|
||||
|
||||
|
||||
template <template<class...> class _Op, class... _Args>
|
||||
using is_detected = typename _DETECTOR<nonesuch, void, _Op, _Args...>::value_t;
|
||||
template <template<class...> class _Op, class... _Args>
|
||||
using detected_t = typename _DETECTOR<nonesuch, void, _Op, _Args...>::type;
|
||||
template <template<class...> class _Op, class... _Args>
|
||||
_LIBCPP_CONSTEXPR bool is_detected_v = is_detected<_Op, _Args...>::value;
|
||||
|
||||
template <class Default, template<class...> class _Op, class... _Args>
|
||||
using detected_or = _DETECTOR<Default, void, _Op, _Args...>;
|
||||
template <class Default, template<class...> class _Op, class... _Args>
|
||||
using detected_or_t = typename detected_or<Default, _Op, _Args...>::type;
|
||||
|
||||
template <class Expected, template<class...> class _Op, class... _Args>
|
||||
using is_detected_exact = is_same<Expected, detected_t<_Op, _Args...>>;
|
||||
template <class Expected, template<class...> class _Op, class... _Args>
|
||||
_LIBCPP_CONSTEXPR bool is_detected_exact_v = is_detected_exact<Expected, _Op, _Args...>::value;
|
||||
|
||||
template <class To, template<class...> class _Op, class... _Args>
|
||||
using is_detected_convertible = is_convertible<detected_t<_Op, _Args...>, To>;
|
||||
template <class To, template<class...> class _Op, class... _Args>
|
||||
_LIBCPP_CONSTEXPR bool is_detected_convertible_v = is_detected_convertible<To, _Op, _Args...>::value;
|
||||
|
||||
|
||||
_LIBCPP_END_NAMESPACE_LFTS
|
||||
|
||||
#endif /* _LIBCPP_STD_VER > 11 */
|
||||
|
@ -87,7 +87,7 @@ public:
|
||||
reference front();
|
||||
const_reference front() const;
|
||||
|
||||
template <class... Args> void emplace_front(Args&&... args);
|
||||
template <class... Args> reference emplace_front(Args&&... args);
|
||||
void push_front(const value_type& v);
|
||||
void push_front(value_type&& v);
|
||||
|
||||
@ -531,7 +531,7 @@ private:
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
void __move_assign_alloc(__forward_list_base& __x, false_type) _NOEXCEPT
|
||||
void __move_assign_alloc(__forward_list_base&, false_type) _NOEXCEPT
|
||||
{}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
void __move_assign_alloc(__forward_list_base& __x, true_type)
|
||||
@ -734,8 +734,11 @@ public:
|
||||
bool empty() const _NOEXCEPT
|
||||
{return base::__before_begin()->__next_ == nullptr;}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
size_type max_size() const _NOEXCEPT
|
||||
{return numeric_limits<size_type>::max();}
|
||||
size_type max_size() const _NOEXCEPT {
|
||||
return std::min<size_type>(
|
||||
__node_traits::max_size(base::__alloc()),
|
||||
numeric_limits<difference_type>::max());
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
reference front() {return base::__before_begin()->__next_->__value_;}
|
||||
@ -744,7 +747,7 @@ public:
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
||||
template <class... _Args> void emplace_front(_Args&&... __args);
|
||||
template <class... _Args> reference emplace_front(_Args&&... __args);
|
||||
#endif
|
||||
void push_front(value_type&& __v);
|
||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
@ -873,8 +876,9 @@ forward_list<_Tp, _Alloc>::forward_list(size_type __n)
|
||||
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
template <class _Tp, class _Alloc>
|
||||
forward_list<_Tp, _Alloc>::forward_list(size_type __n, const allocator_type& __a)
|
||||
: base ( __a )
|
||||
forward_list<_Tp, _Alloc>::forward_list(size_type __n,
|
||||
const allocator_type& __base_alloc)
|
||||
: base ( __base_alloc )
|
||||
{
|
||||
if (__n > 0)
|
||||
{
|
||||
@ -1099,7 +1103,7 @@ forward_list<_Tp, _Alloc>::assign(initializer_list<value_type> __il)
|
||||
|
||||
template <class _Tp, class _Alloc>
|
||||
template <class... _Args>
|
||||
void
|
||||
typename forward_list<_Tp, _Alloc>::reference
|
||||
forward_list<_Tp, _Alloc>::emplace_front(_Args&&... __args)
|
||||
{
|
||||
__node_allocator& __a = base::__alloc();
|
||||
@ -1109,6 +1113,7 @@ forward_list<_Tp, _Alloc>::emplace_front(_Args&&... __args)
|
||||
_VSTD::forward<_Args>(__args)...);
|
||||
__h->__next_ = base::__before_begin()->__next_;
|
||||
base::__before_begin()->__next_ = __h.release();
|
||||
return base::__before_begin()->__next_->__value_;
|
||||
}
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_VARIADICS
|
||||
@ -1421,7 +1426,7 @@ forward_list<_Tp, _Alloc>::splice_after(const_iterator __p,
|
||||
template <class _Tp, class _Alloc>
|
||||
void
|
||||
forward_list<_Tp, _Alloc>::splice_after(const_iterator __p,
|
||||
forward_list& __x,
|
||||
forward_list& /*__other*/,
|
||||
const_iterator __i)
|
||||
{
|
||||
const_iterator __lm1 = _VSTD::next(__i);
|
||||
@ -1436,7 +1441,7 @@ forward_list<_Tp, _Alloc>::splice_after(const_iterator __p,
|
||||
template <class _Tp, class _Alloc>
|
||||
void
|
||||
forward_list<_Tp, _Alloc>::splice_after(const_iterator __p,
|
||||
forward_list& __x,
|
||||
forward_list& /*__other*/,
|
||||
const_iterator __f, const_iterator __l)
|
||||
{
|
||||
if (__f != __l && __p != __f)
|
||||
|
@ -618,10 +618,9 @@ basic_filebuf<_CharT, _Traits>::underflow()
|
||||
size_t __nr = fread((void*)__extbufnext_, 1, __nmemb, __file_);
|
||||
if (__nr != 0)
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
if (!__cv_)
|
||||
throw bad_cast();
|
||||
#endif
|
||||
__throw_bad_cast();
|
||||
|
||||
__extbufend_ = __extbufnext_ + __nr;
|
||||
char_type* __inext;
|
||||
__r = __cv_->in(__st_, __extbuf_, __extbufend_, __extbufnext_,
|
||||
@ -700,10 +699,9 @@ basic_filebuf<_CharT, _Traits>::overflow(int_type __c)
|
||||
codecvt_base::result __r;
|
||||
do
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
if (!__cv_)
|
||||
throw bad_cast();
|
||||
#endif
|
||||
__throw_bad_cast();
|
||||
|
||||
const char_type* __e;
|
||||
__r = __cv_->out(__st_, this->pbase(), this->pptr(), __e,
|
||||
__extbuf_, __extbuf_ + __ebs_, __extbe);
|
||||
@ -793,10 +791,9 @@ typename basic_filebuf<_CharT, _Traits>::pos_type
|
||||
basic_filebuf<_CharT, _Traits>::seekoff(off_type __off, ios_base::seekdir __way,
|
||||
ios_base::openmode)
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
if (!__cv_)
|
||||
throw bad_cast();
|
||||
#endif
|
||||
__throw_bad_cast();
|
||||
|
||||
int __width = __cv_->encoding();
|
||||
if (__file_ == 0 || (__width <= 0 && __off != 0) || sync())
|
||||
return pos_type(off_type(-1));
|
||||
@ -816,7 +813,7 @@ basic_filebuf<_CharT, _Traits>::seekoff(off_type __off, ios_base::seekdir __way,
|
||||
default:
|
||||
return pos_type(off_type(-1));
|
||||
}
|
||||
#if defined(_WIN32) || defined(_NEWLIB_VERSION)
|
||||
#if defined(_LIBCPP_HAS_NO_OFF_T_FUNCTIONS)
|
||||
if (fseek(__file_, __width > 0 ? __width * __off : 0, __whence))
|
||||
return pos_type(off_type(-1));
|
||||
pos_type __r = ftell(__file_);
|
||||
@ -835,7 +832,7 @@ basic_filebuf<_CharT, _Traits>::seekpos(pos_type __sp, ios_base::openmode)
|
||||
{
|
||||
if (__file_ == 0 || sync())
|
||||
return pos_type(off_type(-1));
|
||||
#if defined(_WIN32) || defined(_NEWLIB_VERSION)
|
||||
#if defined(_LIBCPP_HAS_NO_OFF_T_FUNCTIONS)
|
||||
if (fseek(__file_, __sp, SEEK_SET))
|
||||
return pos_type(off_type(-1));
|
||||
#else
|
||||
@ -852,10 +849,9 @@ basic_filebuf<_CharT, _Traits>::sync()
|
||||
{
|
||||
if (__file_ == 0)
|
||||
return 0;
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
if (!__cv_)
|
||||
throw bad_cast();
|
||||
#endif
|
||||
__throw_bad_cast();
|
||||
|
||||
if (__cm_ & ios_base::out)
|
||||
{
|
||||
if (this->pptr() != this->pbase())
|
||||
@ -900,7 +896,7 @@ basic_filebuf<_CharT, _Traits>::sync()
|
||||
}
|
||||
}
|
||||
}
|
||||
#if defined(_WIN32) || defined(_NEWLIB_VERSION)
|
||||
#if defined(_LIBCPP_HAS_NO_OFF_T_FUNCTIONS)
|
||||
if (fseek(__file_, -__c, SEEK_CUR))
|
||||
return -1;
|
||||
#else
|
||||
|
@ -212,6 +212,13 @@ template <class F> unspecified not_fn(F&& f); // C++17
|
||||
template<class T> struct is_bind_expression;
|
||||
template<class T> struct is_placeholder;
|
||||
|
||||
// See C++14 20.9.9, Function object binders
|
||||
template <class T> constexpr bool is_bind_expression_v
|
||||
= is_bind_expression<T>::value; // C++17
|
||||
template <class T> constexpr int is_placeholder_v
|
||||
= is_placeholder<T>::value; // C++17
|
||||
|
||||
|
||||
template<class Fn, class... BoundArgs>
|
||||
unspecified bind(Fn&&, BoundArgs&&...);
|
||||
template<class R, class Fn, class... BoundArgs>
|
||||
@ -386,15 +393,15 @@ public:
|
||||
template<class F>
|
||||
function(F);
|
||||
template<Allocator Alloc>
|
||||
function(allocator_arg_t, const Alloc&) noexcept;
|
||||
function(allocator_arg_t, const Alloc&) noexcept; // removed in C++17
|
||||
template<Allocator Alloc>
|
||||
function(allocator_arg_t, const Alloc&, nullptr_t) noexcept;
|
||||
function(allocator_arg_t, const Alloc&, nullptr_t) noexcept; // removed in C++17
|
||||
template<Allocator Alloc>
|
||||
function(allocator_arg_t, const Alloc&, const function&);
|
||||
function(allocator_arg_t, const Alloc&, const function&); // removed in C++17
|
||||
template<Allocator Alloc>
|
||||
function(allocator_arg_t, const Alloc&, function&&);
|
||||
function(allocator_arg_t, const Alloc&, function&&); // removed in C++17
|
||||
template<class F, Allocator Alloc>
|
||||
function(allocator_arg_t, const Alloc&, F);
|
||||
function(allocator_arg_t, const Alloc&, F); // removed in C++17
|
||||
|
||||
function& operator=(const function&);
|
||||
function& operator=(function&&) noexcept;
|
||||
@ -1382,6 +1389,16 @@ class _LIBCPP_EXCEPTION_ABI bad_function_call
|
||||
{
|
||||
};
|
||||
|
||||
_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
|
||||
void __throw_bad_function_call()
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw bad_function_call();
|
||||
#else
|
||||
_VSTD::abort();
|
||||
#endif
|
||||
}
|
||||
|
||||
template<class _Fp> class _LIBCPP_TYPE_VIS_ONLY function; // undefined
|
||||
|
||||
namespace __function
|
||||
@ -1595,13 +1612,12 @@ public:
|
||||
function(nullptr_t) _NOEXCEPT : __f_(0) {}
|
||||
function(const function&);
|
||||
function(function&&) _NOEXCEPT;
|
||||
template<class _Fp>
|
||||
function(_Fp, typename enable_if
|
||||
<
|
||||
__callable<_Fp>::value &&
|
||||
!is_same<_Fp, function>::value
|
||||
>::type* = 0);
|
||||
template<class _Fp, class = typename enable_if<
|
||||
__callable<_Fp>::value && !is_same<_Fp, function>::value
|
||||
>::type>
|
||||
function(_Fp);
|
||||
|
||||
#if _LIBCPP_STD_VER <= 14
|
||||
template<class _Alloc>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
function(allocator_arg_t, const _Alloc&) _NOEXCEPT : __f_(0) {}
|
||||
@ -1612,9 +1628,9 @@ public:
|
||||
function(allocator_arg_t, const _Alloc&, const function&);
|
||||
template<class _Alloc>
|
||||
function(allocator_arg_t, const _Alloc&, function&&);
|
||||
template<class _Fp, class _Alloc>
|
||||
function(allocator_arg_t, const _Alloc& __a, _Fp __f,
|
||||
typename enable_if<__callable<_Fp>::value>::type* = 0);
|
||||
template<class _Fp, class _Alloc, class = typename enable_if<__callable<_Fp>::value>::type>
|
||||
function(allocator_arg_t, const _Alloc& __a, _Fp __f);
|
||||
#endif
|
||||
|
||||
function& operator=(const function&);
|
||||
function& operator=(function&&) _NOEXCEPT;
|
||||
@ -1675,6 +1691,7 @@ function<_Rp(_ArgTypes...)>::function(const function& __f)
|
||||
__f_ = __f.__f_->__clone();
|
||||
}
|
||||
|
||||
#if _LIBCPP_STD_VER <= 14
|
||||
template<class _Rp, class ..._ArgTypes>
|
||||
template <class _Alloc>
|
||||
function<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc&,
|
||||
@ -1690,6 +1707,7 @@ function<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc&,
|
||||
else
|
||||
__f_ = __f.__f_->__clone();
|
||||
}
|
||||
#endif
|
||||
|
||||
template<class _Rp, class ..._ArgTypes>
|
||||
function<_Rp(_ArgTypes...)>::function(function&& __f) _NOEXCEPT
|
||||
@ -1708,6 +1726,7 @@ function<_Rp(_ArgTypes...)>::function(function&& __f) _NOEXCEPT
|
||||
}
|
||||
}
|
||||
|
||||
#if _LIBCPP_STD_VER <= 14
|
||||
template<class _Rp, class ..._ArgTypes>
|
||||
template <class _Alloc>
|
||||
function<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc&,
|
||||
@ -1726,15 +1745,11 @@ function<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc&,
|
||||
__f.__f_ = 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
template<class _Rp, class ..._ArgTypes>
|
||||
template <class _Fp>
|
||||
function<_Rp(_ArgTypes...)>::function(_Fp __f,
|
||||
typename enable_if
|
||||
<
|
||||
__callable<_Fp>::value &&
|
||||
!is_same<_Fp, function>::value
|
||||
>::type*)
|
||||
template <class _Fp, class>
|
||||
function<_Rp(_ArgTypes...)>::function(_Fp __f)
|
||||
: __f_(0)
|
||||
{
|
||||
if (__function::__not_null(__f))
|
||||
@ -1756,10 +1771,10 @@ function<_Rp(_ArgTypes...)>::function(_Fp __f,
|
||||
}
|
||||
}
|
||||
|
||||
#if _LIBCPP_STD_VER <= 14
|
||||
template<class _Rp, class ..._ArgTypes>
|
||||
template <class _Fp, class _Alloc>
|
||||
function<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc& __a0, _Fp __f,
|
||||
typename enable_if<__callable<_Fp>::value>::type*)
|
||||
template <class _Fp, class _Alloc, class>
|
||||
function<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc& __a0, _Fp __f)
|
||||
: __f_(0)
|
||||
{
|
||||
typedef allocator_traits<_Alloc> __alloc_traits;
|
||||
@ -1782,6 +1797,7 @@ function<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc& __a0, _Fp _
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
template<class _Rp, class ..._ArgTypes>
|
||||
function<_Rp(_ArgTypes...)>&
|
||||
@ -1854,6 +1870,8 @@ template<class _Rp, class ..._ArgTypes>
|
||||
void
|
||||
function<_Rp(_ArgTypes...)>::swap(function& __f) _NOEXCEPT
|
||||
{
|
||||
if (_VSTD::addressof(__f) == this)
|
||||
return;
|
||||
if ((void *)__f_ == &__buf_ && (void *)__f.__f_ == &__f.__buf_)
|
||||
{
|
||||
typename aligned_storage<sizeof(__buf_)>::type __tempbuf;
|
||||
@ -1891,10 +1909,8 @@ template<class _Rp, class ..._ArgTypes>
|
||||
_Rp
|
||||
function<_Rp(_ArgTypes...)>::operator()(_ArgTypes... __arg) const
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
if (__f_ == 0)
|
||||
throw bad_function_call();
|
||||
#endif // _LIBCPP_NO_EXCEPTIONS
|
||||
__throw_bad_function_call();
|
||||
return (*__f_)(_VSTD::forward<_ArgTypes>(__arg)...);
|
||||
}
|
||||
|
||||
@ -1971,10 +1987,20 @@ template<class _Tp> struct __is_bind_expression : public false_type {};
|
||||
template<class _Tp> struct _LIBCPP_TYPE_VIS_ONLY is_bind_expression
|
||||
: public __is_bind_expression<typename remove_cv<_Tp>::type> {};
|
||||
|
||||
#if _LIBCPP_STD_VER > 14
|
||||
template <class _Tp>
|
||||
constexpr size_t is_bind_expression_v = is_bind_expression<_Tp>::value;
|
||||
#endif
|
||||
|
||||
template<class _Tp> struct __is_placeholder : public integral_constant<int, 0> {};
|
||||
template<class _Tp> struct _LIBCPP_TYPE_VIS_ONLY is_placeholder
|
||||
: public __is_placeholder<typename remove_cv<_Tp>::type> {};
|
||||
|
||||
#if _LIBCPP_STD_VER > 14
|
||||
template <class _Tp>
|
||||
constexpr size_t is_placeholder_v = is_placeholder<_Tp>::value;
|
||||
#endif
|
||||
|
||||
namespace placeholders
|
||||
{
|
||||
|
||||
@ -2204,36 +2230,6 @@ private:
|
||||
|
||||
typedef typename __make_tuple_indices<sizeof...(_BoundArgs)>::type __indices;
|
||||
public:
|
||||
#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__bind(const __bind& __b)
|
||||
: __f_(__b.__f_),
|
||||
__bound_args_(__b.__bound_args_) {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__bind& operator=(const __bind& __b)
|
||||
{
|
||||
__f_ = __b.__f_;
|
||||
__bound_args_ = __b.__bound_args_;
|
||||
return *this;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__bind(__bind&& __b)
|
||||
: __f_(_VSTD::move(__b.__f_)),
|
||||
__bound_args_(_VSTD::move(__b.__bound_args_)) {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__bind& operator=(__bind&& __b)
|
||||
{
|
||||
__f_ = _VSTD::move(__b.__f_);
|
||||
__bound_args_ = _VSTD::move(__b.__bound_args_);
|
||||
return *this;
|
||||
}
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
|
||||
template <class _Gp, class ..._BA,
|
||||
class = typename enable_if
|
||||
<
|
||||
@ -2278,31 +2274,6 @@ class __bind_r
|
||||
public:
|
||||
typedef _Rp result_type;
|
||||
|
||||
#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__bind_r(const __bind_r& __b)
|
||||
: base(_VSTD::forward<const base&>(__b)) {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__bind_r& operator=(const __bind_r& __b)
|
||||
{
|
||||
base::operator=(_VSTD::forward<const base&>(__b));
|
||||
return *this;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__bind_r(__bind_r&& __b)
|
||||
: base(_VSTD::forward<base>(__b)) {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__bind_r& operator=(__bind_r&& __b)
|
||||
{
|
||||
base::operator=(_VSTD::forward<base>(__b));
|
||||
return *this;
|
||||
}
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
|
||||
template <class _Gp, class ..._BA,
|
||||
class = typename enable_if
|
||||
@ -2583,12 +2554,11 @@ struct _LIBCPP_TYPE_VIS_ONLY hash<long double>
|
||||
};
|
||||
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
template <class _Tp>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY hash
|
||||
|
||||
template <class _Tp, bool = is_enum<_Tp>::value>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY __enum_hash
|
||||
: public unary_function<_Tp, size_t>
|
||||
{
|
||||
static_assert(is_enum<_Tp>::value, "This hash only works for enumeration types");
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
size_t operator()(_Tp __v) const _NOEXCEPT
|
||||
{
|
||||
@ -2596,11 +2566,24 @@ struct _LIBCPP_TYPE_VIS_ONLY hash
|
||||
return hash<type>{}(static_cast<type>(__v));
|
||||
}
|
||||
};
|
||||
template <class _Tp>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY __enum_hash<_Tp, false> {
|
||||
__enum_hash() = delete;
|
||||
__enum_hash(__enum_hash const&) = delete;
|
||||
__enum_hash& operator=(__enum_hash const&) = delete;
|
||||
};
|
||||
|
||||
template <class _Tp>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY hash : public __enum_hash<_Tp>
|
||||
{
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
#if _LIBCPP_STD_VER > 14
|
||||
|
||||
#define __cpp_lib_invoke 201411
|
||||
|
||||
template <class _Fn, class ..._Args>
|
||||
result_of_t<_Fn&&(_Args&&...)>
|
||||
invoke(_Fn&& __f, _Args&&... __args)
|
||||
@ -2620,30 +2603,30 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
auto operator()(_Args&& ...__args) &
|
||||
noexcept(noexcept(!_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...)))
|
||||
-> decltype(!_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...))
|
||||
{ return !_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...); }
|
||||
-> decltype( !_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...))
|
||||
{ return !_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...); }
|
||||
|
||||
template <class ..._Args>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
auto operator()(_Args&& ...__args) &&
|
||||
noexcept(noexcept(!_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...)))
|
||||
-> decltype(!_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...))
|
||||
{ return !_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...); }
|
||||
-> decltype( !_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...))
|
||||
{ return !_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...); }
|
||||
|
||||
template <class ..._Args>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
auto operator()(_Args&& ...__args) const&
|
||||
noexcept(noexcept(!_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...)))
|
||||
-> decltype(!_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...))
|
||||
{ return !_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...); }
|
||||
-> decltype( !_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...))
|
||||
{ return !_VSTD::invoke(__fd, _VSTD::forward<_Args>(__args)...); }
|
||||
|
||||
|
||||
template <class ..._Args>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
auto operator()(_Args&& ...__args) const&&
|
||||
noexcept(noexcept(!_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...)))
|
||||
-> decltype(!_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...))
|
||||
{ return !_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...); }
|
||||
-> decltype( !_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...))
|
||||
{ return !_VSTD::invoke(_VSTD::move(__fd), _VSTD::forward<_Args>(__args)...); }
|
||||
|
||||
private:
|
||||
template <class _RawFunc,
|
||||
|
@ -50,7 +50,7 @@ class future_error
|
||||
{
|
||||
public:
|
||||
future_error(error_code ec); // exposition only
|
||||
|
||||
explicit future_error(future_errc); // C++17
|
||||
const error_code& code() const noexcept;
|
||||
const char* what() const noexcept;
|
||||
};
|
||||
@ -505,20 +505,23 @@ class _LIBCPP_EXCEPTION_ABI future_error
|
||||
error_code __ec_;
|
||||
public:
|
||||
future_error(error_code __ec);
|
||||
|
||||
#if _LIBCPP_STD_VERS > 14
|
||||
explicit future_error(future_errc _Ev) : logic_error(), __ec_(make_error_code(_Ev)) {}
|
||||
#endif
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
const error_code& code() const _NOEXCEPT {return __ec_;}
|
||||
|
||||
virtual ~future_error() _NOEXCEPT;
|
||||
};
|
||||
|
||||
inline _LIBCPP_ALWAYS_INLINE
|
||||
_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
|
||||
void __throw_future_error(future_errc _Ev)
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw future_error(make_error_code(_Ev));
|
||||
#else
|
||||
assert(!"future_error");
|
||||
((void)_Ev);
|
||||
_VSTD::abort();
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -2372,7 +2375,7 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
shared_future() _NOEXCEPT : __state_(nullptr) {}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
shared_future(const shared_future& __rhs) : __state_(__rhs.__state_)
|
||||
shared_future(const shared_future& __rhs) _NOEXCEPT : __state_(__rhs.__state_)
|
||||
{if (__state_) __state_->__add_shared();}
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
@ -2383,7 +2386,7 @@ public:
|
||||
{__rhs.__state_ = nullptr;}
|
||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
~shared_future();
|
||||
shared_future& operator=(const shared_future& __rhs);
|
||||
shared_future& operator=(const shared_future& __rhs) _NOEXCEPT;
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
shared_future& operator=(shared_future&& __rhs) _NOEXCEPT
|
||||
@ -2427,7 +2430,7 @@ shared_future<_Rp>::~shared_future()
|
||||
|
||||
template <class _Rp>
|
||||
shared_future<_Rp>&
|
||||
shared_future<_Rp>::operator=(const shared_future& __rhs)
|
||||
shared_future<_Rp>::operator=(const shared_future& __rhs) _NOEXCEPT
|
||||
{
|
||||
if (__rhs.__state_)
|
||||
__rhs.__state_->__add_shared();
|
||||
|
@ -237,6 +237,13 @@ uintmax_t wcstoumax(const wchar_t* restrict nptr, wchar_t** restrict endptr, int
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
/* C99 stdlib (e.g. glibc < 2.18) does not provide format macros needed
|
||||
for C++11 unless __STDC_FORMAT_MACROS is defined
|
||||
*/
|
||||
#if defined(__cplusplus) && !defined(__STDC_FORMAT_MACROS)
|
||||
# define __STDC_FORMAT_MACROS
|
||||
#endif
|
||||
|
||||
#include_next <inttypes.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@ -44,6 +44,7 @@ template <class charT, class traits, class Allocator>
|
||||
*/
|
||||
|
||||
#include <__config>
|
||||
#include <__string>
|
||||
#include <istream>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
@ -567,19 +568,6 @@ __quoted_input ( basic_istream<_CharT, _Traits> &__is, _String & __string, _Char
|
||||
}
|
||||
|
||||
|
||||
template <class _CharT, class _Iter, class _Traits=char_traits<_CharT> >
|
||||
struct __quoted_output_proxy
|
||||
{
|
||||
_Iter __first;
|
||||
_Iter __last;
|
||||
_CharT __delim;
|
||||
_CharT __escape;
|
||||
|
||||
__quoted_output_proxy(_Iter __f, _Iter __l, _CharT __d, _CharT __e)
|
||||
: __first(__f), __last(__l), __delim(__d), __escape(__e) {}
|
||||
// This would be a nice place for a string_ref
|
||||
};
|
||||
|
||||
template <class _CharT, class _Traits, class _Iter>
|
||||
basic_ostream<_CharT, _Traits>& operator<<(
|
||||
basic_ostream<_CharT, _Traits>& __os,
|
||||
@ -666,6 +654,15 @@ quoted ( basic_string <_CharT, _Traits, _Allocator> &__s, _CharT __delim = _Char
|
||||
{
|
||||
return __quoted(__s, __delim, __escape);
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
__quoted_output_proxy<_CharT, const _CharT *, _Traits>
|
||||
quoted (basic_string_view <_CharT, _Traits> __sv,
|
||||
_CharT __delim = _CharT('"'), _CharT __escape=_CharT('\\'))
|
||||
{
|
||||
return __quoted_output_proxy<_CharT, const _CharT *, _Traits>
|
||||
( __sv.data(), __sv.data() + __sv.size(), __delim, __escape );
|
||||
}
|
||||
#endif
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
21
include/ios
21
include/ios
@ -572,6 +572,13 @@ ios_base::exceptions(iostate __iostate)
|
||||
clear(__rdstate_);
|
||||
}
|
||||
|
||||
#if defined(_LIBCPP_CXX03_LANG)
|
||||
struct _LIBCPP_TYPE_VIS_ONLY __cxx03_bool {
|
||||
typedef void (__cxx03_bool::*__bool_type)();
|
||||
void __true_value() {}
|
||||
};
|
||||
#endif
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
class _LIBCPP_TYPE_VIS_ONLY basic_ios
|
||||
: public ios_base
|
||||
@ -585,9 +592,19 @@ public:
|
||||
typedef typename traits_type::pos_type pos_type;
|
||||
typedef typename traits_type::off_type off_type;
|
||||
|
||||
// __true_value will generate undefined references when linking unless
|
||||
// we give it internal linkage.
|
||||
|
||||
#if defined(_LIBCPP_CXX03_LANG)
|
||||
_LIBCPP_ALWAYS_INLINE
|
||||
_LIBCPP_EXPLICIT
|
||||
operator bool() const {return !fail();}
|
||||
operator __cxx03_bool::__bool_type() const {
|
||||
return !fail() ? &__cxx03_bool::__true_value : nullptr;
|
||||
}
|
||||
#else
|
||||
_LIBCPP_ALWAYS_INLINE
|
||||
_LIBCPP_EXPLICIT operator bool() const {return !fail();}
|
||||
#endif
|
||||
|
||||
_LIBCPP_ALWAYS_INLINE bool operator!() const {return fail();}
|
||||
_LIBCPP_ALWAYS_INLINE iostate rdstate() const {return ios_base::rdstate();}
|
||||
_LIBCPP_ALWAYS_INLINE void clear(iostate __state = goodbit) {ios_base::clear(__state);}
|
||||
|
180
include/istream
180
include/istream
@ -184,19 +184,26 @@ public:
|
||||
typedef typename traits_type::off_type off_type;
|
||||
|
||||
// 27.7.1.1.1 Constructor/destructor:
|
||||
explicit basic_istream(basic_streambuf<char_type, traits_type>* __sb);
|
||||
inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
|
||||
explicit basic_istream(basic_streambuf<char_type, traits_type>* __sb) : __gc_(0)
|
||||
{ this->init(__sb); }
|
||||
virtual ~basic_istream();
|
||||
protected:
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_istream(basic_istream&& __rhs);
|
||||
#endif
|
||||
// 27.7.1.1.2 Assign/swap:
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_istream& operator=(basic_istream&& __rhs);
|
||||
#endif
|
||||
void swap(basic_istream& __rhs);
|
||||
|
||||
inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
|
||||
void swap(basic_istream& __rhs) {
|
||||
_VSTD::swap(__gc_, __rhs.__gc_);
|
||||
basic_ios<char_type, traits_type>::swap(__rhs);
|
||||
}
|
||||
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
#ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS
|
||||
@ -213,10 +220,19 @@ public:
|
||||
class _LIBCPP_TYPE_VIS_ONLY sentry;
|
||||
|
||||
// 27.7.1.2 Formatted input:
|
||||
basic_istream& operator>>(basic_istream& (*__pf)(basic_istream&));
|
||||
inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
|
||||
basic_istream& operator>>(basic_istream& (*__pf)(basic_istream&))
|
||||
{ return __pf(*this); }
|
||||
|
||||
inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
|
||||
basic_istream& operator>>(basic_ios<char_type, traits_type>&
|
||||
(*__pf)(basic_ios<char_type, traits_type>&));
|
||||
basic_istream& operator>>(ios_base& (*__pf)(ios_base&));
|
||||
(*__pf)(basic_ios<char_type, traits_type>&))
|
||||
{ __pf(*this); return *this; }
|
||||
|
||||
inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
|
||||
basic_istream& operator>>(ios_base& (*__pf)(ios_base&))
|
||||
{ __pf(*this); return *this; }
|
||||
|
||||
basic_istream& operator>>(basic_streambuf<char_type, traits_type>* __sb);
|
||||
basic_istream& operator>>(bool& __n);
|
||||
basic_istream& operator>>(short& __n);
|
||||
@ -236,13 +252,31 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
streamsize gcount() const {return __gc_;}
|
||||
int_type get();
|
||||
basic_istream& get(char_type& __c);
|
||||
basic_istream& get(char_type* __s, streamsize __n);
|
||||
|
||||
inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
|
||||
basic_istream& get(char_type& __c) {
|
||||
int_type __ch = get();
|
||||
if (__ch != traits_type::eof())
|
||||
__c = traits_type::to_char_type(__ch);
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
|
||||
basic_istream& get(char_type* __s, streamsize __n)
|
||||
{ return get(__s, __n, this->widen('\n')); }
|
||||
|
||||
basic_istream& get(char_type* __s, streamsize __n, char_type __dlm);
|
||||
basic_istream& get(basic_streambuf<char_type, traits_type>& __sb);
|
||||
|
||||
inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
|
||||
basic_istream& get(basic_streambuf<char_type, traits_type>& __sb)
|
||||
{ return get(__sb, this->widen('\n')); }
|
||||
|
||||
basic_istream& get(basic_streambuf<char_type, traits_type>& __sb, char_type __dlm);
|
||||
|
||||
basic_istream& getline(char_type* __s, streamsize __n);
|
||||
inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
|
||||
basic_istream& getline(char_type* __s, streamsize __n)
|
||||
{ return getline(__s, __n, this->widen('\n')); }
|
||||
|
||||
basic_istream& getline(char_type* __s, streamsize __n, char_type __dlm);
|
||||
|
||||
basic_istream& ignore(streamsize __n = 1, int_type __dlm = traits_type::eof());
|
||||
@ -303,18 +337,9 @@ basic_istream<_CharT, _Traits>::sentry::sentry(basic_istream<_CharT, _Traits>& _
|
||||
__is.setstate(ios_base::failbit);
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_istream<_CharT, _Traits>::basic_istream(basic_streambuf<char_type, traits_type>* __sb)
|
||||
: __gc_(0)
|
||||
{
|
||||
this->init(__sb);
|
||||
}
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_istream<_CharT, _Traits>::basic_istream(basic_istream&& __rhs)
|
||||
: __gc_(__rhs.__gc_)
|
||||
{
|
||||
@ -323,7 +348,6 @@ basic_istream<_CharT, _Traits>::basic_istream(basic_istream&& __rhs)
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_istream<_CharT, _Traits>&
|
||||
basic_istream<_CharT, _Traits>::operator=(basic_istream&& __rhs)
|
||||
{
|
||||
@ -338,15 +362,6 @@ basic_istream<_CharT, _Traits>::~basic_istream()
|
||||
{
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
basic_istream<_CharT, _Traits>::swap(basic_istream& __rhs)
|
||||
{
|
||||
_VSTD::swap(__gc_, __rhs.__gc_);
|
||||
basic_ios<char_type, traits_type>::swap(__rhs);
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
basic_istream<_CharT, _Traits>&
|
||||
basic_istream<_CharT, _Traits>::operator>>(unsigned short& __n)
|
||||
@ -724,33 +739,6 @@ basic_istream<_CharT, _Traits>::operator>>(int& __n)
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_istream<_CharT, _Traits>&
|
||||
basic_istream<_CharT, _Traits>::operator>>(basic_istream& (*__pf)(basic_istream&))
|
||||
{
|
||||
return __pf(*this);
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_istream<_CharT, _Traits>&
|
||||
basic_istream<_CharT, _Traits>::operator>>(basic_ios<char_type, traits_type>&
|
||||
(*__pf)(basic_ios<char_type, traits_type>&))
|
||||
{
|
||||
__pf(*this);
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_istream<_CharT, _Traits>&
|
||||
basic_istream<_CharT, _Traits>::operator>>(ios_base& (*__pf)(ios_base&))
|
||||
{
|
||||
__pf(*this);
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<class _CharT, class _Traits>
|
||||
basic_istream<_CharT, _Traits>&
|
||||
operator>>(basic_istream<_CharT, _Traits>& __is, _CharT* __s)
|
||||
@ -946,17 +934,6 @@ basic_istream<_CharT, _Traits>::get()
|
||||
return __r;
|
||||
}
|
||||
|
||||
template<class _CharT, class _Traits>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_istream<_CharT, _Traits>&
|
||||
basic_istream<_CharT, _Traits>::get(char_type& __c)
|
||||
{
|
||||
int_type __ch = get();
|
||||
if (__ch != traits_type::eof())
|
||||
__c = traits_type::to_char_type(__ch);
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<class _CharT, class _Traits>
|
||||
basic_istream<_CharT, _Traits>&
|
||||
basic_istream<_CharT, _Traits>::get(char_type* __s, streamsize __n, char_type __dlm)
|
||||
@ -1005,14 +982,6 @@ basic_istream<_CharT, _Traits>::get(char_type* __s, streamsize __n, char_type __
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<class _CharT, class _Traits>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_istream<_CharT, _Traits>&
|
||||
basic_istream<_CharT, _Traits>::get(char_type* __s, streamsize __n)
|
||||
{
|
||||
return get(__s, __n, this->widen('\n'));
|
||||
}
|
||||
|
||||
template<class _CharT, class _Traits>
|
||||
basic_istream<_CharT, _Traits>&
|
||||
basic_istream<_CharT, _Traits>::get(basic_streambuf<char_type, traits_type>& __sb,
|
||||
@ -1067,14 +1036,6 @@ basic_istream<_CharT, _Traits>::get(basic_streambuf<char_type, traits_type>& __s
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<class _CharT, class _Traits>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_istream<_CharT, _Traits>&
|
||||
basic_istream<_CharT, _Traits>::get(basic_streambuf<char_type, traits_type>& __sb)
|
||||
{
|
||||
return get(__sb, this->widen('\n'));
|
||||
}
|
||||
|
||||
template<class _CharT, class _Traits>
|
||||
basic_istream<_CharT, _Traits>&
|
||||
basic_istream<_CharT, _Traits>::getline(char_type* __s, streamsize __n, char_type __dlm)
|
||||
@ -1128,14 +1089,6 @@ basic_istream<_CharT, _Traits>::getline(char_type* __s, streamsize __n, char_typ
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<class _CharT, class _Traits>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_istream<_CharT, _Traits>&
|
||||
basic_istream<_CharT, _Traits>::getline(char_type* __s, streamsize __n)
|
||||
{
|
||||
return getline(__s, __n, this->widen('\n'));
|
||||
}
|
||||
|
||||
template<class _CharT, class _Traits>
|
||||
basic_istream<_CharT, _Traits>&
|
||||
basic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __dlm)
|
||||
@ -1481,9 +1434,9 @@ ws(basic_istream<_CharT, _Traits>& __is)
|
||||
template <class _CharT, class _Traits, class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_istream<_CharT, _Traits>&
|
||||
operator>>(basic_istream<_CharT, _Traits>&& __is, _Tp& __x)
|
||||
operator>>(basic_istream<_CharT, _Traits>&& __is, _Tp&& __x)
|
||||
{
|
||||
__is >> __x;
|
||||
__is >> _VSTD::forward<_Tp>(__x);
|
||||
return __is;
|
||||
}
|
||||
|
||||
@ -1503,41 +1456,38 @@ public:
|
||||
typedef typename traits_type::off_type off_type;
|
||||
|
||||
// constructor/destructor
|
||||
explicit basic_iostream(basic_streambuf<char_type, traits_type>* __sb);
|
||||
inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
|
||||
explicit basic_iostream(basic_streambuf<char_type, traits_type>* __sb)
|
||||
: basic_istream<_CharT, _Traits>(__sb)
|
||||
{}
|
||||
|
||||
virtual ~basic_iostream();
|
||||
protected:
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_iostream(basic_iostream&& __rhs);
|
||||
#endif
|
||||
|
||||
// assign/swap
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_iostream& operator=(basic_iostream&& __rhs);
|
||||
#endif
|
||||
void swap(basic_iostream& __rhs);
|
||||
inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
|
||||
void swap(basic_iostream& __rhs)
|
||||
{ basic_istream<char_type, traits_type>::swap(__rhs); }
|
||||
public:
|
||||
};
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_iostream<_CharT, _Traits>::basic_iostream(basic_streambuf<char_type, traits_type>* __sb)
|
||||
: basic_istream<_CharT, _Traits>(__sb)
|
||||
{
|
||||
}
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_iostream<_CharT, _Traits>::basic_iostream(basic_iostream&& __rhs)
|
||||
: basic_istream<_CharT, _Traits>(_VSTD::move(__rhs))
|
||||
{
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_iostream<_CharT, _Traits>&
|
||||
basic_iostream<_CharT, _Traits>::operator=(basic_iostream&& __rhs)
|
||||
{
|
||||
@ -1552,14 +1502,6 @@ basic_iostream<_CharT, _Traits>::~basic_iostream()
|
||||
{
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
basic_iostream<_CharT, _Traits>::swap(basic_iostream& __rhs)
|
||||
{
|
||||
basic_istream<char_type, traits_type>::swap(__rhs);
|
||||
}
|
||||
|
||||
template<class _CharT, class _Traits, class _Allocator>
|
||||
basic_istream<_CharT, _Traits>&
|
||||
operator>>(basic_istream<_CharT, _Traits>& __is,
|
||||
@ -1705,7 +1647,7 @@ operator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Size>& __x)
|
||||
{
|
||||
basic_string<_CharT, _Traits> __str;
|
||||
const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
|
||||
streamsize __c = 0;
|
||||
size_t __c = 0;
|
||||
ios_base::iostate __err = ios_base::goodbit;
|
||||
_CharT __zero = __ct.widen('0');
|
||||
_CharT __one = __ct.widen('1');
|
||||
@ -1741,9 +1683,9 @@ operator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Size>& __x)
|
||||
return __is;
|
||||
}
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_istream<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_istream<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_iostream<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_iostream<char>)
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
|
411
include/iterator
411
include/iterator
@ -89,57 +89,60 @@ public:
|
||||
typedef typename iterator_traits<Iterator>::reference reference;
|
||||
typedef typename iterator_traits<Iterator>::pointer pointer;
|
||||
|
||||
reverse_iterator();
|
||||
explicit reverse_iterator(Iterator x);
|
||||
template <class U> reverse_iterator(const reverse_iterator<U>& u);
|
||||
Iterator base() const;
|
||||
reference operator*() const;
|
||||
pointer operator->() const;
|
||||
reverse_iterator& operator++();
|
||||
reverse_iterator operator++(int);
|
||||
reverse_iterator& operator--();
|
||||
reverse_iterator operator--(int);
|
||||
reverse_iterator operator+ (difference_type n) const;
|
||||
reverse_iterator& operator+=(difference_type n);
|
||||
reverse_iterator operator- (difference_type n) const;
|
||||
reverse_iterator& operator-=(difference_type n);
|
||||
reference operator[](difference_type n) const;
|
||||
constexpr reverse_iterator();
|
||||
constexpr explicit reverse_iterator(Iterator x);
|
||||
template <class U> constexpr reverse_iterator(const reverse_iterator<U>& u);
|
||||
template <class U> constexpr reverse_iterator& operator=(const reverse_iterator<U>& u);
|
||||
constexpr Iterator base() const;
|
||||
constexpr reference operator*() const;
|
||||
constexpr pointer operator->() const;
|
||||
constexpr reverse_iterator& operator++();
|
||||
constexpr reverse_iterator operator++(int);
|
||||
constexpr reverse_iterator& operator--();
|
||||
constexpr reverse_iterator operator--(int);
|
||||
constexpr reverse_iterator operator+ (difference_type n) const;
|
||||
constexpr reverse_iterator& operator+=(difference_type n);
|
||||
constexpr reverse_iterator operator- (difference_type n) const;
|
||||
constexpr reverse_iterator& operator-=(difference_type n);
|
||||
constexpr reference operator[](difference_type n) const;
|
||||
};
|
||||
|
||||
template <class Iterator1, class Iterator2>
|
||||
bool
|
||||
constexpr bool // constexpr in C++17
|
||||
operator==(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);
|
||||
|
||||
template <class Iterator1, class Iterator2>
|
||||
bool
|
||||
constexpr bool // constexpr in C++17
|
||||
operator<(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);
|
||||
|
||||
template <class Iterator1, class Iterator2>
|
||||
bool
|
||||
constexpr bool // constexpr in C++17
|
||||
operator!=(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);
|
||||
|
||||
template <class Iterator1, class Iterator2>
|
||||
bool
|
||||
constexpr bool // constexpr in C++17
|
||||
operator>(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);
|
||||
|
||||
template <class Iterator1, class Iterator2>
|
||||
bool
|
||||
constexpr bool // constexpr in C++17
|
||||
operator>=(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);
|
||||
|
||||
template <class Iterator1, class Iterator2>
|
||||
bool
|
||||
constexpr bool // constexpr in C++17
|
||||
operator<=(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);
|
||||
|
||||
template <class Iterator1, class Iterator2>
|
||||
auto
|
||||
constexpr auto
|
||||
operator-(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y)
|
||||
-> decltype(__y.base() - __x.base());
|
||||
-> decltype(__y.base() - __x.base()); // constexpr in C++17
|
||||
|
||||
template <class Iterator>
|
||||
reverse_iterator<Iterator>
|
||||
operator+(typename reverse_iterator<Iterator>::difference_type n, const reverse_iterator<Iterator>& x);
|
||||
constexpr reverse_iterator<Iterator>
|
||||
operator+(typename reverse_iterator<Iterator>::difference_type n,
|
||||
const reverse_iterator<Iterator>& x); // constexpr in C++17
|
||||
|
||||
template <class Iterator> reverse_iterator<Iterator> make_reverse_iterator(Iterator i); // C++14
|
||||
template <class Iterator>
|
||||
constexpr reverse_iterator<Iterator> make_reverse_iterator(Iterator i); // C++14, constexpr in C++17
|
||||
|
||||
template <class Container>
|
||||
class back_insert_iterator
|
||||
@ -216,61 +219,64 @@ public:
|
||||
typedef typename iterator_traits<Iterator>::iterator_category iterator_category;
|
||||
typedef value_type&& reference;
|
||||
|
||||
move_iterator();
|
||||
explicit move_iterator(Iterator i);
|
||||
template <class U> move_iterator(const move_iterator<U>& u);
|
||||
template <class U> move_iterator& operator=(const move_iterator<U>& u);
|
||||
iterator_type base() const;
|
||||
reference operator*() const;
|
||||
pointer operator->() const;
|
||||
move_iterator& operator++();
|
||||
move_iterator operator++(int);
|
||||
move_iterator& operator--();
|
||||
move_iterator operator--(int);
|
||||
move_iterator operator+(difference_type n) const;
|
||||
move_iterator& operator+=(difference_type n);
|
||||
move_iterator operator-(difference_type n) const;
|
||||
move_iterator& operator-=(difference_type n);
|
||||
unspecified operator[](difference_type n) const;
|
||||
constexpr move_iterator(); // all the constexprs are in C++17
|
||||
constexpr explicit move_iterator(Iterator i);
|
||||
template <class U>
|
||||
constexpr move_iterator(const move_iterator<U>& u);
|
||||
template <class U>
|
||||
constexpr move_iterator& operator=(const move_iterator<U>& u);
|
||||
constexpr iterator_type base() const;
|
||||
constexpr reference operator*() const;
|
||||
constexpr pointer operator->() const;
|
||||
constexpr move_iterator& operator++();
|
||||
constexpr move_iterator operator++(int);
|
||||
constexpr move_iterator& operator--();
|
||||
constexpr move_iterator operator--(int);
|
||||
constexpr move_iterator operator+(difference_type n) const;
|
||||
constexpr move_iterator& operator+=(difference_type n);
|
||||
constexpr move_iterator operator-(difference_type n) const;
|
||||
constexpr move_iterator& operator-=(difference_type n);
|
||||
constexpr unspecified operator[](difference_type n) const;
|
||||
private:
|
||||
Iterator current; // exposition only
|
||||
};
|
||||
|
||||
template <class Iterator1, class Iterator2>
|
||||
bool
|
||||
constexpr bool // constexpr in C++17
|
||||
operator==(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
|
||||
|
||||
template <class Iterator1, class Iterator2>
|
||||
bool
|
||||
constexpr bool // constexpr in C++17
|
||||
operator!=(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
|
||||
|
||||
template <class Iterator1, class Iterator2>
|
||||
bool
|
||||
constexpr bool // constexpr in C++17
|
||||
operator<(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
|
||||
|
||||
template <class Iterator1, class Iterator2>
|
||||
bool
|
||||
constexpr bool // constexpr in C++17
|
||||
operator<=(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
|
||||
|
||||
template <class Iterator1, class Iterator2>
|
||||
bool
|
||||
constexpr bool // constexpr in C++17
|
||||
operator>(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
|
||||
|
||||
template <class Iterator1, class Iterator2>
|
||||
bool
|
||||
constexpr bool // constexpr in C++17
|
||||
operator>=(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
|
||||
|
||||
template <class Iterator1, class Iterator2>
|
||||
auto
|
||||
constexpr auto // constexpr in C++17
|
||||
operator-(const move_iterator<Iterator1>& x,
|
||||
const move_iterator<Iterator2>& y) -> decltype(x.base() - y.base());
|
||||
|
||||
template <class Iterator>
|
||||
move_iterator<Iterator> operator+(typename move_iterator<Iterator>::difference_type n,
|
||||
const move_iterator<Iterator>& x);
|
||||
constexpr move_iterator<Iterator> operator+( // constexpr in C++17
|
||||
typename move_iterator<Iterator>::difference_type n,
|
||||
const move_iterator<Iterator>& x);
|
||||
|
||||
template <class Iterator>
|
||||
move_iterator<Iterator> make_move_iterator(const Iterator& i);
|
||||
template <class Iterator> // constexpr in C++17
|
||||
constexpr move_iterator<Iterator> make_move_iterator(const Iterator& i);
|
||||
|
||||
|
||||
template <class T, class charT = char, class traits = char_traits<charT>, class Distance = ptrdiff_t>
|
||||
@ -508,8 +514,8 @@ struct __is_random_access_iterator : public __has_iterator_category_convertible_
|
||||
template <class _Tp>
|
||||
struct __is_exactly_input_iterator
|
||||
: public integral_constant<bool,
|
||||
__has_iterator_category_convertible_to<_Tp, input_iterator_tag>::value &&
|
||||
!__has_iterator_category_convertible_to<_Tp, forward_iterator_tag>::value> {};
|
||||
__has_iterator_category_convertible_to<_Tp, input_iterator_tag>::value &&
|
||||
!__has_iterator_category_convertible_to<_Tp, forward_iterator_tag>::value> {};
|
||||
|
||||
template<class _Category, class _Tp, class _Distance = ptrdiff_t,
|
||||
class _Pointer = _Tp*, class _Reference = _Tp&>
|
||||
@ -618,7 +624,7 @@ class _LIBCPP_TYPE_VIS_ONLY reverse_iterator
|
||||
typename iterator_traits<_Iter>::reference>
|
||||
{
|
||||
private:
|
||||
mutable _Iter __t; // no longer used as of LWG #2360, not removed due to ABI break
|
||||
/*mutable*/ _Iter __t; // no longer used as of LWG #2360, not removed due to ABI break
|
||||
protected:
|
||||
_Iter current;
|
||||
public:
|
||||
@ -627,33 +633,45 @@ public:
|
||||
typedef typename iterator_traits<_Iter>::reference reference;
|
||||
typedef typename iterator_traits<_Iter>::pointer pointer;
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY reverse_iterator() : current() {}
|
||||
_LIBCPP_INLINE_VISIBILITY explicit reverse_iterator(_Iter __x) : __t(__x), current(__x) {}
|
||||
template <class _Up> _LIBCPP_INLINE_VISIBILITY reverse_iterator(const reverse_iterator<_Up>& __u)
|
||||
: __t(__u.base()), current(__u.base()) {}
|
||||
_LIBCPP_INLINE_VISIBILITY _Iter base() const {return current;}
|
||||
_LIBCPP_INLINE_VISIBILITY reference operator*() const {_Iter __tmp = current; return *--__tmp;}
|
||||
_LIBCPP_INLINE_VISIBILITY pointer operator->() const {return _VSTD::addressof(operator*());}
|
||||
_LIBCPP_INLINE_VISIBILITY reverse_iterator& operator++() {--current; return *this;}
|
||||
_LIBCPP_INLINE_VISIBILITY reverse_iterator operator++(int)
|
||||
{reverse_iterator __tmp(*this); --current; return __tmp;}
|
||||
_LIBCPP_INLINE_VISIBILITY reverse_iterator& operator--() {++current; return *this;}
|
||||
_LIBCPP_INLINE_VISIBILITY reverse_iterator operator--(int)
|
||||
{reverse_iterator __tmp(*this); ++current; return __tmp;}
|
||||
_LIBCPP_INLINE_VISIBILITY reverse_iterator operator+ (difference_type __n) const
|
||||
{return reverse_iterator(current - __n);}
|
||||
_LIBCPP_INLINE_VISIBILITY reverse_iterator& operator+=(difference_type __n)
|
||||
{current -= __n; return *this;}
|
||||
_LIBCPP_INLINE_VISIBILITY reverse_iterator operator- (difference_type __n) const
|
||||
{return reverse_iterator(current + __n);}
|
||||
_LIBCPP_INLINE_VISIBILITY reverse_iterator& operator-=(difference_type __n)
|
||||
{current += __n; return *this;}
|
||||
_LIBCPP_INLINE_VISIBILITY reference operator[](difference_type __n) const
|
||||
{return *(*this + __n);}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
reverse_iterator() : __t(), current() {}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
explicit reverse_iterator(_Iter __x) : __t(__x), current(__x) {}
|
||||
template <class _Up>
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
reverse_iterator(const reverse_iterator<_Up>& __u) : __t(__u.base()), current(__u.base()) {}
|
||||
template <class _Up>
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
reverse_iterator& operator=(const reverse_iterator<_Up>& __u)
|
||||
{ __t = current = __u.base(); return *this; }
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
_Iter base() const {return current;}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
reference operator*() const {_Iter __tmp = current; return *--__tmp;}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
pointer operator->() const {return _VSTD::addressof(operator*());}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
reverse_iterator& operator++() {--current; return *this;}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
reverse_iterator operator++(int) {reverse_iterator __tmp(*this); --current; return __tmp;}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
reverse_iterator& operator--() {++current; return *this;}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
reverse_iterator operator--(int) {reverse_iterator __tmp(*this); ++current; return __tmp;}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
reverse_iterator operator+ (difference_type __n) const {return reverse_iterator(current - __n);}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
reverse_iterator& operator+=(difference_type __n) {current -= __n; return *this;}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
reverse_iterator operator- (difference_type __n) const {return reverse_iterator(current + __n);}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
reverse_iterator& operator-=(difference_type __n) {current += __n; return *this;}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
reference operator[](difference_type __n) const {return *(*this + __n);}
|
||||
};
|
||||
|
||||
template <class _Iter1, class _Iter2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
bool
|
||||
operator==(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)
|
||||
{
|
||||
@ -661,7 +679,7 @@ operator==(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>&
|
||||
}
|
||||
|
||||
template <class _Iter1, class _Iter2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
bool
|
||||
operator<(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)
|
||||
{
|
||||
@ -669,7 +687,7 @@ operator<(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& _
|
||||
}
|
||||
|
||||
template <class _Iter1, class _Iter2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
bool
|
||||
operator!=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)
|
||||
{
|
||||
@ -677,7 +695,7 @@ operator!=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>&
|
||||
}
|
||||
|
||||
template <class _Iter1, class _Iter2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
bool
|
||||
operator>(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)
|
||||
{
|
||||
@ -685,7 +703,7 @@ operator>(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& _
|
||||
}
|
||||
|
||||
template <class _Iter1, class _Iter2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
bool
|
||||
operator>=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)
|
||||
{
|
||||
@ -693,7 +711,7 @@ operator>=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>&
|
||||
}
|
||||
|
||||
template <class _Iter1, class _Iter2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
bool
|
||||
operator<=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)
|
||||
{
|
||||
@ -702,7 +720,7 @@ operator<=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>&
|
||||
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
template <class _Iter1, class _Iter2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
auto
|
||||
operator-(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y)
|
||||
-> decltype(__y.base() - __x.base())
|
||||
@ -720,7 +738,7 @@ operator-(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& _
|
||||
#endif
|
||||
|
||||
template <class _Iter>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
reverse_iterator<_Iter>
|
||||
operator+(typename reverse_iterator<_Iter>::difference_type __n, const reverse_iterator<_Iter>& __x)
|
||||
{
|
||||
@ -729,7 +747,7 @@ operator+(typename reverse_iterator<_Iter>::difference_type __n, const reverse_i
|
||||
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
template <class _Iter>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
reverse_iterator<_Iter> make_reverse_iterator(_Iter __i)
|
||||
{
|
||||
return reverse_iterator<_Iter>(__i);
|
||||
@ -889,9 +907,9 @@ private:
|
||||
ostream_type* __out_stream_;
|
||||
const char_type* __delim_;
|
||||
public:
|
||||
_LIBCPP_INLINE_VISIBILITY ostream_iterator(ostream_type& __s)
|
||||
_LIBCPP_INLINE_VISIBILITY ostream_iterator(ostream_type& __s) _NOEXCEPT
|
||||
: __out_stream_(_VSTD::addressof(__s)), __delim_(0) {}
|
||||
_LIBCPP_INLINE_VISIBILITY ostream_iterator(ostream_type& __s, const _CharT* __delimiter)
|
||||
_LIBCPP_INLINE_VISIBILITY ostream_iterator(ostream_type& __s, const _CharT* __delimiter) _NOEXCEPT
|
||||
: __out_stream_(_VSTD::addressof(__s)), __delim_(__delimiter) {}
|
||||
_LIBCPP_INLINE_VISIBILITY ostream_iterator& operator=(const _Tp& __value_)
|
||||
{
|
||||
@ -1040,37 +1058,40 @@ public:
|
||||
typedef typename iterator_traits<iterator_type>::reference reference;
|
||||
#endif
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY move_iterator() : __i() {}
|
||||
_LIBCPP_INLINE_VISIBILITY explicit move_iterator(_Iter __x) : __i(__x) {}
|
||||
template <class _Up> _LIBCPP_INLINE_VISIBILITY move_iterator(const move_iterator<_Up>& __u)
|
||||
: __i(__u.base()) {}
|
||||
_LIBCPP_INLINE_VISIBILITY _Iter base() const {return __i;}
|
||||
_LIBCPP_INLINE_VISIBILITY reference operator*() const {
|
||||
return static_cast<reference>(*__i);
|
||||
}
|
||||
_LIBCPP_INLINE_VISIBILITY pointer operator->() const { return __i;}
|
||||
_LIBCPP_INLINE_VISIBILITY move_iterator& operator++() {++__i; return *this;}
|
||||
_LIBCPP_INLINE_VISIBILITY move_iterator operator++(int)
|
||||
{move_iterator __tmp(*this); ++__i; return __tmp;}
|
||||
_LIBCPP_INLINE_VISIBILITY move_iterator& operator--() {--__i; return *this;}
|
||||
_LIBCPP_INLINE_VISIBILITY move_iterator operator--(int)
|
||||
{move_iterator __tmp(*this); --__i; return __tmp;}
|
||||
_LIBCPP_INLINE_VISIBILITY move_iterator operator+ (difference_type __n) const
|
||||
{return move_iterator(__i + __n);}
|
||||
_LIBCPP_INLINE_VISIBILITY move_iterator& operator+=(difference_type __n)
|
||||
{__i += __n; return *this;}
|
||||
_LIBCPP_INLINE_VISIBILITY move_iterator operator- (difference_type __n) const
|
||||
{return move_iterator(__i - __n);}
|
||||
_LIBCPP_INLINE_VISIBILITY move_iterator& operator-=(difference_type __n)
|
||||
{__i -= __n; return *this;}
|
||||
_LIBCPP_INLINE_VISIBILITY reference operator[](difference_type __n) const
|
||||
{
|
||||
return static_cast<reference>(__i[__n]);
|
||||
}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
move_iterator() : __i() {}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
explicit move_iterator(_Iter __x) : __i(__x) {}
|
||||
template <class _Up>
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
move_iterator(const move_iterator<_Up>& __u) : __i(__u.base()) {}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 _Iter base() const {return __i;}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
reference operator*() const { return static_cast<reference>(*__i); }
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
pointer operator->() const { return __i;}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
move_iterator& operator++() {++__i; return *this;}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
move_iterator operator++(int) {move_iterator __tmp(*this); ++__i; return __tmp;}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
move_iterator& operator--() {--__i; return *this;}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
move_iterator operator--(int) {move_iterator __tmp(*this); --__i; return __tmp;}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
move_iterator operator+ (difference_type __n) const {return move_iterator(__i + __n);}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
move_iterator& operator+=(difference_type __n) {__i += __n; return *this;}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
move_iterator operator- (difference_type __n) const {return move_iterator(__i - __n);}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
move_iterator& operator-=(difference_type __n) {__i -= __n; return *this;}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
reference operator[](difference_type __n) const { return static_cast<reference>(__i[__n]); }
|
||||
};
|
||||
|
||||
template <class _Iter1, class _Iter2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
bool
|
||||
operator==(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
|
||||
{
|
||||
@ -1078,7 +1099,7 @@ operator==(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
|
||||
}
|
||||
|
||||
template <class _Iter1, class _Iter2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
bool
|
||||
operator<(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
|
||||
{
|
||||
@ -1086,7 +1107,7 @@ operator<(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
|
||||
}
|
||||
|
||||
template <class _Iter1, class _Iter2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
bool
|
||||
operator!=(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
|
||||
{
|
||||
@ -1094,7 +1115,7 @@ operator!=(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
|
||||
}
|
||||
|
||||
template <class _Iter1, class _Iter2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
bool
|
||||
operator>(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
|
||||
{
|
||||
@ -1102,7 +1123,7 @@ operator>(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
|
||||
}
|
||||
|
||||
template <class _Iter1, class _Iter2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
bool
|
||||
operator>=(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
|
||||
{
|
||||
@ -1110,7 +1131,7 @@ operator>=(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
|
||||
}
|
||||
|
||||
template <class _Iter1, class _Iter2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
bool
|
||||
operator<=(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
|
||||
{
|
||||
@ -1119,7 +1140,7 @@ operator<=(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
|
||||
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
template <class _Iter1, class _Iter2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
auto
|
||||
operator-(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
|
||||
-> decltype(__x.base() - __y.base())
|
||||
@ -1137,7 +1158,7 @@ operator-(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y)
|
||||
#endif
|
||||
|
||||
template <class _Iter>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
move_iterator<_Iter>
|
||||
operator+(typename move_iterator<_Iter>::difference_type __n, const move_iterator<_Iter>& __x)
|
||||
{
|
||||
@ -1145,7 +1166,7 @@ operator+(typename move_iterator<_Iter>::difference_type __n, const move_iterato
|
||||
}
|
||||
|
||||
template <class _Iter>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
move_iterator<_Iter>
|
||||
make_move_iterator(_Iter __i)
|
||||
{
|
||||
@ -1159,56 +1180,58 @@ template <class _Iter> class __wrap_iter;
|
||||
template <class _Iter1, class _Iter2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator==(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT;
|
||||
operator==(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
|
||||
|
||||
template <class _Iter1, class _Iter2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator<(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT;
|
||||
operator<(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
|
||||
|
||||
template <class _Iter1, class _Iter2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator!=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT;
|
||||
operator!=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
|
||||
|
||||
template <class _Iter1, class _Iter2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator>(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT;
|
||||
operator>(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
|
||||
|
||||
template <class _Iter1, class _Iter2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator>=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT;
|
||||
operator>=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
|
||||
|
||||
template <class _Iter1, class _Iter2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator<=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT;
|
||||
operator<=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
|
||||
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
template <class _Iter1, class _Iter2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
auto
|
||||
operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT
|
||||
operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT_DEBUG
|
||||
-> decltype(__x.base() - __y.base());
|
||||
#else
|
||||
template <class _Iter1, class _Iter2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
typename __wrap_iter<_Iter1>::difference_type
|
||||
operator-(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT;
|
||||
operator-(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
|
||||
#endif
|
||||
|
||||
template <class _Iter>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__wrap_iter<_Iter>
|
||||
operator+(typename __wrap_iter<_Iter>::difference_type, __wrap_iter<_Iter>) _NOEXCEPT;
|
||||
operator+(typename __wrap_iter<_Iter>::difference_type, __wrap_iter<_Iter>) _NOEXCEPT_DEBUG;
|
||||
|
||||
template <class _Ip, class _Op> _Op _LIBCPP_INLINE_VISIBILITY copy(_Ip, _Ip, _Op);
|
||||
template <class _B1, class _B2> _B2 _LIBCPP_INLINE_VISIBILITY copy_backward(_B1, _B1, _B2);
|
||||
template <class _Ip, class _Op> _Op _LIBCPP_INLINE_VISIBILITY move(_Ip, _Ip, _Op);
|
||||
template <class _B1, class _B2> _B2 _LIBCPP_INLINE_VISIBILITY move_backward(_B1, _B1, _B2);
|
||||
|
||||
#if _LIBCPP_DEBUG_LEVEL < 2
|
||||
|
||||
template <class _Tp>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
typename enable_if
|
||||
@ -1218,6 +1241,19 @@ typename enable_if
|
||||
>::type
|
||||
__unwrap_iter(__wrap_iter<_Tp*>);
|
||||
|
||||
#else
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
typename enable_if
|
||||
<
|
||||
is_trivially_copy_assignable<_Tp>::value,
|
||||
__wrap_iter<_Tp*>
|
||||
>::type
|
||||
__unwrap_iter(__wrap_iter<_Tp*> __i);
|
||||
|
||||
#endif
|
||||
|
||||
template <class _Iter>
|
||||
class __wrap_iter
|
||||
{
|
||||
@ -1231,7 +1267,7 @@ public:
|
||||
private:
|
||||
iterator_type __i;
|
||||
public:
|
||||
_LIBCPP_INLINE_VISIBILITY __wrap_iter() _NOEXCEPT
|
||||
_LIBCPP_INLINE_VISIBILITY __wrap_iter() _NOEXCEPT_DEBUG
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
: __i{}
|
||||
#endif
|
||||
@ -1241,7 +1277,7 @@ public:
|
||||
#endif
|
||||
}
|
||||
template <class _Up> _LIBCPP_INLINE_VISIBILITY __wrap_iter(const __wrap_iter<_Up>& __u,
|
||||
typename enable_if<is_convertible<_Up, iterator_type>::value>::type* = 0) _NOEXCEPT
|
||||
typename enable_if<is_convertible<_Up, iterator_type>::value>::type* = 0) _NOEXCEPT_DEBUG
|
||||
: __i(__u.base())
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
@ -1271,7 +1307,7 @@ public:
|
||||
__get_db()->__erase_i(this);
|
||||
}
|
||||
#endif
|
||||
_LIBCPP_INLINE_VISIBILITY reference operator*() const _NOEXCEPT
|
||||
_LIBCPP_INLINE_VISIBILITY reference operator*() const _NOEXCEPT_DEBUG
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
_LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
|
||||
@ -1279,7 +1315,7 @@ public:
|
||||
#endif
|
||||
return *__i;
|
||||
}
|
||||
_LIBCPP_INLINE_VISIBILITY pointer operator->() const _NOEXCEPT
|
||||
_LIBCPP_INLINE_VISIBILITY pointer operator->() const _NOEXCEPT_DEBUG
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
_LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
|
||||
@ -1287,7 +1323,7 @@ public:
|
||||
#endif
|
||||
return (pointer)_VSTD::addressof(*__i);
|
||||
}
|
||||
_LIBCPP_INLINE_VISIBILITY __wrap_iter& operator++() _NOEXCEPT
|
||||
_LIBCPP_INLINE_VISIBILITY __wrap_iter& operator++() _NOEXCEPT_DEBUG
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
_LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
|
||||
@ -1296,9 +1332,9 @@ public:
|
||||
++__i;
|
||||
return *this;
|
||||
}
|
||||
_LIBCPP_INLINE_VISIBILITY __wrap_iter operator++(int) _NOEXCEPT
|
||||
_LIBCPP_INLINE_VISIBILITY __wrap_iter operator++(int) _NOEXCEPT_DEBUG
|
||||
{__wrap_iter __tmp(*this); ++(*this); return __tmp;}
|
||||
_LIBCPP_INLINE_VISIBILITY __wrap_iter& operator--() _NOEXCEPT
|
||||
_LIBCPP_INLINE_VISIBILITY __wrap_iter& operator--() _NOEXCEPT_DEBUG
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
_LIBCPP_ASSERT(__get_const_db()->__decrementable(this),
|
||||
@ -1307,11 +1343,11 @@ public:
|
||||
--__i;
|
||||
return *this;
|
||||
}
|
||||
_LIBCPP_INLINE_VISIBILITY __wrap_iter operator--(int) _NOEXCEPT
|
||||
_LIBCPP_INLINE_VISIBILITY __wrap_iter operator--(int) _NOEXCEPT_DEBUG
|
||||
{__wrap_iter __tmp(*this); --(*this); return __tmp;}
|
||||
_LIBCPP_INLINE_VISIBILITY __wrap_iter operator+ (difference_type __n) const _NOEXCEPT
|
||||
_LIBCPP_INLINE_VISIBILITY __wrap_iter operator+ (difference_type __n) const _NOEXCEPT_DEBUG
|
||||
{__wrap_iter __w(*this); __w += __n; return __w;}
|
||||
_LIBCPP_INLINE_VISIBILITY __wrap_iter& operator+=(difference_type __n) _NOEXCEPT
|
||||
_LIBCPP_INLINE_VISIBILITY __wrap_iter& operator+=(difference_type __n) _NOEXCEPT_DEBUG
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
_LIBCPP_ASSERT(__get_const_db()->__addable(this, __n),
|
||||
@ -1320,11 +1356,11 @@ public:
|
||||
__i += __n;
|
||||
return *this;
|
||||
}
|
||||
_LIBCPP_INLINE_VISIBILITY __wrap_iter operator- (difference_type __n) const _NOEXCEPT
|
||||
_LIBCPP_INLINE_VISIBILITY __wrap_iter operator- (difference_type __n) const _NOEXCEPT_DEBUG
|
||||
{return *this + (-__n);}
|
||||
_LIBCPP_INLINE_VISIBILITY __wrap_iter& operator-=(difference_type __n) _NOEXCEPT
|
||||
_LIBCPP_INLINE_VISIBILITY __wrap_iter& operator-=(difference_type __n) _NOEXCEPT_DEBUG
|
||||
{*this += -__n; return *this;}
|
||||
_LIBCPP_INLINE_VISIBILITY reference operator[](difference_type __n) const _NOEXCEPT
|
||||
_LIBCPP_INLINE_VISIBILITY reference operator[](difference_type __n) const _NOEXCEPT_DEBUG
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
_LIBCPP_ASSERT(__get_const_db()->__subscriptable(this, __n),
|
||||
@ -1333,7 +1369,7 @@ public:
|
||||
return __i[__n];
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY iterator_type base() const _NOEXCEPT {return __i;}
|
||||
_LIBCPP_INLINE_VISIBILITY iterator_type base() const _NOEXCEPT_DEBUG {return __i;}
|
||||
|
||||
private:
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
@ -1342,7 +1378,7 @@ private:
|
||||
__get_db()->__insert_ic(this, __p);
|
||||
}
|
||||
#else
|
||||
_LIBCPP_INLINE_VISIBILITY __wrap_iter(iterator_type __x) _NOEXCEPT : __i(__x) {}
|
||||
_LIBCPP_INLINE_VISIBILITY __wrap_iter(iterator_type __x) _NOEXCEPT_DEBUG : __i(__x) {}
|
||||
#endif
|
||||
|
||||
template <class _Up> friend class __wrap_iter;
|
||||
@ -1352,56 +1388,57 @@ private:
|
||||
template <class _Iter1, class _Iter2>
|
||||
friend
|
||||
bool
|
||||
operator==(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT;
|
||||
operator==(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
|
||||
|
||||
template <class _Iter1, class _Iter2>
|
||||
friend
|
||||
bool
|
||||
operator<(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT;
|
||||
operator<(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
|
||||
|
||||
template <class _Iter1, class _Iter2>
|
||||
friend
|
||||
bool
|
||||
operator!=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT;
|
||||
operator!=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
|
||||
|
||||
template <class _Iter1, class _Iter2>
|
||||
friend
|
||||
bool
|
||||
operator>(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT;
|
||||
operator>(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
|
||||
|
||||
template <class _Iter1, class _Iter2>
|
||||
friend
|
||||
bool
|
||||
operator>=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT;
|
||||
operator>=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
|
||||
|
||||
template <class _Iter1, class _Iter2>
|
||||
friend
|
||||
bool
|
||||
operator<=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT;
|
||||
operator<=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
|
||||
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
template <class _Iter1, class _Iter2>
|
||||
friend
|
||||
auto
|
||||
operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT
|
||||
operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT_DEBUG
|
||||
-> decltype(__x.base() - __y.base());
|
||||
#else
|
||||
template <class _Iter1, class _Iter2>
|
||||
friend
|
||||
typename __wrap_iter<_Iter1>::difference_type
|
||||
operator-(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT;
|
||||
operator-(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT_DEBUG;
|
||||
#endif
|
||||
|
||||
template <class _Iter1>
|
||||
friend
|
||||
__wrap_iter<_Iter1>
|
||||
operator+(typename __wrap_iter<_Iter1>::difference_type, __wrap_iter<_Iter1>) _NOEXCEPT;
|
||||
operator+(typename __wrap_iter<_Iter1>::difference_type, __wrap_iter<_Iter1>) _NOEXCEPT_DEBUG;
|
||||
|
||||
template <class _Ip, class _Op> friend _Op copy(_Ip, _Ip, _Op);
|
||||
template <class _B1, class _B2> friend _B2 copy_backward(_B1, _B1, _B2);
|
||||
template <class _Ip, class _Op> friend _Op move(_Ip, _Ip, _Op);
|
||||
template <class _B1, class _B2> friend _B2 move_backward(_B1, _B1, _B2);
|
||||
|
||||
#if _LIBCPP_DEBUG_LEVEL < 2
|
||||
template <class _Tp>
|
||||
friend
|
||||
typename enable_if
|
||||
@ -1410,12 +1447,22 @@ private:
|
||||
_Tp*
|
||||
>::type
|
||||
__unwrap_iter(__wrap_iter<_Tp*>);
|
||||
#else
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
typename enable_if
|
||||
<
|
||||
is_trivially_copy_assignable<_Tp>::value,
|
||||
__wrap_iter<_Tp*>
|
||||
>::type
|
||||
__unwrap_iter(__wrap_iter<_Tp*> __i);
|
||||
#endif
|
||||
};
|
||||
|
||||
template <class _Iter1, class _Iter2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator==(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT
|
||||
operator==(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT_DEBUG
|
||||
{
|
||||
return __x.base() == __y.base();
|
||||
}
|
||||
@ -1423,7 +1470,7 @@ operator==(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEX
|
||||
template <class _Iter1, class _Iter2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator<(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT
|
||||
operator<(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT_DEBUG
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
_LIBCPP_ASSERT(__get_const_db()->__less_than_comparable(&__x, &__y),
|
||||
@ -1435,7 +1482,7 @@ operator<(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXC
|
||||
template <class _Iter1, class _Iter2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator!=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT
|
||||
operator!=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT_DEBUG
|
||||
{
|
||||
return !(__x == __y);
|
||||
}
|
||||
@ -1443,7 +1490,7 @@ operator!=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEX
|
||||
template <class _Iter1, class _Iter2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator>(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT
|
||||
operator>(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT_DEBUG
|
||||
{
|
||||
return __y < __x;
|
||||
}
|
||||
@ -1451,7 +1498,7 @@ operator>(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXC
|
||||
template <class _Iter1, class _Iter2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator>=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT
|
||||
operator>=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT_DEBUG
|
||||
{
|
||||
return !(__x < __y);
|
||||
}
|
||||
@ -1459,7 +1506,7 @@ operator>=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEX
|
||||
template <class _Iter1, class _Iter2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator<=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT
|
||||
operator<=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT_DEBUG
|
||||
{
|
||||
return !(__y < __x);
|
||||
}
|
||||
@ -1467,7 +1514,7 @@ operator<=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEX
|
||||
template <class _Iter1>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator!=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT
|
||||
operator!=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT_DEBUG
|
||||
{
|
||||
return !(__x == __y);
|
||||
}
|
||||
@ -1475,7 +1522,7 @@ operator!=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEX
|
||||
template <class _Iter1>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator>(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT
|
||||
operator>(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT_DEBUG
|
||||
{
|
||||
return __y < __x;
|
||||
}
|
||||
@ -1483,7 +1530,7 @@ operator>(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXC
|
||||
template <class _Iter1>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator>=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT
|
||||
operator>=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT_DEBUG
|
||||
{
|
||||
return !(__x < __y);
|
||||
}
|
||||
@ -1491,7 +1538,7 @@ operator>=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEX
|
||||
template <class _Iter1>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator<=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT
|
||||
operator<=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT_DEBUG
|
||||
{
|
||||
return !(__y < __x);
|
||||
}
|
||||
@ -1500,7 +1547,7 @@ operator<=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEX
|
||||
template <class _Iter1, class _Iter2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
auto
|
||||
operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT
|
||||
operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT_DEBUG
|
||||
-> decltype(__x.base() - __y.base())
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
@ -1513,7 +1560,7 @@ operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXC
|
||||
template <class _Iter1, class _Iter2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
typename __wrap_iter<_Iter1>::difference_type
|
||||
operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT
|
||||
operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT_DEBUG
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
_LIBCPP_ASSERT(__get_const_db()->__less_than_comparable(&__x, &__y),
|
||||
@ -1527,7 +1574,7 @@ template <class _Iter>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
__wrap_iter<_Iter>
|
||||
operator+(typename __wrap_iter<_Iter>::difference_type __n,
|
||||
__wrap_iter<_Iter> __x) _NOEXCEPT
|
||||
__wrap_iter<_Iter> __x) _NOEXCEPT_DEBUG
|
||||
{
|
||||
__x += __n;
|
||||
return __x;
|
||||
@ -1535,19 +1582,19 @@ operator+(typename __wrap_iter<_Iter>::difference_type __n,
|
||||
|
||||
template <class _Iter>
|
||||
struct __libcpp_is_trivial_iterator
|
||||
: public _LIBCPP_BOOL_CONSTANT(is_pointer<_Iter>::value) {};
|
||||
|
||||
: public _LIBCPP_BOOL_CONSTANT(is_pointer<_Iter>::value) {};
|
||||
|
||||
template <class _Iter>
|
||||
struct __libcpp_is_trivial_iterator<move_iterator<_Iter> >
|
||||
: public _LIBCPP_BOOL_CONSTANT(__libcpp_is_trivial_iterator<_Iter>::value) {};
|
||||
: public _LIBCPP_BOOL_CONSTANT(__libcpp_is_trivial_iterator<_Iter>::value) {};
|
||||
|
||||
template <class _Iter>
|
||||
struct __libcpp_is_trivial_iterator<reverse_iterator<_Iter> >
|
||||
: public _LIBCPP_BOOL_CONSTANT(__libcpp_is_trivial_iterator<_Iter>::value) {};
|
||||
: public _LIBCPP_BOOL_CONSTANT(__libcpp_is_trivial_iterator<_Iter>::value) {};
|
||||
|
||||
template <class _Iter>
|
||||
struct __libcpp_is_trivial_iterator<__wrap_iter<_Iter> >
|
||||
: public _LIBCPP_BOOL_CONSTANT(__libcpp_is_trivial_iterator<_Iter>::value) {};
|
||||
: public _LIBCPP_BOOL_CONSTANT(__libcpp_is_trivial_iterator<_Iter>::value) {};
|
||||
|
||||
|
||||
template <class _Tp, size_t _Np>
|
||||
@ -1566,7 +1613,7 @@ end(_Tp (&__array)[_Np])
|
||||
return __array + _Np;
|
||||
}
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_TRAILING_RETURN)
|
||||
#if !defined(_LIBCPP_CXX03_LANG)
|
||||
|
||||
template <class _Cp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
@ -1689,7 +1736,7 @@ auto crend(const _Cp& __c) -> decltype(_VSTD::rend(__c))
|
||||
#endif
|
||||
|
||||
|
||||
#else // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_TRAILING_RETURN)
|
||||
#else // defined(_LIBCPP_CXX03_LANG)
|
||||
|
||||
template <class _Cp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
@ -1723,20 +1770,20 @@ end(const _Cp& __c)
|
||||
return __c.end();
|
||||
}
|
||||
|
||||
#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_TRAILING_RETURN)
|
||||
#endif // !defined(_LIBCPP_CXX03_LANG)
|
||||
|
||||
#if _LIBCPP_STD_VER > 14
|
||||
template <class _Cont>
|
||||
constexpr auto size(const _Cont& __c) -> decltype(__c.size()) { return __c.size(); }
|
||||
|
||||
template <class _Tp, size_t _Sz>
|
||||
constexpr size_t size(const _Tp (&__array)[_Sz]) noexcept { return _Sz; }
|
||||
constexpr size_t size(const _Tp (&)[_Sz]) noexcept { return _Sz; }
|
||||
|
||||
template <class _Cont>
|
||||
constexpr auto empty(const _Cont& __c) -> decltype(__c.empty()) { return __c.empty(); }
|
||||
|
||||
template <class _Tp, size_t _Sz>
|
||||
constexpr bool empty(const _Tp (&__array)[_Sz]) noexcept { return false; }
|
||||
constexpr bool empty(const _Tp (&)[_Sz]) noexcept { return false; }
|
||||
|
||||
template <class _Ep>
|
||||
constexpr bool empty(initializer_list<_Ep> __il) noexcept { return __il.size() == 0; }
|
||||
|
@ -182,7 +182,7 @@ protected:
|
||||
static _LIBCPP_CONSTEXPR const float_round_style round_style = round_toward_zero;
|
||||
};
|
||||
|
||||
template <class _Tp, int digits, bool is_signed>
|
||||
template <class _Tp, int digits, bool _IsSigned>
|
||||
struct __libcpp_compute_min
|
||||
{
|
||||
static _LIBCPP_CONSTEXPR const _Tp value = _Tp(_Tp(1) << digits);
|
||||
@ -306,7 +306,7 @@ protected:
|
||||
static _LIBCPP_CONSTEXPR const bool is_signed = true;
|
||||
static _LIBCPP_CONSTEXPR const int digits = __FLT_MANT_DIG__;
|
||||
static _LIBCPP_CONSTEXPR const int digits10 = __FLT_DIG__;
|
||||
static _LIBCPP_CONSTEXPR const int max_digits10 = 2+(digits * 30103)/100000;
|
||||
static _LIBCPP_CONSTEXPR const int max_digits10 = 2+(digits * 30103l)/100000l;
|
||||
_LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __FLT_MIN__;}
|
||||
_LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __FLT_MAX__;}
|
||||
_LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return -max();}
|
||||
@ -352,7 +352,7 @@ protected:
|
||||
static _LIBCPP_CONSTEXPR const bool is_signed = true;
|
||||
static _LIBCPP_CONSTEXPR const int digits = __DBL_MANT_DIG__;
|
||||
static _LIBCPP_CONSTEXPR const int digits10 = __DBL_DIG__;
|
||||
static _LIBCPP_CONSTEXPR const int max_digits10 = 2+(digits * 30103)/100000;
|
||||
static _LIBCPP_CONSTEXPR const int max_digits10 = 2+(digits * 30103l)/100000l;
|
||||
_LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __DBL_MIN__;}
|
||||
_LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __DBL_MAX__;}
|
||||
_LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return -max();}
|
||||
@ -398,7 +398,7 @@ protected:
|
||||
static _LIBCPP_CONSTEXPR const bool is_signed = true;
|
||||
static _LIBCPP_CONSTEXPR const int digits = __LDBL_MANT_DIG__;
|
||||
static _LIBCPP_CONSTEXPR const int digits10 = __LDBL_DIG__;
|
||||
static _LIBCPP_CONSTEXPR const int max_digits10 = 2+(digits * 30103)/100000;
|
||||
static _LIBCPP_CONSTEXPR const int max_digits10 = 2+(digits * 30103l)/100000l;
|
||||
_LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __LDBL_MIN__;}
|
||||
_LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __LDBL_MAX__;}
|
||||
_LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return -max();}
|
||||
|
65
include/limits.h
Normal file
65
include/limits.h
Normal file
@ -0,0 +1,65 @@
|
||||
// -*- C++ -*-
|
||||
//===--------------------------- limits.h ---------------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is dual licensed under the MIT and the University of Illinois Open
|
||||
// Source Licenses. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef _LIBCPP_LIMITS_H
|
||||
#define _LIBCPP_LIMITS_H
|
||||
|
||||
/*
|
||||
limits.h synopsis
|
||||
|
||||
Macros:
|
||||
|
||||
CHAR_BIT
|
||||
SCHAR_MIN
|
||||
SCHAR_MAX
|
||||
UCHAR_MAX
|
||||
CHAR_MIN
|
||||
CHAR_MAX
|
||||
MB_LEN_MAX
|
||||
SHRT_MIN
|
||||
SHRT_MAX
|
||||
USHRT_MAX
|
||||
INT_MIN
|
||||
INT_MAX
|
||||
UINT_MAX
|
||||
LONG_MIN
|
||||
LONG_MAX
|
||||
ULONG_MAX
|
||||
LLONG_MIN // C99
|
||||
LLONG_MAX // C99
|
||||
ULLONG_MAX // C99
|
||||
|
||||
*/
|
||||
|
||||
#include <__config>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#ifndef __GNUC__
|
||||
#include_next <limits.h>
|
||||
#else
|
||||
// GCC header limits.h recursively includes itself through another header called
|
||||
// syslimits.h for some reason. This setup breaks down if we directly
|
||||
// #include_next GCC's limits.h (reasons not entirely clear to me). Therefore,
|
||||
// we manually re-create the necessary include sequence below:
|
||||
|
||||
// Get the system limits.h defines (force recurse into the next level)
|
||||
#define _GCC_LIMITS_H_
|
||||
#define _GCC_NEXT_LIMITS_H
|
||||
#include_next <limits.h>
|
||||
|
||||
// Get the ISO C defines
|
||||
#undef _GCC_LIMITS_H_
|
||||
#include_next <limits.h>
|
||||
#endif // __GNUC__
|
||||
|
||||
#endif // _LIBCPP_LIMITS_H
|
134
include/list
134
include/list
@ -93,10 +93,10 @@ public:
|
||||
size_type max_size() const noexcept;
|
||||
|
||||
template <class... Args>
|
||||
void emplace_front(Args&&... args);
|
||||
reference emplace_front(Args&&... args);
|
||||
void pop_front();
|
||||
template <class... Args>
|
||||
void emplace_back(Args&&... args);
|
||||
reference emplace_back(Args&&... args);
|
||||
void pop_back();
|
||||
void push_front(const value_type& x);
|
||||
void push_front(value_type&& x);
|
||||
@ -570,6 +570,10 @@ protected:
|
||||
const __node_allocator& __node_alloc() const _NOEXCEPT
|
||||
{return __size_alloc_.second();}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
size_type __node_alloc_max_size() const _NOEXCEPT {
|
||||
return __node_alloc_traits::max_size(__node_alloc());
|
||||
}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
static void __unlink_nodes(__link_pointer __f, __link_pointer __l) _NOEXCEPT;
|
||||
|
||||
@ -622,9 +626,9 @@ protected:
|
||||
|
||||
void swap(__list_imp& __c)
|
||||
#if _LIBCPP_STD_VER >= 14
|
||||
_NOEXCEPT;
|
||||
_NOEXCEPT_DEBUG;
|
||||
#else
|
||||
_NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
|
||||
_NOEXCEPT_DEBUG_(!__alloc_traits::propagate_on_container_swap::value ||
|
||||
__is_nothrow_swappable<allocator_type>::value);
|
||||
#endif
|
||||
|
||||
@ -651,7 +655,7 @@ private:
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
void __copy_assign_alloc(const __list_imp& __c, false_type)
|
||||
void __copy_assign_alloc(const __list_imp&, false_type)
|
||||
{}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
@ -662,9 +666,16 @@ private:
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
void __move_assign_alloc(__list_imp& __c, false_type)
|
||||
void __move_assign_alloc(__list_imp&, false_type)
|
||||
_NOEXCEPT
|
||||
{}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
void __invalidate_all_iterators() {
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__invalidate_all(this);
|
||||
#endif
|
||||
}
|
||||
};
|
||||
|
||||
// Unlink nodes [__f, __l]
|
||||
@ -720,21 +731,7 @@ __list_imp<_Tp, _Alloc>::clear() _NOEXCEPT
|
||||
__node_alloc_traits::destroy(__na, _VSTD::addressof(__np->__value_));
|
||||
__node_alloc_traits::deallocate(__na, __np, 1);
|
||||
}
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__c_node* __c = __get_db()->__find_c_and_lock(this);
|
||||
for (__i_node** __p = __c->end_; __p != __c->beg_; )
|
||||
{
|
||||
--__p;
|
||||
const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
|
||||
if (__i->__ptr_ != __l)
|
||||
{
|
||||
(*__p)->__c_ = nullptr;
|
||||
if (--__c->end_ != __p)
|
||||
memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
|
||||
}
|
||||
}
|
||||
__get_db()->unlock();
|
||||
#endif
|
||||
__invalidate_all_iterators();
|
||||
}
|
||||
}
|
||||
|
||||
@ -742,9 +739,9 @@ template <class _Tp, class _Alloc>
|
||||
void
|
||||
__list_imp<_Tp, _Alloc>::swap(__list_imp& __c)
|
||||
#if _LIBCPP_STD_VER >= 14
|
||||
_NOEXCEPT
|
||||
_NOEXCEPT_DEBUG
|
||||
#else
|
||||
_NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
|
||||
_NOEXCEPT_DEBUG_(!__alloc_traits::propagate_on_container_swap::value ||
|
||||
__is_nothrow_swappable<allocator_type>::value)
|
||||
#endif
|
||||
{
|
||||
@ -904,7 +901,11 @@ public:
|
||||
bool empty() const _NOEXCEPT {return base::empty();}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
size_type max_size() const _NOEXCEPT
|
||||
{return numeric_limits<difference_type>::max();}
|
||||
{
|
||||
return std::min<size_type>(
|
||||
base::__node_alloc_max_size(),
|
||||
numeric_limits<difference_type >::max());
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
iterator begin() _NOEXCEPT {return base::begin();}
|
||||
@ -968,9 +969,9 @@ public:
|
||||
void push_back(value_type&& __x);
|
||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
||||
template <class... _Args>
|
||||
void emplace_front(_Args&&... __args);
|
||||
reference emplace_front(_Args&&... __args);
|
||||
template <class... _Args>
|
||||
void emplace_back(_Args&&... __args);
|
||||
reference emplace_back(_Args&&... __args);
|
||||
template <class... _Args>
|
||||
iterator emplace(const_iterator __p, _Args&&... __args);
|
||||
#endif // _LIBCPP_HAS_NO_VARIADICS
|
||||
@ -994,9 +995,9 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
void swap(list& __c)
|
||||
#if _LIBCPP_STD_VER >= 14
|
||||
_NOEXCEPT
|
||||
_NOEXCEPT_DEBUG
|
||||
#else
|
||||
_NOEXCEPT_(!__node_alloc_traits::propagate_on_container_swap::value ||
|
||||
_NOEXCEPT_DEBUG_(!__node_alloc_traits::propagate_on_container_swap::value ||
|
||||
__is_nothrow_swappable<__node_allocator>::value)
|
||||
#endif
|
||||
{base::swap(__c);}
|
||||
@ -1353,6 +1354,9 @@ list<_Tp, _Alloc>::assign(_InpIter __f, _InpIter __l,
|
||||
insert(__e, __f, __l);
|
||||
else
|
||||
erase(__i, __e);
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__invalidate_all(this);
|
||||
#endif
|
||||
}
|
||||
|
||||
template <class _Tp, class _Alloc>
|
||||
@ -1367,6 +1371,9 @@ list<_Tp, _Alloc>::assign(size_type __n, const value_type& __x)
|
||||
insert(__e, __n, __x);
|
||||
else
|
||||
erase(__i, __e);
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__invalidate_all(this);
|
||||
#endif
|
||||
}
|
||||
|
||||
template <class _Tp, class _Alloc>
|
||||
@ -1593,7 +1600,7 @@ list<_Tp, _Alloc>::push_back(value_type&& __x)
|
||||
|
||||
template <class _Tp, class _Alloc>
|
||||
template <class... _Args>
|
||||
void
|
||||
typename list<_Tp, _Alloc>::reference
|
||||
list<_Tp, _Alloc>::emplace_front(_Args&&... __args)
|
||||
{
|
||||
__node_allocator& __na = base::__node_alloc();
|
||||
@ -1602,12 +1609,12 @@ list<_Tp, _Alloc>::emplace_front(_Args&&... __args)
|
||||
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::forward<_Args>(__args)...);
|
||||
__link_nodes_at_front(__hold.get()->__as_link(), __hold.get()->__as_link());
|
||||
++base::__sz();
|
||||
__hold.release();
|
||||
return __hold.release()->__value_;
|
||||
}
|
||||
|
||||
template <class _Tp, class _Alloc>
|
||||
template <class... _Args>
|
||||
void
|
||||
typename list<_Tp, _Alloc>::reference
|
||||
list<_Tp, _Alloc>::emplace_back(_Args&&... __args)
|
||||
{
|
||||
__node_allocator& __na = base::__node_alloc();
|
||||
@ -1617,7 +1624,7 @@ list<_Tp, _Alloc>::emplace_back(_Args&&... __args)
|
||||
__link_pointer __nl = __hold->__as_link();
|
||||
__link_nodes_at_back(__nl, __nl);
|
||||
++base::__sz();
|
||||
__hold.release();
|
||||
return __hold.release()->__value_;
|
||||
}
|
||||
|
||||
template <class _Tp, class _Alloc>
|
||||
@ -1751,15 +1758,15 @@ list<_Tp, _Alloc>::erase(const_iterator __p)
|
||||
--base::__sz();
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__c_node* __c = __get_db()->__find_c_and_lock(this);
|
||||
for (__i_node** __p = __c->end_; __p != __c->beg_; )
|
||||
for (__i_node** __ip = __c->end_; __ip != __c->beg_; )
|
||||
{
|
||||
--__p;
|
||||
iterator* __i = static_cast<iterator*>((*__p)->__i_);
|
||||
--__ip;
|
||||
iterator* __i = static_cast<iterator*>((*__ip)->__i_);
|
||||
if (__i->__ptr_ == __n)
|
||||
{
|
||||
(*__p)->__c_ = nullptr;
|
||||
if (--__c->end_ != __p)
|
||||
memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
|
||||
(*__ip)->__c_ = nullptr;
|
||||
if (--__c->end_ != __ip)
|
||||
memmove(__ip, __ip+1, (__c->end_ - __ip)*sizeof(__i_node*));
|
||||
}
|
||||
}
|
||||
__get_db()->unlock();
|
||||
@ -1782,6 +1789,9 @@ list<_Tp, _Alloc>::erase(const_iterator __f, const_iterator __l)
|
||||
_LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__f) == this,
|
||||
"list::erase(iterator, iterator) called with an iterator not"
|
||||
" referring to this list");
|
||||
_LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__l) == this,
|
||||
"list::erase(iterator, iterator) called with an iterator not"
|
||||
" referring to this list");
|
||||
#endif
|
||||
if (__f != __l)
|
||||
{
|
||||
@ -1961,16 +1971,16 @@ list<_Tp, _Alloc>::splice(const_iterator __p, list& __c)
|
||||
__libcpp_db* __db = __get_db();
|
||||
__c_node* __cn1 = __db->__find_c_and_lock(this);
|
||||
__c_node* __cn2 = __db->__find_c(&__c);
|
||||
for (__i_node** __p = __cn2->end_; __p != __cn2->beg_;)
|
||||
for (__i_node** __ip = __cn2->end_; __ip != __cn2->beg_;)
|
||||
{
|
||||
--__p;
|
||||
iterator* __i = static_cast<iterator*>((*__p)->__i_);
|
||||
--__ip;
|
||||
iterator* __i = static_cast<iterator*>((*__ip)->__i_);
|
||||
if (__i->__ptr_ != __c.__end_as_link())
|
||||
{
|
||||
__cn1->__add(*__p);
|
||||
(*__p)->__c_ = __cn1;
|
||||
if (--__cn2->end_ != __p)
|
||||
memmove(__p, __p+1, (__cn2->end_ - __p)*sizeof(__i_node*));
|
||||
__cn1->__add(*__ip);
|
||||
(*__ip)->__c_ = __cn1;
|
||||
if (--__cn2->end_ != __ip)
|
||||
memmove(__ip, __ip+1, (__cn2->end_ - __ip)*sizeof(__i_node*));
|
||||
}
|
||||
}
|
||||
__db->unlock();
|
||||
@ -2004,16 +2014,16 @@ list<_Tp, _Alloc>::splice(const_iterator __p, list& __c, const_iterator __i)
|
||||
__libcpp_db* __db = __get_db();
|
||||
__c_node* __cn1 = __db->__find_c_and_lock(this);
|
||||
__c_node* __cn2 = __db->__find_c(&__c);
|
||||
for (__i_node** __p = __cn2->end_; __p != __cn2->beg_;)
|
||||
for (__i_node** __ip = __cn2->end_; __ip != __cn2->beg_;)
|
||||
{
|
||||
--__p;
|
||||
iterator* __j = static_cast<iterator*>((*__p)->__i_);
|
||||
--__ip;
|
||||
iterator* __j = static_cast<iterator*>((*__ip)->__i_);
|
||||
if (__j->__ptr_ == __f)
|
||||
{
|
||||
__cn1->__add(*__p);
|
||||
(*__p)->__c_ = __cn1;
|
||||
if (--__cn2->end_ != __p)
|
||||
memmove(__p, __p+1, (__cn2->end_ - __p)*sizeof(__i_node*));
|
||||
__cn1->__add(*__ip);
|
||||
(*__ip)->__c_ = __cn1;
|
||||
if (--__cn2->end_ != __ip)
|
||||
memmove(__ip, __ip+1, (__cn2->end_ - __ip)*sizeof(__i_node*));
|
||||
}
|
||||
}
|
||||
__db->unlock();
|
||||
@ -2058,19 +2068,19 @@ list<_Tp, _Alloc>::splice(const_iterator __p, list& __c, const_iterator __f, con
|
||||
__libcpp_db* __db = __get_db();
|
||||
__c_node* __cn1 = __db->__find_c_and_lock(this);
|
||||
__c_node* __cn2 = __db->__find_c(&__c);
|
||||
for (__i_node** __p = __cn2->end_; __p != __cn2->beg_;)
|
||||
for (__i_node** __ip = __cn2->end_; __ip != __cn2->beg_;)
|
||||
{
|
||||
--__p;
|
||||
iterator* __j = static_cast<iterator*>((*__p)->__i_);
|
||||
--__ip;
|
||||
iterator* __j = static_cast<iterator*>((*__ip)->__i_);
|
||||
for (__link_pointer __k = __f.__ptr_;
|
||||
__k != __l.__ptr_; __k = __k->__next_)
|
||||
{
|
||||
if (__j->__ptr_ == __k)
|
||||
{
|
||||
__cn1->__add(*__p);
|
||||
(*__p)->__c_ = __cn1;
|
||||
if (--__cn2->end_ != __p)
|
||||
memmove(__p, __p+1, (__cn2->end_ - __p)*sizeof(__i_node*));
|
||||
__cn1->__add(*__ip);
|
||||
(*__ip)->__c_ = __cn1;
|
||||
if (--__cn2->end_ != __ip)
|
||||
memmove(__ip, __ip+1, (__cn2->end_ - __ip)*sizeof(__i_node*));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2083,7 +2093,7 @@ template <class _Tp, class _Alloc>
|
||||
void
|
||||
list<_Tp, _Alloc>::remove(const value_type& __x)
|
||||
{
|
||||
list<_Tp, _Alloc> __deleted_nodes; // collect the nodes we're removing
|
||||
list<_Tp, _Alloc> __deleted_nodes(get_allocator()); // collect the nodes we're removing
|
||||
for (const_iterator __i = begin(), __e = end(); __i != __e;)
|
||||
{
|
||||
if (*__i == __x)
|
||||
@ -2328,14 +2338,14 @@ list<_Tp, _Alloc>::__decrementable(const const_iterator* __i) const
|
||||
|
||||
template <class _Tp, class _Alloc>
|
||||
bool
|
||||
list<_Tp, _Alloc>::__addable(const const_iterator* __i, ptrdiff_t __n) const
|
||||
list<_Tp, _Alloc>::__addable(const const_iterator*, ptrdiff_t) const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
template <class _Tp, class _Alloc>
|
||||
bool
|
||||
list<_Tp, _Alloc>::__subscriptable(const const_iterator* __i, ptrdiff_t __n) const
|
||||
list<_Tp, _Alloc>::__subscriptable(const const_iterator*, ptrdiff_t) const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -523,8 +523,8 @@ __num_get<_CharT>::__stage2_float_loop(_CharT __ct, bool& __in_units, char& __ex
|
||||
return 0;
|
||||
}
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE2(struct _LIBCPP_TYPE_VIS __num_get<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(struct _LIBCPP_TYPE_VIS __num_get<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(struct _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __num_get<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(struct _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __num_get<wchar_t>)
|
||||
|
||||
template <class _CharT, class _InputIterator = istreambuf_iterator<_CharT> >
|
||||
class _LIBCPP_TYPE_VIS_ONLY num_get
|
||||
@ -779,6 +779,7 @@ long double __do_strtod<long double>(const char* __a, char** __p2) {
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
_LIBCPP_HIDDEN
|
||||
_Tp
|
||||
__num_get_float(const char* __a, const char* __a_end, ios_base::iostate& __err)
|
||||
{
|
||||
@ -1042,8 +1043,8 @@ num_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e,
|
||||
return __b;
|
||||
}
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS num_get<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS num_get<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS num_get<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS num_get<wchar_t>)
|
||||
|
||||
struct _LIBCPP_TYPE_VIS __num_put_base
|
||||
{
|
||||
@ -1192,8 +1193,8 @@ __num_put<_CharT>::__widen_and_group_float(char* __nb, char* __np, char* __ne,
|
||||
__op = __ob + (__np - __nb);
|
||||
}
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE2(struct _LIBCPP_TYPE_VIS __num_put<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(struct _LIBCPP_TYPE_VIS __num_put<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(struct _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __num_put<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(struct _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __num_put<wchar_t>)
|
||||
|
||||
template <class _CharT, class _OutputIterator = ostreambuf_iterator<_CharT> >
|
||||
class _LIBCPP_TYPE_VIS_ONLY num_put
|
||||
@ -1621,8 +1622,8 @@ num_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob,
|
||||
return __pad_and_output(__s, __o, __op, __oe, __iob, __fl);
|
||||
}
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS num_put<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS num_put<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS num_put<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS num_put<wchar_t>)
|
||||
|
||||
template <class _CharT, class _InputIterator>
|
||||
_LIBCPP_HIDDEN
|
||||
@ -2291,8 +2292,8 @@ time_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e,
|
||||
return __b;
|
||||
}
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS time_get<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS time_get<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_get<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_get<wchar_t>)
|
||||
|
||||
class _LIBCPP_TYPE_VIS __time_get
|
||||
{
|
||||
@ -2374,8 +2375,8 @@ private:
|
||||
virtual const string_type& __X() const {return this->__X_;}
|
||||
};
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS time_get_byname<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS time_get_byname<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_get_byname<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_get_byname<wchar_t>)
|
||||
|
||||
class _LIBCPP_TYPE_VIS __time_put
|
||||
{
|
||||
@ -2487,8 +2488,8 @@ time_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base&,
|
||||
return _VSTD::copy(__nb, __ne, __s);
|
||||
}
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS time_put<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS time_put<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_put<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_put<wchar_t>)
|
||||
|
||||
template <class _CharT, class _OutputIterator = ostreambuf_iterator<_CharT> >
|
||||
class _LIBCPP_TYPE_VIS_ONLY time_put_byname
|
||||
@ -2508,8 +2509,8 @@ protected:
|
||||
~time_put_byname() {}
|
||||
};
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS time_put_byname<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS time_put_byname<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_put_byname<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_put_byname<wchar_t>)
|
||||
|
||||
// money_base
|
||||
|
||||
@ -2575,10 +2576,10 @@ template <class _CharT, bool _International>
|
||||
const bool
|
||||
moneypunct<_CharT, _International>::intl;
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS moneypunct<char, false>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS moneypunct<char, true>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS moneypunct<wchar_t, false>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS moneypunct<wchar_t, true>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct<char, false>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct<char, true>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct<wchar_t, false>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct<wchar_t, true>)
|
||||
|
||||
// moneypunct_byname
|
||||
|
||||
@ -2632,10 +2633,10 @@ template<> void moneypunct_byname<char, true>::init(const char*);
|
||||
template<> void moneypunct_byname<wchar_t, false>::init(const char*);
|
||||
template<> void moneypunct_byname<wchar_t, true>::init(const char*);
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS moneypunct_byname<char, false>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS moneypunct_byname<char, true>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS moneypunct_byname<wchar_t, false>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS moneypunct_byname<wchar_t, true>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct_byname<char, false>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct_byname<char, true>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct_byname<wchar_t, false>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct_byname<wchar_t, true>)
|
||||
|
||||
// money_get
|
||||
|
||||
@ -2691,8 +2692,8 @@ __money_get<_CharT>::__gather_info(bool __intl, const locale& __loc,
|
||||
}
|
||||
}
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS __money_get<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS __money_get<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __money_get<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __money_get<wchar_t>)
|
||||
|
||||
template <class _CharT, class _InputIterator = istreambuf_iterator<_CharT> >
|
||||
class _LIBCPP_TYPE_VIS_ONLY money_get
|
||||
@ -3074,8 +3075,8 @@ money_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e,
|
||||
return __b;
|
||||
}
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS money_get<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS money_get<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS money_get<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS money_get<wchar_t>)
|
||||
|
||||
// money_put
|
||||
|
||||
@ -3249,8 +3250,8 @@ __money_put<_CharT>::__format(char_type* __mb, char_type*& __mi, char_type*& __m
|
||||
__mi = __mb;
|
||||
}
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS __money_put<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS __money_put<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __money_put<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __money_put<wchar_t>)
|
||||
|
||||
template <class _CharT, class _OutputIterator = ostreambuf_iterator<_CharT> >
|
||||
class _LIBCPP_TYPE_VIS_ONLY money_put
|
||||
@ -3402,8 +3403,8 @@ money_put<_CharT, _OutputIterator>::do_put(iter_type __s, bool __intl,
|
||||
return __pad_and_output(__s, __mb, __mi, __me, __iob, __fl);
|
||||
}
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS money_put<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS money_put<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS money_put<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS money_put<wchar_t>)
|
||||
|
||||
// messages
|
||||
|
||||
@ -3512,8 +3513,8 @@ messages<_CharT>::do_close(catalog __c) const
|
||||
#endif // _LIBCPP_HAS_CATOPEN
|
||||
}
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS messages<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS messages<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS messages<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS messages<wchar_t>)
|
||||
|
||||
template <class _CharT>
|
||||
class _LIBCPP_TYPE_VIS_ONLY messages_byname
|
||||
@ -3536,8 +3537,8 @@ protected:
|
||||
~messages_byname() {}
|
||||
};
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS messages_byname<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS messages_byname<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS messages_byname<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS messages_byname<wchar_t>)
|
||||
|
||||
template<class _Codecvt, class _Elem = wchar_t,
|
||||
class _Wide_alloc = allocator<_Elem>,
|
||||
@ -3701,10 +3702,10 @@ wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>::
|
||||
if (__r == codecvt_base::ok)
|
||||
return __ws;
|
||||
}
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
|
||||
if (__wide_err_string_.empty())
|
||||
throw range_error("wstring_convert: from_bytes error");
|
||||
#endif // _LIBCPP_NO_EXCEPTIONS
|
||||
__throw_range_error("wstring_convert: from_bytes error");
|
||||
|
||||
return __wide_err_string_;
|
||||
}
|
||||
|
||||
@ -3790,10 +3791,10 @@ wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>::
|
||||
return __bs;
|
||||
}
|
||||
}
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
|
||||
if (__byte_err_string_.empty())
|
||||
throw range_error("wstring_convert: to_bytes error");
|
||||
#endif // _LIBCPP_NO_EXCEPTIONS
|
||||
__throw_range_error("wstring_convert: to_bytes error");
|
||||
|
||||
return __byte_err_string_;
|
||||
}
|
||||
|
||||
@ -3932,7 +3933,8 @@ wbuffer_convert<_Codecvt, _Elem, _Tr>::underflow()
|
||||
streamsize __nmemb = _VSTD::min(static_cast<streamsize>(this->egptr() - this->eback() - __unget_sz),
|
||||
static_cast<streamsize>(__extbufend_ - __extbufnext_));
|
||||
codecvt_base::result __r;
|
||||
state_type __svs = __st_;
|
||||
// FIXME: Do we ever need to restore the state here?
|
||||
//state_type __svs = __st_;
|
||||
streamsize __nr = __bufptr_->sgetn(const_cast<char*>(__extbufnext_), __nmemb);
|
||||
if (__nr != 0)
|
||||
{
|
||||
|
45
include/locale.h
Normal file
45
include/locale.h
Normal file
@ -0,0 +1,45 @@
|
||||
// -*- C++ -*-
|
||||
//===---------------------------- locale.h --------------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is dual licensed under the MIT and the University of Illinois Open
|
||||
// Source Licenses. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef _LIBCPP_LOCALE_H
|
||||
#define _LIBCPP_LOCALE_H
|
||||
|
||||
/*
|
||||
locale.h synopsis
|
||||
|
||||
Macros:
|
||||
|
||||
LC_ALL
|
||||
LC_COLLATE
|
||||
LC_CTYPE
|
||||
LC_MONETARY
|
||||
LC_NUMERIC
|
||||
LC_TIME
|
||||
|
||||
Types:
|
||||
|
||||
lconv
|
||||
|
||||
Functions:
|
||||
|
||||
setlocale
|
||||
localeconv
|
||||
|
||||
*/
|
||||
|
||||
#include <__config>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#include_next <locale.h>
|
||||
|
||||
#endif // _LIBCPP_LOCALE_H
|
@ -308,10 +308,6 @@ extern "C++" {
|
||||
|
||||
#include <type_traits>
|
||||
|
||||
#ifdef _LIBCPP_MSVCRT
|
||||
#include "support/win32/math_win32.h"
|
||||
#endif
|
||||
|
||||
// signbit
|
||||
|
||||
#ifdef signbit
|
||||
@ -636,11 +632,9 @@ isunordered(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
|
||||
|
||||
#endif // isunordered
|
||||
|
||||
#ifndef __sun__
|
||||
|
||||
// abs
|
||||
|
||||
#if !defined(_AIX)
|
||||
#if !(defined(_AIX) || defined(__sun__))
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
float
|
||||
abs(float __lcpp_x) _NOEXCEPT {return fabsf(__lcpp_x);}
|
||||
@ -652,11 +646,11 @@ abs(double __lcpp_x) _NOEXCEPT {return fabs(__lcpp_x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
long double
|
||||
abs(long double __lcpp_x) _NOEXCEPT {return fabsl(__lcpp_x);}
|
||||
#endif // !defined(_AIX)
|
||||
#endif // !(defined(_AIX) || defined(__sun__))
|
||||
|
||||
// acos
|
||||
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX) || defined(__sun__))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float acos(float __lcpp_x) _NOEXCEPT {return acosf(__lcpp_x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double acos(long double __lcpp_x) _NOEXCEPT {return acosl(__lcpp_x);}
|
||||
#endif
|
||||
@ -668,7 +662,7 @@ acos(_A1 __lcpp_x) _NOEXCEPT {return acos((double)__lcpp_x);}
|
||||
|
||||
// asin
|
||||
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX) || defined(__sun__))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float asin(float __lcpp_x) _NOEXCEPT {return asinf(__lcpp_x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double asin(long double __lcpp_x) _NOEXCEPT {return asinl(__lcpp_x);}
|
||||
#endif
|
||||
@ -680,7 +674,7 @@ asin(_A1 __lcpp_x) _NOEXCEPT {return asin((double)__lcpp_x);}
|
||||
|
||||
// atan
|
||||
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX) || defined(__sun__))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float atan(float __lcpp_x) _NOEXCEPT {return atanf(__lcpp_x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double atan(long double __lcpp_x) _NOEXCEPT {return atanl(__lcpp_x);}
|
||||
#endif
|
||||
@ -692,7 +686,7 @@ atan(_A1 __lcpp_x) _NOEXCEPT {return atan((double)__lcpp_x);}
|
||||
|
||||
// atan2
|
||||
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX) || defined(__sun__))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float atan2(float __lcpp_y, float __lcpp_x) _NOEXCEPT {return atan2f(__lcpp_y, __lcpp_x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double atan2(long double __lcpp_y, long double __lcpp_x) _NOEXCEPT {return atan2l(__lcpp_y, __lcpp_x);}
|
||||
#endif
|
||||
@ -715,7 +709,7 @@ atan2(_A1 __lcpp_y, _A2 __lcpp_x) _NOEXCEPT
|
||||
|
||||
// ceil
|
||||
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX) || defined(__sun__))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float ceil(float __lcpp_x) _NOEXCEPT {return ceilf(__lcpp_x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double ceil(long double __lcpp_x) _NOEXCEPT {return ceill(__lcpp_x);}
|
||||
#endif
|
||||
@ -727,7 +721,7 @@ ceil(_A1 __lcpp_x) _NOEXCEPT {return ceil((double)__lcpp_x);}
|
||||
|
||||
// cos
|
||||
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX) || defined(__sun__))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float cos(float __lcpp_x) _NOEXCEPT {return cosf(__lcpp_x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double cos(long double __lcpp_x) _NOEXCEPT {return cosl(__lcpp_x);}
|
||||
#endif
|
||||
@ -739,7 +733,7 @@ cos(_A1 __lcpp_x) _NOEXCEPT {return cos((double)__lcpp_x);}
|
||||
|
||||
// cosh
|
||||
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX) || defined(__sun__))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float cosh(float __lcpp_x) _NOEXCEPT {return coshf(__lcpp_x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double cosh(long double __lcpp_x) _NOEXCEPT {return coshl(__lcpp_x);}
|
||||
#endif
|
||||
@ -751,7 +745,7 @@ cosh(_A1 __lcpp_x) _NOEXCEPT {return cosh((double)__lcpp_x);}
|
||||
|
||||
// exp
|
||||
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX) || defined(__sun__))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float exp(float __lcpp_x) _NOEXCEPT {return expf(__lcpp_x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double exp(long double __lcpp_x) _NOEXCEPT {return expl(__lcpp_x);}
|
||||
#endif
|
||||
@ -763,7 +757,7 @@ exp(_A1 __lcpp_x) _NOEXCEPT {return exp((double)__lcpp_x);}
|
||||
|
||||
// fabs
|
||||
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX) || defined(__sun__))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float fabs(float __lcpp_x) _NOEXCEPT {return fabsf(__lcpp_x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double fabs(long double __lcpp_x) _NOEXCEPT {return fabsl(__lcpp_x);}
|
||||
#endif
|
||||
@ -775,7 +769,7 @@ fabs(_A1 __lcpp_x) _NOEXCEPT {return fabs((double)__lcpp_x);}
|
||||
|
||||
// floor
|
||||
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX) || defined(__sun__))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float floor(float __lcpp_x) _NOEXCEPT {return floorf(__lcpp_x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double floor(long double __lcpp_x) _NOEXCEPT {return floorl(__lcpp_x);}
|
||||
#endif
|
||||
@ -787,7 +781,7 @@ floor(_A1 __lcpp_x) _NOEXCEPT {return floor((double)__lcpp_x);}
|
||||
|
||||
// fmod
|
||||
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX) || defined(__sun__))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float fmod(float __lcpp_x, float __lcpp_y) _NOEXCEPT {return fmodf(__lcpp_x, __lcpp_y);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double fmod(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT {return fmodl(__lcpp_x, __lcpp_y);}
|
||||
#endif
|
||||
@ -810,7 +804,7 @@ fmod(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
|
||||
|
||||
// frexp
|
||||
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX) || defined(__sun__))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float frexp(float __lcpp_x, int* __lcpp_e) _NOEXCEPT {return frexpf(__lcpp_x, __lcpp_e);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double frexp(long double __lcpp_x, int* __lcpp_e) _NOEXCEPT {return frexpl(__lcpp_x, __lcpp_e);}
|
||||
#endif
|
||||
@ -822,7 +816,7 @@ frexp(_A1 __lcpp_x, int* __lcpp_e) _NOEXCEPT {return frexp((double)__lcpp_x, __l
|
||||
|
||||
// ldexp
|
||||
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX) || defined(__sun__))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float ldexp(float __lcpp_x, int __lcpp_e) _NOEXCEPT {return ldexpf(__lcpp_x, __lcpp_e);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double ldexp(long double __lcpp_x, int __lcpp_e) _NOEXCEPT {return ldexpl(__lcpp_x, __lcpp_e);}
|
||||
#endif
|
||||
@ -834,7 +828,7 @@ ldexp(_A1 __lcpp_x, int __lcpp_e) _NOEXCEPT {return ldexp((double)__lcpp_x, __lc
|
||||
|
||||
// log
|
||||
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX) || defined(__sun__))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float log(float __lcpp_x) _NOEXCEPT {return logf(__lcpp_x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double log(long double __lcpp_x) _NOEXCEPT {return logl(__lcpp_x);}
|
||||
#endif
|
||||
@ -846,7 +840,7 @@ log(_A1 __lcpp_x) _NOEXCEPT {return log((double)__lcpp_x);}
|
||||
|
||||
// log10
|
||||
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX) || defined(__sun__))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float log10(float __lcpp_x) _NOEXCEPT {return log10f(__lcpp_x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double log10(long double __lcpp_x) _NOEXCEPT {return log10l(__lcpp_x);}
|
||||
#endif
|
||||
@ -858,14 +852,14 @@ log10(_A1 __lcpp_x) _NOEXCEPT {return log10((double)__lcpp_x);}
|
||||
|
||||
// modf
|
||||
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX) || defined(__sun__))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float modf(float __lcpp_x, float* __lcpp_y) _NOEXCEPT {return modff(__lcpp_x, __lcpp_y);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double modf(long double __lcpp_x, long double* __lcpp_y) _NOEXCEPT {return modfl(__lcpp_x, __lcpp_y);}
|
||||
#endif
|
||||
|
||||
// pow
|
||||
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX) || defined(__sun__))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float pow(float __lcpp_x, float __lcpp_y) _NOEXCEPT {return powf(__lcpp_x, __lcpp_y);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double pow(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT {return powl(__lcpp_x, __lcpp_y);}
|
||||
#endif
|
||||
@ -888,7 +882,7 @@ pow(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT
|
||||
|
||||
// sin
|
||||
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX) || defined(__sun__))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float sin(float __lcpp_x) _NOEXCEPT {return sinf(__lcpp_x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double sin(long double __lcpp_x) _NOEXCEPT {return sinl(__lcpp_x);}
|
||||
#endif
|
||||
@ -900,7 +894,7 @@ sin(_A1 __lcpp_x) _NOEXCEPT {return sin((double)__lcpp_x);}
|
||||
|
||||
// sinh
|
||||
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX) || defined(__sun__))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float sinh(float __lcpp_x) _NOEXCEPT {return sinhf(__lcpp_x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double sinh(long double __lcpp_x) _NOEXCEPT {return sinhl(__lcpp_x);}
|
||||
#endif
|
||||
@ -912,21 +906,19 @@ sinh(_A1 __lcpp_x) _NOEXCEPT {return sinh((double)__lcpp_x);}
|
||||
|
||||
// sqrt
|
||||
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX) || defined(__sun__))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float sqrt(float __lcpp_x) _NOEXCEPT {return sqrtf(__lcpp_x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double sqrt(long double __lcpp_x) _NOEXCEPT {return sqrtl(__lcpp_x);}
|
||||
#endif
|
||||
|
||||
#endif // __sun__
|
||||
template <class _A1>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
typename std::enable_if<std::is_integral<_A1>::value, double>::type
|
||||
sqrt(_A1 __lcpp_x) _NOEXCEPT {return sqrt((double)__lcpp_x);}
|
||||
#ifndef __sun__
|
||||
|
||||
// tan
|
||||
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX) || defined(__sun__))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float tan(float __lcpp_x) _NOEXCEPT {return tanf(__lcpp_x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double tan(long double __lcpp_x) _NOEXCEPT {return tanl(__lcpp_x);}
|
||||
#endif
|
||||
@ -938,7 +930,7 @@ tan(_A1 __lcpp_x) _NOEXCEPT {return tan((double)__lcpp_x);}
|
||||
|
||||
// tanh
|
||||
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX) || defined(__sun__))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float tanh(float __lcpp_x) _NOEXCEPT {return tanhf(__lcpp_x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double tanh(long double __lcpp_x) _NOEXCEPT {return tanhl(__lcpp_x);}
|
||||
#endif
|
||||
@ -1410,7 +1402,6 @@ typename std::enable_if<std::is_integral<_A1>::value, double>::type
|
||||
trunc(_A1 __lcpp_x) _NOEXCEPT {return trunc((double)__lcpp_x);}
|
||||
|
||||
#endif // !_LIBCPP_MSVCRT
|
||||
#endif // __sun__
|
||||
|
||||
} // extern "C++"
|
||||
|
||||
|
466
include/memory
466
include/memory
@ -164,6 +164,7 @@ template <class T> pair<T*,ptrdiff_t> get_temporary_buffer(ptrdiff_t n) noexcept
|
||||
template <class T> void return_temporary_buffer(T* p) noexcept;
|
||||
|
||||
template <class T> T* addressof(T& r) noexcept;
|
||||
template <class T> T* addressof(const T&& r) noexcept = delete;
|
||||
|
||||
template <class InputIterator, class ForwardIterator>
|
||||
ForwardIterator
|
||||
@ -180,6 +181,33 @@ template <class ForwardIterator, class Size, class T>
|
||||
ForwardIterator
|
||||
uninitialized_fill_n(ForwardIterator first, Size n, const T& x);
|
||||
|
||||
template <class T>
|
||||
void destroy_at(T* location);
|
||||
|
||||
template <class ForwardIterator>
|
||||
void destroy(ForwardIterator first, ForwardIterator last);
|
||||
|
||||
template <class ForwardIterator, class Size>
|
||||
ForwardIterator destroy_n(ForwardIterator first, Size n);
|
||||
|
||||
template <class InputIterator, class ForwardIterator>
|
||||
ForwardIterator uninitialized_move(InputIterator first, InputIterator last, ForwardIterator result);
|
||||
|
||||
template <class InputIterator, class Size, class ForwardIterator>
|
||||
pair<InputIterator,ForwardIterator> uninitialized_move_n(InputIterator first, Size n, ForwardIterator result);
|
||||
|
||||
template <class ForwardIterator>
|
||||
void uninitialized_value_construct(ForwardIterator first, ForwardIterator last);
|
||||
|
||||
template <class ForwardIterator, class Size>
|
||||
ForwardIterator uninitialized_value_construct_n(ForwardIterator first, Size n);
|
||||
|
||||
template <class ForwardIterator>
|
||||
void uninitialized_default_construct(ForwardIterator first, ForwardIterator last);
|
||||
|
||||
template <class ForwardIterator, class Size>
|
||||
ForwardIterator uninitialized_default_construct_n(ForwardIterator first, Size n);
|
||||
|
||||
template <class Y> struct auto_ptr_ref {};
|
||||
|
||||
template<class X>
|
||||
@ -610,9 +638,6 @@ void* align(size_t alignment, size_t size, void*& ptr, size_t& space);
|
||||
#include <tuple>
|
||||
#include <stdexcept>
|
||||
#include <cstring>
|
||||
#if defined(_LIBCPP_NO_EXCEPTIONS)
|
||||
#include <cassert>
|
||||
#endif
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER)
|
||||
# include <atomic>
|
||||
@ -639,7 +664,19 @@ _ValueType __libcpp_relaxed_load(_ValueType const* __value) {
|
||||
#endif
|
||||
}
|
||||
|
||||
// addressof moved to <__functional_base>
|
||||
template <class _ValueType>
|
||||
inline _LIBCPP_ALWAYS_INLINE
|
||||
_ValueType __libcpp_acquire_load(_ValueType const* __value) {
|
||||
#if !defined(_LIBCPP_HAS_NO_THREADS) && \
|
||||
defined(__ATOMIC_ACQUIRE) && \
|
||||
(__has_builtin(__atomic_load_n) || _GNUC_VER >= 407)
|
||||
return __atomic_load_n(__value, __ATOMIC_ACQUIRE);
|
||||
#else
|
||||
return *__value;
|
||||
#endif
|
||||
}
|
||||
|
||||
// addressof moved to <type_traits>
|
||||
|
||||
template <class _Tp> class allocator;
|
||||
|
||||
@ -792,7 +829,7 @@ public:
|
||||
template <class _Tp, class _Up, bool = __has_rebind<_Tp, _Up>::value>
|
||||
struct __pointer_traits_rebind
|
||||
{
|
||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
typedef typename _Tp::template rebind<_Up> type;
|
||||
#else
|
||||
typedef typename _Tp::template rebind<_Up>::other type;
|
||||
@ -804,7 +841,7 @@ struct __pointer_traits_rebind
|
||||
template <template <class, class...> class _Sp, class _Tp, class ..._Args, class _Up>
|
||||
struct __pointer_traits_rebind<_Sp<_Tp, _Args...>, _Up, true>
|
||||
{
|
||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
typedef typename _Sp<_Tp, _Args...>::template rebind<_Up> type;
|
||||
#else
|
||||
typedef typename _Sp<_Tp, _Args...>::template rebind<_Up>::other type;
|
||||
@ -822,7 +859,7 @@ struct __pointer_traits_rebind<_Sp<_Tp, _Args...>, _Up, false>
|
||||
template <template <class> class _Sp, class _Tp, class _Up>
|
||||
struct __pointer_traits_rebind<_Sp<_Tp>, _Up, true>
|
||||
{
|
||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
typedef typename _Sp<_Tp>::template rebind<_Up> type;
|
||||
#else
|
||||
typedef typename _Sp<_Tp>::template rebind<_Up>::other type;
|
||||
@ -838,7 +875,7 @@ struct __pointer_traits_rebind<_Sp<_Tp>, _Up, false>
|
||||
template <template <class, class> class _Sp, class _Tp, class _A0, class _Up>
|
||||
struct __pointer_traits_rebind<_Sp<_Tp, _A0>, _Up, true>
|
||||
{
|
||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
typedef typename _Sp<_Tp, _A0>::template rebind<_Up> type;
|
||||
#else
|
||||
typedef typename _Sp<_Tp, _A0>::template rebind<_Up>::other type;
|
||||
@ -855,7 +892,7 @@ template <template <class, class, class> class _Sp, class _Tp, class _A0,
|
||||
class _A1, class _Up>
|
||||
struct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1>, _Up, true>
|
||||
{
|
||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
typedef typename _Sp<_Tp, _A0, _A1>::template rebind<_Up> type;
|
||||
#else
|
||||
typedef typename _Sp<_Tp, _A0, _A1>::template rebind<_Up>::other type;
|
||||
@ -873,7 +910,7 @@ template <template <class, class, class, class> class _Sp, class _Tp, class _A0,
|
||||
class _A1, class _A2, class _Up>
|
||||
struct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1, _A2>, _Up, true>
|
||||
{
|
||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
typedef typename _Sp<_Tp, _A0, _A1, _A2>::template rebind<_Up> type;
|
||||
#else
|
||||
typedef typename _Sp<_Tp, _A0, _A1, _A2>::template rebind<_Up>::other type;
|
||||
@ -896,12 +933,12 @@ struct _LIBCPP_TYPE_VIS_ONLY pointer_traits
|
||||
typedef typename __pointer_traits_element_type<pointer>::type element_type;
|
||||
typedef typename __pointer_traits_difference_type<pointer>::type difference_type;
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
template <class _Up> using rebind = typename __pointer_traits_rebind<pointer, _Up>::type;
|
||||
#else
|
||||
template <class _Up> struct rebind
|
||||
{typedef typename __pointer_traits_rebind<pointer, _Up>::type other;};
|
||||
#endif // _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#endif // _LIBCPP_CXX03_LANG
|
||||
|
||||
private:
|
||||
struct __nat {};
|
||||
@ -919,7 +956,7 @@ struct _LIBCPP_TYPE_VIS_ONLY pointer_traits<_Tp*>
|
||||
typedef _Tp element_type;
|
||||
typedef ptrdiff_t difference_type;
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
template <class _Up> using rebind = _Up*;
|
||||
#else
|
||||
template <class _Up> struct rebind {typedef _Up* other;};
|
||||
@ -936,7 +973,7 @@ public:
|
||||
|
||||
template <class _From, class _To>
|
||||
struct __rebind_pointer {
|
||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
typedef typename pointer_traits<_From>::template rebind<_To> type;
|
||||
#else
|
||||
typedef typename pointer_traits<_From>::template rebind<_To>::other type;
|
||||
@ -1000,7 +1037,7 @@ struct __const_pointer
|
||||
template <class _Tp, class _Ptr, class _Alloc>
|
||||
struct __const_pointer<_Tp, _Ptr, _Alloc, false>
|
||||
{
|
||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
typedef typename pointer_traits<_Ptr>::template rebind<const _Tp> type;
|
||||
#else
|
||||
typedef typename pointer_traits<_Ptr>::template rebind<const _Tp>::other type;
|
||||
@ -1027,7 +1064,7 @@ struct __void_pointer
|
||||
template <class _Ptr, class _Alloc>
|
||||
struct __void_pointer<_Ptr, _Alloc, false>
|
||||
{
|
||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
typedef typename pointer_traits<_Ptr>::template rebind<void> type;
|
||||
#else
|
||||
typedef typename pointer_traits<_Ptr>::template rebind<void>::other type;
|
||||
@ -1054,7 +1091,7 @@ struct __const_void_pointer
|
||||
template <class _Ptr, class _Alloc>
|
||||
struct __const_void_pointer<_Ptr, _Alloc, false>
|
||||
{
|
||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
typedef typename pointer_traits<_Ptr>::template rebind<const void> type;
|
||||
#else
|
||||
typedef typename pointer_traits<_Ptr>::template rebind<const void>::other type;
|
||||
@ -1285,7 +1322,7 @@ struct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1, _A2>, _Up, false>
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_VARIADICS
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_ADVANCED_SFINAE
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
|
||||
template <class _Alloc, class _SizeType, class _ConstVoidPtr>
|
||||
auto
|
||||
@ -1308,7 +1345,7 @@ struct __has_allocate_hint
|
||||
{
|
||||
};
|
||||
|
||||
#else // _LIBCPP_HAS_NO_ADVANCED_SFINAE
|
||||
#else // _LIBCPP_CXX03_LANG
|
||||
|
||||
template <class _Alloc, class _SizeType, class _ConstVoidPtr>
|
||||
struct __has_allocate_hint
|
||||
@ -1316,9 +1353,9 @@ struct __has_allocate_hint
|
||||
{
|
||||
};
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_ADVANCED_SFINAE
|
||||
#endif // _LIBCPP_CXX03_LANG
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_ADVANCED_SFINAE) && !defined(_LIBCPP_HAS_NO_VARIADICS)
|
||||
#if !defined(_LIBCPP_CXX03_LANG)
|
||||
|
||||
template <class _Alloc, class _Tp, class ..._Args>
|
||||
decltype(_VSTD::declval<_Alloc>().construct(_VSTD::declval<_Tp*>(),
|
||||
@ -1399,7 +1436,7 @@ struct __has_select_on_container_copy_construction
|
||||
{
|
||||
};
|
||||
|
||||
#else // _LIBCPP_HAS_NO_ADVANCED_SFINAE
|
||||
#else // _LIBCPP_CXX03_LANG
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
||||
|
||||
@ -1437,7 +1474,7 @@ struct __has_select_on_container_copy_construction
|
||||
{
|
||||
};
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_ADVANCED_SFINAE
|
||||
#endif // _LIBCPP_CXX03_LANG
|
||||
|
||||
template <class _Alloc, class _Ptr, bool = __has_difference_type<_Alloc>::value>
|
||||
struct __alloc_traits_difference_type
|
||||
@ -1474,16 +1511,16 @@ struct _LIBCPP_TYPE_VIS_ONLY allocator_traits
|
||||
typedef typename __is_always_equal<allocator_type>::type
|
||||
is_always_equal;
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
template <class _Tp> using rebind_alloc =
|
||||
typename __allocator_traits_rebind<allocator_type, _Tp>::type;
|
||||
template <class _Tp> using rebind_traits = allocator_traits<rebind_alloc<_Tp>>;
|
||||
#else // _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#else // _LIBCPP_CXX03_LANG
|
||||
template <class _Tp> struct rebind_alloc
|
||||
{typedef typename __allocator_traits_rebind<allocator_type, _Tp>::type other;};
|
||||
template <class _Tp> struct rebind_traits
|
||||
{typedef allocator_traits<typename rebind_alloc<_Tp>::other> other;};
|
||||
#endif // _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#endif // _LIBCPP_CXX03_LANG
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
static pointer allocate(allocator_type& __a, size_type __n)
|
||||
@ -1568,7 +1605,7 @@ struct _LIBCPP_TYPE_VIS_ONLY allocator_traits
|
||||
is_trivially_move_constructible<_Tp>::value,
|
||||
void
|
||||
>::type
|
||||
__construct_forward(allocator_type& __a, _Tp* __begin1, _Tp* __end1, _Tp*& __begin2)
|
||||
__construct_forward(allocator_type&, _Tp* __begin1, _Tp* __end1, _Tp*& __begin2)
|
||||
{
|
||||
ptrdiff_t _Np = __end1 - __begin1;
|
||||
if (_Np > 0)
|
||||
@ -1598,7 +1635,7 @@ struct _LIBCPP_TYPE_VIS_ONLY allocator_traits
|
||||
is_trivially_move_constructible<_Tp>::value,
|
||||
void
|
||||
>::type
|
||||
__construct_range_forward(allocator_type& __a, _Tp* __begin1, _Tp* __end1, _Tp*& __begin2)
|
||||
__construct_range_forward(allocator_type&, _Tp* __begin1, _Tp* __end1, _Tp*& __begin2)
|
||||
{
|
||||
typedef typename remove_const<_Tp>::type _Vp;
|
||||
ptrdiff_t _Np = __end1 - __begin1;
|
||||
@ -1632,7 +1669,7 @@ struct _LIBCPP_TYPE_VIS_ONLY allocator_traits
|
||||
is_trivially_move_constructible<_Tp>::value,
|
||||
void
|
||||
>::type
|
||||
__construct_backward(allocator_type& __a, _Tp* __begin1, _Tp* __end1, _Tp*& __end2)
|
||||
__construct_backward(allocator_type&, _Tp* __begin1, _Tp* __end1, _Tp*& __end2)
|
||||
{
|
||||
ptrdiff_t _Np = __end1 - __begin1;
|
||||
__end2 -= _Np;
|
||||
@ -1695,7 +1732,7 @@ private:
|
||||
template <class _Traits, class _Tp>
|
||||
struct __rebind_alloc_helper
|
||||
{
|
||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
typedef typename _Traits::template rebind_alloc<_Tp> type;
|
||||
#else
|
||||
typedef typename _Traits::template rebind_alloc<_Tp>::other type;
|
||||
@ -1730,8 +1767,8 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY pointer allocate(size_type __n, allocator<void>::const_pointer = 0)
|
||||
{
|
||||
if (__n > max_size())
|
||||
__libcpp_throw(length_error("allocator<T>::allocate(size_t n)"
|
||||
" 'n' exceeds maximum supported size"));
|
||||
__throw_length_error("allocator<T>::allocate(size_t n)"
|
||||
" 'n' exceeds maximum supported size");
|
||||
return static_cast<pointer>(_VSTD::__allocate(__n * sizeof(_Tp)));
|
||||
}
|
||||
_LIBCPP_INLINE_VISIBILITY void deallocate(pointer __p, size_type) _NOEXCEPT
|
||||
@ -1826,8 +1863,8 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY pointer allocate(size_type __n, allocator<void>::const_pointer = 0)
|
||||
{
|
||||
if (__n > max_size())
|
||||
__libcpp_throw(length_error("allocator<const T>::allocate(size_t n)"
|
||||
" 'n' exceeds maximum supported size"));
|
||||
__throw_length_error("allocator<const T>::allocate(size_t n)"
|
||||
" 'n' exceeds maximum supported size");
|
||||
return static_cast<pointer>(_VSTD::__allocate(__n * sizeof(_Tp)));
|
||||
}
|
||||
_LIBCPP_INLINE_VISIBILITY void deallocate(pointer __p, size_type) _NOEXCEPT
|
||||
@ -2068,49 +2105,11 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(_T1_param __t1, _T2_param __t2)
|
||||
: __first_(_VSTD::forward<_T1_param>(__t1)), __second_(_VSTD::forward<_T2_param>(__t2)) {}
|
||||
|
||||
#if defined(_LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS) && !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES)
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__libcpp_compressed_pair_imp(const __libcpp_compressed_pair_imp& __p)
|
||||
_NOEXCEPT_(is_nothrow_copy_constructible<_T1>::value &&
|
||||
is_nothrow_copy_constructible<_T2>::value)
|
||||
: __first_(__p.first()),
|
||||
__second_(__p.second()) {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__libcpp_compressed_pair_imp& operator=(const __libcpp_compressed_pair_imp& __p)
|
||||
_NOEXCEPT_(is_nothrow_copy_assignable<_T1>::value &&
|
||||
is_nothrow_copy_assignable<_T2>::value)
|
||||
{
|
||||
__first_ = __p.first();
|
||||
__second_ = __p.second();
|
||||
return *this;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__libcpp_compressed_pair_imp(__libcpp_compressed_pair_imp&& __p)
|
||||
_NOEXCEPT_(is_nothrow_move_constructible<_T1>::value &&
|
||||
is_nothrow_move_constructible<_T2>::value)
|
||||
: __first_(_VSTD::forward<_T1>(__p.first())),
|
||||
__second_(_VSTD::forward<_T2>(__p.second())) {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__libcpp_compressed_pair_imp& operator=(__libcpp_compressed_pair_imp&& __p)
|
||||
_NOEXCEPT_(is_nothrow_move_assignable<_T1>::value &&
|
||||
is_nothrow_move_assignable<_T2>::value)
|
||||
{
|
||||
__first_ = _VSTD::forward<_T1>(__p.first());
|
||||
__second_ = _VSTD::forward<_T2>(__p.second());
|
||||
return *this;
|
||||
}
|
||||
|
||||
#endif // defined(_LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS) && !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES)
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
||||
|
||||
template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__libcpp_compressed_pair_imp(piecewise_construct_t __pc,
|
||||
__libcpp_compressed_pair_imp(piecewise_construct_t,
|
||||
tuple<_Args1...> __first_args,
|
||||
tuple<_Args2...> __second_args,
|
||||
__tuple_indices<_I1...>,
|
||||
@ -2161,47 +2160,11 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(_T1_param __t1, _T2_param __t2)
|
||||
: _T1(_VSTD::forward<_T1_param>(__t1)), __second_(_VSTD::forward<_T2_param>(__t2)) {}
|
||||
|
||||
#if defined(_LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS) && !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES)
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__libcpp_compressed_pair_imp(const __libcpp_compressed_pair_imp& __p)
|
||||
_NOEXCEPT_(is_nothrow_copy_constructible<_T1>::value &&
|
||||
is_nothrow_copy_constructible<_T2>::value)
|
||||
: _T1(__p.first()), __second_(__p.second()) {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__libcpp_compressed_pair_imp& operator=(const __libcpp_compressed_pair_imp& __p)
|
||||
_NOEXCEPT_(is_nothrow_copy_assignable<_T1>::value &&
|
||||
is_nothrow_copy_assignable<_T2>::value)
|
||||
{
|
||||
_T1::operator=(__p.first());
|
||||
__second_ = __p.second();
|
||||
return *this;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__libcpp_compressed_pair_imp(__libcpp_compressed_pair_imp&& __p)
|
||||
_NOEXCEPT_(is_nothrow_move_constructible<_T1>::value &&
|
||||
is_nothrow_move_constructible<_T2>::value)
|
||||
: _T1(_VSTD::move(__p.first())), __second_(_VSTD::forward<_T2>(__p.second())) {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__libcpp_compressed_pair_imp& operator=(__libcpp_compressed_pair_imp&& __p)
|
||||
_NOEXCEPT_(is_nothrow_move_assignable<_T1>::value &&
|
||||
is_nothrow_move_assignable<_T2>::value)
|
||||
{
|
||||
_T1::operator=(_VSTD::move(__p.first()));
|
||||
__second_ = _VSTD::forward<_T2>(__p.second());
|
||||
return *this;
|
||||
}
|
||||
|
||||
#endif // defined(_LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS) && !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES)
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
||||
|
||||
template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__libcpp_compressed_pair_imp(piecewise_construct_t __pc,
|
||||
__libcpp_compressed_pair_imp(piecewise_construct_t,
|
||||
tuple<_Args1...> __first_args,
|
||||
tuple<_Args2...> __second_args,
|
||||
__tuple_indices<_I1...>,
|
||||
@ -2253,47 +2216,11 @@ public:
|
||||
is_nothrow_move_constructible<_T2>::value)
|
||||
: _T2(_VSTD::forward<_T2_param>(__t2)), __first_(_VSTD::forward<_T1_param>(__t1)) {}
|
||||
|
||||
#if defined(_LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS) && !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES)
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__libcpp_compressed_pair_imp(const __libcpp_compressed_pair_imp& __p)
|
||||
_NOEXCEPT_(is_nothrow_copy_constructible<_T1>::value &&
|
||||
is_nothrow_copy_constructible<_T2>::value)
|
||||
: _T2(__p.second()), __first_(__p.first()) {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__libcpp_compressed_pair_imp& operator=(const __libcpp_compressed_pair_imp& __p)
|
||||
_NOEXCEPT_(is_nothrow_copy_assignable<_T1>::value &&
|
||||
is_nothrow_copy_assignable<_T2>::value)
|
||||
{
|
||||
_T2::operator=(__p.second());
|
||||
__first_ = __p.first();
|
||||
return *this;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__libcpp_compressed_pair_imp(__libcpp_compressed_pair_imp&& __p)
|
||||
_NOEXCEPT_(is_nothrow_move_constructible<_T1>::value &&
|
||||
is_nothrow_move_constructible<_T2>::value)
|
||||
: _T2(_VSTD::forward<_T2>(__p.second())), __first_(_VSTD::move(__p.first())) {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__libcpp_compressed_pair_imp& operator=(__libcpp_compressed_pair_imp&& __p)
|
||||
_NOEXCEPT_(is_nothrow_move_assignable<_T1>::value &&
|
||||
is_nothrow_move_assignable<_T2>::value)
|
||||
{
|
||||
_T2::operator=(_VSTD::forward<_T2>(__p.second()));
|
||||
__first_ = _VSTD::move(__p.first());
|
||||
return *this;
|
||||
}
|
||||
|
||||
#endif // defined(_LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS) && !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES)
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
||||
|
||||
template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__libcpp_compressed_pair_imp(piecewise_construct_t __pc,
|
||||
__libcpp_compressed_pair_imp(piecewise_construct_t,
|
||||
tuple<_Args1...> __first_args,
|
||||
tuple<_Args2...> __second_args,
|
||||
__tuple_indices<_I1...>,
|
||||
@ -2343,47 +2270,11 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(_T1_param __t1, _T2_param __t2)
|
||||
: _T1(_VSTD::forward<_T1_param>(__t1)), _T2(_VSTD::forward<_T2_param>(__t2)) {}
|
||||
|
||||
#if defined(_LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS) && !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES)
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__libcpp_compressed_pair_imp(const __libcpp_compressed_pair_imp& __p)
|
||||
_NOEXCEPT_(is_nothrow_copy_constructible<_T1>::value &&
|
||||
is_nothrow_copy_constructible<_T2>::value)
|
||||
: _T1(__p.first()), _T2(__p.second()) {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__libcpp_compressed_pair_imp& operator=(const __libcpp_compressed_pair_imp& __p)
|
||||
_NOEXCEPT_(is_nothrow_copy_assignable<_T1>::value &&
|
||||
is_nothrow_copy_assignable<_T2>::value)
|
||||
{
|
||||
_T1::operator=(__p.first());
|
||||
_T2::operator=(__p.second());
|
||||
return *this;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__libcpp_compressed_pair_imp(__libcpp_compressed_pair_imp&& __p)
|
||||
_NOEXCEPT_(is_nothrow_move_constructible<_T1>::value &&
|
||||
is_nothrow_move_constructible<_T2>::value)
|
||||
: _T1(_VSTD::move(__p.first())), _T2(_VSTD::move(__p.second())) {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__libcpp_compressed_pair_imp& operator=(__libcpp_compressed_pair_imp&& __p)
|
||||
_NOEXCEPT_(is_nothrow_move_assignable<_T1>::value &&
|
||||
is_nothrow_move_assignable<_T2>::value)
|
||||
{
|
||||
_T1::operator=(_VSTD::move(__p.first()));
|
||||
_T2::operator=(_VSTD::move(__p.second()));
|
||||
return *this;
|
||||
}
|
||||
|
||||
#endif // defined(_LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS) && !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES)
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
||||
|
||||
template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__libcpp_compressed_pair_imp(piecewise_construct_t __pc,
|
||||
__libcpp_compressed_pair_imp(piecewise_construct_t,
|
||||
tuple<_Args1...> __first_args,
|
||||
tuple<_Args2...> __second_args,
|
||||
__tuple_indices<_I1...>,
|
||||
@ -2430,40 +2321,6 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY __compressed_pair(_T1_param __t1, _T2_param __t2)
|
||||
: base(_VSTD::forward<_T1_param>(__t1), _VSTD::forward<_T2_param>(__t2)) {}
|
||||
|
||||
#if defined(_LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS) && !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES)
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__compressed_pair(const __compressed_pair& __p)
|
||||
_NOEXCEPT_(is_nothrow_copy_constructible<_T1>::value &&
|
||||
is_nothrow_copy_constructible<_T2>::value)
|
||||
: base(__p) {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__compressed_pair& operator=(const __compressed_pair& __p)
|
||||
_NOEXCEPT_(is_nothrow_copy_assignable<_T1>::value &&
|
||||
is_nothrow_copy_assignable<_T2>::value)
|
||||
{
|
||||
base::operator=(__p);
|
||||
return *this;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__compressed_pair(__compressed_pair&& __p)
|
||||
_NOEXCEPT_(is_nothrow_move_constructible<_T1>::value &&
|
||||
is_nothrow_move_constructible<_T2>::value)
|
||||
: base(_VSTD::move(__p)) {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__compressed_pair& operator=(__compressed_pair&& __p)
|
||||
_NOEXCEPT_(is_nothrow_move_assignable<_T1>::value &&
|
||||
is_nothrow_move_assignable<_T2>::value)
|
||||
{
|
||||
base::operator=(_VSTD::move(__p));
|
||||
return *this;
|
||||
}
|
||||
|
||||
#endif // defined(_LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS) && !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES)
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
||||
|
||||
template <class... _Args1, class... _Args2>
|
||||
@ -2526,7 +2383,7 @@ struct __same_or_less_cv_qualified<_Ptr1, _Ptr2, false>
|
||||
template <class _Tp>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY default_delete
|
||||
{
|
||||
#ifndef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR default_delete() _NOEXCEPT = default;
|
||||
#else
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR default_delete() _NOEXCEPT {}
|
||||
@ -2546,7 +2403,7 @@ template <class _Tp>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY default_delete<_Tp[]>
|
||||
{
|
||||
public:
|
||||
#ifndef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR default_delete() _NOEXCEPT = default;
|
||||
#else
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR default_delete() _NOEXCEPT {}
|
||||
@ -3488,6 +3345,17 @@ struct __scalar_hash<_Tp, 4>
|
||||
}
|
||||
};
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
inline size_t __hash_combine(size_t __lhs, size_t __rhs) _NOEXCEPT {
|
||||
struct _PairT {
|
||||
size_t first;
|
||||
size_t second;
|
||||
};
|
||||
typedef __scalar_hash<_PairT> _HashT;
|
||||
const _PairT __p = {__lhs, __rhs};
|
||||
return _HashT()(__p);
|
||||
}
|
||||
|
||||
template<class _Tp>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY hash<_Tp*>
|
||||
: public unary_function<_Tp*, size_t>
|
||||
@ -3671,6 +3539,148 @@ uninitialized_fill_n(_ForwardIterator __f, _Size __n, const _Tp& __x)
|
||||
return __f;
|
||||
}
|
||||
|
||||
#if _LIBCPP_STD_VER > 14
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void destroy_at(_Tp* __loc) {
|
||||
_LIBCPP_ASSERT(__loc, "null pointer given to destroy_at");
|
||||
__loc->~_Tp();
|
||||
}
|
||||
|
||||
template <class _ForwardIterator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void destroy(_ForwardIterator __first, _ForwardIterator __last) {
|
||||
for (; __first != __last; ++__first)
|
||||
_VSTD::destroy_at(_VSTD::addressof(*__first));
|
||||
}
|
||||
|
||||
template <class _ForwardIterator, class _Size>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_ForwardIterator destroy_n(_ForwardIterator __first, _Size __n) {
|
||||
for (; __n > 0; (void)++__first, --__n)
|
||||
_VSTD::destroy_at(_VSTD::addressof(*__first));
|
||||
return __first;
|
||||
}
|
||||
|
||||
template <class _ForwardIterator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void uninitialized_default_construct(_ForwardIterator __first, _ForwardIterator __last) {
|
||||
using _Vt = typename iterator_traits<_ForwardIterator>::value_type;
|
||||
auto __idx = __first;
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
try {
|
||||
#endif
|
||||
for (; __idx != __last; ++__idx)
|
||||
::new((void*)_VSTD::addressof(*__idx)) _Vt;
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
} catch (...) {
|
||||
_VSTD::destroy(__first, __idx);
|
||||
throw;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
template <class _ForwardIterator, class _Size>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_ForwardIterator uninitialized_default_construct_n(_ForwardIterator __first, _Size __n) {
|
||||
using _Vt = typename iterator_traits<_ForwardIterator>::value_type;
|
||||
auto __idx = __first;
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
try {
|
||||
#endif
|
||||
for (; __n > 0; (void)++__idx, --__n)
|
||||
::new((void*)_VSTD::addressof(*__idx)) _Vt;
|
||||
return __idx;
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
} catch (...) {
|
||||
_VSTD::destroy(__first, __idx);
|
||||
throw;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
template <class _ForwardIterator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void uninitialized_value_construct(_ForwardIterator __first, _ForwardIterator __last) {
|
||||
using _Vt = typename iterator_traits<_ForwardIterator>::value_type;
|
||||
auto __idx = __first;
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
try {
|
||||
#endif
|
||||
for (; __idx != __last; ++__idx)
|
||||
::new((void*)_VSTD::addressof(*__idx)) _Vt();
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
} catch (...) {
|
||||
_VSTD::destroy(__first, __idx);
|
||||
throw;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
template <class _ForwardIterator, class _Size>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_ForwardIterator uninitialized_value_construct_n(_ForwardIterator __first, _Size __n) {
|
||||
using _Vt = typename iterator_traits<_ForwardIterator>::value_type;
|
||||
auto __idx = __first;
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
try {
|
||||
#endif
|
||||
for (; __n > 0; (void)++__idx, --__n)
|
||||
::new((void*)_VSTD::addressof(*__idx)) _Vt();
|
||||
return __idx;
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
} catch (...) {
|
||||
_VSTD::destroy(__first, __idx);
|
||||
throw;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
template <class _InputIt, class _ForwardIt>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_ForwardIt uninitialized_move(_InputIt __first, _InputIt __last, _ForwardIt __first_res) {
|
||||
using _Vt = typename iterator_traits<_ForwardIt>::value_type;
|
||||
auto __idx = __first_res;
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
try {
|
||||
#endif
|
||||
for (; __first != __last; (void)++__idx, ++__first)
|
||||
::new((void*)_VSTD::addressof(*__idx)) _Vt(std::move(*__first));
|
||||
return __idx;
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
} catch (...) {
|
||||
_VSTD::destroy(__first_res, __idx);
|
||||
throw;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
template <class _InputIt, class _Size, class _ForwardIt>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
pair<_InputIt, _ForwardIt>
|
||||
uninitialized_move_n(_InputIt __first, _Size __n, _ForwardIt __first_res) {
|
||||
using _Vt = typename iterator_traits<_ForwardIt>::value_type;
|
||||
auto __idx = __first_res;
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
try {
|
||||
#endif
|
||||
for (; __n > 0; ++__idx, (void)++__first, --__n)
|
||||
::new((void*)_VSTD::addressof(*__idx)) _Vt(std::move(*__first));
|
||||
return {__first, __idx};
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
} catch (...) {
|
||||
_VSTD::destroy(__first_res, __idx);
|
||||
throw;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
#endif // _LIBCPP_STD_VER > 14
|
||||
|
||||
class _LIBCPP_EXCEPTION_ABI bad_weak_ptr
|
||||
: public std::exception
|
||||
{
|
||||
@ -3679,6 +3689,16 @@ public:
|
||||
virtual const char* what() const _NOEXCEPT;
|
||||
};
|
||||
|
||||
_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
|
||||
void __throw_bad_weak_ptr()
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw bad_weak_ptr();
|
||||
#else
|
||||
_VSTD::abort();
|
||||
#endif
|
||||
}
|
||||
|
||||
template<class _Tp> class _LIBCPP_TYPE_VIS_ONLY weak_ptr;
|
||||
|
||||
class _LIBCPP_TYPE_VIS __shared_count
|
||||
@ -5335,11 +5355,7 @@ shared_ptr<_Tp>::shared_ptr(const weak_ptr<_Yp>& __r,
|
||||
__cntrl_(__r.__cntrl_ ? __r.__cntrl_->lock() : __r.__cntrl_)
|
||||
{
|
||||
if (__cntrl_ == 0)
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw bad_weak_ptr();
|
||||
#else
|
||||
assert(!"bad_weak_ptr");
|
||||
#endif
|
||||
__throw_bad_weak_ptr();
|
||||
}
|
||||
|
||||
template<class _Tp>
|
||||
|
@ -1,13 +1,224 @@
|
||||
// define the module for __config outside of the top level 'std' module
|
||||
// since __config may be included from C headers which may create an
|
||||
// include cycle.
|
||||
module std_config [system] [extern_c] {
|
||||
header "__config"
|
||||
}
|
||||
|
||||
module std [system] {
|
||||
export std_config
|
||||
// FIXME: The standard does not require that each of these submodules
|
||||
// re-exports its imported modules. We should provide an alternative form of
|
||||
// export that issues a warning if a name from the submodule is used, and
|
||||
// use that to provide a 'strict mode' for libc++.
|
||||
|
||||
// Deprecated C-compatibility headers. These can all be included from within
|
||||
// an 'extern "C"' context.
|
||||
module depr [extern_c] {
|
||||
// <assert.h> provided by C library.
|
||||
module ctype_h {
|
||||
header "ctype.h"
|
||||
export *
|
||||
}
|
||||
module errno_h {
|
||||
header "errno.h"
|
||||
export *
|
||||
}
|
||||
// <fenv.h> provided by C library.
|
||||
// <float.h> provided by compiler or C library.
|
||||
module inttypes_h {
|
||||
header "inttypes.h"
|
||||
export stdint_h
|
||||
export *
|
||||
}
|
||||
// <iso646.h> provided by compiler.
|
||||
// <limits.h> provided by compiler or C library.
|
||||
module locale_h {
|
||||
header "locale.h"
|
||||
export *
|
||||
}
|
||||
module math_h {
|
||||
header "math.h"
|
||||
export *
|
||||
}
|
||||
module setjmp_h {
|
||||
header "setjmp.h"
|
||||
export *
|
||||
}
|
||||
// FIXME: <stdalign.h> is missing.
|
||||
// <signal.h> provided by C library.
|
||||
// <stdarg.h> provided by compiler.
|
||||
// <stdbool.h> provided by compiler.
|
||||
module stddef_h {
|
||||
// <stddef.h>'s __need_* macros require textual inclusion.
|
||||
textual header "stddef.h"
|
||||
}
|
||||
module stdint_h {
|
||||
header "stdint.h"
|
||||
export *
|
||||
// FIXME: This module only exists on OS X and for some reason the
|
||||
// wildcard above doesn't export it.
|
||||
export Darwin.C.stdint
|
||||
}
|
||||
module stdio_h {
|
||||
// <stdio.h>'s __need_* macros require textual inclusion.
|
||||
textual header "stdio.h"
|
||||
export *
|
||||
export Darwin.C.stdio
|
||||
}
|
||||
module stdlib_h {
|
||||
// <stdlib.h>'s __need_* macros require textual inclusion.
|
||||
textual header "stdlib.h"
|
||||
export *
|
||||
}
|
||||
module string_h {
|
||||
header "string.h"
|
||||
export *
|
||||
}
|
||||
// FIXME: <uchar.h> is missing.
|
||||
// <time.h> provided by C library.
|
||||
module wchar_h {
|
||||
// <wchar.h>'s __need_* macros require textual inclusion.
|
||||
textual header "wchar.h"
|
||||
export *
|
||||
}
|
||||
module wctype_h {
|
||||
header "wctype.h"
|
||||
export *
|
||||
}
|
||||
}
|
||||
|
||||
// <complex.h> and <tgmath.h> are not C headers in any real sense, do not
|
||||
// allow their use in extern "C" contexts.
|
||||
module complex_h {
|
||||
header "complex.h"
|
||||
export ccomplex
|
||||
export *
|
||||
}
|
||||
module tgmath_h {
|
||||
header "tgmath.h"
|
||||
export ccomplex
|
||||
export cmath
|
||||
export *
|
||||
}
|
||||
|
||||
// C compatibility headers.
|
||||
module compat {
|
||||
module cassert {
|
||||
// <cassert>'s use of NDEBUG requires textual inclusion.
|
||||
textual header "cassert"
|
||||
}
|
||||
module ccomplex {
|
||||
header "ccomplex"
|
||||
export complex
|
||||
export *
|
||||
}
|
||||
module cctype {
|
||||
header "cctype"
|
||||
export *
|
||||
}
|
||||
module cerrno {
|
||||
header "cerrno"
|
||||
export *
|
||||
}
|
||||
module cfenv {
|
||||
header "cfenv"
|
||||
export *
|
||||
}
|
||||
module cfloat {
|
||||
header "cfloat"
|
||||
export *
|
||||
}
|
||||
module cinttypes {
|
||||
header "cinttypes"
|
||||
export cstdint
|
||||
export *
|
||||
}
|
||||
module ciso646 {
|
||||
header "ciso646"
|
||||
export *
|
||||
}
|
||||
module climits {
|
||||
header "climits"
|
||||
export *
|
||||
}
|
||||
module clocale {
|
||||
header "clocale"
|
||||
export *
|
||||
}
|
||||
module cmath {
|
||||
header "cmath"
|
||||
export *
|
||||
}
|
||||
module csetjmp {
|
||||
header "csetjmp"
|
||||
export *
|
||||
}
|
||||
module csignal {
|
||||
header "csignal"
|
||||
export *
|
||||
}
|
||||
// FIXME: <cstdalign> is missing.
|
||||
module cstdarg {
|
||||
header "cstdarg"
|
||||
export *
|
||||
}
|
||||
module cstdbool {
|
||||
header "cstdbool"
|
||||
export *
|
||||
}
|
||||
module cstddef {
|
||||
header "cstddef"
|
||||
export *
|
||||
}
|
||||
module cstdint {
|
||||
header "cstdint"
|
||||
export depr.stdint_h
|
||||
export *
|
||||
}
|
||||
module cstdio {
|
||||
header "cstdio"
|
||||
export *
|
||||
}
|
||||
module cstdlib {
|
||||
header "cstdlib"
|
||||
export *
|
||||
}
|
||||
module cstring {
|
||||
header "cstring"
|
||||
export *
|
||||
}
|
||||
module ctgmath {
|
||||
header "ctgmath"
|
||||
export ccomplex
|
||||
export cmath
|
||||
export *
|
||||
}
|
||||
module ctime {
|
||||
header "ctime"
|
||||
export *
|
||||
}
|
||||
// FIXME: <cuchar> is missing.
|
||||
module cwchar {
|
||||
header "cwchar"
|
||||
export depr.stdio_h
|
||||
export *
|
||||
}
|
||||
module cwctype {
|
||||
header "cwctype"
|
||||
export *
|
||||
}
|
||||
}
|
||||
|
||||
module algorithm {
|
||||
header "algorithm"
|
||||
export initializer_list
|
||||
export *
|
||||
}
|
||||
module any {
|
||||
header "any"
|
||||
export *
|
||||
}
|
||||
module array {
|
||||
header "array"
|
||||
export initializer_list
|
||||
@ -16,7 +227,6 @@ module std [system] {
|
||||
module atomic {
|
||||
header "atomic"
|
||||
export *
|
||||
requires cplusplus11
|
||||
}
|
||||
module bitset {
|
||||
header "bitset"
|
||||
@ -25,118 +235,10 @@ module std [system] {
|
||||
export *
|
||||
}
|
||||
// No submodule for cassert. It fundamentally needs repeated, textual inclusion.
|
||||
module ccomplex {
|
||||
header "ccomplex"
|
||||
export complex
|
||||
export *
|
||||
}
|
||||
module cctype {
|
||||
header "cctype"
|
||||
export *
|
||||
}
|
||||
module cerrno {
|
||||
header "cerrno"
|
||||
/*
|
||||
export_macros ECONNREFUSED, EIO, ENODEV, ENOTEMPTY, ERANGE,
|
||||
E2BIG, ECONNRESET, EISCONN, ENOENT, ENOTRECOVERABLE, EROFS,
|
||||
EACCES, EDEADLK, EISDIR, ENOEXEC, ENOTSOCK, ESPIPE,
|
||||
EADDRINUSE, EDESTADDRREQ, ELOOP, ENOLCK, ENOTSUP, ESRCH,
|
||||
EADDRNOTAVAIL, EDOM, EMFILE, ENOLINK, ENOTTY, ETIME,
|
||||
EAFNOSUPPORT, EEXIST, EMLINK, ENOMEM, ENXIO, ETIMEDOUT,
|
||||
EAGAIN, EFAULT, EMSGSIZE, ENOMSG, EOPNOTSUPP, ETXTBSY,
|
||||
EALREADY, EFBIG, ENAMETOOLONG, ENOPROTOOPT, EOVERFLOW, EWOULDBLOCK,
|
||||
EBADF, EHOSTUNREACH, ENETDOWN, ENOSPC, EOWNERDEAD, EXDEV,
|
||||
EBADMSG, EIDRM, ENETRESET, ENOSR, EPERM, errno,
|
||||
EBUSY, EILSEQ, ENETUNREACH, ENOSTR, EPIPE,
|
||||
ECANCELED, EINPROGRESS, ENFILE, ENOSYS, EPROTO,
|
||||
ECHILD, EINTR, ENOBUFS, ENOTCONN, EPROTONOSUPPORT,
|
||||
ECONNABORTED, EINVAL, ENODATA, ENOTDIR, EPROTOTYPE
|
||||
*/
|
||||
export *
|
||||
}
|
||||
module cfenv {
|
||||
header "cfenv"
|
||||
/*
|
||||
export_macros FE_ALL_EXCEPT, FE_DIVBYZERO, FE_INEXACT, FE_INVALID, FE_OVERFLOW,
|
||||
FE_UNDERFLOW, FE_DOWNWARD, FE_TONEAREST, FE_TOWARDZERO, FE_UPWARD,
|
||||
FE_DFL_ENV
|
||||
*/
|
||||
export *
|
||||
}
|
||||
module cfloat {
|
||||
header "cfloat"
|
||||
/*
|
||||
export_macros FLT_EVAL_METHOD, FLT_RADIX, FLT_ROUNDS,
|
||||
FLT_DIG, FLT_EPSILON, FLT_MANT_DIG,
|
||||
FLT_MAX, FLT_MAX_10_EXP, FLT_MAX_EXP,
|
||||
FLT_MIN, FLT_MIN_10_EXP, FLT_MIN_EXP,
|
||||
DBL_DIG, DBL_EPSILON, DBL_MANT_DIG,
|
||||
DBL_MAX, DBL_MAX_10_EXP, DBL_MAX_EXP,
|
||||
DBL_MIN, DBL_MIN_10_EXP, DBL_MIN_EXP,
|
||||
LDBL_DIG, LDBL_EPSILON, LDBL_MANT_DIG,
|
||||
LDBL_MAX, LDBL_MAX_10_EXP, LDBL_MAX_EXP,
|
||||
LDBL_MIN, LDBL_MIN_10_EXP, LDBL_MIN_EXP
|
||||
*/
|
||||
export *
|
||||
}
|
||||
module chrono {
|
||||
header "chrono"
|
||||
export *
|
||||
}
|
||||
module cinttypes {
|
||||
header "cinttypes"
|
||||
export cstdint
|
||||
/*
|
||||
export_macros
|
||||
PRId8, PRId16, PRId32, PRId64, PRIdFAST8, PRIdFAST16, PRIdFAST32, PRIdFAST64, PRIdLEAST8, PRIdLEAST16, PRIdLEAST32, PRIdLEAST64, PRIdMAX, PRIdPTR,
|
||||
PRIi8, PRIi16, PRIi32, PRIi64, PRIiFAST8, PRIiFAST16, PRIiFAST32, PRIiFAST64, PRIiLEAST8, PRIiLEAST16, PRIiLEAST32, PRIiLEAST64, PRIiMAX, PRIiPTR,
|
||||
PRIo8, PRIo16, PRIo32, PRIo64, PRIoFAST8, PRIoFAST16, PRIoFAST32, PRIoFAST64, PRIoLEAST8, PRIoLEAST16, PRIoLEAST32, PRIoLEAST64, PRIoMAX, PRIoPTR,
|
||||
PRIu8, PRIu16, PRIu32, PRIu64, PRIuFAST8, PRIuFAST16, PRIuFAST32, PRIuFAST64, PRIuLEAST8, PRIuLEAST16, PRIuLEAST32, PRIuLEAST64, PRIuMAX, PRIuPTR,
|
||||
PRIx8, PRIx16, PRIx32, PRIx64, PRIxFAST8, PRIxFAST16, PRIxFAST32, PRIxFAST64, PRIxLEAST8, PRIxLEAST16, PRIxLEAST32, PRIxLEAST64, PRIxMAX, PRIxPTR,
|
||||
PRIX8, PRIX16, PRIX32, PRIX64, PRIXFAST8, PRIXFAST16, PRIXFAST32, PRIXFAST64, PRIXLEAST8, PRIXLEAST16, PRIXLEAST32, PRIXLEAST64, PRIXMAX, PRIXPTR,
|
||||
SCNd8, SCNd16, SCNd32, SCNd64, SCNdFAST8, SCNdFAST16, SCNdFAST32, SCNdFAST64, SCNdLEAST8, SCNdLEAST16, SCNdLEAST32, SCNdLEAST64, SCNdMAX, SCNdPTR,
|
||||
SCNi8, SCNi16, SCNi32, SCNi64, SCNiFAST8, SCNiFAST16, SCNiFAST32, SCNiFAST64, SCNiLEAST8, SCNiLEAST16, SCNiLEAST32, SCNiLEAST64, SCNiMAX, SCNiPTR,
|
||||
SCNo8, SCNo16, SCNo32, SCNo64, SCNoFAST8, SCNoFAST16, SCNoFAST32, SCNoFAST64, SCNoLEAST8, SCNoLEAST16, SCNoLEAST32, SCNoLEAST64, SCNoMAX, SCNoPTR,
|
||||
SCNu8, SCNu16, SCNu32, SCNu64, SCNuFAST8, SCNuFAST16, SCNuFAST32, SCNuFAST64, SCNuLEAST8, SCNuLEAST16, SCNuLEAST32, SCNuLEAST64, SCNuMAX, SCNuPTR,
|
||||
SCNx8, SCNx16, SCNx32, SCNx64, SCNxFAST8, SCNxFAST16, SCNxFAST32, SCNxFAST64, SCNxLEAST8, SCNxLEAST16, SCNxLEAST32, SCNxLEAST64, SCNxMAX, SCNxPTR,
|
||||
SCNX8, SCNX16, SCNX32, SCNX64, SCNXFAST8, SCNXFAST16, SCNXFAST32, SCNXFAST64, SCNXLEAST8, SCNXLEAST16, SCNXLEAST32, SCNXLEAST64, SCNXMAX, SCNXPTR
|
||||
*/
|
||||
export *
|
||||
}
|
||||
module ciso646 {
|
||||
header "ciso646"
|
||||
export *
|
||||
}
|
||||
module climits {
|
||||
header "climits"
|
||||
/*
|
||||
export_macros CHAR_BIT, CHAR_MIN, CHAR_MAX,
|
||||
SCHAR_MIN, SCHAR_MAX, UCHAR_MAX,
|
||||
SHRT_MIN, SHRT_MAX, USHRT_MAX,
|
||||
INT_MIN, INT_MAX, UINT_MAX,
|
||||
LONG_MIN, LONG_MAX, ULONG_MAX,
|
||||
LLONG_MIN, LLONG_MAX, ULLONG_MAX,
|
||||
MB_LEN_MAX
|
||||
*/
|
||||
export *
|
||||
}
|
||||
module clocale {
|
||||
header "clocale"
|
||||
/*
|
||||
export_macros LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY, LC_NUMERIC, LC_TIME, NULL
|
||||
*/
|
||||
export *
|
||||
}
|
||||
module cmath {
|
||||
header "cmath"
|
||||
/*
|
||||
export_macros FP_FAST_FMA, FP_FAST_FMAF, FP_FAST_FMAL, FP_ILOGBO, FP_ILOGBNAN,
|
||||
FP_INFINITE, FP_NAN, FP_NORMAL, FP_SUBNORMAL, FP_ZERO,
|
||||
HUGE_VAL, HUGE_VALF, HUGE_VALL, INFINITY, NAN,
|
||||
MATH_ERRNO, MATH_ERREXCEPT, math_errhandling
|
||||
*/
|
||||
export *
|
||||
}
|
||||
module codecvt {
|
||||
header "codecvt"
|
||||
export *
|
||||
@ -149,108 +251,6 @@ module std [system] {
|
||||
header "condition_variable"
|
||||
export *
|
||||
}
|
||||
module csetjmp {
|
||||
header "csetjmp"
|
||||
/*
|
||||
export_macros setjmp
|
||||
*/
|
||||
export *
|
||||
}
|
||||
module csignal {
|
||||
header "csignal"
|
||||
/*
|
||||
export_macros SIGABRT, SIGFPE, SIGILL, SIGINT, SIGSEGV, SIGTERM,
|
||||
SIG_DFL, SIG_IGN, SIG_ERR
|
||||
*/
|
||||
export *
|
||||
}
|
||||
module cstdarg {
|
||||
header "cstdarg"
|
||||
/*
|
||||
export_macros va_arg, va_start, va_end, va_copy
|
||||
*/
|
||||
export *
|
||||
}
|
||||
module cstdbool {
|
||||
header "cstdbool"
|
||||
/*
|
||||
export_macros __bool_true_false_are_defined
|
||||
*/
|
||||
export *
|
||||
}
|
||||
module cstddef {
|
||||
header "cstddef"
|
||||
/*
|
||||
export_macros NULL, offsetof
|
||||
*/
|
||||
export *
|
||||
}
|
||||
module cstdint {
|
||||
header "cstdint"
|
||||
/*
|
||||
export_macros
|
||||
INT_8_MIN, INT_8_MAX, UINT_8_MAX, INT_16_MIN, INT_16_MAX, UINT_16_MAX,
|
||||
INT_32_MIN, INT_32_MAX, UINT_32_MAX, INT_64_MIN, INT_64_MAX, UINT_64_MAX,
|
||||
INT_FAST8_MIN, INT_FAST8_MAX, UINT_FAST8_MAX, INT_FAST16_MIN, INT_FAST16_MAX, UINT_FAST16_MAX,
|
||||
INT_FAST32_MIN, INT_FAST32_MAX, UINT_FAST32_MAX, INT_FAST64_MIN, INT_FAST64_MAX, UINT_FAST64_MAX,
|
||||
INT_LEAST8_MIN, INT_LEAST8_MAX, UINT_LEAST8_MAX, INT_LEAST16_MIN, INT_LEAST16_MAX, UINT_LEAST16_MAX,
|
||||
INT_LEAST32_MIN, INT_LEAST32_MAX, UINT_LEAST32_MAX, INT_LEAST64_MIN, INT_LEAST64_MAX, UINT_LEAST64_MAX,
|
||||
INT_MAX_MIN, INT_MAX_MAX, UINT_MAX_MAX, INT_PTR_MIN, INT_PTR_MAX, UINT_PTR_MAX,
|
||||
PTRDIFF_MIN, PTRDIFF_MAX, SIG_ATOMIC_MIN, SIG_ATOMIC_MAX, WCHAR_MIN, WCHAR_MAX, WINT_MIN, WINT_MAX,
|
||||
SIZE_MAX
|
||||
*/
|
||||
export *
|
||||
}
|
||||
module cstdio {
|
||||
header "cstdio"
|
||||
/*
|
||||
export_macros BUFSIZ, EOF, FILENAME_MAX, FOPEN_MAX, L_tmpnam, NULL,
|
||||
SEEK_CUR, SEEK_END, SEEK_SET, TMP_MAX, _IOFBF, _IOLBF,
|
||||
stdin, stdout, stderr
|
||||
*/
|
||||
export *
|
||||
}
|
||||
module cstdlib {
|
||||
header "cstdlib"
|
||||
/*
|
||||
export_macros RAND_MAX
|
||||
*/
|
||||
export *
|
||||
}
|
||||
module cstring {
|
||||
header "cstring"
|
||||
/*
|
||||
export_macros NULL
|
||||
*/
|
||||
export *
|
||||
}
|
||||
module ctgmath {
|
||||
header "ctgmath"
|
||||
export ccomplex
|
||||
export cmath
|
||||
export *
|
||||
}
|
||||
module ctime {
|
||||
header "ctime"
|
||||
/*
|
||||
export_macros NULL, CLOCKS_PER_SEC
|
||||
*/
|
||||
export *
|
||||
}
|
||||
module cwchar {
|
||||
header "cwchar"
|
||||
/*
|
||||
export_macros NULL, WCHAR_MAX, WCHAR_MIN, WEOF
|
||||
*/
|
||||
export *
|
||||
}
|
||||
module cwctype {
|
||||
header "cwctype"
|
||||
/*
|
||||
export_macros WEOF
|
||||
*/
|
||||
export *
|
||||
}
|
||||
module deque {
|
||||
header "deque"
|
||||
export initializer_list
|
||||
@ -345,6 +345,10 @@ module std [system] {
|
||||
header "numeric"
|
||||
export *
|
||||
}
|
||||
module optional {
|
||||
header "optional"
|
||||
export *
|
||||
}
|
||||
module ostream {
|
||||
header "ostream"
|
||||
// FIXME: should re-export ios, streambuf?
|
||||
@ -399,11 +403,19 @@ module std [system] {
|
||||
module string {
|
||||
header "string"
|
||||
export initializer_list
|
||||
export string_view
|
||||
export __string
|
||||
export *
|
||||
}
|
||||
module string_view {
|
||||
header "string_view"
|
||||
export initializer_list
|
||||
export __string
|
||||
export *
|
||||
}
|
||||
module strstream {
|
||||
header "strstream"
|
||||
requires !cplusplus11
|
||||
export *
|
||||
}
|
||||
module system_error {
|
||||
header "system_error"
|
||||
@ -449,17 +461,16 @@ module std [system] {
|
||||
export initializer_list
|
||||
export *
|
||||
}
|
||||
module variant {
|
||||
header "variant"
|
||||
export *
|
||||
}
|
||||
module vector {
|
||||
header "vector"
|
||||
export initializer_list
|
||||
export *
|
||||
}
|
||||
|
||||
// FIXME: We don't have modules for the <foo.h> headers, because they might
|
||||
// be included from the C library's headers, and that would create a #include
|
||||
// cycle. For the same reason, we don't have a module for __config.
|
||||
//module __config { header "__config" export * }
|
||||
|
||||
// FIXME: These should be private.
|
||||
module __bit_reference { header "__bit_reference" export * }
|
||||
module __debug { header "__debug" export * }
|
||||
@ -470,8 +481,127 @@ module std [system] {
|
||||
module __split_buffer { header "__split_buffer" export * }
|
||||
module __sso_allocator { header "__sso_allocator" export * }
|
||||
module __std_stream { header "__std_stream" export * }
|
||||
module __string { header "__string" export * }
|
||||
module __tree { header "__tree" export * }
|
||||
module __tuple { header "__tuple" export * }
|
||||
module __undef_min_max { header "__undef_min_max" export * }
|
||||
module __undef___deallocate { header "__undef___deallocate" export * }
|
||||
|
||||
module experimental {
|
||||
requires cplusplus11
|
||||
|
||||
module algorithm {
|
||||
header "experimental/algorithm"
|
||||
export *
|
||||
}
|
||||
module any {
|
||||
header "experimental/any"
|
||||
export *
|
||||
}
|
||||
module chrono {
|
||||
header "experimental/chrono"
|
||||
export *
|
||||
}
|
||||
module deque {
|
||||
header "experimental/deque"
|
||||
export *
|
||||
}
|
||||
module dynarray {
|
||||
header "experimental/dynarray"
|
||||
export *
|
||||
}
|
||||
module filesystem {
|
||||
header "experimental/filesystem"
|
||||
export *
|
||||
}
|
||||
module forward_list {
|
||||
header "experimental/forward_list"
|
||||
export *
|
||||
}
|
||||
module functional {
|
||||
header "experimental/functional"
|
||||
export *
|
||||
}
|
||||
module iterator {
|
||||
header "experimental/iterator"
|
||||
export *
|
||||
}
|
||||
module list {
|
||||
header "experimental/list"
|
||||
export *
|
||||
}
|
||||
module map {
|
||||
header "experimental/map"
|
||||
export *
|
||||
}
|
||||
module memory_resource {
|
||||
header "experimental/memory_resource"
|
||||
export *
|
||||
}
|
||||
module numeric {
|
||||
header "experimental/numeric"
|
||||
export *
|
||||
}
|
||||
module optional {
|
||||
header "experimental/optional"
|
||||
export *
|
||||
}
|
||||
module propagate_const {
|
||||
header "experimental/propagate_const"
|
||||
export *
|
||||
}
|
||||
module ratio {
|
||||
header "experimental/ratio"
|
||||
export *
|
||||
}
|
||||
module regex {
|
||||
header "experimental/regex"
|
||||
export *
|
||||
}
|
||||
module set {
|
||||
header "experimental/set"
|
||||
export *
|
||||
}
|
||||
module string {
|
||||
header "experimental/string"
|
||||
export *
|
||||
}
|
||||
module string_view {
|
||||
header "experimental/string_view"
|
||||
export *
|
||||
}
|
||||
module system_error {
|
||||
header "experimental/system_error"
|
||||
export *
|
||||
}
|
||||
module tuple {
|
||||
header "experimental/tuple"
|
||||
export *
|
||||
}
|
||||
module type_traits {
|
||||
header "experimental/type_traits"
|
||||
export *
|
||||
}
|
||||
module unordered_map {
|
||||
header "experimental/unordered_map"
|
||||
export *
|
||||
}
|
||||
module unordered_set {
|
||||
header "experimental/unordered_set"
|
||||
export *
|
||||
}
|
||||
module utility {
|
||||
header "experimental/utility"
|
||||
export *
|
||||
}
|
||||
module vector {
|
||||
header "experimental/vector"
|
||||
export *
|
||||
}
|
||||
// FIXME these should be private
|
||||
module __memory {
|
||||
header "experimental/__memory"
|
||||
export *
|
||||
}
|
||||
} // end experimental
|
||||
}
|
||||
|
@ -574,7 +574,7 @@ inline _LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
call_once(once_flag& __flag, _Callable&& __func, _Args&&... __args)
|
||||
{
|
||||
if (__libcpp_relaxed_load(&__flag.__state_) != ~0ul)
|
||||
if (__libcpp_acquire_load(&__flag.__state_) != ~0ul)
|
||||
{
|
||||
typedef tuple<_Callable&&, _Args&&...> _Gp;
|
||||
_Gp __f(_VSTD::forward<_Callable>(__func), _VSTD::forward<_Args>(__args)...);
|
||||
@ -590,7 +590,7 @@ inline _LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
call_once(once_flag& __flag, _Callable& __func)
|
||||
{
|
||||
if (__libcpp_relaxed_load(&__flag.__state_) != ~0ul)
|
||||
if (__libcpp_acquire_load(&__flag.__state_) != ~0ul)
|
||||
{
|
||||
__call_once_param<_Callable> __p(__func);
|
||||
__call_once(__flag.__state_, &__p, &__call_once_proxy<_Callable>);
|
||||
|
114
include/new
114
include/new
@ -27,18 +27,19 @@ public:
|
||||
virtual const char* what() const noexcept;
|
||||
};
|
||||
|
||||
class bad_array_length : public bad_alloc // C++14
|
||||
class bad_array_length : public bad_alloc // FIXME: Not part of C++
|
||||
{
|
||||
public:
|
||||
bad_array_length() noexcept;
|
||||
};
|
||||
|
||||
class bad_array_new_length : public bad_alloc
|
||||
class bad_array_new_length : public bad_alloc // C++14
|
||||
{
|
||||
public:
|
||||
bad_array_new_length() noexcept;
|
||||
};
|
||||
|
||||
enum class align_val_t : size_t {}; // C++17
|
||||
struct nothrow_t {};
|
||||
extern const nothrow_t nothrow;
|
||||
typedef void (*new_handler)();
|
||||
@ -48,16 +49,34 @@ new_handler get_new_handler() noexcept;
|
||||
} // std
|
||||
|
||||
void* operator new(std::size_t size); // replaceable
|
||||
void* operator new(std::size_t size, std::align_val_t alignment); // replaceable, C++17
|
||||
void* operator new(std::size_t size, const std::nothrow_t&) noexcept; // replaceable
|
||||
void* operator new(std::size_t size, std::align_val_t alignment,
|
||||
const std::nothrow_t&) noexcept; // replaceable, C++17
|
||||
void operator delete(void* ptr) noexcept; // replaceable
|
||||
void operator delete(void* ptr, std::size_t size) noexcept; // replaceable, C++14
|
||||
void operator delete(void* ptr, std::align_val_t alignment) noexcept; // replaceable, C++17
|
||||
void operator delete(void* ptr, std::size_t size,
|
||||
std::align_val_t alignment) noexcept; // replaceable, C++17
|
||||
void operator delete(void* ptr, const std::nothrow_t&) noexcept; // replaceable
|
||||
void operator delete(void* ptr, std:align_val_t alignment,
|
||||
const std::nothrow_t&) noexcept; // replaceable, C++17
|
||||
|
||||
void* operator new[](std::size_t size); // replaceable
|
||||
void* operator new[](std::size_t size,
|
||||
std::align_val_t alignment) noexcept; // replaceable, C++17
|
||||
void* operator new[](std::size_t size, const std::nothrow_t&) noexcept; // replaceable
|
||||
void* operator new[](std::size_t size, std::align_val_t alignment,
|
||||
const std::nothrow_t&) noexcept; // replaceable, C++17
|
||||
void operator delete[](void* ptr) noexcept; // replaceable
|
||||
void operator delete[](void* ptr, std::size_t size) noexcept; // replaceable, C++14
|
||||
void operator delete[](void* ptr,
|
||||
std::align_val_t alignment) noexcept; // replaceable, C++17
|
||||
void operator delete[](void* ptr, std::size_t size,
|
||||
std::align_val_t alignment) noexcept; // replaceable, C++17
|
||||
void operator delete[](void* ptr, const std::nothrow_t&) noexcept; // replaceable
|
||||
void operator delete[](void* ptr, std::align_val_t alignment,
|
||||
const std::nothrow_t&) noexcept; // replaceable, C++17
|
||||
|
||||
void* operator new (std::size_t size, void* ptr) noexcept;
|
||||
void* operator new[](std::size_t size, void* ptr) noexcept;
|
||||
@ -69,6 +88,9 @@ void operator delete[](void* ptr, void*) noexcept;
|
||||
#include <__config>
|
||||
#include <exception>
|
||||
#include <cstddef>
|
||||
#ifdef _LIBCPP_NO_EXCEPTIONS
|
||||
#include <cstdlib>
|
||||
#endif
|
||||
|
||||
#include <__undef___deallocate>
|
||||
|
||||
@ -76,6 +98,16 @@ void operator delete[](void* ptr, void*) noexcept;
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#if !(defined(_LIBCPP_BUILDING_NEW) || _LIBCPP_STD_VER >= 14 || \
|
||||
(defined(__cpp_sized_deallocation) && __cpp_sized_deallocation >= 201309))
|
||||
# define _LIBCPP_HAS_NO_SIZED_DEALLOCATION
|
||||
#endif
|
||||
|
||||
#if !(defined(_LIBCPP_BUILDING_NEW) || _LIBCPP_STD_VER > 14 || \
|
||||
(defined(__cpp_aligned_new) && __cpp_aligned_new >= 201606))
|
||||
# define _LIBCPP_HAS_NO_ALIGNED_ALLOCATION
|
||||
#endif
|
||||
|
||||
namespace std // purposefully not using versioning namespace
|
||||
{
|
||||
|
||||
@ -97,6 +129,8 @@ public:
|
||||
virtual const char* what() const _NOEXCEPT;
|
||||
};
|
||||
|
||||
_LIBCPP_NORETURN _LIBCPP_FUNC_VIS void __throw_bad_alloc(); // not in C++ spec
|
||||
|
||||
#if defined(_LIBCPP_BUILDING_NEW) || (_LIBCPP_STD_VER > 11)
|
||||
|
||||
class _LIBCPP_EXCEPTION_ABI bad_array_length
|
||||
@ -112,7 +146,13 @@ public:
|
||||
|
||||
#endif // defined(_LIBCPP_BUILDING_NEW) || (_LIBCPP_STD_VER > 11)
|
||||
|
||||
_LIBCPP_FUNC_VIS void __throw_bad_alloc(); // not in C++ spec
|
||||
#ifndef _LIBCPP_HAS_NO_ALIGNED_ALLOCATION
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
enum class _LIBCPP_ENUM_VIS align_val_t : size_t { };
|
||||
#else
|
||||
enum align_val_t { __zero = 0, __max = (size_t)-1 };
|
||||
#endif
|
||||
#endif
|
||||
|
||||
struct _LIBCPP_TYPE_VIS nothrow_t {};
|
||||
extern _LIBCPP_FUNC_VIS const nothrow_t nothrow;
|
||||
@ -122,36 +162,44 @@ _LIBCPP_FUNC_VIS new_handler get_new_handler() _NOEXCEPT;
|
||||
|
||||
} // std
|
||||
|
||||
#if defined(_WIN32) && !defined(cxx_EXPORTS)
|
||||
# define _LIBCPP_NEW_DELETE_VIS _LIBCPP_FUNC_VIS_ONLY
|
||||
#if !__has_feature(cxx_noexcept)
|
||||
#define _THROW_BAD_ALLOC throw(std::bad_alloc)
|
||||
#else
|
||||
# define _LIBCPP_NEW_DELETE_VIS _LIBCPP_FUNC_VIS
|
||||
#define _THROW_BAD_ALLOC
|
||||
#endif
|
||||
|
||||
_LIBCPP_NEW_DELETE_VIS void* operator new(std::size_t __sz)
|
||||
#if !__has_feature(cxx_noexcept)
|
||||
throw(std::bad_alloc)
|
||||
#endif
|
||||
;
|
||||
_LIBCPP_NEW_DELETE_VIS void* operator new(std::size_t __sz, const std::nothrow_t&) _NOEXCEPT _NOALIAS;
|
||||
_LIBCPP_NEW_DELETE_VIS void operator delete(void* __p) _NOEXCEPT;
|
||||
_LIBCPP_NEW_DELETE_VIS void operator delete(void* __p, const std::nothrow_t&) _NOEXCEPT;
|
||||
#if defined(_LIBCPP_BUILDING_NEW) || _LIBCPP_STD_VER >= 14 || \
|
||||
(defined(__cpp_sized_deallocation) && __cpp_sized_deallocation >= 201309)
|
||||
_LIBCPP_NEW_DELETE_VIS void operator delete(void* __p, std::size_t __sz) _NOEXCEPT;
|
||||
_LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new(std::size_t __sz) _THROW_BAD_ALLOC;
|
||||
_LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new(std::size_t __sz, const std::nothrow_t&) _NOEXCEPT _NOALIAS;
|
||||
_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete(void* __p) _NOEXCEPT;
|
||||
_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete(void* __p, const std::nothrow_t&) _NOEXCEPT;
|
||||
#ifndef _LIBCPP_HAS_NO_SIZED_DEALLOCATION
|
||||
_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete(void* __p, std::size_t __sz) _NOEXCEPT;
|
||||
#endif
|
||||
|
||||
_LIBCPP_NEW_DELETE_VIS void* operator new[](std::size_t __sz)
|
||||
#if !__has_feature(cxx_noexcept)
|
||||
throw(std::bad_alloc)
|
||||
_LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new[](std::size_t __sz) _THROW_BAD_ALLOC;
|
||||
_LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new[](std::size_t __sz, const std::nothrow_t&) _NOEXCEPT _NOALIAS;
|
||||
_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete[](void* __p) _NOEXCEPT;
|
||||
_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete[](void* __p, const std::nothrow_t&) _NOEXCEPT;
|
||||
#ifndef _LIBCPP_HAS_NO_SIZED_DEALLOCATION
|
||||
_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete[](void* __p, std::size_t __sz) _NOEXCEPT;
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_ALIGNED_ALLOCATION
|
||||
_LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new(std::size_t __sz, std::align_val_t) _THROW_BAD_ALLOC;
|
||||
_LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new(std::size_t __sz, std::align_val_t, const std::nothrow_t&) _NOEXCEPT _NOALIAS;
|
||||
_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete(void* __p, std::align_val_t) _NOEXCEPT;
|
||||
_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete(void* __p, std::align_val_t, const std::nothrow_t&) _NOEXCEPT;
|
||||
#ifndef _LIBCPP_HAS_NO_SIZED_DEALLOCATION
|
||||
_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete(void* __p, std::size_t __sz, std::align_val_t) _NOEXCEPT;
|
||||
#endif
|
||||
|
||||
_LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new[](std::size_t __sz, std::align_val_t) _THROW_BAD_ALLOC;
|
||||
_LIBCPP_OVERRIDABLE_FUNC_VIS void* operator new[](std::size_t __sz, std::align_val_t, const std::nothrow_t&) _NOEXCEPT _NOALIAS;
|
||||
_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete[](void* __p, std::align_val_t) _NOEXCEPT;
|
||||
_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete[](void* __p, std::align_val_t, const std::nothrow_t&) _NOEXCEPT;
|
||||
#ifndef _LIBCPP_HAS_NO_SIZED_DEALLOCATION
|
||||
_LIBCPP_OVERRIDABLE_FUNC_VIS void operator delete[](void* __p, std::size_t __sz, std::align_val_t) _NOEXCEPT;
|
||||
#endif
|
||||
;
|
||||
_LIBCPP_NEW_DELETE_VIS void* operator new[](std::size_t __sz, const std::nothrow_t&) _NOEXCEPT _NOALIAS;
|
||||
_LIBCPP_NEW_DELETE_VIS void operator delete[](void* __p) _NOEXCEPT;
|
||||
_LIBCPP_NEW_DELETE_VIS void operator delete[](void* __p, const std::nothrow_t&) _NOEXCEPT;
|
||||
#if defined(_LIBCPP_BUILDING_NEW) || _LIBCPP_STD_VER >= 14 || \
|
||||
(defined(__cpp_sized_deallocation) && __cpp_sized_deallocation >= 201309)
|
||||
_LIBCPP_NEW_DELETE_VIS void operator delete[](void* __p, std::size_t __sz) _NOEXCEPT;
|
||||
#endif
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY void* operator new (std::size_t, void* __p) _NOEXCEPT {return __p;}
|
||||
@ -177,6 +225,18 @@ inline _LIBCPP_INLINE_VISIBILITY void __deallocate(void *__ptr) {
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef _LIBCPP_BAD_ARRAY_LENGTH_DEFINED
|
||||
_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
|
||||
void __throw_bad_array_length()
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw bad_array_length();
|
||||
#else
|
||||
_VSTD::abort();
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP_NEW
|
||||
|
@ -53,6 +53,12 @@ template <class InputIterator, class OutputIterator, class BinaryOperation>
|
||||
template <class ForwardIterator, class T>
|
||||
void iota(ForwardIterator first, ForwardIterator last, T value);
|
||||
|
||||
template <class M, class N>
|
||||
constexpr common_type_t<M,N> gcd(M m, N n); // C++17
|
||||
|
||||
template <class M, class N>
|
||||
constexpr common_type_t<M,N> lcm(M m, N n); // C++17
|
||||
|
||||
} // std
|
||||
|
||||
*/
|
||||
@ -192,6 +198,66 @@ iota(_ForwardIterator __first, _ForwardIterator __last, _Tp __value_)
|
||||
*__first = __value_;
|
||||
}
|
||||
|
||||
|
||||
#if _LIBCPP_STD_VER > 14
|
||||
template <typename _Tp, bool _IsSigned = is_signed<_Tp>::value> struct __abs;
|
||||
|
||||
template <typename _Tp>
|
||||
struct __abs<_Tp, true> {
|
||||
_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
|
||||
_Tp operator()(_Tp __t) const noexcept { return __t >= 0 ? __t : -__t; }
|
||||
};
|
||||
|
||||
template <typename _Tp>
|
||||
struct __abs<_Tp, false> {
|
||||
_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
|
||||
_Tp operator()(_Tp __t) const noexcept { return __t; }
|
||||
};
|
||||
|
||||
|
||||
template<class _Tp>
|
||||
_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
|
||||
_Tp __gcd(_Tp __m, _Tp __n)
|
||||
{
|
||||
static_assert((!is_signed<_Tp>::value), "" );
|
||||
return __n == 0 ? __m : __gcd<_Tp>(__n, __m % __n);
|
||||
}
|
||||
|
||||
|
||||
template<class _Tp, class _Up>
|
||||
_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
|
||||
common_type_t<_Tp,_Up>
|
||||
gcd(_Tp __m, _Up __n)
|
||||
{
|
||||
static_assert((is_integral<_Tp>::value && is_integral<_Up>::value), "Arguments to gcd must be integer types");
|
||||
static_assert((!is_same<typename remove_cv<_Tp>::type, bool>::value), "First argument to gcd cannot be bool" );
|
||||
static_assert((!is_same<typename remove_cv<_Up>::type, bool>::value), "Second argument to gcd cannot be bool" );
|
||||
using _Rp = common_type_t<_Tp,_Up>;
|
||||
using _Wp = make_unsigned_t<_Rp>;
|
||||
return static_cast<_Rp>(__gcd(static_cast<_Wp>(__abs<_Tp>()(__m)),
|
||||
static_cast<_Wp>(__abs<_Up>()(__n))));
|
||||
}
|
||||
|
||||
template<class _Tp, class _Up>
|
||||
_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
|
||||
common_type_t<_Tp,_Up>
|
||||
lcm(_Tp __m, _Up __n)
|
||||
{
|
||||
static_assert((is_integral<_Tp>::value && is_integral<_Up>::value), "Arguments to lcm must be integer types");
|
||||
static_assert((!is_same<typename remove_cv<_Tp>::type, bool>::value), "First argument to lcm cannot be bool" );
|
||||
static_assert((!is_same<typename remove_cv<_Up>::type, bool>::value), "Second argument to lcm cannot be bool" );
|
||||
if (__m == 0 || __n == 0)
|
||||
return 0;
|
||||
|
||||
using _Rp = common_type_t<_Tp,_Up>;
|
||||
_Rp __val1 = __abs<_Tp>()(__m) / gcd(__m,__n);
|
||||
_Up __val2 = __abs<_Up>()(__n);
|
||||
_LIBCPP_ASSERT((numeric_limits<_Rp>::max() / __val1 > __val2), "Overflow in lcm");
|
||||
return __val1 * __val2;
|
||||
}
|
||||
|
||||
#endif /* _LIBCPP_STD_VER > 14 */
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP_NUMERIC
|
||||
|
1314
include/optional
Normal file
1314
include/optional
Normal file
File diff suppressed because it is too large
Load Diff
@ -160,20 +160,24 @@ public:
|
||||
typedef typename traits_type::off_type off_type;
|
||||
|
||||
// 27.7.2.2 Constructor/destructor:
|
||||
explicit basic_ostream(basic_streambuf<char_type, traits_type>* __sb);
|
||||
inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
|
||||
explicit basic_ostream(basic_streambuf<char_type, traits_type>* __sb)
|
||||
{ this->init(__sb); }
|
||||
virtual ~basic_ostream();
|
||||
protected:
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_ostream(basic_ostream&& __rhs);
|
||||
#endif
|
||||
|
||||
// 27.7.2.3 Assign/swap
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_ostream& operator=(basic_ostream&& __rhs);
|
||||
#endif
|
||||
void swap(basic_ostream& __rhs);
|
||||
inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
|
||||
void swap(basic_ostream& __rhs)
|
||||
{ basic_ios<char_type, traits_type>::swap(__rhs); }
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS
|
||||
basic_ostream (const basic_ostream& __rhs) = delete;
|
||||
@ -188,10 +192,19 @@ public:
|
||||
class _LIBCPP_TYPE_VIS_ONLY sentry;
|
||||
|
||||
// 27.7.2.6 Formatted output:
|
||||
basic_ostream& operator<<(basic_ostream& (*__pf)(basic_ostream&));
|
||||
inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
|
||||
basic_ostream& operator<<(basic_ostream& (*__pf)(basic_ostream&))
|
||||
{ return __pf(*this); }
|
||||
|
||||
inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
|
||||
basic_ostream& operator<<(basic_ios<char_type, traits_type>&
|
||||
(*__pf)(basic_ios<char_type,traits_type>&));
|
||||
basic_ostream& operator<<(ios_base& (*__pf)(ios_base&));
|
||||
(*__pf)(basic_ios<char_type,traits_type>&))
|
||||
{ __pf(*this); return *this; }
|
||||
|
||||
inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
|
||||
basic_ostream& operator<<(ios_base& (*__pf)(ios_base&))
|
||||
{ __pf(*this); return *this; }
|
||||
|
||||
basic_ostream& operator<<(bool __n);
|
||||
basic_ostream& operator<<(short __n);
|
||||
basic_ostream& operator<<(unsigned short __n);
|
||||
@ -213,8 +226,11 @@ public:
|
||||
basic_ostream& flush();
|
||||
|
||||
// 27.7.2.5 seeks:
|
||||
inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
|
||||
pos_type tellp();
|
||||
inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
|
||||
basic_ostream& seekp(pos_type __pos);
|
||||
inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY
|
||||
basic_ostream& seekp(off_type __off, ios_base::seekdir __dir);
|
||||
|
||||
protected:
|
||||
@ -274,24 +290,15 @@ basic_ostream<_CharT, _Traits>::sentry::~sentry()
|
||||
}
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_ostream<_CharT, _Traits>::basic_ostream(basic_streambuf<char_type, traits_type>* __sb)
|
||||
{
|
||||
this->init(__sb);
|
||||
}
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_ostream<_CharT, _Traits>::basic_ostream(basic_ostream&& __rhs)
|
||||
{
|
||||
this->move(__rhs);
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_ostream<_CharT, _Traits>&
|
||||
basic_ostream<_CharT, _Traits>::operator=(basic_ostream&& __rhs)
|
||||
{
|
||||
@ -306,41 +313,6 @@ basic_ostream<_CharT, _Traits>::~basic_ostream()
|
||||
{
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
basic_ostream<_CharT, _Traits>::swap(basic_ostream& __rhs)
|
||||
{
|
||||
basic_ios<char_type, traits_type>::swap(__rhs);
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_ostream<_CharT, _Traits>&
|
||||
basic_ostream<_CharT, _Traits>::operator<<(basic_ostream& (*__pf)(basic_ostream&))
|
||||
{
|
||||
return __pf(*this);
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_ostream<_CharT, _Traits>&
|
||||
basic_ostream<_CharT, _Traits>::operator<<(basic_ios<char_type, traits_type>&
|
||||
(*__pf)(basic_ios<char_type,traits_type>&))
|
||||
{
|
||||
__pf(*this);
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_ostream<_CharT, _Traits>&
|
||||
basic_ostream<_CharT, _Traits>::operator<<(ios_base& (*__pf)(ios_base&))
|
||||
{
|
||||
__pf(*this);
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
basic_ostream<_CharT, _Traits>&
|
||||
basic_ostream<_CharT, _Traits>::operator<<(basic_streambuf<char_type, traits_type>* __sb)
|
||||
@ -989,7 +961,6 @@ basic_ostream<_CharT, _Traits>::flush()
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
typename basic_ostream<_CharT, _Traits>::pos_type
|
||||
basic_ostream<_CharT, _Traits>::tellp()
|
||||
{
|
||||
@ -999,7 +970,6 @@ basic_ostream<_CharT, _Traits>::tellp()
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_ostream<_CharT, _Traits>&
|
||||
basic_ostream<_CharT, _Traits>::seekp(pos_type __pos)
|
||||
{
|
||||
@ -1013,7 +983,6 @@ basic_ostream<_CharT, _Traits>::seekp(pos_type __pos)
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_ostream<_CharT, _Traits>&
|
||||
basic_ostream<_CharT, _Traits>::seekp(off_type __off, ios_base::seekdir __dir)
|
||||
{
|
||||
@ -1080,6 +1049,14 @@ operator<<(basic_ostream<_CharT, _Traits>& __os,
|
||||
return _VSTD::__put_character_sequence(__os, __str.data(), __str.size());
|
||||
}
|
||||
|
||||
template<class _CharT, class _Traits>
|
||||
basic_ostream<_CharT, _Traits>&
|
||||
operator<<(basic_ostream<_CharT, _Traits>& __os,
|
||||
const basic_string_view<_CharT, _Traits> __sv)
|
||||
{
|
||||
return _VSTD::__put_character_sequence(__os, __sv.data(), __sv.size());
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_ostream<_CharT, _Traits>&
|
||||
@ -1105,8 +1082,8 @@ operator<<(basic_ostream<_CharT, _Traits>& __os, const bitset<_Size>& __x)
|
||||
use_facet<ctype<_CharT> >(__os.getloc()).widen('1'));
|
||||
}
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_ostream<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_ostream<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ostream<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ostream<wchar_t>)
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
|
@ -63,7 +63,7 @@ public:
|
||||
|
||||
void push(const value_type& v);
|
||||
void push(value_type&& v);
|
||||
template <class... Args> void emplace(Args&&... args);
|
||||
template <class... Args> reference emplace(Args&&... args);
|
||||
void pop();
|
||||
|
||||
void swap(queue& q) noexcept(is_nothrow_swappable_v<Container>)
|
||||
@ -292,8 +292,8 @@ public:
|
||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
||||
template <class... _Args>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
void emplace(_Args&&... __args)
|
||||
{c.emplace_back(_VSTD::forward<_Args>(__args)...);}
|
||||
reference emplace(_Args&&... __args)
|
||||
{ return c.emplace_back(_VSTD::forward<_Args>(__args)...);}
|
||||
#endif // _LIBCPP_HAS_NO_VARIADICS
|
||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
|
@ -2817,6 +2817,7 @@ class _LIBCPP_TYPE_VIS_ONLY discard_block_engine
|
||||
|
||||
static_assert( 0 < __r, "discard_block_engine invalid parameters");
|
||||
static_assert(__r <= __p, "discard_block_engine invalid parameters");
|
||||
static_assert(__r <= INT_MAX, "discard_block_engine invalid parameters");
|
||||
public:
|
||||
// types
|
||||
typedef typename _Engine::result_type result_type;
|
||||
@ -2918,7 +2919,7 @@ template<class _Engine, size_t __p, size_t __r>
|
||||
typename discard_block_engine<_Engine, __p, __r>::result_type
|
||||
discard_block_engine<_Engine, __p, __r>::operator()()
|
||||
{
|
||||
if (__n_ >= __r)
|
||||
if (__n_ >= static_cast<int>(__r))
|
||||
{
|
||||
__e_.discard(__p - __r);
|
||||
__n_ = 0;
|
||||
|
@ -300,18 +300,18 @@ public:
|
||||
>::type type;
|
||||
};
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
|
||||
template <class _R1, class _R2> using ratio_multiply
|
||||
= typename __ratio_multiply<_R1, _R2>::type;
|
||||
|
||||
#else // _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#else // _LIBCPP_CXX03_LANG
|
||||
|
||||
template <class _R1, class _R2>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY ratio_multiply
|
||||
: public __ratio_multiply<_R1, _R2>::type {};
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#endif // _LIBCPP_CXX03_LANG
|
||||
|
||||
template <class _R1, class _R2>
|
||||
struct __ratio_divide
|
||||
@ -327,18 +327,18 @@ public:
|
||||
>::type type;
|
||||
};
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
|
||||
template <class _R1, class _R2> using ratio_divide
|
||||
= typename __ratio_divide<_R1, _R2>::type;
|
||||
|
||||
#else // _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#else // _LIBCPP_CXX03_LANG
|
||||
|
||||
template <class _R1, class _R2>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY ratio_divide
|
||||
: public __ratio_divide<_R1, _R2>::type {};
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#endif // _LIBCPP_CXX03_LANG
|
||||
|
||||
template <class _R1, class _R2>
|
||||
struct __ratio_add
|
||||
@ -362,18 +362,18 @@ public:
|
||||
>::type type;
|
||||
};
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
|
||||
template <class _R1, class _R2> using ratio_add
|
||||
= typename __ratio_add<_R1, _R2>::type;
|
||||
|
||||
#else // _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#else // _LIBCPP_CXX03_LANG
|
||||
|
||||
template <class _R1, class _R2>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY ratio_add
|
||||
: public __ratio_add<_R1, _R2>::type {};
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#endif // _LIBCPP_CXX03_LANG
|
||||
|
||||
template <class _R1, class _R2>
|
||||
struct __ratio_subtract
|
||||
@ -397,18 +397,18 @@ public:
|
||||
>::type type;
|
||||
};
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#ifndef _LIBCPP_CXX03_LANG
|
||||
|
||||
template <class _R1, class _R2> using ratio_subtract
|
||||
= typename __ratio_subtract<_R1, _R2>::type;
|
||||
|
||||
#else // _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#else // _LIBCPP_CXX03_LANG
|
||||
|
||||
template <class _R1, class _R2>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY ratio_subtract
|
||||
: public __ratio_subtract<_R1, _R2>::type {};
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#endif // _LIBCPP_CXX03_LANG
|
||||
|
||||
// ratio_equal
|
||||
|
||||
|
101
include/regex
101
include/regex
@ -127,6 +127,8 @@ class basic_regex
|
||||
public:
|
||||
// types:
|
||||
typedef charT value_type;
|
||||
typedef traits traits_type;
|
||||
typedef typename traits::string_type string_type;
|
||||
typedef regex_constants::syntax_option_type flag_type;
|
||||
typedef typename traits::locale_type locale_type;
|
||||
|
||||
@ -145,7 +147,7 @@ public:
|
||||
// construct/copy/destroy:
|
||||
basic_regex();
|
||||
explicit basic_regex(const charT* p, flag_type f = regex_constants::ECMAScript);
|
||||
basic_regex(const charT* p, size_t len, flag_type f);
|
||||
basic_regex(const charT* p, size_t len, flag_type f = regex_constants::ECMAScript);
|
||||
basic_regex(const basic_regex&);
|
||||
basic_regex(basic_regex&&) noexcept;
|
||||
template <class ST, class SA>
|
||||
@ -762,7 +764,6 @@ typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
#include <deque>
|
||||
#include <cassert>
|
||||
|
||||
#include <__undef_min_max>
|
||||
|
||||
@ -864,7 +865,8 @@ enum match_flag_type
|
||||
format_sed = 1 << 8,
|
||||
format_no_copy = 1 << 9,
|
||||
format_first_only = 1 << 10,
|
||||
__no_update_pos = 1 << 11
|
||||
__no_update_pos = 1 << 11,
|
||||
__full_match = 1 << 12
|
||||
};
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
@ -957,13 +959,13 @@ public:
|
||||
};
|
||||
|
||||
template <regex_constants::error_type _Ev>
|
||||
_LIBCPP_ALWAYS_INLINE
|
||||
_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
|
||||
void __throw_regex_error()
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw regex_error(_Ev);
|
||||
#else
|
||||
assert(!"regex_error");
|
||||
_VSTD::abort();
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -2475,6 +2477,8 @@ class _LIBCPP_TYPE_VIS_ONLY basic_regex
|
||||
public:
|
||||
// types:
|
||||
typedef _CharT value_type;
|
||||
typedef _Traits traits_type;
|
||||
typedef typename _Traits::string_type string_type;
|
||||
typedef regex_constants::syntax_option_type flag_type;
|
||||
typedef typename _Traits::locale_type locale_type;
|
||||
|
||||
@ -2515,7 +2519,7 @@ public:
|
||||
__end_(0)
|
||||
{__parse(__p, __p + __traits_.length(__p));}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
basic_regex(const value_type* __p, size_t __len, flag_type __f)
|
||||
basic_regex(const value_type* __p, size_t __len, flag_type __f = regex_constants::ECMAScript)
|
||||
: __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
|
||||
__end_(0)
|
||||
{__parse(__p, __p + __len);}
|
||||
@ -2981,10 +2985,12 @@ __lookahead<_CharT, _Traits>::__exec(__state& __s) const
|
||||
{
|
||||
match_results<const _CharT*> __m;
|
||||
__m.__init(1 + __exp_.mark_count(), __s.__current_, __s.__last_);
|
||||
bool __matched = __exp_.__match_at_start_ecma(__s.__current_, __s.__last_,
|
||||
__m,
|
||||
__s.__flags_ | regex_constants::match_continuous,
|
||||
__s.__at_first_ && __s.__current_ == __s.__first_);
|
||||
bool __matched = __exp_.__match_at_start_ecma(
|
||||
__s.__current_, __s.__last_,
|
||||
__m,
|
||||
(__s.__flags_ | regex_constants::match_continuous) &
|
||||
~regex_constants::__full_match,
|
||||
__s.__at_first_ && __s.__current_ == __s.__first_);
|
||||
if (__matched != __invert_)
|
||||
{
|
||||
__s.__do_ = __state::__accept_but_not_consume;
|
||||
@ -4308,7 +4314,8 @@ basic_regex<_CharT, _Traits>::__parse_decimal_escape(_ForwardIterator __first,
|
||||
else if ('1' <= *__first && *__first <= '9')
|
||||
{
|
||||
unsigned __v = *__first - '0';
|
||||
for (++__first; '0' <= *__first && *__first <= '9'; ++__first)
|
||||
for (++__first;
|
||||
__first != __last && '0' <= *__first && *__first <= '9'; ++__first)
|
||||
__v = 10 * __v + *__first - '0';
|
||||
if (__v > mark_count())
|
||||
__throw_regex_error<regex_constants::error_backref>();
|
||||
@ -5552,6 +5559,18 @@ basic_regex<_CharT, _Traits>::__match_at_start_ecma(
|
||||
switch (__s.__do_)
|
||||
{
|
||||
case __state::__end_state:
|
||||
if ((__flags & regex_constants::match_not_null) &&
|
||||
__s.__current_ == __first)
|
||||
{
|
||||
__states.pop_back();
|
||||
break;
|
||||
}
|
||||
if ((__flags & regex_constants::__full_match) &&
|
||||
__s.__current_ != __last)
|
||||
{
|
||||
__states.pop_back();
|
||||
break;
|
||||
}
|
||||
__m.__matches_[0].first = __first;
|
||||
__m.__matches_[0].second = _VSTD::next(__first, __s.__current_ - __first);
|
||||
__m.__matches_[0].matched = true;
|
||||
@ -5615,6 +5634,18 @@ basic_regex<_CharT, _Traits>::__match_at_start_posix_nosubs(
|
||||
switch (__s.__do_)
|
||||
{
|
||||
case __state::__end_state:
|
||||
if ((__flags & regex_constants::match_not_null) &&
|
||||
__s.__current_ == __first)
|
||||
{
|
||||
__states.pop_back();
|
||||
break;
|
||||
}
|
||||
if ((__flags & regex_constants::__full_match) &&
|
||||
__s.__current_ != __last)
|
||||
{
|
||||
__states.pop_back();
|
||||
break;
|
||||
}
|
||||
if (!__matched || __highest_j < __s.__current_ - __s.__first_)
|
||||
__highest_j = __s.__current_ - __s.__first_;
|
||||
__matched = true;
|
||||
@ -5700,6 +5731,18 @@ basic_regex<_CharT, _Traits>::__match_at_start_posix_subs(
|
||||
switch (__s.__do_)
|
||||
{
|
||||
case __state::__end_state:
|
||||
if ((__flags & regex_constants::match_not_null) &&
|
||||
__s.__current_ == __first)
|
||||
{
|
||||
__states.pop_back();
|
||||
break;
|
||||
}
|
||||
if ((__flags & regex_constants::__full_match) &&
|
||||
__s.__current_ != __last)
|
||||
{
|
||||
__states.pop_back();
|
||||
break;
|
||||
}
|
||||
if (!__matched || __highest_j < __s.__current_ - __s.__first_)
|
||||
{
|
||||
__highest_j = __s.__current_ - __s.__first_;
|
||||
@ -5930,8 +5973,10 @@ regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
|
||||
const basic_regex<_CharT, _Traits>& __e,
|
||||
regex_constants::match_flag_type __flags = regex_constants::match_default)
|
||||
{
|
||||
bool __r = _VSTD::regex_search(__first, __last, __m, __e,
|
||||
__flags | regex_constants::match_continuous);
|
||||
bool __r = _VSTD::regex_search(
|
||||
__first, __last, __m, __e,
|
||||
__flags | regex_constants::match_continuous |
|
||||
regex_constants::__full_match);
|
||||
if (__r)
|
||||
{
|
||||
__r = !__m.suffix().matched;
|
||||
@ -6142,7 +6187,7 @@ private:
|
||||
_Position __position_;
|
||||
const value_type* __result_;
|
||||
value_type __suffix_;
|
||||
ptrdiff_t _N_;
|
||||
ptrdiff_t __n_;
|
||||
vector<int> __subs_;
|
||||
|
||||
public:
|
||||
@ -6225,10 +6270,10 @@ public:
|
||||
private:
|
||||
void __init(_BidirectionalIterator __a, _BidirectionalIterator __b);
|
||||
void __establish_result () {
|
||||
if (__subs_[_N_] == -1)
|
||||
if (__subs_[__n_] == -1)
|
||||
__result_ = &__position_->prefix();
|
||||
else
|
||||
__result_ = &(*__position_)[__subs_[_N_]];
|
||||
__result_ = &(*__position_)[__subs_[__n_]];
|
||||
}
|
||||
};
|
||||
|
||||
@ -6237,7 +6282,7 @@ regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
|
||||
regex_token_iterator()
|
||||
: __result_(nullptr),
|
||||
__suffix_(),
|
||||
_N_(0)
|
||||
__n_(0)
|
||||
{
|
||||
}
|
||||
|
||||
@ -6248,7 +6293,7 @@ regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
|
||||
{
|
||||
if (__position_ != _Position())
|
||||
__establish_result ();
|
||||
else if (__subs_[_N_] == -1)
|
||||
else if (__subs_[__n_] == -1)
|
||||
{
|
||||
__suffix_.matched = true;
|
||||
__suffix_.first = __a;
|
||||
@ -6265,7 +6310,7 @@ regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
|
||||
const regex_type& __re, int __submatch,
|
||||
regex_constants::match_flag_type __m)
|
||||
: __position_(__a, __b, __re, __m),
|
||||
_N_(0),
|
||||
__n_(0),
|
||||
__subs_(1, __submatch)
|
||||
{
|
||||
__init(__a, __b);
|
||||
@ -6277,7 +6322,7 @@ regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
|
||||
const regex_type& __re, const vector<int>& __submatches,
|
||||
regex_constants::match_flag_type __m)
|
||||
: __position_(__a, __b, __re, __m),
|
||||
_N_(0),
|
||||
__n_(0),
|
||||
__subs_(__submatches)
|
||||
{
|
||||
__init(__a, __b);
|
||||
@ -6292,7 +6337,7 @@ regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
|
||||
initializer_list<int> __submatches,
|
||||
regex_constants::match_flag_type __m)
|
||||
: __position_(__a, __b, __re, __m),
|
||||
_N_(0),
|
||||
__n_(0),
|
||||
__subs_(__submatches)
|
||||
{
|
||||
__init(__a, __b);
|
||||
@ -6308,7 +6353,7 @@ regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
|
||||
const int (&__submatches)[_Np],
|
||||
regex_constants::match_flag_type __m)
|
||||
: __position_(__a, __b, __re, __m),
|
||||
_N_(0),
|
||||
__n_(0),
|
||||
__subs_(__submatches, __submatches + _Np)
|
||||
{
|
||||
__init(__a, __b);
|
||||
@ -6320,7 +6365,7 @@ regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
|
||||
: __position_(__x.__position_),
|
||||
__result_(__x.__result_),
|
||||
__suffix_(__x.__suffix_),
|
||||
_N_(__x._N_),
|
||||
__n_(__x.__n_),
|
||||
__subs_(__x.__subs_)
|
||||
{
|
||||
if (__x.__result_ == &__x.__suffix_)
|
||||
@ -6342,7 +6387,7 @@ regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
|
||||
else
|
||||
__result_ = __x.__result_;
|
||||
__suffix_ = __x.__suffix_;
|
||||
_N_ = __x._N_;
|
||||
__n_ = __x.__n_;
|
||||
__subs_ = __x.__subs_;
|
||||
|
||||
if ( __result_ != nullptr && __result_ != &__suffix_ )
|
||||
@ -6365,7 +6410,7 @@ regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
|
||||
return false;
|
||||
if (__result_ == &__suffix_ || __x.__result_ == &__x.__suffix_)
|
||||
return false;
|
||||
return __position_ == __x.__position_ && _N_ == __x._N_ &&
|
||||
return __position_ == __x.__position_ && __n_ == __x.__n_ &&
|
||||
__subs_ == __x.__subs_;
|
||||
}
|
||||
|
||||
@ -6376,14 +6421,14 @@ regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
|
||||
_Position __prev = __position_;
|
||||
if (__result_ == &__suffix_)
|
||||
__result_ = nullptr;
|
||||
else if (_N_ + 1 < __subs_.size())
|
||||
else if (static_cast<size_t>(__n_ + 1) < __subs_.size())
|
||||
{
|
||||
++_N_;
|
||||
++__n_;
|
||||
__establish_result();
|
||||
}
|
||||
else
|
||||
{
|
||||
_N_ = 0;
|
||||
__n_ = 0;
|
||||
++__position_;
|
||||
if (__position_ != _Position())
|
||||
__establish_result();
|
||||
|
@ -115,7 +115,7 @@ template <class OuterA1, class OuterA2, class... InnerAllocs>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_ADVANCED_SFINAE)
|
||||
#if !defined(_LIBCPP_CXX03_LANG)
|
||||
|
||||
// scoped_allocator_adaptor
|
||||
|
||||
@ -498,8 +498,58 @@ public:
|
||||
template <class _Tp, class... _Args>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
void construct(_Tp* __p, _Args&& ...__args)
|
||||
{__construct(__uses_alloc_ctor<_Tp, inner_allocator_type, _Args...>(),
|
||||
{__construct(__uses_alloc_ctor<_Tp, inner_allocator_type&, _Args...>(),
|
||||
__p, _VSTD::forward<_Args>(__args)...);}
|
||||
|
||||
template <class _T1, class _T2, class... _Args1, class... _Args2>
|
||||
void construct(pair<_T1, _T2>* __p, piecewise_construct_t,
|
||||
tuple<_Args1...> __x, tuple<_Args2...> __y)
|
||||
{
|
||||
typedef __outermost<outer_allocator_type> _OM;
|
||||
allocator_traits<typename _OM::type>::construct(
|
||||
_OM()(outer_allocator()), __p, piecewise_construct
|
||||
, __transform_tuple(
|
||||
typename __uses_alloc_ctor<
|
||||
_T1, inner_allocator_type&, _Args1...
|
||||
>::type()
|
||||
, _VSTD::move(__x)
|
||||
, typename __make_tuple_indices<sizeof...(_Args1)>::type{}
|
||||
)
|
||||
, __transform_tuple(
|
||||
typename __uses_alloc_ctor<
|
||||
_T2, inner_allocator_type&, _Args2...
|
||||
>::type()
|
||||
, _VSTD::move(__y)
|
||||
, typename __make_tuple_indices<sizeof...(_Args2)>::type{}
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
template <class _T1, class _T2>
|
||||
void construct(pair<_T1, _T2>* __p)
|
||||
{ construct(__p, piecewise_construct, tuple<>{}, tuple<>{}); }
|
||||
|
||||
template <class _T1, class _T2, class _Up, class _Vp>
|
||||
void construct(pair<_T1, _T2>* __p, _Up&& __x, _Vp&& __y) {
|
||||
construct(__p, piecewise_construct,
|
||||
_VSTD::forward_as_tuple(_VSTD::forward<_Up>(__x)),
|
||||
_VSTD::forward_as_tuple(_VSTD::forward<_Vp>(__y)));
|
||||
}
|
||||
|
||||
template <class _T1, class _T2, class _Up, class _Vp>
|
||||
void construct(pair<_T1, _T2>* __p, const pair<_Up, _Vp>& __x) {
|
||||
construct(__p, piecewise_construct,
|
||||
_VSTD::forward_as_tuple(__x.first),
|
||||
_VSTD::forward_as_tuple(__x.second));
|
||||
}
|
||||
|
||||
template <class _T1, class _T2, class _Up, class _Vp>
|
||||
void construct(pair<_T1, _T2>* __p, pair<_Up, _Vp>&& __x) {
|
||||
construct(__p, piecewise_construct,
|
||||
_VSTD::forward_as_tuple(_VSTD::forward<_Up>(__x.first)),
|
||||
_VSTD::forward_as_tuple(_VSTD::forward<_Vp>(__x.second)));
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
void destroy(_Tp* __p)
|
||||
@ -515,6 +565,7 @@ public:
|
||||
|
||||
private:
|
||||
|
||||
|
||||
template <class _OuterA2,
|
||||
class = typename enable_if<
|
||||
is_constructible<outer_allocator_type, _OuterA2>::value
|
||||
@ -545,9 +596,7 @@ private:
|
||||
allocator_traits<typename _OM::type>::construct
|
||||
(
|
||||
_OM()(outer_allocator()),
|
||||
__p,
|
||||
allocator_arg,
|
||||
inner_allocator(),
|
||||
__p, allocator_arg, inner_allocator(),
|
||||
_VSTD::forward<_Args>(__args)...
|
||||
);
|
||||
}
|
||||
@ -566,6 +615,36 @@ private:
|
||||
);
|
||||
}
|
||||
|
||||
template <class ..._Args, size_t ..._Idx>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
tuple<_Args&&...>
|
||||
__transform_tuple(integral_constant<int, 0>, tuple<_Args...>&& __t,
|
||||
__tuple_indices<_Idx...>)
|
||||
{
|
||||
return _VSTD::forward_as_tuple(_VSTD::get<_Idx>(_VSTD::move(__t))...);
|
||||
}
|
||||
|
||||
template <class ..._Args, size_t ..._Idx>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
tuple<allocator_arg_t, inner_allocator_type&, _Args&&...>
|
||||
__transform_tuple(integral_constant<int, 1>, tuple<_Args...> && __t,
|
||||
__tuple_indices<_Idx...>)
|
||||
{
|
||||
using _Tup = tuple<allocator_arg_t, inner_allocator_type&, _Args&&...>;
|
||||
return _Tup(allocator_arg, inner_allocator(),
|
||||
_VSTD::get<_Idx>(_VSTD::move(__t))...);
|
||||
}
|
||||
|
||||
template <class ..._Args, size_t ..._Idx>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
tuple<_Args&&..., inner_allocator_type&>
|
||||
__transform_tuple(integral_constant<int, 2>, tuple<_Args...> && __t,
|
||||
__tuple_indices<_Idx...>)
|
||||
{
|
||||
using _Tup = tuple<_Args&&..., inner_allocator_type&>;
|
||||
return _Tup(_VSTD::get<_Idx>(_VSTD::move(__t))..., inner_allocator());
|
||||
}
|
||||
|
||||
template <class...> friend class __scoped_allocator_storage;
|
||||
};
|
||||
|
||||
@ -597,7 +676,7 @@ operator!=(const scoped_allocator_adaptor<_OuterA1, _InnerAllocs...>& __a,
|
||||
return !(__a == __b);
|
||||
}
|
||||
|
||||
#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_ADVANCED_SFINAE)
|
||||
#endif // !defined(_LIBCPP_CXX03_LANG)
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
|
@ -672,7 +672,7 @@ public:
|
||||
template <typename _K2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
|
||||
count(const _K2& __k) {return __tree_.__count_unique(__k);}
|
||||
count(const _K2& __k) const {return __tree_.__count_unique(__k);}
|
||||
#endif
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
iterator lower_bound(const key_type& __k)
|
||||
@ -1023,7 +1023,7 @@ public:
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
iterator insert(const_iterator __p, value_type&& __v)
|
||||
{return __tree_.__insert_multi(_VSTD::move(__v));}
|
||||
{return __tree_.__insert_multi(__p, _VSTD::move(__v));}
|
||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
template <class _InputIterator>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
|
@ -207,7 +207,9 @@ private:
|
||||
|
||||
public:
|
||||
// 27.8.1.1 Constructors:
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
explicit basic_stringbuf(ios_base::openmode __wch = ios_base::in | ios_base::out);
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
explicit basic_stringbuf(const string_type& __s,
|
||||
ios_base::openmode __wch = ios_base::in | ios_base::out);
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
@ -231,12 +233,12 @@ protected:
|
||||
virtual int_type overflow (int_type __c = traits_type::eof());
|
||||
virtual pos_type seekoff(off_type __off, ios_base::seekdir __way,
|
||||
ios_base::openmode __wch = ios_base::in | ios_base::out);
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
virtual pos_type seekpos(pos_type __sp,
|
||||
ios_base::openmode __wch = ios_base::in | ios_base::out);
|
||||
};
|
||||
|
||||
template <class _CharT, class _Traits, class _Allocator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_stringbuf<_CharT, _Traits, _Allocator>::basic_stringbuf(ios_base::openmode __wch)
|
||||
: __hm_(0),
|
||||
__mode_(__wch)
|
||||
@ -245,7 +247,6 @@ basic_stringbuf<_CharT, _Traits, _Allocator>::basic_stringbuf(ios_base::openmode
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits, class _Allocator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_stringbuf<_CharT, _Traits, _Allocator>::basic_stringbuf(const string_type& __s,
|
||||
ios_base::openmode __wch)
|
||||
: __hm_(0),
|
||||
@ -607,7 +608,6 @@ basic_stringbuf<_CharT, _Traits, _Allocator>::seekoff(off_type __off,
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits, class _Allocator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
typename basic_stringbuf<_CharT, _Traits, _Allocator>::pos_type
|
||||
basic_stringbuf<_CharT, _Traits, _Allocator>::seekpos(pos_type __sp,
|
||||
ios_base::openmode __wch)
|
||||
@ -636,25 +636,31 @@ private:
|
||||
|
||||
public:
|
||||
// 27.8.2.1 Constructors:
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
explicit basic_istringstream(ios_base::openmode __wch = ios_base::in);
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
explicit basic_istringstream(const string_type& __s,
|
||||
ios_base::openmode __wch = ios_base::in);
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_istringstream(basic_istringstream&& __rhs);
|
||||
|
||||
// 27.8.2.2 Assign and swap:
|
||||
basic_istringstream& operator=(basic_istringstream&& __rhs);
|
||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void swap(basic_istringstream& __rhs);
|
||||
|
||||
// 27.8.2.3 Members:
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const;
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
string_type str() const;
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void str(const string_type& __s);
|
||||
};
|
||||
|
||||
template <class _CharT, class _Traits, class _Allocator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_istringstream<_CharT, _Traits, _Allocator>::basic_istringstream(ios_base::openmode __wch)
|
||||
: basic_istream<_CharT, _Traits>(&__sb_),
|
||||
__sb_(__wch | ios_base::in)
|
||||
@ -662,7 +668,6 @@ basic_istringstream<_CharT, _Traits, _Allocator>::basic_istringstream(ios_base::
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits, class _Allocator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_istringstream<_CharT, _Traits, _Allocator>::basic_istringstream(const string_type& __s,
|
||||
ios_base::openmode __wch)
|
||||
: basic_istream<_CharT, _Traits>(&__sb_),
|
||||
@ -673,7 +678,6 @@ basic_istringstream<_CharT, _Traits, _Allocator>::basic_istringstream(const stri
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
|
||||
template <class _CharT, class _Traits, class _Allocator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_istringstream<_CharT, _Traits, _Allocator>::basic_istringstream(basic_istringstream&& __rhs)
|
||||
: basic_istream<_CharT, _Traits>(_VSTD::move(__rhs)),
|
||||
__sb_(_VSTD::move(__rhs.__sb_))
|
||||
@ -693,9 +697,7 @@ basic_istringstream<_CharT, _Traits, _Allocator>::operator=(basic_istringstream&
|
||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
|
||||
template <class _CharT, class _Traits, class _Allocator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
basic_istringstream<_CharT, _Traits, _Allocator>::swap(basic_istringstream& __rhs)
|
||||
void basic_istringstream<_CharT, _Traits, _Allocator>::swap(basic_istringstream& __rhs)
|
||||
{
|
||||
basic_istream<char_type, traits_type>::swap(__rhs);
|
||||
__sb_.swap(__rhs.__sb_);
|
||||
@ -711,7 +713,6 @@ swap(basic_istringstream<_CharT, _Traits, _Allocator>& __x,
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits, class _Allocator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_stringbuf<_CharT, _Traits, _Allocator>*
|
||||
basic_istringstream<_CharT, _Traits, _Allocator>::rdbuf() const
|
||||
{
|
||||
@ -719,7 +720,6 @@ basic_istringstream<_CharT, _Traits, _Allocator>::rdbuf() const
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits, class _Allocator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_string<_CharT, _Traits, _Allocator>
|
||||
basic_istringstream<_CharT, _Traits, _Allocator>::str() const
|
||||
{
|
||||
@ -727,9 +727,7 @@ basic_istringstream<_CharT, _Traits, _Allocator>::str() const
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits, class _Allocator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
basic_istringstream<_CharT, _Traits, _Allocator>::str(const string_type& __s)
|
||||
void basic_istringstream<_CharT, _Traits, _Allocator>::str(const string_type& __s)
|
||||
{
|
||||
__sb_.str(__s);
|
||||
}
|
||||
@ -755,25 +753,31 @@ private:
|
||||
|
||||
public:
|
||||
// 27.8.2.1 Constructors:
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
explicit basic_ostringstream(ios_base::openmode __wch = ios_base::out);
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
explicit basic_ostringstream(const string_type& __s,
|
||||
ios_base::openmode __wch = ios_base::out);
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_ostringstream(basic_ostringstream&& __rhs);
|
||||
|
||||
// 27.8.2.2 Assign and swap:
|
||||
basic_ostringstream& operator=(basic_ostringstream&& __rhs);
|
||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void swap(basic_ostringstream& __rhs);
|
||||
|
||||
// 27.8.2.3 Members:
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const;
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
string_type str() const;
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void str(const string_type& __s);
|
||||
};
|
||||
|
||||
template <class _CharT, class _Traits, class _Allocator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_ostringstream<_CharT, _Traits, _Allocator>::basic_ostringstream(ios_base::openmode __wch)
|
||||
: basic_ostream<_CharT, _Traits>(&__sb_),
|
||||
__sb_(__wch | ios_base::out)
|
||||
@ -781,7 +785,6 @@ basic_ostringstream<_CharT, _Traits, _Allocator>::basic_ostringstream(ios_base::
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits, class _Allocator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_ostringstream<_CharT, _Traits, _Allocator>::basic_ostringstream(const string_type& __s,
|
||||
ios_base::openmode __wch)
|
||||
: basic_ostream<_CharT, _Traits>(&__sb_),
|
||||
@ -792,7 +795,6 @@ basic_ostringstream<_CharT, _Traits, _Allocator>::basic_ostringstream(const stri
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
|
||||
template <class _CharT, class _Traits, class _Allocator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_ostringstream<_CharT, _Traits, _Allocator>::basic_ostringstream(basic_ostringstream&& __rhs)
|
||||
: basic_ostream<_CharT, _Traits>(_VSTD::move(__rhs)),
|
||||
__sb_(_VSTD::move(__rhs.__sb_))
|
||||
@ -812,7 +814,6 @@ basic_ostringstream<_CharT, _Traits, _Allocator>::operator=(basic_ostringstream&
|
||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
|
||||
template <class _CharT, class _Traits, class _Allocator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
basic_ostringstream<_CharT, _Traits, _Allocator>::swap(basic_ostringstream& __rhs)
|
||||
{
|
||||
@ -830,7 +831,6 @@ swap(basic_ostringstream<_CharT, _Traits, _Allocator>& __x,
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits, class _Allocator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_stringbuf<_CharT, _Traits, _Allocator>*
|
||||
basic_ostringstream<_CharT, _Traits, _Allocator>::rdbuf() const
|
||||
{
|
||||
@ -838,7 +838,6 @@ basic_ostringstream<_CharT, _Traits, _Allocator>::rdbuf() const
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits, class _Allocator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_string<_CharT, _Traits, _Allocator>
|
||||
basic_ostringstream<_CharT, _Traits, _Allocator>::str() const
|
||||
{
|
||||
@ -846,7 +845,6 @@ basic_ostringstream<_CharT, _Traits, _Allocator>::str() const
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits, class _Allocator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
basic_ostringstream<_CharT, _Traits, _Allocator>::str(const string_type& __s)
|
||||
{
|
||||
@ -874,25 +872,31 @@ private:
|
||||
|
||||
public:
|
||||
// 27.8.2.1 Constructors:
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
explicit basic_stringstream(ios_base::openmode __wch = ios_base::in | ios_base::out);
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
explicit basic_stringstream(const string_type& __s,
|
||||
ios_base::openmode __wch = ios_base::in | ios_base::out);
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_stringstream(basic_stringstream&& __rhs);
|
||||
|
||||
// 27.8.2.2 Assign and swap:
|
||||
basic_stringstream& operator=(basic_stringstream&& __rhs);
|
||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void swap(basic_stringstream& __rhs);
|
||||
|
||||
// 27.8.2.3 Members:
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const;
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
string_type str() const;
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void str(const string_type& __s);
|
||||
};
|
||||
|
||||
template <class _CharT, class _Traits, class _Allocator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_stringstream<_CharT, _Traits, _Allocator>::basic_stringstream(ios_base::openmode __wch)
|
||||
: basic_iostream<_CharT, _Traits>(&__sb_),
|
||||
__sb_(__wch)
|
||||
@ -900,7 +904,6 @@ basic_stringstream<_CharT, _Traits, _Allocator>::basic_stringstream(ios_base::op
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits, class _Allocator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_stringstream<_CharT, _Traits, _Allocator>::basic_stringstream(const string_type& __s,
|
||||
ios_base::openmode __wch)
|
||||
: basic_iostream<_CharT, _Traits>(&__sb_),
|
||||
@ -911,7 +914,6 @@ basic_stringstream<_CharT, _Traits, _Allocator>::basic_stringstream(const string
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
|
||||
template <class _CharT, class _Traits, class _Allocator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_stringstream<_CharT, _Traits, _Allocator>::basic_stringstream(basic_stringstream&& __rhs)
|
||||
: basic_iostream<_CharT, _Traits>(_VSTD::move(__rhs)),
|
||||
__sb_(_VSTD::move(__rhs.__sb_))
|
||||
@ -931,7 +933,6 @@ basic_stringstream<_CharT, _Traits, _Allocator>::operator=(basic_stringstream&&
|
||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
|
||||
template <class _CharT, class _Traits, class _Allocator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
basic_stringstream<_CharT, _Traits, _Allocator>::swap(basic_stringstream& __rhs)
|
||||
{
|
||||
@ -949,7 +950,6 @@ swap(basic_stringstream<_CharT, _Traits, _Allocator>& __x,
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits, class _Allocator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_stringbuf<_CharT, _Traits, _Allocator>*
|
||||
basic_stringstream<_CharT, _Traits, _Allocator>::rdbuf() const
|
||||
{
|
||||
@ -957,7 +957,6 @@ basic_stringstream<_CharT, _Traits, _Allocator>::rdbuf() const
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits, class _Allocator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_string<_CharT, _Traits, _Allocator>
|
||||
basic_stringstream<_CharT, _Traits, _Allocator>::str() const
|
||||
{
|
||||
@ -965,7 +964,6 @@ basic_stringstream<_CharT, _Traits, _Allocator>::str() const
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits, class _Allocator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
basic_stringstream<_CharT, _Traits, _Allocator>::str(const string_type& __s)
|
||||
{
|
||||
|
@ -55,7 +55,7 @@ public:
|
||||
|
||||
void push(const value_type& x);
|
||||
void push(value_type&& x);
|
||||
template <class... Args> void emplace(Args&&... args);
|
||||
template <class... Args> reference emplace(Args&&... args);
|
||||
void pop();
|
||||
|
||||
void swap(stack& c) noexcept(is_nothrow_swappable_v<Container>)
|
||||
@ -199,8 +199,8 @@ public:
|
||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
||||
template <class... _Args>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
void emplace(_Args&&... __args)
|
||||
{c.emplace_back(_VSTD::forward<_Args>(__args)...);}
|
||||
reference emplace(_Args&&... __args)
|
||||
{ return c.emplace_back(_VSTD::forward<_Args>(__args)...);}
|
||||
#endif // _LIBCPP_HAS_NO_VARIADICS
|
||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
|
@ -45,22 +45,31 @@ public:
|
||||
#include <__config>
|
||||
#include <exception>
|
||||
#include <iosfwd> // for string forward decl
|
||||
#ifdef _LIBCPP_NO_EXCEPTIONS
|
||||
#include <cstdlib>
|
||||
#endif
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP___REFSTRING
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
class _LIBCPP_HIDDEN __libcpp_refstring {
|
||||
#ifdef __clang__
|
||||
const char *__imp_ __attribute__((__unused__)); // only clang emits a warning
|
||||
#else
|
||||
const char *__imp_;
|
||||
#endif
|
||||
|
||||
class _LIBCPP_HIDDEN __libcpp_refstring
|
||||
{
|
||||
const char* __imp_;
|
||||
|
||||
bool __uses_refcount() const;
|
||||
public:
|
||||
explicit __libcpp_refstring(const char* msg);
|
||||
__libcpp_refstring(const __libcpp_refstring& s) _NOEXCEPT;
|
||||
__libcpp_refstring& operator=(const __libcpp_refstring& s) _NOEXCEPT;
|
||||
~__libcpp_refstring();
|
||||
|
||||
const char* c_str() const _NOEXCEPT {return __imp_;}
|
||||
};
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
#endif
|
||||
|
||||
namespace std // purposefully not using versioning namespace
|
||||
{
|
||||
@ -171,4 +180,99 @@ public:
|
||||
|
||||
} // std
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
// in the dylib
|
||||
_LIBCPP_NORETURN _LIBCPP_FUNC_VIS void __throw_runtime_error(const char*);
|
||||
|
||||
_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
|
||||
void __throw_logic_error(const char*__msg)
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw logic_error(__msg);
|
||||
#else
|
||||
((void)__msg);
|
||||
_VSTD::abort();
|
||||
#endif
|
||||
}
|
||||
|
||||
_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
|
||||
void __throw_domain_error(const char*__msg)
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw domain_error(__msg);
|
||||
#else
|
||||
((void)__msg);
|
||||
_VSTD::abort();
|
||||
#endif
|
||||
}
|
||||
|
||||
_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
|
||||
void __throw_invalid_argument(const char*__msg)
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw invalid_argument(__msg);
|
||||
#else
|
||||
((void)__msg);
|
||||
_VSTD::abort();
|
||||
#endif
|
||||
}
|
||||
|
||||
_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
|
||||
void __throw_length_error(const char*__msg)
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw length_error(__msg);
|
||||
#else
|
||||
((void)__msg);
|
||||
_VSTD::abort();
|
||||
#endif
|
||||
}
|
||||
|
||||
_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
|
||||
void __throw_out_of_range(const char*__msg)
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw out_of_range(__msg);
|
||||
#else
|
||||
((void)__msg);
|
||||
_VSTD::abort();
|
||||
#endif
|
||||
}
|
||||
|
||||
_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
|
||||
void __throw_range_error(const char*__msg)
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw range_error(__msg);
|
||||
#else
|
||||
((void)__msg);
|
||||
_VSTD::abort();
|
||||
#endif
|
||||
}
|
||||
|
||||
_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
|
||||
void __throw_overflow_error(const char*__msg)
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw overflow_error(__msg);
|
||||
#else
|
||||
((void)__msg);
|
||||
_VSTD::abort();
|
||||
#endif
|
||||
}
|
||||
|
||||
_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
|
||||
void __throw_underflow_error(const char*__msg)
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw underflow_error(__msg);
|
||||
#else
|
||||
((void)__msg);
|
||||
_VSTD::abort();
|
||||
#endif
|
||||
}
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP_STDEXCEPT
|
||||
|
121
include/stdint.h
Normal file
121
include/stdint.h
Normal file
@ -0,0 +1,121 @@
|
||||
// -*- C++ -*-
|
||||
//===---------------------------- stdint.h --------------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef _LIBCPP_STDINT_H
|
||||
#define _LIBCPP_STDINT_H
|
||||
|
||||
/*
|
||||
stdint.h synopsis
|
||||
|
||||
Macros:
|
||||
|
||||
INT8_MIN
|
||||
INT16_MIN
|
||||
INT32_MIN
|
||||
INT64_MIN
|
||||
|
||||
INT8_MAX
|
||||
INT16_MAX
|
||||
INT32_MAX
|
||||
INT64_MAX
|
||||
|
||||
UINT8_MAX
|
||||
UINT16_MAX
|
||||
UINT32_MAX
|
||||
UINT64_MAX
|
||||
|
||||
INT_LEAST8_MIN
|
||||
INT_LEAST16_MIN
|
||||
INT_LEAST32_MIN
|
||||
INT_LEAST64_MIN
|
||||
|
||||
INT_LEAST8_MAX
|
||||
INT_LEAST16_MAX
|
||||
INT_LEAST32_MAX
|
||||
INT_LEAST64_MAX
|
||||
|
||||
UINT_LEAST8_MAX
|
||||
UINT_LEAST16_MAX
|
||||
UINT_LEAST32_MAX
|
||||
UINT_LEAST64_MAX
|
||||
|
||||
INT_FAST8_MIN
|
||||
INT_FAST16_MIN
|
||||
INT_FAST32_MIN
|
||||
INT_FAST64_MIN
|
||||
|
||||
INT_FAST8_MAX
|
||||
INT_FAST16_MAX
|
||||
INT_FAST32_MAX
|
||||
INT_FAST64_MAX
|
||||
|
||||
UINT_FAST8_MAX
|
||||
UINT_FAST16_MAX
|
||||
UINT_FAST32_MAX
|
||||
UINT_FAST64_MAX
|
||||
|
||||
INTPTR_MIN
|
||||
INTPTR_MAX
|
||||
UINTPTR_MAX
|
||||
|
||||
INTMAX_MIN
|
||||
INTMAX_MAX
|
||||
|
||||
UINTMAX_MAX
|
||||
|
||||
PTRDIFF_MIN
|
||||
PTRDIFF_MAX
|
||||
|
||||
SIG_ATOMIC_MIN
|
||||
SIG_ATOMIC_MAX
|
||||
|
||||
SIZE_MAX
|
||||
|
||||
WCHAR_MIN
|
||||
WCHAR_MAX
|
||||
|
||||
WINT_MIN
|
||||
WINT_MAX
|
||||
|
||||
INT8_C(value)
|
||||
INT16_C(value)
|
||||
INT32_C(value)
|
||||
INT64_C(value)
|
||||
|
||||
UINT8_C(value)
|
||||
UINT16_C(value)
|
||||
UINT32_C(value)
|
||||
UINT64_C(value)
|
||||
|
||||
INTMAX_C(value)
|
||||
UINTMAX_C(value)
|
||||
|
||||
*/
|
||||
|
||||
#include <__config>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
/* C99 stdlib (e.g. glibc < 2.18) does not provide macros needed
|
||||
for C++11 unless __STDC_LIMIT_MACROS and __STDC_CONSTANT_MACROS
|
||||
are defined
|
||||
*/
|
||||
#if defined(__cplusplus) && !defined(__STDC_LIMIT_MACROS)
|
||||
# define __STDC_LIMIT_MACROS
|
||||
#endif
|
||||
#if defined(__cplusplus) && !defined(__STDC_CONSTANT_MACROS)
|
||||
# define __STDC_CONSTANT_MACROS
|
||||
#endif
|
||||
|
||||
#include_next <stdint.h>
|
||||
|
||||
#endif // _LIBCPP_STDINT_H
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user