Revert "Revert "Update aosp/master libcxx rebase to r263688""
This reverts commit 1d4a1edbc7.
Change-Id: I2909937fe582f2c5552bc86e7f4d2d5cff0de0aa
This commit is contained in:
176
CMakeLists.txt
176
CMakeLists.txt
@@ -12,13 +12,6 @@ if(POLICY CMP0022)
|
|||||||
cmake_policy(SET CMP0022 NEW) # Required when interacting with LLVM and Clang
|
cmake_policy(SET CMP0022 NEW) # Required when interacting with LLVM and Clang
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
project(libcxx CXX C)
|
|
||||||
|
|
||||||
set(PACKAGE_NAME libcxx)
|
|
||||||
set(PACKAGE_VERSION trunk-svn)
|
|
||||||
set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
|
|
||||||
set(PACKAGE_BUGREPORT "llvm-bugs@lists.llvm.org")
|
|
||||||
|
|
||||||
# Add path for custom modules
|
# Add path for custom modules
|
||||||
set(CMAKE_MODULE_PATH
|
set(CMAKE_MODULE_PATH
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/cmake"
|
"${CMAKE_CURRENT_SOURCE_DIR}/cmake"
|
||||||
@@ -26,6 +19,25 @@ set(CMAKE_MODULE_PATH
|
|||||||
${CMAKE_MODULE_PATH}
|
${CMAKE_MODULE_PATH}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Find the LLVM sources and simulate LLVM CMake options.
|
||||||
|
include(HandleOutOfTreeLLVM)
|
||||||
|
|
||||||
|
if (LIBCXX_BUILT_STANDALONE)
|
||||||
|
project(libcxx CXX C)
|
||||||
|
|
||||||
|
set(PACKAGE_NAME libcxx)
|
||||||
|
set(PACKAGE_VERSION trunk-svn)
|
||||||
|
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.")
|
||||||
|
endif()
|
||||||
|
|
||||||
# Require out of source build.
|
# Require out of source build.
|
||||||
include(MacroEnsureOutOfSourceBuild)
|
include(MacroEnsureOutOfSourceBuild)
|
||||||
MACRO_ENSURE_OUT_OF_SOURCE_BUILD(
|
MACRO_ENSURE_OUT_OF_SOURCE_BUILD(
|
||||||
@@ -33,16 +45,6 @@ MACRO_ENSURE_OUT_OF_SOURCE_BUILD(
|
|||||||
build directory and run 'cmake /path/to/${PROJECT_NAME} [options]' there."
|
build directory and run 'cmake /path/to/${PROJECT_NAME} [options]' there."
|
||||||
)
|
)
|
||||||
|
|
||||||
# Find the LLVM sources and simulate LLVM CMake options.
|
|
||||||
include(HandleOutOfTreeLLVM)
|
|
||||||
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.")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
|
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
# Setup CMake Options
|
# Setup CMake Options
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
@@ -50,12 +52,17 @@ endif()
|
|||||||
# Basic options ---------------------------------------------------------------
|
# Basic options ---------------------------------------------------------------
|
||||||
option(LIBCXX_ENABLE_ASSERTIONS "Enable assertions independent of build mode." ON)
|
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_SHARED "Build libc++ as a shared library." ON)
|
||||||
|
option(LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY "Build libc++experimental.a" ON)
|
||||||
option(LIBCXX_INCLUDE_TESTS "Build the libc++ tests." ${LLVM_INCLUDE_TESTS})
|
option(LIBCXX_INCLUDE_TESTS "Build the libc++ tests." ${LLVM_INCLUDE_TESTS})
|
||||||
|
option(LIBCXX_INCLUDE_DOCS "Build the libc++ documentation." ${LLVM_INCLUDE_DOCS})
|
||||||
set(LIBCXX_LIBDIR_SUFFIX "${LLVM_LIBDIR_SUFFIX}" CACHE STRING
|
set(LIBCXX_LIBDIR_SUFFIX "${LLVM_LIBDIR_SUFFIX}" CACHE STRING
|
||||||
"Define suffix of library directory name (32/64)")
|
"Define suffix of library directory name (32/64)")
|
||||||
option(LIBCXX_INSTALL_HEADERS "Install the libc++ headers." ON)
|
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_SUPPORT_HEADERS "Install libc++ support headers." ON)
|
||||||
|
option(LIBCXX_INSTALL_EXPERIMENTAL_LIBRARY "Install libc++experimental.a" OFF)
|
||||||
|
set(LIBCXX_ABI_VERSION 1 CACHE STRING "ABI version of libc++.")
|
||||||
|
option(LIBCXX_ABI_UNSTABLE "Unstable ABI of libc++." OFF)
|
||||||
|
|
||||||
# ABI Library options ---------------------------------------------------------
|
# ABI Library options ---------------------------------------------------------
|
||||||
set(LIBCXX_CXX_ABI "${LIBCXX_CXX_ABI}" CACHE STRING
|
set(LIBCXX_CXX_ABI "${LIBCXX_CXX_ABI}" CACHE STRING
|
||||||
@@ -63,8 +70,41 @@ set(LIBCXX_CXX_ABI "${LIBCXX_CXX_ABI}" CACHE STRING
|
|||||||
set(CXXABIS none libcxxabi libcxxrt libstdc++ libsupc++)
|
set(CXXABIS none libcxxabi libcxxrt libstdc++ libsupc++)
|
||||||
set_property(CACHE LIBCXX_CXX_ABI PROPERTY STRINGS ;${CXXABIS})
|
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")
|
||||||
|
set(LIBCXX_CXX_ABI_LIBNAME "libcxxabi")
|
||||||
|
set(LIBCXX_CXX_ABI_INCLUDE_PATHS "${CMAKE_SOURCE_DIR}/projects/libcxxabi/include")
|
||||||
|
set(LIBCXX_CXX_ABI_INTREE 1)
|
||||||
|
else ()
|
||||||
|
set(LIBCXX_CXX_ABI_LIBNAME "none")
|
||||||
|
endif ()
|
||||||
|
else ()
|
||||||
|
set(LIBCXX_CXX_ABI_LIBNAME "${LIBCXX_CXX_ABI}")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
# Use a static copy of the ABI library when linking libc++. This option
|
||||||
|
# cannot be used with LIBCXX_ENABLE_ABI_LINKER_SCRIPT.
|
||||||
option(LIBCXX_ENABLE_STATIC_ABI_LIBRARY "Statically link the ABI library" OFF)
|
option(LIBCXX_ENABLE_STATIC_ABI_LIBRARY "Statically link the ABI library" OFF)
|
||||||
|
|
||||||
|
# Generate and install a linker script inplace of libc++.so. The linker script
|
||||||
|
# will link libc++ to the correct ABI library. This option is on by default
|
||||||
|
# On UNIX platforms other than Apple unless 'LIBCXX_ENABLE_STATIC_ABI_LIBRARY'
|
||||||
|
# is on. This option is also disabled when the ABI library is not specified
|
||||||
|
# or is specified to be "none".
|
||||||
|
set(ENABLE_LINKER_SCRIPT_DEFAULT_VALUE OFF)
|
||||||
|
if (LLVM_HAVE_LINK_VERSION_SCRIPT AND NOT LIBCXX_ENABLE_STATIC_ABI_LIBRARY
|
||||||
|
AND NOT LIBCXX_CXX_ABI_LIBNAME STREQUAL "none"
|
||||||
|
AND PYTHONINTERP_FOUND
|
||||||
|
AND LIBCXX_ENABLE_SHARED)
|
||||||
|
set(ENABLE_LINKER_SCRIPT_DEFAULT_VALUE ON)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
option(LIBCXX_ENABLE_ABI_LINKER_SCRIPT
|
||||||
|
"Use and install a linker script for the given ABI library"
|
||||||
|
${ENABLE_LINKER_SCRIPT_DEFAULT_VALUE})
|
||||||
|
|
||||||
# Build libc++abi with libunwind. We need this option to determine whether to
|
# Build libc++abi with libunwind. We need this option to determine whether to
|
||||||
# link with libunwind or libgcc_s while running the test cases.
|
# link with libunwind or libgcc_s while running the test cases.
|
||||||
option(LIBCXXABI_USE_LLVM_UNWINDER "Build and use the LLVM unwinder." OFF)
|
option(LIBCXXABI_USE_LLVM_UNWINDER "Build and use the LLVM unwinder." OFF)
|
||||||
@@ -84,16 +124,43 @@ option(LIBCXX_ENABLE_THREADS "Build libc++ with support for threads." ON)
|
|||||||
option(LIBCXX_ENABLE_THREAD_UNSAFE_C_FUNCTIONS "Build libc++ with support for thread-unsafe C functions" ON)
|
option(LIBCXX_ENABLE_THREAD_UNSAFE_C_FUNCTIONS "Build libc++ with support for thread-unsafe C functions" ON)
|
||||||
option(LIBCXX_ENABLE_MONOTONIC_CLOCK
|
option(LIBCXX_ENABLE_MONOTONIC_CLOCK
|
||||||
"Build libc++ with support for a monotonic clock.
|
"Build libc++ with support for a monotonic clock.
|
||||||
This option may only be used when LIBCXX_ENABLE_THREADS=OFF." ON)
|
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)
|
||||||
|
|
||||||
# Misc options ----------------------------------------------------------------
|
# Misc options ----------------------------------------------------------------
|
||||||
option(LIBCXX_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
|
# FIXME: Turn -pedantic back ON. It is currently off because it warns
|
||||||
|
# about #include_next which is used everywhere.
|
||||||
|
option(LIBCXX_ENABLE_PEDANTIC "Compile with pedantic enabled." OFF)
|
||||||
option(LIBCXX_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
|
option(LIBCXX_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
|
||||||
|
|
||||||
option(LIBCXX_GENERATE_COVERAGE "Enable generating code coverage." OFF)
|
option(LIBCXX_GENERATE_COVERAGE "Enable generating code coverage." OFF)
|
||||||
set(LIBCXX_COVERAGE_LIBRARY "" CACHE STRING
|
set(LIBCXX_COVERAGE_LIBRARY "" CACHE STRING
|
||||||
"The Profile-rt library used to build with code coverage")
|
"The Profile-rt library used to build with code coverage")
|
||||||
|
|
||||||
|
# Don't allow a user to accidentally overwrite the system libc++ installation on Darwin.
|
||||||
|
# If the user specifies -DCMAKE_INSTALL_PREFIX=/usr the install rules for libc++
|
||||||
|
# will not be generated and a warning will be issued.
|
||||||
|
option(LIBCXX_OVERRIDE_DARWIN_INSTALL "Enable overwriting darwins libc++ installation." OFF)
|
||||||
|
mark_as_advanced(LIBCXX_OVERRIDE_DARWIN_INSTALL) # Don't show this option by default.
|
||||||
|
|
||||||
|
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin" AND NOT LIBCXX_OVERRIDE_DARWIN_INSTALL)
|
||||||
|
if ("${CMAKE_INSTALL_PREFIX}" STREQUAL "/usr")
|
||||||
|
message(WARNING "Disabling libc++ install rules because installation would "
|
||||||
|
"overwrite the systems installation. Configure with "
|
||||||
|
"-DLIBCXX_OVERRIDE_DARWIN_INSTALL=ON to suppress this behaviour.")
|
||||||
|
mark_as_advanced(CLEAR LIBCXX_OVERRIDE_DARWIN_INSTALL) # Show the override option.
|
||||||
|
set(LIBCXX_INSTALL_HEADERS OFF)
|
||||||
|
set(LIBCXX_INSTALL_LIBRARY OFF)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(LIBCXX_CONFIGURE_IDE_DEFAULT OFF)
|
||||||
|
if (XCODE OR MSVC_IDE)
|
||||||
|
set(LIBCXX_CONFIGURE_IDE_DEFAULT ON)
|
||||||
|
endif()
|
||||||
|
option(LIBCXX_CONFIGURE_IDE "Configure libcxx for use within an IDE"
|
||||||
|
${LIBCXX_CONFIGURE_IDE_DEFAULT})
|
||||||
|
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
# Check option configurations
|
# Check option configurations
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
@@ -130,6 +197,29 @@ if (LIBCXX_ENABLE_STATIC_ABI_LIBRARY)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (LIBCXX_ENABLE_ABI_LINKER_SCRIPT)
|
||||||
|
if (APPLE)
|
||||||
|
message(FATAL_ERROR "LIBCXX_ENABLE_ABI_LINKER_SCRIPT cannot be used on APPLE targets")
|
||||||
|
endif()
|
||||||
|
if (NOT PYTHONINTERP_FOUND)
|
||||||
|
message(FATAL_ERROR "LIBCXX_ENABLE_ABI_LINKER_SCRIPT requires python but it was not found.")
|
||||||
|
endif()
|
||||||
|
if (NOT LIBCXX_ENABLE_SHARED)
|
||||||
|
message(FATAL_ERROR "LIBCXX_ENABLE_ABI_LINKER_SCRIPT is only available for shared library builds.")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (LIBCXX_ENABLE_STATIC_ABI_LIBRARY AND LIBCXX_ENABLE_ABI_LINKER_SCRIPT)
|
||||||
|
message(FATAL_ERROR "Conflicting options given.
|
||||||
|
LIBCXX_ENABLE_STATIC_ABI_LIBRARY cannot be specified with
|
||||||
|
LIBCXX_ENABLE_ABI_LINKER_SCRIPT")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (LIBCXX_HAS_MUSL_LIBC AND NOT LIBCXX_INSTALL_SUPPORT_HEADERS)
|
||||||
|
message(FATAL_ERROR "LIBCXX_INSTALL_SUPPORT_HEADERS can not be turned off"
|
||||||
|
"when building for Musl with LIBCXX_HAS_MUSL_LIBC.")
|
||||||
|
endif()
|
||||||
|
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
# Configure System
|
# Configure System
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
@@ -166,7 +256,7 @@ string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
|
|||||||
# Setup Compiler Flags
|
# Setup Compiler Flags
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
|
|
||||||
include(HandleLibCXXABI) # Steup the ABI library flags
|
include(HandleLibCXXABI) # Setup the ABI library flags
|
||||||
|
|
||||||
# Include macros for adding and removing libc++ flags.
|
# Include macros for adding and removing libc++ flags.
|
||||||
include(HandleLibcxxFlags)
|
include(HandleLibcxxFlags)
|
||||||
@@ -175,6 +265,11 @@ include(HandleLibcxxFlags)
|
|||||||
remove_flags(-DNDEBUG -UNDEBUG -D_DEBUG
|
remove_flags(-DNDEBUG -UNDEBUG -D_DEBUG
|
||||||
-stdlib=libc++ -stdlib=libstdc++ -lc++abi -m32)
|
-stdlib=libc++ -stdlib=libstdc++ -lc++abi -m32)
|
||||||
|
|
||||||
|
# FIXME(EricWF): See the FIXME on LIBCXX_ENABLE_PEDANTIC.
|
||||||
|
# Remove the -pedantic flag and -Wno-pedantic and -pedantic-errors
|
||||||
|
# so they don't get transformed into -Wno and -errors respectivly.
|
||||||
|
remove_flags(-Wno-pedantic -pedantic-errors -pedantic)
|
||||||
|
|
||||||
# Required flags ==============================================================
|
# Required flags ==============================================================
|
||||||
add_compile_flags_if_supported(-std=c++11)
|
add_compile_flags_if_supported(-std=c++11)
|
||||||
if (NOT MSVC AND NOT LIBCXX_SUPPORTS_STD_EQ_CXX11_FLAG)
|
if (NOT MSVC AND NOT LIBCXX_SUPPORTS_STD_EQ_CXX11_FLAG)
|
||||||
@@ -239,15 +334,8 @@ endif()
|
|||||||
|
|
||||||
# Feature flags ===============================================================
|
# Feature flags ===============================================================
|
||||||
define_if(MSVC -D_CRT_SECURE_NO_WARNINGS)
|
define_if(MSVC -D_CRT_SECURE_NO_WARNINGS)
|
||||||
define_if_not(LIBCXX_ENABLE_GLOBAL_FILESYSTEM_NAMESPACE -D_LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE)
|
|
||||||
define_if_not(LIBCXX_ENABLE_STDIN -D_LIBCPP_HAS_NO_STDIN)
|
|
||||||
define_if_not(LIBCXX_ENABLE_STDOUT -D_LIBCPP_HAS_NO_STDOUT)
|
|
||||||
define_if_not(LIBCXX_ENABLE_THREADS -D_LIBCPP_HAS_NO_THREADS)
|
|
||||||
define_if_not(LIBCXX_ENABLE_MONOTONIC_CLOCK -D_LIBCPP_HAS_NO_MONOTONIC_CLOCK)
|
|
||||||
define_if_not(LIBCXX_ENABLE_THREAD_UNSAFE_C_FUNCTIONS -D_LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS)
|
|
||||||
|
|
||||||
|
# Sanitizer flags =============================================================
|
||||||
# Sanitizer flags
|
|
||||||
|
|
||||||
# Configure for sanitizers. If LIBCXX_BUILT_STANDALONE then we have to do
|
# Configure for sanitizers. If LIBCXX_BUILT_STANDALONE then we have to do
|
||||||
# the flag translation ourselves. Othewise LLVM's CMakeList.txt will handle it.
|
# the flag translation ourselves. Othewise LLVM's CMakeList.txt will handle it.
|
||||||
@@ -282,12 +370,42 @@ if (LIBCXX_BUILT_STANDALONE)
|
|||||||
message(WARNING "LLVM_USE_SANITIZER is not supported on this platform.")
|
message(WARNING "LLVM_USE_SANITIZER is not supported on this platform.")
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# Configuration file flags =====================================================
|
||||||
|
if (NOT LIBCXX_ABI_VERSION EQUAL "1")
|
||||||
|
config_define(${LIBCXX_ABI_VERSION} _LIBCPP_ABI_VERSION)
|
||||||
|
endif()
|
||||||
|
config_define_if(LIBCXX_ABI_UNSTABLE _LIBCPP_ABI_UNSTABLE)
|
||||||
|
|
||||||
|
config_define_if_not(LIBCXX_ENABLE_GLOBAL_FILESYSTEM_NAMESPACE _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE)
|
||||||
|
config_define_if_not(LIBCXX_ENABLE_STDIN _LIBCPP_HAS_NO_STDIN)
|
||||||
|
config_define_if_not(LIBCXX_ENABLE_STDOUT _LIBCPP_HAS_NO_STDOUT)
|
||||||
|
config_define_if_not(LIBCXX_ENABLE_THREADS _LIBCPP_HAS_NO_THREADS)
|
||||||
|
config_define_if_not(LIBCXX_ENABLE_MONOTONIC_CLOCK _LIBCPP_HAS_NO_MONOTONIC_CLOCK)
|
||||||
|
config_define_if_not(LIBCXX_ENABLE_THREAD_UNSAFE_C_FUNCTIONS _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS)
|
||||||
|
|
||||||
|
config_define_if(LIBCXX_HAS_MUSL_LIBC _LIBCPP_HAS_MUSL_LIBC)
|
||||||
|
|
||||||
|
if (LIBCXX_NEEDS_SITE_CONFIG)
|
||||||
|
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")
|
||||||
|
endif()
|
||||||
|
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
# Setup Source Code And Tests
|
# Setup Source Code And Tests
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
include_directories(include)
|
include_directories(include)
|
||||||
add_subdirectory(include)
|
add_subdirectory(include)
|
||||||
add_subdirectory(lib)
|
add_subdirectory(lib)
|
||||||
|
|
||||||
if (LIBCXX_INCLUDE_TESTS)
|
if (LIBCXX_INCLUDE_TESTS)
|
||||||
add_subdirectory(test)
|
add_subdirectory(test)
|
||||||
endif()
|
endif()
|
||||||
|
if (LIBCXX_INCLUDE_DOCS)
|
||||||
|
add_subdirectory(docs)
|
||||||
|
endif()
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ Full text of the relevant licenses is included below.
|
|||||||
University of Illinois/NCSA
|
University of Illinois/NCSA
|
||||||
Open Source License
|
Open Source License
|
||||||
|
|
||||||
Copyright (c) 2009-2015 by the contributors listed in CREDITS.TXT
|
Copyright (c) 2009-2016 by the contributors listed in CREDITS.TXT
|
||||||
|
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
|
|||||||
56
Makefile
56
Makefile
@@ -1,56 +0,0 @@
|
|||||||
##
|
|
||||||
# libc++ Makefile
|
|
||||||
##
|
|
||||||
|
|
||||||
SRCDIRS = .
|
|
||||||
DESTDIR = $(DSTROOT)
|
|
||||||
|
|
||||||
OBJROOT=.
|
|
||||||
SYMROOT=.
|
|
||||||
export TRIPLE=-apple-
|
|
||||||
|
|
||||||
ifeq (,$(RC_INDIGO))
|
|
||||||
INSTALL_PREFIX=""
|
|
||||||
else
|
|
||||||
INSTALL_PREFIX="$(SDKROOT)"
|
|
||||||
endif
|
|
||||||
INSTALL_DIR=$(DSTROOT)/$(INSTALL_PREFIX)
|
|
||||||
|
|
||||||
.PHONY: help installsrc clean installheaders install
|
|
||||||
|
|
||||||
help::
|
|
||||||
@echo "Use make install DSTROOT=<destination>"
|
|
||||||
|
|
||||||
installsrc:: $(SRCROOT)
|
|
||||||
|
|
||||||
ditto $(SRCDIRS)/include $(SRCROOT)/include
|
|
||||||
ditto $(SRCDIRS)/lib $(SRCROOT)/lib
|
|
||||||
ditto $(SRCDIRS)/src $(SRCROOT)/src
|
|
||||||
ditto $(SRCDIRS)/Makefile $(SRCROOT)/Makefile
|
|
||||||
|
|
||||||
clean::
|
|
||||||
|
|
||||||
# The installheaders target is used by clang's runtime/libcxx makefile.
|
|
||||||
installheaders::
|
|
||||||
mkdir -p $(HEADER_DIR)/c++/v1/ext
|
|
||||||
(cd $(SRCDIRS)/include && \
|
|
||||||
tar cf - --exclude=".*" --exclude=support \
|
|
||||||
--exclude=CMakeLists.txt *) | \
|
|
||||||
(cd $(HEADER_DIR)/c++/v1 && tar xf -)
|
|
||||||
chmod 755 $(HEADER_DIR)/c++/v1
|
|
||||||
chmod 644 $(HEADER_DIR)/c++/v1/*
|
|
||||||
chmod 755 $(HEADER_DIR)/c++/v1/ext
|
|
||||||
chmod 644 $(HEADER_DIR)/c++/v1/ext/*
|
|
||||||
chmod 755 $(HEADER_DIR)/c++/v1/experimental
|
|
||||||
chmod 644 $(HEADER_DIR)/c++/v1/experimental/*
|
|
||||||
|
|
||||||
install::
|
|
||||||
|
|
||||||
cd lib && ./buildit
|
|
||||||
ditto lib/libc++.1.dylib $(SYMROOT)/usr/lib/libc++.1.dylib
|
|
||||||
cd lib && dsymutil -o $(SYMROOT)/libc++.1.dylib.dSYM \
|
|
||||||
$(SYMROOT)/usr/lib/libc++.1.dylib
|
|
||||||
mkdir -p $(INSTALL_DIR)/usr/lib
|
|
||||||
strip -S -o $(INSTALL_DIR)/usr/lib/libc++.1.dylib \
|
|
||||||
$(SYMROOT)/usr/lib/libc++.1.dylib
|
|
||||||
cd $(INSTALL_DIR)/usr/lib && ln -s libc++.1.dylib libc++.dylib
|
|
||||||
21
TODO.TXT
21
TODO.TXT
@@ -1,5 +1,15 @@
|
|||||||
This is meant to be a general place to list things that should be done "someday"
|
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
|
ABI Related Tasks
|
||||||
=================
|
=================
|
||||||
* Explicitly manage and verify symbols exported from the dylib.
|
* Explicitly manage and verify symbols exported from the dylib.
|
||||||
@@ -21,18 +31,18 @@ CXX Runtime Library Tasks
|
|||||||
|
|
||||||
Atomic Related Tasks
|
Atomic Related Tasks
|
||||||
====================
|
====================
|
||||||
* Support <atomic> in C++03 (needed for internal use).
|
* 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.
|
* Audit use of libatomic builtins in <atomic> with GCC.
|
||||||
* future should use <atomic> for synchronization.
|
* future should use <atomic> for synchronization.
|
||||||
* call_once should use <atomic> for synchronization.
|
|
||||||
* Audit shared_ptr use of <atomic>
|
|
||||||
|
|
||||||
Test Suite Tasks
|
Test Suite Tasks
|
||||||
================
|
================
|
||||||
* Get test suite passing in C++03.
|
|
||||||
* Move all libc++ specific tests from test/std into test/libcxx.
|
* Move all libc++ specific tests from test/std into test/libcxx.
|
||||||
* Improve how LIT handles compiler warnings.
|
* Improve how LIT handles compiler warnings.
|
||||||
* Improve the quality and portability of the locale test data.
|
* Improve the quality and portability of the locale test data.
|
||||||
|
* Convert failure tests to use Clang Verify.
|
||||||
|
|
||||||
Misc Tasks
|
Misc Tasks
|
||||||
==========
|
==========
|
||||||
@@ -42,8 +52,5 @@ Misc Tasks
|
|||||||
* Look at basic_string's move assignment operator, re LWG 2063 and POCMA
|
* Look at basic_string's move assignment operator, re LWG 2063 and POCMA
|
||||||
* libc++ is missing try_emplace
|
* libc++ is missing try_emplace
|
||||||
* Put a static_assert in std::allocator to deny const/volatile types (LWG 2447)
|
* Put a static_assert in std::allocator to deny const/volatile types (LWG 2447)
|
||||||
* Investigate the effect of using __decltype instead of __typeof__ to provide
|
|
||||||
decltype in C++03. What code could be broken by this change?
|
|
||||||
* Convert failure tests to use Clang Verify.
|
|
||||||
* Document support (or lack of) for C++11 libraries in C++03.
|
* Document support (or lack of) for C++11 libraries in C++03.
|
||||||
* Document supported compilers.
|
* Document supported compilers.
|
||||||
|
|||||||
41
cmake/Modules/CheckLibcxxAtomic.cmake
Normal file
41
cmake/Modules/CheckLibcxxAtomic.cmake
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
INCLUDE(CheckCXXSourceCompiles)
|
||||||
|
|
||||||
|
# Sometimes linking against libatomic is required for atomic ops, if
|
||||||
|
# the platform doesn't support lock-free atomics.
|
||||||
|
#
|
||||||
|
# We could modify LLVM's CheckAtomic module and have it check for 64-bit
|
||||||
|
# atomics instead. However, we would like to avoid careless uses of 64-bit
|
||||||
|
# atomics inside LLVM over time on 32-bit platforms.
|
||||||
|
|
||||||
|
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")
|
||||||
|
if (${LIBCXX_GCC_TOOLCHAIN})
|
||||||
|
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} --gcc-toolchain=${LIBCXX_GCC_TOOLCHAIN}")
|
||||||
|
endif()
|
||||||
|
check_cxx_source_compiles("
|
||||||
|
#include <cstdint>
|
||||||
|
#include <atomic>
|
||||||
|
std::atomic<uintptr_t> x;
|
||||||
|
std::atomic<uintmax_t> y;
|
||||||
|
int main() {
|
||||||
|
return x + y;
|
||||||
|
}
|
||||||
|
" ${varname})
|
||||||
|
set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
|
||||||
|
endfunction(check_cxx_atomics)
|
||||||
|
|
||||||
|
check_cxx_atomics(LIBCXX_HAVE_CXX_ATOMICS_WITHOUT_LIB)
|
||||||
|
# If not, check if the library exists, and atomics work with it.
|
||||||
|
if(NOT LIBCXX_HAVE_CXX_ATOMICS_WITHOUT_LIB)
|
||||||
|
check_library_exists(atomic __atomic_fetch_add_8 "" LIBCXX_HAS_ATOMIC_LIB)
|
||||||
|
if(LIBCXX_HAS_ATOMIC_LIB)
|
||||||
|
list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic")
|
||||||
|
check_cxx_atomics(LIBCXX_HAVE_CXX_ATOMICS_WITH_LIB)
|
||||||
|
if (NOT LIBCXX_HAVE_CXX_ATOMICS_WITH_LIB)
|
||||||
|
message(WARNING "Host compiler must support std::atomic!")
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
message(WARNING "Host compiler appears to require libatomic, but cannot find it.")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
@@ -41,10 +41,13 @@ macro(setup_abi_lib abidefines abilib abifiles abidirs)
|
|||||||
file(COPY "${incpath}/${fpath}"
|
file(COPY "${incpath}/${fpath}"
|
||||||
DESTINATION "${CMAKE_BINARY_DIR}/include/${dstdir}"
|
DESTINATION "${CMAKE_BINARY_DIR}/include/${dstdir}"
|
||||||
)
|
)
|
||||||
|
if (LIBCXX_INSTALL_HEADERS)
|
||||||
install(FILES "${CMAKE_BINARY_DIR}/include/${fpath}"
|
install(FILES "${CMAKE_BINARY_DIR}/include/${fpath}"
|
||||||
DESTINATION include/c++/v1/${dstdir}
|
DESTINATION include/c++/v1/${dstdir}
|
||||||
|
COMPONENT libcxx
|
||||||
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
|
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
|
||||||
)
|
)
|
||||||
|
endif()
|
||||||
list(APPEND abilib_headers "${CMAKE_BINARY_DIR}/include/${fpath}")
|
list(APPEND abilib_headers "${CMAKE_BINARY_DIR}/include/${fpath}")
|
||||||
endif()
|
endif()
|
||||||
endforeach()
|
endforeach()
|
||||||
@@ -58,19 +61,6 @@ macro(setup_abi_lib abidefines abilib abifiles abidirs)
|
|||||||
|
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
# 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")
|
|
||||||
set(LIBCXX_CXX_ABI_LIBNAME "libcxxabi")
|
|
||||||
set(LIBCXX_CXX_ABI_INCLUDE_PATHS "${CMAKE_SOURCE_DIR}/projects/libcxxabi/include")
|
|
||||||
set(LIBCXX_CXX_ABI_INTREE 1)
|
|
||||||
else ()
|
|
||||||
set(LIBCXX_CXX_ABI_LIBNAME "none")
|
|
||||||
endif ()
|
|
||||||
else ()
|
|
||||||
set(LIBCXX_CXX_ABI_LIBNAME "${LIBCXX_CXX_ABI}")
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
# Configure based on the selected ABI library.
|
# Configure based on the selected ABI library.
|
||||||
if ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libstdc++" OR
|
if ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libstdc++" OR
|
||||||
|
|||||||
@@ -35,6 +35,11 @@ macro(remove_flags)
|
|||||||
endforeach()
|
endforeach()
|
||||||
endmacro(remove_flags)
|
endmacro(remove_flags)
|
||||||
|
|
||||||
|
macro(check_flag_supported flag)
|
||||||
|
mangle_name("${flag}" flagname)
|
||||||
|
check_cxx_compiler_flag("${flag}" "LIBCXX_SUPPORTS_${flagname}_FLAG")
|
||||||
|
endmacro()
|
||||||
|
|
||||||
# Add a macro definition if condition is true.
|
# Add a macro definition if condition is true.
|
||||||
macro(define_if condition def)
|
macro(define_if condition def)
|
||||||
if (${condition})
|
if (${condition})
|
||||||
@@ -49,6 +54,28 @@ macro(define_if_not condition def)
|
|||||||
endif()
|
endif()
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
|
# Add a macro definition to the __config_site file if the specified condition
|
||||||
|
# is 'true'. Note that '-D${def}' is not added. Instead it is expected that
|
||||||
|
# the build include the '__config_site' header.
|
||||||
|
macro(config_define_if condition def)
|
||||||
|
if (${condition})
|
||||||
|
set(${def} ON)
|
||||||
|
set(LIBCXX_NEEDS_SITE_CONFIG ON)
|
||||||
|
endif()
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
macro(config_define_if_not condition def)
|
||||||
|
if (NOT ${condition})
|
||||||
|
set(${def} ON)
|
||||||
|
set(LIBCXX_NEEDS_SITE_CONFIG ON)
|
||||||
|
endif()
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
macro(config_define value def)
|
||||||
|
set(${def} ${value})
|
||||||
|
set(LIBCXX_NEEDS_SITE_CONFIG ON)
|
||||||
|
endmacro()
|
||||||
|
|
||||||
# Add a specified list of flags to both 'LIBCXX_COMPILE_FLAGS' and
|
# Add a specified list of flags to both 'LIBCXX_COMPILE_FLAGS' and
|
||||||
# 'LIBCXX_LINK_FLAGS'.
|
# 'LIBCXX_LINK_FLAGS'.
|
||||||
macro(add_flags)
|
macro(add_flags)
|
||||||
|
|||||||
@@ -35,18 +35,22 @@ macro(find_llvm_parts)
|
|||||||
set(LLVM_INCLUDE_DIR ${INCLUDE_DIR} CACHE PATH "Path to llvm/include")
|
set(LLVM_INCLUDE_DIR ${INCLUDE_DIR} CACHE PATH "Path to llvm/include")
|
||||||
set(LLVM_BINARY_DIR ${LLVM_OBJ_ROOT} CACHE PATH "Path to LLVM build tree")
|
set(LLVM_BINARY_DIR ${LLVM_OBJ_ROOT} CACHE PATH "Path to LLVM build tree")
|
||||||
set(LLVM_MAIN_SRC_DIR ${MAIN_SRC_DIR} CACHE PATH "Path to LLVM source tree")
|
set(LLVM_MAIN_SRC_DIR ${MAIN_SRC_DIR} CACHE PATH "Path to LLVM source tree")
|
||||||
set(LLVM_CMAKE_PATH "${LLVM_BINARY_DIR}/share/llvm/cmake")
|
set(LLVM_CMAKE_PATH "${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}/cmake/llvm")
|
||||||
else()
|
else()
|
||||||
set(LLVM_FOUND OFF)
|
set(LLVM_FOUND OFF)
|
||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (NOT EXISTS ${LLVM_MAIN_SRC_DIR})
|
if (NOT EXISTS ${LLVM_MAIN_SRC_DIR})
|
||||||
message(FATAL_ERROR "Not found: ${LLVM_MAIN_SRC_DIR}")
|
set(LLVM_FOUND OFF)
|
||||||
|
message(WARNING "Not found: ${LLVM_MAIN_SRC_DIR}")
|
||||||
|
return()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(NOT EXISTS ${LLVM_CMAKE_PATH})
|
if(NOT EXISTS ${LLVM_CMAKE_PATH})
|
||||||
message(FATAL_ERROR "Not found: ${LLVM_CMAKE_PATH}")
|
set(LLVM_FOUND OFF)
|
||||||
|
message(WARNING "Not found: ${LLVM_CMAKE_PATH}")
|
||||||
|
return()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_PATH}")
|
list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_PATH}")
|
||||||
@@ -73,6 +77,12 @@ if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
|
|||||||
if (NOT DEFINED LLVM_INCLUDE_TESTS)
|
if (NOT DEFINED LLVM_INCLUDE_TESTS)
|
||||||
set(LLVM_INCLUDE_TESTS ${LLVM_FOUND})
|
set(LLVM_INCLUDE_TESTS ${LLVM_FOUND})
|
||||||
endif()
|
endif()
|
||||||
|
if (NOT DEFINED LLVM_INCLUDE_DOCS)
|
||||||
|
set(LLVM_INCLUDE_DOCS ${LLVM_FOUND})
|
||||||
|
endif()
|
||||||
|
if (NOT DEFINED LLVM_ENABLE_SPHINX)
|
||||||
|
set(LLVM_ENABLE_SPHINX OFF)
|
||||||
|
endif()
|
||||||
|
|
||||||
# Required LIT Configuration ------------------------------------------------
|
# Required LIT Configuration ------------------------------------------------
|
||||||
# Define the default arguments to use with 'lit', and an option for the user
|
# Define the default arguments to use with 'lit', and an option for the user
|
||||||
@@ -91,6 +101,38 @@ if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
|
|||||||
set(cmake_3_2_USES_TERMINAL USES_TERMINAL)
|
set(cmake_3_2_USES_TERMINAL USES_TERMINAL)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# 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)
|
||||||
|
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)
|
||||||
|
|
||||||
# Add LLVM Functions --------------------------------------------------------
|
# Add LLVM Functions --------------------------------------------------------
|
||||||
include(AddLLVM OPTIONAL)
|
include(AddLLVM OPTIONAL)
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
include(CheckLibraryExists)
|
include(CheckLibraryExists)
|
||||||
include(CheckCXXCompilerFlag)
|
include(CheckCXXCompilerFlag)
|
||||||
|
include(CheckLibcxxAtomic)
|
||||||
|
|
||||||
# Check compiler flags
|
# Check compiler flags
|
||||||
|
|
||||||
@@ -13,8 +14,7 @@ check_cxx_compiler_flag(/GR- LIBCXX_HAS_NO_GR_FLAG)
|
|||||||
|
|
||||||
# Check libraries
|
# Check libraries
|
||||||
check_library_exists(pthread pthread_create "" LIBCXX_HAS_PTHREAD_LIB)
|
check_library_exists(pthread pthread_create "" LIBCXX_HAS_PTHREAD_LIB)
|
||||||
check_library_exists(c printf "" LIBCXX_HAS_C_LIB)
|
check_library_exists(c fopen "" LIBCXX_HAS_C_LIB)
|
||||||
check_library_exists(m ccos "" LIBCXX_HAS_M_LIB)
|
check_library_exists(m ccos "" LIBCXX_HAS_M_LIB)
|
||||||
check_library_exists(rt clock_gettime "" LIBCXX_HAS_RT_LIB)
|
check_library_exists(rt clock_gettime "" LIBCXX_HAS_RT_LIB)
|
||||||
check_library_exists(gcc_s __gcc_personality_v0 "" LIBCXX_HAS_GCC_S_LIB)
|
check_library_exists(gcc_s __gcc_personality_v0 "" LIBCXX_HAS_GCC_S_LIB)
|
||||||
|
|
||||||
|
|||||||
338
docs/BuildingLibcxx.rst
Normal file
338
docs/BuildingLibcxx.rst
Normal file
@@ -0,0 +1,338 @@
|
|||||||
|
|
||||||
|
===============
|
||||||
|
Building libc++
|
||||||
|
===============
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:local:
|
||||||
|
|
||||||
|
.. _build instructions:
|
||||||
|
|
||||||
|
Getting Started
|
||||||
|
===============
|
||||||
|
|
||||||
|
On Mac OS 10.7 (Lion) and later, the easiest way to get this library is to install
|
||||||
|
Xcode 4.2 or later. However if you want to install tip-of-trunk from here
|
||||||
|
(getting the bleeding edge), read on.
|
||||||
|
|
||||||
|
The basic steps needed to build libc++ are:
|
||||||
|
|
||||||
|
#. Checkout LLVM:
|
||||||
|
|
||||||
|
* ``cd where-you-want-llvm-to-live``
|
||||||
|
* ``svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm``
|
||||||
|
|
||||||
|
#. Checkout libc++:
|
||||||
|
|
||||||
|
* ``cd where-you-want-llvm-to-live``
|
||||||
|
* ``cd llvm/projects``
|
||||||
|
* ``svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx``
|
||||||
|
|
||||||
|
#. Checkout libc++abi:
|
||||||
|
|
||||||
|
* ``cd where-you-want-llvm-to-live``
|
||||||
|
* ``cd llvm/projects``
|
||||||
|
* ``svn co http://llvm.org/svn/llvm-project/libcxxabi/trunk libcxxabi``
|
||||||
|
|
||||||
|
#. Configure and build libc++ with libc++abi:
|
||||||
|
|
||||||
|
CMake is the only supported configuration system.
|
||||||
|
|
||||||
|
Clang is the preferred compiler when building and using libc++.
|
||||||
|
|
||||||
|
* ``cd where you want to build llvm``
|
||||||
|
* ``mkdir build``
|
||||||
|
* ``cd build``
|
||||||
|
* ``cmake -G <generator> [options] <path to llvm sources>``
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
Shared libraries for libc++ and libc++ abi should now be present in llvm/build/lib.
|
||||||
|
See :ref:`using an alternate libc++ installation <alternate libcxx>`
|
||||||
|
|
||||||
|
#. **Optional**: Install libc++ and libc++abi
|
||||||
|
|
||||||
|
If your system already provides a libc++ installation it is important to be
|
||||||
|
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
|
||||||
|
|
||||||
|
.. warning::
|
||||||
|
* Replacing your systems libc++ installation could render the system non-functional.
|
||||||
|
* Mac OS X will not boot without a valid copy of ``libc++.1.dylib`` in ``/usr/lib``.
|
||||||
|
|
||||||
|
|
||||||
|
The instructions are for building libc++ on
|
||||||
|
FreeBSD, Linux, or Mac using `libc++abi`_ as the C++ ABI library.
|
||||||
|
On Linux, it is also possible to use :ref:`libsupc++ <libsupcxx>` or libcxxrt.
|
||||||
|
|
||||||
|
It is sometimes beneficial to build outside of the LLVM tree. An out-of-tree
|
||||||
|
build would look like this:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
$ cd where-you-want-libcxx-to-live
|
||||||
|
$ # Check out llvm, libc++ and libc++abi.
|
||||||
|
$ ``svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm``
|
||||||
|
$ ``svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx``
|
||||||
|
$ ``svn co http://llvm.org/svn/llvm-project/libcxxabi/trunk libcxxabi``
|
||||||
|
$ cd where-you-want-to-build
|
||||||
|
$ mkdir build && cd build
|
||||||
|
$ export CC=clang CXX=clang++
|
||||||
|
$ cmake -DLLVM_PATH=path/to/llvm \
|
||||||
|
-DLIBCXX_CXX_ABI=libcxxabi \
|
||||||
|
-DLIBCXX_CXX_ABI_INCLUDE_PATHS=path/to/libcxxabi/include \
|
||||||
|
path/to/libcxx
|
||||||
|
$ make
|
||||||
|
$ make check-libcxx # optional
|
||||||
|
|
||||||
|
|
||||||
|
.. _`libc++abi`: http://libcxxabi.llvm.org/
|
||||||
|
|
||||||
|
|
||||||
|
.. _CMake Options:
|
||||||
|
|
||||||
|
CMake Options
|
||||||
|
=============
|
||||||
|
|
||||||
|
Here are some of the CMake variables that are used often, along with a
|
||||||
|
brief explanation and LLVM-specific notes. For full documentation, check the
|
||||||
|
CMake docs or execute ``cmake --help-variable VARIABLE_NAME``.
|
||||||
|
|
||||||
|
**CMAKE_BUILD_TYPE**:STRING
|
||||||
|
Sets the build type for ``make`` based generators. Possible values are
|
||||||
|
Release, Debug, RelWithDebInfo and MinSizeRel. On systems like Visual Studio
|
||||||
|
the user sets the build type with the IDE settings.
|
||||||
|
|
||||||
|
**CMAKE_INSTALL_PREFIX**:PATH
|
||||||
|
Path where LLVM will be installed if "make install" is invoked or the
|
||||||
|
"INSTALL" target is built.
|
||||||
|
|
||||||
|
**CMAKE_CXX_COMPILER**:STRING
|
||||||
|
The C++ compiler to use when building and testing libc++.
|
||||||
|
|
||||||
|
|
||||||
|
.. _libcxx-specific options:
|
||||||
|
|
||||||
|
libc++ specific options
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
.. option:: LIBCXX_INSTALL_LIBRARY:BOOL
|
||||||
|
|
||||||
|
**Default**: ``ON``
|
||||||
|
|
||||||
|
Toggle the installation of the library portion of libc++.
|
||||||
|
|
||||||
|
.. option:: LIBCXX_INSTALL_HEADERS:BOOL
|
||||||
|
|
||||||
|
**Default**: ``ON``
|
||||||
|
|
||||||
|
Toggle the installation of the libc++ headers.
|
||||||
|
|
||||||
|
.. option:: LIBCXX_ENABLE_ASSERTIONS:BOOL
|
||||||
|
|
||||||
|
**Default**: ``ON``
|
||||||
|
|
||||||
|
Build libc++ with assertions enabled.
|
||||||
|
|
||||||
|
.. option:: LIBCXX_BUILD_32_BITS:BOOL
|
||||||
|
|
||||||
|
**Default**: ``OFF``
|
||||||
|
|
||||||
|
Build libc++ as a 32 bit library. Also see :option:`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.
|
||||||
|
|
||||||
|
.. 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`.
|
||||||
|
|
||||||
|
|
||||||
|
.. _libc++experimental options:
|
||||||
|
|
||||||
|
libc++experimental Specific Options
|
||||||
|
------------------------------------
|
||||||
|
|
||||||
|
.. option:: LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY:BOOL
|
||||||
|
|
||||||
|
**Default**: ``ON``
|
||||||
|
|
||||||
|
Build and test libc++experimental.a.
|
||||||
|
|
||||||
|
.. option:: LIBCXX_INSTALL_EXPERIMENTAL_LIBRARY:BOOL
|
||||||
|
|
||||||
|
**Default**: ``OFF``
|
||||||
|
|
||||||
|
Install libc++experimental.a alongside libc++.
|
||||||
|
|
||||||
|
|
||||||
|
.. _ABI Library Specific Options:
|
||||||
|
|
||||||
|
ABI Library Specific Options
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
.. option:: LIBCXX_CXX_ABI:STRING
|
||||||
|
|
||||||
|
**Values**: ``none``, ``libcxxabi``, ``libcxxrt``, ``libstdc++``, ``libsupc++``.
|
||||||
|
|
||||||
|
Select the ABI library to build libc++ against.
|
||||||
|
|
||||||
|
.. option:: LIBCXX_CXX_ABI_INCLUDE_PATHS:PATHS
|
||||||
|
|
||||||
|
Provide additional search paths for the ABI library headers.
|
||||||
|
|
||||||
|
.. option:: LIBCXX_CXX_ABI_LIBRARY_PATH:PATH
|
||||||
|
|
||||||
|
Provide the path to the ABI library that libc++ should link against.
|
||||||
|
|
||||||
|
.. option:: LIBCXX_ENABLE_STATIC_ABI_LIBRARY:BOOL
|
||||||
|
|
||||||
|
**Default**: ``OFF``
|
||||||
|
|
||||||
|
If this option is enabled, libc++ will try and link the selected ABI library
|
||||||
|
statically.
|
||||||
|
|
||||||
|
.. option:: LIBCXX_ENABLE_ABI_LINKER_SCRIPT:BOOL
|
||||||
|
|
||||||
|
**Default**: ``ON`` by default on UNIX platforms other than Apple unless
|
||||||
|
'LIBCXX_ENABLE_STATIC_ABI_LIBRARY' is ON. Otherwise the default value is ``OFF``.
|
||||||
|
|
||||||
|
This option generate and installs a linker script as ``libc++.so`` which
|
||||||
|
links the correct ABI library.
|
||||||
|
|
||||||
|
.. option:: LIBCXXABI_USE_LLVM_UNWINDER:BOOL
|
||||||
|
|
||||||
|
**Default**: ``OFF``
|
||||||
|
|
||||||
|
Build and use the LLVM unwinder. Note: This option can only be used when
|
||||||
|
libc++abi is the C++ ABI library used.
|
||||||
|
|
||||||
|
|
||||||
|
libc++ Feature options
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
.. option:: LIBCXX_ENABLE_EXCEPTIONS:BOOL
|
||||||
|
|
||||||
|
**Default**: ``ON``
|
||||||
|
|
||||||
|
Build libc++ with exception support.
|
||||||
|
|
||||||
|
.. option:: LIBCXX_ENABLE_RTTI:BOOL
|
||||||
|
|
||||||
|
**Default**: ``ON``
|
||||||
|
|
||||||
|
Build libc++ with run time type information.
|
||||||
|
|
||||||
|
|
||||||
|
libc++ Feature options
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
The following options allow building libc++ for a different ABI version.
|
||||||
|
|
||||||
|
.. option:: LIBCXX_ABI_VERSION:STRING
|
||||||
|
|
||||||
|
**Default**: ``1``
|
||||||
|
|
||||||
|
Defines the target ABI version of libc++.
|
||||||
|
|
||||||
|
.. option:: LIBCXX_ABI_UNSTABLE:BOOL
|
||||||
|
|
||||||
|
**Default**: ``OFF``
|
||||||
|
|
||||||
|
Build the "unstable" ABI version of libc++. Includes all ABI changing features
|
||||||
|
on top of the current stable version.
|
||||||
|
|
||||||
|
.. _LLVM-specific variables:
|
||||||
|
|
||||||
|
LLVM-specific options
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
.. option:: LLVM_LIBDIR_SUFFIX:STRING
|
||||||
|
|
||||||
|
Extra suffix to append to the directory where libraries are to be
|
||||||
|
installed. On a 64-bit architecture, one could use ``-DLLVM_LIBDIR_SUFFIX=64``
|
||||||
|
to install libraries to ``/usr/lib64``.
|
||||||
|
|
||||||
|
.. option:: LLVM_BUILD_32_BITS:BOOL
|
||||||
|
|
||||||
|
Build 32-bits executables and libraries on 64-bits systems. This option is
|
||||||
|
available only on some 64-bits unix systems. Defaults to OFF.
|
||||||
|
|
||||||
|
.. option:: LLVM_LIT_ARGS:STRING
|
||||||
|
|
||||||
|
Arguments given to lit. ``make check`` and ``make clang-test`` are affected.
|
||||||
|
By default, ``'-sv --no-progress-bar'`` on Visual C++ and Xcode, ``'-sv'`` on
|
||||||
|
others.
|
||||||
|
|
||||||
|
|
||||||
|
Using Alternate ABI libraries
|
||||||
|
=============================
|
||||||
|
|
||||||
|
|
||||||
|
.. _libsupcxx:
|
||||||
|
|
||||||
|
Using libsupc++ on Linux
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
You will need libstdc++ in order to provide libsupc++.
|
||||||
|
|
||||||
|
Figure out where the libsupc++ headers are on your system. On Ubuntu this
|
||||||
|
is ``/usr/include/c++/<version>`` and ``/usr/include/c++/<version>/<target-triple>``
|
||||||
|
|
||||||
|
You can also figure this out by running
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
$ echo | g++ -Wp,-v -x c++ - -fsyntax-only
|
||||||
|
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
|
||||||
|
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../x86_64-linux-gnu/include"
|
||||||
|
#include "..." search starts here:
|
||||||
|
#include <...> search starts here:
|
||||||
|
/usr/include/c++/4.7
|
||||||
|
/usr/include/c++/4.7/x86_64-linux-gnu
|
||||||
|
/usr/include/c++/4.7/backward
|
||||||
|
/usr/lib/gcc/x86_64-linux-gnu/4.7/include
|
||||||
|
/usr/local/include
|
||||||
|
/usr/lib/gcc/x86_64-linux-gnu/4.7/include-fixed
|
||||||
|
/usr/include/x86_64-linux-gnu
|
||||||
|
/usr/include
|
||||||
|
End of search list.
|
||||||
|
|
||||||
|
Note that the first two entries happen to be what we are looking for. This
|
||||||
|
may not be correct on other platforms.
|
||||||
|
|
||||||
|
We can now run CMake:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
$ CC=clang CXX=clang++ cmake -G "Unix Makefiles" \
|
||||||
|
-DLIBCXX_CXX_ABI=libstdc++ \
|
||||||
|
-DLIBCXX_CXX_ABI_INCLUDE_PATHS="/usr/include/c++/4.7/;/usr/include/c++/4.7/x86_64-linux-gnu/" \
|
||||||
|
-DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr \
|
||||||
|
<libc++-source-dir>
|
||||||
|
|
||||||
|
|
||||||
|
You can also substitute ``-DLIBCXX_CXX_ABI=libsupc++``
|
||||||
|
above, which will cause the library to be linked to libsupc++ instead
|
||||||
|
of libstdc++, but this is only recommended if you know that you will
|
||||||
|
never need to link against libstdc++ in the same executable as libc++.
|
||||||
|
GCC ships libsupc++ separately but only as a static library. If a
|
||||||
|
program also needs to link against libstdc++, it will provide its
|
||||||
|
own copy of libsupc++ and this can lead to subtle problems.
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
$ make cxx
|
||||||
|
$ make install
|
||||||
|
|
||||||
|
You can now run clang with -stdlib=libc++.
|
||||||
9
docs/CMakeLists.txt
Normal file
9
docs/CMakeLists.txt
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
|
||||||
|
if (LLVM_ENABLE_SPHINX)
|
||||||
|
if (SPHINX_FOUND)
|
||||||
|
include(AddSphinxTarget)
|
||||||
|
if (${SPHINX_OUTPUT_HTML})
|
||||||
|
add_sphinx_target(html libcxx)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
17
docs/DesignDocs/ABIVersioning.rst
Normal file
17
docs/DesignDocs/ABIVersioning.rst
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
|
||||||
|
====================
|
||||||
|
Libc++ ABI stability
|
||||||
|
====================
|
||||||
|
|
||||||
|
Libc++ aims to preserve stable ABI to avoid subtle bugs when code built to the old ABI
|
||||||
|
is linked with the code build to the new ABI. At the same time, libc++ allows ABI-breaking
|
||||||
|
improvements and bugfixes for the scenarios when ABI change is not a issue.
|
||||||
|
|
||||||
|
To support both cases, libc++ allows specifying the ABI version at the
|
||||||
|
build time. The version is defined with a cmake option
|
||||||
|
LIBCXX_ABI_VERSION. Another option LIBCXX_ABI_UNSTABLE can be used to
|
||||||
|
include all present ABI breaking features. These options translate
|
||||||
|
into C++ macro definitions _LIBCPP_ABI_VERSION, _LIBCPP_ABI_UNSTABLE.
|
||||||
|
|
||||||
|
Any ABI-changing feature is placed under it's own macro, _LIBCPP_ABI_XXX, which is enabled
|
||||||
|
based on the value of _LIBCPP_ABI_VERSION. _LIBCPP_ABI_UNSTABLE, if set, enables all features at once.
|
||||||
88
docs/DesignDocs/CapturingConfigInfo.rst
Normal file
88
docs/DesignDocs/CapturingConfigInfo.rst
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
=======================================================
|
||||||
|
Capturing configuration information during installation
|
||||||
|
=======================================================
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:local:
|
||||||
|
|
||||||
|
The Problem
|
||||||
|
===========
|
||||||
|
|
||||||
|
Currently the libc++ supports building the library with a number of different
|
||||||
|
configuration options. Unfortunately all of that configuration information is
|
||||||
|
lost when libc++ is installed. In order to support "persistent"
|
||||||
|
configurations libc++ needs a mechanism to capture the configuration options
|
||||||
|
in the INSTALLED headers.
|
||||||
|
|
||||||
|
|
||||||
|
Design Goals
|
||||||
|
============
|
||||||
|
|
||||||
|
* The solution should not INSTALL any additional headers. We don't want an extra
|
||||||
|
#include slowing everybody down.
|
||||||
|
|
||||||
|
* The solution should not unduly affect libc++ developers. The problem is limited
|
||||||
|
to installed versions of libc++ and the solution should be as well.
|
||||||
|
|
||||||
|
* The solution should not modify any existing headers EXCEPT during installation.
|
||||||
|
It makes developers lives harder if they have to regenerate the libc++ headers
|
||||||
|
every time they are modified.
|
||||||
|
|
||||||
|
* The solution should not make any of the libc++ headers dependant on
|
||||||
|
files generated by the build system. The headers should be able to compile
|
||||||
|
out of the box without any modification.
|
||||||
|
|
||||||
|
* The solution should not have ANY effect on users who don't need special
|
||||||
|
configuration options. The vast majority of users will never need this so it
|
||||||
|
shouldn't cost them.
|
||||||
|
|
||||||
|
|
||||||
|
The Solution
|
||||||
|
============
|
||||||
|
|
||||||
|
When you first configure libc++ using CMake we check to see if we need to
|
||||||
|
capture any options. If we haven't been given any "persistent" options then
|
||||||
|
we do NOTHING.
|
||||||
|
|
||||||
|
Otherwise we create a custom installation rule that modifies the installed __config
|
||||||
|
header. The rule first generates a dummy "__config_site" header containing the required
|
||||||
|
#defines. The contents of the dummy header are then prependend to the installed
|
||||||
|
__config header. By manually prepending the files we avoid the cost of an
|
||||||
|
extra #include and we allow the __config header to be ignorant of the extra
|
||||||
|
configuration all together. An example "__config" header generated when
|
||||||
|
-DLIBCXX_ENABLE_THREADS=OFF is given to CMake would look something like:
|
||||||
|
|
||||||
|
.. code-block:: cpp
|
||||||
|
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// 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_CONFIG_SITE
|
||||||
|
#define _LIBCPP_CONFIG_SITE
|
||||||
|
|
||||||
|
/* #undef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE */
|
||||||
|
/* #undef _LIBCPP_HAS_NO_STDIN */
|
||||||
|
/* #undef _LIBCPP_HAS_NO_STDOUT */
|
||||||
|
#define _LIBCPP_HAS_NO_THREADS
|
||||||
|
/* #undef _LIBCPP_HAS_NO_MONOTONIC_CLOCK */
|
||||||
|
/* #undef _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS */
|
||||||
|
|
||||||
|
#endif
|
||||||
|
// -*- C++ -*-
|
||||||
|
//===--------------------------- __config ---------------------------------===//
|
||||||
|
//
|
||||||
|
// 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_CONFIG
|
||||||
|
#define _LIBCPP_CONFIG
|
||||||
37
docs/Makefile.sphinx
Normal file
37
docs/Makefile.sphinx
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# Makefile for Sphinx documentation
|
||||||
|
#
|
||||||
|
# FIXME: This hack is only in place to allow the libcxx.llvm.org/docs builder
|
||||||
|
# to work with libcxx. This should be removed when that builder supports
|
||||||
|
# out-of-tree builds.
|
||||||
|
|
||||||
|
# You can set these variables from the command line.
|
||||||
|
SPHINXOPTS =
|
||||||
|
SPHINXBUILD = sphinx-build
|
||||||
|
PAPER =
|
||||||
|
BUILDDIR = _build
|
||||||
|
|
||||||
|
# Internal variables.
|
||||||
|
PAPEROPT_a4 = -D latex_paper_size=a4
|
||||||
|
PAPEROPT_letter = -D latex_paper_size=letter
|
||||||
|
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
|
||||||
|
# the i18n builder cannot share the environment and doctrees with the others
|
||||||
|
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
|
||||||
|
|
||||||
|
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext default
|
||||||
|
|
||||||
|
default: html
|
||||||
|
|
||||||
|
help:
|
||||||
|
@echo "Please use \`make <target>' where <target> is one of"
|
||||||
|
@echo " html to make standalone HTML files"
|
||||||
|
|
||||||
|
clean:
|
||||||
|
-rm -rf $(BUILDDIR)/*
|
||||||
|
|
||||||
|
html:
|
||||||
|
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
|
||||||
|
@echo
|
||||||
|
@# FIXME: Remove this `cp` once HTML->Sphinx transition is completed.
|
||||||
|
@# Kind of a hack, but HTML-formatted docs are on the way out anyway.
|
||||||
|
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
|
||||||
|
|
||||||
13
docs/README.txt
Normal file
13
docs/README.txt
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
libc++ Documentation
|
||||||
|
====================
|
||||||
|
|
||||||
|
The libc++ documentation is written using the Sphinx documentation generator. It is
|
||||||
|
currently tested with Sphinx 1.1.3.
|
||||||
|
|
||||||
|
To build the documents into html configure libc++ with the following cmake options:
|
||||||
|
|
||||||
|
* -DLLVM_ENABLE_SPHINX=ON
|
||||||
|
* -DLIBCXX_INCLUDE_DOCS=ON
|
||||||
|
|
||||||
|
After configuring libc++ with these options the make rule `docs-libcxx-html`
|
||||||
|
should be available.
|
||||||
200
docs/TestingLibcxx.rst
Normal file
200
docs/TestingLibcxx.rst
Normal file
@@ -0,0 +1,200 @@
|
|||||||
|
==============
|
||||||
|
Testing libc++
|
||||||
|
==============
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:local:
|
||||||
|
|
||||||
|
Getting Started
|
||||||
|
===============
|
||||||
|
|
||||||
|
libc++ uses LIT to configure and run its tests. The primary way to run the
|
||||||
|
libc++ tests is by using make check-libcxx. However since libc++ can be used
|
||||||
|
in any number of possible configurations it is important to customize the way
|
||||||
|
LIT builds and runs the tests. This guide provides information on how to use
|
||||||
|
LIT directly to test libc++.
|
||||||
|
|
||||||
|
Please see the `Lit Command Guide`_ for more information about LIT.
|
||||||
|
|
||||||
|
.. _LIT Command Guide: http://llvm.org/docs/CommandGuide/lit.html
|
||||||
|
|
||||||
|
Setting up the Environment
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
After building libc++ you must setup your environment to test libc++ using
|
||||||
|
LIT.
|
||||||
|
|
||||||
|
#. Create a shortcut to the actual lit executable so that you can invoke it
|
||||||
|
easily from the command line.
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
$ alias lit='python path/to/llvm/utils/lit/lit.py'
|
||||||
|
|
||||||
|
#. Tell LIT where to find your build configuration.
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
$ export LIBCXX_SITE_CONFIG=path/to/build-libcxx/test/lit.site.cfg
|
||||||
|
|
||||||
|
Example Usage
|
||||||
|
-------------
|
||||||
|
|
||||||
|
Once you have your environment set up and you have built libc++ you can run
|
||||||
|
parts of the libc++ test suite by simply running `lit` on a specified test or
|
||||||
|
directory. For example:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
$ cd path/to/src/libcxx
|
||||||
|
$ lit -sv test/std/re # Run all of the std::regex tests
|
||||||
|
$ lit -sv test/std/depr/depr.c.headers/stdlib_h.pass.cpp # Run a single test
|
||||||
|
$ lit -sv test/std/atomics test/std/threads # Test std::thread and std::atomic
|
||||||
|
|
||||||
|
Sometimes you'll want to change the way LIT is running the tests. Custom options
|
||||||
|
can be specified using the `--param=<name>=<val>` flag. The most common option
|
||||||
|
you'll want to change is the standard dialect (ie -std=c++XX). By default the
|
||||||
|
test suite will select the newest C++ dialect supported by the compiler and use
|
||||||
|
that. However if you want to manually specify the option like so:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
$ lit -sv test/std/containers # Run the tests with the newest -std
|
||||||
|
$ lit -sv --param=std=c++03 test/std/containers # Run the tests in C++03
|
||||||
|
|
||||||
|
Occasionally you'll want to add extra compile or link flags when testing.
|
||||||
|
You can do this as follows:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
$ lit -sv --param=compile_flags='-Wcustom-warning'
|
||||||
|
$ lit -sv --param=link_flags='-L/custom/library/path'
|
||||||
|
|
||||||
|
Some other common examples include:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
# Specify a custom compiler.
|
||||||
|
$ lit -sv --param=cxx_under_test=/opt/bin/g++ test/std
|
||||||
|
|
||||||
|
# Enable warnings in the test suite
|
||||||
|
$ lit -sv --param=enable_warnings=true test/std
|
||||||
|
|
||||||
|
# Use UBSAN when running the tests.
|
||||||
|
$ lit -sv --param=use_sanitizer=Undefined
|
||||||
|
|
||||||
|
|
||||||
|
LIT Options
|
||||||
|
===========
|
||||||
|
|
||||||
|
:program:`lit` [*options*...] [*filenames*...]
|
||||||
|
|
||||||
|
Command Line Options
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
To use these options you pass them on the LIT command line as --param NAME or
|
||||||
|
--param NAME=VALUE. Some options have default values specified during CMake's
|
||||||
|
configuration. Passing the option on the command line will override the default.
|
||||||
|
|
||||||
|
.. program:: lit
|
||||||
|
|
||||||
|
.. option:: --cxx_under_test=<path/to/compiler>
|
||||||
|
|
||||||
|
Specify the compiler used to build the tests.
|
||||||
|
|
||||||
|
.. 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>
|
||||||
|
|
||||||
|
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>
|
||||||
|
|
||||||
|
Specify the libc++ headers that are tested. By default the headers in the
|
||||||
|
source tree are used.
|
||||||
|
|
||||||
|
.. 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.
|
||||||
|
|
||||||
|
|
||||||
|
.. 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.
|
||||||
|
|
||||||
|
.. option:: --use_system_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>
|
||||||
|
|
||||||
|
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>
|
||||||
|
|
||||||
|
**Default**: False
|
||||||
|
|
||||||
|
Disable all default compile and link flags from being added. When this
|
||||||
|
option is used only flags specified using the compile_flags and link_flags
|
||||||
|
will be used.
|
||||||
|
|
||||||
|
.. 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>"
|
||||||
|
|
||||||
|
Specify additional link flags as a space delimited string.
|
||||||
|
|
||||||
|
.. option:: --debug_level=<level>
|
||||||
|
|
||||||
|
**Values**: 0, 1
|
||||||
|
|
||||||
|
Enable the use of debug mode. Level 0 enables assertions and level 1 enables
|
||||||
|
assertions and debugging of iterator misuse.
|
||||||
|
|
||||||
|
.. option:: use_sanitizer=<sanitizer name>
|
||||||
|
|
||||||
|
**Values**: Memory, MemoryWithOrigins, Address, Undefined
|
||||||
|
|
||||||
|
Run the tests using the given sanitizer. If LLVM_USE_SANITIZER was given when
|
||||||
|
building libc++ then that sanitizer will be used by default.
|
||||||
|
|
||||||
|
.. option:: color_diagnostics
|
||||||
|
|
||||||
|
Enable the use of colorized compile diagnostics. If the color_diagnostics
|
||||||
|
option is specified or the environment variable LIBCXX_COLOR_DIAGNOSTICS is
|
||||||
|
present then color diagnostics will be enabled.
|
||||||
|
|
||||||
|
|
||||||
|
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`.
|
||||||
|
|
||||||
|
.. 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`.
|
||||||
125
docs/UsingLibcxx.rst
Normal file
125
docs/UsingLibcxx.rst
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
============
|
||||||
|
Using libc++
|
||||||
|
============
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:local:
|
||||||
|
|
||||||
|
Getting Started
|
||||||
|
===============
|
||||||
|
|
||||||
|
If you already have libc++ installed you can use it with clang.
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
$ clang++ -stdlib=libc++ test.cpp
|
||||||
|
$ clang++ -std=c++11 -stdlib=libc++ test.cpp
|
||||||
|
|
||||||
|
On OS X and FreeBSD libc++ is the default standard library
|
||||||
|
and the ``-stdlib=libc++`` is not required.
|
||||||
|
|
||||||
|
.. _alternate libcxx:
|
||||||
|
|
||||||
|
If you want to select an alternate installation of libc++ you
|
||||||
|
can use the following options.
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
$ clang++ -std=c++11 -stdlib=libc++ -nostdinc++ \
|
||||||
|
-I<libcxx-install-prefix>/include/c++/v1 \
|
||||||
|
-L<libcxx-install-prefix>/lib \
|
||||||
|
-Wl,-rpath,<libcxx-install-prefix>/lib \
|
||||||
|
test.cpp
|
||||||
|
|
||||||
|
The option ``-Wl,-rpath,<libcxx-install-prefix>/lib`` adds a runtime library
|
||||||
|
search path. Meaning that the systems dynamic linker will look for libc++ in
|
||||||
|
``<libcxx-install-prefix>/lib`` whenever the program is run. Alternatively the
|
||||||
|
environment variable ``LD_LIBRARY_PATH`` (``DYLD_LIBRARY_PATH`` on OS X) can
|
||||||
|
be used to change the dynamic linkers search paths after a program is compiled.
|
||||||
|
|
||||||
|
An example of using ``LD_LIBRARY_PATH``:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
$ clang++ -stdlib=libc++ -nostdinc++ \
|
||||||
|
-I<libcxx-install-prefix>/include/c++/v1
|
||||||
|
-L<libcxx-install-prefix>/lib \
|
||||||
|
test.cpp -o
|
||||||
|
$ ./a.out # Searches for libc++ in the systems library paths.
|
||||||
|
$ export LD_LIBRARY_PATH=<libcxx-install-prefix>/lib
|
||||||
|
$ ./a.out # Searches for libc++ along LD_LIBRARY_PATH
|
||||||
|
|
||||||
|
Using libc++experimental and ``<experimental/...>``
|
||||||
|
=====================================================
|
||||||
|
|
||||||
|
Libc++ provides implementations of experimental technical specifications
|
||||||
|
in a separate library, ``libc++experimental.a``. Users of ``<experimental/...>``
|
||||||
|
headers may be required to link ``-lc++experimental``.
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
$ clang++ -std=c++14 -stdlib=libc++ test.cpp -lc++experimental
|
||||||
|
|
||||||
|
Libc++experimental.a may not always be available, even when libc++ is already
|
||||||
|
installed. For information on building libc++experimental from source see
|
||||||
|
:ref:`Building Libc++ <build instructions>` and
|
||||||
|
:ref:`libc++experimental CMake Options <libc++experimental options>`.
|
||||||
|
|
||||||
|
Also see the `Experimental Library Implementation Status <http://libcxx.llvm.org/ts1z_status.html>`__
|
||||||
|
page.
|
||||||
|
|
||||||
|
.. warning::
|
||||||
|
Experimental libraries are Experimental.
|
||||||
|
* The contents of the ``<experimental/...>`` headers and ``libc++experimental.a``
|
||||||
|
library will not remain compatible between versions.
|
||||||
|
* No guarantees of API or ABI stability are provided.
|
||||||
|
|
||||||
|
Using libc++ on Linux
|
||||||
|
=====================
|
||||||
|
|
||||||
|
On Linux libc++ can typically be used with only '-stdlib=libc++'. However
|
||||||
|
some libc++ installations require the user manually link libc++abi themselves.
|
||||||
|
If you are running into linker errors when using libc++ try adding '-lc++abi'
|
||||||
|
to the link line. For example:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
$ clang++ -stdlib=libc++ test.cpp -lc++ -lc++abi -lm -lc -lgcc_s -lgcc
|
||||||
|
|
||||||
|
Alternately, you could just add libc++abi to your libraries list, which in
|
||||||
|
most situations will give the same result:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
$ clang++ -stdlib=libc++ test.cpp -lc++abi
|
||||||
|
|
||||||
|
|
||||||
|
Using libc++ with GCC
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
GCC does not provide a way to switch from libstdc++ to libc++. You must manually
|
||||||
|
configure the compile and link commands.
|
||||||
|
|
||||||
|
In particular you must tell GCC to remove the libstdc++ include directories
|
||||||
|
using ``-nostdinc++`` and to not link libstdc++.so using ``-nodefaultlibs``.
|
||||||
|
|
||||||
|
Note that ``-nodefaultlibs`` removes all of the standard system libraries and
|
||||||
|
not just libstdc++ so they must be manually linked. For example:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
$ g++ -nostdinc++ -I<libcxx-install-prefix>/include/c++/v1 \
|
||||||
|
test.cpp -nodefaultlibs -lc++ -lc++abi -lm -lc -lgcc_s -lgcc
|
||||||
|
|
||||||
|
|
||||||
|
GDB Pretty printers for libc++
|
||||||
|
------------------------------
|
||||||
|
|
||||||
|
GDB does not support pretty-printing of libc++ symbols by default. Unfortunately
|
||||||
|
libc++ does not provide pretty-printers itself. However there are 3rd
|
||||||
|
party implementations available and although they are not officially
|
||||||
|
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>`_.
|
||||||
251
docs/conf.py
Normal file
251
docs/conf.py
Normal file
@@ -0,0 +1,251 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
#
|
||||||
|
# libc++ documentation build configuration file.
|
||||||
|
#
|
||||||
|
# This file is execfile()d with the current directory set to its containing dir.
|
||||||
|
#
|
||||||
|
# Note that not all possible configuration values are present in this
|
||||||
|
# autogenerated file.
|
||||||
|
#
|
||||||
|
# All configuration values have a default; values that are commented out
|
||||||
|
# serve to show the default.
|
||||||
|
|
||||||
|
import sys, os
|
||||||
|
|
||||||
|
# If extensions (or modules to document with autodoc) are in another directory,
|
||||||
|
# add these directories to sys.path here. If the directory is relative to the
|
||||||
|
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||||
|
#sys.path.insert(0, os.path.abspath('.'))
|
||||||
|
|
||||||
|
# -- General configuration -----------------------------------------------------
|
||||||
|
|
||||||
|
# If your documentation needs a minimal Sphinx version, state it here.
|
||||||
|
#needs_sphinx = '1.0'
|
||||||
|
|
||||||
|
# Add any Sphinx extension module names here, as strings. They can be extensions
|
||||||
|
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
|
||||||
|
extensions = ['sphinx.ext.intersphinx', 'sphinx.ext.todo']
|
||||||
|
|
||||||
|
# Add any paths that contain templates here, relative to this directory.
|
||||||
|
templates_path = ['_templates']
|
||||||
|
|
||||||
|
# The suffix of source filenames.
|
||||||
|
source_suffix = '.rst'
|
||||||
|
|
||||||
|
# The encoding of source files.
|
||||||
|
#source_encoding = 'utf-8-sig'
|
||||||
|
|
||||||
|
# The master toctree document.
|
||||||
|
master_doc = 'index'
|
||||||
|
|
||||||
|
# General information about the project.
|
||||||
|
project = u'libc++'
|
||||||
|
copyright = u'2011-2016, LLVM Project'
|
||||||
|
|
||||||
|
# The version info for the project you're documenting, acts as replacement for
|
||||||
|
# |version| and |release|, also used in various other places throughout the
|
||||||
|
# built documents.
|
||||||
|
#
|
||||||
|
# The short X.Y version.
|
||||||
|
version = '3.9'
|
||||||
|
# The full version, including alpha/beta/rc tags.
|
||||||
|
release = '3.9'
|
||||||
|
|
||||||
|
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||||
|
# for a list of supported languages.
|
||||||
|
#language = None
|
||||||
|
|
||||||
|
# There are two options for replacing |today|: either, you set today to some
|
||||||
|
# non-false value, then it is used:
|
||||||
|
#today = ''
|
||||||
|
# Else, today_fmt is used as the format for a strftime call.
|
||||||
|
today_fmt = '%Y-%m-%d'
|
||||||
|
|
||||||
|
# List of patterns, relative to source directory, that match files and
|
||||||
|
# directories to ignore when looking for source files.
|
||||||
|
exclude_patterns = ['_build']
|
||||||
|
|
||||||
|
# The reST default role (used for this markup: `text`) to use for all documents.
|
||||||
|
#default_role = None
|
||||||
|
|
||||||
|
# If true, '()' will be appended to :func: etc. cross-reference text.
|
||||||
|
#add_function_parentheses = True
|
||||||
|
|
||||||
|
# If true, the current module name will be prepended to all description
|
||||||
|
# unit titles (such as .. function::).
|
||||||
|
#add_module_names = True
|
||||||
|
|
||||||
|
# If true, sectionauthor and moduleauthor directives will be shown in the
|
||||||
|
# output. They are ignored by default.
|
||||||
|
show_authors = True
|
||||||
|
|
||||||
|
# The name of the Pygments (syntax highlighting) style to use.
|
||||||
|
pygments_style = 'friendly'
|
||||||
|
|
||||||
|
# A list of ignored prefixes for module index sorting.
|
||||||
|
#modindex_common_prefix = []
|
||||||
|
|
||||||
|
|
||||||
|
# -- Options for HTML output ---------------------------------------------------
|
||||||
|
|
||||||
|
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||||
|
# a list of builtin themes.
|
||||||
|
html_theme = 'haiku'
|
||||||
|
|
||||||
|
# Theme options are theme-specific and customize the look and feel of a theme
|
||||||
|
# further. For a list of options available for each theme, see the
|
||||||
|
# documentation.
|
||||||
|
#html_theme_options = {}
|
||||||
|
|
||||||
|
# Add any paths that contain custom themes here, relative to this directory.
|
||||||
|
#html_theme_path = []
|
||||||
|
|
||||||
|
# The name for this set of Sphinx documents. If None, it defaults to
|
||||||
|
# "<project> v<release> documentation".
|
||||||
|
#html_title = None
|
||||||
|
|
||||||
|
# A shorter title for the navigation bar. Default is the same as html_title.
|
||||||
|
#html_short_title = None
|
||||||
|
|
||||||
|
# The name of an image file (relative to this directory) to place at the top
|
||||||
|
# of the sidebar.
|
||||||
|
#html_logo = None
|
||||||
|
|
||||||
|
# The name of an image file (within the static path) to use as favicon of the
|
||||||
|
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
|
||||||
|
# pixels large.
|
||||||
|
#html_favicon = None
|
||||||
|
|
||||||
|
# Add any paths that contain custom static files (such as style sheets) here,
|
||||||
|
# relative to this directory. They are copied after the builtin static files,
|
||||||
|
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||||
|
html_static_path = []
|
||||||
|
|
||||||
|
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
|
||||||
|
# using the given strftime format.
|
||||||
|
#html_last_updated_fmt = '%b %d, %Y'
|
||||||
|
|
||||||
|
# If true, SmartyPants will be used to convert quotes and dashes to
|
||||||
|
# typographically correct entities.
|
||||||
|
#html_use_smartypants = True
|
||||||
|
|
||||||
|
# Custom sidebar templates, maps document names to template names.
|
||||||
|
#html_sidebars = {}
|
||||||
|
|
||||||
|
# Additional templates that should be rendered to pages, maps page names to
|
||||||
|
# template names.
|
||||||
|
#html_additional_pages = {}
|
||||||
|
|
||||||
|
# If false, no module index is generated.
|
||||||
|
#html_domain_indices = True
|
||||||
|
|
||||||
|
# If false, no index is generated.
|
||||||
|
#html_use_index = True
|
||||||
|
|
||||||
|
# If true, the index is split into individual pages for each letter.
|
||||||
|
#html_split_index = False
|
||||||
|
|
||||||
|
# If true, links to the reST sources are added to the pages.
|
||||||
|
#html_show_sourcelink = True
|
||||||
|
|
||||||
|
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
|
||||||
|
#html_show_sphinx = True
|
||||||
|
|
||||||
|
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
|
||||||
|
#html_show_copyright = True
|
||||||
|
|
||||||
|
# If true, an OpenSearch description file will be output, and all pages will
|
||||||
|
# contain a <link> tag referring to it. The value of this option must be the
|
||||||
|
# base URL from which the finished HTML is served.
|
||||||
|
#html_use_opensearch = ''
|
||||||
|
|
||||||
|
# This is the file name suffix for HTML files (e.g. ".xhtml").
|
||||||
|
#html_file_suffix = None
|
||||||
|
|
||||||
|
# Output file base name for HTML help builder.
|
||||||
|
htmlhelp_basename = 'libcxxdoc'
|
||||||
|
|
||||||
|
|
||||||
|
# -- Options for LaTeX output --------------------------------------------------
|
||||||
|
|
||||||
|
latex_elements = {
|
||||||
|
# The paper size ('letterpaper' or 'a4paper').
|
||||||
|
#'papersize': 'letterpaper',
|
||||||
|
|
||||||
|
# The font size ('10pt', '11pt' or '12pt').
|
||||||
|
#'pointsize': '10pt',
|
||||||
|
|
||||||
|
# Additional stuff for the LaTeX preamble.
|
||||||
|
#'preamble': '',
|
||||||
|
}
|
||||||
|
|
||||||
|
# Grouping the document tree into LaTeX files. List of tuples
|
||||||
|
# (source start file, target name, title, author, documentclass [howto/manual]).
|
||||||
|
latex_documents = [
|
||||||
|
('contents', 'libcxx.tex', u'libcxx Documentation',
|
||||||
|
u'LLVM project', 'manual'),
|
||||||
|
]
|
||||||
|
|
||||||
|
# The name of an image file (relative to this directory) to place at the top of
|
||||||
|
# the title page.
|
||||||
|
#latex_logo = None
|
||||||
|
|
||||||
|
# For "manual" documents, if this is true, then toplevel headings are parts,
|
||||||
|
# not chapters.
|
||||||
|
#latex_use_parts = False
|
||||||
|
|
||||||
|
# If true, show page references after internal links.
|
||||||
|
#latex_show_pagerefs = False
|
||||||
|
|
||||||
|
# If true, show URL addresses after external links.
|
||||||
|
#latex_show_urls = False
|
||||||
|
|
||||||
|
# Documents to append as an appendix to all manuals.
|
||||||
|
#latex_appendices = []
|
||||||
|
|
||||||
|
# If false, no module index is generated.
|
||||||
|
#latex_domain_indices = True
|
||||||
|
|
||||||
|
|
||||||
|
# -- Options for manual page output --------------------------------------------
|
||||||
|
|
||||||
|
# One entry per manual page. List of tuples
|
||||||
|
# (source start file, name, description, authors, manual section).
|
||||||
|
man_pages = [
|
||||||
|
('contents', 'libc++', u'libc++ Documentation',
|
||||||
|
[u'LLVM project'], 1)
|
||||||
|
]
|
||||||
|
|
||||||
|
# If true, show URL addresses after external links.
|
||||||
|
#man_show_urls = False
|
||||||
|
|
||||||
|
|
||||||
|
# -- Options for Texinfo output ------------------------------------------------
|
||||||
|
|
||||||
|
# Grouping the document tree into Texinfo files. List of tuples
|
||||||
|
# (source start file, target name, title, author,
|
||||||
|
# dir menu entry, description, category)
|
||||||
|
texinfo_documents = [
|
||||||
|
('contents', 'libc++', u'libc++ Documentation',
|
||||||
|
u'LLVM project', 'libc++', 'One line description of project.',
|
||||||
|
'Miscellaneous'),
|
||||||
|
]
|
||||||
|
|
||||||
|
# Documents to append as an appendix to all manuals.
|
||||||
|
#texinfo_appendices = []
|
||||||
|
|
||||||
|
# If false, no module index is generated.
|
||||||
|
#texinfo_domain_indices = True
|
||||||
|
|
||||||
|
# How to display URL addresses: 'footnote', 'no', or 'inline'.
|
||||||
|
#texinfo_show_urls = 'footnote'
|
||||||
|
|
||||||
|
|
||||||
|
# FIXME: Define intersphinx configration.
|
||||||
|
intersphinx_mapping = {}
|
||||||
|
|
||||||
|
|
||||||
|
# -- Options for extensions ----------------------------------------------------
|
||||||
|
|
||||||
|
# Enable this if you want TODOs to show up in the generated documentation.
|
||||||
|
todo_include_todos = True
|
||||||
185
docs/index.rst
Normal file
185
docs/index.rst
Normal file
@@ -0,0 +1,185 @@
|
|||||||
|
.. _index:
|
||||||
|
|
||||||
|
=============================
|
||||||
|
"libc++" C++ Standard Library
|
||||||
|
=============================
|
||||||
|
|
||||||
|
Overview
|
||||||
|
========
|
||||||
|
|
||||||
|
libc++ is a new implementation of the C++ standard library, targeting C++11.
|
||||||
|
|
||||||
|
* Features and Goals
|
||||||
|
|
||||||
|
* Correctness as defined by the C++11 standard.
|
||||||
|
* Fast execution.
|
||||||
|
* Minimal memory use.
|
||||||
|
* Fast compile times.
|
||||||
|
* ABI compatibility with gcc's libstdc++ for some low-level features
|
||||||
|
such as exception objects, rtti and memory allocation.
|
||||||
|
* Extensive unit tests.
|
||||||
|
|
||||||
|
* Design and Implementation:
|
||||||
|
|
||||||
|
* Extensive unit tests
|
||||||
|
* Internal linker model can be dumped/read to textual format
|
||||||
|
* Additional linking features can be plugged in as "passes"
|
||||||
|
* OS specific and CPU specific code factored out
|
||||||
|
|
||||||
|
|
||||||
|
Getting Started with libc++
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
|
||||||
|
UsingLibcxx
|
||||||
|
BuildingLibcxx
|
||||||
|
TestingLibcxx
|
||||||
|
|
||||||
|
|
||||||
|
Current Status
|
||||||
|
--------------
|
||||||
|
|
||||||
|
After its initial introduction, many people have asked "why start a new
|
||||||
|
library instead of contributing to an existing library?" (like Apache's
|
||||||
|
libstdcxx, GNU's libstdc++, STLport, etc). There are many contributing
|
||||||
|
reasons, but some of the major ones are:
|
||||||
|
|
||||||
|
* From years of experience (including having implemented the standard
|
||||||
|
library before), we've learned many things about implementing
|
||||||
|
the standard containers which require ABI breakage and fundamental changes
|
||||||
|
to how they are implemented. For example, it is generally accepted that
|
||||||
|
building std::string using the "short string optimization" instead of
|
||||||
|
using Copy On Write (COW) is a superior approach for multicore
|
||||||
|
machines (particularly in C++11, which has rvalue references). Breaking
|
||||||
|
ABI compatibility with old versions of the library was
|
||||||
|
determined to be critical to achieving the performance goals of
|
||||||
|
libc++.
|
||||||
|
|
||||||
|
* Mainline libstdc++ has switched to GPL3, a license which the developers
|
||||||
|
of libc++ cannot use. libstdc++ 4.2 (the last GPL2 version) could be
|
||||||
|
independently extended to support C++11, but this would be a fork of the
|
||||||
|
codebase (which is often seen as worse for a project than starting a new
|
||||||
|
independent one). Another problem with libstdc++ is that it is tightly
|
||||||
|
integrated with G++ development, tending to be tied fairly closely to the
|
||||||
|
matching version of G++.
|
||||||
|
|
||||||
|
* STLport and the Apache libstdcxx library are two other popular
|
||||||
|
candidates, but both lack C++11 support. Our experience (and the
|
||||||
|
experience of libstdc++ developers) is that adding support for C++11 (in
|
||||||
|
particular rvalue references and move-only types) requires changes to
|
||||||
|
almost every class and function, essentially amounting to a rewrite.
|
||||||
|
Faced with a rewrite, we decided to start from scratch and evaluate every
|
||||||
|
design decision from first principles based on experience.
|
||||||
|
Further, both projects are apparently abandoned: STLport 5.2.1 was
|
||||||
|
released in Oct'08, and STDCXX 4.2.1 in May'08.
|
||||||
|
|
||||||
|
Platform and Compiler Support
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
|
libc++ is known to work on the following platforms, using gcc-4.2 and
|
||||||
|
clang (lack of C++11 language support disables some functionality).
|
||||||
|
Note that functionality provided by ``<atomic>`` is only functional with clang
|
||||||
|
and GCC.
|
||||||
|
|
||||||
|
============ ==================== ============ ========================
|
||||||
|
OS Arch Compilers ABI Library
|
||||||
|
============ ==================== ============ ========================
|
||||||
|
Mac OS X i386, x86_64 Clang, GCC libc++abi
|
||||||
|
FreeBSD 10+ i386, x86_64, ARM Clang, GCC libcxxrt, libc++abi
|
||||||
|
Linux i386, x86_64 Clang, GCC libc++abi
|
||||||
|
============ ==================== ============ ========================
|
||||||
|
|
||||||
|
The following minimum compiler versions are strongly recommended.
|
||||||
|
|
||||||
|
* Clang 3.5 and above
|
||||||
|
* GCC 4.7 and above.
|
||||||
|
|
||||||
|
Anything older *may* work.
|
||||||
|
|
||||||
|
C++ Dialect Support
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
* C++11 - Complete
|
||||||
|
* `C++14 - Complete <http://libcxx.llvm.org/cxx1y_status.html>`__
|
||||||
|
* `C++1z - In Progress <http://libcxx.llvm.org/cxx1z_status.html>`__
|
||||||
|
* `Post C++14 Technical Specifications - In Progress <http://libcxx.llvm.org/ts1z_status.html>`__
|
||||||
|
|
||||||
|
Notes and Known Issues
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
This list contains known issues with libc++
|
||||||
|
|
||||||
|
* Building libc++ with ``-fno-rtti`` is not supported. However
|
||||||
|
linking against it with ``-fno-rtti`` is supported.
|
||||||
|
* On OS X v10.8 and older the CMake option ``-DLIBCXX_LIBCPPABI_VERSION=""``
|
||||||
|
must be used during configuration.
|
||||||
|
|
||||||
|
|
||||||
|
A full list of currently open libc++ bugs can be `found here`__.
|
||||||
|
|
||||||
|
.. __: https://llvm.org/bugs/buglist.cgi?component=All%20Bugs&product=libc%2B%2B&query_format=advanced&resolution=---&order=changeddate%20DESC%2Cassigned_to%20DESC%2Cbug_status%2Cpriority%2Cbug_id&list_id=74184
|
||||||
|
|
||||||
|
Design Documents
|
||||||
|
----------------
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 1
|
||||||
|
|
||||||
|
DesignDocs/CapturingConfigInfo
|
||||||
|
DesignDocs/ABIVersioning
|
||||||
|
|
||||||
|
|
||||||
|
* `<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/
|
||||||
|
|
||||||
|
Build Bots and Test Coverage
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
* `LLVM Buildbot Builders <http://lab.llvm.org:8011/console>`_
|
||||||
|
* `Apple Jenkins Builders <http://lab.llvm.org:8080/green/view/Libcxx/>`_
|
||||||
|
* `EricWF's Nightly Builders <http://ds2.efcs.ca:8080/console>`_
|
||||||
|
* `Code Coverage Results <http://efcs.ca/libcxx-coverage>`_
|
||||||
|
|
||||||
|
Getting Involved
|
||||||
|
================
|
||||||
|
|
||||||
|
First please review our `Developer's Policy <http://llvm.org/docs/DeveloperPolicy.html>`__
|
||||||
|
and `Getting started with LLVM <http://llvm.org/docs/GettingStarted.html>`__.
|
||||||
|
|
||||||
|
**Bug Reports**
|
||||||
|
|
||||||
|
If you think you've found a bug in libc++, please report it using
|
||||||
|
the `LLVM Bugzilla`_. If you're not sure, you
|
||||||
|
can post a message to the `cfe-dev mailing list`_ or on IRC.
|
||||||
|
Please include "libc++" in your subject.
|
||||||
|
|
||||||
|
**Patches**
|
||||||
|
|
||||||
|
If you want to contribute a patch to libc++, the best place for that is
|
||||||
|
`Phabricator <http://llvm.org/docs/Phabricator.html>`_. Please include [libcxx] in the subject and
|
||||||
|
add `cfe-commits` as a subscriber. Also make sure you are subscribed to the
|
||||||
|
`cfe-commits mailing list <http://lists.llvm.org/mailman/listinfo/cfe-commits>`_.
|
||||||
|
|
||||||
|
**Discussion and Questions**
|
||||||
|
|
||||||
|
Send discussions and questions to the
|
||||||
|
`cfe-dev mailing list <http://lists.llvm.org/mailman/listinfo/cfe-dev>`_.
|
||||||
|
Please include [libcxx] in the subject.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Quick Links
|
||||||
|
===========
|
||||||
|
* `LLVM Homepage <http://llvm.org/>`_
|
||||||
|
* `libc++abi Homepage <http://libcxxabi.llvm.org/>`_
|
||||||
|
* `LLVM Bugzilla <http://llvm.org/bugs/>`_
|
||||||
|
* `cfe-commits Mailing List`_
|
||||||
|
* `cfe-dev Mailing List`_
|
||||||
|
* `Browse libc++ -- SVN <http://llvm.org/svn/llvm-project/libcxx/trunk/>`_
|
||||||
|
* `Browse libc++ -- ViewVC <http://llvm.org/viewvc/llvm-project/libcxx/trunk/>`_
|
||||||
@@ -1,10 +1,12 @@
|
|||||||
if (NOT LIBCXX_INSTALL_SUPPORT_HEADERS)
|
if (NOT LIBCXX_INSTALL_SUPPORT_HEADERS)
|
||||||
set(LIBCXX_SUPPORT_HEADER_PATTERN PATTERN "support" EXCLUDE)
|
set(LIBCXX_SUPPORT_HEADER_PATTERN PATTERN "support" EXCLUDE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(LIBCXX_HEADER_PATTERN
|
set(LIBCXX_HEADER_PATTERN
|
||||||
PATTERN "*"
|
PATTERN "*"
|
||||||
PATTERN "CMakeLists.txt" EXCLUDE
|
PATTERN "CMakeLists.txt" EXCLUDE
|
||||||
PATTERN ".svn" EXCLUDE
|
PATTERN ".svn" EXCLUDE
|
||||||
|
PATTERN "__config_site.in" EXCLUDE
|
||||||
${LIBCXX_SUPPORT_HEADER_PATTERN}
|
${LIBCXX_SUPPORT_HEADER_PATTERN}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -17,8 +19,44 @@ file(COPY .
|
|||||||
if (LIBCXX_INSTALL_HEADERS)
|
if (LIBCXX_INSTALL_HEADERS)
|
||||||
install(DIRECTORY .
|
install(DIRECTORY .
|
||||||
DESTINATION include/c++/v1
|
DESTINATION include/c++/v1
|
||||||
|
COMPONENT libcxx-headers
|
||||||
FILES_MATCHING
|
FILES_MATCHING
|
||||||
${LIBCXX_HEADER_PATTERN}
|
${LIBCXX_HEADER_PATTERN}
|
||||||
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
|
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if (LIBCXX_NEEDS_SITE_CONFIG)
|
||||||
|
set(UNIX_CAT cat)
|
||||||
|
if (WIN32)
|
||||||
|
set(UNIX_CAT type)
|
||||||
|
endif()
|
||||||
|
# Generate and install a custom __config header. The new header is created
|
||||||
|
# by prepending __config_site to the current __config header.
|
||||||
|
add_custom_command(OUTPUT ${LIBCXX_BINARY_DIR}/__generated_config
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy ${LIBCXX_BINARY_DIR}/__config_site ${LIBCXX_BINARY_DIR}/__generated_config
|
||||||
|
COMMAND ${UNIX_CAT} ${LIBCXX_SOURCE_DIR}/include/__config >> ${LIBCXX_BINARY_DIR}/__generated_config
|
||||||
|
DEPENDS ${LIBCXX_SOURCE_DIR}/include/__config
|
||||||
|
${LIBCXX_BINARY_DIR}/__config_site
|
||||||
|
)
|
||||||
|
# Add a target that executes the generation commands.
|
||||||
|
add_custom_target(generate_config_header ALL
|
||||||
|
DEPENDS ${LIBCXX_BINARY_DIR}/__generated_config)
|
||||||
|
# Install the generated header as __config.
|
||||||
|
install(FILES ${LIBCXX_BINARY_DIR}/__generated_config
|
||||||
|
DESTINATION include/c++/v1
|
||||||
|
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
|
||||||
|
RENAME __config
|
||||||
|
COMPONENT libcxx-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
|
||||||
|
COMMAND "${CMAKE_COMMAND}"
|
||||||
|
-DCMAKE_INSTALL_COMPONENT=libcxx-headers
|
||||||
|
-P "${CMAKE_BINARY_DIR}/cmake_install.cmake")
|
||||||
|
endif()
|
||||||
|
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
33
include/__bsd_locale_defaults.h
Normal file
33
include/__bsd_locale_defaults.h
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
//===---------------------- __bsd_locale_defaults.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.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
// The BSDs have lots of *_l functions. We don't want to define those symbols
|
||||||
|
// on other platforms though, for fear of conflicts with user code. So here,
|
||||||
|
// we will define the mapping from an internal macro to the real BSD symbol.
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#ifndef _LIBCPP_BSD_LOCALE_DEFAULTS_H
|
||||||
|
#define _LIBCPP_BSD_LOCALE_DEFAULTS_H
|
||||||
|
|
||||||
|
#define __libcpp_mb_cur_max_l(loc) MB_CUR_MAX_L(loc)
|
||||||
|
#define __libcpp_btowc_l(ch, loc) btowc_l(ch, loc)
|
||||||
|
#define __libcpp_wctob_l(wch, loc) wctob_l(wch, loc)
|
||||||
|
#define __libcpp_wcsnrtombs_l(dst, src, nwc, len, ps, loc) wcsnrtombs_l(dst, src, nwc, len, ps, loc)
|
||||||
|
#define __libcpp_wcrtomb_l(src, wc, ps, loc) wcrtomb_l(src, wc, ps, loc)
|
||||||
|
#define __libcpp_mbsnrtowcs_l(dst, src, nms, len, ps, loc) mbsnrtowcs_l(dst, src, nms, len, ps, loc)
|
||||||
|
#define __libcpp_mbrtowc_l(pwc, s, n, ps, l) mbrtowc_l(pwc, s, n, ps, l)
|
||||||
|
#define __libcpp_mbtowc_l(pwc, pmb, max, l) mbtowc_l(pwc, pmb, max, l)
|
||||||
|
#define __libcpp_mbrlen_l(s, n, ps, l) mbrlen_l(s, n, ps, l)
|
||||||
|
#define __libcpp_localeconv_l(l) localeconv_l(l)
|
||||||
|
#define __libcpp_mbsrtowcs_l(dest, src, len, ps, l) mbsrtowcs_l(dest, src, len, ps, l)
|
||||||
|
#define __libcpp_snprintf_l(...) snprintf_l(__VA_ARGS__)
|
||||||
|
#define __libcpp_asprintf_l(...) asprintf_l(__VA_ARGS__)
|
||||||
|
#define __libcpp_sscanf_l(...) sscanf_l(__VA_ARGS__)
|
||||||
|
|
||||||
|
#endif // _LIBCPP_BSD_LOCALE_DEFAULTS_H
|
||||||
138
include/__bsd_locale_fallbacks.h
Normal file
138
include/__bsd_locale_fallbacks.h
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
//===---------------------- __bsd_locale_fallbacks.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.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
// The BSDs have lots of *_l functions. This file provides reimplementations
|
||||||
|
// of those functions for non-BSD platforms.
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#ifndef _LIBCPP_BSD_LOCALE_FALLBACKS_DEFAULTS_H
|
||||||
|
#define _LIBCPP_BSD_LOCALE_FALLBACKS_DEFAULTS_H
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||||
|
|
||||||
|
typedef _VSTD::remove_pointer<locale_t>::type __use_locale_struct;
|
||||||
|
typedef _VSTD::unique_ptr<__use_locale_struct, decltype(&uselocale)> __locale_raii;
|
||||||
|
|
||||||
|
inline _LIBCPP_ALWAYS_INLINE
|
||||||
|
decltype(MB_CUR_MAX) __libcpp_mb_cur_max_l(locale_t __l)
|
||||||
|
{
|
||||||
|
__locale_raii __current( uselocale(__l), uselocale );
|
||||||
|
return MB_CUR_MAX;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline _LIBCPP_ALWAYS_INLINE
|
||||||
|
wint_t __libcpp_btowc_l(int __c, locale_t __l)
|
||||||
|
{
|
||||||
|
__locale_raii __current( uselocale(__l), uselocale );
|
||||||
|
return btowc(__c);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline _LIBCPP_ALWAYS_INLINE
|
||||||
|
int __libcpp_wctob_l(wint_t __c, locale_t __l)
|
||||||
|
{
|
||||||
|
__locale_raii __current( uselocale(__l), uselocale );
|
||||||
|
return wctob(__c);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline _LIBCPP_ALWAYS_INLINE
|
||||||
|
size_t __libcpp_wcsnrtombs_l(char *__dest, const wchar_t **__src, size_t __nwc,
|
||||||
|
size_t __len, mbstate_t *__ps, locale_t __l)
|
||||||
|
{
|
||||||
|
__locale_raii __current( uselocale(__l), uselocale );
|
||||||
|
return wcsnrtombs(__dest, __src, __nwc, __len, __ps);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline _LIBCPP_ALWAYS_INLINE
|
||||||
|
size_t __libcpp_wcrtomb_l(char *__s, wchar_t __wc, mbstate_t *__ps, locale_t __l)
|
||||||
|
{
|
||||||
|
__locale_raii __current( uselocale(__l), uselocale );
|
||||||
|
return wcrtomb(__s, __wc, __ps);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline _LIBCPP_ALWAYS_INLINE
|
||||||
|
size_t __libcpp_mbsnrtowcs_l(wchar_t * __dest, const char **__src, size_t __nms,
|
||||||
|
size_t __len, mbstate_t *__ps, locale_t __l)
|
||||||
|
{
|
||||||
|
__locale_raii __current( uselocale(__l), uselocale );
|
||||||
|
return mbsnrtowcs(__dest, __src, __nms, __len, __ps);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline _LIBCPP_ALWAYS_INLINE
|
||||||
|
size_t __libcpp_mbrtowc_l(wchar_t *__pwc, const char *__s, size_t __n,
|
||||||
|
mbstate_t *__ps, locale_t __l)
|
||||||
|
{
|
||||||
|
__locale_raii __current( uselocale(__l), uselocale );
|
||||||
|
return mbrtowc(__pwc, __s, __n, __ps);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline _LIBCPP_ALWAYS_INLINE
|
||||||
|
int __libcpp_mbtowc_l(wchar_t *__pwc, const char *__pmb, size_t __max, locale_t __l)
|
||||||
|
{
|
||||||
|
__locale_raii __current( uselocale(__l), uselocale );
|
||||||
|
return mbtowc(__pwc, __pmb, __max);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline _LIBCPP_ALWAYS_INLINE
|
||||||
|
size_t __libcpp_mbrlen_l(const char *__s, size_t __n, mbstate_t *__ps, locale_t __l)
|
||||||
|
{
|
||||||
|
__locale_raii __current( uselocale(__l), uselocale );
|
||||||
|
return mbrlen(__s, __n, __ps);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline _LIBCPP_ALWAYS_INLINE
|
||||||
|
lconv *__libcpp_localeconv_l(locale_t __l)
|
||||||
|
{
|
||||||
|
__locale_raii __current( uselocale(__l), uselocale );
|
||||||
|
return localeconv();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline _LIBCPP_ALWAYS_INLINE
|
||||||
|
size_t __libcpp_mbsrtowcs_l(wchar_t *__dest, const char **__src, size_t __len,
|
||||||
|
mbstate_t *__ps, locale_t __l)
|
||||||
|
{
|
||||||
|
__locale_raii __current( uselocale(__l), uselocale );
|
||||||
|
return mbsrtowcs(__dest, __src, __len, __ps);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
int __libcpp_snprintf_l(char *__s, size_t __n, locale_t __l, const char *__format, ...) {
|
||||||
|
va_list __va;
|
||||||
|
va_start(__va, __format);
|
||||||
|
__locale_raii __current( uselocale(__l), uselocale );
|
||||||
|
int __res = vsnprintf(__s, __n, __format, __va);
|
||||||
|
va_end(__va);
|
||||||
|
return __res;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
int __libcpp_asprintf_l(char **__s, locale_t __l, const char *__format, ...) {
|
||||||
|
va_list __va;
|
||||||
|
va_start(__va, __format);
|
||||||
|
__locale_raii __current( uselocale(__l), uselocale );
|
||||||
|
int __res = vasprintf(__s, __format, __va);
|
||||||
|
va_end(__va);
|
||||||
|
return __res;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
int __libcpp_sscanf_l(const char *__s, locale_t __l, const char *__format, ...) {
|
||||||
|
va_list __va;
|
||||||
|
va_start(__va, __format);
|
||||||
|
__locale_raii __current( uselocale(__l), uselocale );
|
||||||
|
int __res = vsscanf(__s, __format, __va);
|
||||||
|
va_end(__va);
|
||||||
|
return __res;
|
||||||
|
}
|
||||||
|
|
||||||
|
_LIBCPP_END_NAMESPACE_STD
|
||||||
|
|
||||||
|
#endif // _LIBCPP_BSD_LOCALE_FALLBACKS_DEFAULTS_H
|
||||||
216
include/__config
216
include/__config
@@ -11,19 +11,39 @@
|
|||||||
#ifndef _LIBCPP_CONFIG
|
#ifndef _LIBCPP_CONFIG
|
||||||
#define _LIBCPP_CONFIG
|
#define _LIBCPP_CONFIG
|
||||||
|
|
||||||
#if !defined(_MSC_VER) || defined(__clang__)
|
#if defined(_MSC_VER) && !defined(__clang__)
|
||||||
|
#define _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER
|
||||||
#pragma GCC system_header
|
#pragma GCC system_header
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
#define _GNUC_VER (__GNUC__ * 100 + __GNUC_MINOR__)
|
#define _GNUC_VER (__GNUC__ * 100 + __GNUC_MINOR__)
|
||||||
#else
|
#else
|
||||||
#define _GNUC_VER 0
|
#define _GNUC_VER 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _LIBCPP_VERSION 3800
|
#define _LIBCPP_VERSION 3900
|
||||||
|
|
||||||
|
#ifndef _LIBCPP_ABI_VERSION
|
||||||
#define _LIBCPP_ABI_VERSION 1
|
#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,
|
||||||
|
// improving its alignment in some cases.
|
||||||
|
#define _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
|
||||||
|
// Fix deque iterator type in order to support incomplete types.
|
||||||
|
#define _LIBCPP_ABI_INCOMPLETE_TYPES_IN_DEQUE
|
||||||
|
// Fix undefined behavior in how std::list stores it's linked nodes.
|
||||||
|
#define _LIBCPP_ABI_LIST_REMOVE_NODE_POINTER_UB
|
||||||
|
#define _LIBCPP_ABI_FORWARD_LIST_REMOVE_NODE_POINTER_UB
|
||||||
|
#define _LIBCPP_ABI_FIX_UNORDERED_CONTAINER_SIZE_TYPE
|
||||||
|
#endif
|
||||||
|
|
||||||
#define _LIBCPP_CONCAT1(_LIBCPP_X,_LIBCPP_Y) _LIBCPP_X##_LIBCPP_Y
|
#define _LIBCPP_CONCAT1(_LIBCPP_X,_LIBCPP_Y) _LIBCPP_X##_LIBCPP_Y
|
||||||
#define _LIBCPP_CONCAT(_LIBCPP_X,_LIBCPP_Y) _LIBCPP_CONCAT1(_LIBCPP_X,_LIBCPP_Y)
|
#define _LIBCPP_CONCAT(_LIBCPP_X,_LIBCPP_Y) _LIBCPP_CONCAT1(_LIBCPP_X,_LIBCPP_Y)
|
||||||
@@ -37,6 +57,9 @@
|
|||||||
#ifndef __has_builtin
|
#ifndef __has_builtin
|
||||||
#define __has_builtin(__x) 0
|
#define __has_builtin(__x) 0
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef __has_extension
|
||||||
|
#define __has_extension(__x) 0
|
||||||
|
#endif
|
||||||
#ifndef __has_feature
|
#ifndef __has_feature
|
||||||
#define __has_feature(__x) 0
|
#define __has_feature(__x) 0
|
||||||
#endif
|
#endif
|
||||||
@@ -61,6 +84,16 @@
|
|||||||
#endif // __BIG_ENDIAN__
|
#endif // __BIG_ENDIAN__
|
||||||
#endif // __BIG_ENDIAN__
|
#endif // __BIG_ENDIAN__
|
||||||
|
|
||||||
|
#ifdef __BYTE_ORDER__
|
||||||
|
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
||||||
|
#define _LIBCPP_LITTLE_ENDIAN 1
|
||||||
|
#define _LIBCPP_BIG_ENDIAN 0
|
||||||
|
#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
|
||||||
|
#define _LIBCPP_LITTLE_ENDIAN 0
|
||||||
|
#define _LIBCPP_BIG_ENDIAN 1
|
||||||
|
#endif // __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
|
||||||
|
#endif // __BYTE_ORDER__
|
||||||
|
|
||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
# include <sys/endian.h>
|
# include <sys/endian.h>
|
||||||
# if _BYTE_ORDER == _LITTLE_ENDIAN
|
# if _BYTE_ORDER == _LITTLE_ENDIAN
|
||||||
@@ -147,6 +180,12 @@
|
|||||||
# endif
|
# endif
|
||||||
#endif // !defined(_LIBCPP_LITTLE_ENDIAN) || !defined(_LIBCPP_BIG_ENDIAN)
|
#endif // !defined(_LIBCPP_LITTLE_ENDIAN) || !defined(_LIBCPP_BIG_ENDIAN)
|
||||||
|
|
||||||
|
#if __has_attribute(__no_sanitize__)
|
||||||
|
#define _LIBCPP_NO_CFI __attribute__((__no_sanitize__("cfi")))
|
||||||
|
#else
|
||||||
|
#define _LIBCPP_NO_CFI
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|
||||||
// only really useful for a DLL
|
// only really useful for a DLL
|
||||||
@@ -205,6 +244,12 @@
|
|||||||
# endif
|
# endif
|
||||||
#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
|
#ifndef _LIBCPP_TYPE_VIS_ONLY
|
||||||
# define _LIBCPP_TYPE_VIS_ONLY _LIBCPP_TYPE_VIS
|
# define _LIBCPP_TYPE_VIS_ONLY _LIBCPP_TYPE_VIS
|
||||||
#endif
|
#endif
|
||||||
@@ -227,9 +272,12 @@
|
|||||||
|
|
||||||
#if defined(__clang__)
|
#if defined(__clang__)
|
||||||
|
|
||||||
#if defined(__APPLE__) && !defined(__i386__) && !defined(__x86_64__) && \
|
// _LIBCPP_ALTERNATE_STRING_LAYOUT is an old name for
|
||||||
!defined(__arm__)
|
// _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT left here for backward compatibility.
|
||||||
#define _LIBCPP_ALTERNATE_STRING_LAYOUT
|
#if (defined(__APPLE__) && !defined(__i386__) && !defined(__x86_64__) && \
|
||||||
|
!defined(__arm__)) || \
|
||||||
|
defined(_LIBCPP_ALTERNATE_STRING_LAYOUT)
|
||||||
|
#define _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if __has_feature(cxx_alignas)
|
#if __has_feature(cxx_alignas)
|
||||||
@@ -249,7 +297,7 @@ typedef __char16_t char16_t;
|
|||||||
typedef __char32_t char32_t;
|
typedef __char32_t char32_t;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !(__has_feature(cxx_exceptions))
|
#if !(__has_feature(cxx_exceptions)) && !defined(_LIBCPP_NO_EXCEPTIONS)
|
||||||
#define _LIBCPP_NO_EXCEPTIONS
|
#define _LIBCPP_NO_EXCEPTIONS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -271,7 +319,9 @@ typedef __char32_t char32_t;
|
|||||||
# define _LIBCPP_NORETURN __attribute__ ((noreturn))
|
# define _LIBCPP_NORETURN __attribute__ ((noreturn))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _LIBCPP_UNUSED __attribute__((__unused__))
|
#if !(__has_feature(cxx_default_function_template_args))
|
||||||
|
#define _LIBCPP_HAS_NO_DEFAULT_FUNCTION_TEMPLATE_ARGS
|
||||||
|
#endif
|
||||||
|
|
||||||
#if !(__has_feature(cxx_defaulted_functions))
|
#if !(__has_feature(cxx_defaulted_functions))
|
||||||
#define _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
#define _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||||
@@ -354,24 +404,23 @@ typedef __char32_t char32_t;
|
|||||||
#elif defined(__ANDROID__)
|
#elif defined(__ANDROID__)
|
||||||
#define _LIBCPP_HAS_QUICK_EXIT
|
#define _LIBCPP_HAS_QUICK_EXIT
|
||||||
#elif defined(__linux__)
|
#elif defined(__linux__)
|
||||||
#include <features.h>
|
#if !defined(_LIBCPP_HAS_MUSL_LIBC)
|
||||||
|
# include <features.h>
|
||||||
#if __GLIBC_PREREQ(2, 15)
|
#if __GLIBC_PREREQ(2, 15)
|
||||||
#define _LIBCPP_HAS_QUICK_EXIT
|
#define _LIBCPP_HAS_QUICK_EXIT
|
||||||
#endif
|
#endif
|
||||||
#if __GLIBC_PREREQ(2, 17)
|
#if __GLIBC_PREREQ(2, 17)
|
||||||
#define _LIBCPP_HAS_C11_FEATURES
|
#define _LIBCPP_HAS_C11_FEATURES
|
||||||
#endif
|
#endif
|
||||||
|
#else // defined(_LIBCPP_HAS_MUSL_LIBC)
|
||||||
|
#define _LIBCPP_HAS_QUICK_EXIT
|
||||||
|
#define _LIBCPP_HAS_C11_FEATURES
|
||||||
#endif
|
#endif
|
||||||
|
#endif // __linux__
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (__has_feature(cxx_noexcept))
|
#if !(__has_feature(cxx_noexcept))
|
||||||
# define _NOEXCEPT noexcept
|
#define _LIBCPP_HAS_NO_NOEXCEPT
|
||||||
# define _NOEXCEPT_(x) noexcept(x)
|
|
||||||
# define _NOEXCEPT_OR_FALSE(x) noexcept(x)
|
|
||||||
#else
|
|
||||||
# define _NOEXCEPT throw()
|
|
||||||
# define _NOEXCEPT_(x)
|
|
||||||
# define _NOEXCEPT_OR_FALSE(x) false
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if __has_feature(underlying_type)
|
#if __has_feature(underlying_type)
|
||||||
@@ -396,6 +445,11 @@ namespace std {
|
|||||||
#define _LIBCPP_HAS_NO_ASAN
|
#define _LIBCPP_HAS_NO_ASAN
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Allow for build-time disabling of unsigned integer sanitization
|
||||||
|
#if !defined(_LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK) && __has_attribute(no_sanitize)
|
||||||
|
#define _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK __attribute__((__no_sanitize__("unsigned-integer-overflow")))
|
||||||
|
#endif
|
||||||
|
|
||||||
#elif defined(__GNUC__)
|
#elif defined(__GNUC__)
|
||||||
|
|
||||||
#define _ALIGNAS(x) __attribute__((__aligned__(x)))
|
#define _ALIGNAS(x) __attribute__((__aligned__(x)))
|
||||||
@@ -403,8 +457,6 @@ namespace std {
|
|||||||
|
|
||||||
#define _LIBCPP_NORETURN __attribute__((noreturn))
|
#define _LIBCPP_NORETURN __attribute__((noreturn))
|
||||||
|
|
||||||
#define _LIBCPP_UNUSED __attribute__((__unused__))
|
|
||||||
|
|
||||||
#if _GNUC_VER >= 407
|
#if _GNUC_VER >= 407
|
||||||
#define _LIBCPP_UNDERLYING_TYPE(T) __underlying_type(T)
|
#define _LIBCPP_UNDERLYING_TYPE(T) __underlying_type(T)
|
||||||
#define _LIBCPP_IS_LITERAL(T) __is_literal_type(T)
|
#define _LIBCPP_IS_LITERAL(T) __is_literal_type(T)
|
||||||
@@ -419,8 +471,6 @@ namespace std {
|
|||||||
#define _LIBCPP_NO_EXCEPTIONS
|
#define _LIBCPP_NO_EXCEPTIONS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
|
||||||
|
|
||||||
// constexpr was added to GCC in 4.6.
|
// constexpr was added to GCC in 4.6.
|
||||||
#if _GNUC_VER < 406
|
#if _GNUC_VER < 406
|
||||||
#define _LIBCPP_HAS_NO_CONSTEXPR
|
#define _LIBCPP_HAS_NO_CONSTEXPR
|
||||||
@@ -429,19 +479,21 @@ namespace std {
|
|||||||
#define _LIBCPP_HAS_NO_CONSTEXPR
|
#define _LIBCPP_HAS_NO_CONSTEXPR
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// No version of GCC supports relaxed constexpr rules
|
// Determine if GCC supports relaxed constexpr
|
||||||
|
#if !defined(__cpp_constexpr) || __cpp_constexpr < 201304L
|
||||||
#define _LIBCPP_HAS_NO_CXX14_CONSTEXPR
|
#define _LIBCPP_HAS_NO_CXX14_CONSTEXPR
|
||||||
// GCC 5 will support variable templates
|
#endif
|
||||||
#define _LIBCPP_HAS_NO_VARIABLE_TEMPLATES
|
|
||||||
|
|
||||||
#define _NOEXCEPT throw()
|
// GCC 5 will support variable templates
|
||||||
#define _NOEXCEPT_(x)
|
#if !defined(__cpp_variable_templates) || __cpp_variable_templates < 201304L
|
||||||
#define _NOEXCEPT_OR_FALSE(x) false
|
#define _LIBCPP_HAS_NO_VARIABLE_TEMPLATES
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef __GXX_EXPERIMENTAL_CXX0X__
|
#ifndef __GXX_EXPERIMENTAL_CXX0X__
|
||||||
|
|
||||||
#define _LIBCPP_HAS_NO_ADVANCED_SFINAE
|
#define _LIBCPP_HAS_NO_ADVANCED_SFINAE
|
||||||
#define _LIBCPP_HAS_NO_DECLTYPE
|
#define _LIBCPP_HAS_NO_DECLTYPE
|
||||||
|
#define _LIBCPP_HAS_NO_DEFAULT_FUNCTION_TEMPLATE_ARGS
|
||||||
#define _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
#define _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||||
#define _LIBCPP_HAS_NO_DELETED_FUNCTIONS
|
#define _LIBCPP_HAS_NO_DELETED_FUNCTIONS
|
||||||
#define _LIBCPP_HAS_NO_NULLPTR
|
#define _LIBCPP_HAS_NO_NULLPTR
|
||||||
@@ -449,32 +501,32 @@ namespace std {
|
|||||||
#define _LIBCPP_HAS_NO_UNICODE_CHARS
|
#define _LIBCPP_HAS_NO_UNICODE_CHARS
|
||||||
#define _LIBCPP_HAS_NO_VARIADICS
|
#define _LIBCPP_HAS_NO_VARIADICS
|
||||||
#define _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#define _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
#define _LIBCPP_HAS_NO_ALWAYS_INLINE_VARIADICS
|
|
||||||
#define _LIBCPP_HAS_NO_STRONG_ENUMS
|
#define _LIBCPP_HAS_NO_STRONG_ENUMS
|
||||||
|
#define _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||||
|
#define _LIBCPP_HAS_NO_NOEXCEPT
|
||||||
|
|
||||||
#else // __GXX_EXPERIMENTAL_CXX0X__
|
#else // __GXX_EXPERIMENTAL_CXX0X__
|
||||||
|
|
||||||
#define _LIBCPP_HAS_NO_TRAILING_RETURN
|
|
||||||
#define _LIBCPP_HAS_NO_ALWAYS_INLINE_VARIADICS
|
|
||||||
|
|
||||||
#if _GNUC_VER < 403
|
#if _GNUC_VER < 403
|
||||||
|
#define _LIBCPP_HAS_NO_DEFAULT_FUNCTION_TEMPLATE_ARGS
|
||||||
#define _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#define _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
#endif
|
|
||||||
|
|
||||||
#if _GNUC_VER < 403
|
|
||||||
#define _LIBCPP_HAS_NO_STATIC_ASSERT
|
#define _LIBCPP_HAS_NO_STATIC_ASSERT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if _GNUC_VER < 404
|
#if _GNUC_VER < 404
|
||||||
#define _LIBCPP_HAS_NO_DECLTYPE
|
#define _LIBCPP_HAS_NO_DECLTYPE
|
||||||
#define _LIBCPP_HAS_NO_DELETED_FUNCTIONS
|
#define _LIBCPP_HAS_NO_DELETED_FUNCTIONS
|
||||||
|
#define _LIBCPP_HAS_NO_TRAILING_RETURN
|
||||||
#define _LIBCPP_HAS_NO_UNICODE_CHARS
|
#define _LIBCPP_HAS_NO_UNICODE_CHARS
|
||||||
#define _LIBCPP_HAS_NO_VARIADICS
|
#define _LIBCPP_HAS_NO_VARIADICS
|
||||||
#define _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
#define _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
||||||
#endif // _GNUC_VER < 404
|
#endif // _GNUC_VER < 404
|
||||||
|
|
||||||
#if _GNUC_VER < 406
|
#if _GNUC_VER < 406
|
||||||
|
#define _LIBCPP_HAS_NO_NOEXCEPT
|
||||||
#define _LIBCPP_HAS_NO_NULLPTR
|
#define _LIBCPP_HAS_NO_NULLPTR
|
||||||
|
#define _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if _GNUC_VER < 407
|
#if _GNUC_VER < 407
|
||||||
@@ -501,22 +553,19 @@ using namespace _LIBCPP_NAMESPACE __attribute__((__strong__));
|
|||||||
#elif defined(_LIBCPP_MSVC)
|
#elif defined(_LIBCPP_MSVC)
|
||||||
|
|
||||||
#define _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
#define _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||||
#define _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER
|
|
||||||
#define _LIBCPP_HAS_NO_CONSTEXPR
|
#define _LIBCPP_HAS_NO_CONSTEXPR
|
||||||
#define _LIBCPP_HAS_NO_CXX14_CONSTEXPR
|
#define _LIBCPP_HAS_NO_CXX14_CONSTEXPR
|
||||||
#define _LIBCPP_HAS_NO_VARIABLE_TEMPLATES
|
#define _LIBCPP_HAS_NO_VARIABLE_TEMPLATES
|
||||||
#define _LIBCPP_HAS_NO_UNICODE_CHARS
|
#define _LIBCPP_HAS_NO_UNICODE_CHARS
|
||||||
#define _LIBCPP_HAS_NO_DELETED_FUNCTIONS
|
#define _LIBCPP_HAS_NO_DELETED_FUNCTIONS
|
||||||
#define _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
#define _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||||
|
#define _LIBCPP_HAS_NO_NOEXCEPT
|
||||||
#define __alignof__ __alignof
|
#define __alignof__ __alignof
|
||||||
#define _LIBCPP_NORETURN __declspec(noreturn)
|
#define _LIBCPP_NORETURN __declspec(noreturn)
|
||||||
#define _LIBCPP_UNUSED
|
|
||||||
#define _ALIGNAS(x) __declspec(align(x))
|
#define _ALIGNAS(x) __declspec(align(x))
|
||||||
#define _LIBCPP_HAS_NO_VARIADICS
|
#define _LIBCPP_HAS_NO_VARIADICS
|
||||||
|
|
||||||
#define _NOEXCEPT throw ()
|
|
||||||
#define _NOEXCEPT_(x)
|
|
||||||
#define _NOEXCEPT_OR_FALSE(x) false
|
|
||||||
|
|
||||||
#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std {
|
#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std {
|
||||||
#define _LIBCPP_END_NAMESPACE_STD }
|
#define _LIBCPP_END_NAMESPACE_STD }
|
||||||
@@ -534,16 +583,12 @@ namespace std {
|
|||||||
#define _ALIGNAS_TYPE(x) __attribute__((__aligned__(__alignof(x))))
|
#define _ALIGNAS_TYPE(x) __attribute__((__aligned__(__alignof(x))))
|
||||||
#define _ATTRIBUTE(x) __attribute__((x))
|
#define _ATTRIBUTE(x) __attribute__((x))
|
||||||
#define _LIBCPP_NORETURN __attribute__((noreturn))
|
#define _LIBCPP_NORETURN __attribute__((noreturn))
|
||||||
#define _LIBCPP_UNUSED
|
|
||||||
|
|
||||||
#define _NOEXCEPT throw()
|
|
||||||
#define _NOEXCEPT_(x)
|
|
||||||
#define _NOEXCEPT_OR_FALSE(x) false
|
|
||||||
|
|
||||||
|
#define _LIBCPP_HAS_NO_DEFAULT_FUNCTION_TEMPLATE_ARGS
|
||||||
#define _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
#define _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||||
#define _LIBCPP_HAS_NO_ADVANCED_SFINAE
|
#define _LIBCPP_HAS_NO_ADVANCED_SFINAE
|
||||||
#define _LIBCPP_HAS_NO_ALWAYS_INLINE_VARIADICS
|
|
||||||
#define _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
#define _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
||||||
|
#define _LIBCPP_HAS_NO_NOEXCEPT
|
||||||
#define _LIBCPP_HAS_NO_NULLPTR
|
#define _LIBCPP_HAS_NO_NULLPTR
|
||||||
#define _LIBCPP_HAS_NO_UNICODE_CHARS
|
#define _LIBCPP_HAS_NO_UNICODE_CHARS
|
||||||
#define _LIBCPP_HAS_IS_BASE_OF
|
#define _LIBCPP_HAS_IS_BASE_OF
|
||||||
@@ -567,6 +612,14 @@ namespace std {
|
|||||||
|
|
||||||
#endif // __clang__ || __GNUC__ || _MSC_VER || __IBMCPP__
|
#endif // __clang__ || __GNUC__ || _MSC_VER || __IBMCPP__
|
||||||
|
|
||||||
|
#ifndef _LIBCPP_HAS_NO_NOEXCEPT
|
||||||
|
# define _NOEXCEPT noexcept
|
||||||
|
# define _NOEXCEPT_(x) noexcept(x)
|
||||||
|
#else
|
||||||
|
# define _NOEXCEPT throw()
|
||||||
|
# define _NOEXCEPT_(x)
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef _LIBCPP_HAS_NO_UNICODE_CHARS
|
#ifdef _LIBCPP_HAS_NO_UNICODE_CHARS
|
||||||
typedef unsigned short char16_t;
|
typedef unsigned short char16_t;
|
||||||
typedef unsigned int char32_t;
|
typedef unsigned int char32_t;
|
||||||
@@ -578,9 +631,11 @@ typedef unsigned int char32_t;
|
|||||||
|
|
||||||
#ifdef _LIBCPP_HAS_NO_STATIC_ASSERT
|
#ifdef _LIBCPP_HAS_NO_STATIC_ASSERT
|
||||||
|
|
||||||
|
extern "C++" {
|
||||||
template <bool> struct __static_assert_test;
|
template <bool> struct __static_assert_test;
|
||||||
template <> struct __static_assert_test<true> {};
|
template <> struct __static_assert_test<true> {};
|
||||||
template <unsigned> struct __static_assert_check {};
|
template <unsigned> struct __static_assert_check {};
|
||||||
|
}
|
||||||
#define static_assert(__b, __m) \
|
#define static_assert(__b, __m) \
|
||||||
typedef __static_assert_check<sizeof(__static_assert_test<(__b)>)> \
|
typedef __static_assert_check<sizeof(__static_assert_test<(__b)>)> \
|
||||||
_LIBCPP_CONCAT(__t, __LINE__)
|
_LIBCPP_CONCAT(__t, __LINE__)
|
||||||
@@ -608,6 +663,12 @@ template <unsigned> struct __static_assert_check {};
|
|||||||
#define _LIBCPP_DEFAULT = default;
|
#define _LIBCPP_DEFAULT = default;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef _LIBCPP_HAS_NO_DELETED_FUNCTIONS
|
||||||
|
#define _LIBCPP_EQUAL_DELETE
|
||||||
|
#else
|
||||||
|
#define _LIBCPP_EQUAL_DELETE = delete
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
#define _NOALIAS __attribute__((__malloc__))
|
#define _NOALIAS __attribute__((__malloc__))
|
||||||
#else
|
#else
|
||||||
@@ -665,10 +726,12 @@ template <unsigned> struct __static_assert_check {};
|
|||||||
#define _LIBCPP_LOCALE__L_EXTENSIONS 1
|
#define _LIBCPP_LOCALE__L_EXTENSIONS 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(_WIN32) && !defined(__ANDROID__) && !defined(_NEWLIB_VERSION) && \
|
#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__))
|
||||||
!defined(__CloudABI__)
|
// Most unix variants have catopen. These are the specific ones that don't.
|
||||||
|
#if !defined(_WIN32) && !defined(__ANDROID__) && !defined(_NEWLIB_VERSION)
|
||||||
#define _LIBCPP_HAS_CATOPEN 1
|
#define _LIBCPP_HAS_CATOPEN 1
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
#define _DECLARE_C99_LDBL_MATH 1
|
#define _DECLARE_C99_LDBL_MATH 1
|
||||||
@@ -716,6 +779,18 @@ template <unsigned> struct __static_assert_check {};
|
|||||||
#define _LIBCPP_CONSTEXPR_AFTER_CXX11
|
#define _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_CXX14_CONSTEXPR)
|
||||||
|
#define _LIBCPP_CONSTEXPR_AFTER_CXX14 constexpr
|
||||||
|
#else
|
||||||
|
#define _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
# define _LIBCPP_EXPLICIT_MOVE(x) _VSTD::move(x)
|
||||||
|
#else
|
||||||
|
# define _LIBCPP_EXPLICIT_MOVE(x) (x)
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef _LIBCPP_HAS_NO_ASAN
|
#ifndef _LIBCPP_HAS_NO_ASAN
|
||||||
extern "C" void __sanitizer_annotate_contiguous_container(
|
extern "C" void __sanitizer_annotate_contiguous_container(
|
||||||
const void *, const void *, const void *, const void *);
|
const void *, const void *, const void *, const void *);
|
||||||
@@ -725,7 +800,7 @@ extern "C" void __sanitizer_annotate_contiguous_container(
|
|||||||
// g++ and cl.exe have RTTI on by default and define a macro when it is.
|
// g++ and cl.exe have RTTI on by default and define a macro when it is.
|
||||||
// g++ only defines the macro in 4.3.2 and onwards.
|
// g++ only defines the macro in 4.3.2 and onwards.
|
||||||
#if !defined(_LIBCPP_NO_RTTI)
|
#if !defined(_LIBCPP_NO_RTTI)
|
||||||
# if defined(__GNUG__) && ((__GNUC__ >= 5) || (__GNUC__ == 4 && \
|
# if defined(__GNUC__) && ((__GNUC__ >= 5) || (__GNUC__ == 4 && \
|
||||||
(__GNUC_MINOR__ >= 3 || __GNUC_PATCHLEVEL__ >= 2))) && !defined(__GXX_RTTI)
|
(__GNUC_MINOR__ >= 3 || __GNUC_PATCHLEVEL__ >= 2))) && !defined(__GXX_RTTI)
|
||||||
# define _LIBCPP_NO_RTTI
|
# define _LIBCPP_NO_RTTI
|
||||||
# elif (defined(_MSC_VER) && !defined(__clang__)) && !defined(_CPPRTTI)
|
# elif (defined(_MSC_VER) && !defined(__clang__)) && !defined(_CPPRTTI)
|
||||||
@@ -737,6 +812,21 @@ extern "C" void __sanitizer_annotate_contiguous_container(
|
|||||||
# define _LIBCPP_WEAK __attribute__((__weak__))
|
# define _LIBCPP_WEAK __attribute__((__weak__))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Thread API
|
||||||
|
#ifndef _LIBCPP_HAS_NO_THREADS
|
||||||
|
# if defined(__FreeBSD__) || \
|
||||||
|
defined(__NetBSD__) || \
|
||||||
|
defined(__linux__) || \
|
||||||
|
defined(__APPLE__) || \
|
||||||
|
defined(__CloudABI__) || \
|
||||||
|
defined(__sun__)
|
||||||
|
# define _LIBCPP_THREAD_API_PTHREAD
|
||||||
|
# else
|
||||||
|
# error "No thread API"
|
||||||
|
# endif // _LIBCPP_THREAD_API
|
||||||
|
#endif // _LIBCPP_HAS_NO_THREADS
|
||||||
|
|
||||||
|
|
||||||
#if defined(_LIBCPP_HAS_NO_MONOTONIC_CLOCK) && !defined(_LIBCPP_HAS_NO_THREADS)
|
#if defined(_LIBCPP_HAS_NO_MONOTONIC_CLOCK) && !defined(_LIBCPP_HAS_NO_THREADS)
|
||||||
# error _LIBCPP_HAS_NO_MONOTONIC_CLOCK may only be defined when \
|
# error _LIBCPP_HAS_NO_MONOTONIC_CLOCK may only be defined when \
|
||||||
_LIBCPP_HAS_NO_THREADS is defined.
|
_LIBCPP_HAS_NO_THREADS is defined.
|
||||||
@@ -757,7 +847,7 @@ extern "C" void __sanitizer_annotate_contiguous_container(
|
|||||||
#define _LIBCPP_HAS_NO_STDOUT
|
#define _LIBCPP_HAS_NO_STDOUT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__ANDROID__) || defined(__CloudABI__)
|
#if defined(__ANDROID__) || defined(__CloudABI__) || defined(_LIBCPP_HAS_MUSL_LIBC)
|
||||||
#define _LIBCPP_PROVIDES_DEFAULT_RUNE_TABLE
|
#define _LIBCPP_PROVIDES_DEFAULT_RUNE_TABLE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -767,4 +857,34 @@ extern "C" void __sanitizer_annotate_contiguous_container(
|
|||||||
#define _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS
|
#define _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if __has_feature(cxx_atomic) || __has_extension(c_atomic)
|
||||||
|
#define _LIBCPP_HAS_C_ATOMIC_IMP
|
||||||
|
#elif _GNUC_VER > 407
|
||||||
|
#define _LIBCPP_HAS_GCC_ATOMIC_IMP
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (!defined(_LIBCPP_HAS_C_ATOMIC_IMP) && !defined(_LIBCPP_HAS_GCC_ATOMIC_IMP)) \
|
||||||
|
|| defined(_LIBCPP_HAS_NO_THREADS)
|
||||||
|
#define _LIBCPP_HAS_NO_ATOMIC_HEADER
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
|
||||||
|
#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
|
||||||
|
|
||||||
|
#endif // __cplusplus
|
||||||
|
|
||||||
#endif // _LIBCPP_CONFIG
|
#endif // _LIBCPP_CONFIG
|
||||||
|
|||||||
23
include/__config_site.in
Normal file
23
include/__config_site.in
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// 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_CONFIG_SITE
|
||||||
|
#define _LIBCPP_CONFIG_SITE
|
||||||
|
|
||||||
|
#cmakedefine _LIBCPP_ABI_VERSION @_LIBCPP_ABI_VERSION@
|
||||||
|
#cmakedefine _LIBCPP_ABI_UNSTABLE
|
||||||
|
#cmakedefine _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
|
||||||
|
#cmakedefine _LIBCPP_HAS_NO_STDIN
|
||||||
|
#cmakedefine _LIBCPP_HAS_NO_STDOUT
|
||||||
|
#cmakedefine _LIBCPP_HAS_NO_THREADS
|
||||||
|
#cmakedefine _LIBCPP_HAS_NO_MONOTONIC_CLOCK
|
||||||
|
#cmakedefine _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS
|
||||||
|
#cmakedefine _LIBCPP_HAS_MUSL_LIBC
|
||||||
|
|
||||||
|
#endif // _LIBCPP_CONFIG_SITE
|
||||||
@@ -451,15 +451,6 @@ class _LIBCPP_TYPE_VIS_ONLY function<_Rp()>
|
|||||||
aligned_storage<3*sizeof(void*)>::type __buf_;
|
aligned_storage<3*sizeof(void*)>::type __buf_;
|
||||||
__base* __f_;
|
__base* __f_;
|
||||||
|
|
||||||
template <class _Fp>
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
static bool __not_null(const _Fp&) {return true;}
|
|
||||||
template <class _R2>
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
static bool __not_null(_R2 (*__p)()) {return __p;}
|
|
||||||
template <class _R2>
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
static bool __not_null(const function<_R2()>& __p) {return __p;}
|
|
||||||
public:
|
public:
|
||||||
typedef _Rp result_type;
|
typedef _Rp result_type;
|
||||||
|
|
||||||
@@ -558,7 +549,7 @@ function<_Rp()>::function(_Fp __f,
|
|||||||
typename enable_if<!is_integral<_Fp>::value>::type*)
|
typename enable_if<!is_integral<_Fp>::value>::type*)
|
||||||
: __f_(0)
|
: __f_(0)
|
||||||
{
|
{
|
||||||
if (__not_null(__f))
|
if (__function::__not_null(__f))
|
||||||
{
|
{
|
||||||
typedef __function::__func<_Fp, allocator<_Fp>, _Rp()> _FF;
|
typedef __function::__func<_Fp, allocator<_Fp>, _Rp()> _FF;
|
||||||
if (sizeof(_FF) <= sizeof(__buf_))
|
if (sizeof(_FF) <= sizeof(__buf_))
|
||||||
@@ -585,7 +576,7 @@ function<_Rp()>::function(allocator_arg_t, const _Alloc& __a0, _Fp __f,
|
|||||||
: __f_(0)
|
: __f_(0)
|
||||||
{
|
{
|
||||||
typedef allocator_traits<_Alloc> __alloc_traits;
|
typedef allocator_traits<_Alloc> __alloc_traits;
|
||||||
if (__not_null(__f))
|
if (__function::__not_null(__f))
|
||||||
{
|
{
|
||||||
typedef __function::__func<_Fp, _Alloc, _Rp()> _FF;
|
typedef __function::__func<_Fp, _Alloc, _Rp()> _FF;
|
||||||
if (sizeof(_FF) <= sizeof(__buf_))
|
if (sizeof(_FF) <= sizeof(__buf_))
|
||||||
@@ -736,27 +727,6 @@ class _LIBCPP_TYPE_VIS_ONLY function<_Rp(_A0)>
|
|||||||
aligned_storage<3*sizeof(void*)>::type __buf_;
|
aligned_storage<3*sizeof(void*)>::type __buf_;
|
||||||
__base* __f_;
|
__base* __f_;
|
||||||
|
|
||||||
template <class _Fp>
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
static bool __not_null(const _Fp&) {return true;}
|
|
||||||
template <class _R2, class _B0>
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
static bool __not_null(_R2 (*__p)(_B0)) {return __p;}
|
|
||||||
template <class _R2, class _Cp>
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
static bool __not_null(_R2 (_Cp::*__p)()) {return __p;}
|
|
||||||
template <class _R2, class _Cp>
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
static bool __not_null(_R2 (_Cp::*__p)() const) {return __p;}
|
|
||||||
template <class _R2, class _Cp>
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
static bool __not_null(_R2 (_Cp::*__p)() volatile) {return __p;}
|
|
||||||
template <class _R2, class _Cp>
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
static bool __not_null(_R2 (_Cp::*__p)() const volatile) {return __p;}
|
|
||||||
template <class _R2, class _B0>
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
static bool __not_null(const function<_R2(_B0)>& __p) {return __p;}
|
|
||||||
public:
|
public:
|
||||||
typedef _Rp result_type;
|
typedef _Rp result_type;
|
||||||
|
|
||||||
@@ -855,7 +825,7 @@ function<_Rp(_A0)>::function(_Fp __f,
|
|||||||
typename enable_if<!is_integral<_Fp>::value>::type*)
|
typename enable_if<!is_integral<_Fp>::value>::type*)
|
||||||
: __f_(0)
|
: __f_(0)
|
||||||
{
|
{
|
||||||
if (__not_null(__f))
|
if (__function::__not_null(__f))
|
||||||
{
|
{
|
||||||
typedef __function::__func<_Fp, allocator<_Fp>, _Rp(_A0)> _FF;
|
typedef __function::__func<_Fp, allocator<_Fp>, _Rp(_A0)> _FF;
|
||||||
if (sizeof(_FF) <= sizeof(__buf_))
|
if (sizeof(_FF) <= sizeof(__buf_))
|
||||||
@@ -882,7 +852,7 @@ function<_Rp(_A0)>::function(allocator_arg_t, const _Alloc& __a0, _Fp __f,
|
|||||||
: __f_(0)
|
: __f_(0)
|
||||||
{
|
{
|
||||||
typedef allocator_traits<_Alloc> __alloc_traits;
|
typedef allocator_traits<_Alloc> __alloc_traits;
|
||||||
if (__not_null(__f))
|
if (__function::__not_null(__f))
|
||||||
{
|
{
|
||||||
typedef __function::__func<_Fp, _Alloc, _Rp(_A0)> _FF;
|
typedef __function::__func<_Fp, _Alloc, _Rp(_A0)> _FF;
|
||||||
if (sizeof(_FF) <= sizeof(__buf_))
|
if (sizeof(_FF) <= sizeof(__buf_))
|
||||||
@@ -1033,27 +1003,6 @@ class _LIBCPP_TYPE_VIS_ONLY function<_Rp(_A0, _A1)>
|
|||||||
aligned_storage<3*sizeof(void*)>::type __buf_;
|
aligned_storage<3*sizeof(void*)>::type __buf_;
|
||||||
__base* __f_;
|
__base* __f_;
|
||||||
|
|
||||||
template <class _Fp>
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
static bool __not_null(const _Fp&) {return true;}
|
|
||||||
template <class _R2, class _B0, class _B1>
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
static bool __not_null(_R2 (*__p)(_B0, _B1)) {return __p;}
|
|
||||||
template <class _R2, class _Cp, class _B1>
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
static bool __not_null(_R2 (_Cp::*__p)(_B1)) {return __p;}
|
|
||||||
template <class _R2, class _Cp, class _B1>
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
static bool __not_null(_R2 (_Cp::*__p)(_B1) const) {return __p;}
|
|
||||||
template <class _R2, class _Cp, class _B1>
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
static bool __not_null(_R2 (_Cp::*__p)(_B1) volatile) {return __p;}
|
|
||||||
template <class _R2, class _Cp, class _B1>
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
static bool __not_null(_R2 (_Cp::*__p)(_B1) const volatile) {return __p;}
|
|
||||||
template <class _R2, class _B0, class _B1>
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
static bool __not_null(const function<_R2(_B0, _B1)>& __p) {return __p;}
|
|
||||||
public:
|
public:
|
||||||
typedef _Rp result_type;
|
typedef _Rp result_type;
|
||||||
|
|
||||||
@@ -1152,7 +1101,7 @@ function<_Rp(_A0, _A1)>::function(_Fp __f,
|
|||||||
typename enable_if<!is_integral<_Fp>::value>::type*)
|
typename enable_if<!is_integral<_Fp>::value>::type*)
|
||||||
: __f_(0)
|
: __f_(0)
|
||||||
{
|
{
|
||||||
if (__not_null(__f))
|
if (__function::__not_null(__f))
|
||||||
{
|
{
|
||||||
typedef __function::__func<_Fp, allocator<_Fp>, _Rp(_A0, _A1)> _FF;
|
typedef __function::__func<_Fp, allocator<_Fp>, _Rp(_A0, _A1)> _FF;
|
||||||
if (sizeof(_FF) <= sizeof(__buf_))
|
if (sizeof(_FF) <= sizeof(__buf_))
|
||||||
@@ -1179,7 +1128,7 @@ function<_Rp(_A0, _A1)>::function(allocator_arg_t, const _Alloc& __a0, _Fp __f,
|
|||||||
: __f_(0)
|
: __f_(0)
|
||||||
{
|
{
|
||||||
typedef allocator_traits<_Alloc> __alloc_traits;
|
typedef allocator_traits<_Alloc> __alloc_traits;
|
||||||
if (__not_null(__f))
|
if (__function::__not_null(__f))
|
||||||
{
|
{
|
||||||
typedef __function::__func<_Fp, _Alloc, _Rp(_A0, _A1)> _FF;
|
typedef __function::__func<_Fp, _Alloc, _Rp(_A0, _A1)> _FF;
|
||||||
if (sizeof(_FF) <= sizeof(__buf_))
|
if (sizeof(_FF) <= sizeof(__buf_))
|
||||||
@@ -1329,27 +1278,6 @@ class _LIBCPP_TYPE_VIS_ONLY function<_Rp(_A0, _A1, _A2)>
|
|||||||
aligned_storage<3*sizeof(void*)>::type __buf_;
|
aligned_storage<3*sizeof(void*)>::type __buf_;
|
||||||
__base* __f_;
|
__base* __f_;
|
||||||
|
|
||||||
template <class _Fp>
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
static bool __not_null(const _Fp&) {return true;}
|
|
||||||
template <class _R2, class _B0, class _B1, class _B2>
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
static bool __not_null(_R2 (*__p)(_B0, _B1, _B2)) {return __p;}
|
|
||||||
template <class _R2, class _Cp, class _B1, class _B2>
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
static bool __not_null(_R2 (_Cp::*__p)(_B1, _B2)) {return __p;}
|
|
||||||
template <class _R2, class _Cp, class _B1, class _B2>
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
static bool __not_null(_R2 (_Cp::*__p)(_B1, _B2) const) {return __p;}
|
|
||||||
template <class _R2, class _Cp, class _B1, class _B2>
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
static bool __not_null(_R2 (_Cp::*__p)(_B1, _B2) volatile) {return __p;}
|
|
||||||
template <class _R2, class _Cp, class _B1, class _B2>
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
static bool __not_null(_R2 (_Cp::*__p)(_B1, _B2) const volatile) {return __p;}
|
|
||||||
template <class _R2, class _B0, class _B1, class _B2>
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
static bool __not_null(const function<_R2(_B0, _B1, _B2)>& __p) {return __p;}
|
|
||||||
public:
|
public:
|
||||||
typedef _Rp result_type;
|
typedef _Rp result_type;
|
||||||
|
|
||||||
@@ -1449,7 +1377,7 @@ function<_Rp(_A0, _A1, _A2)>::function(_Fp __f,
|
|||||||
typename enable_if<!is_integral<_Fp>::value>::type*)
|
typename enable_if<!is_integral<_Fp>::value>::type*)
|
||||||
: __f_(0)
|
: __f_(0)
|
||||||
{
|
{
|
||||||
if (__not_null(__f))
|
if (__function::__not_null(__f))
|
||||||
{
|
{
|
||||||
typedef __function::__func<_Fp, allocator<_Fp>, _Rp(_A0, _A1, _A2)> _FF;
|
typedef __function::__func<_Fp, allocator<_Fp>, _Rp(_A0, _A1, _A2)> _FF;
|
||||||
if (sizeof(_FF) <= sizeof(__buf_))
|
if (sizeof(_FF) <= sizeof(__buf_))
|
||||||
@@ -1476,7 +1404,7 @@ function<_Rp(_A0, _A1, _A2)>::function(allocator_arg_t, const _Alloc& __a0, _Fp
|
|||||||
: __f_(0)
|
: __f_(0)
|
||||||
{
|
{
|
||||||
typedef allocator_traits<_Alloc> __alloc_traits;
|
typedef allocator_traits<_Alloc> __alloc_traits;
|
||||||
if (__not_null(__f))
|
if (__function::__not_null(__f))
|
||||||
{
|
{
|
||||||
typedef __function::__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)> _FF;
|
typedef __function::__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)> _FF;
|
||||||
if (sizeof(_FF) <= sizeof(__buf_))
|
if (sizeof(_FF) <= sizeof(__buf_))
|
||||||
|
|||||||
@@ -38,8 +38,6 @@ struct _LIBCPP_TYPE_VIS_ONLY binary_function
|
|||||||
typedef _Result result_type;
|
typedef _Result result_type;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class _Tp> struct _LIBCPP_TYPE_VIS_ONLY hash;
|
|
||||||
|
|
||||||
template <class _Tp>
|
template <class _Tp>
|
||||||
struct __has_result_type
|
struct __has_result_type
|
||||||
{
|
{
|
||||||
@@ -77,57 +75,6 @@ struct _LIBCPP_TYPE_VIS_ONLY less<void>
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// addressof
|
|
||||||
|
|
||||||
template <class _Tp>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
_Tp*
|
|
||||||
addressof(_Tp& __x) _NOEXCEPT
|
|
||||||
{
|
|
||||||
return (_Tp*)&reinterpret_cast<const volatile char&>(__x);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(_LIBCPP_HAS_OBJC_ARC) && !defined(_LIBCPP_PREDEFINED_OBJC_ARC_ADDRESSOF)
|
|
||||||
// Objective-C++ Automatic Reference Counting uses qualified pointers
|
|
||||||
// that require special addressof() signatures. When
|
|
||||||
// _LIBCPP_PREDEFINED_OBJC_ARC_ADDRESSOF is defined, the compiler
|
|
||||||
// itself is providing these definitions. Otherwise, we provide them.
|
|
||||||
template <class _Tp>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
__strong _Tp*
|
|
||||||
addressof(__strong _Tp& __x) _NOEXCEPT
|
|
||||||
{
|
|
||||||
return &__x;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef _LIBCPP_HAS_OBJC_ARC_WEAK
|
|
||||||
template <class _Tp>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
__weak _Tp*
|
|
||||||
addressof(__weak _Tp& __x) _NOEXCEPT
|
|
||||||
{
|
|
||||||
return &__x;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
template <class _Tp>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
__autoreleasing _Tp*
|
|
||||||
addressof(__autoreleasing _Tp& __x) _NOEXCEPT
|
|
||||||
{
|
|
||||||
return &__x;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Tp>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
__unsafe_unretained _Tp*
|
|
||||||
addressof(__unsafe_unretained _Tp& __x) _NOEXCEPT
|
|
||||||
{
|
|
||||||
return &__x;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
// __weak_result_type
|
// __weak_result_type
|
||||||
|
|
||||||
template <class _Tp>
|
template <class _Tp>
|
||||||
@@ -357,75 +304,19 @@ struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...) const volatile>
|
|||||||
|
|
||||||
#endif // _LIBCPP_HAS_NO_VARIADICS
|
#endif // _LIBCPP_HAS_NO_VARIADICS
|
||||||
|
|
||||||
// __invoke
|
#ifndef _LIBCPP_CXX03_LANG
|
||||||
|
|
||||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
|
||||||
|
|
||||||
// bullets 1 and 2
|
|
||||||
|
|
||||||
template <class _Fp, class _A0, class ..._Args,
|
|
||||||
class>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
auto
|
|
||||||
__invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args)
|
|
||||||
-> decltype((_VSTD::forward<_A0>(__a0).*__f)(_VSTD::forward<_Args>(__args)...))
|
|
||||||
{
|
|
||||||
return (_VSTD::forward<_A0>(__a0).*__f)(_VSTD::forward<_Args>(__args)...);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Fp, class _A0, class ..._Args,
|
|
||||||
class>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
auto
|
|
||||||
__invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args)
|
|
||||||
-> decltype(((*_VSTD::forward<_A0>(__a0)).*__f)(_VSTD::forward<_Args>(__args)...))
|
|
||||||
{
|
|
||||||
return ((*_VSTD::forward<_A0>(__a0)).*__f)(_VSTD::forward<_Args>(__args)...);
|
|
||||||
}
|
|
||||||
|
|
||||||
// bullets 3 and 4
|
|
||||||
|
|
||||||
template <class _Fp, class _A0,
|
|
||||||
class>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
auto
|
|
||||||
__invoke(_Fp&& __f, _A0&& __a0)
|
|
||||||
-> decltype(_VSTD::forward<_A0>(__a0).*__f)
|
|
||||||
{
|
|
||||||
return _VSTD::forward<_A0>(__a0).*__f;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Fp, class _A0,
|
|
||||||
class>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
auto
|
|
||||||
__invoke(_Fp&& __f, _A0&& __a0)
|
|
||||||
-> decltype((*_VSTD::forward<_A0>(__a0)).*__f)
|
|
||||||
{
|
|
||||||
return (*_VSTD::forward<_A0>(__a0)).*__f;
|
|
||||||
}
|
|
||||||
|
|
||||||
// bullet 5
|
|
||||||
|
|
||||||
template <class _Fp, class ..._Args>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
auto
|
|
||||||
__invoke(_Fp&& __f, _Args&& ...__args)
|
|
||||||
-> decltype(_VSTD::forward<_Fp>(__f)(_VSTD::forward<_Args>(__args)...))
|
|
||||||
{
|
|
||||||
return _VSTD::forward<_Fp>(__f)(_VSTD::forward<_Args>(__args)...);
|
|
||||||
}
|
|
||||||
template <class _Tp, class ..._Args>
|
template <class _Tp, class ..._Args>
|
||||||
struct __invoke_return
|
struct __invoke_return
|
||||||
{
|
{
|
||||||
typedef decltype(__invoke(_VSTD::declval<_Tp>(), _VSTD::declval<_Args>()...)) type;
|
typedef decltype(__invoke(_VSTD::declval<_Tp>(), _VSTD::declval<_Args>()...)) type;
|
||||||
};
|
};
|
||||||
|
|
||||||
#else // _LIBCPP_HAS_NO_VARIADICS
|
#else // defined(_LIBCPP_CXX03_LANG)
|
||||||
|
|
||||||
#include <__functional_base_03>
|
#include <__functional_base_03>
|
||||||
|
|
||||||
#endif // _LIBCPP_HAS_NO_VARIADICS
|
#endif // !defined(_LIBCPP_CXX03_LANG)
|
||||||
|
|
||||||
|
|
||||||
template <class _Ret>
|
template <class _Ret>
|
||||||
@@ -517,49 +408,117 @@ public:
|
|||||||
template <class... _ArgTypes>
|
template <class... _ArgTypes>
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
typename __invoke_of<type&, _ArgTypes...>::type
|
typename __invoke_of<type&, _ArgTypes...>::type
|
||||||
operator() (_ArgTypes&&... __args) const
|
operator() (_ArgTypes&&... __args) const {
|
||||||
{
|
|
||||||
return __invoke(get(), _VSTD::forward<_ArgTypes>(__args)...);
|
return __invoke(get(), _VSTD::forward<_ArgTypes>(__args)...);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
typename __invoke_return<type>::type
|
typename __invoke_return<type>::type
|
||||||
operator() () const
|
operator() () const {
|
||||||
{
|
|
||||||
return __invoke(get());
|
return __invoke(get());
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class _A0>
|
template <class _A0>
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
typename __invoke_return0<type&, _A0>::type
|
typename __invoke_return0<type, _A0>::type
|
||||||
operator() (_A0& __a0) const
|
operator() (_A0& __a0) const {
|
||||||
{
|
return __invoke(get(), __a0);
|
||||||
return __invoke<type&, _A0>(get(), __a0);
|
}
|
||||||
|
|
||||||
|
template <class _A0>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
typename __invoke_return0<type, _A0 const>::type
|
||||||
|
operator() (_A0 const& __a0) const {
|
||||||
|
return __invoke(get(), __a0);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class _A0, class _A1>
|
template <class _A0, class _A1>
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
typename __invoke_return1<type&, _A0, _A1>::type
|
typename __invoke_return1<type, _A0, _A1>::type
|
||||||
operator() (_A0& __a0, _A1& __a1) const
|
operator() (_A0& __a0, _A1& __a1) const {
|
||||||
{
|
return __invoke(get(), __a0, __a1);
|
||||||
return __invoke<type&, _A0, _A1>(get(), __a0, __a1);
|
}
|
||||||
|
|
||||||
|
template <class _A0, class _A1>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
typename __invoke_return1<type, _A0 const, _A1>::type
|
||||||
|
operator() (_A0 const& __a0, _A1& __a1) const {
|
||||||
|
return __invoke(get(), __a0, __a1);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _A0, class _A1>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
typename __invoke_return1<type, _A0, _A1 const>::type
|
||||||
|
operator() (_A0& __a0, _A1 const& __a1) const {
|
||||||
|
return __invoke(get(), __a0, __a1);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _A0, class _A1>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
typename __invoke_return1<type, _A0 const, _A1 const>::type
|
||||||
|
operator() (_A0 const& __a0, _A1 const& __a1) const {
|
||||||
|
return __invoke(get(), __a0, __a1);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class _A0, class _A1, class _A2>
|
template <class _A0, class _A1, class _A2>
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
typename __invoke_return2<type&, _A0, _A1, _A2>::type
|
typename __invoke_return2<type, _A0, _A1, _A2>::type
|
||||||
operator() (_A0& __a0, _A1& __a1, _A2& __a2) const
|
operator() (_A0& __a0, _A1& __a1, _A2& __a2) const {
|
||||||
{
|
return __invoke(get(), __a0, __a1, __a2);
|
||||||
return __invoke<type&, _A0, _A1, _A2>(get(), __a0, __a1, __a2);
|
}
|
||||||
|
|
||||||
|
template <class _A0, class _A1, class _A2>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
typename __invoke_return2<type, _A0 const, _A1, _A2>::type
|
||||||
|
operator() (_A0 const& __a0, _A1& __a1, _A2& __a2) const {
|
||||||
|
return __invoke(get(), __a0, __a1, __a2);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _A0, class _A1, class _A2>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
typename __invoke_return2<type, _A0, _A1 const, _A2>::type
|
||||||
|
operator() (_A0& __a0, _A1 const& __a1, _A2& __a2) const {
|
||||||
|
return __invoke(get(), __a0, __a1, __a2);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _A0, class _A1, class _A2>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
typename __invoke_return2<type, _A0, _A1, _A2 const>::type
|
||||||
|
operator() (_A0& __a0, _A1& __a1, _A2 const& __a2) const {
|
||||||
|
return __invoke(get(), __a0, __a1, __a2);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _A0, class _A1, class _A2>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
typename __invoke_return2<type, _A0 const, _A1 const, _A2>::type
|
||||||
|
operator() (_A0 const& __a0, _A1 const& __a1, _A2& __a2) const {
|
||||||
|
return __invoke(get(), __a0, __a1, __a2);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _A0, class _A1, class _A2>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
typename __invoke_return2<type, _A0 const, _A1, _A2 const>::type
|
||||||
|
operator() (_A0 const& __a0, _A1& __a1, _A2 const& __a2) const {
|
||||||
|
return __invoke(get(), __a0, __a1, __a2);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _A0, class _A1, class _A2>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
typename __invoke_return2<type, _A0, _A1 const, _A2 const>::type
|
||||||
|
operator() (_A0& __a0, _A1 const& __a1, _A2 const& __a2) const {
|
||||||
|
return __invoke(get(), __a0, __a1, __a2);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _A0, class _A1, class _A2>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
typename __invoke_return2<type, _A0 const, _A1 const, _A2 const>::type
|
||||||
|
operator() (_A0 const& __a0, _A1 const& __a1, _A2 const& __a2) const {
|
||||||
|
return __invoke(get(), __a0, __a1, __a2);
|
||||||
}
|
}
|
||||||
#endif // _LIBCPP_HAS_NO_VARIADICS
|
#endif // _LIBCPP_HAS_NO_VARIADICS
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class _Tp> struct __is_reference_wrapper_impl : public false_type {};
|
|
||||||
template <class _Tp> struct __is_reference_wrapper_impl<reference_wrapper<_Tp> > : public true_type {};
|
|
||||||
template <class _Tp> struct __is_reference_wrapper
|
|
||||||
: public __is_reference_wrapper_impl<typename remove_cv<_Tp>::type> {};
|
|
||||||
|
|
||||||
template <class _Tp>
|
template <class _Tp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
|
|||||||
@@ -14,431 +14,128 @@
|
|||||||
// manual variadic expansion for <functional>
|
// manual variadic expansion for <functional>
|
||||||
|
|
||||||
// __invoke
|
// __invoke
|
||||||
|
|
||||||
|
template <class _Ret, class _T1, bool _IsFunc, bool _IsBase>
|
||||||
|
struct __enable_invoke_imp;
|
||||||
|
|
||||||
|
template <class _Ret, class _T1>
|
||||||
|
struct __enable_invoke_imp<_Ret, _T1, true, true> {
|
||||||
|
typedef _Ret _Bullet1;
|
||||||
|
typedef _Bullet1 type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class _Ret, class _T1>
|
||||||
|
struct __enable_invoke_imp<_Ret, _T1, true, false> {
|
||||||
|
typedef _Ret _Bullet2;
|
||||||
|
typedef _Bullet2 type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class _Ret, class _T1>
|
||||||
|
struct __enable_invoke_imp<_Ret, _T1, false, true> {
|
||||||
|
typedef typename add_lvalue_reference<
|
||||||
|
typename __apply_cv<_T1, _Ret>::type
|
||||||
|
>::type _Bullet3;
|
||||||
|
typedef _Bullet3 type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class _Ret, class _T1>
|
||||||
|
struct __enable_invoke_imp<_Ret, _T1, false, false> {
|
||||||
|
typedef typename add_lvalue_reference<
|
||||||
|
typename __apply_cv<decltype(*_VSTD::declval<_T1>()), _Ret>::type
|
||||||
|
>::type _Bullet4;
|
||||||
|
typedef _Bullet4 type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class _Ret, class _T1>
|
||||||
|
struct __enable_invoke_imp<_Ret, _T1*, false, false> {
|
||||||
|
typedef typename add_lvalue_reference<
|
||||||
|
typename __apply_cv<_T1, _Ret>::type
|
||||||
|
>::type _Bullet4;
|
||||||
|
typedef _Bullet4 type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class _Fn, class _T1,
|
||||||
|
class _Traits = __member_pointer_traits<_Fn>,
|
||||||
|
class _Ret = typename _Traits::_ReturnType,
|
||||||
|
class _Class = typename _Traits::_ClassType>
|
||||||
|
struct __enable_invoke : __enable_invoke_imp<
|
||||||
|
_Ret, _T1,
|
||||||
|
is_member_function_pointer<_Fn>::value,
|
||||||
|
is_base_of<_Class, typename remove_reference<_T1>::type>::value>
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
__nat __invoke(__any, ...);
|
||||||
|
|
||||||
// first bullet
|
// first bullet
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _T1>
|
template <class _Fn, class _T1>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
typename enable_if
|
typename __enable_invoke<_Fn, _T1>::_Bullet1
|
||||||
<
|
__invoke(_Fn __f, _T1& __t1) {
|
||||||
is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
|
|
||||||
_Rp
|
|
||||||
>::type
|
|
||||||
__invoke(_Rp (_Tp::*__f)(), _T1& __t1)
|
|
||||||
{
|
|
||||||
return (__t1.*__f)();
|
return (__t1.*__f)();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _T1, class _A0>
|
template <class _Fn, class _T1, class _A0>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
typename enable_if
|
typename __enable_invoke<_Fn, _T1>::_Bullet1
|
||||||
<
|
__invoke(_Fn __f, _T1& __t1, _A0& __a0) {
|
||||||
is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
|
|
||||||
_Rp
|
|
||||||
>::type
|
|
||||||
__invoke(_Rp (_Tp::*__f)(_A0), _T1& __t1, _A0& __a0)
|
|
||||||
{
|
|
||||||
return (__t1.*__f)(__a0);
|
return (__t1.*__f)(__a0);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
|
template <class _Fn, class _T1, class _A0, class _A1>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
typename enable_if
|
typename __enable_invoke<_Fn, _T1>::_Bullet1
|
||||||
<
|
__invoke(_Fn __f, _T1& __t1, _A0& __a0, _A1& __a1) {
|
||||||
is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
|
|
||||||
_Rp
|
|
||||||
>::type
|
|
||||||
__invoke(_Rp (_Tp::*__f)(_A0, _A1), _T1& __t1, _A0& __a0, _A1& __a1)
|
|
||||||
{
|
|
||||||
return (__t1.*__f)(__a0, __a1);
|
return (__t1.*__f)(__a0, __a1);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
|
template <class _Fn, class _T1, class _A0, class _A1, class _A2>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
typename enable_if
|
typename __enable_invoke<_Fn, _T1>::_Bullet1
|
||||||
<
|
__invoke(_Fn __f, _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2) {
|
||||||
is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
|
|
||||||
_Rp
|
|
||||||
>::type
|
|
||||||
__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2), _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2)
|
|
||||||
{
|
|
||||||
return (__t1.*__f)(__a0, __a1, __a2);
|
return (__t1.*__f)(__a0, __a1, __a2);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _T1>
|
template <class _Fn, class _T1>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
typename enable_if
|
typename __enable_invoke<_Fn, _T1>::_Bullet2
|
||||||
<
|
__invoke(_Fn __f, _T1& __t1) {
|
||||||
is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
|
|
||||||
_Rp
|
|
||||||
>::type
|
|
||||||
__invoke(_Rp (_Tp::*__f)() const, _T1& __t1)
|
|
||||||
{
|
|
||||||
return (__t1.*__f)();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _T1, class _A0>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
typename enable_if
|
|
||||||
<
|
|
||||||
is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
|
|
||||||
_Rp
|
|
||||||
>::type
|
|
||||||
__invoke(_Rp (_Tp::*__f)(_A0) const, _T1& __t1, _A0& __a0)
|
|
||||||
{
|
|
||||||
return (__t1.*__f)(__a0);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
typename enable_if
|
|
||||||
<
|
|
||||||
is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
|
|
||||||
_Rp
|
|
||||||
>::type
|
|
||||||
__invoke(_Rp (_Tp::*__f)(_A0, _A1) const, _T1& __t1, _A0& __a0, _A1& __a1)
|
|
||||||
{
|
|
||||||
return (__t1.*__f)(__a0, __a1);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
typename enable_if
|
|
||||||
<
|
|
||||||
is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
|
|
||||||
_Rp
|
|
||||||
>::type
|
|
||||||
__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) const, _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2)
|
|
||||||
{
|
|
||||||
return (__t1.*__f)(__a0, __a1, __a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _T1>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
typename enable_if
|
|
||||||
<
|
|
||||||
is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
|
|
||||||
_Rp
|
|
||||||
>::type
|
|
||||||
__invoke(_Rp (_Tp::*__f)() volatile, _T1& __t1)
|
|
||||||
{
|
|
||||||
return (__t1.*__f)();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _T1, class _A0>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
typename enable_if
|
|
||||||
<
|
|
||||||
is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
|
|
||||||
_Rp
|
|
||||||
>::type
|
|
||||||
__invoke(_Rp (_Tp::*__f)(_A0) volatile, _T1& __t1, _A0& __a0)
|
|
||||||
{
|
|
||||||
return (__t1.*__f)(__a0);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
typename enable_if
|
|
||||||
<
|
|
||||||
is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
|
|
||||||
_Rp
|
|
||||||
>::type
|
|
||||||
__invoke(_Rp (_Tp::*__f)(_A0, _A1) volatile, _T1& __t1, _A0& __a0, _A1& __a1)
|
|
||||||
{
|
|
||||||
return (__t1.*__f)(__a0, __a1);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
typename enable_if
|
|
||||||
<
|
|
||||||
is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
|
|
||||||
_Rp
|
|
||||||
>::type
|
|
||||||
__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) volatile, _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2)
|
|
||||||
{
|
|
||||||
return (__t1.*__f)(__a0, __a1, __a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _T1>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
typename enable_if
|
|
||||||
<
|
|
||||||
is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
|
|
||||||
_Rp
|
|
||||||
>::type
|
|
||||||
__invoke(_Rp (_Tp::*__f)() const volatile, _T1& __t1)
|
|
||||||
{
|
|
||||||
return (__t1.*__f)();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _T1, class _A0>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
typename enable_if
|
|
||||||
<
|
|
||||||
is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
|
|
||||||
_Rp
|
|
||||||
>::type
|
|
||||||
__invoke(_Rp (_Tp::*__f)(_A0) const volatile, _T1& __t1, _A0& __a0)
|
|
||||||
{
|
|
||||||
return (__t1.*__f)(__a0);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
typename enable_if
|
|
||||||
<
|
|
||||||
is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
|
|
||||||
_Rp
|
|
||||||
>::type
|
|
||||||
__invoke(_Rp (_Tp::*__f)(_A0, _A1) const volatile, _T1& __t1, _A0& __a0, _A1& __a1)
|
|
||||||
{
|
|
||||||
return (__t1.*__f)(__a0, __a1);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
typename enable_if
|
|
||||||
<
|
|
||||||
is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
|
|
||||||
_Rp
|
|
||||||
>::type
|
|
||||||
__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) const volatile, _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2)
|
|
||||||
{
|
|
||||||
return (__t1.*__f)(__a0, __a1, __a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// second bullet
|
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _T1>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
typename enable_if
|
|
||||||
<
|
|
||||||
!is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
|
|
||||||
_Rp
|
|
||||||
>::type
|
|
||||||
__invoke(_Rp (_Tp::*__f)(), _T1 __t1)
|
|
||||||
{
|
|
||||||
return ((*__t1).*__f)();
|
return ((*__t1).*__f)();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _T1, class _A0>
|
template <class _Fn, class _T1, class _A0>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
typename enable_if
|
typename __enable_invoke<_Fn, _T1>::_Bullet2
|
||||||
<
|
__invoke(_Fn __f, _T1& __t1, _A0& __a0) {
|
||||||
!is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
|
|
||||||
_Rp
|
|
||||||
>::type
|
|
||||||
__invoke(_Rp (_Tp::*__f)(_A0), _T1 __t1, _A0& __a0)
|
|
||||||
{
|
|
||||||
return ((*__t1).*__f)(__a0);
|
return ((*__t1).*__f)(__a0);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
|
template <class _Fn, class _T1, class _A0, class _A1>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
typename enable_if
|
typename __enable_invoke<_Fn, _T1>::_Bullet2
|
||||||
<
|
__invoke(_Fn __f, _T1& __t1, _A0& __a0, _A1& __a1) {
|
||||||
!is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
|
|
||||||
_Rp
|
|
||||||
>::type
|
|
||||||
__invoke(_Rp (_Tp::*__f)(_A0, _A1), _T1 __t1, _A0& __a0, _A1& __a1)
|
|
||||||
{
|
|
||||||
return ((*__t1).*__f)(__a0, __a1);
|
return ((*__t1).*__f)(__a0, __a1);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
|
template <class _Fn, class _T1, class _A0, class _A1, class _A2>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
typename enable_if
|
typename __enable_invoke<_Fn, _T1>::_Bullet2
|
||||||
<
|
__invoke(_Fn __f, _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2) {
|
||||||
!is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
|
|
||||||
_Rp
|
|
||||||
>::type
|
|
||||||
__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2), _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2)
|
|
||||||
{
|
|
||||||
return ((*__t1).*__f)(__a0, __a1, __a2);
|
return ((*__t1).*__f)(__a0, __a1, __a2);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _T1>
|
template <class _Fn, class _T1>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
typename enable_if
|
typename __enable_invoke<_Fn, _T1>::_Bullet3
|
||||||
<
|
__invoke(_Fn __f, _T1& __t1) {
|
||||||
!is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
|
|
||||||
_Rp
|
|
||||||
>::type
|
|
||||||
__invoke(_Rp (_Tp::*__f)() const, _T1 __t1)
|
|
||||||
{
|
|
||||||
return ((*__t1).*__f)();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _T1, class _A0>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
typename enable_if
|
|
||||||
<
|
|
||||||
!is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
|
|
||||||
_Rp
|
|
||||||
>::type
|
|
||||||
__invoke(_Rp (_Tp::*__f)(_A0) const, _T1 __t1, _A0& __a0)
|
|
||||||
{
|
|
||||||
return ((*__t1).*__f)(__a0);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
typename enable_if
|
|
||||||
<
|
|
||||||
!is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
|
|
||||||
_Rp
|
|
||||||
>::type
|
|
||||||
__invoke(_Rp (_Tp::*__f)(_A0, _A1) const, _T1 __t1, _A0& __a0, _A1& __a1)
|
|
||||||
{
|
|
||||||
return ((*__t1).*__f)(__a0, __a1);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
typename enable_if
|
|
||||||
<
|
|
||||||
!is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
|
|
||||||
_Rp
|
|
||||||
>::type
|
|
||||||
__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) const, _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2)
|
|
||||||
{
|
|
||||||
return ((*__t1).*__f)(__a0, __a1, __a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _T1>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
typename enable_if
|
|
||||||
<
|
|
||||||
!is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
|
|
||||||
_Rp
|
|
||||||
>::type
|
|
||||||
__invoke(_Rp (_Tp::*__f)() volatile, _T1 __t1)
|
|
||||||
{
|
|
||||||
return ((*__t1).*__f)();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _T1, class _A0>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
typename enable_if
|
|
||||||
<
|
|
||||||
!is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
|
|
||||||
_Rp
|
|
||||||
>::type
|
|
||||||
__invoke(_Rp (_Tp::*__f)(_A0) volatile, _T1 __t1, _A0& __a0)
|
|
||||||
{
|
|
||||||
return ((*__t1).*__f)(__a0);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
typename enable_if
|
|
||||||
<
|
|
||||||
!is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
|
|
||||||
_Rp
|
|
||||||
>::type
|
|
||||||
__invoke(_Rp (_Tp::*__f)(_A0, _A1) volatile, _T1 __t1, _A0& __a0, _A1& __a1)
|
|
||||||
{
|
|
||||||
return ((*__t1).*__f)(__a0, __a1);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
typename enable_if
|
|
||||||
<
|
|
||||||
!is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
|
|
||||||
_Rp
|
|
||||||
>::type
|
|
||||||
__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) volatile, _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2)
|
|
||||||
{
|
|
||||||
return ((*__t1).*__f)(__a0, __a1, __a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _T1>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
typename enable_if
|
|
||||||
<
|
|
||||||
!is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
|
|
||||||
_Rp
|
|
||||||
>::type
|
|
||||||
__invoke(_Rp (_Tp::*__f)() const volatile, _T1 __t1)
|
|
||||||
{
|
|
||||||
return ((*__t1).*__f)();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _T1, class _A0>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
typename enable_if
|
|
||||||
<
|
|
||||||
!is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
|
|
||||||
_Rp
|
|
||||||
>::type
|
|
||||||
__invoke(_Rp (_Tp::*__f)(_A0) const volatile, _T1 __t1, _A0& __a0)
|
|
||||||
{
|
|
||||||
return ((*__t1).*__f)(__a0);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _T1, class _A0, class _A1>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
typename enable_if
|
|
||||||
<
|
|
||||||
!is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
|
|
||||||
_Rp
|
|
||||||
>::type
|
|
||||||
__invoke(_Rp (_Tp::*__f)(_A0, _A1) const volatile, _T1 __t1, _A0& __a0, _A1& __a1)
|
|
||||||
{
|
|
||||||
return ((*__t1).*__f)(__a0, __a1);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
typename enable_if
|
|
||||||
<
|
|
||||||
!is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
|
|
||||||
_Rp
|
|
||||||
>::type
|
|
||||||
__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) const volatile, _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2)
|
|
||||||
{
|
|
||||||
return ((*__t1).*__f)(__a0, __a1, __a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// third bullet
|
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _T1>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
typename enable_if
|
|
||||||
<
|
|
||||||
is_member_object_pointer<_Rp _Tp::*>::value &&
|
|
||||||
is_base_of<_Tp, typename remove_reference<_T1>::type>::value,
|
|
||||||
__apply_cv<_T1, _Rp>
|
|
||||||
>::type::type&
|
|
||||||
__invoke(_Rp _Tp::* __f, _T1& __t1)
|
|
||||||
{
|
|
||||||
return __t1.*__f;
|
return __t1.*__f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <class _Fn, class _T1>
|
||||||
// forth bullet
|
|
||||||
|
|
||||||
template <class _T1, class _Rp, bool>
|
|
||||||
struct __4th_helper
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class _T1, class _Rp>
|
|
||||||
struct __4th_helper<_T1, _Rp, true>
|
|
||||||
{
|
|
||||||
typedef typename __apply_cv<decltype(*_VSTD::declval<_T1&>()), _Rp>::type type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _T1>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
typename __4th_helper<_T1, _Rp,
|
typename __enable_invoke<_Fn, _T1>::_Bullet4
|
||||||
is_member_object_pointer<_Rp _Tp::*>::value &&
|
__invoke(_Fn __f, _T1& __t1) {
|
||||||
!is_base_of<_Tp, typename remove_reference<_T1>::type>::value
|
|
||||||
>::type&
|
|
||||||
__invoke(_Rp _Tp::* __f, _T1& __t1)
|
|
||||||
{
|
|
||||||
return (*__t1).*__f;
|
return (*__t1).*__f;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -488,22 +185,16 @@ struct __invoke_return<_Fp, false>
|
|||||||
typedef decltype(__invoke(_VSTD::declval<_Fp&>())) type;
|
typedef decltype(__invoke(_VSTD::declval<_Fp&>())) type;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class _Tp, class _A0, bool = is_member_object_pointer<_Tp>::value>
|
template <class _Tp, class _A0>
|
||||||
struct __invoke_return0
|
struct __invoke_return0
|
||||||
{
|
{
|
||||||
typedef decltype(__invoke(_VSTD::declval<_Tp&>(), _VSTD::declval<_A0&>())) type;
|
typedef decltype(__invoke(_VSTD::declval<_Tp&>(), _VSTD::declval<_A0&>())) type;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _A0>
|
template <class _Rp, class _Tp, class _A0>
|
||||||
struct __invoke_return0<_Rp _Tp::*, _A0, true>
|
struct __invoke_return0<_Rp _Tp::*, _A0>
|
||||||
{
|
{
|
||||||
typedef typename __apply_cv<_A0, _Rp>::type& type;
|
typedef typename __enable_invoke<_Rp _Tp::*, _A0>::type type;
|
||||||
};
|
|
||||||
|
|
||||||
template <class _Rp, class _Tp, class _A0>
|
|
||||||
struct __invoke_return0<_Rp _Tp::*, _A0*, true>
|
|
||||||
{
|
|
||||||
typedef typename __apply_cv<_A0, _Rp>::type& type;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class _Tp, class _A0, class _A1>
|
template <class _Tp, class _A0, class _A1>
|
||||||
@@ -513,6 +204,11 @@ struct __invoke_return1
|
|||||||
_VSTD::declval<_A1&>())) type;
|
_VSTD::declval<_A1&>())) type;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <class _Rp, class _Class, class _A0, class _A1>
|
||||||
|
struct __invoke_return1<_Rp _Class::*, _A0, _A1> {
|
||||||
|
typedef typename __enable_invoke<_Rp _Class::*, _A0>::type type;
|
||||||
|
};
|
||||||
|
|
||||||
template <class _Tp, class _A0, class _A1, class _A2>
|
template <class _Tp, class _A0, class _A1, class _A2>
|
||||||
struct __invoke_return2
|
struct __invoke_return2
|
||||||
{
|
{
|
||||||
@@ -521,4 +217,8 @@ struct __invoke_return2
|
|||||||
_VSTD::declval<_A2&>())) type;
|
_VSTD::declval<_A2&>())) type;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <class _Ret, class _Class, class _A0, class _A1, class _A2>
|
||||||
|
struct __invoke_return2<_Ret _Class::*, _A0, _A1, _A2> {
|
||||||
|
typedef typename __enable_invoke<_Ret _Class::*, _A0>::type type;
|
||||||
|
};
|
||||||
#endif // _LIBCPP_FUNCTIONAL_BASE_03
|
#endif // _LIBCPP_FUNCTIONAL_BASE_03
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -37,6 +37,8 @@
|
|||||||
#elif (defined(__GLIBC__) || defined(__APPLE__) || defined(__FreeBSD__) \
|
#elif (defined(__GLIBC__) || defined(__APPLE__) || defined(__FreeBSD__) \
|
||||||
|| defined(__EMSCRIPTEN__) || defined(__IBMCPP__))
|
|| defined(__EMSCRIPTEN__) || defined(__IBMCPP__))
|
||||||
# include <xlocale.h>
|
# include <xlocale.h>
|
||||||
|
#elif defined(_LIBCPP_HAS_MUSL_LIBC)
|
||||||
|
# include <support/musl/xlocale.h>
|
||||||
#endif // __GLIBC__ || __APPLE__ || __FreeBSD__ || __sun__ || __EMSCRIPTEN__ || __IBMCPP__
|
#endif // __GLIBC__ || __APPLE__ || __FreeBSD__ || __sun__ || __EMSCRIPTEN__ || __IBMCPP__
|
||||||
|
|
||||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||||
@@ -329,7 +331,7 @@ locale::operator()(const basic_string<_CharT, _Traits, _Allocator>& __x,
|
|||||||
class _LIBCPP_TYPE_VIS ctype_base
|
class _LIBCPP_TYPE_VIS ctype_base
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
#ifdef __GLIBC__
|
#if defined(__GLIBC__)
|
||||||
typedef unsigned short mask;
|
typedef unsigned short mask;
|
||||||
static const mask space = _ISspace;
|
static const mask space = _ISspace;
|
||||||
static const mask print = _ISprint;
|
static const mask print = _ISprint;
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
#include <__config>
|
#include <__config>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <system_error>
|
#include <system_error>
|
||||||
#include <pthread.h>
|
#include <__threading_support>
|
||||||
|
|
||||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||||
#pragma GCC system_header
|
#pragma GCC system_header
|
||||||
@@ -24,16 +24,24 @@ _LIBCPP_BEGIN_NAMESPACE_STD
|
|||||||
|
|
||||||
#ifndef _LIBCPP_HAS_NO_THREADS
|
#ifndef _LIBCPP_HAS_NO_THREADS
|
||||||
|
|
||||||
class _LIBCPP_TYPE_VIS mutex
|
#ifndef _LIBCPP_THREAD_SAFETY_ANNOTATION
|
||||||
|
# ifdef _LIBCPP_HAS_THREAD_SAFETY_ANNOTATIONS
|
||||||
|
# define _LIBCPP_THREAD_SAFETY_ANNOTATION(x) __attribute__((x))
|
||||||
|
# else
|
||||||
|
# define _LIBCPP_THREAD_SAFETY_ANNOTATION(x)
|
||||||
|
# endif
|
||||||
|
#endif // _LIBCPP_THREAD_SAFETY_ANNOTATION
|
||||||
|
|
||||||
|
class _LIBCPP_TYPE_VIS _LIBCPP_THREAD_SAFETY_ANNOTATION(capability("mutex")) mutex
|
||||||
{
|
{
|
||||||
pthread_mutex_t __m_;
|
__libcpp_mutex_t __m_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
#ifndef _LIBCPP_HAS_NO_CONSTEXPR
|
#ifndef _LIBCPP_HAS_NO_CONSTEXPR
|
||||||
constexpr mutex() _NOEXCEPT : __m_(PTHREAD_MUTEX_INITIALIZER) {}
|
constexpr mutex() _NOEXCEPT : __m_(_LIBCPP_MUTEX_INITIALIZER) {}
|
||||||
#else
|
#else
|
||||||
mutex() _NOEXCEPT {__m_ = (pthread_mutex_t)PTHREAD_MUTEX_INITIALIZER;}
|
mutex() _NOEXCEPT {__m_ = (__libcpp_mutex_t)_LIBCPP_MUTEX_INITIALIZER;}
|
||||||
#endif
|
#endif
|
||||||
~mutex();
|
~mutex();
|
||||||
|
|
||||||
@@ -42,11 +50,11 @@ private:
|
|||||||
mutex& operator=(const mutex&);// = delete;
|
mutex& operator=(const mutex&);// = delete;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void lock();
|
void lock() _LIBCPP_THREAD_SAFETY_ANNOTATION(acquire_capability());
|
||||||
bool try_lock() _NOEXCEPT;
|
bool try_lock() _NOEXCEPT _LIBCPP_THREAD_SAFETY_ANNOTATION(try_acquire_capability(true));
|
||||||
void unlock() _NOEXCEPT;
|
void unlock() _NOEXCEPT _LIBCPP_THREAD_SAFETY_ANNOTATION(release_capability());
|
||||||
|
|
||||||
typedef pthread_mutex_t* native_handle_type;
|
typedef __libcpp_mutex_t* native_handle_type;
|
||||||
_LIBCPP_INLINE_VISIBILITY native_handle_type native_handle() {return &__m_;}
|
_LIBCPP_INLINE_VISIBILITY native_handle_type native_handle() {return &__m_;}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -69,7 +77,7 @@ constexpr adopt_lock_t adopt_lock = adopt_lock_t();
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
template <class _Mutex>
|
template <class _Mutex>
|
||||||
class _LIBCPP_TYPE_VIS_ONLY lock_guard
|
class _LIBCPP_TYPE_VIS_ONLY _LIBCPP_THREAD_SAFETY_ANNOTATION(scoped_lockable) lock_guard
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef _Mutex mutex_type;
|
typedef _Mutex mutex_type;
|
||||||
@@ -79,13 +87,13 @@ private:
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
explicit lock_guard(mutex_type& __m)
|
explicit lock_guard(mutex_type& __m) _LIBCPP_THREAD_SAFETY_ANNOTATION(acquire_capability(__m))
|
||||||
: __m_(__m) {__m_.lock();}
|
: __m_(__m) {__m_.lock();}
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
lock_guard(mutex_type& __m, adopt_lock_t)
|
lock_guard(mutex_type& __m, adopt_lock_t) _LIBCPP_THREAD_SAFETY_ANNOTATION(requires_capability(__m))
|
||||||
: __m_(__m) {}
|
: __m_(__m) {}
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
~lock_guard() {__m_.unlock();}
|
~lock_guard() _LIBCPP_THREAD_SAFETY_ANNOTATION(release_capability()) {__m_.unlock();}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
lock_guard(lock_guard const&);// = delete;
|
lock_guard(lock_guard const&);// = delete;
|
||||||
@@ -107,24 +115,24 @@ public:
|
|||||||
unique_lock() _NOEXCEPT : __m_(nullptr), __owns_(false) {}
|
unique_lock() _NOEXCEPT : __m_(nullptr), __owns_(false) {}
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
explicit unique_lock(mutex_type& __m)
|
explicit unique_lock(mutex_type& __m)
|
||||||
: __m_(&__m), __owns_(true) {__m_->lock();}
|
: __m_(_VSTD::addressof(__m)), __owns_(true) {__m_->lock();}
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
unique_lock(mutex_type& __m, defer_lock_t) _NOEXCEPT
|
unique_lock(mutex_type& __m, defer_lock_t) _NOEXCEPT
|
||||||
: __m_(&__m), __owns_(false) {}
|
: __m_(_VSTD::addressof(__m)), __owns_(false) {}
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
unique_lock(mutex_type& __m, try_to_lock_t)
|
unique_lock(mutex_type& __m, try_to_lock_t)
|
||||||
: __m_(&__m), __owns_(__m.try_lock()) {}
|
: __m_(_VSTD::addressof(__m)), __owns_(__m.try_lock()) {}
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
unique_lock(mutex_type& __m, adopt_lock_t)
|
unique_lock(mutex_type& __m, adopt_lock_t)
|
||||||
: __m_(&__m), __owns_(true) {}
|
: __m_(_VSTD::addressof(__m)), __owns_(true) {}
|
||||||
template <class _Clock, class _Duration>
|
template <class _Clock, class _Duration>
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
unique_lock(mutex_type& __m, const chrono::time_point<_Clock, _Duration>& __t)
|
unique_lock(mutex_type& __m, const chrono::time_point<_Clock, _Duration>& __t)
|
||||||
: __m_(&__m), __owns_(__m.try_lock_until(__t)) {}
|
: __m_(_VSTD::addressof(__m)), __owns_(__m.try_lock_until(__t)) {}
|
||||||
template <class _Rep, class _Period>
|
template <class _Rep, class _Period>
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
unique_lock(mutex_type& __m, const chrono::duration<_Rep, _Period>& __d)
|
unique_lock(mutex_type& __m, const chrono::duration<_Rep, _Period>& __d)
|
||||||
: __m_(&__m), __owns_(__m.try_lock_for(__d)) {}
|
: __m_(_VSTD::addressof(__m)), __owns_(__m.try_lock_for(__d)) {}
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
~unique_lock()
|
~unique_lock()
|
||||||
{
|
{
|
||||||
@@ -266,13 +274,13 @@ _LIBCPP_DECLARE_STRONG_ENUM_EPILOG(cv_status)
|
|||||||
|
|
||||||
class _LIBCPP_TYPE_VIS condition_variable
|
class _LIBCPP_TYPE_VIS condition_variable
|
||||||
{
|
{
|
||||||
pthread_cond_t __cv_;
|
__libcpp_condvar_t __cv_;
|
||||||
public:
|
public:
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
#ifndef _LIBCPP_HAS_NO_CONSTEXPR
|
#ifndef _LIBCPP_HAS_NO_CONSTEXPR
|
||||||
constexpr condition_variable() : __cv_(PTHREAD_COND_INITIALIZER) {}
|
constexpr condition_variable() : __cv_(_LIBCPP_CONDVAR_INITIALIZER) {}
|
||||||
#else
|
#else
|
||||||
condition_variable() {__cv_ = (pthread_cond_t)PTHREAD_COND_INITIALIZER;}
|
condition_variable() {__cv_ = (__libcpp_condvar_t)_LIBCPP_CONDVAR_INITIALIZER;}
|
||||||
#endif
|
#endif
|
||||||
~condition_variable();
|
~condition_variable();
|
||||||
|
|
||||||
@@ -306,11 +314,12 @@ public:
|
|||||||
|
|
||||||
template <class _Rep, class _Period, class _Predicate>
|
template <class _Rep, class _Period, class _Predicate>
|
||||||
bool
|
bool
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
wait_for(unique_lock<mutex>& __lk,
|
wait_for(unique_lock<mutex>& __lk,
|
||||||
const chrono::duration<_Rep, _Period>& __d,
|
const chrono::duration<_Rep, _Period>& __d,
|
||||||
_Predicate __pred);
|
_Predicate __pred);
|
||||||
|
|
||||||
typedef pthread_cond_t* native_handle_type;
|
typedef __libcpp_condvar_t* native_handle_type;
|
||||||
_LIBCPP_INLINE_VISIBILITY native_handle_type native_handle() {return &__cv_;}
|
_LIBCPP_INLINE_VISIBILITY native_handle_type native_handle() {return &__cv_;}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -390,7 +399,7 @@ condition_variable::wait_for(unique_lock<mutex>& __lk,
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Rep, class _Period, class _Predicate>
|
template <class _Rep, class _Period, class _Predicate>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
bool
|
bool
|
||||||
condition_variable::wait_for(unique_lock<mutex>& __lk,
|
condition_variable::wait_for(unique_lock<mutex>& __lk,
|
||||||
const chrono::duration<_Rep, _Period>& __d,
|
const chrono::duration<_Rep, _Period>& __d,
|
||||||
|
|||||||
66
include/__nullptr
Normal file
66
include/__nullptr
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
//===--------------------------- __nullptr --------------------------------===//
|
||||||
|
//
|
||||||
|
// 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_NULLPTR
|
||||||
|
#define _LIBCPP_NULLPTR
|
||||||
|
|
||||||
|
#include <__config>
|
||||||
|
|
||||||
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||||
|
#pragma GCC system_header
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _LIBCPP_HAS_NO_NULLPTR
|
||||||
|
|
||||||
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||||
|
|
||||||
|
struct _LIBCPP_TYPE_VIS_ONLY nullptr_t
|
||||||
|
{
|
||||||
|
void* __lx;
|
||||||
|
|
||||||
|
struct __nat {int __for_bool_;};
|
||||||
|
|
||||||
|
_LIBCPP_ALWAYS_INLINE _LIBCPP_CONSTEXPR nullptr_t() : __lx(0) {}
|
||||||
|
_LIBCPP_ALWAYS_INLINE _LIBCPP_CONSTEXPR nullptr_t(int __nat::*) : __lx(0) {}
|
||||||
|
|
||||||
|
_LIBCPP_ALWAYS_INLINE _LIBCPP_CONSTEXPR operator int __nat::*() const {return 0;}
|
||||||
|
|
||||||
|
template <class _Tp>
|
||||||
|
_LIBCPP_ALWAYS_INLINE _LIBCPP_CONSTEXPR
|
||||||
|
operator _Tp* () const {return 0;}
|
||||||
|
|
||||||
|
template <class _Tp, class _Up>
|
||||||
|
_LIBCPP_ALWAYS_INLINE
|
||||||
|
operator _Tp _Up::* () const {return 0;}
|
||||||
|
|
||||||
|
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);}
|
||||||
|
|
||||||
|
#define nullptr _VSTD::__get_nullptr_t()
|
||||||
|
|
||||||
|
_LIBCPP_END_NAMESPACE_STD
|
||||||
|
|
||||||
|
#else // _LIBCPP_HAS_NO_NULLPTR
|
||||||
|
|
||||||
|
namespace std
|
||||||
|
{
|
||||||
|
typedef decltype(nullptr) nullptr_t;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // _LIBCPP_HAS_NO_NULLPTR
|
||||||
|
|
||||||
|
#endif // _LIBCPP_NULLPTR
|
||||||
@@ -56,9 +56,12 @@ public:
|
|||||||
_LIBCPP_INLINE_VISIBILITY pointer& __end_cap() _NOEXCEPT {return __end_cap_.first();}
|
_LIBCPP_INLINE_VISIBILITY pointer& __end_cap() _NOEXCEPT {return __end_cap_.first();}
|
||||||
_LIBCPP_INLINE_VISIBILITY const pointer& __end_cap() const _NOEXCEPT {return __end_cap_.first();}
|
_LIBCPP_INLINE_VISIBILITY const pointer& __end_cap() const _NOEXCEPT {return __end_cap_.first();}
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
__split_buffer()
|
__split_buffer()
|
||||||
_NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
|
_NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
explicit __split_buffer(__alloc_rr& __a);
|
explicit __split_buffer(__alloc_rr& __a);
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
explicit __split_buffer(const __alloc_rr& __a);
|
explicit __split_buffer(const __alloc_rr& __a);
|
||||||
__split_buffer(size_type __cap, size_type __start, __alloc_rr& __a);
|
__split_buffer(size_type __cap, size_type __start, __alloc_rr& __a);
|
||||||
~__split_buffer();
|
~__split_buffer();
|
||||||
@@ -128,7 +131,9 @@ public:
|
|||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY void __destruct_at_begin(pointer __new_begin)
|
_LIBCPP_INLINE_VISIBILITY void __destruct_at_begin(pointer __new_begin)
|
||||||
{__destruct_at_begin(__new_begin, is_trivially_destructible<value_type>());}
|
{__destruct_at_begin(__new_begin, is_trivially_destructible<value_type>());}
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void __destruct_at_begin(pointer __new_begin, false_type);
|
void __destruct_at_begin(pointer __new_begin, false_type);
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void __destruct_at_begin(pointer __new_begin, true_type);
|
void __destruct_at_begin(pointer __new_begin, true_type);
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
@@ -266,7 +271,7 @@ __split_buffer<_Tp, _Allocator>::__construct_at_end(_ForwardIterator __first, _F
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class _Allocator>
|
template <class _Tp, class _Allocator>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
__split_buffer<_Tp, _Allocator>::__destruct_at_begin(pointer __new_begin, false_type)
|
__split_buffer<_Tp, _Allocator>::__destruct_at_begin(pointer __new_begin, false_type)
|
||||||
{
|
{
|
||||||
@@ -275,7 +280,7 @@ __split_buffer<_Tp, _Allocator>::__destruct_at_begin(pointer __new_begin, false_
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class _Allocator>
|
template <class _Tp, class _Allocator>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
__split_buffer<_Tp, _Allocator>::__destruct_at_begin(pointer __new_begin, true_type)
|
__split_buffer<_Tp, _Allocator>::__destruct_at_begin(pointer __new_begin, true_type)
|
||||||
{
|
{
|
||||||
@@ -309,7 +314,7 @@ __split_buffer<_Tp, _Allocator>::__split_buffer(size_type __cap, size_type __sta
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class _Allocator>
|
template <class _Tp, class _Allocator>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
__split_buffer<_Tp, _Allocator>::__split_buffer()
|
__split_buffer<_Tp, _Allocator>::__split_buffer()
|
||||||
_NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
|
_NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
|
||||||
: __first_(nullptr), __begin_(nullptr), __end_(nullptr), __end_cap_(nullptr)
|
: __first_(nullptr), __begin_(nullptr), __end_(nullptr), __end_cap_(nullptr)
|
||||||
@@ -317,14 +322,14 @@ __split_buffer<_Tp, _Allocator>::__split_buffer()
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class _Allocator>
|
template <class _Tp, class _Allocator>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
__split_buffer<_Tp, _Allocator>::__split_buffer(__alloc_rr& __a)
|
__split_buffer<_Tp, _Allocator>::__split_buffer(__alloc_rr& __a)
|
||||||
: __first_(nullptr), __begin_(nullptr), __end_(nullptr), __end_cap_(nullptr, __a)
|
: __first_(nullptr), __begin_(nullptr), __end_(nullptr), __end_cap_(nullptr, __a)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class _Allocator>
|
template <class _Tp, class _Allocator>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
__split_buffer<_Tp, _Allocator>::__split_buffer(const __alloc_rr& __a)
|
__split_buffer<_Tp, _Allocator>::__split_buffer(const __alloc_rr& __a)
|
||||||
: __first_(nullptr), __begin_(nullptr), __end_(nullptr), __end_cap_(nullptr, __a)
|
: __first_(nullptr), __begin_(nullptr), __end_(nullptr), __end_cap_(nullptr, __a)
|
||||||
{
|
{
|
||||||
|
|||||||
205
include/__threading_support
Normal file
205
include/__threading_support
Normal file
@@ -0,0 +1,205 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// 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_THREADING_SUPPORT
|
||||||
|
#define _LIBCPP_THREADING_SUPPORT
|
||||||
|
|
||||||
|
#include <__config>
|
||||||
|
|
||||||
|
#ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER
|
||||||
|
#pragma GCC system_header
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _LIBCPP_HAS_NO_THREADS
|
||||||
|
|
||||||
|
#if defined(_LIBCPP_THREAD_API_PTHREAD)
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <sched.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||||
|
|
||||||
|
#if defined(_LIBCPP_THREAD_API_PTHREAD)
|
||||||
|
|
||||||
|
// Mutex
|
||||||
|
#define _LIBCPP_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
|
||||||
|
typedef pthread_mutex_t __libcpp_mutex_t;
|
||||||
|
|
||||||
|
inline _LIBCPP_ALWAYS_INLINE
|
||||||
|
int __libcpp_recursive_mutex_init(__libcpp_mutex_t* __m)
|
||||||
|
{
|
||||||
|
pthread_mutexattr_t attr;
|
||||||
|
int __ec = pthread_mutexattr_init(&attr);
|
||||||
|
if (__ec) return __ec;
|
||||||
|
__ec = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
|
||||||
|
if (__ec)
|
||||||
|
{
|
||||||
|
pthread_mutexattr_destroy(&attr);
|
||||||
|
return __ec;
|
||||||
|
}
|
||||||
|
__ec = pthread_mutex_init(__m, &attr);
|
||||||
|
if (__ec)
|
||||||
|
{
|
||||||
|
pthread_mutexattr_destroy(&attr);
|
||||||
|
return __ec;
|
||||||
|
}
|
||||||
|
__ec = pthread_mutexattr_destroy(&attr);
|
||||||
|
if (__ec)
|
||||||
|
{
|
||||||
|
pthread_mutex_destroy(__m);
|
||||||
|
return __ec;
|
||||||
|
}
|
||||||
|
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*))
|
||||||
|
{
|
||||||
|
return pthread_key_create(__key, __at_exit);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline _LIBCPP_ALWAYS_INLINE
|
||||||
|
void* __libcpp_tl_get(__libcpp_tl_key __key)
|
||||||
|
{
|
||||||
|
return pthread_getspecific(__key);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline _LIBCPP_ALWAYS_INLINE
|
||||||
|
void __libcpp_tl_set(__libcpp_tl_key __key, void* __p)
|
||||||
|
{
|
||||||
|
pthread_setspecific(__key, __p);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else // !_LIBCPP_THREAD_API_PTHREAD
|
||||||
|
#error "No thread API selected."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
_LIBCPP_END_NAMESPACE_STD
|
||||||
|
|
||||||
|
#endif // _LIBCPP_HAS_NO_THREADS
|
||||||
|
|
||||||
|
#endif // _LIBCPP_THREADING_SUPPORT
|
||||||
914
include/__tree
914
include/__tree
File diff suppressed because it is too large
Load Diff
@@ -86,12 +86,15 @@ template <size_t _Ip, class ..._Tp>
|
|||||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||||
typename tuple_element<_Ip, tuple<_Tp...> >::type&&
|
typename tuple_element<_Ip, tuple<_Tp...> >::type&&
|
||||||
get(tuple<_Tp...>&&) _NOEXCEPT;
|
get(tuple<_Tp...>&&) _NOEXCEPT;
|
||||||
|
|
||||||
|
template <size_t _Ip, class ..._Tp>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||||
|
const typename tuple_element<_Ip, tuple<_Tp...> >::type&&
|
||||||
|
get(const tuple<_Tp...>&&) _NOEXCEPT;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// pair specializations
|
// pair specializations
|
||||||
|
|
||||||
template <class _T1, class _T2> struct _LIBCPP_TYPE_VIS_ONLY pair;
|
|
||||||
|
|
||||||
template <class _T1, class _T2> struct __tuple_like<pair<_T1, _T2> > : true_type {};
|
template <class _T1, class _T2> struct __tuple_like<pair<_T1, _T2> > : true_type {};
|
||||||
|
|
||||||
template <size_t _Ip, class _T1, class _T2>
|
template <size_t _Ip, class _T1, class _T2>
|
||||||
@@ -109,6 +112,11 @@ template <size_t _Ip, class _T1, class _T2>
|
|||||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||||
typename tuple_element<_Ip, pair<_T1, _T2> >::type&&
|
typename tuple_element<_Ip, pair<_T1, _T2> >::type&&
|
||||||
get(pair<_T1, _T2>&&) _NOEXCEPT;
|
get(pair<_T1, _T2>&&) _NOEXCEPT;
|
||||||
|
|
||||||
|
template <size_t _Ip, class _T1, class _T2>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||||
|
const typename tuple_element<_Ip, pair<_T1, _T2> >::type&&
|
||||||
|
get(const pair<_T1, _T2>&&) _NOEXCEPT;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// array specializations
|
// array specializations
|
||||||
@@ -132,35 +140,15 @@ template <size_t _Ip, class _Tp, size_t _Size>
|
|||||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||||
_Tp&&
|
_Tp&&
|
||||||
get(array<_Tp, _Size>&&) _NOEXCEPT;
|
get(array<_Tp, _Size>&&) _NOEXCEPT;
|
||||||
|
|
||||||
|
template <size_t _Ip, class _Tp, size_t _Size>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||||
|
const _Tp&&
|
||||||
|
get(const array<_Tp, _Size>&&) _NOEXCEPT;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(_LIBCPP_HAS_NO_VARIADICS)
|
#if !defined(_LIBCPP_HAS_NO_VARIADICS)
|
||||||
|
|
||||||
// __lazy_and
|
|
||||||
|
|
||||||
template <bool _Last, class ..._Preds>
|
|
||||||
struct __lazy_and_impl;
|
|
||||||
|
|
||||||
template <class ..._Preds>
|
|
||||||
struct __lazy_and_impl<false, _Preds...> : false_type {};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct __lazy_and_impl<true> : true_type {};
|
|
||||||
|
|
||||||
template <class _Pred>
|
|
||||||
struct __lazy_and_impl<true, _Pred> : integral_constant<bool, _Pred::type::value> {};
|
|
||||||
|
|
||||||
template <class _Hp, class ..._Tp>
|
|
||||||
struct __lazy_and_impl<true, _Hp, _Tp...> : __lazy_and_impl<_Hp::type::value, _Tp...> {};
|
|
||||||
|
|
||||||
template <class _P1, class ..._Pr>
|
|
||||||
struct __lazy_and : __lazy_and_impl<_P1::type::value, _Pr...> {};
|
|
||||||
|
|
||||||
// __lazy_not
|
|
||||||
|
|
||||||
template <class _Pred>
|
|
||||||
struct __lazy_not : integral_constant<bool, !_Pred::type::value> {};
|
|
||||||
|
|
||||||
// __make_tuple_indices
|
// __make_tuple_indices
|
||||||
|
|
||||||
template <size_t...> struct __tuple_indices {};
|
template <size_t...> struct __tuple_indices {};
|
||||||
|
|||||||
@@ -543,6 +543,12 @@ template<class T, class Compare>
|
|||||||
T
|
T
|
||||||
min(initializer_list<T> t, Compare comp); // constexpr in C++14
|
min(initializer_list<T> t, Compare comp); // constexpr in C++14
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
constexpr const T& clamp( const T& v, const T& lo, const T& hi ); // C++17
|
||||||
|
|
||||||
|
template<class T, class Compare>
|
||||||
|
constexpr const T& clamp( const T& v, const T& lo, const T& hi, Compare comp ); // C++17
|
||||||
|
|
||||||
template <class ForwardIterator>
|
template <class ForwardIterator>
|
||||||
ForwardIterator
|
ForwardIterator
|
||||||
max_element(ForwardIterator first, ForwardIterator last); // constexpr in C++14
|
max_element(ForwardIterator first, ForwardIterator last); // constexpr in C++14
|
||||||
@@ -624,7 +630,7 @@ template <class BidirectionalIterator, class Compare>
|
|||||||
#include <initializer_list>
|
#include <initializer_list>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <utility>
|
#include <utility> // needed to provide swap_ranges.
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
@@ -851,7 +857,7 @@ for_each(_InputIterator __first, _InputIterator __last, _Function __f)
|
|||||||
{
|
{
|
||||||
for (; __first != __last; ++__first)
|
for (; __first != __last; ++__first)
|
||||||
__f(*__first);
|
__f(*__first);
|
||||||
return _VSTD::move(__f); // explicitly moved for (emulated) C++03
|
return _LIBCPP_EXPLICIT_MOVE(__f); // explicitly moved for (emulated) C++03
|
||||||
}
|
}
|
||||||
|
|
||||||
// find
|
// find
|
||||||
@@ -1415,20 +1421,20 @@ is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
|
|||||||
// search
|
// search
|
||||||
|
|
||||||
template <class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
|
template <class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
|
||||||
_ForwardIterator1
|
pair<_ForwardIterator1, _ForwardIterator1>
|
||||||
__search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
|
__search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
|
||||||
_ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred,
|
_ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred,
|
||||||
forward_iterator_tag, forward_iterator_tag)
|
forward_iterator_tag, forward_iterator_tag)
|
||||||
{
|
{
|
||||||
if (__first2 == __last2)
|
if (__first2 == __last2)
|
||||||
return __first1; // Everything matches an empty sequence
|
return make_pair(__first1, __first1); // Everything matches an empty sequence
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
// Find first element in sequence 1 that matchs *__first2, with a mininum of loop checks
|
// Find first element in sequence 1 that matchs *__first2, with a mininum of loop checks
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
if (__first1 == __last1) // return __last1 if no element matches *__first2
|
if (__first1 == __last1) // return __last1 if no element matches *__first2
|
||||||
return __last1;
|
return make_pair(__last1, __last1);
|
||||||
if (__pred(*__first1, *__first2))
|
if (__pred(*__first1, *__first2))
|
||||||
break;
|
break;
|
||||||
++__first1;
|
++__first1;
|
||||||
@@ -1439,9 +1445,9 @@ __search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
|
|||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
if (++__m2 == __last2) // If pattern exhausted, __first1 is the answer (works for 1 element pattern)
|
if (++__m2 == __last2) // If pattern exhausted, __first1 is the answer (works for 1 element pattern)
|
||||||
return __first1;
|
return make_pair(__first1, __m1);
|
||||||
if (++__m1 == __last1) // Otherwise if source exhaused, pattern not found
|
if (++__m1 == __last1) // Otherwise if source exhaused, pattern not found
|
||||||
return __last1;
|
return make_pair(__last1, __last1);
|
||||||
if (!__pred(*__m1, *__m2)) // if there is a mismatch, restart with a new __first1
|
if (!__pred(*__m1, *__m2)) // if there is a mismatch, restart with a new __first1
|
||||||
{
|
{
|
||||||
++__first1;
|
++__first1;
|
||||||
@@ -1452,20 +1458,21 @@ __search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
|
template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
|
||||||
_LIBCPP_CONSTEXPR_AFTER_CXX11 _RandomAccessIterator1
|
_LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||||
|
pair<_RandomAccessIterator1, _RandomAccessIterator1>
|
||||||
__search(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
|
__search(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
|
||||||
_RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
|
_RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
|
||||||
random_access_iterator_tag, random_access_iterator_tag)
|
random_access_iterator_tag, random_access_iterator_tag)
|
||||||
{
|
{
|
||||||
typedef typename std::iterator_traits<_RandomAccessIterator1>::difference_type _D1;
|
typedef typename iterator_traits<_RandomAccessIterator1>::difference_type _D1;
|
||||||
typedef typename std::iterator_traits<_RandomAccessIterator2>::difference_type _D2;
|
typedef typename iterator_traits<_RandomAccessIterator2>::difference_type _D2;
|
||||||
// Take advantage of knowing source and pattern lengths. Stop short when source is smaller than pattern
|
// Take advantage of knowing source and pattern lengths. Stop short when source is smaller than pattern
|
||||||
_D2 __len2 = __last2 - __first2;
|
const _D2 __len2 = __last2 - __first2;
|
||||||
if (__len2 == 0)
|
if (__len2 == 0)
|
||||||
return __first1;
|
return make_pair(__first1, __first1);
|
||||||
_D1 __len1 = __last1 - __first1;
|
const _D1 __len1 = __last1 - __first1;
|
||||||
if (__len1 < __len2)
|
if (__len1 < __len2)
|
||||||
return __last1;
|
return make_pair(__last1, __last1);
|
||||||
const _RandomAccessIterator1 __s = __last1 - (__len2 - 1); // Start of pattern match can't go beyond here
|
const _RandomAccessIterator1 __s = __last1 - (__len2 - 1); // Start of pattern match can't go beyond here
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
@@ -1473,7 +1480,7 @@ __search(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
|
|||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
if (__first1 == __s)
|
if (__first1 == __s)
|
||||||
return __last1;
|
return make_pair(__last1, __last1);
|
||||||
if (__pred(*__first1, *__first2))
|
if (__pred(*__first1, *__first2))
|
||||||
break;
|
break;
|
||||||
++__first1;
|
++__first1;
|
||||||
@@ -1505,7 +1512,7 @@ __search(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
|
|||||||
if (__pred(*__first1, *__first2))
|
if (__pred(*__first1, *__first2))
|
||||||
break;
|
break;
|
||||||
case 0:
|
case 0:
|
||||||
return __last1;
|
return make_pair(__last1, __last1);
|
||||||
}
|
}
|
||||||
__phase2:
|
__phase2:
|
||||||
#endif // !_LIBCPP_UNROLL_LOOPS
|
#endif // !_LIBCPP_UNROLL_LOOPS
|
||||||
@@ -1515,7 +1522,7 @@ __search(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
|
|||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
if (++__m2 == __last2)
|
if (++__m2 == __last2)
|
||||||
return __first1;
|
return make_pair(__first1, __first1 + __len2);
|
||||||
++__m1; // no need to check range on __m1 because __s guarantees we have enough source
|
++__m1; // no need to check range on __m1 because __s guarantees we have enough source
|
||||||
if (!__pred(*__m1, *__m2))
|
if (!__pred(*__m1, *__m2))
|
||||||
{
|
{
|
||||||
@@ -1555,7 +1562,7 @@ __search(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
|
|||||||
if (!__pred(*__m1, *__m2))
|
if (!__pred(*__m1, *__m2))
|
||||||
break;
|
break;
|
||||||
case 0:
|
case 0:
|
||||||
return __first1;
|
return make_pair(__first1, __first1 + __len2);
|
||||||
}
|
}
|
||||||
__continue:
|
__continue:
|
||||||
++__first1;
|
++__first1;
|
||||||
@@ -1571,8 +1578,9 @@ search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
|
|||||||
{
|
{
|
||||||
return _VSTD::__search<typename add_lvalue_reference<_BinaryPredicate>::type>
|
return _VSTD::__search<typename add_lvalue_reference<_BinaryPredicate>::type>
|
||||||
(__first1, __last1, __first2, __last2, __pred,
|
(__first1, __last1, __first2, __last2, __pred,
|
||||||
typename std::iterator_traits<_ForwardIterator1>::iterator_category(),
|
typename iterator_traits<_ForwardIterator1>::iterator_category(),
|
||||||
typename std::iterator_traits<_ForwardIterator2>::iterator_category());
|
typename iterator_traits<_ForwardIterator2>::iterator_category())
|
||||||
|
.first;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class _ForwardIterator1, class _ForwardIterator2>
|
template <class _ForwardIterator1, class _ForwardIterator2>
|
||||||
@@ -1581,8 +1589,8 @@ _ForwardIterator1
|
|||||||
search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
|
search(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
|
||||||
_ForwardIterator2 __first2, _ForwardIterator2 __last2)
|
_ForwardIterator2 __first2, _ForwardIterator2 __last2)
|
||||||
{
|
{
|
||||||
typedef typename std::iterator_traits<_ForwardIterator1>::value_type __v1;
|
typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
|
||||||
typedef typename std::iterator_traits<_ForwardIterator2>::value_type __v2;
|
typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
|
||||||
return _VSTD::search(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
|
return _VSTD::search(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1687,25 +1695,6 @@ search_n(_ForwardIterator __first, _ForwardIterator __last, _Size __count, const
|
|||||||
}
|
}
|
||||||
|
|
||||||
// copy
|
// copy
|
||||||
|
|
||||||
template <class _Iter>
|
|
||||||
struct __libcpp_is_trivial_iterator
|
|
||||||
{
|
|
||||||
static const bool value = is_pointer<_Iter>::value;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class _Iter>
|
|
||||||
struct __libcpp_is_trivial_iterator<move_iterator<_Iter> >
|
|
||||||
{
|
|
||||||
static const bool value = is_pointer<_Iter>::value;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class _Iter>
|
|
||||||
struct __libcpp_is_trivial_iterator<__wrap_iter<_Iter> >
|
|
||||||
{
|
|
||||||
static const bool value = is_pointer<_Iter>::value;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class _Iter>
|
template <class _Iter>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
_Iter
|
_Iter
|
||||||
@@ -2330,7 +2319,7 @@ __reverse(_BidirectionalIterator __first, _BidirectionalIterator __last, bidirec
|
|||||||
{
|
{
|
||||||
if (__first == --__last)
|
if (__first == --__last)
|
||||||
break;
|
break;
|
||||||
swap(*__first, *__last);
|
_VSTD::iter_swap(__first, __last);
|
||||||
++__first;
|
++__first;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2342,7 +2331,7 @@ __reverse(_RandomAccessIterator __first, _RandomAccessIterator __last, random_ac
|
|||||||
{
|
{
|
||||||
if (__first != __last)
|
if (__first != __last)
|
||||||
for (; __first < --__last; ++__first)
|
for (; __first < --__last; ++__first)
|
||||||
swap(*__first, *__last);
|
_VSTD::iter_swap(__first, __last);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class _BidirectionalIterator>
|
template <class _BidirectionalIterator>
|
||||||
@@ -2676,6 +2665,27 @@ max(initializer_list<_Tp> __t)
|
|||||||
|
|
||||||
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
||||||
|
|
||||||
|
#if _LIBCPP_STD_VER > 14
|
||||||
|
// clamp
|
||||||
|
template<class _Tp, class _Compare>
|
||||||
|
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||||
|
const _Tp&
|
||||||
|
clamp(const _Tp& __v, const _Tp& __lo, const _Tp& __hi, _Compare __comp)
|
||||||
|
{
|
||||||
|
_LIBCPP_ASSERT(!__comp(__hi, __lo), "Bad bounds passed to std::clamp");
|
||||||
|
return __comp(__v, __lo) ? __lo : __comp(__hi, __v) ? __hi : __v;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class _Tp>
|
||||||
|
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||||
|
const _Tp&
|
||||||
|
clamp(const _Tp& __v, const _Tp& __lo, const _Tp& __hi)
|
||||||
|
{
|
||||||
|
return _VSTD::clamp(__v, __lo, __hi, __less<_Tp>());
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// minmax_element
|
// minmax_element
|
||||||
|
|
||||||
template <class _ForwardIterator, class _Compare>
|
template <class _ForwardIterator, class _Compare>
|
||||||
@@ -5744,34 +5754,6 @@ prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last)
|
|||||||
__less<typename iterator_traits<_BidirectionalIterator>::value_type>());
|
__less<typename iterator_traits<_BidirectionalIterator>::value_type>());
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
typename enable_if
|
|
||||||
<
|
|
||||||
is_integral<_Tp>::value,
|
|
||||||
_Tp
|
|
||||||
>::type
|
|
||||||
__rotate_left(_Tp __t, _Tp __n = 1)
|
|
||||||
{
|
|
||||||
const unsigned __bits = static_cast<unsigned>(sizeof(_Tp) * __CHAR_BIT__ - 1);
|
|
||||||
__n &= __bits;
|
|
||||||
return static_cast<_Tp>((__t << __n) | (static_cast<typename make_unsigned<_Tp>::type>(__t) >> (__bits - __n)));
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Tp>
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
typename enable_if
|
|
||||||
<
|
|
||||||
is_integral<_Tp>::value,
|
|
||||||
_Tp
|
|
||||||
>::type
|
|
||||||
__rotate_right(_Tp __t, _Tp __n = 1)
|
|
||||||
{
|
|
||||||
const unsigned __bits = static_cast<unsigned>(sizeof(_Tp) * __CHAR_BIT__ - 1);
|
|
||||||
__n &= __bits;
|
|
||||||
return static_cast<_Tp>((__t << (__bits - __n)) | (static_cast<typename make_unsigned<_Tp>::type>(__t) >> __n));
|
|
||||||
}
|
|
||||||
|
|
||||||
_LIBCPP_END_NAMESPACE_STD
|
_LIBCPP_END_NAMESPACE_STD
|
||||||
|
|
||||||
#endif // _LIBCPP_ALGORITHM
|
#endif // _LIBCPP_ALGORITHM
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ struct array
|
|||||||
|
|
||||||
// No explicit construct/copy/destroy for aggregate type
|
// No explicit construct/copy/destroy for aggregate type
|
||||||
void fill(const T& u);
|
void fill(const T& u);
|
||||||
void swap(array& a) noexcept(noexcept(swap(declval<T&>(), declval<T&>())));
|
void swap(array& a) noexcept(is_nothrow_swappable_v<T>);
|
||||||
|
|
||||||
// iterators:
|
// iterators:
|
||||||
iterator begin() noexcept;
|
iterator begin() noexcept;
|
||||||
@@ -89,12 +89,13 @@ template <class T, size_t N >
|
|||||||
void swap(array<T,N>& x, array<T,N>& y) noexcept(noexcept(x.swap(y)));
|
void swap(array<T,N>& x, array<T,N>& y) noexcept(noexcept(x.swap(y)));
|
||||||
|
|
||||||
template <class T> class tuple_size;
|
template <class T> class tuple_size;
|
||||||
template <int I, class T> class tuple_element;
|
template <size_t I, class T> class tuple_element;
|
||||||
template <class T, size_t N> struct tuple_size<array<T, N>>;
|
template <class T, size_t N> struct tuple_size<array<T, N>>;
|
||||||
template <int I, class T, size_t N> struct tuple_element<I, array<T, N>>;
|
template <size_t I, class T, size_t N> struct tuple_element<I, array<T, N>>;
|
||||||
template <int I, class T, size_t N> T& get(array<T, N>&) noexcept; // constexpr in C++14
|
template <size_t I, class T, size_t N> T& get(array<T, N>&) noexcept; // constexpr in C++14
|
||||||
template <int I, class T, size_t N> const T& get(const array<T, N>&) noexcept; // constexpr in C++14
|
template <size_t I, class T, size_t N> const T& get(const array<T, N>&) noexcept; // constexpr in C++14
|
||||||
template <int I, class T, size_t N> T&& get(array<T, N>&&) noexcept; // constexpr in C++14
|
template <size_t I, class T, size_t N> T&& get(array<T, N>&&) noexcept; // constexpr in C++14
|
||||||
|
template <size_t I, class T, size_t N> const T&& get(const array<T, N>&&) noexcept; // constexpr in C++14
|
||||||
|
|
||||||
} // std
|
} // std
|
||||||
|
|
||||||
@@ -140,8 +141,15 @@ struct _LIBCPP_TYPE_VIS_ONLY array
|
|||||||
_LIBCPP_INLINE_VISIBILITY void fill(const value_type& __u)
|
_LIBCPP_INLINE_VISIBILITY void fill(const value_type& __u)
|
||||||
{_VSTD::fill_n(__elems_, _Size, __u);}
|
{_VSTD::fill_n(__elems_, _Size, __u);}
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void swap(array& __a) _NOEXCEPT_(__is_nothrow_swappable<_Tp>::value)
|
void swap(array& __a) _NOEXCEPT_(_Size == 0 || __is_nothrow_swappable<_Tp>::value)
|
||||||
{_VSTD::swap_ranges(__elems_, __elems_ + _Size, __a.__elems_);}
|
{ __swap_dispatch((std::integral_constant<bool, _Size == 0>()), __a); }
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
void __swap_dispatch(std::true_type, array&) {}
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
void __swap_dispatch(std::false_type, array& __a)
|
||||||
|
{ _VSTD::swap_ranges(__elems_, __elems_ + _Size, __a.__elems_);}
|
||||||
|
|
||||||
// iterators:
|
// iterators:
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
@@ -275,11 +283,12 @@ template <class _Tp, size_t _Size>
|
|||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
typename enable_if
|
typename enable_if
|
||||||
<
|
<
|
||||||
|
_Size == 0 ||
|
||||||
__is_swappable<_Tp>::value,
|
__is_swappable<_Tp>::value,
|
||||||
void
|
void
|
||||||
>::type
|
>::type
|
||||||
swap(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y)
|
swap(array<_Tp, _Size>& __x, array<_Tp, _Size>& __y)
|
||||||
_NOEXCEPT_(__is_nothrow_swappable<_Tp>::value)
|
_NOEXCEPT_(noexcept(__x.swap(__y)))
|
||||||
{
|
{
|
||||||
__x.swap(__y);
|
__x.swap(__y);
|
||||||
}
|
}
|
||||||
@@ -324,6 +333,15 @@ get(array<_Tp, _Size>&& __a) _NOEXCEPT
|
|||||||
return _VSTD::move(__a.__elems_[_Ip]);
|
return _VSTD::move(__a.__elems_[_Ip]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <size_t _Ip, class _Tp, size_t _Size>
|
||||||
|
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||||
|
const _Tp&&
|
||||||
|
get(const array<_Tp, _Size>&& __a) _NOEXCEPT
|
||||||
|
{
|
||||||
|
static_assert(_Ip < _Size, "Index out of bounds in std::get<> (const std::array &&)");
|
||||||
|
return _VSTD::move(__a.__elems_[_Ip]);
|
||||||
|
}
|
||||||
|
|
||||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
|
||||||
_LIBCPP_END_NAMESPACE_STD
|
_LIBCPP_END_NAMESPACE_STD
|
||||||
|
|||||||
@@ -17,6 +17,10 @@
|
|||||||
namespace std
|
namespace std
|
||||||
{
|
{
|
||||||
|
|
||||||
|
// feature test macro
|
||||||
|
|
||||||
|
#define __cpp_lib_atomic_is_always_lock_free // as specified by SG10
|
||||||
|
|
||||||
// order and consistency
|
// order and consistency
|
||||||
|
|
||||||
typedef enum memory_order
|
typedef enum memory_order
|
||||||
@@ -89,6 +93,7 @@ void
|
|||||||
template <class T>
|
template <class T>
|
||||||
struct atomic
|
struct atomic
|
||||||
{
|
{
|
||||||
|
static constexpr bool is_always_lock_free;
|
||||||
bool is_lock_free() const volatile noexcept;
|
bool is_lock_free() const volatile noexcept;
|
||||||
bool is_lock_free() const noexcept;
|
bool is_lock_free() const noexcept;
|
||||||
void store(T desr, memory_order m = memory_order_seq_cst) volatile noexcept;
|
void store(T desr, memory_order m = memory_order_seq_cst) volatile noexcept;
|
||||||
@@ -127,6 +132,7 @@ struct atomic
|
|||||||
template <>
|
template <>
|
||||||
struct atomic<integral>
|
struct atomic<integral>
|
||||||
{
|
{
|
||||||
|
static constexpr bool is_always_lock_free;
|
||||||
bool is_lock_free() const volatile noexcept;
|
bool is_lock_free() const volatile noexcept;
|
||||||
bool is_lock_free() const noexcept;
|
bool is_lock_free() const noexcept;
|
||||||
void store(integral desr, memory_order m = memory_order_seq_cst) volatile noexcept;
|
void store(integral desr, memory_order m = memory_order_seq_cst) volatile noexcept;
|
||||||
@@ -202,6 +208,7 @@ struct atomic<integral>
|
|||||||
template <class T>
|
template <class T>
|
||||||
struct atomic<T*>
|
struct atomic<T*>
|
||||||
{
|
{
|
||||||
|
static constexpr bool is_always_lock_free;
|
||||||
bool is_lock_free() const volatile noexcept;
|
bool is_lock_free() const volatile noexcept;
|
||||||
bool is_lock_free() const noexcept;
|
bool is_lock_free() const noexcept;
|
||||||
void store(T* desr, memory_order m = memory_order_seq_cst) volatile noexcept;
|
void store(T* desr, memory_order m = memory_order_seq_cst) volatile noexcept;
|
||||||
@@ -535,25 +542,40 @@ void atomic_signal_fence(memory_order m) noexcept;
|
|||||||
|
|
||||||
#ifdef _LIBCPP_HAS_NO_THREADS
|
#ifdef _LIBCPP_HAS_NO_THREADS
|
||||||
#error <atomic> is not supported on this single threaded system
|
#error <atomic> is not supported on this single threaded system
|
||||||
#else // !_LIBCPP_HAS_NO_THREADS
|
#endif
|
||||||
|
#if !defined(_LIBCPP_HAS_C_ATOMIC_IMP) && !defined(_LIBCPP_HAS_GCC_ATOMIC_IMP)
|
||||||
|
#error <atomic> is not implemented
|
||||||
|
#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
|
||||||
|
|
||||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||||
|
|
||||||
#if !__has_feature(cxx_atomic) && _GNUC_VER < 407
|
|
||||||
#error <atomic> is not implemented
|
|
||||||
#else
|
|
||||||
|
|
||||||
typedef enum memory_order
|
typedef enum memory_order
|
||||||
{
|
{
|
||||||
memory_order_relaxed, memory_order_consume, memory_order_acquire,
|
memory_order_relaxed, memory_order_consume, memory_order_acquire,
|
||||||
memory_order_release, memory_order_acq_rel, memory_order_seq_cst
|
memory_order_release, memory_order_acq_rel, memory_order_seq_cst
|
||||||
} memory_order;
|
} memory_order;
|
||||||
|
|
||||||
#if _GNUC_VER >= 407
|
#if defined(_LIBCPP_HAS_GCC_ATOMIC_IMP)
|
||||||
namespace __gcc_atomic {
|
namespace __gcc_atomic {
|
||||||
template <typename _Tp>
|
template <typename _Tp>
|
||||||
struct __gcc_atomic_t {
|
struct __gcc_atomic_t {
|
||||||
__gcc_atomic_t() _NOEXCEPT {}
|
|
||||||
|
#if _GNUC_VER >= 501
|
||||||
|
static_assert(is_trivially_copyable<_Tp>::value,
|
||||||
|
"std::atomic<Tp> requires that 'Tp' be a trivially copyable type");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
#ifndef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||||
|
__gcc_atomic_t() _NOEXCEPT = default;
|
||||||
|
#else
|
||||||
|
__gcc_atomic_t() _NOEXCEPT : __a_value() {}
|
||||||
|
#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||||
_LIBCPP_CONSTEXPR explicit __gcc_atomic_t(_Tp value) _NOEXCEPT
|
_LIBCPP_CONSTEXPR explicit __gcc_atomic_t(_Tp value) _NOEXCEPT
|
||||||
: __a_value(value) {}
|
: __a_value(value) {}
|
||||||
_Tp __a_value;
|
_Tp __a_value;
|
||||||
@@ -574,7 +596,7 @@ struct __can_assign {
|
|||||||
sizeof(__test_atomic_assignable<_Tp, _Td>(1)) == sizeof(char);
|
sizeof(__test_atomic_assignable<_Tp, _Td>(1)) == sizeof(char);
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline constexpr int __to_gcc_order(memory_order __order) {
|
static inline _LIBCPP_CONSTEXPR int __to_gcc_order(memory_order __order) {
|
||||||
// Avoid switch statement to make this a constexpr.
|
// Avoid switch statement to make this a constexpr.
|
||||||
return __order == memory_order_relaxed ? __ATOMIC_RELAXED:
|
return __order == memory_order_relaxed ? __ATOMIC_RELAXED:
|
||||||
(__order == memory_order_acquire ? __ATOMIC_ACQUIRE:
|
(__order == memory_order_acquire ? __ATOMIC_ACQUIRE:
|
||||||
@@ -584,7 +606,7 @@ static inline constexpr int __to_gcc_order(memory_order __order) {
|
|||||||
__ATOMIC_CONSUME))));
|
__ATOMIC_CONSUME))));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline constexpr int __to_gcc_failure_order(memory_order __order) {
|
static inline _LIBCPP_CONSTEXPR int __to_gcc_failure_order(memory_order __order) {
|
||||||
// Avoid switch statement to make this a constexpr.
|
// Avoid switch statement to make this a constexpr.
|
||||||
return __order == memory_order_relaxed ? __ATOMIC_RELAXED:
|
return __order == memory_order_relaxed ? __ATOMIC_RELAXED:
|
||||||
(__order == memory_order_acquire ? __ATOMIC_ACQUIRE:
|
(__order == memory_order_acquire ? __ATOMIC_ACQUIRE:
|
||||||
@@ -805,7 +827,7 @@ static inline _Tp __c11_atomic_fetch_xor(_Atomic(_Tp)* __a, _Tp __pattern,
|
|||||||
return __atomic_fetch_xor(&__a->__a_value, __pattern,
|
return __atomic_fetch_xor(&__a->__a_value, __pattern,
|
||||||
__gcc_atomic::__to_gcc_order(__order));
|
__gcc_atomic::__to_gcc_order(__order));
|
||||||
}
|
}
|
||||||
#endif // _GNUC_VER >= 407
|
#endif // _LIBCPP_HAS_GCC_ATOMIC_IMP
|
||||||
|
|
||||||
template <class _Tp>
|
template <class _Tp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
@@ -815,6 +837,17 @@ kill_dependency(_Tp __y) _NOEXCEPT
|
|||||||
return __y;
|
return __y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define ATOMIC_BOOL_LOCK_FREE __GCC_ATOMIC_BOOL_LOCK_FREE
|
||||||
|
#define ATOMIC_CHAR_LOCK_FREE __GCC_ATOMIC_CHAR_LOCK_FREE
|
||||||
|
#define ATOMIC_CHAR16_T_LOCK_FREE __GCC_ATOMIC_CHAR16_T_LOCK_FREE
|
||||||
|
#define ATOMIC_CHAR32_T_LOCK_FREE __GCC_ATOMIC_CHAR32_T_LOCK_FREE
|
||||||
|
#define ATOMIC_WCHAR_T_LOCK_FREE __GCC_ATOMIC_WCHAR_T_LOCK_FREE
|
||||||
|
#define ATOMIC_SHORT_LOCK_FREE __GCC_ATOMIC_SHORT_LOCK_FREE
|
||||||
|
#define ATOMIC_INT_LOCK_FREE __GCC_ATOMIC_INT_LOCK_FREE
|
||||||
|
#define ATOMIC_LONG_LOCK_FREE __GCC_ATOMIC_LONG_LOCK_FREE
|
||||||
|
#define ATOMIC_LLONG_LOCK_FREE __GCC_ATOMIC_LLONG_LOCK_FREE
|
||||||
|
#define ATOMIC_POINTER_LOCK_FREE __GCC_ATOMIC_POINTER_LOCK_FREE
|
||||||
|
|
||||||
// general atomic<T>
|
// general atomic<T>
|
||||||
|
|
||||||
template <class _Tp, bool = is_integral<_Tp>::value && !is_same<_Tp, bool>::value>
|
template <class _Tp, bool = is_integral<_Tp>::value && !is_same<_Tp, bool>::value>
|
||||||
@@ -822,10 +855,14 @@ struct __atomic_base // false
|
|||||||
{
|
{
|
||||||
mutable _Atomic(_Tp) __a_;
|
mutable _Atomic(_Tp) __a_;
|
||||||
|
|
||||||
|
#if defined(__cpp_lib_atomic_is_always_lock_free)
|
||||||
|
static _LIBCPP_CONSTEXPR bool is_always_lock_free = __atomic_always_lock_free(sizeof(__a_), 0);
|
||||||
|
#endif
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
bool is_lock_free() const volatile _NOEXCEPT
|
bool is_lock_free() const volatile _NOEXCEPT
|
||||||
{
|
{
|
||||||
#if __has_feature(cxx_atomic)
|
#if defined(_LIBCPP_HAS_C_ATOMIC_IMP)
|
||||||
return __c11_atomic_is_lock_free(sizeof(_Tp));
|
return __c11_atomic_is_lock_free(sizeof(_Tp));
|
||||||
#else
|
#else
|
||||||
return __atomic_is_lock_free(sizeof(_Tp), 0);
|
return __atomic_is_lock_free(sizeof(_Tp), 0);
|
||||||
@@ -910,6 +947,11 @@ private:
|
|||||||
#endif // _LIBCPP_HAS_NO_DELETED_FUNCTIONS
|
#endif // _LIBCPP_HAS_NO_DELETED_FUNCTIONS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if defined(__cpp_lib_atomic_is_always_lock_free)
|
||||||
|
template <class _Tp, bool __b>
|
||||||
|
_LIBCPP_CONSTEXPR bool __atomic_base<_Tp, __b>::is_always_lock_free;
|
||||||
|
#endif
|
||||||
|
|
||||||
// atomic<Integral>
|
// atomic<Integral>
|
||||||
|
|
||||||
template <class _Tp>
|
template <class _Tp>
|
||||||
@@ -1647,7 +1689,7 @@ typedef struct atomic_flag
|
|||||||
#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
atomic_flag(bool __b) _NOEXCEPT : __a_(__b) {}
|
atomic_flag(bool __b) _NOEXCEPT : __a_(__b) {} // EXTENSION
|
||||||
|
|
||||||
#ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS
|
#ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS
|
||||||
atomic_flag(const atomic_flag&) = delete;
|
atomic_flag(const atomic_flag&) = delete;
|
||||||
@@ -1779,23 +1821,6 @@ typedef atomic<uintmax_t> atomic_uintmax_t;
|
|||||||
#define ATOMIC_FLAG_INIT {false}
|
#define ATOMIC_FLAG_INIT {false}
|
||||||
#define ATOMIC_VAR_INIT(__v) {__v}
|
#define ATOMIC_VAR_INIT(__v) {__v}
|
||||||
|
|
||||||
// lock-free property
|
|
||||||
|
|
||||||
#define ATOMIC_BOOL_LOCK_FREE __GCC_ATOMIC_BOOL_LOCK_FREE
|
|
||||||
#define ATOMIC_CHAR_LOCK_FREE __GCC_ATOMIC_CHAR_LOCK_FREE
|
|
||||||
#define ATOMIC_CHAR16_T_LOCK_FREE __GCC_ATOMIC_CHAR16_T_LOCK_FREE
|
|
||||||
#define ATOMIC_CHAR32_T_LOCK_FREE __GCC_ATOMIC_CHAR32_T_LOCK_FREE
|
|
||||||
#define ATOMIC_WCHAR_T_LOCK_FREE __GCC_ATOMIC_WCHAR_T_LOCK_FREE
|
|
||||||
#define ATOMIC_SHORT_LOCK_FREE __GCC_ATOMIC_SHORT_LOCK_FREE
|
|
||||||
#define ATOMIC_INT_LOCK_FREE __GCC_ATOMIC_INT_LOCK_FREE
|
|
||||||
#define ATOMIC_LONG_LOCK_FREE __GCC_ATOMIC_LONG_LOCK_FREE
|
|
||||||
#define ATOMIC_LLONG_LOCK_FREE __GCC_ATOMIC_LLONG_LOCK_FREE
|
|
||||||
#define ATOMIC_POINTER_LOCK_FREE __GCC_ATOMIC_POINTER_LOCK_FREE
|
|
||||||
|
|
||||||
#endif // !__has_feature(cxx_atomic)
|
|
||||||
|
|
||||||
_LIBCPP_END_NAMESPACE_STD
|
_LIBCPP_END_NAMESPACE_STD
|
||||||
|
|
||||||
#endif // !_LIBCPP_HAS_NO_THREADS
|
|
||||||
|
|
||||||
#endif // _LIBCPP_ATOMIC
|
#endif // _LIBCPP_ATOMIC
|
||||||
|
|||||||
126
include/bitset
126
include/bitset
@@ -168,7 +168,9 @@ protected:
|
|||||||
typedef __bit_iterator<__bitset, false> iterator;
|
typedef __bit_iterator<__bitset, false> iterator;
|
||||||
typedef __bit_iterator<__bitset, true> const_iterator;
|
typedef __bit_iterator<__bitset, true> const_iterator;
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
_LIBCPP_CONSTEXPR __bitset() _NOEXCEPT;
|
_LIBCPP_CONSTEXPR __bitset() _NOEXCEPT;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
explicit _LIBCPP_CONSTEXPR __bitset(unsigned long long __v) _NOEXCEPT;
|
explicit _LIBCPP_CONSTEXPR __bitset(unsigned long long __v) _NOEXCEPT;
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY reference __make_ref(size_t __pos) _NOEXCEPT
|
_LIBCPP_INLINE_VISIBILITY reference __make_ref(size_t __pos) _NOEXCEPT
|
||||||
@@ -180,8 +182,11 @@ protected:
|
|||||||
_LIBCPP_INLINE_VISIBILITY const_iterator __make_iter(size_t __pos) const _NOEXCEPT
|
_LIBCPP_INLINE_VISIBILITY const_iterator __make_iter(size_t __pos) const _NOEXCEPT
|
||||||
{return const_iterator(__first_ + __pos / __bits_per_word, __pos % __bits_per_word);}
|
{return const_iterator(__first_ + __pos / __bits_per_word, __pos % __bits_per_word);}
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void operator&=(const __bitset& __v) _NOEXCEPT;
|
void operator&=(const __bitset& __v) _NOEXCEPT;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void operator|=(const __bitset& __v) _NOEXCEPT;
|
void operator|=(const __bitset& __v) _NOEXCEPT;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void operator^=(const __bitset& __v) _NOEXCEPT;
|
void operator^=(const __bitset& __v) _NOEXCEPT;
|
||||||
|
|
||||||
void flip() _NOEXCEPT;
|
void flip() _NOEXCEPT;
|
||||||
@@ -192,22 +197,27 @@ protected:
|
|||||||
|
|
||||||
bool all() const _NOEXCEPT;
|
bool all() const _NOEXCEPT;
|
||||||
bool any() const _NOEXCEPT;
|
bool any() const _NOEXCEPT;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
size_t __hash_code() const _NOEXCEPT;
|
size_t __hash_code() const _NOEXCEPT;
|
||||||
private:
|
private:
|
||||||
#ifdef _LIBCPP_HAS_NO_CONSTEXPR
|
#ifdef _LIBCPP_HAS_NO_CONSTEXPR
|
||||||
void __init(unsigned long long __v, false_type) _NOEXCEPT;
|
void __init(unsigned long long __v, false_type) _NOEXCEPT;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void __init(unsigned long long __v, true_type) _NOEXCEPT;
|
void __init(unsigned long long __v, true_type) _NOEXCEPT;
|
||||||
#endif // _LIBCPP_HAS_NO_CONSTEXPR
|
#endif // _LIBCPP_HAS_NO_CONSTEXPR
|
||||||
unsigned long to_ulong(false_type) const;
|
unsigned long to_ulong(false_type) const;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
unsigned long to_ulong(true_type) const;
|
unsigned long to_ulong(true_type) const;
|
||||||
unsigned long long to_ullong(false_type) const;
|
unsigned long long to_ullong(false_type) const;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
unsigned long long to_ullong(true_type) const;
|
unsigned long long to_ullong(true_type) const;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
unsigned long long to_ullong(true_type, false_type) const;
|
unsigned long long to_ullong(true_type, false_type) const;
|
||||||
unsigned long long to_ullong(true_type, true_type) const;
|
unsigned long long to_ullong(true_type, true_type) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <size_t _N_words, size_t _Size>
|
template <size_t _N_words, size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
_LIBCPP_CONSTEXPR
|
_LIBCPP_CONSTEXPR
|
||||||
__bitset<_N_words, _Size>::__bitset() _NOEXCEPT
|
__bitset<_N_words, _Size>::__bitset() _NOEXCEPT
|
||||||
#ifndef _LIBCPP_HAS_NO_CONSTEXPR
|
#ifndef _LIBCPP_HAS_NO_CONSTEXPR
|
||||||
@@ -245,7 +255,7 @@ __bitset<_N_words, _Size>::__init(unsigned long long __v, true_type) _NOEXCEPT
|
|||||||
#endif // _LIBCPP_HAS_NO_CONSTEXPR
|
#endif // _LIBCPP_HAS_NO_CONSTEXPR
|
||||||
|
|
||||||
template <size_t _N_words, size_t _Size>
|
template <size_t _N_words, size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
_LIBCPP_CONSTEXPR
|
_LIBCPP_CONSTEXPR
|
||||||
__bitset<_N_words, _Size>::__bitset(unsigned long long __v) _NOEXCEPT
|
__bitset<_N_words, _Size>::__bitset(unsigned long long __v) _NOEXCEPT
|
||||||
#ifndef _LIBCPP_HAS_NO_CONSTEXPR
|
#ifndef _LIBCPP_HAS_NO_CONSTEXPR
|
||||||
@@ -264,7 +274,7 @@ __bitset<_N_words, _Size>::__bitset(unsigned long long __v) _NOEXCEPT
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t _N_words, size_t _Size>
|
template <size_t _N_words, size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
__bitset<_N_words, _Size>::operator&=(const __bitset& __v) _NOEXCEPT
|
__bitset<_N_words, _Size>::operator&=(const __bitset& __v) _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -273,7 +283,7 @@ __bitset<_N_words, _Size>::operator&=(const __bitset& __v) _NOEXCEPT
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t _N_words, size_t _Size>
|
template <size_t _N_words, size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
__bitset<_N_words, _Size>::operator|=(const __bitset& __v) _NOEXCEPT
|
__bitset<_N_words, _Size>::operator|=(const __bitset& __v) _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -282,7 +292,7 @@ __bitset<_N_words, _Size>::operator|=(const __bitset& __v) _NOEXCEPT
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t _N_words, size_t _Size>
|
template <size_t _N_words, size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
__bitset<_N_words, _Size>::operator^=(const __bitset& __v) _NOEXCEPT
|
__bitset<_N_words, _Size>::operator^=(const __bitset& __v) _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -325,7 +335,7 @@ __bitset<_N_words, _Size>::to_ulong(false_type) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t _N_words, size_t _Size>
|
template <size_t _N_words, size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
unsigned long
|
unsigned long
|
||||||
__bitset<_N_words, _Size>::to_ulong(true_type) const
|
__bitset<_N_words, _Size>::to_ulong(true_type) const
|
||||||
{
|
{
|
||||||
@@ -348,7 +358,7 @@ __bitset<_N_words, _Size>::to_ullong(false_type) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t _N_words, size_t _Size>
|
template <size_t _N_words, size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
unsigned long long
|
unsigned long long
|
||||||
__bitset<_N_words, _Size>::to_ullong(true_type) const
|
__bitset<_N_words, _Size>::to_ullong(true_type) const
|
||||||
{
|
{
|
||||||
@@ -356,7 +366,7 @@ __bitset<_N_words, _Size>::to_ullong(true_type) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t _N_words, size_t _Size>
|
template <size_t _N_words, size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
unsigned long long
|
unsigned long long
|
||||||
__bitset<_N_words, _Size>::to_ullong(true_type, false_type) const
|
__bitset<_N_words, _Size>::to_ullong(true_type, false_type) const
|
||||||
{
|
{
|
||||||
@@ -414,7 +424,7 @@ __bitset<_N_words, _Size>::any() const _NOEXCEPT
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t _N_words, size_t _Size>
|
template <size_t _N_words, size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
size_t
|
size_t
|
||||||
__bitset<_N_words, _Size>::__hash_code() const _NOEXCEPT
|
__bitset<_N_words, _Size>::__hash_code() const _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -450,7 +460,9 @@ protected:
|
|||||||
typedef __bit_iterator<__bitset, false> iterator;
|
typedef __bit_iterator<__bitset, false> iterator;
|
||||||
typedef __bit_iterator<__bitset, true> const_iterator;
|
typedef __bit_iterator<__bitset, true> const_iterator;
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
_LIBCPP_CONSTEXPR __bitset() _NOEXCEPT;
|
_LIBCPP_CONSTEXPR __bitset() _NOEXCEPT;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
explicit _LIBCPP_CONSTEXPR __bitset(unsigned long long __v) _NOEXCEPT;
|
explicit _LIBCPP_CONSTEXPR __bitset(unsigned long long __v) _NOEXCEPT;
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY reference __make_ref(size_t __pos) _NOEXCEPT
|
_LIBCPP_INLINE_VISIBILITY reference __make_ref(size_t __pos) _NOEXCEPT
|
||||||
@@ -462,23 +474,32 @@ protected:
|
|||||||
_LIBCPP_INLINE_VISIBILITY const_iterator __make_iter(size_t __pos) const _NOEXCEPT
|
_LIBCPP_INLINE_VISIBILITY const_iterator __make_iter(size_t __pos) const _NOEXCEPT
|
||||||
{return const_iterator(&__first_ + __pos / __bits_per_word, __pos % __bits_per_word);}
|
{return const_iterator(&__first_ + __pos / __bits_per_word, __pos % __bits_per_word);}
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void operator&=(const __bitset& __v) _NOEXCEPT;
|
void operator&=(const __bitset& __v) _NOEXCEPT;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void operator|=(const __bitset& __v) _NOEXCEPT;
|
void operator|=(const __bitset& __v) _NOEXCEPT;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void operator^=(const __bitset& __v) _NOEXCEPT;
|
void operator^=(const __bitset& __v) _NOEXCEPT;
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void flip() _NOEXCEPT;
|
void flip() _NOEXCEPT;
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
unsigned long to_ulong() const;
|
unsigned long to_ulong() const;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
unsigned long long to_ullong() const;
|
unsigned long long to_ullong() const;
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
bool all() const _NOEXCEPT;
|
bool all() const _NOEXCEPT;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
bool any() const _NOEXCEPT;
|
bool any() const _NOEXCEPT;
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
size_t __hash_code() const _NOEXCEPT;
|
size_t __hash_code() const _NOEXCEPT;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <size_t _Size>
|
template <size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
_LIBCPP_CONSTEXPR
|
_LIBCPP_CONSTEXPR
|
||||||
__bitset<1, _Size>::__bitset() _NOEXCEPT
|
__bitset<1, _Size>::__bitset() _NOEXCEPT
|
||||||
: __first_(0)
|
: __first_(0)
|
||||||
@@ -486,7 +507,7 @@ __bitset<1, _Size>::__bitset() _NOEXCEPT
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t _Size>
|
template <size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
_LIBCPP_CONSTEXPR
|
_LIBCPP_CONSTEXPR
|
||||||
__bitset<1, _Size>::__bitset(unsigned long long __v) _NOEXCEPT
|
__bitset<1, _Size>::__bitset(unsigned long long __v) _NOEXCEPT
|
||||||
: __first_(static_cast<__storage_type>(__v))
|
: __first_(static_cast<__storage_type>(__v))
|
||||||
@@ -494,7 +515,7 @@ __bitset<1, _Size>::__bitset(unsigned long long __v) _NOEXCEPT
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t _Size>
|
template <size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
__bitset<1, _Size>::operator&=(const __bitset& __v) _NOEXCEPT
|
__bitset<1, _Size>::operator&=(const __bitset& __v) _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -502,7 +523,7 @@ __bitset<1, _Size>::operator&=(const __bitset& __v) _NOEXCEPT
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t _Size>
|
template <size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
__bitset<1, _Size>::operator|=(const __bitset& __v) _NOEXCEPT
|
__bitset<1, _Size>::operator|=(const __bitset& __v) _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -510,7 +531,7 @@ __bitset<1, _Size>::operator|=(const __bitset& __v) _NOEXCEPT
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t _Size>
|
template <size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
__bitset<1, _Size>::operator^=(const __bitset& __v) _NOEXCEPT
|
__bitset<1, _Size>::operator^=(const __bitset& __v) _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -518,7 +539,7 @@ __bitset<1, _Size>::operator^=(const __bitset& __v) _NOEXCEPT
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t _Size>
|
template <size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
__bitset<1, _Size>::flip() _NOEXCEPT
|
__bitset<1, _Size>::flip() _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -528,7 +549,7 @@ __bitset<1, _Size>::flip() _NOEXCEPT
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t _Size>
|
template <size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
unsigned long
|
unsigned long
|
||||||
__bitset<1, _Size>::to_ulong() const
|
__bitset<1, _Size>::to_ulong() const
|
||||||
{
|
{
|
||||||
@@ -536,7 +557,7 @@ __bitset<1, _Size>::to_ulong() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t _Size>
|
template <size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
unsigned long long
|
unsigned long long
|
||||||
__bitset<1, _Size>::to_ullong() const
|
__bitset<1, _Size>::to_ullong() const
|
||||||
{
|
{
|
||||||
@@ -544,7 +565,7 @@ __bitset<1, _Size>::to_ullong() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t _Size>
|
template <size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
bool
|
bool
|
||||||
__bitset<1, _Size>::all() const _NOEXCEPT
|
__bitset<1, _Size>::all() const _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -553,7 +574,7 @@ __bitset<1, _Size>::all() const _NOEXCEPT
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t _Size>
|
template <size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
bool
|
bool
|
||||||
__bitset<1, _Size>::any() const _NOEXCEPT
|
__bitset<1, _Size>::any() const _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -562,7 +583,7 @@ __bitset<1, _Size>::any() const _NOEXCEPT
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t _Size>
|
template <size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
size_t
|
size_t
|
||||||
__bitset<1, _Size>::__hash_code() const _NOEXCEPT
|
__bitset<1, _Size>::__hash_code() const _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -593,7 +614,9 @@ protected:
|
|||||||
typedef __bit_iterator<__bitset, false> iterator;
|
typedef __bit_iterator<__bitset, false> iterator;
|
||||||
typedef __bit_iterator<__bitset, true> const_iterator;
|
typedef __bit_iterator<__bitset, true> const_iterator;
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
_LIBCPP_CONSTEXPR __bitset() _NOEXCEPT;
|
_LIBCPP_CONSTEXPR __bitset() _NOEXCEPT;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
explicit _LIBCPP_CONSTEXPR __bitset(unsigned long long) _NOEXCEPT;
|
explicit _LIBCPP_CONSTEXPR __bitset(unsigned long long) _NOEXCEPT;
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY reference __make_ref(size_t) _NOEXCEPT
|
_LIBCPP_INLINE_VISIBILITY reference __make_ref(size_t) _NOEXCEPT
|
||||||
@@ -620,20 +643,20 @@ protected:
|
|||||||
_LIBCPP_INLINE_VISIBILITY size_t __hash_code() const _NOEXCEPT {return 0;}
|
_LIBCPP_INLINE_VISIBILITY size_t __hash_code() const _NOEXCEPT {return 0;}
|
||||||
};
|
};
|
||||||
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
_LIBCPP_CONSTEXPR
|
_LIBCPP_CONSTEXPR
|
||||||
__bitset<0, 0>::__bitset() _NOEXCEPT
|
__bitset<0, 0>::__bitset() _NOEXCEPT
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
_LIBCPP_CONSTEXPR
|
_LIBCPP_CONSTEXPR
|
||||||
__bitset<0, 0>::__bitset(unsigned long long) _NOEXCEPT
|
__bitset<0, 0>::__bitset(unsigned long long) _NOEXCEPT
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
template <size_t _Size> class _LIBCPP_TYPE_VIS_ONLY bitset;
|
template <size_t _Size> class _LIBCPP_TYPE_VIS_ONLY bitset;
|
||||||
template <size_t _Size> struct _LIBCPP_TYPE_VIS_ONLY hash<bitset<_Size> >;
|
template <size_t _Size> struct hash<bitset<_Size> >;
|
||||||
|
|
||||||
template <size_t _Size>
|
template <size_t _Size>
|
||||||
class _LIBCPP_TYPE_VIS_ONLY bitset
|
class _LIBCPP_TYPE_VIS_ONLY bitset
|
||||||
@@ -663,16 +686,23 @@ public:
|
|||||||
_CharT __zero = _CharT('0'), _CharT __one = _CharT('1'));
|
_CharT __zero = _CharT('0'), _CharT __one = _CharT('1'));
|
||||||
|
|
||||||
// 23.3.5.2 bitset operations:
|
// 23.3.5.2 bitset operations:
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
bitset& operator&=(const bitset& __rhs) _NOEXCEPT;
|
bitset& operator&=(const bitset& __rhs) _NOEXCEPT;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
bitset& operator|=(const bitset& __rhs) _NOEXCEPT;
|
bitset& operator|=(const bitset& __rhs) _NOEXCEPT;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
bitset& operator^=(const bitset& __rhs) _NOEXCEPT;
|
bitset& operator^=(const bitset& __rhs) _NOEXCEPT;
|
||||||
bitset& operator<<=(size_t __pos) _NOEXCEPT;
|
bitset& operator<<=(size_t __pos) _NOEXCEPT;
|
||||||
bitset& operator>>=(size_t __pos) _NOEXCEPT;
|
bitset& operator>>=(size_t __pos) _NOEXCEPT;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
bitset& set() _NOEXCEPT;
|
bitset& set() _NOEXCEPT;
|
||||||
bitset& set(size_t __pos, bool __val = true);
|
bitset& set(size_t __pos, bool __val = true);
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
bitset& reset() _NOEXCEPT;
|
bitset& reset() _NOEXCEPT;
|
||||||
bitset& reset(size_t __pos);
|
bitset& reset(size_t __pos);
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
bitset operator~() const _NOEXCEPT;
|
bitset operator~() const _NOEXCEPT;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
bitset& flip() _NOEXCEPT;
|
bitset& flip() _NOEXCEPT;
|
||||||
bitset& flip(size_t __pos);
|
bitset& flip(size_t __pos);
|
||||||
|
|
||||||
@@ -680,28 +710,40 @@ public:
|
|||||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||||
const_reference operator[](size_t __p) const {return base::__make_ref(__p);}
|
const_reference operator[](size_t __p) const {return base::__make_ref(__p);}
|
||||||
_LIBCPP_INLINE_VISIBILITY reference operator[](size_t __p) {return base::__make_ref(__p);}
|
_LIBCPP_INLINE_VISIBILITY reference operator[](size_t __p) {return base::__make_ref(__p);}
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
unsigned long to_ulong() const;
|
unsigned long to_ulong() const;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
unsigned long long to_ullong() const;
|
unsigned long long to_ullong() const;
|
||||||
template <class _CharT, class _Traits, class _Allocator>
|
template <class _CharT, class _Traits, class _Allocator>
|
||||||
basic_string<_CharT, _Traits, _Allocator> to_string(_CharT __zero = _CharT('0'),
|
basic_string<_CharT, _Traits, _Allocator> to_string(_CharT __zero = _CharT('0'),
|
||||||
_CharT __one = _CharT('1')) const;
|
_CharT __one = _CharT('1')) const;
|
||||||
template <class _CharT, class _Traits>
|
template <class _CharT, class _Traits>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
basic_string<_CharT, _Traits, allocator<_CharT> > to_string(_CharT __zero = _CharT('0'),
|
basic_string<_CharT, _Traits, allocator<_CharT> > to_string(_CharT __zero = _CharT('0'),
|
||||||
_CharT __one = _CharT('1')) const;
|
_CharT __one = _CharT('1')) const;
|
||||||
template <class _CharT>
|
template <class _CharT>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> > to_string(_CharT __zero = _CharT('0'),
|
basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> > to_string(_CharT __zero = _CharT('0'),
|
||||||
_CharT __one = _CharT('1')) const;
|
_CharT __one = _CharT('1')) const;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
basic_string<char, char_traits<char>, allocator<char> > to_string(char __zero = '0',
|
basic_string<char, char_traits<char>, allocator<char> > to_string(char __zero = '0',
|
||||||
char __one = '1') const;
|
char __one = '1') const;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
size_t count() const _NOEXCEPT;
|
size_t count() const _NOEXCEPT;
|
||||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR size_t size() const _NOEXCEPT {return _Size;}
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR size_t size() const _NOEXCEPT {return _Size;}
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
bool operator==(const bitset& __rhs) const _NOEXCEPT;
|
bool operator==(const bitset& __rhs) const _NOEXCEPT;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
bool operator!=(const bitset& __rhs) const _NOEXCEPT;
|
bool operator!=(const bitset& __rhs) const _NOEXCEPT;
|
||||||
bool test(size_t __pos) const;
|
bool test(size_t __pos) const;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
bool all() const _NOEXCEPT;
|
bool all() const _NOEXCEPT;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
bool any() const _NOEXCEPT;
|
bool any() const _NOEXCEPT;
|
||||||
_LIBCPP_INLINE_VISIBILITY bool none() const _NOEXCEPT {return !any();}
|
_LIBCPP_INLINE_VISIBILITY bool none() const _NOEXCEPT {return !any();}
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
bitset operator<<(size_t __pos) const _NOEXCEPT;
|
bitset operator<<(size_t __pos) const _NOEXCEPT;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
bitset operator>>(size_t __pos) const _NOEXCEPT;
|
bitset operator>>(size_t __pos) const _NOEXCEPT;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -774,7 +816,7 @@ bitset<_Size>::bitset(const basic_string<_CharT,_Traits,_Allocator>& __str,
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t _Size>
|
template <size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
bitset<_Size>&
|
bitset<_Size>&
|
||||||
bitset<_Size>::operator&=(const bitset& __rhs) _NOEXCEPT
|
bitset<_Size>::operator&=(const bitset& __rhs) _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -783,7 +825,7 @@ bitset<_Size>::operator&=(const bitset& __rhs) _NOEXCEPT
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t _Size>
|
template <size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
bitset<_Size>&
|
bitset<_Size>&
|
||||||
bitset<_Size>::operator|=(const bitset& __rhs) _NOEXCEPT
|
bitset<_Size>::operator|=(const bitset& __rhs) _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -792,7 +834,7 @@ bitset<_Size>::operator|=(const bitset& __rhs) _NOEXCEPT
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t _Size>
|
template <size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
bitset<_Size>&
|
bitset<_Size>&
|
||||||
bitset<_Size>::operator^=(const bitset& __rhs) _NOEXCEPT
|
bitset<_Size>::operator^=(const bitset& __rhs) _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -821,7 +863,7 @@ bitset<_Size>::operator>>=(size_t __pos) _NOEXCEPT
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t _Size>
|
template <size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
bitset<_Size>&
|
bitset<_Size>&
|
||||||
bitset<_Size>::set() _NOEXCEPT
|
bitset<_Size>::set() _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -844,7 +886,7 @@ bitset<_Size>::set(size_t __pos, bool __val)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t _Size>
|
template <size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
bitset<_Size>&
|
bitset<_Size>&
|
||||||
bitset<_Size>::reset() _NOEXCEPT
|
bitset<_Size>::reset() _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -867,7 +909,7 @@ bitset<_Size>::reset(size_t __pos)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t _Size>
|
template <size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
bitset<_Size>
|
bitset<_Size>
|
||||||
bitset<_Size>::operator~() const _NOEXCEPT
|
bitset<_Size>::operator~() const _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -877,7 +919,7 @@ bitset<_Size>::operator~() const _NOEXCEPT
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t _Size>
|
template <size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
bitset<_Size>&
|
bitset<_Size>&
|
||||||
bitset<_Size>::flip() _NOEXCEPT
|
bitset<_Size>::flip() _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -901,7 +943,7 @@ bitset<_Size>::flip(size_t __pos)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t _Size>
|
template <size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
unsigned long
|
unsigned long
|
||||||
bitset<_Size>::to_ulong() const
|
bitset<_Size>::to_ulong() const
|
||||||
{
|
{
|
||||||
@@ -909,7 +951,7 @@ bitset<_Size>::to_ulong() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t _Size>
|
template <size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
unsigned long long
|
unsigned long long
|
||||||
bitset<_Size>::to_ullong() const
|
bitset<_Size>::to_ullong() const
|
||||||
{
|
{
|
||||||
@@ -932,7 +974,7 @@ bitset<_Size>::to_string(_CharT __zero, _CharT __one) const
|
|||||||
|
|
||||||
template <size_t _Size>
|
template <size_t _Size>
|
||||||
template <class _CharT, class _Traits>
|
template <class _CharT, class _Traits>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
basic_string<_CharT, _Traits, allocator<_CharT> >
|
basic_string<_CharT, _Traits, allocator<_CharT> >
|
||||||
bitset<_Size>::to_string(_CharT __zero, _CharT __one) const
|
bitset<_Size>::to_string(_CharT __zero, _CharT __one) const
|
||||||
{
|
{
|
||||||
@@ -941,7 +983,7 @@ bitset<_Size>::to_string(_CharT __zero, _CharT __one) const
|
|||||||
|
|
||||||
template <size_t _Size>
|
template <size_t _Size>
|
||||||
template <class _CharT>
|
template <class _CharT>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> >
|
basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> >
|
||||||
bitset<_Size>::to_string(_CharT __zero, _CharT __one) const
|
bitset<_Size>::to_string(_CharT __zero, _CharT __one) const
|
||||||
{
|
{
|
||||||
@@ -949,7 +991,7 @@ bitset<_Size>::to_string(_CharT __zero, _CharT __one) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t _Size>
|
template <size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
basic_string<char, char_traits<char>, allocator<char> >
|
basic_string<char, char_traits<char>, allocator<char> >
|
||||||
bitset<_Size>::to_string(char __zero, char __one) const
|
bitset<_Size>::to_string(char __zero, char __one) const
|
||||||
{
|
{
|
||||||
@@ -957,7 +999,7 @@ bitset<_Size>::to_string(char __zero, char __one) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t _Size>
|
template <size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
size_t
|
size_t
|
||||||
bitset<_Size>::count() const _NOEXCEPT
|
bitset<_Size>::count() const _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -965,7 +1007,7 @@ bitset<_Size>::count() const _NOEXCEPT
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t _Size>
|
template <size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
bool
|
bool
|
||||||
bitset<_Size>::operator==(const bitset& __rhs) const _NOEXCEPT
|
bitset<_Size>::operator==(const bitset& __rhs) const _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -973,7 +1015,7 @@ bitset<_Size>::operator==(const bitset& __rhs) const _NOEXCEPT
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t _Size>
|
template <size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
bool
|
bool
|
||||||
bitset<_Size>::operator!=(const bitset& __rhs) const _NOEXCEPT
|
bitset<_Size>::operator!=(const bitset& __rhs) const _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -994,7 +1036,7 @@ bitset<_Size>::test(size_t __pos) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t _Size>
|
template <size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
bool
|
bool
|
||||||
bitset<_Size>::all() const _NOEXCEPT
|
bitset<_Size>::all() const _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -1002,7 +1044,7 @@ bitset<_Size>::all() const _NOEXCEPT
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t _Size>
|
template <size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
bool
|
bool
|
||||||
bitset<_Size>::any() const _NOEXCEPT
|
bitset<_Size>::any() const _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -1010,7 +1052,7 @@ bitset<_Size>::any() const _NOEXCEPT
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t _Size>
|
template <size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
bitset<_Size>
|
bitset<_Size>
|
||||||
bitset<_Size>::operator<<(size_t __pos) const _NOEXCEPT
|
bitset<_Size>::operator<<(size_t __pos) const _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -1020,7 +1062,7 @@ bitset<_Size>::operator<<(size_t __pos) const _NOEXCEPT
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <size_t _Size>
|
template <size_t _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
bitset<_Size>
|
bitset<_Size>
|
||||||
bitset<_Size>::operator>>(size_t __pos) const _NOEXCEPT
|
bitset<_Size>::operator>>(size_t __pos) const _NOEXCEPT
|
||||||
{
|
{
|
||||||
|
|||||||
102
include/cctype
102
include/cctype
@@ -37,10 +37,6 @@ int toupper(int c);
|
|||||||
|
|
||||||
#include <__config>
|
#include <__config>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#if defined(_LIBCPP_MSVCRT)
|
|
||||||
#include "support/win32/support.h"
|
|
||||||
#include "support/win32/locale_win32.h"
|
|
||||||
#endif // _LIBCPP_MSVCRT
|
|
||||||
|
|
||||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||||
#pragma GCC system_header
|
#pragma GCC system_header
|
||||||
@@ -49,116 +45,76 @@ int toupper(int c);
|
|||||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||||
|
|
||||||
#ifdef isalnum
|
#ifdef isalnum
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_isalnum(int __c) {return isalnum(__c);}
|
|
||||||
#undef isalnum
|
#undef isalnum
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int isalnum(int __c) {return __libcpp_isalnum(__c);}
|
#endif
|
||||||
#else // isalnum
|
|
||||||
using ::isalnum;
|
|
||||||
#endif // isalnum
|
|
||||||
|
|
||||||
#ifdef isalpha
|
#ifdef isalpha
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_isalpha(int __c) {return isalpha(__c);}
|
|
||||||
#undef isalpha
|
#undef isalpha
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int isalpha(int __c) {return __libcpp_isalpha(__c);}
|
#endif
|
||||||
#else // isalpha
|
|
||||||
using ::isalpha;
|
|
||||||
#endif // isalpha
|
|
||||||
|
|
||||||
#ifdef isblank
|
#ifdef isblank
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_isblank(int __c) {return isblank(__c);}
|
|
||||||
#undef isblank
|
#undef isblank
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int isblank(int __c) {return __libcpp_isblank(__c);}
|
#endif
|
||||||
#else // isblank
|
|
||||||
using ::isblank;
|
|
||||||
#endif // isblank
|
|
||||||
|
|
||||||
#ifdef iscntrl
|
#ifdef iscntrl
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_iscntrl(int __c) {return iscntrl(__c);}
|
|
||||||
#undef iscntrl
|
#undef iscntrl
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int iscntrl(int __c) {return __libcpp_iscntrl(__c);}
|
#endif
|
||||||
#else // iscntrl
|
|
||||||
using ::iscntrl;
|
|
||||||
#endif // iscntrl
|
|
||||||
|
|
||||||
#ifdef isdigit
|
#ifdef isdigit
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_isdigit(int __c) {return isdigit(__c);}
|
|
||||||
#undef isdigit
|
#undef isdigit
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int isdigit(int __c) {return __libcpp_isdigit(__c);}
|
#endif
|
||||||
#else // isdigit
|
|
||||||
using ::isdigit;
|
|
||||||
#endif // isdigit
|
|
||||||
|
|
||||||
#ifdef isgraph
|
#ifdef isgraph
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_isgraph(int __c) {return isgraph(__c);}
|
|
||||||
#undef isgraph
|
#undef isgraph
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int isgraph(int __c) {return __libcpp_isgraph(__c);}
|
#endif
|
||||||
#else // isgraph
|
|
||||||
using ::isgraph;
|
|
||||||
#endif // isgraph
|
|
||||||
|
|
||||||
#ifdef islower
|
#ifdef islower
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_islower(int __c) {return islower(__c);}
|
|
||||||
#undef islower
|
#undef islower
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int islower(int __c) {return __libcpp_islower(__c);}
|
#endif
|
||||||
#else // islower
|
|
||||||
using ::islower;
|
|
||||||
#endif // islower
|
|
||||||
|
|
||||||
#ifdef isprint
|
#ifdef isprint
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_isprint(int __c) {return isprint(__c);}
|
|
||||||
#undef isprint
|
#undef isprint
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int isprint(int __c) {return __libcpp_isprint(__c);}
|
#endif
|
||||||
#else // isprint
|
|
||||||
using ::isprint;
|
|
||||||
#endif // isprint
|
|
||||||
|
|
||||||
#ifdef ispunct
|
#ifdef ispunct
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_ispunct(int __c) {return ispunct(__c);}
|
|
||||||
#undef ispunct
|
#undef ispunct
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int ispunct(int __c) {return __libcpp_ispunct(__c);}
|
#endif
|
||||||
#else // ispunct
|
|
||||||
using ::ispunct;
|
|
||||||
#endif // ispunct
|
|
||||||
|
|
||||||
#ifdef isspace
|
#ifdef isspace
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_isspace(int __c) {return isspace(__c);}
|
|
||||||
#undef isspace
|
#undef isspace
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int isspace(int __c) {return __libcpp_isspace(__c);}
|
#endif
|
||||||
#else // isspace
|
|
||||||
using ::isspace;
|
|
||||||
#endif // isspace
|
|
||||||
|
|
||||||
#ifdef isupper
|
#ifdef isupper
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_isupper(int __c) {return isupper(__c);}
|
|
||||||
#undef isupper
|
#undef isupper
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int isupper(int __c) {return __libcpp_isupper(__c);}
|
#endif
|
||||||
#else // isupper
|
|
||||||
using ::isupper;
|
|
||||||
#endif // isupper
|
|
||||||
|
|
||||||
#ifdef isxdigit
|
#ifdef isxdigit
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_isxdigit(int __c) {return isxdigit(__c);}
|
|
||||||
#undef isxdigit
|
#undef isxdigit
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int isxdigit(int __c) {return __libcpp_isxdigit(__c);}
|
#endif
|
||||||
#else // isxdigit
|
|
||||||
using ::isxdigit;
|
|
||||||
#endif // isxdigit
|
|
||||||
|
|
||||||
#ifdef tolower
|
#ifdef tolower
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_tolower(int __c) {return tolower(__c);}
|
|
||||||
#undef tolower
|
#undef tolower
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int tolower(int __c) {return __libcpp_tolower(__c);}
|
#endif
|
||||||
#else // tolower
|
|
||||||
using ::tolower;
|
|
||||||
#endif // tolower
|
|
||||||
|
|
||||||
#ifdef toupper
|
#ifdef toupper
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_toupper(int __c) {return toupper(__c);}
|
|
||||||
#undef toupper
|
#undef toupper
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int toupper(int __c) {return __libcpp_toupper(__c);}
|
#endif
|
||||||
#else // toupper
|
|
||||||
|
|
||||||
|
using ::isalnum;
|
||||||
|
using ::isalpha;
|
||||||
|
using ::isblank;
|
||||||
|
using ::iscntrl;
|
||||||
|
using ::isdigit;
|
||||||
|
using ::isgraph;
|
||||||
|
using ::islower;
|
||||||
|
using ::isprint;
|
||||||
|
using ::ispunct;
|
||||||
|
using ::isspace;
|
||||||
|
using ::isupper;
|
||||||
|
using ::isxdigit;
|
||||||
|
using ::tolower;
|
||||||
using ::toupper;
|
using ::toupper;
|
||||||
#endif // toupper
|
|
||||||
|
|
||||||
_LIBCPP_END_NAMESPACE_STD
|
_LIBCPP_END_NAMESPACE_STD
|
||||||
|
|
||||||
|
|||||||
360
include/cerrno
360
include/cerrno
@@ -30,364 +30,4 @@ Macros:
|
|||||||
#pragma GCC system_header
|
#pragma GCC system_header
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(EOWNERDEAD) || !defined(ENOTRECOVERABLE)
|
|
||||||
|
|
||||||
#ifdef ELAST
|
|
||||||
|
|
||||||
const int __elast1 = ELAST+1;
|
|
||||||
const int __elast2 = ELAST+2;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
const int __elast1 = 104;
|
|
||||||
const int __elast2 = 105;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef ENOTRECOVERABLE
|
|
||||||
|
|
||||||
#define EOWNERDEAD __elast1
|
|
||||||
|
|
||||||
#ifdef ELAST
|
|
||||||
#undef ELAST
|
|
||||||
#define ELAST EOWNERDEAD
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#elif defined(EOWNERDEAD)
|
|
||||||
|
|
||||||
#define ENOTRECOVERABLE __elast1
|
|
||||||
#ifdef ELAST
|
|
||||||
#undef ELAST
|
|
||||||
#define ELAST ENOTRECOVERABLE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else // defined(EOWNERDEAD)
|
|
||||||
|
|
||||||
#define EOWNERDEAD __elast1
|
|
||||||
#define ENOTRECOVERABLE __elast2
|
|
||||||
#ifdef ELAST
|
|
||||||
#undef ELAST
|
|
||||||
#define ELAST ENOTRECOVERABLE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // defined(EOWNERDEAD)
|
|
||||||
|
|
||||||
#endif // !defined(EOWNERDEAD) || !defined(ENOTRECOVERABLE)
|
|
||||||
|
|
||||||
// supply errno values likely to be missing, particularly on Windows
|
|
||||||
|
|
||||||
#ifndef EAFNOSUPPORT
|
|
||||||
#define EAFNOSUPPORT 9901
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EADDRINUSE
|
|
||||||
#define EADDRINUSE 9902
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EADDRNOTAVAIL
|
|
||||||
#define EADDRNOTAVAIL 9903
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EISCONN
|
|
||||||
#define EISCONN 9904
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EBADMSG
|
|
||||||
#define EBADMSG 9905
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ECONNABORTED
|
|
||||||
#define ECONNABORTED 9906
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EALREADY
|
|
||||||
#define EALREADY 9907
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ECONNREFUSED
|
|
||||||
#define ECONNREFUSED 9908
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ECONNRESET
|
|
||||||
#define ECONNRESET 9909
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EDESTADDRREQ
|
|
||||||
#define EDESTADDRREQ 9910
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EHOSTUNREACH
|
|
||||||
#define EHOSTUNREACH 9911
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EIDRM
|
|
||||||
#define EIDRM 9912
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EMSGSIZE
|
|
||||||
#define EMSGSIZE 9913
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ENETDOWN
|
|
||||||
#define ENETDOWN 9914
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ENETRESET
|
|
||||||
#define ENETRESET 9915
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ENETUNREACH
|
|
||||||
#define ENETUNREACH 9916
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ENOBUFS
|
|
||||||
#define ENOBUFS 9917
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ENOLINK
|
|
||||||
#define ENOLINK 9918
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ENODATA
|
|
||||||
#define ENODATA 9919
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ENOMSG
|
|
||||||
#define ENOMSG 9920
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ENOPROTOOPT
|
|
||||||
#define ENOPROTOOPT 9921
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ENOSR
|
|
||||||
#define ENOSR 9922
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ENOTSOCK
|
|
||||||
#define ENOTSOCK 9923
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ENOSTR
|
|
||||||
#define ENOSTR 9924
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ENOTCONN
|
|
||||||
#define ENOTCONN 9925
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ENOTSUP
|
|
||||||
#define ENOTSUP 9926
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ECANCELED
|
|
||||||
#define ECANCELED 9927
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EINPROGRESS
|
|
||||||
#define EINPROGRESS 9928
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EOPNOTSUPP
|
|
||||||
#define EOPNOTSUPP 9929
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EWOULDBLOCK
|
|
||||||
#define EWOULDBLOCK 9930
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EOWNERDEAD
|
|
||||||
#define EOWNERDEAD 9931
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EPROTO
|
|
||||||
#define EPROTO 9932
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EPROTONOSUPPORT
|
|
||||||
#define EPROTONOSUPPORT 9933
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ENOTRECOVERABLE
|
|
||||||
#define ENOTRECOVERABLE 9934
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ETIME
|
|
||||||
#define ETIME 9935
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ETXTBSY
|
|
||||||
#define ETXTBSY 9936
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ETIMEDOUT
|
|
||||||
#define ETIMEDOUT 9938
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ELOOP
|
|
||||||
#define ELOOP 9939
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EOVERFLOW
|
|
||||||
#define EOVERFLOW 9940
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EPROTOTYPE
|
|
||||||
#define EPROTOTYPE 9941
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ENOSYS
|
|
||||||
#define ENOSYS 9942
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EINVAL
|
|
||||||
#define EINVAL 9943
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ERANGE
|
|
||||||
#define ERANGE 9944
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EILSEQ
|
|
||||||
#define EILSEQ 9945
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Windows Mobile doesn't appear to define these:
|
|
||||||
|
|
||||||
#ifndef E2BIG
|
|
||||||
#define E2BIG 9946
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EDOM
|
|
||||||
#define EDOM 9947
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EFAULT
|
|
||||||
#define EFAULT 9948
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EBADF
|
|
||||||
#define EBADF 9949
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EPIPE
|
|
||||||
#define EPIPE 9950
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EXDEV
|
|
||||||
#define EXDEV 9951
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EBUSY
|
|
||||||
#define EBUSY 9952
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ENOTEMPTY
|
|
||||||
#define ENOTEMPTY 9953
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ENOEXEC
|
|
||||||
#define ENOEXEC 9954
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EEXIST
|
|
||||||
#define EEXIST 9955
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EFBIG
|
|
||||||
#define EFBIG 9956
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ENAMETOOLONG
|
|
||||||
#define ENAMETOOLONG 9957
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ENOTTY
|
|
||||||
#define ENOTTY 9958
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EINTR
|
|
||||||
#define EINTR 9959
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ESPIPE
|
|
||||||
#define ESPIPE 9960
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EIO
|
|
||||||
#define EIO 9961
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EISDIR
|
|
||||||
#define EISDIR 9962
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ECHILD
|
|
||||||
#define ECHILD 9963
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ENOLCK
|
|
||||||
#define ENOLCK 9964
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ENOSPC
|
|
||||||
#define ENOSPC 9965
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ENXIO
|
|
||||||
#define ENXIO 9966
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ENODEV
|
|
||||||
#define ENODEV 9967
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ENOENT
|
|
||||||
#define ENOENT 9968
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ESRCH
|
|
||||||
#define ESRCH 9969
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ENOTDIR
|
|
||||||
#define ENOTDIR 9970
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ENOMEM
|
|
||||||
#define ENOMEM 9971
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EPERM
|
|
||||||
#define EPERM 9972
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EACCES
|
|
||||||
#define EACCES 9973
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EROFS
|
|
||||||
#define EROFS 9974
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EDEADLK
|
|
||||||
#define EDEADLK 9975
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EAGAIN
|
|
||||||
#define EAGAIN 9976
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ENFILE
|
|
||||||
#define ENFILE 9977
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EMFILE
|
|
||||||
#define EMFILE 9978
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EMLINK
|
|
||||||
#define EMLINK 9979
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // _LIBCPP_CERRNO
|
#endif // _LIBCPP_CERRNO
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
// -*- C++ -*-
|
// -*- C++ -*-
|
||||||
//===---------------------------- cctype ----------------------------------===//
|
//===---------------------------- cfenv -----------------------------------===//
|
||||||
//
|
//
|
||||||
// The LLVM Compiler Infrastructure
|
// The LLVM Compiler Infrastructure
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -67,12 +67,4 @@ Macros:
|
|||||||
#pragma GCC system_header
|
#pragma GCC system_header
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef FLT_EVAL_METHOD
|
|
||||||
#define FLT_EVAL_METHOD __FLT_EVAL_METHOD__
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef DECIMAL_DIG
|
|
||||||
#define DECIMAL_DIG __DECIMAL_DIG__
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // _LIBCPP_CFLOAT
|
#endif // _LIBCPP_CFLOAT
|
||||||
|
|||||||
131
include/chrono
131
include/chrono
@@ -26,6 +26,9 @@ duration_cast(const duration<Rep, Period>& fd);
|
|||||||
|
|
||||||
template <class Rep> struct treat_as_floating_point : is_floating_point<Rep> {};
|
template <class Rep> struct treat_as_floating_point : is_floating_point<Rep> {};
|
||||||
|
|
||||||
|
template <class Rep> constexpr bool treat_as_floating_point_v
|
||||||
|
= treat_as_floating_point<Rep>::value; // C++17
|
||||||
|
|
||||||
template <class Rep>
|
template <class Rep>
|
||||||
struct duration_values
|
struct duration_values
|
||||||
{
|
{
|
||||||
@@ -194,6 +197,13 @@ template <class Rep1, class Period1, class Rep2, class Period2>
|
|||||||
template <class ToDuration, class Rep, class Period>
|
template <class ToDuration, class Rep, class Period>
|
||||||
ToDuration duration_cast(const duration<Rep, Period>& d);
|
ToDuration duration_cast(const duration<Rep, Period>& d);
|
||||||
|
|
||||||
|
template <class ToDuration, class Rep, class Period>
|
||||||
|
constexpr ToDuration floor(const duration<Rep, Period>& d); // C++17
|
||||||
|
template <class ToDuration, class Rep, class Period>
|
||||||
|
constexpr ToDuration ceil(const duration<Rep, Period>& d); // C++17
|
||||||
|
template <class ToDuration, class Rep, class Period>
|
||||||
|
constexpr ToDuration round(const duration<Rep, Period>& d); // C++17
|
||||||
|
|
||||||
// time_point arithmetic (all constexpr in C++14)
|
// time_point arithmetic (all constexpr in C++14)
|
||||||
template <class Clock, class Duration1, class Rep2, class Period2>
|
template <class Clock, class Duration1, class Rep2, class Period2>
|
||||||
time_point<Clock, typename common_type<Duration1, duration<Rep2, Period2>>::type>
|
time_point<Clock, typename common_type<Duration1, duration<Rep2, Period2>>::type>
|
||||||
@@ -227,6 +237,20 @@ template <class Clock, class Duration1, class Duration2>
|
|||||||
template <class ToDuration, class Clock, class Duration>
|
template <class ToDuration, class Clock, class Duration>
|
||||||
time_point<Clock, ToDuration> time_point_cast(const time_point<Clock, Duration>& t);
|
time_point<Clock, ToDuration> time_point_cast(const time_point<Clock, Duration>& t);
|
||||||
|
|
||||||
|
template <class ToDuration, class Clock, class Duration>
|
||||||
|
constexpr time_point<Clock, ToDuration>
|
||||||
|
floor(const time_point<Clock, Duration>& tp); // C++17
|
||||||
|
|
||||||
|
template <class ToDuration, class Clock, class Duration>
|
||||||
|
constexpr time_point<Clock, ToDuration>
|
||||||
|
ceil(const time_point<Clock, Duration>& tp); // C++17
|
||||||
|
|
||||||
|
template <class ToDuration, class Clock, class Duration>
|
||||||
|
constexpr time_point<Clock, ToDuration>
|
||||||
|
round(const time_point<Clock, Duration>& tp); // C++17
|
||||||
|
|
||||||
|
template <class Rep, class Period>
|
||||||
|
constexpr duration<Rep, Period> abs(duration<Rep, Period> d); // C++17
|
||||||
// Clocks
|
// Clocks
|
||||||
|
|
||||||
class system_clock
|
class system_clock
|
||||||
@@ -392,6 +416,11 @@ duration_cast(const duration<_Rep, _Period>& __fd)
|
|||||||
template <class _Rep>
|
template <class _Rep>
|
||||||
struct _LIBCPP_TYPE_VIS_ONLY treat_as_floating_point : is_floating_point<_Rep> {};
|
struct _LIBCPP_TYPE_VIS_ONLY treat_as_floating_point : is_floating_point<_Rep> {};
|
||||||
|
|
||||||
|
#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
|
||||||
|
template <class _Rep> _LIBCPP_CONSTEXPR bool treat_as_floating_point_v
|
||||||
|
= treat_as_floating_point<_Rep>::value;
|
||||||
|
#endif
|
||||||
|
|
||||||
template <class _Rep>
|
template <class _Rep>
|
||||||
struct _LIBCPP_TYPE_VIS_ONLY duration_values
|
struct _LIBCPP_TYPE_VIS_ONLY duration_values
|
||||||
{
|
{
|
||||||
@@ -401,6 +430,58 @@ public:
|
|||||||
_LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR _Rep min() {return numeric_limits<_Rep>::lowest();}
|
_LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR _Rep min() {return numeric_limits<_Rep>::lowest();}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if _LIBCPP_STD_VER > 14
|
||||||
|
template <class _ToDuration, class _Rep, class _Period>
|
||||||
|
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||||
|
typename enable_if
|
||||||
|
<
|
||||||
|
__is_duration<_ToDuration>::value,
|
||||||
|
_ToDuration
|
||||||
|
>::type
|
||||||
|
floor(const duration<_Rep, _Period>& __d)
|
||||||
|
{
|
||||||
|
_ToDuration __t = duration_cast<_ToDuration>(__d);
|
||||||
|
if (__t > __d)
|
||||||
|
__t = __t - _ToDuration{1};
|
||||||
|
return __t;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _ToDuration, class _Rep, class _Period>
|
||||||
|
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||||
|
typename enable_if
|
||||||
|
<
|
||||||
|
__is_duration<_ToDuration>::value,
|
||||||
|
_ToDuration
|
||||||
|
>::type
|
||||||
|
ceil(const duration<_Rep, _Period>& __d)
|
||||||
|
{
|
||||||
|
_ToDuration __t = duration_cast<_ToDuration>(__d);
|
||||||
|
if (__t < __d)
|
||||||
|
__t = __t + _ToDuration{1};
|
||||||
|
return __t;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _ToDuration, class _Rep, class _Period>
|
||||||
|
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||||
|
typename enable_if
|
||||||
|
<
|
||||||
|
__is_duration<_ToDuration>::value,
|
||||||
|
_ToDuration
|
||||||
|
>::type
|
||||||
|
round(const duration<_Rep, _Period>& __d)
|
||||||
|
{
|
||||||
|
_ToDuration __lower = floor<_ToDuration>(__d);
|
||||||
|
_ToDuration __upper = __lower + _ToDuration{1};
|
||||||
|
auto __lowerDiff = __d - __lower;
|
||||||
|
auto __upperDiff = __upper - __d;
|
||||||
|
if (__lowerDiff < __upperDiff)
|
||||||
|
return __lower;
|
||||||
|
if (__lowerDiff > __upperDiff)
|
||||||
|
return __upper;
|
||||||
|
return __lower.count() & 1 ? __upper : __lower;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// duration
|
// duration
|
||||||
|
|
||||||
template <class _Rep, class _Period>
|
template <class _Rep, class _Period>
|
||||||
@@ -807,6 +888,56 @@ time_point_cast(const time_point<_Clock, _Duration>& __t)
|
|||||||
return time_point<_Clock, _ToDuration>(_VSTD::chrono::duration_cast<_ToDuration>(__t.time_since_epoch()));
|
return time_point<_Clock, _ToDuration>(_VSTD::chrono::duration_cast<_ToDuration>(__t.time_since_epoch()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if _LIBCPP_STD_VER > 14
|
||||||
|
template <class _ToDuration, class _Clock, class _Duration>
|
||||||
|
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||||
|
typename enable_if
|
||||||
|
<
|
||||||
|
__is_duration<_ToDuration>::value,
|
||||||
|
time_point<_Clock, _ToDuration>
|
||||||
|
>::type
|
||||||
|
floor(const time_point<_Clock, _Duration>& __t)
|
||||||
|
{
|
||||||
|
return time_point<_Clock, _ToDuration>{floor<_ToDuration>(__t.time_since_epoch())};
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _ToDuration, class _Clock, class _Duration>
|
||||||
|
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||||
|
typename enable_if
|
||||||
|
<
|
||||||
|
__is_duration<_ToDuration>::value,
|
||||||
|
time_point<_Clock, _ToDuration>
|
||||||
|
>::type
|
||||||
|
ceil(const time_point<_Clock, _Duration>& __t)
|
||||||
|
{
|
||||||
|
return time_point<_Clock, _ToDuration>{ceil<_ToDuration>(__t.time_since_epoch())};
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _ToDuration, class _Clock, class _Duration>
|
||||||
|
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||||
|
typename enable_if
|
||||||
|
<
|
||||||
|
__is_duration<_ToDuration>::value,
|
||||||
|
time_point<_Clock, _ToDuration>
|
||||||
|
>::type
|
||||||
|
round(const time_point<_Clock, _Duration>& __t)
|
||||||
|
{
|
||||||
|
return time_point<_Clock, _ToDuration>{round<_ToDuration>(__t.time_since_epoch())};
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _Rep, class _Period>
|
||||||
|
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||||
|
typename enable_if
|
||||||
|
<
|
||||||
|
numeric_limits<_Rep>::is_signed,
|
||||||
|
duration<_Rep, _Period>
|
||||||
|
>::type
|
||||||
|
abs(duration<_Rep, _Period> __d)
|
||||||
|
{
|
||||||
|
return __d >= __d.zero() ? __d : -__d;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// time_point ==
|
// time_point ==
|
||||||
|
|
||||||
template <class _Clock, class _Duration1, class _Duration2>
|
template <class _Clock, class _Duration1, class _Duration2>
|
||||||
|
|||||||
@@ -246,10 +246,7 @@ uintmax_t wcstoumax(const wchar_t* restrict nptr, wchar_t** restrict endptr, int
|
|||||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||||
|
|
||||||
using::imaxdiv_t;
|
using::imaxdiv_t;
|
||||||
|
|
||||||
#undef imaxabs
|
|
||||||
using::imaxabs;
|
using::imaxabs;
|
||||||
#undef imaxdiv
|
|
||||||
using::imaxdiv;
|
using::imaxdiv;
|
||||||
using::strtoimax;
|
using::strtoimax;
|
||||||
using::strtoumax;
|
using::strtoumax;
|
||||||
|
|||||||
1196
include/cmath
1196
include/cmath
File diff suppressed because it is too large
Load Diff
@@ -332,7 +332,9 @@ public:
|
|||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(float __re = 0.0f, float __im = 0.0f)
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(float __re = 0.0f, float __im = 0.0f)
|
||||||
: __re_(__re), __im_(__im) {}
|
: __re_(__re), __im_(__im) {}
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
explicit _LIBCPP_CONSTEXPR complex(const complex<double>& __c);
|
explicit _LIBCPP_CONSTEXPR complex(const complex<double>& __c);
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
explicit _LIBCPP_CONSTEXPR complex(const complex<long double>& __c);
|
explicit _LIBCPP_CONSTEXPR complex(const complex<long double>& __c);
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR float real() const {return __re_;}
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR float real() const {return __re_;}
|
||||||
@@ -388,7 +390,9 @@ public:
|
|||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(double __re = 0.0, double __im = 0.0)
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(double __re = 0.0, double __im = 0.0)
|
||||||
: __re_(__re), __im_(__im) {}
|
: __re_(__re), __im_(__im) {}
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
_LIBCPP_CONSTEXPR complex(const complex<float>& __c);
|
_LIBCPP_CONSTEXPR complex(const complex<float>& __c);
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
explicit _LIBCPP_CONSTEXPR complex(const complex<long double>& __c);
|
explicit _LIBCPP_CONSTEXPR complex(const complex<long double>& __c);
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR double real() const {return __re_;}
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR double real() const {return __re_;}
|
||||||
@@ -444,7 +448,9 @@ public:
|
|||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(long double __re = 0.0L, long double __im = 0.0L)
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(long double __re = 0.0L, long double __im = 0.0L)
|
||||||
: __re_(__re), __im_(__im) {}
|
: __re_(__re), __im_(__im) {}
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
_LIBCPP_CONSTEXPR complex(const complex<float>& __c);
|
_LIBCPP_CONSTEXPR complex(const complex<float>& __c);
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
_LIBCPP_CONSTEXPR complex(const complex<double>& __c);
|
_LIBCPP_CONSTEXPR complex(const complex<double>& __c);
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR long double real() const {return __re_;}
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR long double real() const {return __re_;}
|
||||||
@@ -490,32 +496,32 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
_LIBCPP_CONSTEXPR
|
_LIBCPP_CONSTEXPR
|
||||||
complex<float>::complex(const complex<double>& __c)
|
complex<float>::complex(const complex<double>& __c)
|
||||||
: __re_(__c.real()), __im_(__c.imag()) {}
|
: __re_(__c.real()), __im_(__c.imag()) {}
|
||||||
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
_LIBCPP_CONSTEXPR
|
_LIBCPP_CONSTEXPR
|
||||||
complex<float>::complex(const complex<long double>& __c)
|
complex<float>::complex(const complex<long double>& __c)
|
||||||
: __re_(__c.real()), __im_(__c.imag()) {}
|
: __re_(__c.real()), __im_(__c.imag()) {}
|
||||||
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
_LIBCPP_CONSTEXPR
|
_LIBCPP_CONSTEXPR
|
||||||
complex<double>::complex(const complex<float>& __c)
|
complex<double>::complex(const complex<float>& __c)
|
||||||
: __re_(__c.real()), __im_(__c.imag()) {}
|
: __re_(__c.real()), __im_(__c.imag()) {}
|
||||||
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
_LIBCPP_CONSTEXPR
|
_LIBCPP_CONSTEXPR
|
||||||
complex<double>::complex(const complex<long double>& __c)
|
complex<double>::complex(const complex<long double>& __c)
|
||||||
: __re_(__c.real()), __im_(__c.imag()) {}
|
: __re_(__c.real()), __im_(__c.imag()) {}
|
||||||
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
_LIBCPP_CONSTEXPR
|
_LIBCPP_CONSTEXPR
|
||||||
complex<long double>::complex(const complex<float>& __c)
|
complex<long double>::complex(const complex<float>& __c)
|
||||||
: __re_(__c.real()), __im_(__c.imag()) {}
|
: __re_(__c.real()), __im_(__c.imag()) {}
|
||||||
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
_LIBCPP_CONSTEXPR
|
_LIBCPP_CONSTEXPR
|
||||||
complex<long double>::complex(const complex<double>& __c)
|
complex<long double>::complex(const complex<double>& __c)
|
||||||
: __re_(__c.real()), __im_(__c.imag()) {}
|
: __re_(__c.real()), __im_(__c.imag()) {}
|
||||||
@@ -1399,7 +1405,7 @@ acos(const complex<_Tp>& __x)
|
|||||||
}
|
}
|
||||||
if (isinf(__x.imag()))
|
if (isinf(__x.imag()))
|
||||||
return complex<_Tp>(__pi/_Tp(2), -__x.imag());
|
return complex<_Tp>(__pi/_Tp(2), -__x.imag());
|
||||||
if (__x.real() == 0)
|
if (__x.real() == 0 && (__x.imag() == 0 || isnan(__x.imag())))
|
||||||
return complex<_Tp>(__pi/_Tp(2), -__x.imag());
|
return complex<_Tp>(__pi/_Tp(2), -__x.imag());
|
||||||
complex<_Tp> __z = log(__x + sqrt(pow(__x, _Tp(2)) - _Tp(1)));
|
complex<_Tp> __z = log(__x + sqrt(pow(__x, _Tp(2)) - _Tp(1)));
|
||||||
if (signbit(__x.imag()))
|
if (signbit(__x.imag()))
|
||||||
|
|||||||
@@ -18,6 +18,12 @@
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <__config>
|
||||||
|
|
||||||
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||||
|
#pragma GCC system_header
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
||||||
#include <ccomplex>
|
#include <ccomplex>
|
||||||
@@ -28,8 +34,4 @@
|
|||||||
|
|
||||||
#endif // __cplusplus
|
#endif // __cplusplus
|
||||||
|
|
||||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
|
||||||
#pragma GCC system_header
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // _LIBCPP_COMPLEX_H
|
#endif // _LIBCPP_COMPLEX_H
|
||||||
|
|||||||
@@ -124,14 +124,18 @@ class _LIBCPP_TYPE_VIS condition_variable_any
|
|||||||
condition_variable __cv_;
|
condition_variable __cv_;
|
||||||
shared_ptr<mutex> __mut_;
|
shared_ptr<mutex> __mut_;
|
||||||
public:
|
public:
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
condition_variable_any();
|
condition_variable_any();
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void notify_one() _NOEXCEPT;
|
void notify_one() _NOEXCEPT;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void notify_all() _NOEXCEPT;
|
void notify_all() _NOEXCEPT;
|
||||||
|
|
||||||
template <class _Lock>
|
template <class _Lock>
|
||||||
void wait(_Lock& __lock);
|
void wait(_Lock& __lock);
|
||||||
template <class _Lock, class _Predicate>
|
template <class _Lock, class _Predicate>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void wait(_Lock& __lock, _Predicate __pred);
|
void wait(_Lock& __lock, _Predicate __pred);
|
||||||
|
|
||||||
template <class _Lock, class _Clock, class _Duration>
|
template <class _Lock, class _Clock, class _Duration>
|
||||||
@@ -141,27 +145,30 @@ public:
|
|||||||
|
|
||||||
template <class _Lock, class _Clock, class _Duration, class _Predicate>
|
template <class _Lock, class _Clock, class _Duration, class _Predicate>
|
||||||
bool
|
bool
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
wait_until(_Lock& __lock,
|
wait_until(_Lock& __lock,
|
||||||
const chrono::time_point<_Clock, _Duration>& __t,
|
const chrono::time_point<_Clock, _Duration>& __t,
|
||||||
_Predicate __pred);
|
_Predicate __pred);
|
||||||
|
|
||||||
template <class _Lock, class _Rep, class _Period>
|
template <class _Lock, class _Rep, class _Period>
|
||||||
cv_status
|
cv_status
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
wait_for(_Lock& __lock,
|
wait_for(_Lock& __lock,
|
||||||
const chrono::duration<_Rep, _Period>& __d);
|
const chrono::duration<_Rep, _Period>& __d);
|
||||||
|
|
||||||
template <class _Lock, class _Rep, class _Period, class _Predicate>
|
template <class _Lock, class _Rep, class _Period, class _Predicate>
|
||||||
bool
|
bool
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
wait_for(_Lock& __lock,
|
wait_for(_Lock& __lock,
|
||||||
const chrono::duration<_Rep, _Period>& __d,
|
const chrono::duration<_Rep, _Period>& __d,
|
||||||
_Predicate __pred);
|
_Predicate __pred);
|
||||||
};
|
};
|
||||||
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
condition_variable_any::condition_variable_any()
|
condition_variable_any::condition_variable_any()
|
||||||
: __mut_(make_shared<mutex>()) {}
|
: __mut_(make_shared<mutex>()) {}
|
||||||
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
condition_variable_any::notify_one() _NOEXCEPT
|
condition_variable_any::notify_one() _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -169,7 +176,7 @@ condition_variable_any::notify_one() _NOEXCEPT
|
|||||||
__cv_.notify_one();
|
__cv_.notify_one();
|
||||||
}
|
}
|
||||||
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
condition_variable_any::notify_all() _NOEXCEPT
|
condition_variable_any::notify_all() _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -196,7 +203,7 @@ condition_variable_any::wait(_Lock& __lock)
|
|||||||
} // __mut_.unlock(), __lock.lock()
|
} // __mut_.unlock(), __lock.lock()
|
||||||
|
|
||||||
template <class _Lock, class _Predicate>
|
template <class _Lock, class _Predicate>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
condition_variable_any::wait(_Lock& __lock, _Predicate __pred)
|
condition_variable_any::wait(_Lock& __lock, _Predicate __pred)
|
||||||
{
|
{
|
||||||
@@ -218,7 +225,7 @@ condition_variable_any::wait_until(_Lock& __lock,
|
|||||||
} // __mut_.unlock(), __lock.lock()
|
} // __mut_.unlock(), __lock.lock()
|
||||||
|
|
||||||
template <class _Lock, class _Clock, class _Duration, class _Predicate>
|
template <class _Lock, class _Clock, class _Duration, class _Predicate>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
bool
|
bool
|
||||||
condition_variable_any::wait_until(_Lock& __lock,
|
condition_variable_any::wait_until(_Lock& __lock,
|
||||||
const chrono::time_point<_Clock, _Duration>& __t,
|
const chrono::time_point<_Clock, _Duration>& __t,
|
||||||
@@ -231,7 +238,7 @@ condition_variable_any::wait_until(_Lock& __lock,
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Lock, class _Rep, class _Period>
|
template <class _Lock, class _Rep, class _Period>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
cv_status
|
cv_status
|
||||||
condition_variable_any::wait_for(_Lock& __lock,
|
condition_variable_any::wait_for(_Lock& __lock,
|
||||||
const chrono::duration<_Rep, _Period>& __d)
|
const chrono::duration<_Rep, _Period>& __d)
|
||||||
@@ -240,7 +247,7 @@ condition_variable_any::wait_for(_Lock& __lock,
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Lock, class _Rep, class _Period, class _Predicate>
|
template <class _Lock, class _Rep, class _Period, class _Predicate>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
bool
|
bool
|
||||||
condition_variable_any::wait_for(_Lock& __lock,
|
condition_variable_any::wait_for(_Lock& __lock,
|
||||||
const chrono::duration<_Rep, _Period>& __d,
|
const chrono::duration<_Rep, _Period>& __d,
|
||||||
|
|||||||
@@ -38,10 +38,6 @@ void longjmp(jmp_buf env, int val);
|
|||||||
#pragma GCC system_header
|
#pragma GCC system_header
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef setjmp
|
|
||||||
#define setjmp(env) setjmp(env)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||||
|
|
||||||
using ::jmp_buf;
|
using ::jmp_buf;
|
||||||
|
|||||||
@@ -35,12 +35,14 @@ Types:
|
|||||||
|
|
||||||
#include <__config>
|
#include <__config>
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||||
#pragma GCC system_header
|
#pragma GCC system_header
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Don't include our own <stddef.h>; we don't want to declare ::nullptr_t.
|
||||||
|
#include_next <stddef.h>
|
||||||
|
#include <__nullptr>
|
||||||
|
|
||||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||||
|
|
||||||
using ::ptrdiff_t;
|
using ::ptrdiff_t;
|
||||||
@@ -53,50 +55,6 @@ using ::max_align_t;
|
|||||||
typedef long double max_align_t;
|
typedef long double max_align_t;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef _LIBCPP_HAS_NO_NULLPTR
|
|
||||||
|
|
||||||
struct _LIBCPP_TYPE_VIS_ONLY nullptr_t
|
|
||||||
{
|
|
||||||
void* __lx;
|
|
||||||
|
|
||||||
struct __nat {int __for_bool_;};
|
|
||||||
|
|
||||||
_LIBCPP_ALWAYS_INLINE _LIBCPP_CONSTEXPR nullptr_t() : __lx(0) {}
|
|
||||||
_LIBCPP_ALWAYS_INLINE _LIBCPP_CONSTEXPR nullptr_t(int __nat::*) : __lx(0) {}
|
|
||||||
|
|
||||||
_LIBCPP_ALWAYS_INLINE _LIBCPP_CONSTEXPR operator int __nat::*() const {return 0;}
|
|
||||||
|
|
||||||
template <class _Tp>
|
|
||||||
_LIBCPP_ALWAYS_INLINE _LIBCPP_CONSTEXPR
|
|
||||||
operator _Tp* () const {return 0;}
|
|
||||||
|
|
||||||
template <class _Tp, class _Up>
|
|
||||||
_LIBCPP_ALWAYS_INLINE
|
|
||||||
operator _Tp _Up::* () const {return 0;}
|
|
||||||
|
|
||||||
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);}
|
|
||||||
|
|
||||||
#define nullptr _VSTD::__get_nullptr_t()
|
|
||||||
|
|
||||||
#endif // _LIBCPP_HAS_NO_NULLPTR
|
|
||||||
|
|
||||||
_LIBCPP_END_NAMESPACE_STD
|
_LIBCPP_END_NAMESPACE_STD
|
||||||
|
|
||||||
#ifndef _LIBCPP_HAS_NO_NULLPTR
|
|
||||||
|
|
||||||
namespace std
|
|
||||||
{
|
|
||||||
typedef decltype(nullptr) nullptr_t;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // _LIBCPP_HAS_NO_NULLPTR
|
|
||||||
|
|
||||||
#endif // _LIBCPP_CSTDDEF
|
#endif // _LIBCPP_CSTDDEF
|
||||||
|
|||||||
@@ -103,41 +103,6 @@ void perror(const char* s);
|
|||||||
#pragma GCC system_header
|
#pragma GCC system_header
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// snprintf
|
|
||||||
#if defined(_LIBCPP_MSVCRT)
|
|
||||||
#include "support/win32/support.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef getc
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_getc(FILE* __stream) {return getc(__stream);}
|
|
||||||
#undef getc
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int getc(FILE* __stream) {return __libcpp_getc(__stream);}
|
|
||||||
#endif // getc
|
|
||||||
|
|
||||||
#ifdef putc
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_putc(int __c, FILE* __stream) {return putc(__c, __stream);}
|
|
||||||
#undef putc
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int putc(int __c, FILE* __stream) {return __libcpp_putc(__c, __stream);}
|
|
||||||
#endif // putc
|
|
||||||
|
|
||||||
#ifdef clearerr
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY void __libcpp_clearerr(FILE* __stream) { return clearerr(__stream); }
|
|
||||||
#undef clearerr
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY void clearerr(FILE* __stream) { return __libcpp_clearerr(__stream); }
|
|
||||||
#endif // clearerr
|
|
||||||
|
|
||||||
#ifdef feof
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_feof(FILE* __stream) { return feof(__stream); }
|
|
||||||
#undef feof
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int feof(FILE* __stream) { return __libcpp_feof(__stream); }
|
|
||||||
#endif // feof
|
|
||||||
|
|
||||||
#ifdef ferror
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_ferror(FILE* __stream) { return ferror(__stream); }
|
|
||||||
#undef ferror
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int ferror(FILE* __stream) { return __libcpp_ferror(__stream); }
|
|
||||||
#endif // ferror
|
|
||||||
|
|
||||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||||
|
|
||||||
using ::FILE;
|
using ::FILE;
|
||||||
|
|||||||
@@ -84,9 +84,6 @@ void *aligned_alloc(size_t alignment, size_t size); // C11
|
|||||||
|
|
||||||
#include <__config>
|
#include <__config>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#ifdef _LIBCPP_MSVCRT
|
|
||||||
#include "support/win32/locale_win32.h"
|
|
||||||
#endif // _LIBCPP_MSVCRT
|
|
||||||
|
|
||||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||||
#pragma GCC system_header
|
#pragma GCC system_header
|
||||||
@@ -131,20 +128,14 @@ using ::getenv;
|
|||||||
using ::system;
|
using ::system;
|
||||||
using ::bsearch;
|
using ::bsearch;
|
||||||
using ::qsort;
|
using ::qsort;
|
||||||
#undef abs
|
|
||||||
using ::abs;
|
using ::abs;
|
||||||
#undef labs
|
|
||||||
using ::labs;
|
using ::labs;
|
||||||
#ifndef _LIBCPP_HAS_NO_LONG_LONG
|
#ifndef _LIBCPP_HAS_NO_LONG_LONG
|
||||||
#undef llabs
|
|
||||||
using ::llabs;
|
using ::llabs;
|
||||||
#endif // _LIBCPP_HAS_NO_LONG_LONG
|
#endif // _LIBCPP_HAS_NO_LONG_LONG
|
||||||
#undef div
|
|
||||||
using ::div;
|
using ::div;
|
||||||
#undef ldiv
|
|
||||||
using ::ldiv;
|
using ::ldiv;
|
||||||
#ifndef _LIBCPP_HAS_NO_LONG_LONG
|
#ifndef _LIBCPP_HAS_NO_LONG_LONG
|
||||||
#undef lldiv
|
|
||||||
using ::lldiv;
|
using ::lldiv;
|
||||||
#endif // _LIBCPP_HAS_NO_LONG_LONG
|
#endif // _LIBCPP_HAS_NO_LONG_LONG
|
||||||
#ifndef _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS
|
#ifndef _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS
|
||||||
@@ -162,19 +153,6 @@ using ::quick_exit;
|
|||||||
using ::aligned_alloc;
|
using ::aligned_alloc;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// MSVCRT already has the correct prototype in <stdlib.h> #ifdef __cplusplus
|
|
||||||
#if !defined(_LIBCPP_MSVCRT) && !defined(__sun__) && !defined(_AIX)
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY long abs( long __x) _NOEXCEPT {return labs(__x);}
|
|
||||||
#ifndef _LIBCPP_HAS_NO_LONG_LONG
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY long long abs(long long __x) _NOEXCEPT {return llabs(__x);}
|
|
||||||
#endif // _LIBCPP_HAS_NO_LONG_LONG
|
|
||||||
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY ldiv_t div( long __x, long __y) _NOEXCEPT {return ldiv(__x, __y);}
|
|
||||||
#ifndef _LIBCPP_HAS_NO_LONG_LONG
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY lldiv_t div(long long __x, long long __y) _NOEXCEPT {return lldiv(__x, __y);}
|
|
||||||
#endif // _LIBCPP_HAS_NO_LONG_LONG
|
|
||||||
#endif // _LIBCPP_MSVCRT
|
|
||||||
|
|
||||||
_LIBCPP_END_NAMESPACE_STD
|
_LIBCPP_END_NAMESPACE_STD
|
||||||
|
|
||||||
#endif // _LIBCPP_CSTDLIB
|
#endif // _LIBCPP_CSTDLIB
|
||||||
|
|||||||
@@ -78,30 +78,13 @@ using ::strcmp;
|
|||||||
using ::strncmp;
|
using ::strncmp;
|
||||||
using ::strcoll;
|
using ::strcoll;
|
||||||
using ::strxfrm;
|
using ::strxfrm;
|
||||||
|
|
||||||
using ::memchr;
|
using ::memchr;
|
||||||
|
|
||||||
using ::strchr;
|
using ::strchr;
|
||||||
|
|
||||||
using ::strcspn;
|
using ::strcspn;
|
||||||
|
|
||||||
using ::strpbrk;
|
using ::strpbrk;
|
||||||
|
|
||||||
using ::strrchr;
|
using ::strrchr;
|
||||||
|
|
||||||
using ::strspn;
|
using ::strspn;
|
||||||
|
|
||||||
using ::strstr;
|
using ::strstr;
|
||||||
|
|
||||||
// MSVCRT, GNU libc and its derivates already have the correct prototype in <string.h> #ifdef __cplusplus
|
|
||||||
#if !defined(__GLIBC__) && !defined(_LIBCPP_MSVCRT) && !defined(__sun__) && !defined(_STRING_H_CPLUSPLUS_98_CONFORMANCE_)
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY char* strchr( char* __s, int __c) {return ::strchr(__s, __c);}
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY char* strpbrk( char* __s1, const char* __s2) {return ::strpbrk(__s1, __s2);}
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY char* strrchr( char* __s, int __c) {return ::strrchr(__s, __c);}
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY void* memchr( void* __s, int __c, size_t __n) {return ::memchr(__s, __c, __n);}
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY char* strstr( char* __s1, const char* __s2) {return ::strstr(__s1, __s2);}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS
|
#ifndef _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS
|
||||||
using ::strtok;
|
using ::strtok;
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
69
include/ctype.h
Normal file
69
include/ctype.h
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
//===---------------------------- ctype.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_CTYPE_H
|
||||||
|
#define _LIBCPP_CTYPE_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
ctype.h synopsis
|
||||||
|
|
||||||
|
int isalnum(int c);
|
||||||
|
int isalpha(int c);
|
||||||
|
int isblank(int c); // C99
|
||||||
|
int iscntrl(int c);
|
||||||
|
int isdigit(int c);
|
||||||
|
int isgraph(int c);
|
||||||
|
int islower(int c);
|
||||||
|
int isprint(int c);
|
||||||
|
int ispunct(int c);
|
||||||
|
int isspace(int c);
|
||||||
|
int isupper(int c);
|
||||||
|
int isxdigit(int c);
|
||||||
|
int tolower(int c);
|
||||||
|
int toupper(int c);
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <__config>
|
||||||
|
|
||||||
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||||
|
#pragma GCC system_header
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include_next <ctype.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
|
||||||
|
#if defined(_LIBCPP_MSVCRT)
|
||||||
|
// We support including .h headers inside 'extern "C"' contexts, so switch
|
||||||
|
// back to C++ linkage before including these C++ headers.
|
||||||
|
extern "C++" {
|
||||||
|
#include "support/win32/support.h"
|
||||||
|
#include "support/win32/locale_win32.h"
|
||||||
|
}
|
||||||
|
#endif // _LIBCPP_MSVCRT
|
||||||
|
|
||||||
|
#undef isalnum
|
||||||
|
#undef isalpha
|
||||||
|
#undef isblank
|
||||||
|
#undef iscntrl
|
||||||
|
#undef isdigit
|
||||||
|
#undef isgraph
|
||||||
|
#undef islower
|
||||||
|
#undef isprint
|
||||||
|
#undef ispunct
|
||||||
|
#undef isspace
|
||||||
|
#undef isupper
|
||||||
|
#undef isxdigit
|
||||||
|
#undef tolower
|
||||||
|
#undef toupper
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // _LIBCPP_CTYPE_H
|
||||||
@@ -106,9 +106,6 @@ size_t wcsrtombs(char* restrict dst, const wchar_t** restrict src, size_t len,
|
|||||||
#include <__config>
|
#include <__config>
|
||||||
#include <cwctype>
|
#include <cwctype>
|
||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
#if defined(_LIBCPP_MSVCRT) || defined(__MINGW32__)
|
|
||||||
#include <support/win32/support.h> // pull in *swprintf defines
|
|
||||||
#endif // _LIBCPP_MSVCRT
|
|
||||||
|
|
||||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||||
#pragma GCC system_header
|
#pragma GCC system_header
|
||||||
@@ -160,34 +157,11 @@ using ::wcscmp;
|
|||||||
using ::wcscoll;
|
using ::wcscoll;
|
||||||
using ::wcsncmp;
|
using ::wcsncmp;
|
||||||
using ::wcsxfrm;
|
using ::wcsxfrm;
|
||||||
|
|
||||||
#if defined(_WCHAR_H_CPLUSPLUS_98_CONFORMANCE_)
|
|
||||||
|
|
||||||
using ::wcschr;
|
using ::wcschr;
|
||||||
using ::wcspbrk;
|
using ::wcspbrk;
|
||||||
using ::wcsrchr;
|
using ::wcsrchr;
|
||||||
using ::wcsstr;
|
using ::wcsstr;
|
||||||
using ::wmemchr;
|
using ::wmemchr;
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY const wchar_t* wcschr(const wchar_t* __s, wchar_t __c) {return ::wcschr(__s, __c);}
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY wchar_t* wcschr( wchar_t* __s, wchar_t __c) {return ::wcschr(__s, __c);}
|
|
||||||
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY const wchar_t* wcspbrk(const wchar_t* __s1, const wchar_t* __s2) {return ::wcspbrk(__s1, __s2);}
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY wchar_t* wcspbrk( wchar_t* __s1, const wchar_t* __s2) {return ::wcspbrk(__s1, __s2);}
|
|
||||||
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY const wchar_t* wcsrchr(const wchar_t* __s, wchar_t __c) {return ::wcsrchr(__s, __c);}
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY wchar_t* wcsrchr( wchar_t* __s, wchar_t __c) {return ::wcsrchr(__s, __c);}
|
|
||||||
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY const wchar_t* wcsstr(const wchar_t* __s1, const wchar_t* __s2) {return ::wcsstr(__s1, __s2);}
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY wchar_t* wcsstr( wchar_t* __s1, const wchar_t* __s2) {return ::wcsstr(__s1, __s2);}
|
|
||||||
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY const wchar_t* wmemchr(const wchar_t* __s, wchar_t __c, size_t __n) {return ::wmemchr(__s, __c, __n);}
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY wchar_t* wmemchr( wchar_t* __s, wchar_t __c, size_t __n) {return ::wmemchr(__s, __c, __n);}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
using ::wcscspn;
|
using ::wcscspn;
|
||||||
using ::wcslen;
|
using ::wcslen;
|
||||||
using ::wcsspn;
|
using ::wcsspn;
|
||||||
|
|||||||
126
include/cwctype
126
include/cwctype
@@ -63,150 +63,24 @@ _LIBCPP_BEGIN_NAMESPACE_STD
|
|||||||
using ::wint_t;
|
using ::wint_t;
|
||||||
using ::wctrans_t;
|
using ::wctrans_t;
|
||||||
using ::wctype_t;
|
using ::wctype_t;
|
||||||
|
|
||||||
#ifdef iswalnum
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_iswalnum(wint_t __wc) {return iswalnum(__wc);}
|
|
||||||
#undef iswalnum
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int iswalnum(wint_t __wc) {return __libcpp_iswalnum(__wc);}
|
|
||||||
#else // iswalnum
|
|
||||||
using ::iswalnum;
|
using ::iswalnum;
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef iswalpha
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_iswalpha(wint_t __wc) {return iswalpha(__wc);}
|
|
||||||
#undef iswalpha
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int iswalpha(wint_t __wc) {return __libcpp_iswalpha(__wc);}
|
|
||||||
#else // iswalpha
|
|
||||||
using ::iswalpha;
|
using ::iswalpha;
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef iswblank
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_iswblank(wint_t __wc) {return iswblank(__wc);}
|
|
||||||
#undef iswblank
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int iswblank(wint_t __wc) {return __libcpp_iswblank(__wc);}
|
|
||||||
#else // iswblank
|
|
||||||
using ::iswblank;
|
using ::iswblank;
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef iswcntrl
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_iswcntrl(wint_t __wc) {return iswcntrl(__wc);}
|
|
||||||
#undef iswcntrl
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int iswcntrl(wint_t __wc) {return __libcpp_iswcntrl(__wc);}
|
|
||||||
#else // iswcntrl
|
|
||||||
using ::iswcntrl;
|
using ::iswcntrl;
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef iswdigit
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_iswdigit(wint_t __wc) {return iswdigit(__wc);}
|
|
||||||
#undef iswdigit
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int iswdigit(wint_t __wc) {return __libcpp_iswdigit(__wc);}
|
|
||||||
#else // iswdigit
|
|
||||||
using ::iswdigit;
|
using ::iswdigit;
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef iswgraph
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_iswgraph(wint_t __wc) {return iswgraph(__wc);}
|
|
||||||
#undef iswgraph
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int iswgraph(wint_t __wc) {return __libcpp_iswgraph(__wc);}
|
|
||||||
#else // iswgraph
|
|
||||||
using ::iswgraph;
|
using ::iswgraph;
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef iswlower
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_iswlower(wint_t __wc) {return iswlower(__wc);}
|
|
||||||
#undef iswlower
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int iswlower(wint_t __wc) {return __libcpp_iswlower(__wc);}
|
|
||||||
#else // iswlower
|
|
||||||
using ::iswlower;
|
using ::iswlower;
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef iswprint
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_iswprint(wint_t __wc) {return iswprint(__wc);}
|
|
||||||
#undef iswprint
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int iswprint(wint_t __wc) {return __libcpp_iswprint(__wc);}
|
|
||||||
#else // iswprint
|
|
||||||
using ::iswprint;
|
using ::iswprint;
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef iswpunct
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_iswpunct(wint_t __wc) {return iswpunct(__wc);}
|
|
||||||
#undef iswpunct
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int iswpunct(wint_t __wc) {return __libcpp_iswpunct(__wc);}
|
|
||||||
#else // iswpunct
|
|
||||||
using ::iswpunct;
|
using ::iswpunct;
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef iswspace
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_iswspace(wint_t __wc) {return iswspace(__wc);}
|
|
||||||
#undef iswspace
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int iswspace(wint_t __wc) {return __libcpp_iswspace(__wc);}
|
|
||||||
#else // iswspace
|
|
||||||
using ::iswspace;
|
using ::iswspace;
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef iswupper
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_iswupper(wint_t __wc) {return iswupper(__wc);}
|
|
||||||
#undef iswupper
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int iswupper(wint_t __wc) {return __libcpp_iswupper(__wc);}
|
|
||||||
#else // iswupper
|
|
||||||
using ::iswupper;
|
using ::iswupper;
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef iswxdigit
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_iswxdigit(wint_t __wc) {return iswxdigit(__wc);}
|
|
||||||
#undef iswxdigit
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int iswxdigit(wint_t __wc) {return __libcpp_iswxdigit(__wc);}
|
|
||||||
#else // iswxdigit
|
|
||||||
using ::iswxdigit;
|
using ::iswxdigit;
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef iswctype
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int __libcpp_iswctype(wint_t __w, wctype_t __d) {return iswctype(__w, __d);}
|
|
||||||
#undef iswctype
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY int iswctype(wint_t __w, wctype_t __d) {return __libcpp_iswctype(__w, __d);}
|
|
||||||
#else // iswctype
|
|
||||||
using ::iswctype;
|
using ::iswctype;
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef wctype
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY wctype_t __libcpp_wctype(const char* __p) {return wctype(__p);}
|
|
||||||
#undef wctype
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY wctype_t wctype(const char* __p) {return __libcpp_wctype(__p);}
|
|
||||||
#else // wctype
|
|
||||||
using ::wctype;
|
using ::wctype;
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef towlower
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY wint_t __libcpp_towlower(wint_t __wc) {return towlower(__wc);}
|
|
||||||
#undef towlower
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY wint_t towlower(wint_t __wc) {return __libcpp_towlower(__wc);}
|
|
||||||
#else // towlower
|
|
||||||
using ::towlower;
|
using ::towlower;
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef towupper
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY wint_t __libcpp_towupper(wint_t __wc) {return towupper(__wc);}
|
|
||||||
#undef towupper
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY wint_t towupper(wint_t __wc) {return __libcpp_towupper(__wc);}
|
|
||||||
#else // towupper
|
|
||||||
using ::towupper;
|
using ::towupper;
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef towctrans
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY wint_t __libcpp_towctrans(wint_t __wc, wctype_t __d) {return towctrans(__wc, __d);}
|
|
||||||
#undef towctrans
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY wint_t towctrans(wint_t __wc, wctype_t __d) {return __libcpp_towctrans(__wc, __d);}
|
|
||||||
#else // towctrans
|
|
||||||
using ::towctrans;
|
using ::towctrans;
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef wctrans
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY wctrans_t __libcpp_wctrans(const char* __p) {return wctrans(__p);}
|
|
||||||
#undef wctrans
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY wctrans_t wctrans(const char* __p) {return __libcpp_wctrans(__p);}
|
|
||||||
#else // wctrans
|
|
||||||
using ::wctrans;
|
using ::wctrans;
|
||||||
#endif
|
|
||||||
|
|
||||||
_LIBCPP_END_NAMESPACE_STD
|
_LIBCPP_END_NAMESPACE_STD
|
||||||
|
|
||||||
|
|||||||
105
include/deque
105
include/deque
@@ -261,8 +261,21 @@ move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
|
|||||||
__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
|
__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
|
||||||
__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
|
__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
|
||||||
|
|
||||||
|
template <class _ValueType, class _DiffType>
|
||||||
|
struct __deque_block_size {
|
||||||
|
static const _DiffType value = sizeof(_ValueType) < 256 ? 4096 / sizeof(_ValueType) : 16;
|
||||||
|
};
|
||||||
|
|
||||||
template <class _ValueType, class _Pointer, class _Reference, class _MapPointer,
|
template <class _ValueType, class _Pointer, class _Reference, class _MapPointer,
|
||||||
class _DiffType, _DiffType _BlockSize>
|
class _DiffType, _DiffType _BS =
|
||||||
|
#ifdef _LIBCPP_ABI_INCOMPLETE_TYPES_IN_DEQUE
|
||||||
|
// Keep template parameter to avoid changing all template declarations thoughout
|
||||||
|
// this file.
|
||||||
|
0
|
||||||
|
#else
|
||||||
|
__deque_block_size<_ValueType, _DiffType>::value
|
||||||
|
#endif
|
||||||
|
>
|
||||||
class _LIBCPP_TYPE_VIS_ONLY __deque_iterator
|
class _LIBCPP_TYPE_VIS_ONLY __deque_iterator
|
||||||
{
|
{
|
||||||
typedef _MapPointer __map_iterator;
|
typedef _MapPointer __map_iterator;
|
||||||
@@ -273,7 +286,7 @@ private:
|
|||||||
__map_iterator __m_iter_;
|
__map_iterator __m_iter_;
|
||||||
pointer __ptr_;
|
pointer __ptr_;
|
||||||
|
|
||||||
static const difference_type __block_size = _BlockSize;
|
static const difference_type __block_size;
|
||||||
public:
|
public:
|
||||||
typedef _ValueType value_type;
|
typedef _ValueType value_type;
|
||||||
typedef random_access_iterator_tag iterator_category;
|
typedef random_access_iterator_tag iterator_category;
|
||||||
@@ -287,7 +300,7 @@ public:
|
|||||||
|
|
||||||
template <class _Pp, class _Rp, class _MP>
|
template <class _Pp, class _Rp, class _MP>
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
__deque_iterator(const __deque_iterator<value_type, _Pp, _Rp, _MP, difference_type, __block_size>& __it,
|
__deque_iterator(const __deque_iterator<value_type, _Pp, _Rp, _MP, difference_type, _BS>& __it,
|
||||||
typename enable_if<is_convertible<_Pp, pointer>::value>::type* = 0) _NOEXCEPT
|
typename enable_if<is_convertible<_Pp, pointer>::value>::type* = 0) _NOEXCEPT
|
||||||
: __m_iter_(__it.__m_iter_), __ptr_(__it.__ptr_) {}
|
: __m_iter_(__it.__m_iter_), __ptr_(__it.__ptr_) {}
|
||||||
|
|
||||||
@@ -520,6 +533,12 @@ private:
|
|||||||
__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
|
__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <class _ValueType, class _Pointer, class _Reference, class _MapPointer,
|
||||||
|
class _DiffType, _DiffType _BlockSize>
|
||||||
|
const _DiffType __deque_iterator<_ValueType, _Pointer, _Reference, _MapPointer,
|
||||||
|
_DiffType, _BlockSize>::__block_size =
|
||||||
|
__deque_block_size<_ValueType, _DiffType>::value;
|
||||||
|
|
||||||
// copy
|
// copy
|
||||||
|
|
||||||
template <class _RAIter,
|
template <class _RAIter,
|
||||||
@@ -532,10 +551,11 @@ copy(_RAIter __f,
|
|||||||
{
|
{
|
||||||
typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type;
|
typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type;
|
||||||
typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer;
|
typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer;
|
||||||
|
const difference_type __block_size = __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::__block_size;
|
||||||
while (__f != __l)
|
while (__f != __l)
|
||||||
{
|
{
|
||||||
pointer __rb = __r.__ptr_;
|
pointer __rb = __r.__ptr_;
|
||||||
pointer __re = *__r.__m_iter_ + _B2;
|
pointer __re = *__r.__m_iter_ + __block_size;
|
||||||
difference_type __bs = __re - __rb;
|
difference_type __bs = __re - __rb;
|
||||||
difference_type __n = __l - __f;
|
difference_type __n = __l - __f;
|
||||||
_RAIter __m = __l;
|
_RAIter __m = __l;
|
||||||
@@ -560,11 +580,12 @@ copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
|
|||||||
{
|
{
|
||||||
typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
|
typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
|
||||||
typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
|
typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
|
||||||
|
const difference_type __block_size = __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::__block_size;
|
||||||
difference_type __n = __l - __f;
|
difference_type __n = __l - __f;
|
||||||
while (__n > 0)
|
while (__n > 0)
|
||||||
{
|
{
|
||||||
pointer __fb = __f.__ptr_;
|
pointer __fb = __f.__ptr_;
|
||||||
pointer __fe = *__f.__m_iter_ + _B1;
|
pointer __fe = *__f.__m_iter_ + __block_size;
|
||||||
difference_type __bs = __fe - __fb;
|
difference_type __bs = __fe - __fb;
|
||||||
if (__bs > __n)
|
if (__bs > __n)
|
||||||
{
|
{
|
||||||
@@ -587,11 +608,12 @@ copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
|
|||||||
{
|
{
|
||||||
typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
|
typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
|
||||||
typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
|
typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
|
||||||
|
const difference_type __block_size = __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::__block_size;
|
||||||
difference_type __n = __l - __f;
|
difference_type __n = __l - __f;
|
||||||
while (__n > 0)
|
while (__n > 0)
|
||||||
{
|
{
|
||||||
pointer __fb = __f.__ptr_;
|
pointer __fb = __f.__ptr_;
|
||||||
pointer __fe = *__f.__m_iter_ + _B1;
|
pointer __fe = *__f.__m_iter_ + __block_size;
|
||||||
difference_type __bs = __fe - __fb;
|
difference_type __bs = __fe - __fb;
|
||||||
if (__bs > __n)
|
if (__bs > __n)
|
||||||
{
|
{
|
||||||
@@ -705,10 +727,11 @@ move(_RAIter __f,
|
|||||||
{
|
{
|
||||||
typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type;
|
typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type;
|
||||||
typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer;
|
typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer;
|
||||||
|
const difference_type __block_size = __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::__block_size;
|
||||||
while (__f != __l)
|
while (__f != __l)
|
||||||
{
|
{
|
||||||
pointer __rb = __r.__ptr_;
|
pointer __rb = __r.__ptr_;
|
||||||
pointer __re = *__r.__m_iter_ + _B2;
|
pointer __re = *__r.__m_iter_ + __block_size;
|
||||||
difference_type __bs = __re - __rb;
|
difference_type __bs = __re - __rb;
|
||||||
difference_type __n = __l - __f;
|
difference_type __n = __l - __f;
|
||||||
_RAIter __m = __l;
|
_RAIter __m = __l;
|
||||||
@@ -733,11 +756,12 @@ move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
|
|||||||
{
|
{
|
||||||
typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
|
typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
|
||||||
typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
|
typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
|
||||||
|
const difference_type __block_size = __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::__block_size;
|
||||||
difference_type __n = __l - __f;
|
difference_type __n = __l - __f;
|
||||||
while (__n > 0)
|
while (__n > 0)
|
||||||
{
|
{
|
||||||
pointer __fb = __f.__ptr_;
|
pointer __fb = __f.__ptr_;
|
||||||
pointer __fe = *__f.__m_iter_ + _B1;
|
pointer __fe = *__f.__m_iter_ + __block_size;
|
||||||
difference_type __bs = __fe - __fb;
|
difference_type __bs = __fe - __fb;
|
||||||
if (__bs > __n)
|
if (__bs > __n)
|
||||||
{
|
{
|
||||||
@@ -760,11 +784,12 @@ move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
|
|||||||
{
|
{
|
||||||
typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
|
typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
|
||||||
typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
|
typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
|
||||||
|
const difference_type __block_size = __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::__block_size;
|
||||||
difference_type __n = __l - __f;
|
difference_type __n = __l - __f;
|
||||||
while (__n > 0)
|
while (__n > 0)
|
||||||
{
|
{
|
||||||
pointer __fb = __f.__ptr_;
|
pointer __fb = __f.__ptr_;
|
||||||
pointer __fe = *__f.__m_iter_ + _B1;
|
pointer __fe = *__f.__m_iter_ + __block_size;
|
||||||
difference_type __bs = __fe - __fb;
|
difference_type __bs = __fe - __fb;
|
||||||
if (__bs > __n)
|
if (__bs > __n)
|
||||||
{
|
{
|
||||||
@@ -909,7 +934,7 @@ protected:
|
|||||||
typedef typename __alloc_traits::pointer pointer;
|
typedef typename __alloc_traits::pointer pointer;
|
||||||
typedef typename __alloc_traits::const_pointer const_pointer;
|
typedef typename __alloc_traits::const_pointer const_pointer;
|
||||||
|
|
||||||
static const difference_type __block_size = sizeof(value_type) < 256 ? 4096 / sizeof(value_type) : 16;
|
static const difference_type __block_size;
|
||||||
|
|
||||||
typedef typename __rebind_alloc_helper<__alloc_traits, pointer>::type __pointer_allocator;
|
typedef typename __rebind_alloc_helper<__alloc_traits, pointer>::type __pointer_allocator;
|
||||||
typedef allocator_traits<__pointer_allocator> __map_traits;
|
typedef allocator_traits<__pointer_allocator> __map_traits;
|
||||||
@@ -919,9 +944,9 @@ protected:
|
|||||||
typedef __split_buffer<pointer, __pointer_allocator> __map;
|
typedef __split_buffer<pointer, __pointer_allocator> __map;
|
||||||
|
|
||||||
typedef __deque_iterator<value_type, pointer, reference, __map_pointer,
|
typedef __deque_iterator<value_type, pointer, reference, __map_pointer,
|
||||||
difference_type, __block_size> iterator;
|
difference_type> iterator;
|
||||||
typedef __deque_iterator<value_type, const_pointer, const_reference, __map_const_pointer,
|
typedef __deque_iterator<value_type, const_pointer, const_reference, __map_const_pointer,
|
||||||
difference_type, __block_size> const_iterator;
|
difference_type> const_iterator;
|
||||||
|
|
||||||
__map __map_;
|
__map __map_;
|
||||||
size_type __start_;
|
size_type __start_;
|
||||||
@@ -939,8 +964,10 @@ protected:
|
|||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
const allocator_type& __alloc() const _NOEXCEPT {return __size_.second();}
|
const allocator_type& __alloc() const _NOEXCEPT {return __size_.second();}
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
__deque_base()
|
__deque_base()
|
||||||
_NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
|
_NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value);
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
explicit __deque_base(const allocator_type& __a);
|
explicit __deque_base(const allocator_type& __a);
|
||||||
public:
|
public:
|
||||||
~__deque_base();
|
~__deque_base();
|
||||||
@@ -996,6 +1023,11 @@ private:
|
|||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <class _Tp, class _Allocator>
|
||||||
|
const typename __deque_base<_Tp, _Allocator>::difference_type
|
||||||
|
__deque_base<_Tp, _Allocator>::__block_size =
|
||||||
|
__deque_block_size<value_type, difference_type>::value;
|
||||||
|
|
||||||
template <class _Tp, class _Allocator>
|
template <class _Tp, class _Allocator>
|
||||||
bool
|
bool
|
||||||
__deque_base<_Tp, _Allocator>::__invariants() const
|
__deque_base<_Tp, _Allocator>::__invariants() const
|
||||||
@@ -1060,13 +1092,13 @@ __deque_base<_Tp, _Allocator>::end() const _NOEXCEPT
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class _Allocator>
|
template <class _Tp, class _Allocator>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
__deque_base<_Tp, _Allocator>::__deque_base()
|
__deque_base<_Tp, _Allocator>::__deque_base()
|
||||||
_NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
|
_NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
|
||||||
: __start_(0), __size_(0) {}
|
: __start_(0), __size_(0) {}
|
||||||
|
|
||||||
template <class _Tp, class _Allocator>
|
template <class _Tp, class _Allocator>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
__deque_base<_Tp, _Allocator>::__deque_base(const allocator_type& __a)
|
__deque_base<_Tp, _Allocator>::__deque_base(const allocator_type& __a)
|
||||||
: __map_(__pointer_allocator(__a)), __start_(0), __size_(0, __a) {}
|
: __map_(__pointer_allocator(__a)), __start_(0), __size_(0, __a) {}
|
||||||
|
|
||||||
@@ -1164,6 +1196,9 @@ public:
|
|||||||
typedef _Tp value_type;
|
typedef _Tp value_type;
|
||||||
typedef _Allocator allocator_type;
|
typedef _Allocator allocator_type;
|
||||||
|
|
||||||
|
static_assert((is_same<typename allocator_type::value_type, value_type>::value),
|
||||||
|
"Allocator::value_type must be same type as value_type");
|
||||||
|
|
||||||
typedef __deque_base<value_type, allocator_type> __base;
|
typedef __deque_base<value_type, allocator_type> __base;
|
||||||
|
|
||||||
typedef typename __base::__alloc_traits __alloc_traits;
|
typedef typename __base::__alloc_traits __alloc_traits;
|
||||||
@@ -1211,8 +1246,11 @@ public:
|
|||||||
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
||||||
|
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
deque(deque&& __c) _NOEXCEPT_(is_nothrow_move_constructible<__base>::value);
|
deque(deque&& __c) _NOEXCEPT_(is_nothrow_move_constructible<__base>::value);
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
deque(deque&& __c, const allocator_type& __a);
|
deque(deque&& __c, const allocator_type& __a);
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
deque& operator=(deque&& __c)
|
deque& operator=(deque&& __c)
|
||||||
_NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value &&
|
_NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value &&
|
||||||
is_nothrow_move_assignable<allocator_type>::value);
|
is_nothrow_move_assignable<allocator_type>::value);
|
||||||
@@ -1231,6 +1269,7 @@ public:
|
|||||||
void assign(initializer_list<value_type> __il) {assign(__il.begin(), __il.end());}
|
void assign(initializer_list<value_type> __il) {assign(__il.begin(), __il.end());}
|
||||||
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
allocator_type get_allocator() const _NOEXCEPT;
|
allocator_type get_allocator() const _NOEXCEPT;
|
||||||
|
|
||||||
// iterators:
|
// iterators:
|
||||||
@@ -1283,13 +1322,21 @@ public:
|
|||||||
bool empty() const _NOEXCEPT {return __base::size() == 0;}
|
bool empty() const _NOEXCEPT {return __base::size() == 0;}
|
||||||
|
|
||||||
// element access:
|
// element access:
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
reference operator[](size_type __i);
|
reference operator[](size_type __i);
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
const_reference operator[](size_type __i) const;
|
const_reference operator[](size_type __i) const;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
reference at(size_type __i);
|
reference at(size_type __i);
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
const_reference at(size_type __i) const;
|
const_reference at(size_type __i) const;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
reference front();
|
reference front();
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
const_reference front() const;
|
const_reference front() const;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
reference back();
|
reference back();
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
const_reference back() const;
|
const_reference back() const;
|
||||||
|
|
||||||
// 23.2.2.3 modifiers:
|
// 23.2.2.3 modifiers:
|
||||||
@@ -1328,6 +1375,7 @@ public:
|
|||||||
iterator erase(const_iterator __p);
|
iterator erase(const_iterator __p);
|
||||||
iterator erase(const_iterator __f, const_iterator __l);
|
iterator erase(const_iterator __f, const_iterator __l);
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void swap(deque& __c)
|
void swap(deque& __c)
|
||||||
#if _LIBCPP_STD_VER >= 14
|
#if _LIBCPP_STD_VER >= 14
|
||||||
_NOEXCEPT;
|
_NOEXCEPT;
|
||||||
@@ -1335,6 +1383,7 @@ public:
|
|||||||
_NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
|
_NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
|
||||||
__is_nothrow_swappable<allocator_type>::value);
|
__is_nothrow_swappable<allocator_type>::value);
|
||||||
#endif
|
#endif
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void clear() _NOEXCEPT;
|
void clear() _NOEXCEPT;
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
@@ -1507,7 +1556,7 @@ deque<_Tp, _Allocator>::operator=(const deque& __c)
|
|||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
|
||||||
template <class _Tp, class _Allocator>
|
template <class _Tp, class _Allocator>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
deque<_Tp, _Allocator>::deque(deque&& __c)
|
deque<_Tp, _Allocator>::deque(deque&& __c)
|
||||||
_NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
|
_NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
|
||||||
: __base(_VSTD::move(__c))
|
: __base(_VSTD::move(__c))
|
||||||
@@ -1515,7 +1564,7 @@ deque<_Tp, _Allocator>::deque(deque&& __c)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class _Allocator>
|
template <class _Tp, class _Allocator>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
deque<_Tp, _Allocator>::deque(deque&& __c, const allocator_type& __a)
|
deque<_Tp, _Allocator>::deque(deque&& __c, const allocator_type& __a)
|
||||||
: __base(_VSTD::move(__c), __a)
|
: __base(_VSTD::move(__c), __a)
|
||||||
{
|
{
|
||||||
@@ -1527,7 +1576,7 @@ deque<_Tp, _Allocator>::deque(deque&& __c, const allocator_type& __a)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class _Allocator>
|
template <class _Tp, class _Allocator>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
deque<_Tp, _Allocator>&
|
deque<_Tp, _Allocator>&
|
||||||
deque<_Tp, _Allocator>::operator=(deque&& __c)
|
deque<_Tp, _Allocator>::operator=(deque&& __c)
|
||||||
_NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value &&
|
_NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value &&
|
||||||
@@ -1611,7 +1660,7 @@ deque<_Tp, _Allocator>::assign(size_type __n, const value_type& __v)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class _Allocator>
|
template <class _Tp, class _Allocator>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
_Allocator
|
_Allocator
|
||||||
deque<_Tp, _Allocator>::get_allocator() const _NOEXCEPT
|
deque<_Tp, _Allocator>::get_allocator() const _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -1670,7 +1719,7 @@ deque<_Tp, _Allocator>::shrink_to_fit() _NOEXCEPT
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class _Allocator>
|
template <class _Tp, class _Allocator>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
typename deque<_Tp, _Allocator>::reference
|
typename deque<_Tp, _Allocator>::reference
|
||||||
deque<_Tp, _Allocator>::operator[](size_type __i)
|
deque<_Tp, _Allocator>::operator[](size_type __i)
|
||||||
{
|
{
|
||||||
@@ -1679,7 +1728,7 @@ deque<_Tp, _Allocator>::operator[](size_type __i)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class _Allocator>
|
template <class _Tp, class _Allocator>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
typename deque<_Tp, _Allocator>::const_reference
|
typename deque<_Tp, _Allocator>::const_reference
|
||||||
deque<_Tp, _Allocator>::operator[](size_type __i) const
|
deque<_Tp, _Allocator>::operator[](size_type __i) const
|
||||||
{
|
{
|
||||||
@@ -1688,7 +1737,7 @@ deque<_Tp, _Allocator>::operator[](size_type __i) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class _Allocator>
|
template <class _Tp, class _Allocator>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
typename deque<_Tp, _Allocator>::reference
|
typename deque<_Tp, _Allocator>::reference
|
||||||
deque<_Tp, _Allocator>::at(size_type __i)
|
deque<_Tp, _Allocator>::at(size_type __i)
|
||||||
{
|
{
|
||||||
@@ -1699,7 +1748,7 @@ deque<_Tp, _Allocator>::at(size_type __i)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class _Allocator>
|
template <class _Tp, class _Allocator>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
typename deque<_Tp, _Allocator>::const_reference
|
typename deque<_Tp, _Allocator>::const_reference
|
||||||
deque<_Tp, _Allocator>::at(size_type __i) const
|
deque<_Tp, _Allocator>::at(size_type __i) const
|
||||||
{
|
{
|
||||||
@@ -1710,7 +1759,7 @@ deque<_Tp, _Allocator>::at(size_type __i) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class _Allocator>
|
template <class _Tp, class _Allocator>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
typename deque<_Tp, _Allocator>::reference
|
typename deque<_Tp, _Allocator>::reference
|
||||||
deque<_Tp, _Allocator>::front()
|
deque<_Tp, _Allocator>::front()
|
||||||
{
|
{
|
||||||
@@ -1719,7 +1768,7 @@ deque<_Tp, _Allocator>::front()
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class _Allocator>
|
template <class _Tp, class _Allocator>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
typename deque<_Tp, _Allocator>::const_reference
|
typename deque<_Tp, _Allocator>::const_reference
|
||||||
deque<_Tp, _Allocator>::front() const
|
deque<_Tp, _Allocator>::front() const
|
||||||
{
|
{
|
||||||
@@ -1728,7 +1777,7 @@ deque<_Tp, _Allocator>::front() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class _Allocator>
|
template <class _Tp, class _Allocator>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
typename deque<_Tp, _Allocator>::reference
|
typename deque<_Tp, _Allocator>::reference
|
||||||
deque<_Tp, _Allocator>::back()
|
deque<_Tp, _Allocator>::back()
|
||||||
{
|
{
|
||||||
@@ -1737,7 +1786,7 @@ deque<_Tp, _Allocator>::back()
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class _Allocator>
|
template <class _Tp, class _Allocator>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
typename deque<_Tp, _Allocator>::const_reference
|
typename deque<_Tp, _Allocator>::const_reference
|
||||||
deque<_Tp, _Allocator>::back() const
|
deque<_Tp, _Allocator>::back() const
|
||||||
{
|
{
|
||||||
@@ -2776,7 +2825,7 @@ deque<_Tp, _Allocator>::__erase_to_end(const_iterator __f)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class _Allocator>
|
template <class _Tp, class _Allocator>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
deque<_Tp, _Allocator>::swap(deque& __c)
|
deque<_Tp, _Allocator>::swap(deque& __c)
|
||||||
#if _LIBCPP_STD_VER >= 14
|
#if _LIBCPP_STD_VER >= 14
|
||||||
@@ -2790,7 +2839,7 @@ deque<_Tp, _Allocator>::swap(deque& __c)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class _Allocator>
|
template <class _Tp, class _Allocator>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
deque<_Tp, _Allocator>::clear() _NOEXCEPT
|
deque<_Tp, _Allocator>::clear() _NOEXCEPT
|
||||||
{
|
{
|
||||||
|
|||||||
398
include/errno.h
Normal file
398
include/errno.h
Normal file
@@ -0,0 +1,398 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
//===-------------------------- errno.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_ERRNO_H
|
||||||
|
#define _LIBCPP_ERRNO_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
errno.h synopsis
|
||||||
|
|
||||||
|
Macros:
|
||||||
|
|
||||||
|
EDOM
|
||||||
|
EILSEQ // C99
|
||||||
|
ERANGE
|
||||||
|
errno
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <__config>
|
||||||
|
|
||||||
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||||
|
#pragma GCC system_header
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include_next <errno.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
|
||||||
|
#if !defined(EOWNERDEAD) || !defined(ENOTRECOVERABLE)
|
||||||
|
|
||||||
|
#ifdef ELAST
|
||||||
|
|
||||||
|
static const int __elast1 = ELAST+1;
|
||||||
|
static const int __elast2 = ELAST+2;
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
static const int __elast1 = 104;
|
||||||
|
static const int __elast2 = 105;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ENOTRECOVERABLE
|
||||||
|
|
||||||
|
#define EOWNERDEAD __elast1
|
||||||
|
|
||||||
|
#ifdef ELAST
|
||||||
|
#undef ELAST
|
||||||
|
#define ELAST EOWNERDEAD
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined(EOWNERDEAD)
|
||||||
|
|
||||||
|
#define ENOTRECOVERABLE __elast1
|
||||||
|
#ifdef ELAST
|
||||||
|
#undef ELAST
|
||||||
|
#define ELAST ENOTRECOVERABLE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#else // defined(EOWNERDEAD)
|
||||||
|
|
||||||
|
#define EOWNERDEAD __elast1
|
||||||
|
#define ENOTRECOVERABLE __elast2
|
||||||
|
#ifdef ELAST
|
||||||
|
#undef ELAST
|
||||||
|
#define ELAST ENOTRECOVERABLE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // defined(EOWNERDEAD)
|
||||||
|
|
||||||
|
#endif // !defined(EOWNERDEAD) || !defined(ENOTRECOVERABLE)
|
||||||
|
|
||||||
|
// supply errno values likely to be missing, particularly on Windows
|
||||||
|
|
||||||
|
#ifndef EAFNOSUPPORT
|
||||||
|
#define EAFNOSUPPORT 9901
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EADDRINUSE
|
||||||
|
#define EADDRINUSE 9902
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EADDRNOTAVAIL
|
||||||
|
#define EADDRNOTAVAIL 9903
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EISCONN
|
||||||
|
#define EISCONN 9904
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EBADMSG
|
||||||
|
#define EBADMSG 9905
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ECONNABORTED
|
||||||
|
#define ECONNABORTED 9906
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EALREADY
|
||||||
|
#define EALREADY 9907
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ECONNREFUSED
|
||||||
|
#define ECONNREFUSED 9908
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ECONNRESET
|
||||||
|
#define ECONNRESET 9909
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EDESTADDRREQ
|
||||||
|
#define EDESTADDRREQ 9910
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EHOSTUNREACH
|
||||||
|
#define EHOSTUNREACH 9911
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EIDRM
|
||||||
|
#define EIDRM 9912
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EMSGSIZE
|
||||||
|
#define EMSGSIZE 9913
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ENETDOWN
|
||||||
|
#define ENETDOWN 9914
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ENETRESET
|
||||||
|
#define ENETRESET 9915
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ENETUNREACH
|
||||||
|
#define ENETUNREACH 9916
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ENOBUFS
|
||||||
|
#define ENOBUFS 9917
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ENOLINK
|
||||||
|
#define ENOLINK 9918
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ENODATA
|
||||||
|
#define ENODATA 9919
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ENOMSG
|
||||||
|
#define ENOMSG 9920
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ENOPROTOOPT
|
||||||
|
#define ENOPROTOOPT 9921
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ENOSR
|
||||||
|
#define ENOSR 9922
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ENOTSOCK
|
||||||
|
#define ENOTSOCK 9923
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ENOSTR
|
||||||
|
#define ENOSTR 9924
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ENOTCONN
|
||||||
|
#define ENOTCONN 9925
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ENOTSUP
|
||||||
|
#define ENOTSUP 9926
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ECANCELED
|
||||||
|
#define ECANCELED 9927
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EINPROGRESS
|
||||||
|
#define EINPROGRESS 9928
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EOPNOTSUPP
|
||||||
|
#define EOPNOTSUPP 9929
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EWOULDBLOCK
|
||||||
|
#define EWOULDBLOCK 9930
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EOWNERDEAD
|
||||||
|
#define EOWNERDEAD 9931
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EPROTO
|
||||||
|
#define EPROTO 9932
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EPROTONOSUPPORT
|
||||||
|
#define EPROTONOSUPPORT 9933
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ENOTRECOVERABLE
|
||||||
|
#define ENOTRECOVERABLE 9934
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ETIME
|
||||||
|
#define ETIME 9935
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ETXTBSY
|
||||||
|
#define ETXTBSY 9936
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ETIMEDOUT
|
||||||
|
#define ETIMEDOUT 9938
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ELOOP
|
||||||
|
#define ELOOP 9939
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EOVERFLOW
|
||||||
|
#define EOVERFLOW 9940
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EPROTOTYPE
|
||||||
|
#define EPROTOTYPE 9941
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ENOSYS
|
||||||
|
#define ENOSYS 9942
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EINVAL
|
||||||
|
#define EINVAL 9943
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ERANGE
|
||||||
|
#define ERANGE 9944
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EILSEQ
|
||||||
|
#define EILSEQ 9945
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Windows Mobile doesn't appear to define these:
|
||||||
|
|
||||||
|
#ifndef E2BIG
|
||||||
|
#define E2BIG 9946
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EDOM
|
||||||
|
#define EDOM 9947
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EFAULT
|
||||||
|
#define EFAULT 9948
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EBADF
|
||||||
|
#define EBADF 9949
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EPIPE
|
||||||
|
#define EPIPE 9950
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EXDEV
|
||||||
|
#define EXDEV 9951
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EBUSY
|
||||||
|
#define EBUSY 9952
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ENOTEMPTY
|
||||||
|
#define ENOTEMPTY 9953
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ENOEXEC
|
||||||
|
#define ENOEXEC 9954
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EEXIST
|
||||||
|
#define EEXIST 9955
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EFBIG
|
||||||
|
#define EFBIG 9956
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ENAMETOOLONG
|
||||||
|
#define ENAMETOOLONG 9957
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ENOTTY
|
||||||
|
#define ENOTTY 9958
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EINTR
|
||||||
|
#define EINTR 9959
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ESPIPE
|
||||||
|
#define ESPIPE 9960
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EIO
|
||||||
|
#define EIO 9961
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EISDIR
|
||||||
|
#define EISDIR 9962
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ECHILD
|
||||||
|
#define ECHILD 9963
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ENOLCK
|
||||||
|
#define ENOLCK 9964
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ENOSPC
|
||||||
|
#define ENOSPC 9965
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ENXIO
|
||||||
|
#define ENXIO 9966
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ENODEV
|
||||||
|
#define ENODEV 9967
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ENOENT
|
||||||
|
#define ENOENT 9968
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ESRCH
|
||||||
|
#define ESRCH 9969
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ENOTDIR
|
||||||
|
#define ENOTDIR 9970
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ENOMEM
|
||||||
|
#define ENOMEM 9971
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EPERM
|
||||||
|
#define EPERM 9972
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EACCES
|
||||||
|
#define EACCES 9973
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EROFS
|
||||||
|
#define EROFS 9974
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EDEADLK
|
||||||
|
#define EDEADLK 9975
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EAGAIN
|
||||||
|
#define EAGAIN 9976
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ENFILE
|
||||||
|
#define ENFILE 9977
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EMFILE
|
||||||
|
#define EMFILE 9978
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef EMLINK
|
||||||
|
#define EMLINK 9979
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // __cplusplus
|
||||||
|
|
||||||
|
#endif // _LIBCPP_ERRNO_H
|
||||||
@@ -80,6 +80,10 @@ template <class E> void rethrow_if_nested(const E& e);
|
|||||||
#include <__config>
|
#include <__config>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
#if defined(_LIBCPP_NO_EXCEPTIONS)
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstdlib>
|
||||||
|
#endif
|
||||||
|
|
||||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||||
#pragma GCC system_header
|
#pragma GCC system_header
|
||||||
@@ -235,7 +239,7 @@ rethrow_if_nested(const _Ep& __e, typename enable_if<
|
|||||||
is_polymorphic<_Ep>::value
|
is_polymorphic<_Ep>::value
|
||||||
>::type* = 0)
|
>::type* = 0)
|
||||||
{
|
{
|
||||||
const nested_exception* __nep = dynamic_cast<const nested_exception*>(&__e);
|
const nested_exception* __nep = dynamic_cast<const nested_exception*>(_VSTD::addressof(__e));
|
||||||
if (__nep)
|
if (__nep)
|
||||||
__nep->rethrow_nested();
|
__nep->rethrow_nested();
|
||||||
}
|
}
|
||||||
@@ -251,4 +255,19 @@ rethrow_if_nested(const _Ep&, typename enable_if<
|
|||||||
|
|
||||||
} // std
|
} // 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
|
#endif // _LIBCPP_EXCEPTION
|
||||||
|
|||||||
@@ -25,6 +25,10 @@
|
|||||||
#define _LIBCPP_END_NAMESPACE_LFTS } } }
|
#define _LIBCPP_END_NAMESPACE_LFTS } } }
|
||||||
#define _VSTD_LFTS _VSTD_EXPERIMENTAL::fundamentals_v1
|
#define _VSTD_LFTS _VSTD_EXPERIMENTAL::fundamentals_v1
|
||||||
|
|
||||||
|
#define _LIBCPP_BEGIN_NAMESPACE_LFTS_PMR _LIBCPP_BEGIN_NAMESPACE_LFTS namespace pmr {
|
||||||
|
#define _LIBCPP_END_NAMESPACE_LFTS_PMR _LIBCPP_END_NAMESPACE_LFTS }
|
||||||
|
#define _VSTD_LFTS_PMR _VSTD_LFTS::pmr
|
||||||
|
|
||||||
#define _LIBCPP_BEGIN_NAMESPACE_CHRONO_LFTS _LIBCPP_BEGIN_NAMESPACE_STD \
|
#define _LIBCPP_BEGIN_NAMESPACE_CHRONO_LFTS _LIBCPP_BEGIN_NAMESPACE_STD \
|
||||||
namespace chrono { namespace experimental { inline namespace fundamentals_v1 {
|
namespace chrono { namespace experimental { inline namespace fundamentals_v1 {
|
||||||
#define _LIBCPP_END_NAMESPACE_CHRONO_LFTS _LIBCPP_END_NAMESPACE_STD } } }
|
#define _LIBCPP_END_NAMESPACE_CHRONO_LFTS _LIBCPP_END_NAMESPACE_STD } } }
|
||||||
|
|||||||
90
include/experimental/__memory
Normal file
90
include/experimental/__memory
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// 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___MEMORY
|
||||||
|
#define _LIBCPP_EXPERIMENTAL___MEMORY
|
||||||
|
|
||||||
|
#include <experimental/__config>
|
||||||
|
#include <experimental/utility> // for erased_type
|
||||||
|
#include <__functional_base>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
|
_LIBCPP_BEGIN_NAMESPACE_LFTS
|
||||||
|
|
||||||
|
template <
|
||||||
|
class _Tp, class _Alloc
|
||||||
|
, bool = uses_allocator<_Tp, _Alloc>::value
|
||||||
|
, bool = __has_allocator_type<_Tp>::value
|
||||||
|
>
|
||||||
|
struct __lfts_uses_allocator : public false_type {};
|
||||||
|
|
||||||
|
template <class _Tp, class _Alloc>
|
||||||
|
struct __lfts_uses_allocator<_Tp, _Alloc, false, false> : public false_type {};
|
||||||
|
|
||||||
|
template <class _Tp, class _Alloc, bool HasAlloc>
|
||||||
|
struct __lfts_uses_allocator<_Tp, _Alloc, true, HasAlloc> : public true_type {};
|
||||||
|
|
||||||
|
template <class _Tp, class _Alloc>
|
||||||
|
struct __lfts_uses_allocator<_Tp, _Alloc, false, true>
|
||||||
|
: public integral_constant<bool
|
||||||
|
, is_convertible<_Alloc, typename _Tp::allocator_type>::value
|
||||||
|
|| is_same<erased_type, typename _Tp::allocator_type>::value
|
||||||
|
>
|
||||||
|
{};
|
||||||
|
|
||||||
|
template <bool _UsesAlloc, class _Tp, class _Alloc, class ..._Args>
|
||||||
|
struct __lfts_uses_alloc_ctor_imp
|
||||||
|
{
|
||||||
|
static const int value = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class _Tp, class _Alloc, class ..._Args>
|
||||||
|
struct __lfts_uses_alloc_ctor_imp<true, _Tp, _Alloc, _Args...>
|
||||||
|
{
|
||||||
|
static const bool __ic_first
|
||||||
|
= is_constructible<_Tp, allocator_arg_t, _Alloc, _Args...>::value;
|
||||||
|
|
||||||
|
static const bool __ic_second =
|
||||||
|
conditional<
|
||||||
|
__ic_first,
|
||||||
|
false_type,
|
||||||
|
is_constructible<_Tp, _Args..., _Alloc>
|
||||||
|
>::type::value;
|
||||||
|
|
||||||
|
static_assert(__ic_first || __ic_second,
|
||||||
|
"Request for uses allocator construction is ill-formed");
|
||||||
|
|
||||||
|
static const int value = __ic_first ? 1 : 2;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class _Tp, class _Alloc, class ..._Args>
|
||||||
|
struct __lfts_uses_alloc_ctor
|
||||||
|
: integral_constant<int,
|
||||||
|
__lfts_uses_alloc_ctor_imp<
|
||||||
|
__lfts_uses_allocator<_Tp, _Alloc>::value
|
||||||
|
, _Tp, _Alloc, _Args...
|
||||||
|
>::value
|
||||||
|
>
|
||||||
|
{};
|
||||||
|
|
||||||
|
template <class _Tp, class _Alloc, class ..._Args>
|
||||||
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
|
void __lfts_user_alloc_construct(
|
||||||
|
_Tp * __store, const _Alloc & __a, _Args &&... __args)
|
||||||
|
{
|
||||||
|
_VSTD::__user_alloc_construct_impl(
|
||||||
|
typename __lfts_uses_alloc_ctor<_Tp, _Alloc, _Args...>::type()
|
||||||
|
, __store, __a, _VSTD::forward<_Args>(__args)...
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
_LIBCPP_END_NAMESPACE_LFTS
|
||||||
|
|
||||||
|
#endif /* _LIBCPP_EXPERIMENTAL___MEMORY */
|
||||||
@@ -53,7 +53,7 @@ _LIBCPP_BEGIN_NAMESPACE_LFTS
|
|||||||
template <class _ForwardIterator, class _Searcher>
|
template <class _ForwardIterator, class _Searcher>
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
_ForwardIterator search(_ForwardIterator __f, _ForwardIterator __l, const _Searcher &__s)
|
_ForwardIterator search(_ForwardIterator __f, _ForwardIterator __l, const _Searcher &__s)
|
||||||
{ return __s(__f, __l); }
|
{ return __s(__f, __l).first; }
|
||||||
|
|
||||||
|
|
||||||
template <class _PopulationIterator, class _SampleIterator, class _Distance,
|
template <class _PopulationIterator, class _SampleIterator, class _Distance,
|
||||||
|
|||||||
@@ -82,6 +82,7 @@ inline namespace fundamentals_v1 {
|
|||||||
#include <typeinfo>
|
#include <typeinfo>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||||
#pragma GCC system_header
|
#pragma GCC system_header
|
||||||
@@ -92,9 +93,6 @@ _LIBCPP_BEGIN_NAMESPACE_LFTS
|
|||||||
class _LIBCPP_EXCEPTION_ABI bad_any_cast : public bad_cast
|
class _LIBCPP_EXCEPTION_ABI bad_any_cast : public bad_cast
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
//TODO(EricWF) Enable or delete these.
|
|
||||||
//bad_any_cast() _NOEXCEPT;
|
|
||||||
//virtual ~bad_any_cast() _NOEXCEPT;
|
|
||||||
virtual const char* what() const _NOEXCEPT;
|
virtual const char* what() const _NOEXCEPT;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -106,7 +104,7 @@ inline void __throw_bad_any_cast()
|
|||||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||||
throw bad_any_cast();
|
throw bad_any_cast();
|
||||||
#else
|
#else
|
||||||
_VSTD::abort();
|
assert(!"bad_any_cast");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,10 +113,12 @@ class any;
|
|||||||
|
|
||||||
template <class _ValueType>
|
template <class _ValueType>
|
||||||
typename add_pointer<typename add_const<_ValueType>::type>::type
|
typename add_pointer<typename add_const<_ValueType>::type>::type
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
any_cast(any const *) _NOEXCEPT;
|
any_cast(any const *) _NOEXCEPT;
|
||||||
|
|
||||||
template <class _ValueType>
|
template <class _ValueType>
|
||||||
typename add_pointer<_ValueType>::type
|
typename add_pointer<_ValueType>::type
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
any_cast(any *) _NOEXCEPT;
|
any_cast(any *) _NOEXCEPT;
|
||||||
|
|
||||||
namespace __any_imp
|
namespace __any_imp
|
||||||
@@ -187,6 +187,7 @@ public:
|
|||||||
class _ValueType
|
class _ValueType
|
||||||
, class = __any_imp::_EnableIfNotAny<_ValueType>
|
, class = __any_imp::_EnableIfNotAny<_ValueType>
|
||||||
>
|
>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
any(_ValueType && __value);
|
any(_ValueType && __value);
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
@@ -214,6 +215,7 @@ public:
|
|||||||
class _ValueType
|
class _ValueType
|
||||||
, class = __any_imp::_EnableIfNotAny<_ValueType>
|
, class = __any_imp::_EnableIfNotAny<_ValueType>
|
||||||
>
|
>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
any & operator=(_ValueType && __rhs);
|
any & operator=(_ValueType && __rhs);
|
||||||
|
|
||||||
// 6.3.3 any modifiers
|
// 6.3.3 any modifiers
|
||||||
@@ -223,6 +225,7 @@ public:
|
|||||||
if (__h) this->__call(_Action::_Destroy);
|
if (__h) this->__call(_Action::_Destroy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void swap(any & __rhs) _NOEXCEPT;
|
void swap(any & __rhs) _NOEXCEPT;
|
||||||
|
|
||||||
// 6.3.4 any observers
|
// 6.3.4 any observers
|
||||||
@@ -459,7 +462,6 @@ namespace __any_imp
|
|||||||
|
|
||||||
|
|
||||||
template <class _ValueType, class>
|
template <class _ValueType, class>
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
any::any(_ValueType && __v) : __h(nullptr)
|
any::any(_ValueType && __v) : __h(nullptr)
|
||||||
{
|
{
|
||||||
typedef typename decay<_ValueType>::type _Tp;
|
typedef typename decay<_ValueType>::type _Tp;
|
||||||
@@ -470,7 +472,6 @@ any::any(_ValueType && __v) : __h(nullptr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _ValueType, class>
|
template <class _ValueType, class>
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
any & any::operator=(_ValueType && __v)
|
any & any::operator=(_ValueType && __v)
|
||||||
{
|
{
|
||||||
typedef typename decay<_ValueType>::type _Tp;
|
typedef typename decay<_ValueType>::type _Tp;
|
||||||
@@ -480,7 +481,7 @@ any & any::operator=(_ValueType && __v)
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void any::swap(any & __rhs) _NOEXCEPT
|
void any::swap(any & __rhs) _NOEXCEPT
|
||||||
{
|
{
|
||||||
if (__h && __rhs.__h) {
|
if (__h && __rhs.__h) {
|
||||||
@@ -552,7 +553,7 @@ _ValueType any_cast(any && __v)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _ValueType>
|
template <class _ValueType>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
typename add_pointer<typename add_const<_ValueType>::type>::type
|
typename add_pointer<typename add_const<_ValueType>::type>::type
|
||||||
any_cast(any const * __any) _NOEXCEPT
|
any_cast(any const * __any) _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -562,7 +563,6 @@ any_cast(any const * __any) _NOEXCEPT
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _ValueType>
|
template <class _ValueType>
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
typename add_pointer<_ValueType>::type
|
typename add_pointer<_ValueType>::type
|
||||||
any_cast(any * __any) _NOEXCEPT
|
any_cast(any * __any) _NOEXCEPT
|
||||||
{
|
{
|
||||||
|
|||||||
47
include/experimental/deque
Normal file
47
include/experimental/deque
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
//===--------------------------- deque ------------------------------------===//
|
||||||
|
//
|
||||||
|
// 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_DEQUE
|
||||||
|
#define _LIBCPP_EXPERIMENTAL_DEQUE
|
||||||
|
/*
|
||||||
|
experimental/deque synopsis
|
||||||
|
|
||||||
|
// C++1z
|
||||||
|
namespace std {
|
||||||
|
namespace experimental {
|
||||||
|
inline namespace fundamentals_v1 {
|
||||||
|
namespace pmr {
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
using deque = std::deque<T,polymorphic_allocator<T>>;
|
||||||
|
|
||||||
|
} // namespace pmr
|
||||||
|
} // namespace fundamentals_v1
|
||||||
|
} // namespace experimental
|
||||||
|
} // namespace std
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <experimental/__config>
|
||||||
|
#include <deque>
|
||||||
|
#include <experimental/memory_resource>
|
||||||
|
|
||||||
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||||
|
#pragma GCC system_header
|
||||||
|
#endif
|
||||||
|
|
||||||
|
_LIBCPP_BEGIN_NAMESPACE_LFTS_PMR
|
||||||
|
|
||||||
|
template <class _ValueT>
|
||||||
|
using deque = _VSTD::deque<_ValueT, polymorphic_allocator<_ValueT>>;
|
||||||
|
|
||||||
|
_LIBCPP_END_NAMESPACE_LFTS_PMR
|
||||||
|
|
||||||
|
#endif /* _LIBCPP_EXPERIMENTAL_DEQUE */
|
||||||
@@ -137,7 +137,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
size_t __size_;
|
size_t __size_;
|
||||||
value_type * __base_;
|
value_type * __base_;
|
||||||
_LIBCPP_ALWAYS_INLINE dynarray () noexcept : __base_(nullptr), __size_(0) {}
|
_LIBCPP_ALWAYS_INLINE dynarray () noexcept : __size_(0), __base_(nullptr) {}
|
||||||
|
|
||||||
static inline _LIBCPP_INLINE_VISIBILITY value_type* __allocate ( size_t count )
|
static inline _LIBCPP_INLINE_VISIBILITY value_type* __allocate ( size_t count )
|
||||||
{
|
{
|
||||||
@@ -159,9 +159,13 @@ private:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
explicit dynarray(size_type __c);
|
explicit dynarray(size_type __c);
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
dynarray(size_type __c, const value_type& __v);
|
dynarray(size_type __c, const value_type& __v);
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
dynarray(const dynarray& __d);
|
dynarray(const dynarray& __d);
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
dynarray(initializer_list<value_type>);
|
dynarray(initializer_list<value_type>);
|
||||||
|
|
||||||
// We're not implementing these right now.
|
// We're not implementing these right now.
|
||||||
@@ -176,6 +180,7 @@ public:
|
|||||||
// dynarray(allocator_arg_t, const _Alloc& __alloc, initializer_list<value_type>);
|
// dynarray(allocator_arg_t, const _Alloc& __alloc, initializer_list<value_type>);
|
||||||
|
|
||||||
dynarray& operator=(const dynarray&) = delete;
|
dynarray& operator=(const dynarray&) = delete;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
~dynarray();
|
~dynarray();
|
||||||
|
|
||||||
// iterators:
|
// iterators:
|
||||||
@@ -219,7 +224,7 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
template <class _Tp>
|
template <class _Tp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
dynarray<_Tp>::dynarray(size_type __c) : dynarray ()
|
dynarray<_Tp>::dynarray(size_type __c) : dynarray ()
|
||||||
{
|
{
|
||||||
__base_ = __allocate (__c);
|
__base_ = __allocate (__c);
|
||||||
@@ -229,7 +234,7 @@ dynarray<_Tp>::dynarray(size_type __c) : dynarray ()
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp>
|
template <class _Tp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
dynarray<_Tp>::dynarray(size_type __c, const value_type& __v) : dynarray ()
|
dynarray<_Tp>::dynarray(size_type __c, const value_type& __v) : dynarray ()
|
||||||
{
|
{
|
||||||
__base_ = __allocate (__c);
|
__base_ = __allocate (__c);
|
||||||
@@ -239,7 +244,7 @@ dynarray<_Tp>::dynarray(size_type __c, const value_type& __v) : dynarray ()
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp>
|
template <class _Tp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
dynarray<_Tp>::dynarray(initializer_list<value_type> __il) : dynarray ()
|
dynarray<_Tp>::dynarray(initializer_list<value_type> __il) : dynarray ()
|
||||||
{
|
{
|
||||||
size_t sz = __il.size();
|
size_t sz = __il.size();
|
||||||
@@ -251,7 +256,7 @@ dynarray<_Tp>::dynarray(initializer_list<value_type> __il) : dynarray ()
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp>
|
template <class _Tp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
dynarray<_Tp>::dynarray(const dynarray& __d) : dynarray ()
|
dynarray<_Tp>::dynarray(const dynarray& __d) : dynarray ()
|
||||||
{
|
{
|
||||||
size_t sz = __d.size();
|
size_t sz = __d.size();
|
||||||
@@ -263,7 +268,7 @@ dynarray<_Tp>::dynarray(const dynarray& __d) : dynarray ()
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp>
|
template <class _Tp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
dynarray<_Tp>::~dynarray()
|
dynarray<_Tp>::~dynarray()
|
||||||
{
|
{
|
||||||
value_type *__data = data () + __size_;
|
value_type *__data = data () + __size_;
|
||||||
|
|||||||
47
include/experimental/forward_list
Normal file
47
include/experimental/forward_list
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
//===--------------------------- forward_list -----------------------------===//
|
||||||
|
//
|
||||||
|
// 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_FORWARD_LIST
|
||||||
|
#define _LIBCPP_EXPERIMENTAL_FORWARD_LIST
|
||||||
|
/*
|
||||||
|
experimental/forward_list synopsis
|
||||||
|
|
||||||
|
// C++1z
|
||||||
|
namespace std {
|
||||||
|
namespace experimental {
|
||||||
|
inline namespace fundamentals_v1 {
|
||||||
|
namespace pmr {
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
using forward_list = std::forward_list<T,polymorphic_allocator<T>>;
|
||||||
|
|
||||||
|
} // namespace pmr
|
||||||
|
} // namespace fundamentals_v1
|
||||||
|
} // namespace experimental
|
||||||
|
} // namespace std
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <experimental/__config>
|
||||||
|
#include <forward_list>
|
||||||
|
#include <experimental/memory_resource>
|
||||||
|
|
||||||
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||||
|
#pragma GCC system_header
|
||||||
|
#endif
|
||||||
|
|
||||||
|
_LIBCPP_BEGIN_NAMESPACE_LFTS_PMR
|
||||||
|
|
||||||
|
template <class _ValueT>
|
||||||
|
using forward_list = _VSTD::forward_list<_ValueT, polymorphic_allocator<_ValueT>>;
|
||||||
|
|
||||||
|
_LIBCPP_END_NAMESPACE_LFTS_PMR
|
||||||
|
|
||||||
|
#endif /* _LIBCPP_EXPERIMENTAL_FORWARD_LIST */
|
||||||
@@ -20,7 +20,7 @@ namespace std {
|
|||||||
namespace experimental {
|
namespace experimental {
|
||||||
inline namespace fundamentals_v1 {
|
inline namespace fundamentals_v1 {
|
||||||
|
|
||||||
// See C++14 §20.9.9, Function object binders
|
// See C++14 20.9.9, Function object binders
|
||||||
template <class T> constexpr bool is_bind_expression_v
|
template <class T> constexpr bool is_bind_expression_v
|
||||||
= is_bind_expression<T>::value;
|
= is_bind_expression<T>::value;
|
||||||
template <class T> constexpr int is_placeholder_v
|
template <class T> constexpr int is_placeholder_v
|
||||||
@@ -89,7 +89,12 @@ inline namespace fundamentals_v1 {
|
|||||||
|
|
||||||
#include <experimental/__config>
|
#include <experimental/__config>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <type_traits>
|
||||||
|
#include <vector>
|
||||||
|
#include <array>
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
#include <__undef_min_max>
|
#include <__undef_min_max>
|
||||||
|
|
||||||
@@ -101,17 +106,25 @@ inline namespace fundamentals_v1 {
|
|||||||
|
|
||||||
_LIBCPP_BEGIN_NAMESPACE_LFTS
|
_LIBCPP_BEGIN_NAMESPACE_LFTS
|
||||||
|
|
||||||
|
#if _LIBCPP_STD_VER > 11
|
||||||
// default searcher
|
// default searcher
|
||||||
template<class _ForwardIterator, class _BinaryPredicate = equal_to<>>
|
template<class _ForwardIterator, class _BinaryPredicate = equal_to<>>
|
||||||
|
_LIBCPP_TYPE_VIS
|
||||||
class default_searcher {
|
class default_searcher {
|
||||||
public:
|
public:
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
default_searcher(_ForwardIterator __f, _ForwardIterator __l,
|
default_searcher(_ForwardIterator __f, _ForwardIterator __l,
|
||||||
_BinaryPredicate __p = _BinaryPredicate())
|
_BinaryPredicate __p = _BinaryPredicate())
|
||||||
: __first_(__f), __last_(__l), __pred_(__p) {}
|
: __first_(__f), __last_(__l), __pred_(__p) {}
|
||||||
|
|
||||||
template <typename _ForwardIterator2>
|
template <typename _ForwardIterator2>
|
||||||
_ForwardIterator2 operator () (_ForwardIterator2 __f, _ForwardIterator2 __l) const {
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
return _VSTD::search(__f, __l, __first_, __last_, __pred_);
|
pair<_ForwardIterator2, _ForwardIterator2>
|
||||||
|
operator () (_ForwardIterator2 __f, _ForwardIterator2 __l) const
|
||||||
|
{
|
||||||
|
return _VSTD::__search(__f, __l, __first_, __last_, __pred_,
|
||||||
|
typename _VSTD::iterator_traits<_ForwardIterator>::iterator_category(),
|
||||||
|
typename _VSTD::iterator_traits<_ForwardIterator2>::iterator_category());
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -121,12 +134,325 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
template<class _ForwardIterator, class _BinaryPredicate = equal_to<>>
|
template<class _ForwardIterator, class _BinaryPredicate = equal_to<>>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
default_searcher<_ForwardIterator, _BinaryPredicate>
|
default_searcher<_ForwardIterator, _BinaryPredicate>
|
||||||
make_default_searcher( _ForwardIterator __f, _ForwardIterator __l, _BinaryPredicate __p = _BinaryPredicate ())
|
make_default_searcher( _ForwardIterator __f, _ForwardIterator __l, _BinaryPredicate __p = _BinaryPredicate ())
|
||||||
{
|
{
|
||||||
return default_searcher<_ForwardIterator, _BinaryPredicate>(__f, __l, __p);
|
return default_searcher<_ForwardIterator, _BinaryPredicate>(__f, __l, __p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<class _Key, class _Value, class _Hash, class _BinaryPredicate, bool /*useArray*/> class _BMSkipTable;
|
||||||
|
|
||||||
|
// General case for BM data searching; use a map
|
||||||
|
template<class _Key, typename _Value, class _Hash, class _BinaryPredicate>
|
||||||
|
class _BMSkipTable<_Key, _Value, _Hash, _BinaryPredicate, false> {
|
||||||
|
public: // TODO private:
|
||||||
|
typedef _Value value_type;
|
||||||
|
typedef _Key key_type;
|
||||||
|
|
||||||
|
const _Value __default_value_;
|
||||||
|
std::unordered_map<_Key, _Value, _Hash, _BinaryPredicate> __table;
|
||||||
|
|
||||||
|
public:
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
_BMSkipTable(std::size_t __sz, _Value __default, _Hash __hf, _BinaryPredicate __pred)
|
||||||
|
: __default_value_(__default), __table(__sz, __hf, __pred) {}
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
void insert(const key_type &__key, value_type __val)
|
||||||
|
{
|
||||||
|
__table [__key] = __val; // Would skip_.insert (val) be better here?
|
||||||
|
}
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
value_type operator [](const key_type & __key) const
|
||||||
|
{
|
||||||
|
auto __it = __table.find (__key);
|
||||||
|
return __it == __table.end() ? __default_value_ : __it->second;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Special case small numeric values; use an array
|
||||||
|
template<class _Key, typename _Value, class _Hash, class _BinaryPredicate>
|
||||||
|
class _BMSkipTable<_Key, _Value, _Hash, _BinaryPredicate, true> {
|
||||||
|
private:
|
||||||
|
typedef _Value value_type;
|
||||||
|
typedef _Key key_type;
|
||||||
|
|
||||||
|
typedef typename std::make_unsigned<key_type>::type unsigned_key_type;
|
||||||
|
typedef std::array<value_type, _VSTD::numeric_limits<unsigned_key_type>::max()> skip_map;
|
||||||
|
skip_map __table;
|
||||||
|
|
||||||
|
public:
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
_BMSkipTable(std::size_t /*__sz*/, _Value __default, _Hash /*__hf*/, _BinaryPredicate /*__pred*/)
|
||||||
|
{
|
||||||
|
std::fill_n(__table.begin(), __table.size(), __default);
|
||||||
|
}
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
void insert(key_type __key, value_type __val)
|
||||||
|
{
|
||||||
|
__table[static_cast<unsigned_key_type>(__key)] = __val;
|
||||||
|
}
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
value_type operator [](key_type __key) const
|
||||||
|
{
|
||||||
|
return __table[static_cast<unsigned_key_type>(__key)];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
template <class _RandomAccessIterator1,
|
||||||
|
class _Hash = hash<typename iterator_traits<_RandomAccessIterator1>::value_type>,
|
||||||
|
class _BinaryPredicate = equal_to<>>
|
||||||
|
_LIBCPP_TYPE_VIS
|
||||||
|
class boyer_moore_searcher {
|
||||||
|
private:
|
||||||
|
typedef typename std::iterator_traits<_RandomAccessIterator1>::difference_type difference_type;
|
||||||
|
typedef typename std::iterator_traits<_RandomAccessIterator1>::value_type value_type;
|
||||||
|
typedef _BMSkipTable<value_type, difference_type, _Hash, _BinaryPredicate,
|
||||||
|
_VSTD::is_integral<value_type>::value && // what about enums?
|
||||||
|
sizeof(value_type) == 1 &&
|
||||||
|
is_same<_Hash, hash<value_type>>::value &&
|
||||||
|
is_same<_BinaryPredicate, equal_to<>>::value
|
||||||
|
> skip_table_type;
|
||||||
|
|
||||||
|
public:
|
||||||
|
boyer_moore_searcher(_RandomAccessIterator1 __f, _RandomAccessIterator1 __l,
|
||||||
|
_Hash __hf = _Hash(), _BinaryPredicate __pred = _BinaryPredicate())
|
||||||
|
: __first_(__f), __last_(__l), __pred_(__pred),
|
||||||
|
__pattern_length_(_VSTD::distance(__first_, __last_)),
|
||||||
|
__skip_{make_shared<skip_table_type>(__pattern_length_, -1, __hf, __pred_)},
|
||||||
|
__suffix_{make_shared<vector<difference_type>>(__pattern_length_ + 1)}
|
||||||
|
{
|
||||||
|
// build the skip table
|
||||||
|
for ( difference_type __i = 0; __f != __l; ++__f, (void) ++__i )
|
||||||
|
__skip_->insert(*__f, __i);
|
||||||
|
|
||||||
|
this->__build_suffix_table ( __first_, __last_, __pred_ );
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename _RandomAccessIterator2>
|
||||||
|
pair<_RandomAccessIterator2, _RandomAccessIterator2>
|
||||||
|
operator ()(_RandomAccessIterator2 __f, _RandomAccessIterator2 __l) const
|
||||||
|
{
|
||||||
|
static_assert ( std::is_same<
|
||||||
|
typename std::decay<typename std::iterator_traits<_RandomAccessIterator1>::value_type>::type,
|
||||||
|
typename std::decay<typename std::iterator_traits<_RandomAccessIterator2>::value_type>::type
|
||||||
|
>::value,
|
||||||
|
"Corpus and Pattern iterators must point to the same type" );
|
||||||
|
|
||||||
|
if (__f == __l ) return make_pair(__l, __l); // empty corpus
|
||||||
|
if (__first_ == __last_) return make_pair(__f, __f); // empty pattern
|
||||||
|
|
||||||
|
// If the pattern is larger than the corpus, we can't find it!
|
||||||
|
if ( __pattern_length_ > _VSTD::distance (__f, __l))
|
||||||
|
return make_pair(__l, __l);
|
||||||
|
|
||||||
|
// Do the search
|
||||||
|
return this->__search(__f, __l);
|
||||||
|
}
|
||||||
|
|
||||||
|
public: // TODO private:
|
||||||
|
_RandomAccessIterator1 __first_;
|
||||||
|
_RandomAccessIterator1 __last_;
|
||||||
|
_BinaryPredicate __pred_;
|
||||||
|
difference_type __pattern_length_;
|
||||||
|
shared_ptr<skip_table_type> __skip_;
|
||||||
|
shared_ptr<vector<difference_type>> __suffix_;
|
||||||
|
|
||||||
|
template <typename _RandomAccessIterator2>
|
||||||
|
pair<_RandomAccessIterator2, _RandomAccessIterator2>
|
||||||
|
__search(_RandomAccessIterator2 __f, _RandomAccessIterator2 __l) const
|
||||||
|
{
|
||||||
|
_RandomAccessIterator2 __cur = __f;
|
||||||
|
const _RandomAccessIterator2 __last = __l - __pattern_length_;
|
||||||
|
const skip_table_type & __skip = *__skip_.get();
|
||||||
|
const vector<difference_type> & __suffix = *__suffix_.get();
|
||||||
|
|
||||||
|
while (__cur <= __last)
|
||||||
|
{
|
||||||
|
|
||||||
|
// Do we match right where we are?
|
||||||
|
difference_type __j = __pattern_length_;
|
||||||
|
while (__pred_(__first_ [__j-1], __cur [__j-1])) {
|
||||||
|
__j--;
|
||||||
|
// We matched - we're done!
|
||||||
|
if ( __j == 0 )
|
||||||
|
return make_pair(__cur, __cur + __pattern_length_);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Since we didn't match, figure out how far to skip forward
|
||||||
|
difference_type __k = __skip[__cur [ __j - 1 ]];
|
||||||
|
difference_type __m = __j - __k - 1;
|
||||||
|
if (__k < __j && __m > __suffix[ __j ])
|
||||||
|
__cur += __m;
|
||||||
|
else
|
||||||
|
__cur += __suffix[ __j ];
|
||||||
|
}
|
||||||
|
|
||||||
|
return make_pair(__l, __l); // We didn't find anything
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<typename _Iterator, typename _Container>
|
||||||
|
void __compute_bm_prefix ( _Iterator __f, _Iterator __l, _BinaryPredicate __pred, _Container &__prefix )
|
||||||
|
{
|
||||||
|
const std::size_t __count = _VSTD::distance(__f, __l);
|
||||||
|
|
||||||
|
__prefix[0] = 0;
|
||||||
|
std::size_t __k = 0;
|
||||||
|
for ( std::size_t __i = 1; __i < __count; ++__i )
|
||||||
|
{
|
||||||
|
while ( __k > 0 && !__pred ( __f[__k], __f[__i] ))
|
||||||
|
__k = __prefix [ __k - 1 ];
|
||||||
|
|
||||||
|
if ( __pred ( __f[__k], __f[__i] ))
|
||||||
|
__k++;
|
||||||
|
__prefix [ __i ] = __k;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void __build_suffix_table(_RandomAccessIterator1 __f, _RandomAccessIterator1 __l,
|
||||||
|
_BinaryPredicate __pred)
|
||||||
|
{
|
||||||
|
const std::size_t __count = _VSTD::distance(__f, __l);
|
||||||
|
vector<difference_type> & __suffix = *__suffix_.get();
|
||||||
|
if (__count > 0)
|
||||||
|
{
|
||||||
|
_VSTD::vector<value_type> __scratch(__count);
|
||||||
|
|
||||||
|
__compute_bm_prefix(__f, __l, __pred, __scratch);
|
||||||
|
for ( std::size_t __i = 0; __i <= __count; __i++ )
|
||||||
|
__suffix[__i] = __count - __scratch[__count-1];
|
||||||
|
|
||||||
|
typedef _VSTD::reverse_iterator<_RandomAccessIterator1> _RevIter;
|
||||||
|
__compute_bm_prefix(_RevIter(__l), _RevIter(__f), __pred, __scratch);
|
||||||
|
|
||||||
|
for ( std::size_t __i = 0; __i < __count; __i++ )
|
||||||
|
{
|
||||||
|
const std::size_t __j = __count - __scratch[__i];
|
||||||
|
const difference_type __k = __i - __scratch[__i] + 1;
|
||||||
|
|
||||||
|
if (__suffix[__j] > __k)
|
||||||
|
__suffix[__j] = __k;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
template<class _RandomAccessIterator,
|
||||||
|
class _Hash = hash<typename iterator_traits<_RandomAccessIterator>::value_type>,
|
||||||
|
class _BinaryPredicate = equal_to<>>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
boyer_moore_searcher<_RandomAccessIterator, _Hash, _BinaryPredicate>
|
||||||
|
make_boyer_moore_searcher( _RandomAccessIterator __f, _RandomAccessIterator __l,
|
||||||
|
_Hash __hf = _Hash(), _BinaryPredicate __p = _BinaryPredicate ())
|
||||||
|
{
|
||||||
|
return boyer_moore_searcher<_RandomAccessIterator, _Hash, _BinaryPredicate>(__f, __l, __hf, __p);
|
||||||
|
}
|
||||||
|
|
||||||
|
// boyer-moore-horspool
|
||||||
|
template <class _RandomAccessIterator1,
|
||||||
|
class _Hash = hash<typename iterator_traits<_RandomAccessIterator1>::value_type>,
|
||||||
|
class _BinaryPredicate = equal_to<>>
|
||||||
|
_LIBCPP_TYPE_VIS
|
||||||
|
class boyer_moore_horspool_searcher {
|
||||||
|
private:
|
||||||
|
typedef typename std::iterator_traits<_RandomAccessIterator1>::difference_type difference_type;
|
||||||
|
typedef typename std::iterator_traits<_RandomAccessIterator1>::value_type value_type;
|
||||||
|
typedef _BMSkipTable<value_type, difference_type, _Hash, _BinaryPredicate,
|
||||||
|
_VSTD::is_integral<value_type>::value && // what about enums?
|
||||||
|
sizeof(value_type) == 1 &&
|
||||||
|
is_same<_Hash, hash<value_type>>::value &&
|
||||||
|
is_same<_BinaryPredicate, equal_to<>>::value
|
||||||
|
> skip_table_type;
|
||||||
|
|
||||||
|
public:
|
||||||
|
boyer_moore_horspool_searcher(_RandomAccessIterator1 __f, _RandomAccessIterator1 __l,
|
||||||
|
_Hash __hf = _Hash(), _BinaryPredicate __pred = _BinaryPredicate())
|
||||||
|
: __first_(__f), __last_(__l), __pred_(__pred),
|
||||||
|
__pattern_length_(_VSTD::distance(__first_, __last_)),
|
||||||
|
__skip_{_VSTD::make_shared<skip_table_type>(__pattern_length_, __pattern_length_, __hf, __pred_)}
|
||||||
|
{
|
||||||
|
// build the skip table
|
||||||
|
if ( __f != __l )
|
||||||
|
{
|
||||||
|
__l = __l - 1;
|
||||||
|
for ( difference_type __i = 0; __f != __l; ++__f, (void) ++__i )
|
||||||
|
__skip_->insert(*__f, __pattern_length_ - 1 - __i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename _RandomAccessIterator2>
|
||||||
|
pair<_RandomAccessIterator2, _RandomAccessIterator2>
|
||||||
|
operator ()(_RandomAccessIterator2 __f, _RandomAccessIterator2 __l) const
|
||||||
|
{
|
||||||
|
static_assert ( std::is_same<
|
||||||
|
typename std::decay<typename std::iterator_traits<_RandomAccessIterator1>::value_type>::type,
|
||||||
|
typename std::decay<typename std::iterator_traits<_RandomAccessIterator2>::value_type>::type
|
||||||
|
>::value,
|
||||||
|
"Corpus and Pattern iterators must point to the same type" );
|
||||||
|
|
||||||
|
if (__f == __l ) return make_pair(__l, __l); // empty corpus
|
||||||
|
if (__first_ == __last_) return make_pair(__f, __f); // empty pattern
|
||||||
|
|
||||||
|
// If the pattern is larger than the corpus, we can't find it!
|
||||||
|
if ( __pattern_length_ > _VSTD::distance (__f, __l))
|
||||||
|
return make_pair(__l, __l);
|
||||||
|
|
||||||
|
// Do the search
|
||||||
|
return this->__search(__f, __l);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
_RandomAccessIterator1 __first_;
|
||||||
|
_RandomAccessIterator1 __last_;
|
||||||
|
_BinaryPredicate __pred_;
|
||||||
|
difference_type __pattern_length_;
|
||||||
|
shared_ptr<skip_table_type> __skip_;
|
||||||
|
|
||||||
|
template <typename _RandomAccessIterator2>
|
||||||
|
pair<_RandomAccessIterator2, _RandomAccessIterator2>
|
||||||
|
__search ( _RandomAccessIterator2 __f, _RandomAccessIterator2 __l ) const {
|
||||||
|
_RandomAccessIterator2 __cur = __f;
|
||||||
|
const _RandomAccessIterator2 __last = __l - __pattern_length_;
|
||||||
|
const skip_table_type & __skip = *__skip_.get();
|
||||||
|
|
||||||
|
while (__cur <= __last)
|
||||||
|
{
|
||||||
|
// Do we match right where we are?
|
||||||
|
difference_type __j = __pattern_length_;
|
||||||
|
while (__pred_(__first_[__j-1], __cur[__j-1]))
|
||||||
|
{
|
||||||
|
__j--;
|
||||||
|
// We matched - we're done!
|
||||||
|
if ( __j == 0 )
|
||||||
|
return make_pair(__cur, __cur + __pattern_length_);
|
||||||
|
}
|
||||||
|
__cur += __skip[__cur[__pattern_length_-1]];
|
||||||
|
}
|
||||||
|
|
||||||
|
return make_pair(__l, __l);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<class _RandomAccessIterator,
|
||||||
|
class _Hash = hash<typename iterator_traits<_RandomAccessIterator>::value_type>,
|
||||||
|
class _BinaryPredicate = equal_to<>>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
boyer_moore_horspool_searcher<_RandomAccessIterator, _Hash, _BinaryPredicate>
|
||||||
|
make_boyer_moore_horspool_searcher( _RandomAccessIterator __f, _RandomAccessIterator __l,
|
||||||
|
_Hash __hf = _Hash(), _BinaryPredicate __p = _BinaryPredicate ())
|
||||||
|
{
|
||||||
|
return boyer_moore_horspool_searcher<_RandomAccessIterator, _Hash, _BinaryPredicate>(__f, __l, __hf, __p);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // _LIBCPP_STD_VER > 11
|
||||||
|
|
||||||
_LIBCPP_END_NAMESPACE_LFTS
|
_LIBCPP_END_NAMESPACE_LFTS
|
||||||
|
|
||||||
|
|||||||
114
include/experimental/iterator
Normal file
114
include/experimental/iterator
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
//===----------------------------- iterator -------------------------------===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#ifndef _LIBCPP_EXPERIMENTAL_ITERATOR
|
||||||
|
#define _LIBCPP_EXPERIMENTAL_ITERATOR
|
||||||
|
|
||||||
|
/*
|
||||||
|
namespace std {
|
||||||
|
namespace experimental {
|
||||||
|
inline namespace fundamentals_v2 {
|
||||||
|
|
||||||
|
template <class DelimT, class charT = char, class traits = char_traits<charT>>
|
||||||
|
class ostream_joiner {
|
||||||
|
public:
|
||||||
|
typedef charT char_type;
|
||||||
|
typedef traits traits_type;
|
||||||
|
typedef basic_ostream<charT, traits> ostream_type;
|
||||||
|
typedef output_iterator_tag iterator_category;
|
||||||
|
typedef void value_type;
|
||||||
|
typedef void difference_type;
|
||||||
|
typedef void pointer;
|
||||||
|
typedef void reference;
|
||||||
|
|
||||||
|
ostream_joiner(ostream_type& s, const DelimT& delimiter);
|
||||||
|
ostream_joiner(ostream_type& s, DelimT&& delimiter);
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
ostream_joiner& operator=(const T& value);
|
||||||
|
|
||||||
|
ostream_joiner& operator*() noexcept;
|
||||||
|
ostream_joiner& operator++() noexcept;
|
||||||
|
ostream_joiner& operator++(int) noexcept;
|
||||||
|
private:
|
||||||
|
ostream_type* out_stream; // exposition only
|
||||||
|
DelimT delim; // exposition only
|
||||||
|
bool first_element; // exposition only
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class charT, class traits, class DelimT>
|
||||||
|
ostream_joiner<decay_t<DelimT>, charT, traits>
|
||||||
|
make_ostream_joiner(basic_ostream<charT, traits>& os, DelimT&& delimiter);
|
||||||
|
|
||||||
|
} // inline namespace fundamentals_v2
|
||||||
|
} // namespace experimental
|
||||||
|
} // namespace std
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <experimental/__config>
|
||||||
|
|
||||||
|
#if _LIBCPP_STD_VER > 11
|
||||||
|
|
||||||
|
#include <iterator>
|
||||||
|
|
||||||
|
_LIBCPP_BEGIN_NAMESPACE_LFTS
|
||||||
|
|
||||||
|
template <class _Delim, class _CharT = char, class _Traits = char_traits<_CharT>>
|
||||||
|
class ostream_joiner {
|
||||||
|
public:
|
||||||
|
|
||||||
|
typedef _CharT char_type;
|
||||||
|
typedef _Traits traits_type;
|
||||||
|
typedef basic_ostream<char_type,traits_type> ostream_type;
|
||||||
|
typedef output_iterator_tag iterator_category;
|
||||||
|
typedef void value_type;
|
||||||
|
typedef void difference_type;
|
||||||
|
typedef void pointer;
|
||||||
|
typedef void reference;
|
||||||
|
|
||||||
|
ostream_joiner(ostream_type& __os, _Delim&& __d)
|
||||||
|
: __out(_VSTD::addressof(__os)), __delim(_VSTD::move(__d)), __first(true) {}
|
||||||
|
|
||||||
|
ostream_joiner(ostream_type& __os, const _Delim& __d)
|
||||||
|
: __out(_VSTD::addressof(__os)), __delim(__d), __first(true) {}
|
||||||
|
|
||||||
|
|
||||||
|
template<typename _Tp>
|
||||||
|
ostream_joiner& operator=(const _Tp& __v)
|
||||||
|
{
|
||||||
|
if (!__first)
|
||||||
|
*__out << __delim;
|
||||||
|
__first = false;
|
||||||
|
*__out << __v;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
ostream_joiner& operator*() _NOEXCEPT { return *this; }
|
||||||
|
ostream_joiner& operator++() _NOEXCEPT { return *this; }
|
||||||
|
ostream_joiner& operator++(int) _NOEXCEPT { return *this; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
ostream_type* __out;
|
||||||
|
_Delim __delim;
|
||||||
|
bool __first;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
template <class _CharT, class _Traits, class _Delim>
|
||||||
|
ostream_joiner<typename decay<_Delim>::type, _CharT, _Traits>
|
||||||
|
make_ostream_joiner(basic_ostream<_CharT, _Traits>& __os, _Delim && __d)
|
||||||
|
{ return ostream_joiner<typename decay<_Delim>::type, _CharT, _Traits>(__os, _VSTD::forward<_Delim>(__d)); }
|
||||||
|
|
||||||
|
_LIBCPP_END_NAMESPACE_LFTS
|
||||||
|
|
||||||
|
#endif /* _LIBCPP_STD_VER > 11 */
|
||||||
|
|
||||||
|
#endif // _LIBCPP_EXPERIMENTAL_ITERATOR
|
||||||
47
include/experimental/list
Normal file
47
include/experimental/list
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
//===--------------------------- list ------------------------------------===//
|
||||||
|
//
|
||||||
|
// 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_LIST
|
||||||
|
#define _LIBCPP_EXPERIMENTAL_LIST
|
||||||
|
/*
|
||||||
|
experimental/list synopsis
|
||||||
|
|
||||||
|
// C++1z
|
||||||
|
namespace std {
|
||||||
|
namespace experimental {
|
||||||
|
inline namespace fundamentals_v1 {
|
||||||
|
namespace pmr {
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
using list = std::list<T,polymorphic_allocator<T>>;
|
||||||
|
|
||||||
|
} // namespace pmr
|
||||||
|
} // namespace fundamentals_v1
|
||||||
|
} // namespace experimental
|
||||||
|
} // namespace std
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <experimental/__config>
|
||||||
|
#include <list>
|
||||||
|
#include <experimental/memory_resource>
|
||||||
|
|
||||||
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||||
|
#pragma GCC system_header
|
||||||
|
#endif
|
||||||
|
|
||||||
|
_LIBCPP_BEGIN_NAMESPACE_LFTS_PMR
|
||||||
|
|
||||||
|
template <class _ValueT>
|
||||||
|
using list = _VSTD::list<_ValueT, polymorphic_allocator<_ValueT>>;
|
||||||
|
|
||||||
|
_LIBCPP_END_NAMESPACE_LFTS_PMR
|
||||||
|
|
||||||
|
#endif /* _LIBCPP_EXPERIMENTAL_LIST */
|
||||||
57
include/experimental/map
Normal file
57
include/experimental/map
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
//===----------------------------- map ------------------------------------===//
|
||||||
|
//
|
||||||
|
// 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_MAP
|
||||||
|
#define _LIBCPP_EXPERIMENTAL_MAP
|
||||||
|
/*
|
||||||
|
experimental/map synopsis
|
||||||
|
|
||||||
|
// C++1z
|
||||||
|
namespace std {
|
||||||
|
namespace experimental {
|
||||||
|
inline namespace fundamentals_v1 {
|
||||||
|
namespace pmr {
|
||||||
|
|
||||||
|
template <class Key, class T, class Compare = less<Key>>
|
||||||
|
using map = std::map<Key, T, Compare,
|
||||||
|
polymorphic_allocator<pair<const Key,T>>>;
|
||||||
|
|
||||||
|
template <class Key, class T, class Compare = less<Key>>
|
||||||
|
using multimap = std::multimap<Key, T, Compare,
|
||||||
|
polymorphic_allocator<pair<const Key,T>>>;
|
||||||
|
|
||||||
|
} // namespace pmr
|
||||||
|
} // namespace fundamentals_v1
|
||||||
|
} // namespace experimental
|
||||||
|
} // namespace std
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <experimental/__config>
|
||||||
|
#include <map>
|
||||||
|
#include <experimental/memory_resource>
|
||||||
|
|
||||||
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||||
|
#pragma GCC system_header
|
||||||
|
#endif
|
||||||
|
|
||||||
|
_LIBCPP_BEGIN_NAMESPACE_LFTS_PMR
|
||||||
|
|
||||||
|
template <class _Key, class _Value, class _Compare = less<_Key>>
|
||||||
|
using map = _VSTD::map<_Key, _Value, _Compare,
|
||||||
|
polymorphic_allocator<pair<const _Key, _Value>>>;
|
||||||
|
|
||||||
|
template <class _Key, class _Value, class _Compare = less<_Key>>
|
||||||
|
using multimap = _VSTD::multimap<_Key, _Value, _Compare,
|
||||||
|
polymorphic_allocator<pair<const _Key, _Value>>>;
|
||||||
|
|
||||||
|
_LIBCPP_END_NAMESPACE_LFTS_PMR
|
||||||
|
|
||||||
|
#endif /* _LIBCPP_EXPERIMENTAL_MAP */
|
||||||
422
include/experimental/memory_resource
Normal file
422
include/experimental/memory_resource
Normal file
@@ -0,0 +1,422 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
//===------------------------ memory_resource -----------------------------===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#ifndef _LIBCPP_EXPERIMENTAL_MEMORY_RESOURCE
|
||||||
|
#define _LIBCPP_EXPERIMENTAL_MEMORY_RESOURCE
|
||||||
|
|
||||||
|
/**
|
||||||
|
experimental/memory_resource synopsis
|
||||||
|
|
||||||
|
// C++1y
|
||||||
|
|
||||||
|
namespace std {
|
||||||
|
namespace experimental {
|
||||||
|
inline namespace fundamentals_v1 {
|
||||||
|
namespace pmr {
|
||||||
|
|
||||||
|
class memory_resource;
|
||||||
|
|
||||||
|
bool operator==(const memory_resource& a,
|
||||||
|
const memory_resource& b) noexcept;
|
||||||
|
bool operator!=(const memory_resource& a,
|
||||||
|
const memory_resource& b) noexcept;
|
||||||
|
|
||||||
|
template <class Tp> class polymorphic_allocator;
|
||||||
|
|
||||||
|
template <class T1, class T2>
|
||||||
|
bool operator==(const polymorphic_allocator<T1>& a,
|
||||||
|
const polymorphic_allocator<T2>& b) noexcept;
|
||||||
|
template <class T1, class T2>
|
||||||
|
bool operator!=(const polymorphic_allocator<T1>& a,
|
||||||
|
const polymorphic_allocator<T2>& b) noexcept;
|
||||||
|
|
||||||
|
// The name resource_adaptor_imp is for exposition only.
|
||||||
|
template <class Allocator> class resource_adaptor_imp;
|
||||||
|
|
||||||
|
template <class Allocator>
|
||||||
|
using resource_adaptor = resource_adaptor_imp<
|
||||||
|
allocator_traits<Allocator>::rebind_alloc<char>>;
|
||||||
|
|
||||||
|
// Global memory resources
|
||||||
|
memory_resource* new_delete_resource() noexcept;
|
||||||
|
memory_resource* null_memory_resource() noexcept;
|
||||||
|
|
||||||
|
// The default memory resource
|
||||||
|
memory_resource* set_default_resource(memory_resource* r) noexcept;
|
||||||
|
memory_resource* get_default_resource() noexcept;
|
||||||
|
|
||||||
|
// Standard memory resources
|
||||||
|
struct pool_options;
|
||||||
|
class synchronized_pool_resource;
|
||||||
|
class unsynchronized_pool_resource;
|
||||||
|
class monotonic_buffer_resource;
|
||||||
|
|
||||||
|
} // namespace pmr
|
||||||
|
} // namespace fundamentals_v1
|
||||||
|
} // namespace experimental
|
||||||
|
} // namespace std
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <experimental/__config>
|
||||||
|
#include <experimental/__memory>
|
||||||
|
#include <limits>
|
||||||
|
#include <memory>
|
||||||
|
#include <new>
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <tuple>
|
||||||
|
#include <type_traits>
|
||||||
|
#include <utility>
|
||||||
|
#include <cstddef>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <__debug>
|
||||||
|
|
||||||
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||||
|
#pragma GCC system_header
|
||||||
|
#endif
|
||||||
|
|
||||||
|
_LIBCPP_BEGIN_NAMESPACE_LFTS_PMR
|
||||||
|
|
||||||
|
// Round __s up to next multiple of __a.
|
||||||
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
|
size_t __aligned_allocation_size(size_t __s, size_t __a) _NOEXCEPT
|
||||||
|
{
|
||||||
|
_LIBCPP_ASSERT(__s + __a > __s, "aligned allocation size overflows");
|
||||||
|
return (__s + __a - 1) & ~(__a - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 8.5, memory.resource
|
||||||
|
class _LIBCPP_TYPE_VIS_ONLY memory_resource
|
||||||
|
{
|
||||||
|
static const size_t __max_align = alignof(max_align_t);
|
||||||
|
|
||||||
|
// 8.5.2, memory.resource.public
|
||||||
|
public:
|
||||||
|
virtual ~memory_resource() = default;
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
void* allocate(size_t __bytes, size_t __align = __max_align)
|
||||||
|
{ return do_allocate(__bytes, __align); }
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
void deallocate(void * __p, size_t __bytes, size_t __align = __max_align)
|
||||||
|
{ do_deallocate(__p, __bytes, __align); }
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
bool is_equal(memory_resource const & __other) const _NOEXCEPT
|
||||||
|
{ return do_is_equal(__other); }
|
||||||
|
|
||||||
|
// 8.5.3, memory.resource.priv
|
||||||
|
protected:
|
||||||
|
virtual void* do_allocate(size_t, size_t) = 0;
|
||||||
|
virtual void do_deallocate(void*, size_t, size_t) = 0;
|
||||||
|
virtual bool do_is_equal(memory_resource const &) const _NOEXCEPT = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
// 8.5.4, memory.resource.eq
|
||||||
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
|
bool operator==(memory_resource const & __lhs,
|
||||||
|
memory_resource const & __rhs) _NOEXCEPT
|
||||||
|
{
|
||||||
|
return &__lhs == &__rhs || __lhs.is_equal(__rhs);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
|
bool operator!=(memory_resource const & __lhs,
|
||||||
|
memory_resource const & __rhs) _NOEXCEPT
|
||||||
|
{
|
||||||
|
return !(__lhs == __rhs);
|
||||||
|
}
|
||||||
|
|
||||||
|
_LIBCPP_FUNC_VIS
|
||||||
|
memory_resource * new_delete_resource() _NOEXCEPT;
|
||||||
|
|
||||||
|
_LIBCPP_FUNC_VIS
|
||||||
|
memory_resource * null_memory_resource() _NOEXCEPT;
|
||||||
|
|
||||||
|
_LIBCPP_FUNC_VIS
|
||||||
|
memory_resource * get_default_resource() _NOEXCEPT;
|
||||||
|
|
||||||
|
_LIBCPP_FUNC_VIS
|
||||||
|
memory_resource * set_default_resource(memory_resource * __new_res) _NOEXCEPT;
|
||||||
|
|
||||||
|
// 8.6, memory.polymorphic.allocator.class
|
||||||
|
|
||||||
|
// 8.6.1, memory.polymorphic.allocator.overview
|
||||||
|
template <class _ValueType>
|
||||||
|
class _LIBCPP_TYPE_VIS_ONLY polymorphic_allocator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef _ValueType value_type;
|
||||||
|
|
||||||
|
// 8.6.2, memory.polymorphic.allocator.ctor
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
polymorphic_allocator() _NOEXCEPT
|
||||||
|
: __res_(_VSTD_LFTS_PMR::get_default_resource())
|
||||||
|
{}
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
polymorphic_allocator(memory_resource * __r) _NOEXCEPT
|
||||||
|
: __res_(__r)
|
||||||
|
{}
|
||||||
|
|
||||||
|
polymorphic_allocator(polymorphic_allocator const &) = default;
|
||||||
|
|
||||||
|
template <class _Tp>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
polymorphic_allocator(polymorphic_allocator<_Tp> const & __other) _NOEXCEPT
|
||||||
|
: __res_(__other.resource())
|
||||||
|
{}
|
||||||
|
|
||||||
|
polymorphic_allocator &
|
||||||
|
operator=(polymorphic_allocator const &) = default;
|
||||||
|
|
||||||
|
// 8.6.3, memory.polymorphic.allocator.mem
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
_ValueType* allocate(size_t __n) {
|
||||||
|
if (__n > max_size()) {
|
||||||
|
__libcpp_throw(length_error(
|
||||||
|
"std::experimental::pmr::polymorphic_allocator<T>::allocate(size_t n)"
|
||||||
|
" 'n' exceeds maximum supported size"));
|
||||||
|
}
|
||||||
|
return static_cast<_ValueType*>(
|
||||||
|
__res_->allocate(__n * sizeof(_ValueType), alignof(_ValueType))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
void deallocate(_ValueType * __p, size_t __n) _NOEXCEPT {
|
||||||
|
_LIBCPP_ASSERT(__n <= max_size(),
|
||||||
|
"deallocate called for size which exceeds max_size()");
|
||||||
|
__res_->deallocate(__p, __n * sizeof(_ValueType), alignof(_ValueType));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _Tp, class ..._Ts>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
void construct(_Tp* __p, _Ts &&... __args)
|
||||||
|
{
|
||||||
|
_VSTD_LFTS::__lfts_user_alloc_construct(
|
||||||
|
__p, resource(), _VSTD::forward<_Ts>(__args)...
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _T1, class _T2, class ..._Args1, class ..._Args2>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
void construct(pair<_T1, _T2>* __p, piecewise_construct_t,
|
||||||
|
tuple<_Args1...> __x, tuple<_Args2...> __y)
|
||||||
|
{
|
||||||
|
::new ((void*)__p) pair<_T1, _T2>(piecewise_construct
|
||||||
|
, __transform_tuple(
|
||||||
|
typename __lfts_uses_alloc_ctor<
|
||||||
|
_T1, memory_resource*, _Args1...
|
||||||
|
>::type()
|
||||||
|
, _VSTD::move(__x)
|
||||||
|
, typename __make_tuple_indices<sizeof...(_Args1)>::type{}
|
||||||
|
)
|
||||||
|
, __transform_tuple(
|
||||||
|
typename __lfts_uses_alloc_ctor<
|
||||||
|
_T2, memory_resource*, _Args2...
|
||||||
|
>::type()
|
||||||
|
, _VSTD::move(__y)
|
||||||
|
, typename __make_tuple_indices<sizeof...(_Args2)>::type{}
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _T1, class _T2>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
void construct(pair<_T1, _T2>* __p) {
|
||||||
|
construct(__p, piecewise_construct, tuple<>(), tuple<>());
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _T1, class _T2, class _Up, class _Vp>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
void construct(pair<_T1, _T2> * __p, _Up && __u, _Vp && __v) {
|
||||||
|
construct(__p, piecewise_construct
|
||||||
|
, _VSTD::forward_as_tuple(_VSTD::forward<_Up>(__u))
|
||||||
|
, _VSTD::forward_as_tuple(_VSTD::forward<_Vp>(__v)));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _T1, class _T2, class _U1, class _U2>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
void construct(pair<_T1, _T2> * __p, pair<_U1, _U2> const & __pr) {
|
||||||
|
construct(__p, piecewise_construct
|
||||||
|
, _VSTD::forward_as_tuple(__pr.first)
|
||||||
|
, _VSTD::forward_as_tuple(__pr.second));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _T1, class _T2, class _U1, class _U2>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
void construct(pair<_T1, _T2> * __p, pair<_U1, _U2> && __pr){
|
||||||
|
construct(__p, piecewise_construct
|
||||||
|
, _VSTD::forward_as_tuple(_VSTD::forward<_U1>(__pr.first))
|
||||||
|
, _VSTD::forward_as_tuple(_VSTD::forward<_U2>(__pr.second)));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _Tp>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
void destroy(_Tp * __p) _NOEXCEPT
|
||||||
|
{ __p->~_Tp(); }
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
size_t max_size() const _NOEXCEPT
|
||||||
|
{ return numeric_limits<size_t>::max() / sizeof(value_type); }
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
polymorphic_allocator
|
||||||
|
select_on_container_copy_construction() const _NOEXCEPT
|
||||||
|
{ return polymorphic_allocator(); }
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
memory_resource * resource() const _NOEXCEPT
|
||||||
|
{ return __res_; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
template <class ..._Args, size_t ..._Idx>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
tuple<_Args&&...>
|
||||||
|
__transform_tuple(integral_constant<int, 0>, tuple<_Args...>&& __t,
|
||||||
|
__tuple_indices<_Idx...>) const
|
||||||
|
{
|
||||||
|
return _VSTD::forward_as_tuple(_VSTD::get<_Idx>(_VSTD::move(__t))...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class ..._Args, size_t ..._Idx>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
tuple<allocator_arg_t const&, memory_resource*, _Args&&...>
|
||||||
|
__transform_tuple(integral_constant<int, 1>, tuple<_Args...> && __t,
|
||||||
|
__tuple_indices<_Idx...>) const
|
||||||
|
{
|
||||||
|
using _Tup = tuple<allocator_arg_t const&, memory_resource*, _Args&&...>;
|
||||||
|
return _Tup(allocator_arg, resource(),
|
||||||
|
_VSTD::get<_Idx>(_VSTD::move(__t))...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class ..._Args, size_t ..._Idx>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
tuple<_Args&&..., memory_resource*>
|
||||||
|
__transform_tuple(integral_constant<int, 2>, tuple<_Args...> && __t,
|
||||||
|
__tuple_indices<_Idx...>) const
|
||||||
|
{
|
||||||
|
using _Tup = tuple<_Args&&..., memory_resource*>;
|
||||||
|
return _Tup(_VSTD::get<_Idx>(_VSTD::move(__t))..., resource());
|
||||||
|
}
|
||||||
|
|
||||||
|
memory_resource * __res_;
|
||||||
|
};
|
||||||
|
|
||||||
|
// 8.6.4, memory.polymorphic.allocator.eq
|
||||||
|
|
||||||
|
template <class _Tp, class _Up>
|
||||||
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
|
bool operator==(polymorphic_allocator<_Tp> const & __lhs,
|
||||||
|
polymorphic_allocator<_Up> const & __rhs) _NOEXCEPT
|
||||||
|
{
|
||||||
|
return *__lhs.resource() == *__rhs.resource();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _Tp, class _Up>
|
||||||
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
|
bool operator!=(polymorphic_allocator<_Tp> const & __lhs,
|
||||||
|
polymorphic_allocator<_Up> const & __rhs) _NOEXCEPT
|
||||||
|
{
|
||||||
|
return !(__lhs == __rhs);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 8.7, memory.resource.adaptor
|
||||||
|
|
||||||
|
// 8.7.1, memory.resource.adaptor.overview
|
||||||
|
template <class _CharAlloc>
|
||||||
|
class _LIBCPP_TYPE_VIS_ONLY __resource_adaptor_imp
|
||||||
|
: public memory_resource
|
||||||
|
{
|
||||||
|
using _CTraits = allocator_traits<_CharAlloc>;
|
||||||
|
static_assert(is_same<typename _CTraits::value_type, char>::value
|
||||||
|
&& is_same<typename _CTraits::pointer, char*>::value
|
||||||
|
&& is_same<typename _CTraits::void_pointer, void*>::value, "");
|
||||||
|
|
||||||
|
static const size_t _MaxAlign = alignof(max_align_t);
|
||||||
|
|
||||||
|
using _Alloc = typename _CTraits::template rebind_alloc<
|
||||||
|
typename aligned_storage<_MaxAlign, _MaxAlign>::type
|
||||||
|
>;
|
||||||
|
|
||||||
|
using _ValueType = typename _Alloc::value_type;
|
||||||
|
|
||||||
|
_Alloc __alloc_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
typedef _CharAlloc allocator_type;
|
||||||
|
|
||||||
|
__resource_adaptor_imp() = default;
|
||||||
|
__resource_adaptor_imp(__resource_adaptor_imp const &) = default;
|
||||||
|
__resource_adaptor_imp(__resource_adaptor_imp &&) = default;
|
||||||
|
|
||||||
|
// 8.7.2, memory.resource.adaptor.ctor
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
explicit __resource_adaptor_imp(allocator_type const & __a)
|
||||||
|
: __alloc_(__a)
|
||||||
|
{}
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
explicit __resource_adaptor_imp(allocator_type && __a)
|
||||||
|
: __alloc_(_VSTD::move(__a))
|
||||||
|
{}
|
||||||
|
|
||||||
|
__resource_adaptor_imp &
|
||||||
|
operator=(__resource_adaptor_imp const &) = default;
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
allocator_type get_allocator() const
|
||||||
|
{ return __alloc_; }
|
||||||
|
|
||||||
|
// 8.7.3, memory.resource.adaptor.mem
|
||||||
|
protected:
|
||||||
|
virtual void * do_allocate(size_t __bytes, size_t)
|
||||||
|
{
|
||||||
|
if (__bytes > __max_size()) {
|
||||||
|
__libcpp_throw(length_error(
|
||||||
|
"std::experimental::pmr::resource_adaptor<T>::do_allocate(size_t bytes, size_t align)"
|
||||||
|
" 'bytes' exceeds maximum supported size"));
|
||||||
|
}
|
||||||
|
size_t __s = __aligned_allocation_size(__bytes, _MaxAlign) / _MaxAlign;
|
||||||
|
return __alloc_.allocate(__s);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void do_deallocate(void * __p, size_t __bytes, size_t)
|
||||||
|
{
|
||||||
|
_LIBCPP_ASSERT(__bytes <= __max_size(),
|
||||||
|
"do_deallocate called for size which exceeds the maximum allocation size");
|
||||||
|
size_t __s = __aligned_allocation_size(__bytes, _MaxAlign) / _MaxAlign;
|
||||||
|
__alloc_.deallocate((_ValueType*)__p, __s);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool do_is_equal(memory_resource const & __other) const _NOEXCEPT {
|
||||||
|
__resource_adaptor_imp const * __p
|
||||||
|
= dynamic_cast<__resource_adaptor_imp const *>(&__other);
|
||||||
|
return __p ? __alloc_ == __p->__alloc_ : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
size_t __max_size() const _NOEXCEPT {
|
||||||
|
return numeric_limits<size_t>::max() - _MaxAlign;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class _Alloc>
|
||||||
|
using resource_adaptor = __resource_adaptor_imp<
|
||||||
|
typename allocator_traits<_Alloc>::template rebind_alloc<char>
|
||||||
|
>;
|
||||||
|
|
||||||
|
_LIBCPP_END_NAMESPACE_LFTS_PMR
|
||||||
|
|
||||||
|
#endif /* _LIBCPP_EXPERIMENTAL_MEMORY_RESOURCE */
|
||||||
62
include/experimental/regex
Normal file
62
include/experimental/regex
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
//===----------------------------- regex ----------------------------------===//
|
||||||
|
//
|
||||||
|
// 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_REGEX
|
||||||
|
#define _LIBCPP_EXPERIMENTAL_REGEX
|
||||||
|
/*
|
||||||
|
experimental/regex synopsis
|
||||||
|
|
||||||
|
// C++1z
|
||||||
|
namespace std {
|
||||||
|
namespace experimental {
|
||||||
|
inline namespace fundamentals_v1 {
|
||||||
|
namespace pmr {
|
||||||
|
|
||||||
|
template <class BidirectionalIterator>
|
||||||
|
using match_results =
|
||||||
|
std::match_results<BidirectionalIterator,
|
||||||
|
polymorphic_allocator<sub_match<BidirectionalIterator>>>;
|
||||||
|
|
||||||
|
typedef match_results<const char*> cmatch;
|
||||||
|
typedef match_results<const wchar_t*> wcmatch;
|
||||||
|
typedef match_results<string::const_iterator> smatch;
|
||||||
|
typedef match_results<wstring::const_iterator> wsmatch;
|
||||||
|
|
||||||
|
} // namespace pmr
|
||||||
|
} // namespace fundamentals_v1
|
||||||
|
} // namespace experimental
|
||||||
|
} // namespace std
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <experimental/__config>
|
||||||
|
#include <regex>
|
||||||
|
#include <experimental/string>
|
||||||
|
#include <experimental/memory_resource>
|
||||||
|
|
||||||
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||||
|
#pragma GCC system_header
|
||||||
|
#endif
|
||||||
|
|
||||||
|
_LIBCPP_BEGIN_NAMESPACE_LFTS_PMR
|
||||||
|
|
||||||
|
template <class _BiDirIter>
|
||||||
|
using match_results =
|
||||||
|
_VSTD::match_results<_BiDirIter,
|
||||||
|
polymorphic_allocator<_VSTD::sub_match<_BiDirIter>>>;
|
||||||
|
|
||||||
|
typedef match_results<const char*> cmatch;
|
||||||
|
typedef match_results<const wchar_t*> wcmatch;
|
||||||
|
typedef match_results<_VSTD_LFTS_PMR::string::const_iterator> smatch;
|
||||||
|
typedef match_results<_VSTD_LFTS_PMR::wstring::const_iterator> wsmatch;
|
||||||
|
|
||||||
|
_LIBCPP_END_NAMESPACE_LFTS_PMR
|
||||||
|
|
||||||
|
#endif /* _LIBCPP_EXPERIMENTAL_REGEX */
|
||||||
57
include/experimental/set
Normal file
57
include/experimental/set
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
//===--------------------------- list ------------------------------------===//
|
||||||
|
//
|
||||||
|
// 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_SET
|
||||||
|
#define _LIBCPP_EXPERIMENTAL_SET
|
||||||
|
/*
|
||||||
|
experimental/set synopsis
|
||||||
|
|
||||||
|
// C++1z
|
||||||
|
namespace std {
|
||||||
|
namespace experimental {
|
||||||
|
inline namespace fundamentals_v1 {
|
||||||
|
namespace pmr {
|
||||||
|
|
||||||
|
template <class Key, class T, class Compare = less<Key>>
|
||||||
|
using set = std::set<Key, T, Compare,
|
||||||
|
polymorphic_allocator<pair<const Key,T>>>;
|
||||||
|
|
||||||
|
template <class Key, class T, class Compare = less<Key>>
|
||||||
|
using multiset = std::multiset<Key, T, Compare,
|
||||||
|
polymorphic_allocator<pair<const Key,T>>>;
|
||||||
|
|
||||||
|
} // namespace pmr
|
||||||
|
} // namespace fundamentals_v1
|
||||||
|
} // namespace experimental
|
||||||
|
} // namespace std
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <experimental/__config>
|
||||||
|
#include <set>
|
||||||
|
#include <experimental/memory_resource>
|
||||||
|
|
||||||
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||||
|
#pragma GCC system_header
|
||||||
|
#endif
|
||||||
|
|
||||||
|
_LIBCPP_BEGIN_NAMESPACE_LFTS_PMR
|
||||||
|
|
||||||
|
template <class _Value, class _Compare = less<_Value>>
|
||||||
|
using set = _VSTD::set<_Value, _Compare,
|
||||||
|
polymorphic_allocator<_Value>>;
|
||||||
|
|
||||||
|
template <class _Value, class _Compare = less<_Value>>
|
||||||
|
using multiset = _VSTD::multiset<_Value, _Compare,
|
||||||
|
polymorphic_allocator<_Value>>;
|
||||||
|
|
||||||
|
_LIBCPP_END_NAMESPACE_LFTS_PMR
|
||||||
|
|
||||||
|
#endif /* _LIBCPP_EXPERIMENTAL_SET */
|
||||||
62
include/experimental/string
Normal file
62
include/experimental/string
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
//===--------------------------- string ----------------------------------===//
|
||||||
|
//
|
||||||
|
// 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_STRING
|
||||||
|
#define _LIBCPP_EXPERIMENTAL_STRING
|
||||||
|
/*
|
||||||
|
experimental/string synopsis
|
||||||
|
|
||||||
|
// C++1z
|
||||||
|
namespace std {
|
||||||
|
namespace experimental {
|
||||||
|
inline namespace fundamentals_v1 {
|
||||||
|
namespace pmr {
|
||||||
|
|
||||||
|
// basic_string using polymorphic allocator in namespace pmr
|
||||||
|
template <class charT, class traits = char_traits<charT>>
|
||||||
|
using basic_string =
|
||||||
|
std::basic_string<charT, traits, polymorphic_allocator<charT>>;
|
||||||
|
|
||||||
|
// basic_string typedef names using polymorphic allocator in namespace
|
||||||
|
// std::experimental::pmr
|
||||||
|
typedef basic_string<char> string;
|
||||||
|
typedef basic_string<char16_t> u16string;
|
||||||
|
typedef basic_string<char32_t> u32string;
|
||||||
|
typedef basic_string<wchar_t> wstring;
|
||||||
|
|
||||||
|
} // namespace pmr
|
||||||
|
} // namespace fundamentals_v1
|
||||||
|
} // namespace experimental
|
||||||
|
} // namespace std
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <experimental/__config>
|
||||||
|
#include <string>
|
||||||
|
#include <experimental/memory_resource>
|
||||||
|
|
||||||
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||||
|
#pragma GCC system_header
|
||||||
|
#endif
|
||||||
|
|
||||||
|
_LIBCPP_BEGIN_NAMESPACE_LFTS_PMR
|
||||||
|
|
||||||
|
template <class _CharT, class _Traits = char_traits<_CharT>>
|
||||||
|
using basic_string =
|
||||||
|
_VSTD::basic_string<_CharT, _Traits, polymorphic_allocator<_CharT>>;
|
||||||
|
|
||||||
|
typedef basic_string<char> string;
|
||||||
|
typedef basic_string<char16_t> u16string;
|
||||||
|
typedef basic_string<char32_t> u32string;
|
||||||
|
typedef basic_string<wchar_t> wstring;
|
||||||
|
|
||||||
|
_LIBCPP_END_NAMESPACE_LFTS_PMR
|
||||||
|
|
||||||
|
#endif /* _LIBCPP_EXPERIMENTAL_STRING */
|
||||||
@@ -227,7 +227,7 @@ _LIBCPP_BEGIN_NAMESPACE_LFTS
|
|||||||
basic_string_view(const _CharT* __s, size_type __len)
|
basic_string_view(const _CharT* __s, size_type __len)
|
||||||
: __data(__s), __size(__len)
|
: __data(__s), __size(__len)
|
||||||
{
|
{
|
||||||
// _LIBCPP_ASSERT(__len == 0 || __s != nullptr, "string_view::string_view(_CharT *, size_t): recieved nullptr");
|
// _LIBCPP_ASSERT(__len == 0 || __s != nullptr, "string_view::string_view(_CharT *, size_t): received nullptr");
|
||||||
}
|
}
|
||||||
|
|
||||||
_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY
|
||||||
@@ -413,7 +413,7 @@ _LIBCPP_BEGIN_NAMESPACE_LFTS
|
|||||||
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
||||||
size_type find(basic_string_view __s, size_type __pos = 0) const _NOEXCEPT
|
size_type find(basic_string_view __s, size_type __pos = 0) const _NOEXCEPT
|
||||||
{
|
{
|
||||||
_LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find(): recieved nullptr");
|
_LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find(): received nullptr");
|
||||||
return _VSTD::__str_find<value_type, size_type, traits_type, npos>
|
return _VSTD::__str_find<value_type, size_type, traits_type, npos>
|
||||||
(data(), size(), __s.data(), __pos, __s.size());
|
(data(), size(), __s.data(), __pos, __s.size());
|
||||||
}
|
}
|
||||||
@@ -428,7 +428,7 @@ _LIBCPP_BEGIN_NAMESPACE_LFTS
|
|||||||
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
||||||
size_type find(const _CharT* __s, size_type __pos, size_type __n) const
|
size_type find(const _CharT* __s, size_type __pos, size_type __n) const
|
||||||
{
|
{
|
||||||
_LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::find(): recieved nullptr");
|
_LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::find(): received nullptr");
|
||||||
return _VSTD::__str_find<value_type, size_type, traits_type, npos>
|
return _VSTD::__str_find<value_type, size_type, traits_type, npos>
|
||||||
(data(), size(), __s, __pos, __n);
|
(data(), size(), __s, __pos, __n);
|
||||||
}
|
}
|
||||||
@@ -436,7 +436,7 @@ _LIBCPP_BEGIN_NAMESPACE_LFTS
|
|||||||
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
||||||
size_type find(const _CharT* __s, size_type __pos = 0) const
|
size_type find(const _CharT* __s, size_type __pos = 0) const
|
||||||
{
|
{
|
||||||
_LIBCPP_ASSERT(__s != nullptr, "string_view::find(): recieved nullptr");
|
_LIBCPP_ASSERT(__s != nullptr, "string_view::find(): received nullptr");
|
||||||
return _VSTD::__str_find<value_type, size_type, traits_type, npos>
|
return _VSTD::__str_find<value_type, size_type, traits_type, npos>
|
||||||
(data(), size(), __s, __pos, traits_type::length(__s));
|
(data(), size(), __s, __pos, traits_type::length(__s));
|
||||||
}
|
}
|
||||||
@@ -445,7 +445,7 @@ _LIBCPP_BEGIN_NAMESPACE_LFTS
|
|||||||
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
||||||
size_type rfind(basic_string_view __s, size_type __pos = npos) const _NOEXCEPT
|
size_type rfind(basic_string_view __s, size_type __pos = npos) const _NOEXCEPT
|
||||||
{
|
{
|
||||||
_LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find(): recieved nullptr");
|
_LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find(): received nullptr");
|
||||||
return _VSTD::__str_rfind<value_type, size_type, traits_type, npos>
|
return _VSTD::__str_rfind<value_type, size_type, traits_type, npos>
|
||||||
(data(), size(), __s.data(), __pos, __s.size());
|
(data(), size(), __s.data(), __pos, __s.size());
|
||||||
}
|
}
|
||||||
@@ -460,7 +460,7 @@ _LIBCPP_BEGIN_NAMESPACE_LFTS
|
|||||||
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
||||||
size_type rfind(const _CharT* __s, size_type __pos, size_type __n) const
|
size_type rfind(const _CharT* __s, size_type __pos, size_type __n) const
|
||||||
{
|
{
|
||||||
_LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::rfind(): recieved nullptr");
|
_LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::rfind(): received nullptr");
|
||||||
return _VSTD::__str_rfind<value_type, size_type, traits_type, npos>
|
return _VSTD::__str_rfind<value_type, size_type, traits_type, npos>
|
||||||
(data(), size(), __s, __pos, __n);
|
(data(), size(), __s, __pos, __n);
|
||||||
}
|
}
|
||||||
@@ -468,7 +468,7 @@ _LIBCPP_BEGIN_NAMESPACE_LFTS
|
|||||||
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
||||||
size_type rfind(const _CharT* __s, size_type __pos=npos) const
|
size_type rfind(const _CharT* __s, size_type __pos=npos) const
|
||||||
{
|
{
|
||||||
_LIBCPP_ASSERT(__s != nullptr, "string_view::rfind(): recieved nullptr");
|
_LIBCPP_ASSERT(__s != nullptr, "string_view::rfind(): received nullptr");
|
||||||
return _VSTD::__str_rfind<value_type, size_type, traits_type, npos>
|
return _VSTD::__str_rfind<value_type, size_type, traits_type, npos>
|
||||||
(data(), size(), __s, __pos, traits_type::length(__s));
|
(data(), size(), __s, __pos, traits_type::length(__s));
|
||||||
}
|
}
|
||||||
@@ -477,7 +477,7 @@ _LIBCPP_BEGIN_NAMESPACE_LFTS
|
|||||||
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
||||||
size_type find_first_of(basic_string_view __s, size_type __pos = 0) const _NOEXCEPT
|
size_type find_first_of(basic_string_view __s, size_type __pos = 0) const _NOEXCEPT
|
||||||
{
|
{
|
||||||
_LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find_first_of(): recieved nullptr");
|
_LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find_first_of(): received nullptr");
|
||||||
return _VSTD::__str_find_first_of<value_type, size_type, traits_type, npos>
|
return _VSTD::__str_find_first_of<value_type, size_type, traits_type, npos>
|
||||||
(data(), size(), __s.data(), __pos, __s.size());
|
(data(), size(), __s.data(), __pos, __s.size());
|
||||||
}
|
}
|
||||||
@@ -489,7 +489,7 @@ _LIBCPP_BEGIN_NAMESPACE_LFTS
|
|||||||
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
||||||
size_type find_first_of(const _CharT* __s, size_type __pos, size_type __n) const
|
size_type find_first_of(const _CharT* __s, size_type __pos, size_type __n) const
|
||||||
{
|
{
|
||||||
_LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::find_first_of(): recieved nullptr");
|
_LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::find_first_of(): received nullptr");
|
||||||
return _VSTD::__str_find_first_of<value_type, size_type, traits_type, npos>
|
return _VSTD::__str_find_first_of<value_type, size_type, traits_type, npos>
|
||||||
(data(), size(), __s, __pos, __n);
|
(data(), size(), __s, __pos, __n);
|
||||||
}
|
}
|
||||||
@@ -497,7 +497,7 @@ _LIBCPP_BEGIN_NAMESPACE_LFTS
|
|||||||
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
||||||
size_type find_first_of(const _CharT* __s, size_type __pos=0) const
|
size_type find_first_of(const _CharT* __s, size_type __pos=0) const
|
||||||
{
|
{
|
||||||
_LIBCPP_ASSERT(__s != nullptr, "string_view::find_first_of(): recieved nullptr");
|
_LIBCPP_ASSERT(__s != nullptr, "string_view::find_first_of(): received nullptr");
|
||||||
return _VSTD::__str_find_first_of<value_type, size_type, traits_type, npos>
|
return _VSTD::__str_find_first_of<value_type, size_type, traits_type, npos>
|
||||||
(data(), size(), __s, __pos, traits_type::length(__s));
|
(data(), size(), __s, __pos, traits_type::length(__s));
|
||||||
}
|
}
|
||||||
@@ -506,7 +506,7 @@ _LIBCPP_BEGIN_NAMESPACE_LFTS
|
|||||||
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
||||||
size_type find_last_of(basic_string_view __s, size_type __pos=npos) const _NOEXCEPT
|
size_type find_last_of(basic_string_view __s, size_type __pos=npos) const _NOEXCEPT
|
||||||
{
|
{
|
||||||
_LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find_last_of(): recieved nullptr");
|
_LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find_last_of(): received nullptr");
|
||||||
return _VSTD::__str_find_last_of<value_type, size_type, traits_type, npos>
|
return _VSTD::__str_find_last_of<value_type, size_type, traits_type, npos>
|
||||||
(data(), size(), __s.data(), __pos, __s.size());
|
(data(), size(), __s.data(), __pos, __s.size());
|
||||||
}
|
}
|
||||||
@@ -518,7 +518,7 @@ _LIBCPP_BEGIN_NAMESPACE_LFTS
|
|||||||
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
||||||
size_type find_last_of(const _CharT* __s, size_type __pos, size_type __n) const
|
size_type find_last_of(const _CharT* __s, size_type __pos, size_type __n) const
|
||||||
{
|
{
|
||||||
_LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::find_last_of(): recieved nullptr");
|
_LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::find_last_of(): received nullptr");
|
||||||
return _VSTD::__str_find_last_of<value_type, size_type, traits_type, npos>
|
return _VSTD::__str_find_last_of<value_type, size_type, traits_type, npos>
|
||||||
(data(), size(), __s, __pos, __n);
|
(data(), size(), __s, __pos, __n);
|
||||||
}
|
}
|
||||||
@@ -526,7 +526,7 @@ _LIBCPP_BEGIN_NAMESPACE_LFTS
|
|||||||
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
||||||
size_type find_last_of(const _CharT* __s, size_type __pos=npos) const
|
size_type find_last_of(const _CharT* __s, size_type __pos=npos) const
|
||||||
{
|
{
|
||||||
_LIBCPP_ASSERT(__s != nullptr, "string_view::find_last_of(): recieved nullptr");
|
_LIBCPP_ASSERT(__s != nullptr, "string_view::find_last_of(): received nullptr");
|
||||||
return _VSTD::__str_find_last_of<value_type, size_type, traits_type, npos>
|
return _VSTD::__str_find_last_of<value_type, size_type, traits_type, npos>
|
||||||
(data(), size(), __s, __pos, traits_type::length(__s));
|
(data(), size(), __s, __pos, traits_type::length(__s));
|
||||||
}
|
}
|
||||||
@@ -535,7 +535,7 @@ _LIBCPP_BEGIN_NAMESPACE_LFTS
|
|||||||
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
||||||
size_type find_first_not_of(basic_string_view __s, size_type __pos=0) const _NOEXCEPT
|
size_type find_first_not_of(basic_string_view __s, size_type __pos=0) const _NOEXCEPT
|
||||||
{
|
{
|
||||||
_LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find_first_not_of(): recieved nullptr");
|
_LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find_first_not_of(): received nullptr");
|
||||||
return _VSTD::__str_find_first_not_of<value_type, size_type, traits_type, npos>
|
return _VSTD::__str_find_first_not_of<value_type, size_type, traits_type, npos>
|
||||||
(data(), size(), __s.data(), __pos, __s.size());
|
(data(), size(), __s.data(), __pos, __s.size());
|
||||||
}
|
}
|
||||||
@@ -550,7 +550,7 @@ _LIBCPP_BEGIN_NAMESPACE_LFTS
|
|||||||
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
||||||
size_type find_first_not_of(const _CharT* __s, size_type __pos, size_type __n) const
|
size_type find_first_not_of(const _CharT* __s, size_type __pos, size_type __n) const
|
||||||
{
|
{
|
||||||
_LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::find_first_not_of(): recieved nullptr");
|
_LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::find_first_not_of(): received nullptr");
|
||||||
return _VSTD::__str_find_first_not_of<value_type, size_type, traits_type, npos>
|
return _VSTD::__str_find_first_not_of<value_type, size_type, traits_type, npos>
|
||||||
(data(), size(), __s, __pos, __n);
|
(data(), size(), __s, __pos, __n);
|
||||||
}
|
}
|
||||||
@@ -558,7 +558,7 @@ _LIBCPP_BEGIN_NAMESPACE_LFTS
|
|||||||
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
||||||
size_type find_first_not_of(const _CharT* __s, size_type __pos=0) const
|
size_type find_first_not_of(const _CharT* __s, size_type __pos=0) const
|
||||||
{
|
{
|
||||||
_LIBCPP_ASSERT(__s != nullptr, "string_view::find_first_not_of(): recieved nullptr");
|
_LIBCPP_ASSERT(__s != nullptr, "string_view::find_first_not_of(): received nullptr");
|
||||||
return _VSTD::__str_find_first_not_of<value_type, size_type, traits_type, npos>
|
return _VSTD::__str_find_first_not_of<value_type, size_type, traits_type, npos>
|
||||||
(data(), size(), __s, __pos, traits_type::length(__s));
|
(data(), size(), __s, __pos, traits_type::length(__s));
|
||||||
}
|
}
|
||||||
@@ -567,7 +567,7 @@ _LIBCPP_BEGIN_NAMESPACE_LFTS
|
|||||||
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
||||||
size_type find_last_not_of(basic_string_view __s, size_type __pos=npos) const _NOEXCEPT
|
size_type find_last_not_of(basic_string_view __s, size_type __pos=npos) const _NOEXCEPT
|
||||||
{
|
{
|
||||||
_LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find_last_not_of(): recieved nullptr");
|
_LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find_last_not_of(): received nullptr");
|
||||||
return _VSTD::__str_find_last_not_of<value_type, size_type, traits_type, npos>
|
return _VSTD::__str_find_last_not_of<value_type, size_type, traits_type, npos>
|
||||||
(data(), size(), __s.data(), __pos, __s.size());
|
(data(), size(), __s.data(), __pos, __s.size());
|
||||||
}
|
}
|
||||||
@@ -582,7 +582,7 @@ _LIBCPP_BEGIN_NAMESPACE_LFTS
|
|||||||
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
||||||
size_type find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const
|
size_type find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const
|
||||||
{
|
{
|
||||||
_LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::find_last_not_of(): recieved nullptr");
|
_LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::find_last_not_of(): received nullptr");
|
||||||
return _VSTD::__str_find_last_not_of<value_type, size_type, traits_type, npos>
|
return _VSTD::__str_find_last_not_of<value_type, size_type, traits_type, npos>
|
||||||
(data(), size(), __s, __pos, __n);
|
(data(), size(), __s, __pos, __n);
|
||||||
}
|
}
|
||||||
@@ -590,7 +590,7 @@ _LIBCPP_BEGIN_NAMESPACE_LFTS
|
|||||||
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
||||||
size_type find_last_not_of(const _CharT* __s, size_type __pos=npos) const
|
size_type find_last_not_of(const _CharT* __s, size_type __pos=npos) const
|
||||||
{
|
{
|
||||||
_LIBCPP_ASSERT(__s != nullptr, "string_view::find_last_not_of(): recieved nullptr");
|
_LIBCPP_ASSERT(__s != nullptr, "string_view::find_last_not_of(): received nullptr");
|
||||||
return _VSTD::__str_find_last_not_of<value_type, size_type, traits_type, npos>
|
return _VSTD::__str_find_last_not_of<value_type, size_type, traits_type, npos>
|
||||||
(data(), size(), __s, __pos, traits_type::length(__s));
|
(data(), size(), __s, __pos, traits_type::length(__s));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,9 +57,10 @@ _LIBCPP_CONSTEXPR size_t tuple_size_v = tuple_size<_Tp>::value;
|
|||||||
|
|
||||||
template <class _Fn, class _Tuple, size_t ..._Id>
|
template <class _Fn, class _Tuple, size_t ..._Id>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
|
_LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||||
decltype(auto) __apply_tuple_impl(_Fn && __f, _Tuple && __t,
|
decltype(auto) __apply_tuple_impl(_Fn && __f, _Tuple && __t,
|
||||||
integer_sequence<size_t, _Id...>) {
|
integer_sequence<size_t, _Id...>) {
|
||||||
return _VSTD::__invoke(
|
return _VSTD::__invoke_constexpr(
|
||||||
_VSTD::forward<_Fn>(__f),
|
_VSTD::forward<_Fn>(__f),
|
||||||
_VSTD::get<_Id>(_VSTD::forward<_Tuple>(__t))...
|
_VSTD::get<_Id>(_VSTD::forward<_Tuple>(__t))...
|
||||||
);
|
);
|
||||||
|
|||||||
65
include/experimental/unordered_map
Normal file
65
include/experimental/unordered_map
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
//===------------------------- unordered_map ------------------------------===//
|
||||||
|
//
|
||||||
|
// 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_UNORDERED_MAP
|
||||||
|
#define _LIBCPP_EXPERIMENTAL_UNORDERED_MAP
|
||||||
|
/*
|
||||||
|
experimental/unordered_map synopsis
|
||||||
|
|
||||||
|
// C++1z
|
||||||
|
namespace std {
|
||||||
|
namespace experimental {
|
||||||
|
inline namespace fundamentals_v1 {
|
||||||
|
namespace pmr {
|
||||||
|
|
||||||
|
template <class Key, class T,
|
||||||
|
class Hash = hash<Key>,
|
||||||
|
class Pred = equal_to<Key>>
|
||||||
|
using unordered_map =
|
||||||
|
std::unordered_map<Key, T, Hash, Pred,
|
||||||
|
polymorphic_allocator<pair<const Key,T>>>;
|
||||||
|
|
||||||
|
template <class Key, class T,
|
||||||
|
class Hash = hash<Key>,
|
||||||
|
class Pred = equal_to<Key>>
|
||||||
|
using unordered_multimap =
|
||||||
|
std::unordered_multimap<Key, T, Hash, Pred,
|
||||||
|
polymorphic_allocator<pair<const Key,T>>>;
|
||||||
|
|
||||||
|
} // namespace pmr
|
||||||
|
} // namespace fundamentals_v1
|
||||||
|
} // namespace experimental
|
||||||
|
} // namespace std
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <experimental/__config>
|
||||||
|
#include <unordered_map>
|
||||||
|
#include <experimental/memory_resource>
|
||||||
|
|
||||||
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||||
|
#pragma GCC system_header
|
||||||
|
#endif
|
||||||
|
|
||||||
|
_LIBCPP_BEGIN_NAMESPACE_LFTS_PMR
|
||||||
|
|
||||||
|
template <class _Key, class _Value,
|
||||||
|
class _Hash = hash<_Key>, class _Pred = equal_to<_Key>>
|
||||||
|
using unordered_map = _VSTD::unordered_map<_Key, _Value, _Hash, _Pred,
|
||||||
|
polymorphic_allocator<pair<const _Key, _Value>>>;
|
||||||
|
|
||||||
|
template <class _Key, class _Value,
|
||||||
|
class _Hash = hash<_Key>, class _Pred = equal_to<_Key>>
|
||||||
|
using unordered_multimap = _VSTD::unordered_multimap<_Key, _Value, _Hash, _Pred,
|
||||||
|
polymorphic_allocator<pair<const _Key, _Value>>>;
|
||||||
|
|
||||||
|
_LIBCPP_END_NAMESPACE_LFTS_PMR
|
||||||
|
|
||||||
|
#endif /* _LIBCPP_EXPERIMENTAL_UNORDERED_MAP */
|
||||||
59
include/experimental/unordered_set
Normal file
59
include/experimental/unordered_set
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
//===------------------------- unordered_set ------------------------------===//
|
||||||
|
//
|
||||||
|
// 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_UNORDERED_SET
|
||||||
|
#define _LIBCPP_EXPERIMENTAL_UNORDERED_SET
|
||||||
|
/*
|
||||||
|
experimental/unordered_set synopsis
|
||||||
|
|
||||||
|
// C++1z
|
||||||
|
namespace std {
|
||||||
|
namespace experimental {
|
||||||
|
inline namespace fundamentals_v1 {
|
||||||
|
namespace pmr {
|
||||||
|
|
||||||
|
template <class T, class Hash = hash<T>, class Pred = equal_to<T>>
|
||||||
|
using unordered_set = std::unordered_set<T, Hash, Pred,
|
||||||
|
polymorphic_allocator<T>>;
|
||||||
|
|
||||||
|
template <class T, class Hash = hash<T>, class Pred = equal_to<T>>
|
||||||
|
using unordered_multiset = std::unordered_multiset<T, Hash, Pred,
|
||||||
|
polymorphic_allocator<T>>;
|
||||||
|
|
||||||
|
} // namespace pmr
|
||||||
|
} // namespace fundamentals_v1
|
||||||
|
} // namespace experimental
|
||||||
|
} // namespace std
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <experimental/__config>
|
||||||
|
#include <unordered_set>
|
||||||
|
#include <experimental/memory_resource>
|
||||||
|
|
||||||
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||||
|
#pragma GCC system_header
|
||||||
|
#endif
|
||||||
|
|
||||||
|
_LIBCPP_BEGIN_NAMESPACE_LFTS_PMR
|
||||||
|
|
||||||
|
template <class _Value,
|
||||||
|
class _Hash = hash<_Value>, class _Pred = equal_to<_Value>>
|
||||||
|
using unordered_set = _VSTD::unordered_set<_Value, _Hash, _Pred,
|
||||||
|
polymorphic_allocator<_Value>>;
|
||||||
|
|
||||||
|
template <class _Value,
|
||||||
|
class _Hash = hash<_Value>, class _Pred = equal_to<_Value>>
|
||||||
|
using unordered_multiset = _VSTD::unordered_multiset<_Value, _Hash, _Pred,
|
||||||
|
polymorphic_allocator<_Value>>;
|
||||||
|
|
||||||
|
_LIBCPP_END_NAMESPACE_LFTS_PMR
|
||||||
|
|
||||||
|
#endif /* _LIBCPP_EXPERIMENTAL_UNORDERED_SET */
|
||||||
47
include/experimental/vector
Normal file
47
include/experimental/vector
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
//===--------------------------- vector ------------------------------------===//
|
||||||
|
//
|
||||||
|
// 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_VECTOR
|
||||||
|
#define _LIBCPP_EXPERIMENTAL_VECTOR
|
||||||
|
/*
|
||||||
|
experimental/vector synopsis
|
||||||
|
|
||||||
|
// C++1z
|
||||||
|
namespace std {
|
||||||
|
namespace experimental {
|
||||||
|
inline namespace fundamentals_v1 {
|
||||||
|
namespace pmr {
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
using vector = std::vector<T, polymorphic_allocator<T>>;
|
||||||
|
|
||||||
|
} // namespace pmr
|
||||||
|
} // namespace fundamentals_v1
|
||||||
|
} // namespace experimental
|
||||||
|
} // namespace std
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <experimental/__config>
|
||||||
|
#include <vector>
|
||||||
|
#include <experimental/memory_resource>
|
||||||
|
|
||||||
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||||
|
#pragma GCC system_header
|
||||||
|
#endif
|
||||||
|
|
||||||
|
_LIBCPP_BEGIN_NAMESPACE_LFTS_PMR
|
||||||
|
|
||||||
|
template <class _ValueT>
|
||||||
|
using vector = _VSTD::vector<_ValueT, polymorphic_allocator<_ValueT>>;
|
||||||
|
|
||||||
|
_LIBCPP_END_NAMESPACE_LFTS_PMR
|
||||||
|
|
||||||
|
#endif /* _LIBCPP_EXPERIMENTAL_VECTOR */
|
||||||
@@ -309,7 +309,7 @@ class __hash_map_node_destructor
|
|||||||
{
|
{
|
||||||
typedef _Alloc allocator_type;
|
typedef _Alloc allocator_type;
|
||||||
typedef allocator_traits<allocator_type> __alloc_traits;
|
typedef allocator_traits<allocator_type> __alloc_traits;
|
||||||
typedef typename __alloc_traits::value_type::value_type value_type;
|
typedef typename __alloc_traits::value_type::__node_value_type value_type;
|
||||||
public:
|
public:
|
||||||
typedef typename __alloc_traits::pointer pointer;
|
typedef typename __alloc_traits::pointer pointer;
|
||||||
private:
|
private:
|
||||||
@@ -368,7 +368,6 @@ class _LIBCPP_TYPE_VIS_ONLY __hash_map_iterator
|
|||||||
{
|
{
|
||||||
_HashIterator __i_;
|
_HashIterator __i_;
|
||||||
|
|
||||||
typedef pointer_traits<typename _HashIterator::pointer> __pointer_traits;
|
|
||||||
typedef const typename _HashIterator::value_type::first_type key_type;
|
typedef const typename _HashIterator::value_type::first_type key_type;
|
||||||
typedef typename _HashIterator::value_type::second_type mapped_type;
|
typedef typename _HashIterator::value_type::second_type mapped_type;
|
||||||
public:
|
public:
|
||||||
@@ -376,12 +375,7 @@ public:
|
|||||||
typedef pair<key_type, mapped_type> value_type;
|
typedef pair<key_type, mapped_type> value_type;
|
||||||
typedef typename _HashIterator::difference_type difference_type;
|
typedef typename _HashIterator::difference_type difference_type;
|
||||||
typedef value_type& reference;
|
typedef value_type& reference;
|
||||||
typedef typename __pointer_traits::template
|
typedef typename __rebind_pointer<typename _HashIterator::pointer, value_type>::type
|
||||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
|
||||||
rebind<value_type>
|
|
||||||
#else
|
|
||||||
rebind<value_type>::other
|
|
||||||
#endif
|
|
||||||
pointer;
|
pointer;
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY __hash_map_iterator() {}
|
_LIBCPP_INLINE_VISIBILITY __hash_map_iterator() {}
|
||||||
@@ -419,7 +413,6 @@ class _LIBCPP_TYPE_VIS_ONLY __hash_map_const_iterator
|
|||||||
{
|
{
|
||||||
_HashIterator __i_;
|
_HashIterator __i_;
|
||||||
|
|
||||||
typedef pointer_traits<typename _HashIterator::pointer> __pointer_traits;
|
|
||||||
typedef const typename _HashIterator::value_type::first_type key_type;
|
typedef const typename _HashIterator::value_type::first_type key_type;
|
||||||
typedef typename _HashIterator::value_type::second_type mapped_type;
|
typedef typename _HashIterator::value_type::second_type mapped_type;
|
||||||
public:
|
public:
|
||||||
@@ -427,12 +420,7 @@ public:
|
|||||||
typedef pair<key_type, mapped_type> value_type;
|
typedef pair<key_type, mapped_type> value_type;
|
||||||
typedef typename _HashIterator::difference_type difference_type;
|
typedef typename _HashIterator::difference_type difference_type;
|
||||||
typedef const value_type& reference;
|
typedef const value_type& reference;
|
||||||
typedef typename __pointer_traits::template
|
typedef typename __rebind_pointer<typename _HashIterator::pointer, const value_type>::type
|
||||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
|
||||||
rebind<const value_type>
|
|
||||||
#else
|
|
||||||
rebind<const value_type>::other
|
|
||||||
#endif
|
|
||||||
pointer;
|
pointer;
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY __hash_map_const_iterator() {}
|
_LIBCPP_INLINE_VISIBILITY __hash_map_const_iterator() {}
|
||||||
@@ -561,6 +549,7 @@ public:
|
|||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
iterator insert(const_iterator, const value_type& __x) {return insert(__x).first;}
|
iterator insert(const_iterator, const value_type& __x) {return insert(__x).first;}
|
||||||
template <class _InputIterator>
|
template <class _InputIterator>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void insert(_InputIterator __first, _InputIterator __last);
|
void insert(_InputIterator __first, _InputIterator __last);
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
@@ -681,12 +670,12 @@ hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node(const key_type& __k)
|
|||||||
__h.get_deleter().__first_constructed = true;
|
__h.get_deleter().__first_constructed = true;
|
||||||
__node_traits::construct(__na, _VSTD::addressof(__h->__value_.second));
|
__node_traits::construct(__na, _VSTD::addressof(__h->__value_.second));
|
||||||
__h.get_deleter().__second_constructed = true;
|
__h.get_deleter().__second_constructed = true;
|
||||||
return _VSTD::move(__h); // explicitly moved for C++03
|
return _LIBCPP_EXPLICIT_MOVE(__h); // explicitly moved for C++03
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
|
template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
|
||||||
template <class _InputIterator>
|
template <class _InputIterator>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
|
hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
|
||||||
_InputIterator __last)
|
_InputIterator __last)
|
||||||
@@ -832,6 +821,7 @@ public:
|
|||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
iterator insert(const_iterator, const value_type& __x) {return insert(__x);}
|
iterator insert(const_iterator, const value_type& __x) {return insert(__x);}
|
||||||
template <class _InputIterator>
|
template <class _InputIterator>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void insert(_InputIterator __first, _InputIterator __last);
|
void insert(_InputIterator __first, _InputIterator __last);
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
@@ -939,7 +929,7 @@ hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_multimap(
|
|||||||
|
|
||||||
template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
|
template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
|
||||||
template <class _InputIterator>
|
template <class _InputIterator>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
|
hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
|
||||||
_InputIterator __last)
|
_InputIterator __last)
|
||||||
|
|||||||
@@ -282,6 +282,7 @@ public:
|
|||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
iterator insert(const_iterator, const value_type& __x) {return insert(__x).first;}
|
iterator insert(const_iterator, const value_type& __x) {return insert(__x).first;}
|
||||||
template <class _InputIterator>
|
template <class _InputIterator>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void insert(_InputIterator __first, _InputIterator __last);
|
void insert(_InputIterator __first, _InputIterator __last);
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
@@ -385,7 +386,7 @@ hash_set<_Value, _Hash, _Pred, _Alloc>::hash_set(
|
|||||||
|
|
||||||
template <class _Value, class _Hash, class _Pred, class _Alloc>
|
template <class _Value, class _Hash, class _Pred, class _Alloc>
|
||||||
template <class _InputIterator>
|
template <class _InputIterator>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
hash_set<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
|
hash_set<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
|
||||||
_InputIterator __last)
|
_InputIterator __last)
|
||||||
@@ -502,6 +503,7 @@ public:
|
|||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
iterator insert(const_iterator, const value_type& __x) {return insert(__x);}
|
iterator insert(const_iterator, const value_type& __x) {return insert(__x);}
|
||||||
template <class _InputIterator>
|
template <class _InputIterator>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void insert(_InputIterator __first, _InputIterator __last);
|
void insert(_InputIterator __first, _InputIterator __last);
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
@@ -606,7 +608,7 @@ hash_multiset<_Value, _Hash, _Pred, _Alloc>::hash_multiset(
|
|||||||
|
|
||||||
template <class _Value, class _Hash, class _Pred, class _Alloc>
|
template <class _Value, class _Hash, class _Pred, class _Alloc>
|
||||||
template <class _InputIterator>
|
template <class _InputIterator>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
hash_multiset<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
|
hash_multiset<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
|
||||||
_InputIterator __last)
|
_InputIterator __last)
|
||||||
|
|||||||
83
include/float.h
Normal file
83
include/float.h
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
//===--------------------------- float.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_FLOAT_H
|
||||||
|
#define _LIBCPP_FLOAT_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
float.h synopsis
|
||||||
|
|
||||||
|
Macros:
|
||||||
|
|
||||||
|
FLT_ROUNDS
|
||||||
|
FLT_EVAL_METHOD // C99
|
||||||
|
FLT_RADIX
|
||||||
|
|
||||||
|
FLT_MANT_DIG
|
||||||
|
DBL_MANT_DIG
|
||||||
|
LDBL_MANT_DIG
|
||||||
|
|
||||||
|
DECIMAL_DIG // C99
|
||||||
|
|
||||||
|
FLT_DIG
|
||||||
|
DBL_DIG
|
||||||
|
LDBL_DIG
|
||||||
|
|
||||||
|
FLT_MIN_EXP
|
||||||
|
DBL_MIN_EXP
|
||||||
|
LDBL_MIN_EXP
|
||||||
|
|
||||||
|
FLT_MIN_10_EXP
|
||||||
|
DBL_MIN_10_EXP
|
||||||
|
LDBL_MIN_10_EXP
|
||||||
|
|
||||||
|
FLT_MAX_EXP
|
||||||
|
DBL_MAX_EXP
|
||||||
|
LDBL_MAX_EXP
|
||||||
|
|
||||||
|
FLT_MAX_10_EXP
|
||||||
|
DBL_MAX_10_EXP
|
||||||
|
LDBL_MAX_10_EXP
|
||||||
|
|
||||||
|
FLT_MAX
|
||||||
|
DBL_MAX
|
||||||
|
LDBL_MAX
|
||||||
|
|
||||||
|
FLT_EPSILON
|
||||||
|
DBL_EPSILON
|
||||||
|
LDBL_EPSILON
|
||||||
|
|
||||||
|
FLT_MIN
|
||||||
|
DBL_MIN
|
||||||
|
LDBL_MIN
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <__config>
|
||||||
|
|
||||||
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||||
|
#pragma GCC system_header
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include_next <float.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
|
||||||
|
#ifndef FLT_EVAL_METHOD
|
||||||
|
#define FLT_EVAL_METHOD __FLT_EVAL_METHOD__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef DECIMAL_DIG
|
||||||
|
#define DECIMAL_DIG __DECIMAL_DIG__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // __cplusplus
|
||||||
|
|
||||||
|
#endif // _LIBCPP_FLOAT_H
|
||||||
@@ -183,28 +183,76 @@ template <class T, class Allocator>
|
|||||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||||
|
|
||||||
template <class _Tp, class _VoidPtr> struct __forward_list_node;
|
template <class _Tp, class _VoidPtr> struct __forward_list_node;
|
||||||
|
template <class _NodePtr> struct __forward_begin_node;
|
||||||
|
|
||||||
|
|
||||||
|
template <class>
|
||||||
|
struct __forward_list_node_value_type;
|
||||||
|
|
||||||
|
template <class _Tp, class _VoidPtr>
|
||||||
|
struct __forward_list_node_value_type<__forward_list_node<_Tp, _VoidPtr> > {
|
||||||
|
typedef _Tp type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class _NodePtr>
|
||||||
|
struct __forward_node_traits {
|
||||||
|
|
||||||
|
typedef typename remove_cv<
|
||||||
|
typename pointer_traits<_NodePtr>::element_type>::type __node;
|
||||||
|
typedef typename __forward_list_node_value_type<__node>::type __node_value_type;
|
||||||
|
typedef _NodePtr __node_pointer;
|
||||||
|
typedef __forward_begin_node<_NodePtr> __begin_node;
|
||||||
|
typedef typename __rebind_pointer<_NodePtr, __begin_node>::type
|
||||||
|
__begin_node_pointer;
|
||||||
|
typedef typename __rebind_pointer<_NodePtr, void>::type __void_pointer;
|
||||||
|
|
||||||
|
#if defined(_LIBCPP_ABI_FORWARD_LIST_REMOVE_NODE_POINTER_UB)
|
||||||
|
typedef __begin_node_pointer __iter_node_pointer;
|
||||||
|
#else
|
||||||
|
typedef typename conditional<
|
||||||
|
is_pointer<__void_pointer>::value,
|
||||||
|
__begin_node_pointer,
|
||||||
|
__node_pointer
|
||||||
|
>::type __iter_node_pointer;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef typename conditional<
|
||||||
|
is_same<__iter_node_pointer, __node_pointer>::value,
|
||||||
|
__begin_node_pointer,
|
||||||
|
__node_pointer
|
||||||
|
>::type __non_iter_node_pointer;
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
static __iter_node_pointer __as_iter_node(__iter_node_pointer __p) {
|
||||||
|
return __p;
|
||||||
|
}
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
static __iter_node_pointer __as_iter_node(__non_iter_node_pointer __p) {
|
||||||
|
return static_cast<__iter_node_pointer>(static_cast<__void_pointer>(__p));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
template <class _NodePtr>
|
template <class _NodePtr>
|
||||||
struct __forward_begin_node
|
struct __forward_begin_node
|
||||||
{
|
{
|
||||||
typedef _NodePtr pointer;
|
typedef _NodePtr pointer;
|
||||||
|
typedef typename __rebind_pointer<_NodePtr, __forward_begin_node>::type __begin_node_pointer;
|
||||||
|
|
||||||
pointer __next_;
|
pointer __next_;
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY __forward_begin_node() : __next_(nullptr) {}
|
_LIBCPP_INLINE_VISIBILITY __forward_begin_node() : __next_(nullptr) {}
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
__begin_node_pointer __next_as_begin() const {
|
||||||
|
return static_cast<__begin_node_pointer>(__next_);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class _Tp, class _VoidPtr>
|
template <class _Tp, class _VoidPtr>
|
||||||
struct _LIBCPP_HIDDEN __begin_node_of
|
struct _LIBCPP_HIDDEN __begin_node_of
|
||||||
{
|
{
|
||||||
typedef __forward_begin_node
|
typedef __forward_begin_node<
|
||||||
<
|
typename __rebind_pointer<_VoidPtr, __forward_list_node<_Tp, _VoidPtr> >::type
|
||||||
typename pointer_traits<_VoidPtr>::template
|
|
||||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
|
||||||
rebind<__forward_list_node<_Tp, _VoidPtr> >
|
|
||||||
#else
|
|
||||||
rebind<__forward_list_node<_Tp, _VoidPtr> >::other
|
|
||||||
#endif
|
|
||||||
> type;
|
> type;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -217,49 +265,68 @@ struct __forward_list_node
|
|||||||
value_type __value_;
|
value_type __value_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
template <class _Tp, class _Alloc = allocator<_Tp> > class _LIBCPP_TYPE_VIS_ONLY forward_list;
|
template <class _Tp, class _Alloc = allocator<_Tp> > class _LIBCPP_TYPE_VIS_ONLY forward_list;
|
||||||
template<class _NodeConstPtr> class _LIBCPP_TYPE_VIS_ONLY __forward_list_const_iterator;
|
template<class _NodeConstPtr> class _LIBCPP_TYPE_VIS_ONLY __forward_list_const_iterator;
|
||||||
|
|
||||||
template <class _NodePtr>
|
template <class _NodePtr>
|
||||||
class _LIBCPP_TYPE_VIS_ONLY __forward_list_iterator
|
class _LIBCPP_TYPE_VIS_ONLY __forward_list_iterator
|
||||||
{
|
{
|
||||||
typedef _NodePtr __node_pointer;
|
typedef __forward_node_traits<_NodePtr> __traits;
|
||||||
|
typedef typename __traits::__node_pointer __node_pointer;
|
||||||
|
typedef typename __traits::__begin_node_pointer __begin_node_pointer;
|
||||||
|
typedef typename __traits::__iter_node_pointer __iter_node_pointer;
|
||||||
|
typedef typename __traits::__void_pointer __void_pointer;
|
||||||
|
|
||||||
__node_pointer __ptr_;
|
__iter_node_pointer __ptr_;
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
explicit __forward_list_iterator(__node_pointer __p) _NOEXCEPT : __ptr_(__p) {}
|
__begin_node_pointer __get_begin() const {
|
||||||
|
return static_cast<__begin_node_pointer>(
|
||||||
|
static_cast<__void_pointer>(__ptr_));
|
||||||
|
}
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
__node_pointer __get_unsafe_node_pointer() const {
|
||||||
|
return static_cast<__node_pointer>(
|
||||||
|
static_cast<__void_pointer>(__ptr_));
|
||||||
|
}
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
explicit __forward_list_iterator(nullptr_t) _NOEXCEPT : __ptr_(nullptr) {}
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
explicit __forward_list_iterator(__begin_node_pointer __p) _NOEXCEPT
|
||||||
|
: __ptr_(__traits::__as_iter_node(__p)) {}
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
explicit __forward_list_iterator(__node_pointer __p) _NOEXCEPT
|
||||||
|
: __ptr_(__traits::__as_iter_node(__p)) {}
|
||||||
|
|
||||||
template<class, class> friend class _LIBCPP_TYPE_VIS_ONLY forward_list;
|
template<class, class> friend class _LIBCPP_TYPE_VIS_ONLY forward_list;
|
||||||
template<class> friend class _LIBCPP_TYPE_VIS_ONLY __forward_list_const_iterator;
|
template<class> friend class _LIBCPP_TYPE_VIS_ONLY __forward_list_const_iterator;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
typedef forward_iterator_tag iterator_category;
|
typedef forward_iterator_tag iterator_category;
|
||||||
typedef typename pointer_traits<__node_pointer>::element_type::value_type
|
typedef typename __traits::__node_value_type value_type;
|
||||||
value_type;
|
|
||||||
typedef value_type& reference;
|
typedef value_type& reference;
|
||||||
typedef typename pointer_traits<__node_pointer>::difference_type
|
typedef typename pointer_traits<__node_pointer>::difference_type
|
||||||
difference_type;
|
difference_type;
|
||||||
typedef typename pointer_traits<__node_pointer>::template
|
typedef typename __rebind_pointer<__node_pointer, value_type>::type pointer;
|
||||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
|
||||||
rebind<value_type>
|
|
||||||
#else
|
|
||||||
rebind<value_type>::other
|
|
||||||
#endif
|
|
||||||
pointer;
|
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
__forward_list_iterator() _NOEXCEPT : __ptr_(nullptr) {}
|
__forward_list_iterator() _NOEXCEPT : __ptr_(nullptr) {}
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
reference operator*() const {return __ptr_->__value_;}
|
reference operator*() const {return __get_unsafe_node_pointer()->__value_;}
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
pointer operator->() const {return pointer_traits<pointer>::pointer_to(__ptr_->__value_);}
|
pointer operator->() const {
|
||||||
|
return pointer_traits<pointer>::pointer_to(__get_unsafe_node_pointer()->__value_);
|
||||||
|
}
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
__forward_list_iterator& operator++()
|
__forward_list_iterator& operator++()
|
||||||
{
|
{
|
||||||
__ptr_ = __ptr_->__next_;
|
__ptr_ = __traits::__as_iter_node(__ptr_->__next_);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
@@ -283,40 +350,49 @@ public:
|
|||||||
template <class _NodeConstPtr>
|
template <class _NodeConstPtr>
|
||||||
class _LIBCPP_TYPE_VIS_ONLY __forward_list_const_iterator
|
class _LIBCPP_TYPE_VIS_ONLY __forward_list_const_iterator
|
||||||
{
|
{
|
||||||
typedef _NodeConstPtr __node_const_pointer;
|
static_assert((!is_const<typename pointer_traits<_NodeConstPtr>::element_type>::value), "");
|
||||||
|
typedef _NodeConstPtr _NodePtr;
|
||||||
|
|
||||||
__node_const_pointer __ptr_;
|
typedef __forward_node_traits<_NodePtr> __traits;
|
||||||
|
typedef typename __traits::__node __node;
|
||||||
|
typedef typename __traits::__node_pointer __node_pointer;
|
||||||
|
typedef typename __traits::__begin_node_pointer __begin_node_pointer;
|
||||||
|
typedef typename __traits::__iter_node_pointer __iter_node_pointer;
|
||||||
|
typedef typename __traits::__void_pointer __void_pointer;
|
||||||
|
|
||||||
|
__iter_node_pointer __ptr_;
|
||||||
|
|
||||||
|
__begin_node_pointer __get_begin() const {
|
||||||
|
return static_cast<__begin_node_pointer>(
|
||||||
|
static_cast<__void_pointer>(__ptr_));
|
||||||
|
}
|
||||||
|
__node_pointer __get_unsafe_node_pointer() const {
|
||||||
|
return static_cast<__node_pointer>(
|
||||||
|
static_cast<__void_pointer>(__ptr_));
|
||||||
|
}
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
explicit __forward_list_const_iterator(__node_const_pointer __p) _NOEXCEPT
|
explicit __forward_list_const_iterator(nullptr_t) _NOEXCEPT
|
||||||
: __ptr_(__p) {}
|
: __ptr_(nullptr) {}
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
explicit __forward_list_const_iterator(__begin_node_pointer __p) _NOEXCEPT
|
||||||
|
: __ptr_(__traits::__as_iter_node(__p)) {}
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
explicit __forward_list_const_iterator(__node_pointer __p) _NOEXCEPT
|
||||||
|
: __ptr_(__traits::__as_iter_node(__p)) {}
|
||||||
|
|
||||||
typedef typename remove_const
|
|
||||||
<
|
|
||||||
typename pointer_traits<__node_const_pointer>::element_type
|
|
||||||
>::type __node;
|
|
||||||
typedef typename pointer_traits<__node_const_pointer>::template
|
|
||||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
|
||||||
rebind<__node>
|
|
||||||
#else
|
|
||||||
rebind<__node>::other
|
|
||||||
#endif
|
|
||||||
__node_pointer;
|
|
||||||
|
|
||||||
template<class, class> friend class forward_list;
|
template<class, class> friend class forward_list;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
typedef forward_iterator_tag iterator_category;
|
typedef forward_iterator_tag iterator_category;
|
||||||
typedef typename __node::value_type value_type;
|
typedef typename __traits::__node_value_type value_type;
|
||||||
typedef const value_type& reference;
|
typedef const value_type& reference;
|
||||||
typedef typename pointer_traits<__node_const_pointer>::difference_type
|
typedef typename pointer_traits<__node_pointer>::difference_type
|
||||||
difference_type;
|
difference_type;
|
||||||
typedef typename pointer_traits<__node_const_pointer>::template
|
typedef typename __rebind_pointer<__node_pointer, const value_type>::type
|
||||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
|
||||||
rebind<const value_type>
|
|
||||||
#else
|
|
||||||
rebind<const value_type>::other
|
|
||||||
#endif
|
|
||||||
pointer;
|
pointer;
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
@@ -326,14 +402,15 @@ public:
|
|||||||
: __ptr_(__p.__ptr_) {}
|
: __ptr_(__p.__ptr_) {}
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
reference operator*() const {return __ptr_->__value_;}
|
reference operator*() const {return __get_unsafe_node_pointer()->__value_;}
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
pointer operator->() const {return pointer_traits<pointer>::pointer_to(__ptr_->__value_);}
|
pointer operator->() const {return pointer_traits<pointer>::pointer_to(
|
||||||
|
__get_unsafe_node_pointer()->__value_);}
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
__forward_list_const_iterator& operator++()
|
__forward_list_const_iterator& operator++()
|
||||||
{
|
{
|
||||||
__ptr_ = __ptr_->__next_;
|
__ptr_ = __traits::__as_iter_node(__ptr_->__next_);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
@@ -367,21 +444,21 @@ protected:
|
|||||||
typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>, __node>::type __node_allocator;
|
typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>, __node>::type __node_allocator;
|
||||||
typedef allocator_traits<__node_allocator> __node_traits;
|
typedef allocator_traits<__node_allocator> __node_traits;
|
||||||
typedef typename __node_traits::pointer __node_pointer;
|
typedef typename __node_traits::pointer __node_pointer;
|
||||||
typedef typename __node_traits::pointer __node_const_pointer;
|
|
||||||
|
|
||||||
typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>, __begin_node>::type __begin_node_allocator;
|
typedef typename __rebind_alloc_helper<
|
||||||
typedef typename allocator_traits<__begin_node_allocator>::pointer __begin_node_pointer;
|
allocator_traits<allocator_type>, __begin_node
|
||||||
|
>::type __begin_node_allocator;
|
||||||
|
typedef typename allocator_traits<__begin_node_allocator>::pointer
|
||||||
|
__begin_node_pointer;
|
||||||
|
|
||||||
__compressed_pair<__begin_node, __node_allocator> __before_begin_;
|
__compressed_pair<__begin_node, __node_allocator> __before_begin_;
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
__node_pointer __before_begin() _NOEXCEPT
|
__begin_node_pointer __before_begin() _NOEXCEPT
|
||||||
{return static_cast<__node_pointer>(pointer_traits<__begin_node_pointer>::
|
{return pointer_traits<__begin_node_pointer>::pointer_to(__before_begin_.first());}
|
||||||
pointer_to(__before_begin_.first()));}
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
__node_const_pointer __before_begin() const _NOEXCEPT
|
__begin_node_pointer __before_begin() const _NOEXCEPT
|
||||||
{return static_cast<__node_const_pointer>(pointer_traits<__begin_node_pointer>::
|
{return pointer_traits<__begin_node_pointer>::pointer_to(const_cast<__begin_node&>(__before_begin_.first()));}
|
||||||
pointer_to(const_cast<__begin_node&>(__before_begin_.first())));}
|
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
__node_allocator& __alloc() _NOEXCEPT
|
__node_allocator& __alloc() _NOEXCEPT
|
||||||
@@ -403,8 +480,10 @@ protected:
|
|||||||
|
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
public:
|
public:
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
__forward_list_base(__forward_list_base&& __x)
|
__forward_list_base(__forward_list_base&& __x)
|
||||||
_NOEXCEPT_(is_nothrow_move_constructible<__node_allocator>::value);
|
_NOEXCEPT_(is_nothrow_move_constructible<__node_allocator>::value);
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
__forward_list_base(__forward_list_base&& __x, const allocator_type& __a);
|
__forward_list_base(__forward_list_base&& __x, const allocator_type& __a);
|
||||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
|
||||||
@@ -429,6 +508,7 @@ protected:
|
|||||||
__node_traits::propagate_on_container_move_assignment::value>());}
|
__node_traits::propagate_on_container_move_assignment::value>());}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void swap(__forward_list_base& __x)
|
void swap(__forward_list_base& __x)
|
||||||
#if _LIBCPP_STD_VER >= 14
|
#if _LIBCPP_STD_VER >= 14
|
||||||
_NOEXCEPT;
|
_NOEXCEPT;
|
||||||
@@ -462,7 +542,7 @@ private:
|
|||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
|
||||||
template <class _Tp, class _Alloc>
|
template <class _Tp, class _Alloc>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
__forward_list_base<_Tp, _Alloc>::__forward_list_base(__forward_list_base&& __x)
|
__forward_list_base<_Tp, _Alloc>::__forward_list_base(__forward_list_base&& __x)
|
||||||
_NOEXCEPT_(is_nothrow_move_constructible<__node_allocator>::value)
|
_NOEXCEPT_(is_nothrow_move_constructible<__node_allocator>::value)
|
||||||
: __before_begin_(_VSTD::move(__x.__before_begin_))
|
: __before_begin_(_VSTD::move(__x.__before_begin_))
|
||||||
@@ -471,7 +551,7 @@ __forward_list_base<_Tp, _Alloc>::__forward_list_base(__forward_list_base&& __x)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class _Alloc>
|
template <class _Tp, class _Alloc>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
__forward_list_base<_Tp, _Alloc>::__forward_list_base(__forward_list_base&& __x,
|
__forward_list_base<_Tp, _Alloc>::__forward_list_base(__forward_list_base&& __x,
|
||||||
const allocator_type& __a)
|
const allocator_type& __a)
|
||||||
: __before_begin_(__begin_node(), __node_allocator(__a))
|
: __before_begin_(__begin_node(), __node_allocator(__a))
|
||||||
@@ -492,7 +572,7 @@ __forward_list_base<_Tp, _Alloc>::~__forward_list_base()
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class _Alloc>
|
template <class _Tp, class _Alloc>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
__forward_list_base<_Tp, _Alloc>::swap(__forward_list_base& __x)
|
__forward_list_base<_Tp, _Alloc>::swap(__forward_list_base& __x)
|
||||||
#if _LIBCPP_STD_VER >= 14
|
#if _LIBCPP_STD_VER >= 14
|
||||||
@@ -532,11 +612,15 @@ class _LIBCPP_TYPE_VIS_ONLY forward_list
|
|||||||
typedef typename base::__node __node;
|
typedef typename base::__node __node;
|
||||||
typedef typename base::__node_traits __node_traits;
|
typedef typename base::__node_traits __node_traits;
|
||||||
typedef typename base::__node_pointer __node_pointer;
|
typedef typename base::__node_pointer __node_pointer;
|
||||||
|
typedef typename base::__begin_node_pointer __begin_node_pointer;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
typedef _Tp value_type;
|
typedef _Tp value_type;
|
||||||
typedef _Alloc allocator_type;
|
typedef _Alloc allocator_type;
|
||||||
|
|
||||||
|
static_assert((is_same<typename allocator_type::value_type, value_type>::value),
|
||||||
|
"Allocator::value_type must be same type as value_type");
|
||||||
|
|
||||||
typedef value_type& reference;
|
typedef value_type& reference;
|
||||||
typedef const value_type& const_reference;
|
typedef const value_type& const_reference;
|
||||||
typedef typename allocator_traits<allocator_type>::pointer pointer;
|
typedef typename allocator_traits<allocator_type>::pointer pointer;
|
||||||
@@ -551,6 +635,7 @@ public:
|
|||||||
forward_list()
|
forward_list()
|
||||||
_NOEXCEPT_(is_nothrow_default_constructible<__node_allocator>::value)
|
_NOEXCEPT_(is_nothrow_default_constructible<__node_allocator>::value)
|
||||||
{} // = default;
|
{} // = default;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
explicit forward_list(const allocator_type& __a);
|
explicit forward_list(const allocator_type& __a);
|
||||||
explicit forward_list(size_type __n);
|
explicit forward_list(size_type __n);
|
||||||
#if _LIBCPP_STD_VER > 11
|
#if _LIBCPP_STD_VER > 11
|
||||||
@@ -587,12 +672,14 @@ public:
|
|||||||
|
|
||||||
forward_list& operator=(const forward_list& __x);
|
forward_list& operator=(const forward_list& __x);
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
forward_list& operator=(forward_list&& __x)
|
forward_list& operator=(forward_list&& __x)
|
||||||
_NOEXCEPT_(
|
_NOEXCEPT_(
|
||||||
__node_traits::propagate_on_container_move_assignment::value &&
|
__node_traits::propagate_on_container_move_assignment::value &&
|
||||||
is_nothrow_move_assignable<allocator_type>::value);
|
is_nothrow_move_assignable<allocator_type>::value);
|
||||||
#endif
|
#endif
|
||||||
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
forward_list& operator=(initializer_list<value_type> __il);
|
forward_list& operator=(initializer_list<value_type> __il);
|
||||||
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
||||||
|
|
||||||
@@ -605,6 +692,7 @@ public:
|
|||||||
assign(_InputIterator __f, _InputIterator __l);
|
assign(_InputIterator __f, _InputIterator __l);
|
||||||
void assign(size_type __n, const value_type& __v);
|
void assign(size_type __n, const value_type& __v);
|
||||||
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void assign(initializer_list<value_type> __il);
|
void assign(initializer_list<value_type> __il);
|
||||||
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
||||||
|
|
||||||
@@ -735,7 +823,7 @@ public:
|
|||||||
template <class _Compare> void merge(forward_list& __x, _Compare __comp);
|
template <class _Compare> void merge(forward_list& __x, _Compare __comp);
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void sort() {sort(__less<value_type>());}
|
void sort() {sort(__less<value_type>());}
|
||||||
template <class _Compare> void sort(_Compare __comp);
|
template <class _Compare> _LIBCPP_INLINE_VISIBILITY void sort(_Compare __comp);
|
||||||
void reverse() _NOEXCEPT;
|
void reverse() _NOEXCEPT;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -758,7 +846,7 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
template <class _Tp, class _Alloc>
|
template <class _Tp, class _Alloc>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
forward_list<_Tp, _Alloc>::forward_list(const allocator_type& __a)
|
forward_list<_Tp, _Alloc>::forward_list(const allocator_type& __a)
|
||||||
: base(__a)
|
: base(__a)
|
||||||
{
|
{
|
||||||
@@ -772,8 +860,8 @@ forward_list<_Tp, _Alloc>::forward_list(size_type __n)
|
|||||||
__node_allocator& __a = base::__alloc();
|
__node_allocator& __a = base::__alloc();
|
||||||
typedef __allocator_destructor<__node_allocator> _Dp;
|
typedef __allocator_destructor<__node_allocator> _Dp;
|
||||||
unique_ptr<__node, _Dp> __h(nullptr, _Dp(__a, 1));
|
unique_ptr<__node, _Dp> __h(nullptr, _Dp(__a, 1));
|
||||||
for (__node_pointer __p = base::__before_begin(); __n > 0; --__n,
|
for (__begin_node_pointer __p = base::__before_begin(); __n > 0; --__n,
|
||||||
__p = __p->__next_)
|
__p = __p->__next_as_begin())
|
||||||
{
|
{
|
||||||
__h.reset(__node_traits::allocate(__a, 1));
|
__h.reset(__node_traits::allocate(__a, 1));
|
||||||
__node_traits::construct(__a, _VSTD::addressof(__h->__value_));
|
__node_traits::construct(__a, _VSTD::addressof(__h->__value_));
|
||||||
@@ -793,8 +881,8 @@ forward_list<_Tp, _Alloc>::forward_list(size_type __n, const allocator_type& __a
|
|||||||
__node_allocator& __a = base::__alloc();
|
__node_allocator& __a = base::__alloc();
|
||||||
typedef __allocator_destructor<__node_allocator> _Dp;
|
typedef __allocator_destructor<__node_allocator> _Dp;
|
||||||
unique_ptr<__node, _Dp> __h(nullptr, _Dp(__a, 1));
|
unique_ptr<__node, _Dp> __h(nullptr, _Dp(__a, 1));
|
||||||
for (__node_pointer __p = base::__before_begin(); __n > 0; --__n,
|
for (__begin_node_pointer __p = base::__before_begin(); __n > 0; --__n,
|
||||||
__p = __p->__next_)
|
__p = __p->__next_as_begin())
|
||||||
{
|
{
|
||||||
__h.reset(__node_traits::allocate(__a, 1));
|
__h.reset(__node_traits::allocate(__a, 1));
|
||||||
__node_traits::construct(__a, _VSTD::addressof(__h->__value_));
|
__node_traits::construct(__a, _VSTD::addressof(__h->__value_));
|
||||||
@@ -932,7 +1020,7 @@ forward_list<_Tp, _Alloc>::__move_assign(forward_list& __x, false_type)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class _Alloc>
|
template <class _Tp, class _Alloc>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
forward_list<_Tp, _Alloc>&
|
forward_list<_Tp, _Alloc>&
|
||||||
forward_list<_Tp, _Alloc>::operator=(forward_list&& __x)
|
forward_list<_Tp, _Alloc>::operator=(forward_list&& __x)
|
||||||
_NOEXCEPT_(
|
_NOEXCEPT_(
|
||||||
@@ -949,7 +1037,7 @@ forward_list<_Tp, _Alloc>::operator=(forward_list&& __x)
|
|||||||
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
||||||
|
|
||||||
template <class _Tp, class _Alloc>
|
template <class _Tp, class _Alloc>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
forward_list<_Tp, _Alloc>&
|
forward_list<_Tp, _Alloc>&
|
||||||
forward_list<_Tp, _Alloc>::operator=(initializer_list<value_type> __il)
|
forward_list<_Tp, _Alloc>::operator=(initializer_list<value_type> __il)
|
||||||
{
|
{
|
||||||
@@ -997,7 +1085,7 @@ forward_list<_Tp, _Alloc>::assign(size_type __n, const value_type& __v)
|
|||||||
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
||||||
|
|
||||||
template <class _Tp, class _Alloc>
|
template <class _Tp, class _Alloc>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
forward_list<_Tp, _Alloc>::assign(initializer_list<value_type> __il)
|
forward_list<_Tp, _Alloc>::assign(initializer_list<value_type> __il)
|
||||||
{
|
{
|
||||||
@@ -1070,7 +1158,7 @@ template <class... _Args>
|
|||||||
typename forward_list<_Tp, _Alloc>::iterator
|
typename forward_list<_Tp, _Alloc>::iterator
|
||||||
forward_list<_Tp, _Alloc>::emplace_after(const_iterator __p, _Args&&... __args)
|
forward_list<_Tp, _Alloc>::emplace_after(const_iterator __p, _Args&&... __args)
|
||||||
{
|
{
|
||||||
__node_pointer const __r = __p.__ptr_;
|
__begin_node_pointer const __r = __p.__get_begin();
|
||||||
__node_allocator& __a = base::__alloc();
|
__node_allocator& __a = base::__alloc();
|
||||||
typedef __allocator_destructor<__node_allocator> _Dp;
|
typedef __allocator_destructor<__node_allocator> _Dp;
|
||||||
unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1));
|
unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1));
|
||||||
@@ -1087,7 +1175,7 @@ template <class _Tp, class _Alloc>
|
|||||||
typename forward_list<_Tp, _Alloc>::iterator
|
typename forward_list<_Tp, _Alloc>::iterator
|
||||||
forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, value_type&& __v)
|
forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, value_type&& __v)
|
||||||
{
|
{
|
||||||
__node_pointer const __r = __p.__ptr_;
|
__begin_node_pointer const __r = __p.__get_begin();
|
||||||
__node_allocator& __a = base::__alloc();
|
__node_allocator& __a = base::__alloc();
|
||||||
typedef __allocator_destructor<__node_allocator> _Dp;
|
typedef __allocator_destructor<__node_allocator> _Dp;
|
||||||
unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1));
|
unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1));
|
||||||
@@ -1103,7 +1191,7 @@ template <class _Tp, class _Alloc>
|
|||||||
typename forward_list<_Tp, _Alloc>::iterator
|
typename forward_list<_Tp, _Alloc>::iterator
|
||||||
forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, const value_type& __v)
|
forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, const value_type& __v)
|
||||||
{
|
{
|
||||||
__node_pointer const __r = __p.__ptr_;
|
__begin_node_pointer const __r = __p.__get_begin();
|
||||||
__node_allocator& __a = base::__alloc();
|
__node_allocator& __a = base::__alloc();
|
||||||
typedef __allocator_destructor<__node_allocator> _Dp;
|
typedef __allocator_destructor<__node_allocator> _Dp;
|
||||||
unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1));
|
unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1));
|
||||||
@@ -1118,7 +1206,7 @@ typename forward_list<_Tp, _Alloc>::iterator
|
|||||||
forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, size_type __n,
|
forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, size_type __n,
|
||||||
const value_type& __v)
|
const value_type& __v)
|
||||||
{
|
{
|
||||||
__node_pointer __r = __p.__ptr_;
|
__begin_node_pointer __r = __p.__get_begin();
|
||||||
if (__n > 0)
|
if (__n > 0)
|
||||||
{
|
{
|
||||||
__node_allocator& __a = base::__alloc();
|
__node_allocator& __a = base::__alloc();
|
||||||
@@ -1153,7 +1241,7 @@ forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, size_type __n,
|
|||||||
#endif // _LIBCPP_NO_EXCEPTIONS
|
#endif // _LIBCPP_NO_EXCEPTIONS
|
||||||
__last->__next_ = __r->__next_;
|
__last->__next_ = __r->__next_;
|
||||||
__r->__next_ = __first;
|
__r->__next_ = __first;
|
||||||
__r = __last;
|
__r = static_cast<__begin_node_pointer>(__last);
|
||||||
}
|
}
|
||||||
return iterator(__r);
|
return iterator(__r);
|
||||||
}
|
}
|
||||||
@@ -1168,7 +1256,7 @@ typename enable_if
|
|||||||
forward_list<_Tp, _Alloc>::insert_after(const_iterator __p,
|
forward_list<_Tp, _Alloc>::insert_after(const_iterator __p,
|
||||||
_InputIterator __f, _InputIterator __l)
|
_InputIterator __f, _InputIterator __l)
|
||||||
{
|
{
|
||||||
__node_pointer __r = __p.__ptr_;
|
__begin_node_pointer __r = __p.__get_begin();
|
||||||
if (__f != __l)
|
if (__f != __l)
|
||||||
{
|
{
|
||||||
__node_allocator& __a = base::__alloc();
|
__node_allocator& __a = base::__alloc();
|
||||||
@@ -1203,7 +1291,7 @@ forward_list<_Tp, _Alloc>::insert_after(const_iterator __p,
|
|||||||
#endif // _LIBCPP_NO_EXCEPTIONS
|
#endif // _LIBCPP_NO_EXCEPTIONS
|
||||||
__last->__next_ = __r->__next_;
|
__last->__next_ = __r->__next_;
|
||||||
__r->__next_ = __first;
|
__r->__next_ = __first;
|
||||||
__r = __last;
|
__r = static_cast<__begin_node_pointer>(__last);
|
||||||
}
|
}
|
||||||
return iterator(__r);
|
return iterator(__r);
|
||||||
}
|
}
|
||||||
@@ -1212,7 +1300,7 @@ template <class _Tp, class _Alloc>
|
|||||||
typename forward_list<_Tp, _Alloc>::iterator
|
typename forward_list<_Tp, _Alloc>::iterator
|
||||||
forward_list<_Tp, _Alloc>::erase_after(const_iterator __f)
|
forward_list<_Tp, _Alloc>::erase_after(const_iterator __f)
|
||||||
{
|
{
|
||||||
__node_pointer __p = __f.__ptr_;
|
__begin_node_pointer __p = __f.__get_begin();
|
||||||
__node_pointer __n = __p->__next_;
|
__node_pointer __n = __p->__next_;
|
||||||
__p->__next_ = __n->__next_;
|
__p->__next_ = __n->__next_;
|
||||||
__node_allocator& __a = base::__alloc();
|
__node_allocator& __a = base::__alloc();
|
||||||
@@ -1225,21 +1313,22 @@ template <class _Tp, class _Alloc>
|
|||||||
typename forward_list<_Tp, _Alloc>::iterator
|
typename forward_list<_Tp, _Alloc>::iterator
|
||||||
forward_list<_Tp, _Alloc>::erase_after(const_iterator __f, const_iterator __l)
|
forward_list<_Tp, _Alloc>::erase_after(const_iterator __f, const_iterator __l)
|
||||||
{
|
{
|
||||||
__node_pointer __e = __l.__ptr_;
|
__node_pointer __e = __l.__get_unsafe_node_pointer();
|
||||||
if (__f != __l)
|
if (__f != __l)
|
||||||
{
|
{
|
||||||
__node_pointer __p = __f.__ptr_;
|
__begin_node_pointer __bp = __f.__get_begin();
|
||||||
__node_pointer __n = __p->__next_;
|
|
||||||
|
__node_pointer __n = __bp->__next_;
|
||||||
if (__n != __e)
|
if (__n != __e)
|
||||||
{
|
{
|
||||||
__p->__next_ = __e;
|
__bp->__next_ = __e;
|
||||||
__node_allocator& __a = base::__alloc();
|
__node_allocator& __a = base::__alloc();
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
__p = __n->__next_;
|
__node_pointer __tmp = __n->__next_;
|
||||||
__node_traits::destroy(__a, _VSTD::addressof(__n->__value_));
|
__node_traits::destroy(__a, _VSTD::addressof(__n->__value_));
|
||||||
__node_traits::deallocate(__a, __n, 1);
|
__node_traits::deallocate(__a, __n, 1);
|
||||||
__n = __p;
|
__n = __tmp;
|
||||||
} while (__n != __e);
|
} while (__n != __e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1266,8 +1355,8 @@ forward_list<_Tp, _Alloc>::resize(size_type __n)
|
|||||||
__node_allocator& __a = base::__alloc();
|
__node_allocator& __a = base::__alloc();
|
||||||
typedef __allocator_destructor<__node_allocator> _Dp;
|
typedef __allocator_destructor<__node_allocator> _Dp;
|
||||||
unique_ptr<__node, _Dp> __h(nullptr, _Dp(__a, 1));
|
unique_ptr<__node, _Dp> __h(nullptr, _Dp(__a, 1));
|
||||||
for (__node_pointer __ptr = __p.__ptr_; __n > 0; --__n,
|
for (__begin_node_pointer __ptr = __p.__get_begin(); __n > 0; --__n,
|
||||||
__ptr = __ptr->__next_)
|
__ptr = __ptr->__next_as_begin())
|
||||||
{
|
{
|
||||||
__h.reset(__node_traits::allocate(__a, 1));
|
__h.reset(__node_traits::allocate(__a, 1));
|
||||||
__node_traits::construct(__a, _VSTD::addressof(__h->__value_));
|
__node_traits::construct(__a, _VSTD::addressof(__h->__value_));
|
||||||
@@ -1298,8 +1387,8 @@ forward_list<_Tp, _Alloc>::resize(size_type __n, const value_type& __v)
|
|||||||
__node_allocator& __a = base::__alloc();
|
__node_allocator& __a = base::__alloc();
|
||||||
typedef __allocator_destructor<__node_allocator> _Dp;
|
typedef __allocator_destructor<__node_allocator> _Dp;
|
||||||
unique_ptr<__node, _Dp> __h(nullptr, _Dp(__a, 1));
|
unique_ptr<__node, _Dp> __h(nullptr, _Dp(__a, 1));
|
||||||
for (__node_pointer __ptr = __p.__ptr_; __n > 0; --__n,
|
for (__begin_node_pointer __ptr = __p.__get_begin(); __n > 0; --__n,
|
||||||
__ptr = __ptr->__next_)
|
__ptr = __ptr->__next_as_begin())
|
||||||
{
|
{
|
||||||
__h.reset(__node_traits::allocate(__a, 1));
|
__h.reset(__node_traits::allocate(__a, 1));
|
||||||
__node_traits::construct(__a, _VSTD::addressof(__h->__value_), __v);
|
__node_traits::construct(__a, _VSTD::addressof(__h->__value_), __v);
|
||||||
@@ -1317,14 +1406,14 @@ forward_list<_Tp, _Alloc>::splice_after(const_iterator __p,
|
|||||||
{
|
{
|
||||||
if (!__x.empty())
|
if (!__x.empty())
|
||||||
{
|
{
|
||||||
if (__p.__ptr_->__next_ != nullptr)
|
if (__p.__get_begin()->__next_ != nullptr)
|
||||||
{
|
{
|
||||||
const_iterator __lm1 = __x.before_begin();
|
const_iterator __lm1 = __x.before_begin();
|
||||||
while (__lm1.__ptr_->__next_ != nullptr)
|
while (__lm1.__get_begin()->__next_ != nullptr)
|
||||||
++__lm1;
|
++__lm1;
|
||||||
__lm1.__ptr_->__next_ = __p.__ptr_->__next_;
|
__lm1.__get_begin()->__next_ = __p.__get_begin()->__next_;
|
||||||
}
|
}
|
||||||
__p.__ptr_->__next_ = __x.__before_begin()->__next_;
|
__p.__get_begin()->__next_ = __x.__before_begin()->__next_;
|
||||||
__x.__before_begin()->__next_ = nullptr;
|
__x.__before_begin()->__next_ = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1338,9 +1427,9 @@ forward_list<_Tp, _Alloc>::splice_after(const_iterator __p,
|
|||||||
const_iterator __lm1 = _VSTD::next(__i);
|
const_iterator __lm1 = _VSTD::next(__i);
|
||||||
if (__p != __i && __p != __lm1)
|
if (__p != __i && __p != __lm1)
|
||||||
{
|
{
|
||||||
__i.__ptr_->__next_ = __lm1.__ptr_->__next_;
|
__i.__get_begin()->__next_ = __lm1.__get_begin()->__next_;
|
||||||
__lm1.__ptr_->__next_ = __p.__ptr_->__next_;
|
__lm1.__get_begin()->__next_ = __p.__get_begin()->__next_;
|
||||||
__p.__ptr_->__next_ = __lm1.__ptr_;
|
__p.__get_begin()->__next_ = __lm1.__get_unsafe_node_pointer();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1353,13 +1442,13 @@ forward_list<_Tp, _Alloc>::splice_after(const_iterator __p,
|
|||||||
if (__f != __l && __p != __f)
|
if (__f != __l && __p != __f)
|
||||||
{
|
{
|
||||||
const_iterator __lm1 = __f;
|
const_iterator __lm1 = __f;
|
||||||
while (__lm1.__ptr_->__next_ != __l.__ptr_)
|
while (__lm1.__get_begin()->__next_ != __l.__get_begin())
|
||||||
++__lm1;
|
++__lm1;
|
||||||
if (__f != __lm1)
|
if (__f != __lm1)
|
||||||
{
|
{
|
||||||
__lm1.__ptr_->__next_ = __p.__ptr_->__next_;
|
__lm1.__get_begin()->__next_ = __p.__get_begin()->__next_;
|
||||||
__p.__ptr_->__next_ = __f.__ptr_->__next_;
|
__p.__get_begin()->__next_ = __f.__get_begin()->__next_;
|
||||||
__f.__ptr_->__next_ = __l.__ptr_;
|
__f.__get_begin()->__next_ = __l.__get_unsafe_node_pointer();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1403,9 +1492,9 @@ forward_list<_Tp, _Alloc>::remove(const value_type& __v)
|
|||||||
{
|
{
|
||||||
forward_list<_Tp, _Alloc> __deleted_nodes; // collect the nodes we're removing
|
forward_list<_Tp, _Alloc> __deleted_nodes; // collect the nodes we're removing
|
||||||
iterator __e = end();
|
iterator __e = end();
|
||||||
for (iterator __i = before_begin(); __i.__ptr_->__next_ != nullptr;)
|
for (iterator __i = before_begin(); __i.__get_begin()->__next_ != nullptr;)
|
||||||
{
|
{
|
||||||
if (__i.__ptr_->__next_->__value_ == __v)
|
if (__i.__get_begin()->__next_->__value_ == __v)
|
||||||
{
|
{
|
||||||
iterator __j = _VSTD::next(__i, 2);
|
iterator __j = _VSTD::next(__i, 2);
|
||||||
for (; __j != __e && *__j == __v; ++__j)
|
for (; __j != __e && *__j == __v; ++__j)
|
||||||
@@ -1426,9 +1515,9 @@ void
|
|||||||
forward_list<_Tp, _Alloc>::remove_if(_Predicate __pred)
|
forward_list<_Tp, _Alloc>::remove_if(_Predicate __pred)
|
||||||
{
|
{
|
||||||
iterator __e = end();
|
iterator __e = end();
|
||||||
for (iterator __i = before_begin(); __i.__ptr_->__next_ != nullptr;)
|
for (iterator __i = before_begin(); __i.__get_begin()->__next_ != nullptr;)
|
||||||
{
|
{
|
||||||
if (__pred(__i.__ptr_->__next_->__value_))
|
if (__pred(__i.__get_begin()->__next_->__value_))
|
||||||
{
|
{
|
||||||
iterator __j = _VSTD::next(__i, 2);
|
iterator __j = _VSTD::next(__i, 2);
|
||||||
for (; __j != __e && __pred(*__j); ++__j)
|
for (; __j != __e && __pred(*__j); ++__j)
|
||||||
@@ -1453,7 +1542,7 @@ forward_list<_Tp, _Alloc>::unique(_BinaryPredicate __binary_pred)
|
|||||||
iterator __j = _VSTD::next(__i);
|
iterator __j = _VSTD::next(__i);
|
||||||
for (; __j != __e && __binary_pred(*__i, *__j); ++__j)
|
for (; __j != __e && __binary_pred(*__i, *__j); ++__j)
|
||||||
;
|
;
|
||||||
if (__i.__ptr_->__next_ != __j.__ptr_)
|
if (__i.__get_begin()->__next_ != __j.__get_unsafe_node_pointer())
|
||||||
erase_after(__i, __j);
|
erase_after(__i, __j);
|
||||||
__i = __j;
|
__i = __j;
|
||||||
}
|
}
|
||||||
@@ -1520,7 +1609,7 @@ forward_list<_Tp, _Alloc>::__merge(__node_pointer __f1, __node_pointer __f2,
|
|||||||
|
|
||||||
template <class _Tp, class _Alloc>
|
template <class _Tp, class _Alloc>
|
||||||
template <class _Compare>
|
template <class _Compare>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
forward_list<_Tp, _Alloc>::sort(_Compare __comp)
|
forward_list<_Tp, _Alloc>::sort(_Compare __comp)
|
||||||
{
|
{
|
||||||
@@ -1551,7 +1640,7 @@ forward_list<_Tp, _Alloc>::__sort(__node_pointer __f1, difference_type __sz,
|
|||||||
}
|
}
|
||||||
difference_type __sz1 = __sz / 2;
|
difference_type __sz1 = __sz / 2;
|
||||||
difference_type __sz2 = __sz - __sz1;
|
difference_type __sz2 = __sz - __sz1;
|
||||||
__node_pointer __t = _VSTD::next(iterator(__f1), __sz1 - 1).__ptr_;
|
__node_pointer __t = _VSTD::next(iterator(__f1), __sz1 - 1).__get_unsafe_node_pointer();
|
||||||
__node_pointer __f2 = __t->__next_;
|
__node_pointer __f2 = __t->__next_;
|
||||||
__t->__next_ = nullptr;
|
__t->__next_ = nullptr;
|
||||||
return __merge(__sort(__f1, __sz1, __comp),
|
return __merge(__sort(__f1, __sz1, __comp),
|
||||||
|
|||||||
@@ -200,14 +200,17 @@ public:
|
|||||||
|
|
||||||
// 27.9.1.3 Assign/swap:
|
// 27.9.1.3 Assign/swap:
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
basic_filebuf& operator=(basic_filebuf&& __rhs);
|
basic_filebuf& operator=(basic_filebuf&& __rhs);
|
||||||
#endif
|
#endif
|
||||||
void swap(basic_filebuf& __rhs);
|
void swap(basic_filebuf& __rhs);
|
||||||
|
|
||||||
// 27.9.1.4 Members:
|
// 27.9.1.4 Members:
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
bool is_open() const;
|
bool is_open() const;
|
||||||
#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
|
#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
|
||||||
basic_filebuf* open(const char* __s, ios_base::openmode __mode);
|
basic_filebuf* open(const char* __s, ios_base::openmode __mode);
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
basic_filebuf* open(const string& __s, ios_base::openmode __mode);
|
basic_filebuf* open(const string& __s, ios_base::openmode __mode);
|
||||||
#endif
|
#endif
|
||||||
basic_filebuf* close();
|
basic_filebuf* close();
|
||||||
@@ -340,7 +343,7 @@ basic_filebuf<_CharT, _Traits>::basic_filebuf(basic_filebuf&& __rhs)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _CharT, class _Traits>
|
template <class _CharT, class _Traits>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
basic_filebuf<_CharT, _Traits>&
|
basic_filebuf<_CharT, _Traits>&
|
||||||
basic_filebuf<_CharT, _Traits>::operator=(basic_filebuf&& __rhs)
|
basic_filebuf<_CharT, _Traits>::operator=(basic_filebuf&& __rhs)
|
||||||
{
|
{
|
||||||
@@ -458,7 +461,7 @@ swap(basic_filebuf<_CharT, _Traits>& __x, basic_filebuf<_CharT, _Traits>& __y)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _CharT, class _Traits>
|
template <class _CharT, class _Traits>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
bool
|
bool
|
||||||
basic_filebuf<_CharT, _Traits>::is_open() const
|
basic_filebuf<_CharT, _Traits>::is_open() const
|
||||||
{
|
{
|
||||||
@@ -547,7 +550,7 @@ basic_filebuf<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _CharT, class _Traits>
|
template <class _CharT, class _Traits>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
basic_filebuf<_CharT, _Traits>*
|
basic_filebuf<_CharT, _Traits>*
|
||||||
basic_filebuf<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode)
|
basic_filebuf<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode)
|
||||||
{
|
{
|
||||||
@@ -1008,26 +1011,35 @@ public:
|
|||||||
typedef typename traits_type::pos_type pos_type;
|
typedef typename traits_type::pos_type pos_type;
|
||||||
typedef typename traits_type::off_type off_type;
|
typedef typename traits_type::off_type off_type;
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
basic_ifstream();
|
basic_ifstream();
|
||||||
#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
|
#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
explicit basic_ifstream(const char* __s, ios_base::openmode __mode = ios_base::in);
|
explicit basic_ifstream(const char* __s, ios_base::openmode __mode = ios_base::in);
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
explicit basic_ifstream(const string& __s, ios_base::openmode __mode = ios_base::in);
|
explicit basic_ifstream(const string& __s, ios_base::openmode __mode = ios_base::in);
|
||||||
#endif
|
#endif
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
basic_ifstream(basic_ifstream&& __rhs);
|
basic_ifstream(basic_ifstream&& __rhs);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
basic_ifstream& operator=(basic_ifstream&& __rhs);
|
basic_ifstream& operator=(basic_ifstream&& __rhs);
|
||||||
#endif
|
#endif
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void swap(basic_ifstream& __rhs);
|
void swap(basic_ifstream& __rhs);
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
basic_filebuf<char_type, traits_type>* rdbuf() const;
|
basic_filebuf<char_type, traits_type>* rdbuf() const;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
bool is_open() const;
|
bool is_open() const;
|
||||||
#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
|
#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
|
||||||
void open(const char* __s, ios_base::openmode __mode = ios_base::in);
|
void open(const char* __s, ios_base::openmode __mode = ios_base::in);
|
||||||
void open(const string& __s, ios_base::openmode __mode = ios_base::in);
|
void open(const string& __s, ios_base::openmode __mode = ios_base::in);
|
||||||
#endif
|
#endif
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void close();
|
void close();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -1035,7 +1047,7 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
template <class _CharT, class _Traits>
|
template <class _CharT, class _Traits>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
basic_ifstream<_CharT, _Traits>::basic_ifstream()
|
basic_ifstream<_CharT, _Traits>::basic_ifstream()
|
||||||
: basic_istream<char_type, traits_type>(&__sb_)
|
: basic_istream<char_type, traits_type>(&__sb_)
|
||||||
{
|
{
|
||||||
@@ -1043,7 +1055,7 @@ basic_ifstream<_CharT, _Traits>::basic_ifstream()
|
|||||||
|
|
||||||
#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
|
#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
|
||||||
template <class _CharT, class _Traits>
|
template <class _CharT, class _Traits>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
basic_ifstream<_CharT, _Traits>::basic_ifstream(const char* __s, ios_base::openmode __mode)
|
basic_ifstream<_CharT, _Traits>::basic_ifstream(const char* __s, ios_base::openmode __mode)
|
||||||
: basic_istream<char_type, traits_type>(&__sb_)
|
: basic_istream<char_type, traits_type>(&__sb_)
|
||||||
{
|
{
|
||||||
@@ -1052,7 +1064,7 @@ basic_ifstream<_CharT, _Traits>::basic_ifstream(const char* __s, ios_base::openm
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _CharT, class _Traits>
|
template <class _CharT, class _Traits>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
basic_ifstream<_CharT, _Traits>::basic_ifstream(const string& __s, ios_base::openmode __mode)
|
basic_ifstream<_CharT, _Traits>::basic_ifstream(const string& __s, ios_base::openmode __mode)
|
||||||
: basic_istream<char_type, traits_type>(&__sb_)
|
: basic_istream<char_type, traits_type>(&__sb_)
|
||||||
{
|
{
|
||||||
@@ -1064,7 +1076,7 @@ basic_ifstream<_CharT, _Traits>::basic_ifstream(const string& __s, ios_base::ope
|
|||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
|
||||||
template <class _CharT, class _Traits>
|
template <class _CharT, class _Traits>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
basic_ifstream<_CharT, _Traits>::basic_ifstream(basic_ifstream&& __rhs)
|
basic_ifstream<_CharT, _Traits>::basic_ifstream(basic_ifstream&& __rhs)
|
||||||
: basic_istream<char_type, traits_type>(_VSTD::move(__rhs)),
|
: basic_istream<char_type, traits_type>(_VSTD::move(__rhs)),
|
||||||
__sb_(_VSTD::move(__rhs.__sb_))
|
__sb_(_VSTD::move(__rhs.__sb_))
|
||||||
@@ -1073,7 +1085,7 @@ basic_ifstream<_CharT, _Traits>::basic_ifstream(basic_ifstream&& __rhs)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _CharT, class _Traits>
|
template <class _CharT, class _Traits>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
basic_ifstream<_CharT, _Traits>&
|
basic_ifstream<_CharT, _Traits>&
|
||||||
basic_ifstream<_CharT, _Traits>::operator=(basic_ifstream&& __rhs)
|
basic_ifstream<_CharT, _Traits>::operator=(basic_ifstream&& __rhs)
|
||||||
{
|
{
|
||||||
@@ -1085,7 +1097,7 @@ basic_ifstream<_CharT, _Traits>::operator=(basic_ifstream&& __rhs)
|
|||||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
|
||||||
template <class _CharT, class _Traits>
|
template <class _CharT, class _Traits>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
basic_ifstream<_CharT, _Traits>::swap(basic_ifstream& __rhs)
|
basic_ifstream<_CharT, _Traits>::swap(basic_ifstream& __rhs)
|
||||||
{
|
{
|
||||||
@@ -1102,7 +1114,7 @@ swap(basic_ifstream<_CharT, _Traits>& __x, basic_ifstream<_CharT, _Traits>& __y)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _CharT, class _Traits>
|
template <class _CharT, class _Traits>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
basic_filebuf<_CharT, _Traits>*
|
basic_filebuf<_CharT, _Traits>*
|
||||||
basic_ifstream<_CharT, _Traits>::rdbuf() const
|
basic_ifstream<_CharT, _Traits>::rdbuf() const
|
||||||
{
|
{
|
||||||
@@ -1110,7 +1122,7 @@ basic_ifstream<_CharT, _Traits>::rdbuf() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _CharT, class _Traits>
|
template <class _CharT, class _Traits>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
bool
|
bool
|
||||||
basic_ifstream<_CharT, _Traits>::is_open() const
|
basic_ifstream<_CharT, _Traits>::is_open() const
|
||||||
{
|
{
|
||||||
@@ -1140,7 +1152,7 @@ basic_ifstream<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mo
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
template <class _CharT, class _Traits>
|
template <class _CharT, class _Traits>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
basic_ifstream<_CharT, _Traits>::close()
|
basic_ifstream<_CharT, _Traits>::close()
|
||||||
{
|
{
|
||||||
@@ -1161,24 +1173,33 @@ public:
|
|||||||
typedef typename traits_type::pos_type pos_type;
|
typedef typename traits_type::pos_type pos_type;
|
||||||
typedef typename traits_type::off_type off_type;
|
typedef typename traits_type::off_type off_type;
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
basic_ofstream();
|
basic_ofstream();
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
explicit basic_ofstream(const char* __s, ios_base::openmode __mode = ios_base::out);
|
explicit basic_ofstream(const char* __s, ios_base::openmode __mode = ios_base::out);
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
explicit basic_ofstream(const string& __s, ios_base::openmode __mode = ios_base::out);
|
explicit basic_ofstream(const string& __s, ios_base::openmode __mode = ios_base::out);
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
basic_ofstream(basic_ofstream&& __rhs);
|
basic_ofstream(basic_ofstream&& __rhs);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
basic_ofstream& operator=(basic_ofstream&& __rhs);
|
basic_ofstream& operator=(basic_ofstream&& __rhs);
|
||||||
#endif
|
#endif
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void swap(basic_ofstream& __rhs);
|
void swap(basic_ofstream& __rhs);
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
basic_filebuf<char_type, traits_type>* rdbuf() const;
|
basic_filebuf<char_type, traits_type>* rdbuf() const;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
bool is_open() const;
|
bool is_open() const;
|
||||||
#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
|
#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
|
||||||
void open(const char* __s, ios_base::openmode __mode = ios_base::out);
|
void open(const char* __s, ios_base::openmode __mode = ios_base::out);
|
||||||
void open(const string& __s, ios_base::openmode __mode = ios_base::out);
|
void open(const string& __s, ios_base::openmode __mode = ios_base::out);
|
||||||
#endif
|
#endif
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void close();
|
void close();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -1186,7 +1207,7 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
template <class _CharT, class _Traits>
|
template <class _CharT, class _Traits>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
basic_ofstream<_CharT, _Traits>::basic_ofstream()
|
basic_ofstream<_CharT, _Traits>::basic_ofstream()
|
||||||
: basic_ostream<char_type, traits_type>(&__sb_)
|
: basic_ostream<char_type, traits_type>(&__sb_)
|
||||||
{
|
{
|
||||||
@@ -1194,7 +1215,7 @@ basic_ofstream<_CharT, _Traits>::basic_ofstream()
|
|||||||
|
|
||||||
#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
|
#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
|
||||||
template <class _CharT, class _Traits>
|
template <class _CharT, class _Traits>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
basic_ofstream<_CharT, _Traits>::basic_ofstream(const char* __s, ios_base::openmode __mode)
|
basic_ofstream<_CharT, _Traits>::basic_ofstream(const char* __s, ios_base::openmode __mode)
|
||||||
: basic_ostream<char_type, traits_type>(&__sb_)
|
: basic_ostream<char_type, traits_type>(&__sb_)
|
||||||
{
|
{
|
||||||
@@ -1203,7 +1224,7 @@ basic_ofstream<_CharT, _Traits>::basic_ofstream(const char* __s, ios_base::openm
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _CharT, class _Traits>
|
template <class _CharT, class _Traits>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
basic_ofstream<_CharT, _Traits>::basic_ofstream(const string& __s, ios_base::openmode __mode)
|
basic_ofstream<_CharT, _Traits>::basic_ofstream(const string& __s, ios_base::openmode __mode)
|
||||||
: basic_ostream<char_type, traits_type>(&__sb_)
|
: basic_ostream<char_type, traits_type>(&__sb_)
|
||||||
{
|
{
|
||||||
@@ -1215,7 +1236,7 @@ basic_ofstream<_CharT, _Traits>::basic_ofstream(const string& __s, ios_base::ope
|
|||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
|
||||||
template <class _CharT, class _Traits>
|
template <class _CharT, class _Traits>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
basic_ofstream<_CharT, _Traits>::basic_ofstream(basic_ofstream&& __rhs)
|
basic_ofstream<_CharT, _Traits>::basic_ofstream(basic_ofstream&& __rhs)
|
||||||
: basic_ostream<char_type, traits_type>(_VSTD::move(__rhs)),
|
: basic_ostream<char_type, traits_type>(_VSTD::move(__rhs)),
|
||||||
__sb_(_VSTD::move(__rhs.__sb_))
|
__sb_(_VSTD::move(__rhs.__sb_))
|
||||||
@@ -1224,7 +1245,7 @@ basic_ofstream<_CharT, _Traits>::basic_ofstream(basic_ofstream&& __rhs)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _CharT, class _Traits>
|
template <class _CharT, class _Traits>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
basic_ofstream<_CharT, _Traits>&
|
basic_ofstream<_CharT, _Traits>&
|
||||||
basic_ofstream<_CharT, _Traits>::operator=(basic_ofstream&& __rhs)
|
basic_ofstream<_CharT, _Traits>::operator=(basic_ofstream&& __rhs)
|
||||||
{
|
{
|
||||||
@@ -1236,7 +1257,7 @@ basic_ofstream<_CharT, _Traits>::operator=(basic_ofstream&& __rhs)
|
|||||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
|
||||||
template <class _CharT, class _Traits>
|
template <class _CharT, class _Traits>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
basic_ofstream<_CharT, _Traits>::swap(basic_ofstream& __rhs)
|
basic_ofstream<_CharT, _Traits>::swap(basic_ofstream& __rhs)
|
||||||
{
|
{
|
||||||
@@ -1253,7 +1274,7 @@ swap(basic_ofstream<_CharT, _Traits>& __x, basic_ofstream<_CharT, _Traits>& __y)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _CharT, class _Traits>
|
template <class _CharT, class _Traits>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
basic_filebuf<_CharT, _Traits>*
|
basic_filebuf<_CharT, _Traits>*
|
||||||
basic_ofstream<_CharT, _Traits>::rdbuf() const
|
basic_ofstream<_CharT, _Traits>::rdbuf() const
|
||||||
{
|
{
|
||||||
@@ -1261,7 +1282,7 @@ basic_ofstream<_CharT, _Traits>::rdbuf() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _CharT, class _Traits>
|
template <class _CharT, class _Traits>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
bool
|
bool
|
||||||
basic_ofstream<_CharT, _Traits>::is_open() const
|
basic_ofstream<_CharT, _Traits>::is_open() const
|
||||||
{
|
{
|
||||||
@@ -1291,7 +1312,7 @@ basic_ofstream<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mo
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
template <class _CharT, class _Traits>
|
template <class _CharT, class _Traits>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
basic_ofstream<_CharT, _Traits>::close()
|
basic_ofstream<_CharT, _Traits>::close()
|
||||||
{
|
{
|
||||||
@@ -1312,26 +1333,35 @@ public:
|
|||||||
typedef typename traits_type::pos_type pos_type;
|
typedef typename traits_type::pos_type pos_type;
|
||||||
typedef typename traits_type::off_type off_type;
|
typedef typename traits_type::off_type off_type;
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
basic_fstream();
|
basic_fstream();
|
||||||
#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
|
#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
explicit basic_fstream(const char* __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
|
explicit basic_fstream(const char* __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
explicit basic_fstream(const string& __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
|
explicit basic_fstream(const string& __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
|
||||||
#endif
|
#endif
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
basic_fstream(basic_fstream&& __rhs);
|
basic_fstream(basic_fstream&& __rhs);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
basic_fstream& operator=(basic_fstream&& __rhs);
|
basic_fstream& operator=(basic_fstream&& __rhs);
|
||||||
#endif
|
#endif
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void swap(basic_fstream& __rhs);
|
void swap(basic_fstream& __rhs);
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
basic_filebuf<char_type, traits_type>* rdbuf() const;
|
basic_filebuf<char_type, traits_type>* rdbuf() const;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
bool is_open() const;
|
bool is_open() const;
|
||||||
#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
|
#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
|
||||||
void open(const char* __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
|
void open(const char* __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
|
||||||
void open(const string& __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
|
void open(const string& __s, ios_base::openmode __mode = ios_base::in | ios_base::out);
|
||||||
#endif
|
#endif
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void close();
|
void close();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -1339,7 +1369,7 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
template <class _CharT, class _Traits>
|
template <class _CharT, class _Traits>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
basic_fstream<_CharT, _Traits>::basic_fstream()
|
basic_fstream<_CharT, _Traits>::basic_fstream()
|
||||||
: basic_iostream<char_type, traits_type>(&__sb_)
|
: basic_iostream<char_type, traits_type>(&__sb_)
|
||||||
{
|
{
|
||||||
@@ -1347,7 +1377,7 @@ basic_fstream<_CharT, _Traits>::basic_fstream()
|
|||||||
|
|
||||||
#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
|
#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
|
||||||
template <class _CharT, class _Traits>
|
template <class _CharT, class _Traits>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
basic_fstream<_CharT, _Traits>::basic_fstream(const char* __s, ios_base::openmode __mode)
|
basic_fstream<_CharT, _Traits>::basic_fstream(const char* __s, ios_base::openmode __mode)
|
||||||
: basic_iostream<char_type, traits_type>(&__sb_)
|
: basic_iostream<char_type, traits_type>(&__sb_)
|
||||||
{
|
{
|
||||||
@@ -1356,7 +1386,7 @@ basic_fstream<_CharT, _Traits>::basic_fstream(const char* __s, ios_base::openmod
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _CharT, class _Traits>
|
template <class _CharT, class _Traits>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
basic_fstream<_CharT, _Traits>::basic_fstream(const string& __s, ios_base::openmode __mode)
|
basic_fstream<_CharT, _Traits>::basic_fstream(const string& __s, ios_base::openmode __mode)
|
||||||
: basic_iostream<char_type, traits_type>(&__sb_)
|
: basic_iostream<char_type, traits_type>(&__sb_)
|
||||||
{
|
{
|
||||||
@@ -1368,7 +1398,7 @@ basic_fstream<_CharT, _Traits>::basic_fstream(const string& __s, ios_base::openm
|
|||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
|
||||||
template <class _CharT, class _Traits>
|
template <class _CharT, class _Traits>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
basic_fstream<_CharT, _Traits>::basic_fstream(basic_fstream&& __rhs)
|
basic_fstream<_CharT, _Traits>::basic_fstream(basic_fstream&& __rhs)
|
||||||
: basic_iostream<char_type, traits_type>(_VSTD::move(__rhs)),
|
: basic_iostream<char_type, traits_type>(_VSTD::move(__rhs)),
|
||||||
__sb_(_VSTD::move(__rhs.__sb_))
|
__sb_(_VSTD::move(__rhs.__sb_))
|
||||||
@@ -1377,7 +1407,7 @@ basic_fstream<_CharT, _Traits>::basic_fstream(basic_fstream&& __rhs)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _CharT, class _Traits>
|
template <class _CharT, class _Traits>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
basic_fstream<_CharT, _Traits>&
|
basic_fstream<_CharT, _Traits>&
|
||||||
basic_fstream<_CharT, _Traits>::operator=(basic_fstream&& __rhs)
|
basic_fstream<_CharT, _Traits>::operator=(basic_fstream&& __rhs)
|
||||||
{
|
{
|
||||||
@@ -1389,7 +1419,7 @@ basic_fstream<_CharT, _Traits>::operator=(basic_fstream&& __rhs)
|
|||||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
|
||||||
template <class _CharT, class _Traits>
|
template <class _CharT, class _Traits>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
basic_fstream<_CharT, _Traits>::swap(basic_fstream& __rhs)
|
basic_fstream<_CharT, _Traits>::swap(basic_fstream& __rhs)
|
||||||
{
|
{
|
||||||
@@ -1406,7 +1436,7 @@ swap(basic_fstream<_CharT, _Traits>& __x, basic_fstream<_CharT, _Traits>& __y)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _CharT, class _Traits>
|
template <class _CharT, class _Traits>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
basic_filebuf<_CharT, _Traits>*
|
basic_filebuf<_CharT, _Traits>*
|
||||||
basic_fstream<_CharT, _Traits>::rdbuf() const
|
basic_fstream<_CharT, _Traits>::rdbuf() const
|
||||||
{
|
{
|
||||||
@@ -1414,7 +1444,7 @@ basic_fstream<_CharT, _Traits>::rdbuf() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _CharT, class _Traits>
|
template <class _CharT, class _Traits>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
bool
|
bool
|
||||||
basic_fstream<_CharT, _Traits>::is_open() const
|
basic_fstream<_CharT, _Traits>::is_open() const
|
||||||
{
|
{
|
||||||
@@ -1444,7 +1474,7 @@ basic_fstream<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mod
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
template <class _CharT, class _Traits>
|
template <class _CharT, class _Traits>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
basic_fstream<_CharT, _Traits>::close()
|
basic_fstream<_CharT, _Traits>::close()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -407,7 +407,7 @@ public:
|
|||||||
// function modifiers:
|
// function modifiers:
|
||||||
void swap(function&) noexcept;
|
void swap(function&) noexcept;
|
||||||
template<class F, class Alloc>
|
template<class F, class Alloc>
|
||||||
void assign(F&&, const Alloc&);
|
void assign(F&&, const Alloc&); // Removed in C++17
|
||||||
|
|
||||||
// function capacity:
|
// function capacity:
|
||||||
explicit operator bool() const noexcept;
|
explicit operator bool() const noexcept;
|
||||||
@@ -1249,7 +1249,7 @@ private:
|
|||||||
type __f_;
|
type __f_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
_LIBCPP_INLINE_VISIBILITY __mem_fn(type __f) : __f_(__f) {}
|
_LIBCPP_INLINE_VISIBILITY __mem_fn(type __f) _NOEXCEPT : __f_(__f) {}
|
||||||
|
|
||||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
||||||
// invoke
|
// invoke
|
||||||
@@ -1262,29 +1262,109 @@ public:
|
|||||||
#else
|
#else
|
||||||
|
|
||||||
template <class _A0>
|
template <class _A0>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
typename __invoke_return0<type, _A0>::type
|
typename __invoke_return0<type, _A0>::type
|
||||||
operator() (_A0& __a0) const {
|
operator() (_A0& __a0) const {
|
||||||
return __invoke(__f_, __a0);
|
return __invoke(__f_, __a0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <class _A0>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
typename __invoke_return0<type, _A0 const>::type
|
||||||
|
operator() (_A0 const& __a0) const {
|
||||||
|
return __invoke(__f_, __a0);
|
||||||
|
}
|
||||||
|
|
||||||
template <class _A0, class _A1>
|
template <class _A0, class _A1>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
typename __invoke_return1<type, _A0, _A1>::type
|
typename __invoke_return1<type, _A0, _A1>::type
|
||||||
operator() (_A0& __a0, _A1& __a1) const {
|
operator() (_A0& __a0, _A1& __a1) const {
|
||||||
return __invoke(__f_, __a0, __a1);
|
return __invoke(__f_, __a0, __a1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <class _A0, class _A1>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
typename __invoke_return1<type, _A0 const, _A1>::type
|
||||||
|
operator() (_A0 const& __a0, _A1& __a1) const {
|
||||||
|
return __invoke(__f_, __a0, __a1);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _A0, class _A1>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
typename __invoke_return1<type, _A0, _A1 const>::type
|
||||||
|
operator() (_A0& __a0, _A1 const& __a1) const {
|
||||||
|
return __invoke(__f_, __a0, __a1);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _A0, class _A1>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
typename __invoke_return1<type, _A0 const, _A1 const>::type
|
||||||
|
operator() (_A0 const& __a0, _A1 const& __a1) const {
|
||||||
|
return __invoke(__f_, __a0, __a1);
|
||||||
|
}
|
||||||
|
|
||||||
template <class _A0, class _A1, class _A2>
|
template <class _A0, class _A1, class _A2>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
typename __invoke_return2<type, _A0, _A1, _A2>::type
|
typename __invoke_return2<type, _A0, _A1, _A2>::type
|
||||||
operator() (_A0& __a0, _A1& __a1, _A2& __a2) const {
|
operator() (_A0& __a0, _A1& __a1, _A2& __a2) const {
|
||||||
return __invoke(__f_, __a0, __a1, __a2);
|
return __invoke(__f_, __a0, __a1, __a2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <class _A0, class _A1, class _A2>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
typename __invoke_return2<type, _A0 const, _A1, _A2>::type
|
||||||
|
operator() (_A0 const& __a0, _A1& __a1, _A2& __a2) const {
|
||||||
|
return __invoke(__f_, __a0, __a1, __a2);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _A0, class _A1, class _A2>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
typename __invoke_return2<type, _A0, _A1 const, _A2>::type
|
||||||
|
operator() (_A0& __a0, _A1 const& __a1, _A2& __a2) const {
|
||||||
|
return __invoke(__f_, __a0, __a1, __a2);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _A0, class _A1, class _A2>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
typename __invoke_return2<type, _A0, _A1, _A2 const>::type
|
||||||
|
operator() (_A0& __a0, _A1& __a1, _A2 const& __a2) const {
|
||||||
|
return __invoke(__f_, __a0, __a1, __a2);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _A0, class _A1, class _A2>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
typename __invoke_return2<type, _A0 const, _A1 const, _A2>::type
|
||||||
|
operator() (_A0 const& __a0, _A1 const& __a1, _A2& __a2) const {
|
||||||
|
return __invoke(__f_, __a0, __a1, __a2);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _A0, class _A1, class _A2>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
typename __invoke_return2<type, _A0 const, _A1, _A2 const>::type
|
||||||
|
operator() (_A0 const& __a0, _A1& __a1, _A2 const& __a2) const {
|
||||||
|
return __invoke(__f_, __a0, __a1, __a2);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _A0, class _A1, class _A2>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
typename __invoke_return2<type, _A0, _A1 const, _A2 const>::type
|
||||||
|
operator() (_A0& __a0, _A1 const& __a1, _A2 const& __a2) const {
|
||||||
|
return __invoke(__f_, __a0, __a1, __a2);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class _A0, class _A1, class _A2>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
typename __invoke_return2<type, _A0 const, _A1 const, _A2 const>::type
|
||||||
|
operator() (_A0 const& __a0, _A1 const& __a1, _A2 const& __a2) const {
|
||||||
|
return __invoke(__f_, __a0, __a1, __a2);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class _Rp, class _Tp>
|
template<class _Rp, class _Tp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
__mem_fn<_Rp _Tp::*>
|
__mem_fn<_Rp _Tp::*>
|
||||||
mem_fn(_Rp _Tp::* __pm)
|
mem_fn(_Rp _Tp::* __pm) _NOEXCEPT
|
||||||
{
|
{
|
||||||
return __mem_fn<_Rp _Tp::*>(__pm);
|
return __mem_fn<_Rp _Tp::*>(__pm);
|
||||||
}
|
}
|
||||||
@@ -1327,6 +1407,22 @@ struct __maybe_derive_from_binary_function<_Rp(_A1, _A2)>
|
|||||||
{
|
{
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <class _Fp>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
bool __not_null(_Fp const&) { return true; }
|
||||||
|
|
||||||
|
template <class _Fp>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
bool __not_null(_Fp* __ptr) { return __ptr; }
|
||||||
|
|
||||||
|
template <class _Ret, class _Class>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
bool __not_null(_Ret _Class::*__ptr) { return __ptr; }
|
||||||
|
|
||||||
|
template <class _Fp>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
bool __not_null(function<_Fp> const& __f) { return !!__f; }
|
||||||
|
|
||||||
} // namespace __function
|
} // namespace __function
|
||||||
|
|
||||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
||||||
@@ -1468,27 +1564,9 @@ class _LIBCPP_TYPE_VIS_ONLY function<_Rp(_ArgTypes...)>
|
|||||||
typename aligned_storage<3*sizeof(void*)>::type __buf_;
|
typename aligned_storage<3*sizeof(void*)>::type __buf_;
|
||||||
__base* __f_;
|
__base* __f_;
|
||||||
|
|
||||||
template <class _Fp>
|
_LIBCPP_NO_CFI static __base *__as_base(void *p) {
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
return reinterpret_cast<__base*>(p);
|
||||||
static bool __not_null(const _Fp&) {return true;}
|
}
|
||||||
template <class _R2, class ..._Ap>
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
static bool __not_null(_R2 (*__p)(_Ap...)) {return __p;}
|
|
||||||
template <class _R2, class _Cp, class ..._Ap>
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
static bool __not_null(_R2 (_Cp::*__p)(_Ap...)) {return __p;}
|
|
||||||
template <class _R2, class _Cp, class ..._Ap>
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
static bool __not_null(_R2 (_Cp::*__p)(_Ap...) const) {return __p;}
|
|
||||||
template <class _R2, class _Cp, class ..._Ap>
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
static bool __not_null(_R2 (_Cp::*__p)(_Ap...) volatile) {return __p;}
|
|
||||||
template <class _R2, class _Cp, class ..._Ap>
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
static bool __not_null(_R2 (_Cp::*__p)(_Ap...) const volatile) {return __p;}
|
|
||||||
template <class _R2, class ..._Ap>
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
static bool __not_null(const function<_R2(_Ap...)>& __p) {return !!__p;}
|
|
||||||
|
|
||||||
template <class _Fp, bool = !is_same<_Fp, function>::value &&
|
template <class _Fp, bool = !is_same<_Fp, function>::value &&
|
||||||
__invokable<_Fp&, _ArgTypes...>::value>
|
__invokable<_Fp&, _ArgTypes...>::value>
|
||||||
@@ -1552,10 +1630,13 @@ public:
|
|||||||
|
|
||||||
// function modifiers:
|
// function modifiers:
|
||||||
void swap(function&) _NOEXCEPT;
|
void swap(function&) _NOEXCEPT;
|
||||||
|
|
||||||
|
#if _LIBCPP_STD_VER <= 14
|
||||||
template<class _Fp, class _Alloc>
|
template<class _Fp, class _Alloc>
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void assign(_Fp&& __f, const _Alloc& __a)
|
void assign(_Fp&& __f, const _Alloc& __a)
|
||||||
{function(allocator_arg, __a, _VSTD::forward<_Fp>(__f)).swap(*this);}
|
{function(allocator_arg, __a, _VSTD::forward<_Fp>(__f)).swap(*this);}
|
||||||
|
#endif
|
||||||
|
|
||||||
// function capacity:
|
// function capacity:
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
@@ -1583,9 +1664,9 @@ function<_Rp(_ArgTypes...)>::function(const function& __f)
|
|||||||
{
|
{
|
||||||
if (__f.__f_ == 0)
|
if (__f.__f_ == 0)
|
||||||
__f_ = 0;
|
__f_ = 0;
|
||||||
else if (__f.__f_ == (const __base*)&__f.__buf_)
|
else if ((void *)__f.__f_ == &__f.__buf_)
|
||||||
{
|
{
|
||||||
__f_ = (__base*)&__buf_;
|
__f_ = __as_base(&__buf_);
|
||||||
__f.__f_->__clone(__f_);
|
__f.__f_->__clone(__f_);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1599,9 +1680,9 @@ function<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc&,
|
|||||||
{
|
{
|
||||||
if (__f.__f_ == 0)
|
if (__f.__f_ == 0)
|
||||||
__f_ = 0;
|
__f_ = 0;
|
||||||
else if (__f.__f_ == (const __base*)&__f.__buf_)
|
else if ((void *)__f.__f_ == &__f.__buf_)
|
||||||
{
|
{
|
||||||
__f_ = (__base*)&__buf_;
|
__f_ = __as_base(&__buf_);
|
||||||
__f.__f_->__clone(__f_);
|
__f.__f_->__clone(__f_);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1613,9 +1694,9 @@ function<_Rp(_ArgTypes...)>::function(function&& __f) _NOEXCEPT
|
|||||||
{
|
{
|
||||||
if (__f.__f_ == 0)
|
if (__f.__f_ == 0)
|
||||||
__f_ = 0;
|
__f_ = 0;
|
||||||
else if (__f.__f_ == (__base*)&__f.__buf_)
|
else if ((void *)__f.__f_ == &__f.__buf_)
|
||||||
{
|
{
|
||||||
__f_ = (__base*)&__buf_;
|
__f_ = __as_base(&__buf_);
|
||||||
__f.__f_->__clone(__f_);
|
__f.__f_->__clone(__f_);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1632,9 +1713,9 @@ function<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc&,
|
|||||||
{
|
{
|
||||||
if (__f.__f_ == 0)
|
if (__f.__f_ == 0)
|
||||||
__f_ = 0;
|
__f_ = 0;
|
||||||
else if (__f.__f_ == (__base*)&__f.__buf_)
|
else if ((void *)__f.__f_ == &__f.__buf_)
|
||||||
{
|
{
|
||||||
__f_ = (__base*)&__buf_;
|
__f_ = __as_base(&__buf_);
|
||||||
__f.__f_->__clone(__f_);
|
__f.__f_->__clone(__f_);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1654,13 +1735,12 @@ function<_Rp(_ArgTypes...)>::function(_Fp __f,
|
|||||||
>::type*)
|
>::type*)
|
||||||
: __f_(0)
|
: __f_(0)
|
||||||
{
|
{
|
||||||
if (__not_null(__f))
|
if (__function::__not_null(__f))
|
||||||
{
|
{
|
||||||
typedef __function::__func<_Fp, allocator<_Fp>, _Rp(_ArgTypes...)> _FF;
|
typedef __function::__func<_Fp, allocator<_Fp>, _Rp(_ArgTypes...)> _FF;
|
||||||
if (sizeof(_FF) <= sizeof(__buf_) && is_nothrow_copy_constructible<_Fp>::value)
|
if (sizeof(_FF) <= sizeof(__buf_) && is_nothrow_copy_constructible<_Fp>::value)
|
||||||
{
|
{
|
||||||
__f_ = (__base*)&__buf_;
|
__f_ = ::new((void*)&__buf_) _FF(_VSTD::move(__f));
|
||||||
::new (__f_) _FF(_VSTD::move(__f));
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1681,7 +1761,7 @@ function<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc& __a0, _Fp _
|
|||||||
: __f_(0)
|
: __f_(0)
|
||||||
{
|
{
|
||||||
typedef allocator_traits<_Alloc> __alloc_traits;
|
typedef allocator_traits<_Alloc> __alloc_traits;
|
||||||
if (__not_null(__f))
|
if (__function::__not_null(__f))
|
||||||
{
|
{
|
||||||
typedef __function::__func<_Fp, _Alloc, _Rp(_ArgTypes...)> _FF;
|
typedef __function::__func<_Fp, _Alloc, _Rp(_ArgTypes...)> _FF;
|
||||||
typedef typename __rebind_alloc_helper<__alloc_traits, _FF>::type _Ap;
|
typedef typename __rebind_alloc_helper<__alloc_traits, _FF>::type _Ap;
|
||||||
@@ -1689,8 +1769,7 @@ function<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc& __a0, _Fp _
|
|||||||
if (sizeof(_FF) <= sizeof(__buf_) &&
|
if (sizeof(_FF) <= sizeof(__buf_) &&
|
||||||
is_nothrow_copy_constructible<_Fp>::value && is_nothrow_copy_constructible<_Ap>::value)
|
is_nothrow_copy_constructible<_Fp>::value && is_nothrow_copy_constructible<_Ap>::value)
|
||||||
{
|
{
|
||||||
__f_ = (__base*)&__buf_;
|
__f_ = ::new((void*)&__buf_) _FF(_VSTD::move(__f), _Alloc(__a));
|
||||||
::new (__f_) _FF(_VSTD::move(__f), _Alloc(__a));
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1714,16 +1793,16 @@ template<class _Rp, class ..._ArgTypes>
|
|||||||
function<_Rp(_ArgTypes...)>&
|
function<_Rp(_ArgTypes...)>&
|
||||||
function<_Rp(_ArgTypes...)>::operator=(function&& __f) _NOEXCEPT
|
function<_Rp(_ArgTypes...)>::operator=(function&& __f) _NOEXCEPT
|
||||||
{
|
{
|
||||||
if (__f_ == (__base*)&__buf_)
|
if ((void *)__f_ == &__buf_)
|
||||||
__f_->destroy();
|
__f_->destroy();
|
||||||
else if (__f_)
|
else if (__f_)
|
||||||
__f_->destroy_deallocate();
|
__f_->destroy_deallocate();
|
||||||
__f_ = 0;
|
__f_ = 0;
|
||||||
if (__f.__f_ == 0)
|
if (__f.__f_ == 0)
|
||||||
__f_ = 0;
|
__f_ = 0;
|
||||||
else if (__f.__f_ == (__base*)&__f.__buf_)
|
else if ((void *)__f.__f_ == &__f.__buf_)
|
||||||
{
|
{
|
||||||
__f_ = (__base*)&__buf_;
|
__f_ = __as_base(&__buf_);
|
||||||
__f.__f_->__clone(__f_);
|
__f.__f_->__clone(__f_);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1738,7 +1817,7 @@ template<class _Rp, class ..._ArgTypes>
|
|||||||
function<_Rp(_ArgTypes...)>&
|
function<_Rp(_ArgTypes...)>&
|
||||||
function<_Rp(_ArgTypes...)>::operator=(nullptr_t) _NOEXCEPT
|
function<_Rp(_ArgTypes...)>::operator=(nullptr_t) _NOEXCEPT
|
||||||
{
|
{
|
||||||
if (__f_ == (__base*)&__buf_)
|
if ((void *)__f_ == &__buf_)
|
||||||
__f_->destroy();
|
__f_->destroy();
|
||||||
else if (__f_)
|
else if (__f_)
|
||||||
__f_->destroy_deallocate();
|
__f_->destroy_deallocate();
|
||||||
@@ -1763,7 +1842,7 @@ function<_Rp(_ArgTypes...)>::operator=(_Fp&& __f)
|
|||||||
template<class _Rp, class ..._ArgTypes>
|
template<class _Rp, class ..._ArgTypes>
|
||||||
function<_Rp(_ArgTypes...)>::~function()
|
function<_Rp(_ArgTypes...)>::~function()
|
||||||
{
|
{
|
||||||
if (__f_ == (__base*)&__buf_)
|
if ((void *)__f_ == &__buf_)
|
||||||
__f_->destroy();
|
__f_->destroy();
|
||||||
else if (__f_)
|
else if (__f_)
|
||||||
__f_->destroy_deallocate();
|
__f_->destroy_deallocate();
|
||||||
@@ -1773,34 +1852,34 @@ template<class _Rp, class ..._ArgTypes>
|
|||||||
void
|
void
|
||||||
function<_Rp(_ArgTypes...)>::swap(function& __f) _NOEXCEPT
|
function<_Rp(_ArgTypes...)>::swap(function& __f) _NOEXCEPT
|
||||||
{
|
{
|
||||||
if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_)
|
if ((void *)__f_ == &__buf_ && (void *)__f.__f_ == &__f.__buf_)
|
||||||
{
|
{
|
||||||
typename aligned_storage<sizeof(__buf_)>::type __tempbuf;
|
typename aligned_storage<sizeof(__buf_)>::type __tempbuf;
|
||||||
__base* __t = (__base*)&__tempbuf;
|
__base* __t = __as_base(&__tempbuf);
|
||||||
__f_->__clone(__t);
|
__f_->__clone(__t);
|
||||||
__f_->destroy();
|
__f_->destroy();
|
||||||
__f_ = 0;
|
__f_ = 0;
|
||||||
__f.__f_->__clone((__base*)&__buf_);
|
__f.__f_->__clone(__as_base(&__buf_));
|
||||||
__f.__f_->destroy();
|
__f.__f_->destroy();
|
||||||
__f.__f_ = 0;
|
__f.__f_ = 0;
|
||||||
__f_ = (__base*)&__buf_;
|
__f_ = __as_base(&__buf_);
|
||||||
__t->__clone((__base*)&__f.__buf_);
|
__t->__clone(__as_base(&__f.__buf_));
|
||||||
__t->destroy();
|
__t->destroy();
|
||||||
__f.__f_ = (__base*)&__f.__buf_;
|
__f.__f_ = __as_base(&__f.__buf_);
|
||||||
}
|
}
|
||||||
else if (__f_ == (__base*)&__buf_)
|
else if ((void *)__f_ == &__buf_)
|
||||||
{
|
{
|
||||||
__f_->__clone((__base*)&__f.__buf_);
|
__f_->__clone(__as_base(&__f.__buf_));
|
||||||
__f_->destroy();
|
__f_->destroy();
|
||||||
__f_ = __f.__f_;
|
__f_ = __f.__f_;
|
||||||
__f.__f_ = (__base*)&__f.__buf_;
|
__f.__f_ = __as_base(&__f.__buf_);
|
||||||
}
|
}
|
||||||
else if (__f.__f_ == (__base*)&__f.__buf_)
|
else if ((void *)__f.__f_ == &__f.__buf_)
|
||||||
{
|
{
|
||||||
__f.__f_->__clone((__base*)&__buf_);
|
__f.__f_->__clone(__as_base(&__buf_));
|
||||||
__f.__f_->destroy();
|
__f.__f_->destroy();
|
||||||
__f.__f_ = __f_;
|
__f.__f_ = __f_;
|
||||||
__f_ = (__base*)&__buf_;
|
__f_ = __as_base(&__buf_);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
_VSTD::swap(__f_, __f.__f_);
|
_VSTD::swap(__f_, __f.__f_);
|
||||||
@@ -2394,6 +2473,22 @@ struct _LIBCPP_TYPE_VIS_ONLY hash<unsigned long long>
|
|||||||
{
|
{
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifndef _LIBCPP_HAS_NO_INT128
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct _LIBCPP_TYPE_VIS_ONLY hash<__int128_t>
|
||||||
|
: public __scalar_hash<__int128_t>
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct _LIBCPP_TYPE_VIS_ONLY hash<__uint128_t>
|
||||||
|
: public __scalar_hash<__uint128_t>
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
struct _LIBCPP_TYPE_VIS_ONLY hash<float>
|
struct _LIBCPP_TYPE_VIS_ONLY hash<float>
|
||||||
: public __scalar_hash<float>
|
: public __scalar_hash<float>
|
||||||
|
|||||||
143
include/future
143
include/future
@@ -512,6 +512,16 @@ public:
|
|||||||
virtual ~future_error() _NOEXCEPT;
|
virtual ~future_error() _NOEXCEPT;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
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");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
class _LIBCPP_TYPE_VIS __assoc_sub_state
|
class _LIBCPP_TYPE_VIS __assoc_sub_state
|
||||||
: public __shared_count
|
: public __shared_count
|
||||||
{
|
{
|
||||||
@@ -566,6 +576,7 @@ public:
|
|||||||
void wait();
|
void wait();
|
||||||
template <class _Rep, class _Period>
|
template <class _Rep, class _Period>
|
||||||
future_status
|
future_status
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const;
|
wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const;
|
||||||
template <class _Clock, class _Duration>
|
template <class _Clock, class _Duration>
|
||||||
future_status
|
future_status
|
||||||
@@ -589,7 +600,7 @@ __assoc_sub_state::wait_until(const chrono::time_point<_Clock, _Duration>& __abs
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Rep, class _Period>
|
template <class _Rep, class _Period>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
future_status
|
future_status
|
||||||
__assoc_sub_state::wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const
|
__assoc_sub_state::wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const
|
||||||
{
|
{
|
||||||
@@ -645,10 +656,8 @@ __assoc_state<_Rp>::set_value(_Arg& __arg)
|
|||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
unique_lock<mutex> __lk(this->__mut_);
|
unique_lock<mutex> __lk(this->__mut_);
|
||||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
|
||||||
if (this->__has_value())
|
if (this->__has_value())
|
||||||
throw future_error(make_error_code(future_errc::promise_already_satisfied));
|
__throw_future_error(future_errc::promise_already_satisfied);
|
||||||
#endif
|
|
||||||
::new(&__value_) _Rp(_VSTD::forward<_Arg>(__arg));
|
::new(&__value_) _Rp(_VSTD::forward<_Arg>(__arg));
|
||||||
this->__state_ |= base::__constructed | base::ready;
|
this->__state_ |= base::__constructed | base::ready;
|
||||||
__cv_.notify_all();
|
__cv_.notify_all();
|
||||||
@@ -664,10 +673,8 @@ __assoc_state<_Rp>::set_value_at_thread_exit(_Arg& __arg)
|
|||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
unique_lock<mutex> __lk(this->__mut_);
|
unique_lock<mutex> __lk(this->__mut_);
|
||||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
|
||||||
if (this->__has_value())
|
if (this->__has_value())
|
||||||
throw future_error(make_error_code(future_errc::promise_already_satisfied));
|
__throw_future_error(future_errc::promise_already_satisfied);
|
||||||
#endif
|
|
||||||
::new(&__value_) _Rp(_VSTD::forward<_Arg>(__arg));
|
::new(&__value_) _Rp(_VSTD::forward<_Arg>(__arg));
|
||||||
this->__state_ |= base::__constructed;
|
this->__state_ |= base::__constructed;
|
||||||
__thread_local_data()->__make_ready_at_thread_exit(this);
|
__thread_local_data()->__make_ready_at_thread_exit(this);
|
||||||
@@ -725,10 +732,8 @@ void
|
|||||||
__assoc_state<_Rp&>::set_value(_Rp& __arg)
|
__assoc_state<_Rp&>::set_value(_Rp& __arg)
|
||||||
{
|
{
|
||||||
unique_lock<mutex> __lk(this->__mut_);
|
unique_lock<mutex> __lk(this->__mut_);
|
||||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
|
||||||
if (this->__has_value())
|
if (this->__has_value())
|
||||||
throw future_error(make_error_code(future_errc::promise_already_satisfied));
|
__throw_future_error(future_errc::promise_already_satisfied);
|
||||||
#endif
|
|
||||||
__value_ = _VSTD::addressof(__arg);
|
__value_ = _VSTD::addressof(__arg);
|
||||||
this->__state_ |= base::__constructed | base::ready;
|
this->__state_ |= base::__constructed | base::ready;
|
||||||
__cv_.notify_all();
|
__cv_.notify_all();
|
||||||
@@ -739,10 +744,8 @@ void
|
|||||||
__assoc_state<_Rp&>::set_value_at_thread_exit(_Rp& __arg)
|
__assoc_state<_Rp&>::set_value_at_thread_exit(_Rp& __arg)
|
||||||
{
|
{
|
||||||
unique_lock<mutex> __lk(this->__mut_);
|
unique_lock<mutex> __lk(this->__mut_);
|
||||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
|
||||||
if (this->__has_value())
|
if (this->__has_value())
|
||||||
throw future_error(make_error_code(future_errc::promise_already_satisfied));
|
__throw_future_error(future_errc::promise_already_satisfied);
|
||||||
#endif
|
|
||||||
__value_ = _VSTD::addressof(__arg);
|
__value_ = _VSTD::addressof(__arg);
|
||||||
this->__state_ |= base::__constructed;
|
this->__state_ |= base::__constructed;
|
||||||
__thread_local_data()->__make_ready_at_thread_exit(this);
|
__thread_local_data()->__make_ready_at_thread_exit(this);
|
||||||
@@ -849,6 +852,7 @@ class __deferred_assoc_state
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
explicit __deferred_assoc_state(_Fp&& __f);
|
explicit __deferred_assoc_state(_Fp&& __f);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -858,7 +862,7 @@ public:
|
|||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
|
||||||
template <class _Rp, class _Fp>
|
template <class _Rp, class _Fp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
__deferred_assoc_state<_Rp, _Fp>::__deferred_assoc_state(_Fp&& __f)
|
__deferred_assoc_state<_Rp, _Fp>::__deferred_assoc_state(_Fp&& __f)
|
||||||
: __func_(_VSTD::forward<_Fp>(__f))
|
: __func_(_VSTD::forward<_Fp>(__f))
|
||||||
{
|
{
|
||||||
@@ -895,6 +899,7 @@ class __deferred_assoc_state<void, _Fp>
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
explicit __deferred_assoc_state(_Fp&& __f);
|
explicit __deferred_assoc_state(_Fp&& __f);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -904,7 +909,7 @@ public:
|
|||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
|
||||||
template <class _Fp>
|
template <class _Fp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
__deferred_assoc_state<void, _Fp>::__deferred_assoc_state(_Fp&& __f)
|
__deferred_assoc_state<void, _Fp>::__deferred_assoc_state(_Fp&& __f)
|
||||||
: __func_(_VSTD::forward<_Fp>(__f))
|
: __func_(_VSTD::forward<_Fp>(__f))
|
||||||
{
|
{
|
||||||
@@ -943,6 +948,7 @@ class __async_assoc_state
|
|||||||
virtual void __on_zero_shared() _NOEXCEPT;
|
virtual void __on_zero_shared() _NOEXCEPT;
|
||||||
public:
|
public:
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
explicit __async_assoc_state(_Fp&& __f);
|
explicit __async_assoc_state(_Fp&& __f);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -952,7 +958,7 @@ public:
|
|||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
|
||||||
template <class _Rp, class _Fp>
|
template <class _Rp, class _Fp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
__async_assoc_state<_Rp, _Fp>::__async_assoc_state(_Fp&& __f)
|
__async_assoc_state<_Rp, _Fp>::__async_assoc_state(_Fp&& __f)
|
||||||
: __func_(_VSTD::forward<_Fp>(__f))
|
: __func_(_VSTD::forward<_Fp>(__f))
|
||||||
{
|
{
|
||||||
@@ -997,6 +1003,7 @@ class __async_assoc_state<void, _Fp>
|
|||||||
virtual void __on_zero_shared() _NOEXCEPT;
|
virtual void __on_zero_shared() _NOEXCEPT;
|
||||||
public:
|
public:
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
explicit __async_assoc_state(_Fp&& __f);
|
explicit __async_assoc_state(_Fp&& __f);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1006,7 +1013,7 @@ public:
|
|||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
|
||||||
template <class _Fp>
|
template <class _Fp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
__async_assoc_state<void, _Fp>::__async_assoc_state(_Fp&& __f)
|
__async_assoc_state<void, _Fp>::__async_assoc_state(_Fp&& __f)
|
||||||
: __func_(_VSTD::forward<_Fp>(__f))
|
: __func_(_VSTD::forward<_Fp>(__f))
|
||||||
{
|
{
|
||||||
@@ -1108,6 +1115,7 @@ private:
|
|||||||
public:
|
public:
|
||||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
~future();
|
~future();
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
shared_future<_Rp> share();
|
shared_future<_Rp> share();
|
||||||
|
|
||||||
// retrieving the value
|
// retrieving the value
|
||||||
@@ -1138,10 +1146,8 @@ template <class _Rp>
|
|||||||
future<_Rp>::future(__assoc_state<_Rp>* __state)
|
future<_Rp>::future(__assoc_state<_Rp>* __state)
|
||||||
: __state_(__state)
|
: __state_(__state)
|
||||||
{
|
{
|
||||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
|
||||||
if (__state_->__has_future_attached())
|
if (__state_->__has_future_attached())
|
||||||
throw future_error(make_error_code(future_errc::future_already_retrieved));
|
__throw_future_error(future_errc::future_already_retrieved);
|
||||||
#endif
|
|
||||||
__state_->__add_shared();
|
__state_->__add_shared();
|
||||||
__state_->__set_future_attached();
|
__state_->__set_future_attached();
|
||||||
}
|
}
|
||||||
@@ -1212,6 +1218,7 @@ private:
|
|||||||
public:
|
public:
|
||||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
~future();
|
~future();
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
shared_future<_Rp&> share();
|
shared_future<_Rp&> share();
|
||||||
|
|
||||||
// retrieving the value
|
// retrieving the value
|
||||||
@@ -1242,10 +1249,8 @@ template <class _Rp>
|
|||||||
future<_Rp&>::future(__assoc_state<_Rp&>* __state)
|
future<_Rp&>::future(__assoc_state<_Rp&>* __state)
|
||||||
: __state_(__state)
|
: __state_(__state)
|
||||||
{
|
{
|
||||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
|
||||||
if (__state_->__has_future_attached())
|
if (__state_->__has_future_attached())
|
||||||
throw future_error(make_error_code(future_errc::future_already_retrieved));
|
__throw_future_error(future_errc::future_already_retrieved);
|
||||||
#endif
|
|
||||||
__state_->__add_shared();
|
__state_->__add_shared();
|
||||||
__state_->__set_future_attached();
|
__state_->__set_future_attached();
|
||||||
}
|
}
|
||||||
@@ -1311,6 +1316,7 @@ private:
|
|||||||
public:
|
public:
|
||||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
~future();
|
~future();
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
shared_future<void> share();
|
shared_future<void> share();
|
||||||
|
|
||||||
// retrieving the value
|
// retrieving the value
|
||||||
@@ -1445,10 +1451,8 @@ template <class _Rp>
|
|||||||
future<_Rp>
|
future<_Rp>
|
||||||
promise<_Rp>::get_future()
|
promise<_Rp>::get_future()
|
||||||
{
|
{
|
||||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
|
||||||
if (__state_ == nullptr)
|
if (__state_ == nullptr)
|
||||||
throw future_error(make_error_code(future_errc::no_state));
|
__throw_future_error(future_errc::no_state);
|
||||||
#endif
|
|
||||||
return future<_Rp>(__state_);
|
return future<_Rp>(__state_);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1456,10 +1460,8 @@ template <class _Rp>
|
|||||||
void
|
void
|
||||||
promise<_Rp>::set_value(const _Rp& __r)
|
promise<_Rp>::set_value(const _Rp& __r)
|
||||||
{
|
{
|
||||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
|
||||||
if (__state_ == nullptr)
|
if (__state_ == nullptr)
|
||||||
throw future_error(make_error_code(future_errc::no_state));
|
__throw_future_error(future_errc::no_state);
|
||||||
#endif
|
|
||||||
__state_->set_value(__r);
|
__state_->set_value(__r);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1469,10 +1471,8 @@ template <class _Rp>
|
|||||||
void
|
void
|
||||||
promise<_Rp>::set_value(_Rp&& __r)
|
promise<_Rp>::set_value(_Rp&& __r)
|
||||||
{
|
{
|
||||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
|
||||||
if (__state_ == nullptr)
|
if (__state_ == nullptr)
|
||||||
throw future_error(make_error_code(future_errc::no_state));
|
__throw_future_error(future_errc::no_state);
|
||||||
#endif
|
|
||||||
__state_->set_value(_VSTD::move(__r));
|
__state_->set_value(_VSTD::move(__r));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1482,10 +1482,9 @@ template <class _Rp>
|
|||||||
void
|
void
|
||||||
promise<_Rp>::set_exception(exception_ptr __p)
|
promise<_Rp>::set_exception(exception_ptr __p)
|
||||||
{
|
{
|
||||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
_LIBCPP_ASSERT( __p != nullptr, "promise::set_exception: received nullptr" );
|
||||||
if (__state_ == nullptr)
|
if (__state_ == nullptr)
|
||||||
throw future_error(make_error_code(future_errc::no_state));
|
__throw_future_error(future_errc::no_state);
|
||||||
#endif
|
|
||||||
__state_->set_exception(__p);
|
__state_->set_exception(__p);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1493,10 +1492,8 @@ template <class _Rp>
|
|||||||
void
|
void
|
||||||
promise<_Rp>::set_value_at_thread_exit(const _Rp& __r)
|
promise<_Rp>::set_value_at_thread_exit(const _Rp& __r)
|
||||||
{
|
{
|
||||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
|
||||||
if (__state_ == nullptr)
|
if (__state_ == nullptr)
|
||||||
throw future_error(make_error_code(future_errc::no_state));
|
__throw_future_error(future_errc::no_state);
|
||||||
#endif
|
|
||||||
__state_->set_value_at_thread_exit(__r);
|
__state_->set_value_at_thread_exit(__r);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1506,10 +1503,8 @@ template <class _Rp>
|
|||||||
void
|
void
|
||||||
promise<_Rp>::set_value_at_thread_exit(_Rp&& __r)
|
promise<_Rp>::set_value_at_thread_exit(_Rp&& __r)
|
||||||
{
|
{
|
||||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
|
||||||
if (__state_ == nullptr)
|
if (__state_ == nullptr)
|
||||||
throw future_error(make_error_code(future_errc::no_state));
|
__throw_future_error(future_errc::no_state);
|
||||||
#endif
|
|
||||||
__state_->set_value_at_thread_exit(_VSTD::move(__r));
|
__state_->set_value_at_thread_exit(_VSTD::move(__r));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1519,10 +1514,8 @@ template <class _Rp>
|
|||||||
void
|
void
|
||||||
promise<_Rp>::set_exception_at_thread_exit(exception_ptr __p)
|
promise<_Rp>::set_exception_at_thread_exit(exception_ptr __p)
|
||||||
{
|
{
|
||||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
|
||||||
if (__state_ == nullptr)
|
if (__state_ == nullptr)
|
||||||
throw future_error(make_error_code(future_errc::no_state));
|
__throw_future_error(future_errc::no_state);
|
||||||
#endif
|
|
||||||
__state_->set_exception_at_thread_exit(__p);
|
__state_->set_exception_at_thread_exit(__p);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1619,10 +1612,8 @@ template <class _Rp>
|
|||||||
future<_Rp&>
|
future<_Rp&>
|
||||||
promise<_Rp&>::get_future()
|
promise<_Rp&>::get_future()
|
||||||
{
|
{
|
||||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
|
||||||
if (__state_ == nullptr)
|
if (__state_ == nullptr)
|
||||||
throw future_error(make_error_code(future_errc::no_state));
|
__throw_future_error(future_errc::no_state);
|
||||||
#endif
|
|
||||||
return future<_Rp&>(__state_);
|
return future<_Rp&>(__state_);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1630,10 +1621,8 @@ template <class _Rp>
|
|||||||
void
|
void
|
||||||
promise<_Rp&>::set_value(_Rp& __r)
|
promise<_Rp&>::set_value(_Rp& __r)
|
||||||
{
|
{
|
||||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
|
||||||
if (__state_ == nullptr)
|
if (__state_ == nullptr)
|
||||||
throw future_error(make_error_code(future_errc::no_state));
|
__throw_future_error(future_errc::no_state);
|
||||||
#endif
|
|
||||||
__state_->set_value(__r);
|
__state_->set_value(__r);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1641,10 +1630,9 @@ template <class _Rp>
|
|||||||
void
|
void
|
||||||
promise<_Rp&>::set_exception(exception_ptr __p)
|
promise<_Rp&>::set_exception(exception_ptr __p)
|
||||||
{
|
{
|
||||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
_LIBCPP_ASSERT( __p != nullptr, "promise::set_exception: received nullptr" );
|
||||||
if (__state_ == nullptr)
|
if (__state_ == nullptr)
|
||||||
throw future_error(make_error_code(future_errc::no_state));
|
__throw_future_error(future_errc::no_state);
|
||||||
#endif
|
|
||||||
__state_->set_exception(__p);
|
__state_->set_exception(__p);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1652,10 +1640,8 @@ template <class _Rp>
|
|||||||
void
|
void
|
||||||
promise<_Rp&>::set_value_at_thread_exit(_Rp& __r)
|
promise<_Rp&>::set_value_at_thread_exit(_Rp& __r)
|
||||||
{
|
{
|
||||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
|
||||||
if (__state_ == nullptr)
|
if (__state_ == nullptr)
|
||||||
throw future_error(make_error_code(future_errc::no_state));
|
__throw_future_error(future_errc::no_state);
|
||||||
#endif
|
|
||||||
__state_->set_value_at_thread_exit(__r);
|
__state_->set_value_at_thread_exit(__r);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1663,10 +1649,8 @@ template <class _Rp>
|
|||||||
void
|
void
|
||||||
promise<_Rp&>::set_exception_at_thread_exit(exception_ptr __p)
|
promise<_Rp&>::set_exception_at_thread_exit(exception_ptr __p)
|
||||||
{
|
{
|
||||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
|
||||||
if (__state_ == nullptr)
|
if (__state_ == nullptr)
|
||||||
throw future_error(make_error_code(future_errc::no_state));
|
__throw_future_error(future_errc::no_state);
|
||||||
#endif
|
|
||||||
__state_->set_exception_at_thread_exit(__p);
|
__state_->set_exception_at_thread_exit(__p);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1861,6 +1845,7 @@ public:
|
|||||||
|
|
||||||
void swap(__packaged_task_function&) _NOEXCEPT;
|
void swap(__packaged_task_function&) _NOEXCEPT;
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
_Rp operator()(_ArgTypes...) const;
|
_Rp operator()(_ArgTypes...) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -2000,7 +1985,7 @@ __packaged_task_function<_Rp(_ArgTypes...)>::swap(__packaged_task_function& __f)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<class _Rp, class ..._ArgTypes>
|
template<class _Rp, class ..._ArgTypes>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
_Rp
|
_Rp
|
||||||
__packaged_task_function<_Rp(_ArgTypes...)>::operator()(_ArgTypes... __arg) const
|
__packaged_task_function<_Rp(_ArgTypes...)>::operator()(_ArgTypes... __arg) const
|
||||||
{
|
{
|
||||||
@@ -2087,11 +2072,11 @@ template<class _Rp, class ..._ArgTypes>
|
|||||||
void
|
void
|
||||||
packaged_task<_Rp(_ArgTypes...)>::operator()(_ArgTypes... __args)
|
packaged_task<_Rp(_ArgTypes...)>::operator()(_ArgTypes... __args)
|
||||||
{
|
{
|
||||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
|
||||||
if (__p_.__state_ == nullptr)
|
if (__p_.__state_ == nullptr)
|
||||||
throw future_error(make_error_code(future_errc::no_state));
|
__throw_future_error(future_errc::no_state);
|
||||||
if (__p_.__state_->__has_value())
|
if (__p_.__state_->__has_value())
|
||||||
throw future_error(make_error_code(future_errc::promise_already_satisfied));
|
__throw_future_error(future_errc::promise_already_satisfied);
|
||||||
|
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
#endif // _LIBCPP_NO_EXCEPTIONS
|
#endif // _LIBCPP_NO_EXCEPTIONS
|
||||||
@@ -2109,11 +2094,11 @@ template<class _Rp, class ..._ArgTypes>
|
|||||||
void
|
void
|
||||||
packaged_task<_Rp(_ArgTypes...)>::make_ready_at_thread_exit(_ArgTypes... __args)
|
packaged_task<_Rp(_ArgTypes...)>::make_ready_at_thread_exit(_ArgTypes... __args)
|
||||||
{
|
{
|
||||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
|
||||||
if (__p_.__state_ == nullptr)
|
if (__p_.__state_ == nullptr)
|
||||||
throw future_error(make_error_code(future_errc::no_state));
|
__throw_future_error(future_errc::no_state);
|
||||||
if (__p_.__state_->__has_value())
|
if (__p_.__state_->__has_value())
|
||||||
throw future_error(make_error_code(future_errc::promise_already_satisfied));
|
__throw_future_error(future_errc::promise_already_satisfied);
|
||||||
|
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
#endif // _LIBCPP_NO_EXCEPTIONS
|
#endif // _LIBCPP_NO_EXCEPTIONS
|
||||||
@@ -2131,10 +2116,8 @@ template<class _Rp, class ..._ArgTypes>
|
|||||||
void
|
void
|
||||||
packaged_task<_Rp(_ArgTypes...)>::reset()
|
packaged_task<_Rp(_ArgTypes...)>::reset()
|
||||||
{
|
{
|
||||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
|
||||||
if (!valid())
|
if (!valid())
|
||||||
throw future_error(make_error_code(future_errc::no_state));
|
__throw_future_error(future_errc::no_state);
|
||||||
#endif // _LIBCPP_NO_EXCEPTIONS
|
|
||||||
__p_ = promise<result_type>();
|
__p_ = promise<result_type>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2218,11 +2201,11 @@ template<class ..._ArgTypes>
|
|||||||
void
|
void
|
||||||
packaged_task<void(_ArgTypes...)>::operator()(_ArgTypes... __args)
|
packaged_task<void(_ArgTypes...)>::operator()(_ArgTypes... __args)
|
||||||
{
|
{
|
||||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
|
||||||
if (__p_.__state_ == nullptr)
|
if (__p_.__state_ == nullptr)
|
||||||
throw future_error(make_error_code(future_errc::no_state));
|
__throw_future_error(future_errc::no_state);
|
||||||
if (__p_.__state_->__has_value())
|
if (__p_.__state_->__has_value())
|
||||||
throw future_error(make_error_code(future_errc::promise_already_satisfied));
|
__throw_future_error(future_errc::promise_already_satisfied);
|
||||||
|
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
#endif // _LIBCPP_NO_EXCEPTIONS
|
#endif // _LIBCPP_NO_EXCEPTIONS
|
||||||
@@ -2241,11 +2224,11 @@ template<class ..._ArgTypes>
|
|||||||
void
|
void
|
||||||
packaged_task<void(_ArgTypes...)>::make_ready_at_thread_exit(_ArgTypes... __args)
|
packaged_task<void(_ArgTypes...)>::make_ready_at_thread_exit(_ArgTypes... __args)
|
||||||
{
|
{
|
||||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
|
||||||
if (__p_.__state_ == nullptr)
|
if (__p_.__state_ == nullptr)
|
||||||
throw future_error(make_error_code(future_errc::no_state));
|
__throw_future_error(future_errc::no_state);
|
||||||
if (__p_.__state_->__has_value())
|
if (__p_.__state_->__has_value())
|
||||||
throw future_error(make_error_code(future_errc::promise_already_satisfied));
|
__throw_future_error(future_errc::promise_already_satisfied);
|
||||||
|
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
#endif // _LIBCPP_NO_EXCEPTIONS
|
#endif // _LIBCPP_NO_EXCEPTIONS
|
||||||
@@ -2264,10 +2247,8 @@ template<class ..._ArgTypes>
|
|||||||
void
|
void
|
||||||
packaged_task<void(_ArgTypes...)>::reset()
|
packaged_task<void(_ArgTypes...)>::reset()
|
||||||
{
|
{
|
||||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
|
||||||
if (!valid())
|
if (!valid())
|
||||||
throw future_error(make_error_code(future_errc::no_state));
|
__throw_future_error(future_errc::no_state);
|
||||||
#endif // _LIBCPP_NO_EXCEPTIONS
|
|
||||||
__p_ = promise<result_type>();
|
__p_ = promise<result_type>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2592,7 +2573,7 @@ swap(shared_future<_Rp>& __x, shared_future<_Rp>& __y) _NOEXCEPT
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Rp>
|
template <class _Rp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
shared_future<_Rp>
|
shared_future<_Rp>
|
||||||
future<_Rp>::share()
|
future<_Rp>::share()
|
||||||
{
|
{
|
||||||
@@ -2600,7 +2581,7 @@ future<_Rp>::share()
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Rp>
|
template <class _Rp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
shared_future<_Rp&>
|
shared_future<_Rp&>
|
||||||
future<_Rp&>::share()
|
future<_Rp&>::share()
|
||||||
{
|
{
|
||||||
@@ -2609,7 +2590,7 @@ future<_Rp&>::share()
|
|||||||
|
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
shared_future<void>
|
shared_future<void>
|
||||||
future<void>::share()
|
future<void>::share()
|
||||||
{
|
{
|
||||||
|
|||||||
251
include/inttypes.h
Normal file
251
include/inttypes.h
Normal file
@@ -0,0 +1,251 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
//===--------------------------- inttypes.h -------------------------------===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#ifndef _LIBCPP_INTTYPES_H
|
||||||
|
#define _LIBCPP_INTTYPES_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
inttypes.h synopsis
|
||||||
|
|
||||||
|
This entire header is C99 / C++0X
|
||||||
|
|
||||||
|
#include <stdint.h> // <cinttypes> includes <cstdint>
|
||||||
|
|
||||||
|
Macros:
|
||||||
|
|
||||||
|
PRId8
|
||||||
|
PRId16
|
||||||
|
PRId32
|
||||||
|
PRId64
|
||||||
|
|
||||||
|
PRIdLEAST8
|
||||||
|
PRIdLEAST16
|
||||||
|
PRIdLEAST32
|
||||||
|
PRIdLEAST64
|
||||||
|
|
||||||
|
PRIdFAST8
|
||||||
|
PRIdFAST16
|
||||||
|
PRIdFAST32
|
||||||
|
PRIdFAST64
|
||||||
|
|
||||||
|
PRIdMAX
|
||||||
|
PRIdPTR
|
||||||
|
|
||||||
|
PRIi8
|
||||||
|
PRIi16
|
||||||
|
PRIi32
|
||||||
|
PRIi64
|
||||||
|
|
||||||
|
PRIiLEAST8
|
||||||
|
PRIiLEAST16
|
||||||
|
PRIiLEAST32
|
||||||
|
PRIiLEAST64
|
||||||
|
|
||||||
|
PRIiFAST8
|
||||||
|
PRIiFAST16
|
||||||
|
PRIiFAST32
|
||||||
|
PRIiFAST64
|
||||||
|
|
||||||
|
PRIiMAX
|
||||||
|
PRIiPTR
|
||||||
|
|
||||||
|
PRIo8
|
||||||
|
PRIo16
|
||||||
|
PRIo32
|
||||||
|
PRIo64
|
||||||
|
|
||||||
|
PRIoLEAST8
|
||||||
|
PRIoLEAST16
|
||||||
|
PRIoLEAST32
|
||||||
|
PRIoLEAST64
|
||||||
|
|
||||||
|
PRIoFAST8
|
||||||
|
PRIoFAST16
|
||||||
|
PRIoFAST32
|
||||||
|
PRIoFAST64
|
||||||
|
|
||||||
|
PRIoMAX
|
||||||
|
PRIoPTR
|
||||||
|
|
||||||
|
PRIu8
|
||||||
|
PRIu16
|
||||||
|
PRIu32
|
||||||
|
PRIu64
|
||||||
|
|
||||||
|
PRIuLEAST8
|
||||||
|
PRIuLEAST16
|
||||||
|
PRIuLEAST32
|
||||||
|
PRIuLEAST64
|
||||||
|
|
||||||
|
PRIuFAST8
|
||||||
|
PRIuFAST16
|
||||||
|
PRIuFAST32
|
||||||
|
PRIuFAST64
|
||||||
|
|
||||||
|
PRIuMAX
|
||||||
|
PRIuPTR
|
||||||
|
|
||||||
|
PRIx8
|
||||||
|
PRIx16
|
||||||
|
PRIx32
|
||||||
|
PRIx64
|
||||||
|
|
||||||
|
PRIxLEAST8
|
||||||
|
PRIxLEAST16
|
||||||
|
PRIxLEAST32
|
||||||
|
PRIxLEAST64
|
||||||
|
|
||||||
|
PRIxFAST8
|
||||||
|
PRIxFAST16
|
||||||
|
PRIxFAST32
|
||||||
|
PRIxFAST64
|
||||||
|
|
||||||
|
PRIxMAX
|
||||||
|
PRIxPTR
|
||||||
|
|
||||||
|
PRIX8
|
||||||
|
PRIX16
|
||||||
|
PRIX32
|
||||||
|
PRIX64
|
||||||
|
|
||||||
|
PRIXLEAST8
|
||||||
|
PRIXLEAST16
|
||||||
|
PRIXLEAST32
|
||||||
|
PRIXLEAST64
|
||||||
|
|
||||||
|
PRIXFAST8
|
||||||
|
PRIXFAST16
|
||||||
|
PRIXFAST32
|
||||||
|
PRIXFAST64
|
||||||
|
|
||||||
|
PRIXMAX
|
||||||
|
PRIXPTR
|
||||||
|
|
||||||
|
SCNd8
|
||||||
|
SCNd16
|
||||||
|
SCNd32
|
||||||
|
SCNd64
|
||||||
|
|
||||||
|
SCNdLEAST8
|
||||||
|
SCNdLEAST16
|
||||||
|
SCNdLEAST32
|
||||||
|
SCNdLEAST64
|
||||||
|
|
||||||
|
SCNdFAST8
|
||||||
|
SCNdFAST16
|
||||||
|
SCNdFAST32
|
||||||
|
SCNdFAST64
|
||||||
|
|
||||||
|
SCNdMAX
|
||||||
|
SCNdPTR
|
||||||
|
|
||||||
|
SCNi8
|
||||||
|
SCNi16
|
||||||
|
SCNi32
|
||||||
|
SCNi64
|
||||||
|
|
||||||
|
SCNiLEAST8
|
||||||
|
SCNiLEAST16
|
||||||
|
SCNiLEAST32
|
||||||
|
SCNiLEAST64
|
||||||
|
|
||||||
|
SCNiFAST8
|
||||||
|
SCNiFAST16
|
||||||
|
SCNiFAST32
|
||||||
|
SCNiFAST64
|
||||||
|
|
||||||
|
SCNiMAX
|
||||||
|
SCNiPTR
|
||||||
|
|
||||||
|
SCNo8
|
||||||
|
SCNo16
|
||||||
|
SCNo32
|
||||||
|
SCNo64
|
||||||
|
|
||||||
|
SCNoLEAST8
|
||||||
|
SCNoLEAST16
|
||||||
|
SCNoLEAST32
|
||||||
|
SCNoLEAST64
|
||||||
|
|
||||||
|
SCNoFAST8
|
||||||
|
SCNoFAST16
|
||||||
|
SCNoFAST32
|
||||||
|
SCNoFAST64
|
||||||
|
|
||||||
|
SCNoMAX
|
||||||
|
SCNoPTR
|
||||||
|
|
||||||
|
SCNu8
|
||||||
|
SCNu16
|
||||||
|
SCNu32
|
||||||
|
SCNu64
|
||||||
|
|
||||||
|
SCNuLEAST8
|
||||||
|
SCNuLEAST16
|
||||||
|
SCNuLEAST32
|
||||||
|
SCNuLEAST64
|
||||||
|
|
||||||
|
SCNuFAST8
|
||||||
|
SCNuFAST16
|
||||||
|
SCNuFAST32
|
||||||
|
SCNuFAST64
|
||||||
|
|
||||||
|
SCNuMAX
|
||||||
|
SCNuPTR
|
||||||
|
|
||||||
|
SCNx8
|
||||||
|
SCNx16
|
||||||
|
SCNx32
|
||||||
|
SCNx64
|
||||||
|
|
||||||
|
SCNxLEAST8
|
||||||
|
SCNxLEAST16
|
||||||
|
SCNxLEAST32
|
||||||
|
SCNxLEAST64
|
||||||
|
|
||||||
|
SCNxFAST8
|
||||||
|
SCNxFAST16
|
||||||
|
SCNxFAST32
|
||||||
|
SCNxFAST64
|
||||||
|
|
||||||
|
SCNxMAX
|
||||||
|
SCNxPTR
|
||||||
|
|
||||||
|
Types:
|
||||||
|
|
||||||
|
imaxdiv_t
|
||||||
|
|
||||||
|
intmax_t imaxabs(intmax_t j);
|
||||||
|
imaxdiv_t imaxdiv(intmax_t numer, intmax_t denom);
|
||||||
|
intmax_t strtoimax(const char* restrict nptr, char** restrict endptr, int base);
|
||||||
|
uintmax_t strtoumax(const char* restrict nptr, char** restrict endptr, int base);
|
||||||
|
intmax_t wcstoimax(const wchar_t* restrict nptr, wchar_t** restrict endptr, int base);
|
||||||
|
uintmax_t wcstoumax(const wchar_t* restrict nptr, wchar_t** restrict endptr, int base);
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <__config>
|
||||||
|
|
||||||
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||||
|
#pragma GCC system_header
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include_next <inttypes.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#undef imaxabs
|
||||||
|
#undef imaxdiv
|
||||||
|
|
||||||
|
#endif // __cplusplus
|
||||||
|
|
||||||
|
#endif // _LIBCPP_INTTYPES_H
|
||||||
21
include/ios
21
include/ios
@@ -114,9 +114,9 @@ class basic_ios
|
|||||||
public:
|
public:
|
||||||
// types:
|
// types:
|
||||||
typedef charT char_type;
|
typedef charT char_type;
|
||||||
typedef typename traits::int_type int_type;
|
typedef typename traits::int_type int_type; // removed in C++17
|
||||||
typedef typename traits::pos_type pos_type;
|
typedef typename traits::pos_type pos_type; // removed in C++17
|
||||||
typedef typename traits::off_type off_type;
|
typedef typename traits::off_type off_type; // removed in C++17
|
||||||
typedef traits traits_type;
|
typedef traits traits_type;
|
||||||
|
|
||||||
operator unspecified-bool-type() const;
|
operator unspecified-bool-type() const;
|
||||||
@@ -216,7 +216,7 @@ storage-class-specifier const error_category& iostream_category() noexcept;
|
|||||||
#include <__locale>
|
#include <__locale>
|
||||||
#include <system_error>
|
#include <system_error>
|
||||||
|
|
||||||
#if __has_feature(cxx_atomic) && !defined(_LIBCPP_HAS_NO_THREADS)
|
#if !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER)
|
||||||
#include <atomic> // for __xindex_
|
#include <atomic> // for __xindex_
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -231,7 +231,7 @@ typedef ptrdiff_t streamsize;
|
|||||||
class _LIBCPP_TYPE_VIS ios_base
|
class _LIBCPP_TYPE_VIS ios_base
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
class _LIBCPP_TYPE_VIS failure;
|
class _LIBCPP_EXCEPTION_ABI failure;
|
||||||
|
|
||||||
typedef unsigned int fmtflags;
|
typedef unsigned int fmtflags;
|
||||||
static const fmtflags boolalpha = 0x0001;
|
static const fmtflags boolalpha = 0x0001;
|
||||||
@@ -254,14 +254,12 @@ public:
|
|||||||
static const fmtflags floatfield = scientific | fixed;
|
static const fmtflags floatfield = scientific | fixed;
|
||||||
|
|
||||||
typedef unsigned int iostate;
|
typedef unsigned int iostate;
|
||||||
typedef iostate io_state;
|
|
||||||
static const iostate badbit = 0x1;
|
static const iostate badbit = 0x1;
|
||||||
static const iostate eofbit = 0x2;
|
static const iostate eofbit = 0x2;
|
||||||
static const iostate failbit = 0x4;
|
static const iostate failbit = 0x4;
|
||||||
static const iostate goodbit = 0x0;
|
static const iostate goodbit = 0x0;
|
||||||
|
|
||||||
typedef unsigned int openmode;
|
typedef unsigned int openmode;
|
||||||
typedef openmode open_mode;
|
|
||||||
static const openmode app = 0x01;
|
static const openmode app = 0x01;
|
||||||
static const openmode ate = 0x02;
|
static const openmode ate = 0x02;
|
||||||
static const openmode binary = 0x04;
|
static const openmode binary = 0x04;
|
||||||
@@ -270,10 +268,15 @@ public:
|
|||||||
static const openmode trunc = 0x20;
|
static const openmode trunc = 0x20;
|
||||||
|
|
||||||
enum seekdir {beg, cur, end};
|
enum seekdir {beg, cur, end};
|
||||||
|
|
||||||
|
#if _LIBCPP_STD_VER <= 14
|
||||||
|
typedef iostate io_state;
|
||||||
|
typedef openmode open_mode;
|
||||||
typedef seekdir seek_dir;
|
typedef seekdir seek_dir;
|
||||||
|
|
||||||
typedef _VSTD::streamoff streamoff;
|
typedef _VSTD::streamoff streamoff;
|
||||||
typedef _VSTD::streampos streampos;
|
typedef _VSTD::streampos streampos;
|
||||||
|
#endif
|
||||||
|
|
||||||
class _LIBCPP_TYPE_VIS Init;
|
class _LIBCPP_TYPE_VIS Init;
|
||||||
|
|
||||||
@@ -367,7 +370,9 @@ private:
|
|||||||
int* __index_;
|
int* __index_;
|
||||||
size_t __event_size_;
|
size_t __event_size_;
|
||||||
size_t __event_cap_;
|
size_t __event_cap_;
|
||||||
#if __has_feature(cxx_atomic) && !defined(_LIBCPP_HAS_NO_THREADS)
|
// TODO(EricWF): Enable this for both Clang and GCC. Currently it is only
|
||||||
|
// enabled with clang.
|
||||||
|
#if defined(_LIBCPP_HAS_C_ATOMIC_IMP) && !defined(_LIBCPP_HAS_NO_THREADS)
|
||||||
static atomic<int> __xindex_;
|
static atomic<int> __xindex_;
|
||||||
#else
|
#else
|
||||||
static int __xindex_;
|
static int __xindex_;
|
||||||
|
|||||||
@@ -194,6 +194,11 @@ template <class _CharT, // for <stdexcept>
|
|||||||
typedef basic_string<char, char_traits<char>, allocator<char> > string;
|
typedef basic_string<char, char_traits<char>, allocator<char> > string;
|
||||||
typedef basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > wstring;
|
typedef basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > wstring;
|
||||||
|
|
||||||
|
|
||||||
|
// Include other forward declarations here
|
||||||
|
template <class _Tp, class _Alloc = allocator<_Tp> >
|
||||||
|
class _LIBCPP_TYPE_VIS_ONLY vector;
|
||||||
|
|
||||||
_LIBCPP_END_NAMESPACE_STD
|
_LIBCPP_END_NAMESPACE_STD
|
||||||
|
|
||||||
#endif // _LIBCPP_IOSFWD
|
#endif // _LIBCPP_IOSFWD
|
||||||
|
|||||||
@@ -1407,6 +1407,7 @@ basic_istream<_CharT, _Traits>::seekg(off_type __off, ios_base::seekdir __dir)
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
#endif // _LIBCPP_NO_EXCEPTIONS
|
#endif // _LIBCPP_NO_EXCEPTIONS
|
||||||
|
this->clear(this->rdstate() & ~ios_base::eofbit);
|
||||||
sentry __sen(*this, true);
|
sentry __sen(*this, true);
|
||||||
if (__sen)
|
if (__sen)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -340,10 +340,10 @@ template <class E> constexpr const E* data(initializer_list<E> il) noexcept;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <__config>
|
#include <__config>
|
||||||
|
#include <iosfwd> // for forward declarations of vector and string.
|
||||||
#include <__functional_base>
|
#include <__functional_base>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <iosfwd>
|
|
||||||
#include <initializer_list>
|
#include <initializer_list>
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
#include <Availability.h>
|
#include <Availability.h>
|
||||||
@@ -437,6 +437,12 @@ struct __is_bidirectional_iterator : public __has_iterator_category_convertible_
|
|||||||
template <class _Tp>
|
template <class _Tp>
|
||||||
struct __is_random_access_iterator : public __has_iterator_category_convertible_to<_Tp, random_access_iterator_tag> {};
|
struct __is_random_access_iterator : public __has_iterator_category_convertible_to<_Tp, random_access_iterator_tag> {};
|
||||||
|
|
||||||
|
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> {};
|
||||||
|
|
||||||
template<class _Category, class _Tp, class _Distance = ptrdiff_t,
|
template<class _Category, class _Tp, class _Distance = ptrdiff_t,
|
||||||
class _Pointer = _Tp*, class _Reference = _Tp&>
|
class _Pointer = _Tp*, class _Reference = _Tp&>
|
||||||
struct _LIBCPP_TYPE_VIS_ONLY iterator
|
struct _LIBCPP_TYPE_VIS_ONLY iterator
|
||||||
@@ -513,12 +519,12 @@ distance(_InputIter __first, _InputIter __last)
|
|||||||
return __distance(__first, __last, typename iterator_traits<_InputIter>::iterator_category());
|
return __distance(__first, __last, typename iterator_traits<_InputIter>::iterator_category());
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class _ForwardIter>
|
template <class _InputIter>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
_ForwardIter
|
_InputIter
|
||||||
next(_ForwardIter __x,
|
next(_InputIter __x,
|
||||||
typename iterator_traits<_ForwardIter>::difference_type __n = 1,
|
typename iterator_traits<_InputIter>::difference_type __n = 1,
|
||||||
typename enable_if<__is_forward_iterator<_ForwardIter>::value>::type* = 0)
|
typename enable_if<__is_input_iterator<_InputIter>::value>::type* = 0)
|
||||||
{
|
{
|
||||||
_VSTD::advance(__x, __n);
|
_VSTD::advance(__x, __n);
|
||||||
return __x;
|
return __x;
|
||||||
@@ -766,14 +772,14 @@ private:
|
|||||||
_Tp __value_;
|
_Tp __value_;
|
||||||
public:
|
public:
|
||||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR istream_iterator() : __in_stream_(0), __value_() {}
|
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR istream_iterator() : __in_stream_(0), __value_() {}
|
||||||
_LIBCPP_INLINE_VISIBILITY istream_iterator(istream_type& __s) : __in_stream_(&__s)
|
_LIBCPP_INLINE_VISIBILITY istream_iterator(istream_type& __s) : __in_stream_(_VSTD::addressof(__s))
|
||||||
{
|
{
|
||||||
if (!(*__in_stream_ >> __value_))
|
if (!(*__in_stream_ >> __value_))
|
||||||
__in_stream_ = 0;
|
__in_stream_ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY const _Tp& operator*() const {return __value_;}
|
_LIBCPP_INLINE_VISIBILITY const _Tp& operator*() const {return __value_;}
|
||||||
_LIBCPP_INLINE_VISIBILITY const _Tp* operator->() const {return &(operator*());}
|
_LIBCPP_INLINE_VISIBILITY const _Tp* operator->() const {return _VSTD::addressof((operator*()));}
|
||||||
_LIBCPP_INLINE_VISIBILITY istream_iterator& operator++()
|
_LIBCPP_INLINE_VISIBILITY istream_iterator& operator++()
|
||||||
{
|
{
|
||||||
if (!(*__in_stream_ >> __value_))
|
if (!(*__in_stream_ >> __value_))
|
||||||
@@ -805,9 +811,9 @@ private:
|
|||||||
const char_type* __delim_;
|
const char_type* __delim_;
|
||||||
public:
|
public:
|
||||||
_LIBCPP_INLINE_VISIBILITY ostream_iterator(ostream_type& __s)
|
_LIBCPP_INLINE_VISIBILITY ostream_iterator(ostream_type& __s)
|
||||||
: __out_stream_(&__s), __delim_(0) {}
|
: __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)
|
||||||
: __out_stream_(&__s), __delim_(__delimiter) {}
|
: __out_stream_(_VSTD::addressof(__s)), __delim_(__delimiter) {}
|
||||||
_LIBCPP_INLINE_VISIBILITY ostream_iterator& operator=(const _Tp& __value_)
|
_LIBCPP_INLINE_VISIBILITY ostream_iterator& operator=(const _Tp& __value_)
|
||||||
{
|
{
|
||||||
*__out_stream_ << __value_;
|
*__out_stream_ << __value_;
|
||||||
@@ -943,9 +949,14 @@ public:
|
|||||||
typedef typename iterator_traits<iterator_type>::iterator_category iterator_category;
|
typedef typename iterator_traits<iterator_type>::iterator_category iterator_category;
|
||||||
typedef typename iterator_traits<iterator_type>::value_type value_type;
|
typedef typename iterator_traits<iterator_type>::value_type value_type;
|
||||||
typedef typename iterator_traits<iterator_type>::difference_type difference_type;
|
typedef typename iterator_traits<iterator_type>::difference_type difference_type;
|
||||||
typedef typename iterator_traits<iterator_type>::pointer pointer;
|
typedef iterator_type pointer;
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
typedef value_type&& reference;
|
typedef typename iterator_traits<iterator_type>::reference __reference;
|
||||||
|
typedef typename conditional<
|
||||||
|
is_reference<__reference>::value,
|
||||||
|
typename remove_reference<__reference>::type&&,
|
||||||
|
__reference
|
||||||
|
>::type reference;
|
||||||
#else
|
#else
|
||||||
typedef typename iterator_traits<iterator_type>::reference reference;
|
typedef typename iterator_traits<iterator_type>::reference reference;
|
||||||
#endif
|
#endif
|
||||||
@@ -958,10 +969,7 @@ public:
|
|||||||
_LIBCPP_INLINE_VISIBILITY reference operator*() const {
|
_LIBCPP_INLINE_VISIBILITY reference operator*() const {
|
||||||
return static_cast<reference>(*__i);
|
return static_cast<reference>(*__i);
|
||||||
}
|
}
|
||||||
_LIBCPP_INLINE_VISIBILITY pointer operator->() const {
|
_LIBCPP_INLINE_VISIBILITY pointer operator->() const { return __i;}
|
||||||
typename iterator_traits<iterator_type>::reference __ref = *__i;
|
|
||||||
return &__ref;
|
|
||||||
}
|
|
||||||
_LIBCPP_INLINE_VISIBILITY move_iterator& operator++() {++__i; return *this;}
|
_LIBCPP_INLINE_VISIBILITY move_iterator& operator++() {++__i; return *this;}
|
||||||
_LIBCPP_INLINE_VISIBILITY move_iterator operator++(int)
|
_LIBCPP_INLINE_VISIBILITY move_iterator operator++(int)
|
||||||
{move_iterator __tmp(*this); ++__i; return __tmp;}
|
{move_iterator __tmp(*this); ++__i; return __tmp;}
|
||||||
@@ -1181,7 +1189,7 @@ public:
|
|||||||
_LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
|
_LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
|
||||||
"Attempted to dereference a non-dereferenceable iterator");
|
"Attempted to dereference a non-dereferenceable iterator");
|
||||||
#endif
|
#endif
|
||||||
return (pointer)&reinterpret_cast<const volatile char&>(*__i);
|
return (pointer)_VSTD::addressof(*__i);
|
||||||
}
|
}
|
||||||
_LIBCPP_INLINE_VISIBILITY __wrap_iter& operator++() _NOEXCEPT
|
_LIBCPP_INLINE_VISIBILITY __wrap_iter& operator++() _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -1406,6 +1414,23 @@ operator+(typename __wrap_iter<_Iter>::difference_type __n,
|
|||||||
return __x;
|
return __x;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <class _Iter>
|
||||||
|
struct __libcpp_is_trivial_iterator
|
||||||
|
: 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) {};
|
||||||
|
|
||||||
|
template <class _Iter>
|
||||||
|
struct __libcpp_is_trivial_iterator<reverse_iterator<_Iter> >
|
||||||
|
: 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) {};
|
||||||
|
|
||||||
|
|
||||||
template <class _Tp, size_t _Np>
|
template <class _Tp, size_t _Np>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||||
_Tp*
|
_Tp*
|
||||||
|
|||||||
@@ -237,7 +237,8 @@ protected:
|
|||||||
static _LIBCPP_CONSTEXPR const bool is_bounded = true;
|
static _LIBCPP_CONSTEXPR const bool is_bounded = true;
|
||||||
static _LIBCPP_CONSTEXPR const bool is_modulo = !_VSTD::is_signed<_Tp>::value;
|
static _LIBCPP_CONSTEXPR const bool is_modulo = !_VSTD::is_signed<_Tp>::value;
|
||||||
|
|
||||||
#if defined(__i386__) || defined(__x86_64__) || defined(__pnacl__)
|
#if defined(__i386__) || defined(__x86_64__) || defined(__pnacl__) || \
|
||||||
|
defined(__wasm__)
|
||||||
static _LIBCPP_CONSTEXPR const bool traps = true;
|
static _LIBCPP_CONSTEXPR const bool traps = true;
|
||||||
#else
|
#else
|
||||||
static _LIBCPP_CONSTEXPR const bool traps = false;
|
static _LIBCPP_CONSTEXPR const bool traps = false;
|
||||||
|
|||||||
398
include/list
398
include/list
@@ -175,6 +175,7 @@ template <class T, class Alloc>
|
|||||||
#include <initializer_list>
|
#include <initializer_list>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
#include <__undef_min_max>
|
#include <__undef_min_max>
|
||||||
|
|
||||||
@@ -187,34 +188,66 @@ template <class T, class Alloc>
|
|||||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||||
|
|
||||||
template <class _Tp, class _VoidPtr> struct __list_node;
|
template <class _Tp, class _VoidPtr> struct __list_node;
|
||||||
|
template <class _Tp, class _VoidPtr> struct __list_node_base;
|
||||||
|
|
||||||
|
template <class _Tp, class _VoidPtr>
|
||||||
|
struct __list_node_pointer_traits {
|
||||||
|
typedef typename __rebind_pointer<_VoidPtr, __list_node<_Tp, _VoidPtr> >::type
|
||||||
|
__node_pointer;
|
||||||
|
typedef typename __rebind_pointer<_VoidPtr, __list_node_base<_Tp, _VoidPtr> >::type
|
||||||
|
__base_pointer;
|
||||||
|
|
||||||
|
#if defined(_LIBCPP_ABI_LIST_REMOVE_NODE_POINTER_UB)
|
||||||
|
typedef __base_pointer __link_pointer;
|
||||||
|
#else
|
||||||
|
typedef typename conditional<
|
||||||
|
is_pointer<_VoidPtr>::value,
|
||||||
|
__base_pointer,
|
||||||
|
__node_pointer
|
||||||
|
>::type __link_pointer;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef typename conditional<
|
||||||
|
is_same<__link_pointer, __node_pointer>::value,
|
||||||
|
__base_pointer,
|
||||||
|
__node_pointer
|
||||||
|
>::type __non_link_pointer;
|
||||||
|
|
||||||
|
static _LIBCPP_INLINE_VISIBILITY
|
||||||
|
__link_pointer __unsafe_link_pointer_cast(__link_pointer __p) {
|
||||||
|
return __p;
|
||||||
|
}
|
||||||
|
|
||||||
|
static _LIBCPP_INLINE_VISIBILITY
|
||||||
|
__link_pointer __unsafe_link_pointer_cast(__non_link_pointer __p) {
|
||||||
|
return static_cast<__link_pointer>(static_cast<_VoidPtr>(__p));
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
template <class _Tp, class _VoidPtr>
|
template <class _Tp, class _VoidPtr>
|
||||||
struct __list_node_base
|
struct __list_node_base
|
||||||
{
|
{
|
||||||
typedef typename pointer_traits<_VoidPtr>::template
|
typedef __list_node_pointer_traits<_Tp, _VoidPtr> _NodeTraits;
|
||||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
typedef typename _NodeTraits::__node_pointer __node_pointer;
|
||||||
rebind<__list_node<_Tp, _VoidPtr> > pointer;
|
typedef typename _NodeTraits::__base_pointer __base_pointer;
|
||||||
#else
|
typedef typename _NodeTraits::__link_pointer __link_pointer;
|
||||||
rebind<__list_node<_Tp, _VoidPtr> >::other pointer;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef typename pointer_traits<_VoidPtr>::template
|
__link_pointer __prev_;
|
||||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
__link_pointer __next_;
|
||||||
rebind<__list_node_base> __base_pointer;
|
|
||||||
#else
|
|
||||||
rebind<__list_node_base>::other __base_pointer;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
pointer __prev_;
|
|
||||||
pointer __next_;
|
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
__list_node_base() : __prev_(__self()), __next_(__self()) {}
|
__list_node_base() : __prev_(_NodeTraits::__unsafe_link_pointer_cast(__self())),
|
||||||
|
__next_(_NodeTraits::__unsafe_link_pointer_cast(__self())) {}
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
pointer __self()
|
__base_pointer __self() {
|
||||||
{
|
return pointer_traits<__base_pointer>::pointer_to(*this);
|
||||||
return static_cast<pointer>(pointer_traits<__base_pointer>::pointer_to(*this));
|
}
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
__node_pointer __as_node() {
|
||||||
|
return static_cast<__node_pointer>(__self());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -223,6 +256,14 @@ struct __list_node
|
|||||||
: public __list_node_base<_Tp, _VoidPtr>
|
: public __list_node_base<_Tp, _VoidPtr>
|
||||||
{
|
{
|
||||||
_Tp __value_;
|
_Tp __value_;
|
||||||
|
|
||||||
|
typedef __list_node_base<_Tp, _VoidPtr> __base;
|
||||||
|
typedef typename __base::__link_pointer __link_pointer;
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
__link_pointer __as_link() {
|
||||||
|
return static_cast<__link_pointer>(__base::__self());
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class _Tp, class _Alloc = allocator<_Tp> > class _LIBCPP_TYPE_VIS_ONLY list;
|
template <class _Tp, class _Alloc = allocator<_Tp> > class _LIBCPP_TYPE_VIS_ONLY list;
|
||||||
@@ -232,25 +273,21 @@ template <class _Tp, class _VoidPtr> class _LIBCPP_TYPE_VIS_ONLY __list_const_it
|
|||||||
template <class _Tp, class _VoidPtr>
|
template <class _Tp, class _VoidPtr>
|
||||||
class _LIBCPP_TYPE_VIS_ONLY __list_iterator
|
class _LIBCPP_TYPE_VIS_ONLY __list_iterator
|
||||||
{
|
{
|
||||||
typedef typename pointer_traits<_VoidPtr>::template
|
typedef __list_node_pointer_traits<_Tp, _VoidPtr> _NodeTraits;
|
||||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
typedef typename _NodeTraits::__link_pointer __link_pointer;
|
||||||
rebind<__list_node<_Tp, _VoidPtr> > __node_pointer;
|
|
||||||
#else
|
|
||||||
rebind<__list_node<_Tp, _VoidPtr> >::other __node_pointer;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
__node_pointer __ptr_;
|
__link_pointer __ptr_;
|
||||||
|
|
||||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
explicit __list_iterator(__node_pointer __p, const void* __c) _NOEXCEPT
|
explicit __list_iterator(__link_pointer __p, const void* __c) _NOEXCEPT
|
||||||
: __ptr_(__p)
|
: __ptr_(__p)
|
||||||
{
|
{
|
||||||
__get_db()->__insert_ic(this, __c);
|
__get_db()->__insert_ic(this, __c);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
explicit __list_iterator(__node_pointer __p) _NOEXCEPT : __ptr_(__p) {}
|
explicit __list_iterator(__link_pointer __p) _NOEXCEPT : __ptr_(__p) {}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@@ -262,13 +299,7 @@ public:
|
|||||||
typedef bidirectional_iterator_tag iterator_category;
|
typedef bidirectional_iterator_tag iterator_category;
|
||||||
typedef _Tp value_type;
|
typedef _Tp value_type;
|
||||||
typedef value_type& reference;
|
typedef value_type& reference;
|
||||||
typedef typename pointer_traits<_VoidPtr>::template
|
typedef typename __rebind_pointer<_VoidPtr, value_type>::type pointer;
|
||||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
|
||||||
rebind<value_type>
|
|
||||||
#else
|
|
||||||
rebind<value_type>::other
|
|
||||||
#endif
|
|
||||||
pointer;
|
|
||||||
typedef typename pointer_traits<pointer>::difference_type difference_type;
|
typedef typename pointer_traits<pointer>::difference_type difference_type;
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
@@ -314,7 +345,7 @@ public:
|
|||||||
_LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
|
_LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
|
||||||
"Attempted to dereference a non-dereferenceable list::iterator");
|
"Attempted to dereference a non-dereferenceable list::iterator");
|
||||||
#endif
|
#endif
|
||||||
return __ptr_->__value_;
|
return __ptr_->__as_node()->__value_;
|
||||||
}
|
}
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
pointer operator->() const
|
pointer operator->() const
|
||||||
@@ -323,7 +354,7 @@ public:
|
|||||||
_LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
|
_LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
|
||||||
"Attempted to dereference a non-dereferenceable list::iterator");
|
"Attempted to dereference a non-dereferenceable list::iterator");
|
||||||
#endif
|
#endif
|
||||||
return pointer_traits<pointer>::pointer_to(__ptr_->__value_);
|
return pointer_traits<pointer>::pointer_to(__ptr_->__as_node()->__value_);
|
||||||
}
|
}
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
@@ -365,25 +396,21 @@ public:
|
|||||||
template <class _Tp, class _VoidPtr>
|
template <class _Tp, class _VoidPtr>
|
||||||
class _LIBCPP_TYPE_VIS_ONLY __list_const_iterator
|
class _LIBCPP_TYPE_VIS_ONLY __list_const_iterator
|
||||||
{
|
{
|
||||||
typedef typename pointer_traits<_VoidPtr>::template
|
typedef __list_node_pointer_traits<_Tp, _VoidPtr> _NodeTraits;
|
||||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
typedef typename _NodeTraits::__link_pointer __link_pointer;
|
||||||
rebind<__list_node<_Tp, _VoidPtr> > __node_pointer;
|
|
||||||
#else
|
|
||||||
rebind<__list_node<_Tp, _VoidPtr> >::other __node_pointer;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
__node_pointer __ptr_;
|
__link_pointer __ptr_;
|
||||||
|
|
||||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
explicit __list_const_iterator(__node_pointer __p, const void* __c) _NOEXCEPT
|
explicit __list_const_iterator(__link_pointer __p, const void* __c) _NOEXCEPT
|
||||||
: __ptr_(__p)
|
: __ptr_(__p)
|
||||||
{
|
{
|
||||||
__get_db()->__insert_ic(this, __c);
|
__get_db()->__insert_ic(this, __c);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
explicit __list_const_iterator(__node_pointer __p) _NOEXCEPT : __ptr_(__p) {}
|
explicit __list_const_iterator(__link_pointer __p) _NOEXCEPT : __ptr_(__p) {}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
template<class, class> friend class list;
|
template<class, class> friend class list;
|
||||||
@@ -392,13 +419,7 @@ public:
|
|||||||
typedef bidirectional_iterator_tag iterator_category;
|
typedef bidirectional_iterator_tag iterator_category;
|
||||||
typedef _Tp value_type;
|
typedef _Tp value_type;
|
||||||
typedef const value_type& reference;
|
typedef const value_type& reference;
|
||||||
typedef typename pointer_traits<_VoidPtr>::template
|
typedef typename __rebind_pointer<_VoidPtr, const value_type>::type pointer;
|
||||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
|
||||||
rebind<const value_type>
|
|
||||||
#else
|
|
||||||
rebind<const value_type>::other
|
|
||||||
#endif
|
|
||||||
pointer;
|
|
||||||
typedef typename pointer_traits<pointer>::difference_type difference_type;
|
typedef typename pointer_traits<pointer>::difference_type difference_type;
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
@@ -451,7 +472,7 @@ public:
|
|||||||
_LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
|
_LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
|
||||||
"Attempted to dereference a non-dereferenceable list::const_iterator");
|
"Attempted to dereference a non-dereferenceable list::const_iterator");
|
||||||
#endif
|
#endif
|
||||||
return __ptr_->__value_;
|
return __ptr_->__as_node()->__value_;
|
||||||
}
|
}
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
pointer operator->() const
|
pointer operator->() const
|
||||||
@@ -460,7 +481,7 @@ public:
|
|||||||
_LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
|
_LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
|
||||||
"Attempted to dereference a non-dereferenceable list::iterator");
|
"Attempted to dereference a non-dereferenceable list::iterator");
|
||||||
#endif
|
#endif
|
||||||
return pointer_traits<pointer>::pointer_to(__ptr_->__value_);
|
return pointer_traits<pointer>::pointer_to(__ptr_->__as_node()->__value_);
|
||||||
}
|
}
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
@@ -518,6 +539,9 @@ protected:
|
|||||||
typedef allocator_traits<__node_allocator> __node_alloc_traits;
|
typedef allocator_traits<__node_allocator> __node_alloc_traits;
|
||||||
typedef typename __node_alloc_traits::pointer __node_pointer;
|
typedef typename __node_alloc_traits::pointer __node_pointer;
|
||||||
typedef typename __node_alloc_traits::pointer __node_const_pointer;
|
typedef typename __node_alloc_traits::pointer __node_const_pointer;
|
||||||
|
typedef __list_node_pointer_traits<value_type, __void_pointer> __node_pointer_traits;
|
||||||
|
typedef typename __node_pointer_traits::__link_pointer __link_pointer;
|
||||||
|
typedef __link_pointer __link_const_pointer;
|
||||||
typedef typename __alloc_traits::pointer pointer;
|
typedef typename __alloc_traits::pointer pointer;
|
||||||
typedef typename __alloc_traits::const_pointer const_pointer;
|
typedef typename __alloc_traits::const_pointer const_pointer;
|
||||||
typedef typename __alloc_traits::difference_type difference_type;
|
typedef typename __alloc_traits::difference_type difference_type;
|
||||||
@@ -528,6 +552,12 @@ protected:
|
|||||||
__node_base __end_;
|
__node_base __end_;
|
||||||
__compressed_pair<size_type, __node_allocator> __size_alloc_;
|
__compressed_pair<size_type, __node_allocator> __size_alloc_;
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
__link_pointer __end_as_link() const _NOEXCEPT {
|
||||||
|
return __node_pointer_traits::__unsafe_link_pointer_cast(
|
||||||
|
const_cast<__node_base&>(__end_).__self());
|
||||||
|
}
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
size_type& __sz() _NOEXCEPT {return __size_alloc_.first();}
|
size_type& __sz() _NOEXCEPT {return __size_alloc_.first();}
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
@@ -540,10 +570,13 @@ protected:
|
|||||||
const __node_allocator& __node_alloc() const _NOEXCEPT
|
const __node_allocator& __node_alloc() const _NOEXCEPT
|
||||||
{return __size_alloc_.second();}
|
{return __size_alloc_.second();}
|
||||||
|
|
||||||
static void __unlink_nodes(__node_pointer __f, __node_pointer __l) _NOEXCEPT;
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
static void __unlink_nodes(__link_pointer __f, __link_pointer __l) _NOEXCEPT;
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
__list_imp()
|
__list_imp()
|
||||||
_NOEXCEPT_(is_nothrow_default_constructible<__node_allocator>::value);
|
_NOEXCEPT_(is_nothrow_default_constructible<__node_allocator>::value);
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
__list_imp(const allocator_type& __a);
|
__list_imp(const allocator_type& __a);
|
||||||
~__list_imp();
|
~__list_imp();
|
||||||
void clear() _NOEXCEPT;
|
void clear() _NOEXCEPT;
|
||||||
@@ -572,22 +605,18 @@ protected:
|
|||||||
iterator end() _NOEXCEPT
|
iterator end() _NOEXCEPT
|
||||||
{
|
{
|
||||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||||
return iterator(static_cast<__node_pointer>(
|
return iterator(__end_as_link(), this);
|
||||||
pointer_traits<__node_base_pointer>::pointer_to(__end_)), this);
|
|
||||||
#else
|
#else
|
||||||
return iterator(static_cast<__node_pointer>(
|
return iterator(__end_as_link());
|
||||||
pointer_traits<__node_base_pointer>::pointer_to(__end_)));
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
const_iterator end() const _NOEXCEPT
|
const_iterator end() const _NOEXCEPT
|
||||||
{
|
{
|
||||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||||
return const_iterator(static_cast<__node_const_pointer>(
|
return const_iterator(__end_as_link(), this);
|
||||||
pointer_traits<__node_base_pointer>::pointer_to(const_cast<__node_base&>(__end_))), this);
|
|
||||||
#else
|
#else
|
||||||
return const_iterator(static_cast<__node_const_pointer>(
|
return const_iterator(__end_as_link());
|
||||||
pointer_traits<__node_base_pointer>::pointer_to(const_cast<__node_base&>(__end_))));
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -640,9 +669,9 @@ private:
|
|||||||
|
|
||||||
// Unlink nodes [__f, __l]
|
// Unlink nodes [__f, __l]
|
||||||
template <class _Tp, class _Alloc>
|
template <class _Tp, class _Alloc>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
__list_imp<_Tp, _Alloc>::__unlink_nodes(__node_pointer __f, __node_pointer __l)
|
__list_imp<_Tp, _Alloc>::__unlink_nodes(__link_pointer __f, __link_pointer __l)
|
||||||
_NOEXCEPT
|
_NOEXCEPT
|
||||||
{
|
{
|
||||||
__f->__prev_->__next_ = __l->__next_;
|
__f->__prev_->__next_ = __l->__next_;
|
||||||
@@ -650,7 +679,7 @@ __list_imp<_Tp, _Alloc>::__unlink_nodes(__node_pointer __f, __node_pointer __l)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class _Alloc>
|
template <class _Tp, class _Alloc>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
__list_imp<_Tp, _Alloc>::__list_imp()
|
__list_imp<_Tp, _Alloc>::__list_imp()
|
||||||
_NOEXCEPT_(is_nothrow_default_constructible<__node_allocator>::value)
|
_NOEXCEPT_(is_nothrow_default_constructible<__node_allocator>::value)
|
||||||
: __size_alloc_(0)
|
: __size_alloc_(0)
|
||||||
@@ -658,7 +687,7 @@ __list_imp<_Tp, _Alloc>::__list_imp()
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class _Alloc>
|
template <class _Tp, class _Alloc>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
__list_imp<_Tp, _Alloc>::__list_imp(const allocator_type& __a)
|
__list_imp<_Tp, _Alloc>::__list_imp(const allocator_type& __a)
|
||||||
: __size_alloc_(0, __node_allocator(__a))
|
: __size_alloc_(0, __node_allocator(__a))
|
||||||
{
|
{
|
||||||
@@ -680,17 +709,16 @@ __list_imp<_Tp, _Alloc>::clear() _NOEXCEPT
|
|||||||
if (!empty())
|
if (!empty())
|
||||||
{
|
{
|
||||||
__node_allocator& __na = __node_alloc();
|
__node_allocator& __na = __node_alloc();
|
||||||
__node_pointer __f = __end_.__next_;
|
__link_pointer __f = __end_.__next_;
|
||||||
__node_pointer __l = static_cast<__node_pointer>(
|
__link_pointer __l = __end_as_link();
|
||||||
pointer_traits<__node_base_pointer>::pointer_to(__end_));
|
|
||||||
__unlink_nodes(__f, __l->__prev_);
|
__unlink_nodes(__f, __l->__prev_);
|
||||||
__sz() = 0;
|
__sz() = 0;
|
||||||
while (__f != __l)
|
while (__f != __l)
|
||||||
{
|
{
|
||||||
__node_pointer __n = __f;
|
__node_pointer __np = __f->__as_node();
|
||||||
__f = __f->__next_;
|
__f = __f->__next_;
|
||||||
__node_alloc_traits::destroy(__na, _VSTD::addressof(__n->__value_));
|
__node_alloc_traits::destroy(__na, _VSTD::addressof(__np->__value_));
|
||||||
__node_alloc_traits::deallocate(__na, __n, 1);
|
__node_alloc_traits::deallocate(__na, __np, 1);
|
||||||
}
|
}
|
||||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||||
__c_node* __c = __get_db()->__find_c_and_lock(this);
|
__c_node* __c = __get_db()->__find_c_and_lock(this);
|
||||||
@@ -729,13 +757,13 @@ __list_imp<_Tp, _Alloc>::swap(__list_imp& __c)
|
|||||||
swap(__sz(), __c.__sz());
|
swap(__sz(), __c.__sz());
|
||||||
swap(__end_, __c.__end_);
|
swap(__end_, __c.__end_);
|
||||||
if (__sz() == 0)
|
if (__sz() == 0)
|
||||||
__end_.__next_ = __end_.__prev_ = __end_.__self();
|
__end_.__next_ = __end_.__prev_ = __end_as_link();
|
||||||
else
|
else
|
||||||
__end_.__prev_->__next_ = __end_.__next_->__prev_ = __end_.__self();
|
__end_.__prev_->__next_ = __end_.__next_->__prev_ = __end_as_link();
|
||||||
if (__c.__sz() == 0)
|
if (__c.__sz() == 0)
|
||||||
__c.__end_.__next_ = __c.__end_.__prev_ = __c.__end_.__self();
|
__c.__end_.__next_ = __c.__end_.__prev_ = __c.__end_as_link();
|
||||||
else
|
else
|
||||||
__c.__end_.__prev_->__next_ = __c.__end_.__next_->__prev_ = __c.__end_.__self();
|
__c.__end_.__prev_->__next_ = __c.__end_.__next_->__prev_ = __c.__end_as_link();
|
||||||
|
|
||||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||||
__libcpp_db* __db = __get_db();
|
__libcpp_db* __db = __get_db();
|
||||||
@@ -748,8 +776,7 @@ __list_imp<_Tp, _Alloc>::swap(__list_imp& __c)
|
|||||||
{
|
{
|
||||||
--__p;
|
--__p;
|
||||||
const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
|
const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
|
||||||
if (__i->__ptr_ == static_cast<__node_pointer>(
|
if (__i->__ptr_ == __c.__end_as_link())
|
||||||
pointer_traits<__node_base_pointer>::pointer_to(__c.__end_)))
|
|
||||||
{
|
{
|
||||||
__cn2->__add(*__p);
|
__cn2->__add(*__p);
|
||||||
if (--__cn1->end_ != __p)
|
if (--__cn1->end_ != __p)
|
||||||
@@ -762,8 +789,7 @@ __list_imp<_Tp, _Alloc>::swap(__list_imp& __c)
|
|||||||
{
|
{
|
||||||
--__p;
|
--__p;
|
||||||
const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
|
const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
|
||||||
if (__i->__ptr_ == static_cast<__node_pointer>(
|
if (__i->__ptr_ == __end_as_link())
|
||||||
pointer_traits<__node_base_pointer>::pointer_to(__end_)))
|
|
||||||
{
|
{
|
||||||
__cn1->__add(*__p);
|
__cn1->__add(*__p);
|
||||||
if (--__cn2->end_ != __p)
|
if (--__cn2->end_ != __p)
|
||||||
@@ -787,6 +813,7 @@ class _LIBCPP_TYPE_VIS_ONLY list
|
|||||||
typedef typename base::__node_alloc_traits __node_alloc_traits;
|
typedef typename base::__node_alloc_traits __node_alloc_traits;
|
||||||
typedef typename base::__node_base __node_base;
|
typedef typename base::__node_base __node_base;
|
||||||
typedef typename base::__node_base_pointer __node_base_pointer;
|
typedef typename base::__node_base_pointer __node_base_pointer;
|
||||||
|
typedef typename base::__link_pointer __link_pointer;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
typedef _Tp value_type;
|
typedef _Tp value_type;
|
||||||
@@ -834,15 +861,19 @@ public:
|
|||||||
|
|
||||||
list(const list& __c);
|
list(const list& __c);
|
||||||
list(const list& __c, const allocator_type& __a);
|
list(const list& __c, const allocator_type& __a);
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
list& operator=(const list& __c);
|
list& operator=(const list& __c);
|
||||||
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
||||||
list(initializer_list<value_type> __il);
|
list(initializer_list<value_type> __il);
|
||||||
list(initializer_list<value_type> __il, const allocator_type& __a);
|
list(initializer_list<value_type> __il, const allocator_type& __a);
|
||||||
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
list(list&& __c)
|
list(list&& __c)
|
||||||
_NOEXCEPT_(is_nothrow_move_constructible<__node_allocator>::value);
|
_NOEXCEPT_(is_nothrow_move_constructible<__node_allocator>::value);
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
list(list&& __c, const allocator_type& __a);
|
list(list&& __c, const allocator_type& __a);
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
list& operator=(list&& __c)
|
list& operator=(list&& __c)
|
||||||
_NOEXCEPT_(
|
_NOEXCEPT_(
|
||||||
__node_alloc_traits::propagate_on_container_move_assignment::value &&
|
__node_alloc_traits::propagate_on_container_move_assignment::value &&
|
||||||
@@ -864,6 +895,7 @@ public:
|
|||||||
{assign(__il.begin(), __il.end());}
|
{assign(__il.begin(), __il.end());}
|
||||||
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
allocator_type get_allocator() const _NOEXCEPT;
|
allocator_type get_allocator() const _NOEXCEPT;
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
@@ -910,25 +942,25 @@ public:
|
|||||||
reference front()
|
reference front()
|
||||||
{
|
{
|
||||||
_LIBCPP_ASSERT(!empty(), "list::front called on empty list");
|
_LIBCPP_ASSERT(!empty(), "list::front called on empty list");
|
||||||
return base::__end_.__next_->__value_;
|
return base::__end_.__next_->__as_node()->__value_;
|
||||||
}
|
}
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
const_reference front() const
|
const_reference front() const
|
||||||
{
|
{
|
||||||
_LIBCPP_ASSERT(!empty(), "list::front called on empty list");
|
_LIBCPP_ASSERT(!empty(), "list::front called on empty list");
|
||||||
return base::__end_.__next_->__value_;
|
return base::__end_.__next_->__as_node()->__value_;
|
||||||
}
|
}
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
reference back()
|
reference back()
|
||||||
{
|
{
|
||||||
_LIBCPP_ASSERT(!empty(), "list::back called on empty list");
|
_LIBCPP_ASSERT(!empty(), "list::back called on empty list");
|
||||||
return base::__end_.__prev_->__value_;
|
return base::__end_.__prev_->__as_node()->__value_;
|
||||||
}
|
}
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
const_reference back() const
|
const_reference back() const
|
||||||
{
|
{
|
||||||
_LIBCPP_ASSERT(!empty(), "list::back called on empty list");
|
_LIBCPP_ASSERT(!empty(), "list::back called on empty list");
|
||||||
return base::__end_.__prev_->__value_;
|
return base::__end_.__prev_->__as_node()->__value_;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
@@ -1000,9 +1032,11 @@ public:
|
|||||||
|
|
||||||
void remove(const value_type& __x);
|
void remove(const value_type& __x);
|
||||||
template <class _Pred> void remove_if(_Pred __pred);
|
template <class _Pred> void remove_if(_Pred __pred);
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void unique();
|
void unique();
|
||||||
template <class _BinaryPred>
|
template <class _BinaryPred>
|
||||||
void unique(_BinaryPred __binary_pred);
|
void unique(_BinaryPred __binary_pred);
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void merge(list& __c);
|
void merge(list& __c);
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
@@ -1015,8 +1049,10 @@ public:
|
|||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void merge(list&& __c, _Comp __comp) {merge(__c, __comp);}
|
void merge(list&& __c, _Comp __comp) {merge(__c, __comp);}
|
||||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void sort();
|
void sort();
|
||||||
template <class _Comp>
|
template <class _Comp>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void sort(_Comp __comp);
|
void sort(_Comp __comp);
|
||||||
|
|
||||||
void reverse() _NOEXCEPT;
|
void reverse() _NOEXCEPT;
|
||||||
@@ -1033,9 +1069,12 @@ public:
|
|||||||
#endif // _LIBCPP_DEBUG_LEVEL >= 2
|
#endif // _LIBCPP_DEBUG_LEVEL >= 2
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static void __link_nodes (__node_pointer __p, __node_pointer __f, __node_pointer __l);
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void __link_nodes_at_front(__node_pointer __f, __node_pointer __l);
|
static void __link_nodes (__link_pointer __p, __link_pointer __f, __link_pointer __l);
|
||||||
void __link_nodes_at_back (__node_pointer __f, __node_pointer __l);
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
void __link_nodes_at_front(__link_pointer __f, __link_pointer __l);
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
void __link_nodes_at_back (__link_pointer __f, __link_pointer __l);
|
||||||
iterator __iterator(size_type __n);
|
iterator __iterator(size_type __n);
|
||||||
template <class _Comp>
|
template <class _Comp>
|
||||||
static iterator __sort(iterator __f1, iterator __e2, size_type __n, _Comp& __comp);
|
static iterator __sort(iterator __f1, iterator __e2, size_type __n, _Comp& __comp);
|
||||||
@@ -1047,9 +1086,9 @@ private:
|
|||||||
|
|
||||||
// Link in nodes [__f, __l] just prior to __p
|
// Link in nodes [__f, __l] just prior to __p
|
||||||
template <class _Tp, class _Alloc>
|
template <class _Tp, class _Alloc>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
list<_Tp, _Alloc>::__link_nodes(__node_pointer __p, __node_pointer __f, __node_pointer __l)
|
list<_Tp, _Alloc>::__link_nodes(__link_pointer __p, __link_pointer __f, __link_pointer __l)
|
||||||
{
|
{
|
||||||
__p->__prev_->__next_ = __f;
|
__p->__prev_->__next_ = __f;
|
||||||
__f->__prev_ = __p->__prev_;
|
__f->__prev_ = __p->__prev_;
|
||||||
@@ -1059,11 +1098,11 @@ list<_Tp, _Alloc>::__link_nodes(__node_pointer __p, __node_pointer __f, __node_p
|
|||||||
|
|
||||||
// Link in nodes [__f, __l] at the front of the list
|
// Link in nodes [__f, __l] at the front of the list
|
||||||
template <class _Tp, class _Alloc>
|
template <class _Tp, class _Alloc>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
list<_Tp, _Alloc>::__link_nodes_at_front(__node_pointer __f, __node_pointer __l)
|
list<_Tp, _Alloc>::__link_nodes_at_front(__link_pointer __f, __link_pointer __l)
|
||||||
{
|
{
|
||||||
__f->__prev_ = base::__end_.__self();
|
__f->__prev_ = base::__end_as_link();
|
||||||
__l->__next_ = base::__end_.__next_;
|
__l->__next_ = base::__end_.__next_;
|
||||||
__l->__next_->__prev_ = __l;
|
__l->__next_->__prev_ = __l;
|
||||||
base::__end_.__next_ = __f;
|
base::__end_.__next_ = __f;
|
||||||
@@ -1071,11 +1110,11 @@ list<_Tp, _Alloc>::__link_nodes_at_front(__node_pointer __f, __node_pointer __l)
|
|||||||
|
|
||||||
// Link in nodes [__f, __l] at the front of the list
|
// Link in nodes [__f, __l] at the front of the list
|
||||||
template <class _Tp, class _Alloc>
|
template <class _Tp, class _Alloc>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
list<_Tp, _Alloc>::__link_nodes_at_back(__node_pointer __f, __node_pointer __l)
|
list<_Tp, _Alloc>::__link_nodes_at_back(__link_pointer __f, __link_pointer __l)
|
||||||
{
|
{
|
||||||
__l->__next_ = base::__end_.__self();
|
__l->__next_ = base::__end_as_link();
|
||||||
__f->__prev_ = base::__end_.__prev_;
|
__f->__prev_ = base::__end_.__prev_;
|
||||||
__f->__prev_->__next_ = __f;
|
__f->__prev_->__next_ = __f;
|
||||||
base::__end_.__prev_ = __l;
|
base::__end_.__prev_ = __l;
|
||||||
@@ -1083,7 +1122,7 @@ list<_Tp, _Alloc>::__link_nodes_at_back(__node_pointer __f, __node_pointer __l)
|
|||||||
|
|
||||||
|
|
||||||
template <class _Tp, class _Alloc>
|
template <class _Tp, class _Alloc>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
typename list<_Tp, _Alloc>::iterator
|
typename list<_Tp, _Alloc>::iterator
|
||||||
list<_Tp, _Alloc>::__iterator(size_type __n)
|
list<_Tp, _Alloc>::__iterator(size_type __n)
|
||||||
{
|
{
|
||||||
@@ -1219,7 +1258,7 @@ list<_Tp, _Alloc>::list(initializer_list<value_type> __il)
|
|||||||
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
||||||
|
|
||||||
template <class _Tp, class _Alloc>
|
template <class _Tp, class _Alloc>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
list<_Tp, _Alloc>&
|
list<_Tp, _Alloc>&
|
||||||
list<_Tp, _Alloc>::operator=(const list& __c)
|
list<_Tp, _Alloc>::operator=(const list& __c)
|
||||||
{
|
{
|
||||||
@@ -1234,7 +1273,7 @@ list<_Tp, _Alloc>::operator=(const list& __c)
|
|||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
|
||||||
template <class _Tp, class _Alloc>
|
template <class _Tp, class _Alloc>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
list<_Tp, _Alloc>::list(list&& __c)
|
list<_Tp, _Alloc>::list(list&& __c)
|
||||||
_NOEXCEPT_(is_nothrow_move_constructible<__node_allocator>::value)
|
_NOEXCEPT_(is_nothrow_move_constructible<__node_allocator>::value)
|
||||||
: base(allocator_type(_VSTD::move(__c.__node_alloc())))
|
: base(allocator_type(_VSTD::move(__c.__node_alloc())))
|
||||||
@@ -1246,7 +1285,7 @@ list<_Tp, _Alloc>::list(list&& __c)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class _Alloc>
|
template <class _Tp, class _Alloc>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
list<_Tp, _Alloc>::list(list&& __c, const allocator_type& __a)
|
list<_Tp, _Alloc>::list(list&& __c, const allocator_type& __a)
|
||||||
: base(__a)
|
: base(__a)
|
||||||
{
|
{
|
||||||
@@ -1263,7 +1302,7 @@ list<_Tp, _Alloc>::list(list&& __c, const allocator_type& __a)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class _Alloc>
|
template <class _Tp, class _Alloc>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
list<_Tp, _Alloc>&
|
list<_Tp, _Alloc>&
|
||||||
list<_Tp, _Alloc>::operator=(list&& __c)
|
list<_Tp, _Alloc>::operator=(list&& __c)
|
||||||
_NOEXCEPT_(
|
_NOEXCEPT_(
|
||||||
@@ -1331,7 +1370,7 @@ list<_Tp, _Alloc>::assign(size_type __n, const value_type& __x)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class _Alloc>
|
template <class _Tp, class _Alloc>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
_Alloc
|
_Alloc
|
||||||
list<_Tp, _Alloc>::get_allocator() const _NOEXCEPT
|
list<_Tp, _Alloc>::get_allocator() const _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -1352,12 +1391,12 @@ list<_Tp, _Alloc>::insert(const_iterator __p, const value_type& __x)
|
|||||||
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
|
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
|
||||||
__hold->__prev_ = 0;
|
__hold->__prev_ = 0;
|
||||||
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
|
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
|
||||||
__link_nodes(__p.__ptr_, __hold.get(), __hold.get());
|
__link_nodes(__p.__ptr_, __hold->__as_link(), __hold->__as_link());
|
||||||
++base::__sz();
|
++base::__sz();
|
||||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||||
return iterator(__hold.release(), this);
|
return iterator(__hold.release()->__as_link(), this);
|
||||||
#else
|
#else
|
||||||
return iterator(__hold.release());
|
return iterator(__hold.release()->__as_link());
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1383,9 +1422,9 @@ list<_Tp, _Alloc>::insert(const_iterator __p, size_type __n, const value_type& _
|
|||||||
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
|
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
|
||||||
++__ds;
|
++__ds;
|
||||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||||
__r = iterator(__hold.get(), this);
|
__r = iterator(__hold->__as_link(), this);
|
||||||
#else
|
#else
|
||||||
__r = iterator(__hold.get());
|
__r = iterator(__hold->__as_link());
|
||||||
#endif
|
#endif
|
||||||
__hold.release();
|
__hold.release();
|
||||||
iterator __e = __r;
|
iterator __e = __r;
|
||||||
@@ -1397,7 +1436,7 @@ list<_Tp, _Alloc>::insert(const_iterator __p, size_type __n, const value_type& _
|
|||||||
{
|
{
|
||||||
__hold.reset(__node_alloc_traits::allocate(__na, 1));
|
__hold.reset(__node_alloc_traits::allocate(__na, 1));
|
||||||
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
|
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
|
||||||
__e.__ptr_->__next_ = __hold.get();
|
__e.__ptr_->__next_ = __hold->__as_link();
|
||||||
__hold->__prev_ = __e.__ptr_;
|
__hold->__prev_ = __e.__ptr_;
|
||||||
__hold.release();
|
__hold.release();
|
||||||
}
|
}
|
||||||
@@ -1408,8 +1447,8 @@ list<_Tp, _Alloc>::insert(const_iterator __p, size_type __n, const value_type& _
|
|||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
__node_alloc_traits::destroy(__na, _VSTD::addressof(*__e));
|
__node_alloc_traits::destroy(__na, _VSTD::addressof(*__e));
|
||||||
__node_pointer __prev = __e.__ptr_->__prev_;
|
__link_pointer __prev = __e.__ptr_->__prev_;
|
||||||
__node_alloc_traits::deallocate(__na, __e.__ptr_, 1);
|
__node_alloc_traits::deallocate(__na, __e.__ptr_->__as_node(), 1);
|
||||||
if (__prev == 0)
|
if (__prev == 0)
|
||||||
break;
|
break;
|
||||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||||
@@ -1451,9 +1490,9 @@ list<_Tp, _Alloc>::insert(const_iterator __p, _InpIter __f, _InpIter __l,
|
|||||||
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), *__f);
|
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), *__f);
|
||||||
++__ds;
|
++__ds;
|
||||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||||
__r = iterator(__hold.get(), this);
|
__r = iterator(__hold.get()->__as_link(), this);
|
||||||
#else
|
#else
|
||||||
__r = iterator(__hold.get());
|
__r = iterator(__hold.get()->__as_link());
|
||||||
#endif
|
#endif
|
||||||
__hold.release();
|
__hold.release();
|
||||||
iterator __e = __r;
|
iterator __e = __r;
|
||||||
@@ -1465,7 +1504,7 @@ list<_Tp, _Alloc>::insert(const_iterator __p, _InpIter __f, _InpIter __l,
|
|||||||
{
|
{
|
||||||
__hold.reset(__node_alloc_traits::allocate(__na, 1));
|
__hold.reset(__node_alloc_traits::allocate(__na, 1));
|
||||||
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), *__f);
|
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), *__f);
|
||||||
__e.__ptr_->__next_ = __hold.get();
|
__e.__ptr_->__next_ = __hold.get()->__as_link();
|
||||||
__hold->__prev_ = __e.__ptr_;
|
__hold->__prev_ = __e.__ptr_;
|
||||||
__hold.release();
|
__hold.release();
|
||||||
}
|
}
|
||||||
@@ -1476,8 +1515,8 @@ list<_Tp, _Alloc>::insert(const_iterator __p, _InpIter __f, _InpIter __l,
|
|||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
__node_alloc_traits::destroy(__na, _VSTD::addressof(*__e));
|
__node_alloc_traits::destroy(__na, _VSTD::addressof(*__e));
|
||||||
__node_pointer __prev = __e.__ptr_->__prev_;
|
__link_pointer __prev = __e.__ptr_->__prev_;
|
||||||
__node_alloc_traits::deallocate(__na, __e.__ptr_, 1);
|
__node_alloc_traits::deallocate(__na, __e.__ptr_->__as_node(), 1);
|
||||||
if (__prev == 0)
|
if (__prev == 0)
|
||||||
break;
|
break;
|
||||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||||
@@ -1503,7 +1542,8 @@ list<_Tp, _Alloc>::push_front(const value_type& __x)
|
|||||||
typedef __allocator_destructor<__node_allocator> _Dp;
|
typedef __allocator_destructor<__node_allocator> _Dp;
|
||||||
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
|
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
|
||||||
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
|
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
|
||||||
__link_nodes_at_front(__hold.get(), __hold.get());
|
__link_pointer __nl = __hold->__as_link();
|
||||||
|
__link_nodes_at_front(__nl, __nl);
|
||||||
++base::__sz();
|
++base::__sz();
|
||||||
__hold.release();
|
__hold.release();
|
||||||
}
|
}
|
||||||
@@ -1516,7 +1556,7 @@ list<_Tp, _Alloc>::push_back(const value_type& __x)
|
|||||||
typedef __allocator_destructor<__node_allocator> _Dp;
|
typedef __allocator_destructor<__node_allocator> _Dp;
|
||||||
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
|
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
|
||||||
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
|
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
|
||||||
__link_nodes_at_back(__hold.get(), __hold.get());
|
__link_nodes_at_back(__hold.get()->__as_link(), __hold.get()->__as_link());
|
||||||
++base::__sz();
|
++base::__sz();
|
||||||
__hold.release();
|
__hold.release();
|
||||||
}
|
}
|
||||||
@@ -1531,7 +1571,7 @@ list<_Tp, _Alloc>::push_front(value_type&& __x)
|
|||||||
typedef __allocator_destructor<__node_allocator> _Dp;
|
typedef __allocator_destructor<__node_allocator> _Dp;
|
||||||
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
|
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
|
||||||
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::move(__x));
|
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::move(__x));
|
||||||
__link_nodes_at_front(__hold.get(), __hold.get());
|
__link_nodes_at_front(__hold.get()->__as_link(), __hold.get()->__as_link());
|
||||||
++base::__sz();
|
++base::__sz();
|
||||||
__hold.release();
|
__hold.release();
|
||||||
}
|
}
|
||||||
@@ -1544,7 +1584,7 @@ list<_Tp, _Alloc>::push_back(value_type&& __x)
|
|||||||
typedef __allocator_destructor<__node_allocator> _Dp;
|
typedef __allocator_destructor<__node_allocator> _Dp;
|
||||||
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
|
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
|
||||||
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::move(__x));
|
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::move(__x));
|
||||||
__link_nodes_at_back(__hold.get(), __hold.get());
|
__link_nodes_at_back(__hold.get()->__as_link(), __hold.get()->__as_link());
|
||||||
++base::__sz();
|
++base::__sz();
|
||||||
__hold.release();
|
__hold.release();
|
||||||
}
|
}
|
||||||
@@ -1560,7 +1600,7 @@ list<_Tp, _Alloc>::emplace_front(_Args&&... __args)
|
|||||||
typedef __allocator_destructor<__node_allocator> _Dp;
|
typedef __allocator_destructor<__node_allocator> _Dp;
|
||||||
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
|
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
|
||||||
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::forward<_Args>(__args)...);
|
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::forward<_Args>(__args)...);
|
||||||
__link_nodes_at_front(__hold.get(), __hold.get());
|
__link_nodes_at_front(__hold.get()->__as_link(), __hold.get()->__as_link());
|
||||||
++base::__sz();
|
++base::__sz();
|
||||||
__hold.release();
|
__hold.release();
|
||||||
}
|
}
|
||||||
@@ -1574,7 +1614,8 @@ list<_Tp, _Alloc>::emplace_back(_Args&&... __args)
|
|||||||
typedef __allocator_destructor<__node_allocator> _Dp;
|
typedef __allocator_destructor<__node_allocator> _Dp;
|
||||||
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
|
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
|
||||||
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::forward<_Args>(__args)...);
|
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::forward<_Args>(__args)...);
|
||||||
__link_nodes_at_back(__hold.get(), __hold.get());
|
__link_pointer __nl = __hold->__as_link();
|
||||||
|
__link_nodes_at_back(__nl, __nl);
|
||||||
++base::__sz();
|
++base::__sz();
|
||||||
__hold.release();
|
__hold.release();
|
||||||
}
|
}
|
||||||
@@ -1594,12 +1635,14 @@ list<_Tp, _Alloc>::emplace(const_iterator __p, _Args&&... __args)
|
|||||||
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
|
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
|
||||||
__hold->__prev_ = 0;
|
__hold->__prev_ = 0;
|
||||||
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::forward<_Args>(__args)...);
|
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::forward<_Args>(__args)...);
|
||||||
__link_nodes(__p.__ptr_, __hold.get(), __hold.get());
|
__link_pointer __nl = __hold.get()->__as_link();
|
||||||
|
__link_nodes(__p.__ptr_, __nl, __nl);
|
||||||
++base::__sz();
|
++base::__sz();
|
||||||
|
__hold.release();
|
||||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||||
return iterator(__hold.release(), this);
|
return iterator(__nl, this);
|
||||||
#else
|
#else
|
||||||
return iterator(__hold.release());
|
return iterator(__nl);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1619,12 +1662,14 @@ list<_Tp, _Alloc>::insert(const_iterator __p, value_type&& __x)
|
|||||||
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
|
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
|
||||||
__hold->__prev_ = 0;
|
__hold->__prev_ = 0;
|
||||||
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::move(__x));
|
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::move(__x));
|
||||||
__link_nodes(__p.__ptr_, __hold.get(), __hold.get());
|
__link_pointer __nl = __hold->__as_link();
|
||||||
|
__link_nodes(__p.__ptr_, __nl, __nl);
|
||||||
++base::__sz();
|
++base::__sz();
|
||||||
|
__hold.release();
|
||||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||||
return iterator(__hold.release(), this);
|
return iterator(__nl, this);
|
||||||
#else
|
#else
|
||||||
return iterator(__hold.release());
|
return iterator(__nl);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1636,7 +1681,7 @@ list<_Tp, _Alloc>::pop_front()
|
|||||||
{
|
{
|
||||||
_LIBCPP_ASSERT(!empty(), "list::pop_front() called with empty list");
|
_LIBCPP_ASSERT(!empty(), "list::pop_front() called with empty list");
|
||||||
__node_allocator& __na = base::__node_alloc();
|
__node_allocator& __na = base::__node_alloc();
|
||||||
__node_pointer __n = base::__end_.__next_;
|
__link_pointer __n = base::__end_.__next_;
|
||||||
base::__unlink_nodes(__n, __n);
|
base::__unlink_nodes(__n, __n);
|
||||||
--base::__sz();
|
--base::__sz();
|
||||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||||
@@ -1654,8 +1699,9 @@ list<_Tp, _Alloc>::pop_front()
|
|||||||
}
|
}
|
||||||
__get_db()->unlock();
|
__get_db()->unlock();
|
||||||
#endif
|
#endif
|
||||||
__node_alloc_traits::destroy(__na, _VSTD::addressof(__n->__value_));
|
__node_pointer __np = __n->__as_node();
|
||||||
__node_alloc_traits::deallocate(__na, __n, 1);
|
__node_alloc_traits::destroy(__na, _VSTD::addressof(__np->__value_));
|
||||||
|
__node_alloc_traits::deallocate(__na, __np, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class _Alloc>
|
template <class _Tp, class _Alloc>
|
||||||
@@ -1664,7 +1710,7 @@ list<_Tp, _Alloc>::pop_back()
|
|||||||
{
|
{
|
||||||
_LIBCPP_ASSERT(!empty(), "list::pop_back() called with empty list");
|
_LIBCPP_ASSERT(!empty(), "list::pop_back() called with empty list");
|
||||||
__node_allocator& __na = base::__node_alloc();
|
__node_allocator& __na = base::__node_alloc();
|
||||||
__node_pointer __n = base::__end_.__prev_;
|
__link_pointer __n = base::__end_.__prev_;
|
||||||
base::__unlink_nodes(__n, __n);
|
base::__unlink_nodes(__n, __n);
|
||||||
--base::__sz();
|
--base::__sz();
|
||||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||||
@@ -1682,8 +1728,9 @@ list<_Tp, _Alloc>::pop_back()
|
|||||||
}
|
}
|
||||||
__get_db()->unlock();
|
__get_db()->unlock();
|
||||||
#endif
|
#endif
|
||||||
__node_alloc_traits::destroy(__na, _VSTD::addressof(__n->__value_));
|
__node_pointer __np = __n->__as_node();
|
||||||
__node_alloc_traits::deallocate(__na, __n, 1);
|
__node_alloc_traits::destroy(__na, _VSTD::addressof(__np->__value_));
|
||||||
|
__node_alloc_traits::deallocate(__na, __np, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class _Alloc>
|
template <class _Tp, class _Alloc>
|
||||||
@@ -1698,8 +1745,8 @@ list<_Tp, _Alloc>::erase(const_iterator __p)
|
|||||||
_LIBCPP_ASSERT(__p != end(),
|
_LIBCPP_ASSERT(__p != end(),
|
||||||
"list::erase(iterator) called with a non-dereferenceable iterator");
|
"list::erase(iterator) called with a non-dereferenceable iterator");
|
||||||
__node_allocator& __na = base::__node_alloc();
|
__node_allocator& __na = base::__node_alloc();
|
||||||
__node_pointer __n = __p.__ptr_;
|
__link_pointer __n = __p.__ptr_;
|
||||||
__node_pointer __r = __n->__next_;
|
__link_pointer __r = __n->__next_;
|
||||||
base::__unlink_nodes(__n, __n);
|
base::__unlink_nodes(__n, __n);
|
||||||
--base::__sz();
|
--base::__sz();
|
||||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||||
@@ -1717,8 +1764,9 @@ list<_Tp, _Alloc>::erase(const_iterator __p)
|
|||||||
}
|
}
|
||||||
__get_db()->unlock();
|
__get_db()->unlock();
|
||||||
#endif
|
#endif
|
||||||
__node_alloc_traits::destroy(__na, _VSTD::addressof(__n->__value_));
|
__node_pointer __np = __n->__as_node();
|
||||||
__node_alloc_traits::deallocate(__na, __n, 1);
|
__node_alloc_traits::destroy(__na, _VSTD::addressof(__np->__value_));
|
||||||
|
__node_alloc_traits::deallocate(__na, __np, 1);
|
||||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||||
return iterator(__r, this);
|
return iterator(__r, this);
|
||||||
#else
|
#else
|
||||||
@@ -1741,7 +1789,7 @@ list<_Tp, _Alloc>::erase(const_iterator __f, const_iterator __l)
|
|||||||
base::__unlink_nodes(__f.__ptr_, __l.__ptr_->__prev_);
|
base::__unlink_nodes(__f.__ptr_, __l.__ptr_->__prev_);
|
||||||
while (__f != __l)
|
while (__f != __l)
|
||||||
{
|
{
|
||||||
__node_pointer __n = __f.__ptr_;
|
__link_pointer __n = __f.__ptr_;
|
||||||
++__f;
|
++__f;
|
||||||
--base::__sz();
|
--base::__sz();
|
||||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||||
@@ -1759,8 +1807,9 @@ list<_Tp, _Alloc>::erase(const_iterator __f, const_iterator __l)
|
|||||||
}
|
}
|
||||||
__get_db()->unlock();
|
__get_db()->unlock();
|
||||||
#endif
|
#endif
|
||||||
__node_alloc_traits::destroy(__na, _VSTD::addressof(__n->__value_));
|
__node_pointer __np = __n->__as_node();
|
||||||
__node_alloc_traits::deallocate(__na, __n, 1);
|
__node_alloc_traits::destroy(__na, _VSTD::addressof(__np->__value_));
|
||||||
|
__node_alloc_traits::deallocate(__na, __np, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||||
@@ -1787,9 +1836,9 @@ list<_Tp, _Alloc>::resize(size_type __n)
|
|||||||
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_));
|
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_));
|
||||||
++__ds;
|
++__ds;
|
||||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||||
iterator __r = iterator(__hold.release(), this);
|
iterator __r = iterator(__hold.release()->__as_link(), this);
|
||||||
#else
|
#else
|
||||||
iterator __r = iterator(__hold.release());
|
iterator __r = iterator(__hold.release()->__as_link());
|
||||||
#endif
|
#endif
|
||||||
iterator __e = __r;
|
iterator __e = __r;
|
||||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||||
@@ -1800,7 +1849,7 @@ list<_Tp, _Alloc>::resize(size_type __n)
|
|||||||
{
|
{
|
||||||
__hold.reset(__node_alloc_traits::allocate(__na, 1));
|
__hold.reset(__node_alloc_traits::allocate(__na, 1));
|
||||||
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_));
|
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_));
|
||||||
__e.__ptr_->__next_ = __hold.get();
|
__e.__ptr_->__next_ = __hold.get()->__as_link();
|
||||||
__hold->__prev_ = __e.__ptr_;
|
__hold->__prev_ = __e.__ptr_;
|
||||||
__hold.release();
|
__hold.release();
|
||||||
}
|
}
|
||||||
@@ -1811,8 +1860,8 @@ list<_Tp, _Alloc>::resize(size_type __n)
|
|||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
__node_alloc_traits::destroy(__na, _VSTD::addressof(*__e));
|
__node_alloc_traits::destroy(__na, _VSTD::addressof(*__e));
|
||||||
__node_pointer __prev = __e.__ptr_->__prev_;
|
__link_pointer __prev = __e.__ptr_->__prev_;
|
||||||
__node_alloc_traits::deallocate(__na, __e.__ptr_, 1);
|
__node_alloc_traits::deallocate(__na, __e.__ptr_->__as_node(), 1);
|
||||||
if (__prev == 0)
|
if (__prev == 0)
|
||||||
break;
|
break;
|
||||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||||
@@ -1845,10 +1894,11 @@ list<_Tp, _Alloc>::resize(size_type __n, const value_type& __x)
|
|||||||
__hold->__prev_ = 0;
|
__hold->__prev_ = 0;
|
||||||
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
|
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
|
||||||
++__ds;
|
++__ds;
|
||||||
|
__link_pointer __nl = __hold.release()->__as_link();
|
||||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||||
iterator __r = iterator(__hold.release(), this);
|
iterator __r = iterator(__nl, this);
|
||||||
#else
|
#else
|
||||||
iterator __r = iterator(__hold.release());
|
iterator __r = iterator(__nl);
|
||||||
#endif
|
#endif
|
||||||
iterator __e = __r;
|
iterator __e = __r;
|
||||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||||
@@ -1859,7 +1909,7 @@ list<_Tp, _Alloc>::resize(size_type __n, const value_type& __x)
|
|||||||
{
|
{
|
||||||
__hold.reset(__node_alloc_traits::allocate(__na, 1));
|
__hold.reset(__node_alloc_traits::allocate(__na, 1));
|
||||||
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
|
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
|
||||||
__e.__ptr_->__next_ = __hold.get();
|
__e.__ptr_->__next_ = __hold.get()->__as_link();
|
||||||
__hold->__prev_ = __e.__ptr_;
|
__hold->__prev_ = __e.__ptr_;
|
||||||
__hold.release();
|
__hold.release();
|
||||||
}
|
}
|
||||||
@@ -1870,8 +1920,8 @@ list<_Tp, _Alloc>::resize(size_type __n, const value_type& __x)
|
|||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
__node_alloc_traits::destroy(__na, _VSTD::addressof(*__e));
|
__node_alloc_traits::destroy(__na, _VSTD::addressof(*__e));
|
||||||
__node_pointer __prev = __e.__ptr_->__prev_;
|
__link_pointer __prev = __e.__ptr_->__prev_;
|
||||||
__node_alloc_traits::deallocate(__na, __e.__ptr_, 1);
|
__node_alloc_traits::deallocate(__na, __e.__ptr_->__as_node(), 1);
|
||||||
if (__prev == 0)
|
if (__prev == 0)
|
||||||
break;
|
break;
|
||||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||||
@@ -1883,8 +1933,7 @@ list<_Tp, _Alloc>::resize(size_type __n, const value_type& __x)
|
|||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
#endif // _LIBCPP_NO_EXCEPTIONS
|
#endif // _LIBCPP_NO_EXCEPTIONS
|
||||||
__link_nodes(static_cast<__node_pointer>(pointer_traits<__node_base_pointer>::
|
__link_nodes(base::__end_as_link(), __r.__ptr_, __e.__ptr_);
|
||||||
pointer_to(base::__end_)), __r.__ptr_, __e.__ptr_);
|
|
||||||
base::__sz() += __ds;
|
base::__sz() += __ds;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1902,8 +1951,8 @@ list<_Tp, _Alloc>::splice(const_iterator __p, list& __c)
|
|||||||
#endif
|
#endif
|
||||||
if (!__c.empty())
|
if (!__c.empty())
|
||||||
{
|
{
|
||||||
__node_pointer __f = __c.__end_.__next_;
|
__link_pointer __f = __c.__end_.__next_;
|
||||||
__node_pointer __l = __c.__end_.__prev_;
|
__link_pointer __l = __c.__end_.__prev_;
|
||||||
base::__unlink_nodes(__f, __l);
|
base::__unlink_nodes(__f, __l);
|
||||||
__link_nodes(__p.__ptr_, __f, __l);
|
__link_nodes(__p.__ptr_, __f, __l);
|
||||||
base::__sz() += __c.__sz();
|
base::__sz() += __c.__sz();
|
||||||
@@ -1916,8 +1965,7 @@ list<_Tp, _Alloc>::splice(const_iterator __p, list& __c)
|
|||||||
{
|
{
|
||||||
--__p;
|
--__p;
|
||||||
iterator* __i = static_cast<iterator*>((*__p)->__i_);
|
iterator* __i = static_cast<iterator*>((*__p)->__i_);
|
||||||
if (__i->__ptr_ != static_cast<__node_pointer>(
|
if (__i->__ptr_ != __c.__end_as_link())
|
||||||
pointer_traits<__node_base_pointer>::pointer_to(__c.__end_)))
|
|
||||||
{
|
{
|
||||||
__cn1->__add(*__p);
|
__cn1->__add(*__p);
|
||||||
(*__p)->__c_ = __cn1;
|
(*__p)->__c_ = __cn1;
|
||||||
@@ -1947,7 +1995,7 @@ list<_Tp, _Alloc>::splice(const_iterator __p, list& __c, const_iterator __i)
|
|||||||
#endif
|
#endif
|
||||||
if (__p.__ptr_ != __i.__ptr_ && __p.__ptr_ != __i.__ptr_->__next_)
|
if (__p.__ptr_ != __i.__ptr_ && __p.__ptr_ != __i.__ptr_->__next_)
|
||||||
{
|
{
|
||||||
__node_pointer __f = __i.__ptr_;
|
__link_pointer __f = __i.__ptr_;
|
||||||
base::__unlink_nodes(__f, __f);
|
base::__unlink_nodes(__f, __f);
|
||||||
__link_nodes(__p.__ptr_, __f, __f);
|
__link_nodes(__p.__ptr_, __f, __f);
|
||||||
--__c.__sz();
|
--__c.__sz();
|
||||||
@@ -2001,9 +2049,9 @@ list<_Tp, _Alloc>::splice(const_iterator __p, list& __c, const_iterator __f, con
|
|||||||
__c.__sz() -= __s;
|
__c.__sz() -= __s;
|
||||||
base::__sz() += __s;
|
base::__sz() += __s;
|
||||||
}
|
}
|
||||||
__node_pointer __first = __f.__ptr_;
|
__link_pointer __first = __f.__ptr_;
|
||||||
--__l;
|
--__l;
|
||||||
__node_pointer __last = __l.__ptr_;
|
__link_pointer __last = __l.__ptr_;
|
||||||
base::__unlink_nodes(__first, __last);
|
base::__unlink_nodes(__first, __last);
|
||||||
__link_nodes(__p.__ptr_, __first, __last);
|
__link_nodes(__p.__ptr_, __first, __last);
|
||||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||||
@@ -2014,7 +2062,7 @@ list<_Tp, _Alloc>::splice(const_iterator __p, list& __c, const_iterator __f, con
|
|||||||
{
|
{
|
||||||
--__p;
|
--__p;
|
||||||
iterator* __j = static_cast<iterator*>((*__p)->__i_);
|
iterator* __j = static_cast<iterator*>((*__p)->__i_);
|
||||||
for (__node_pointer __k = __f.__ptr_;
|
for (__link_pointer __k = __f.__ptr_;
|
||||||
__k != __l.__ptr_; __k = __k->__next_)
|
__k != __l.__ptr_; __k = __k->__next_)
|
||||||
{
|
{
|
||||||
if (__j->__ptr_ == __k)
|
if (__j->__ptr_ == __k)
|
||||||
@@ -2075,7 +2123,7 @@ list<_Tp, _Alloc>::remove_if(_Pred __pred)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class _Alloc>
|
template <class _Tp, class _Alloc>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
list<_Tp, _Alloc>::unique()
|
list<_Tp, _Alloc>::unique()
|
||||||
{
|
{
|
||||||
@@ -2098,7 +2146,7 @@ list<_Tp, _Alloc>::unique(_BinaryPred __binary_pred)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class _Alloc>
|
template <class _Tp, class _Alloc>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
list<_Tp, _Alloc>::merge(list& __c)
|
list<_Tp, _Alloc>::merge(list& __c)
|
||||||
{
|
{
|
||||||
@@ -2126,8 +2174,8 @@ list<_Tp, _Alloc>::merge(list& __c, _Comp __comp)
|
|||||||
;
|
;
|
||||||
base::__sz() += __ds;
|
base::__sz() += __ds;
|
||||||
__c.__sz() -= __ds;
|
__c.__sz() -= __ds;
|
||||||
__node_pointer __f = __f2.__ptr_;
|
__link_pointer __f = __f2.__ptr_;
|
||||||
__node_pointer __l = __m2.__ptr_->__prev_;
|
__link_pointer __l = __m2.__ptr_->__prev_;
|
||||||
__f2 = __m2;
|
__f2 = __m2;
|
||||||
base::__unlink_nodes(__f, __l);
|
base::__unlink_nodes(__f, __l);
|
||||||
__m2 = _VSTD::next(__f1);
|
__m2 = _VSTD::next(__f1);
|
||||||
@@ -2146,8 +2194,7 @@ list<_Tp, _Alloc>::merge(list& __c, _Comp __comp)
|
|||||||
{
|
{
|
||||||
--__p;
|
--__p;
|
||||||
iterator* __i = static_cast<iterator*>((*__p)->__i_);
|
iterator* __i = static_cast<iterator*>((*__p)->__i_);
|
||||||
if (__i->__ptr_ != static_cast<__node_pointer>(
|
if (__i->__ptr_ != __c.__end_as_link())
|
||||||
pointer_traits<__node_base_pointer>::pointer_to(__c.__end_)))
|
|
||||||
{
|
{
|
||||||
__cn1->__add(*__p);
|
__cn1->__add(*__p);
|
||||||
(*__p)->__c_ = __cn1;
|
(*__p)->__c_ = __cn1;
|
||||||
@@ -2161,7 +2208,7 @@ list<_Tp, _Alloc>::merge(list& __c, _Comp __comp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class _Alloc>
|
template <class _Tp, class _Alloc>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
list<_Tp, _Alloc>::sort()
|
list<_Tp, _Alloc>::sort()
|
||||||
{
|
{
|
||||||
@@ -2170,7 +2217,7 @@ list<_Tp, _Alloc>::sort()
|
|||||||
|
|
||||||
template <class _Tp, class _Alloc>
|
template <class _Tp, class _Alloc>
|
||||||
template <class _Comp>
|
template <class _Comp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
list<_Tp, _Alloc>::sort(_Comp __comp)
|
list<_Tp, _Alloc>::sort(_Comp __comp)
|
||||||
{
|
{
|
||||||
@@ -2190,7 +2237,7 @@ list<_Tp, _Alloc>::__sort(iterator __f1, iterator __e2, size_type __n, _Comp& __
|
|||||||
case 2:
|
case 2:
|
||||||
if (__comp(*--__e2, *__f1))
|
if (__comp(*--__e2, *__f1))
|
||||||
{
|
{
|
||||||
__node_pointer __f = __e2.__ptr_;
|
__link_pointer __f = __e2.__ptr_;
|
||||||
base::__unlink_nodes(__f, __f);
|
base::__unlink_nodes(__f, __f);
|
||||||
__link_nodes(__f1.__ptr_, __f, __f);
|
__link_nodes(__f1.__ptr_, __f, __f);
|
||||||
return __e2;
|
return __e2;
|
||||||
@@ -2206,8 +2253,8 @@ list<_Tp, _Alloc>::__sort(iterator __f1, iterator __e2, size_type __n, _Comp& __
|
|||||||
iterator __m2 = _VSTD::next(__f2);
|
iterator __m2 = _VSTD::next(__f2);
|
||||||
for (; __m2 != __e2 && __comp(*__m2, *__f1); ++__m2)
|
for (; __m2 != __e2 && __comp(*__m2, *__f1); ++__m2)
|
||||||
;
|
;
|
||||||
__node_pointer __f = __f2.__ptr_;
|
__link_pointer __f = __f2.__ptr_;
|
||||||
__node_pointer __l = __m2.__ptr_->__prev_;
|
__link_pointer __l = __m2.__ptr_->__prev_;
|
||||||
__r = __f2;
|
__r = __f2;
|
||||||
__e1 = __f2 = __m2;
|
__e1 = __f2 = __m2;
|
||||||
base::__unlink_nodes(__f, __l);
|
base::__unlink_nodes(__f, __l);
|
||||||
@@ -2224,8 +2271,8 @@ list<_Tp, _Alloc>::__sort(iterator __f1, iterator __e2, size_type __n, _Comp& __
|
|||||||
iterator __m2 = _VSTD::next(__f2);
|
iterator __m2 = _VSTD::next(__f2);
|
||||||
for (; __m2 != __e2 && __comp(*__m2, *__f1); ++__m2)
|
for (; __m2 != __e2 && __comp(*__m2, *__f1); ++__m2)
|
||||||
;
|
;
|
||||||
__node_pointer __f = __f2.__ptr_;
|
__link_pointer __f = __f2.__ptr_;
|
||||||
__node_pointer __l = __m2.__ptr_->__prev_;
|
__link_pointer __l = __m2.__ptr_->__prev_;
|
||||||
if (__e1 == __f2)
|
if (__e1 == __f2)
|
||||||
__e1 = __m2;
|
__e1 = __m2;
|
||||||
__f2 = __m2;
|
__f2 = __m2;
|
||||||
@@ -2269,8 +2316,7 @@ template <class _Tp, class _Alloc>
|
|||||||
bool
|
bool
|
||||||
list<_Tp, _Alloc>::__dereferenceable(const const_iterator* __i) const
|
list<_Tp, _Alloc>::__dereferenceable(const const_iterator* __i) const
|
||||||
{
|
{
|
||||||
return __i->__ptr_ != static_cast<__node_pointer>(
|
return __i->__ptr_ != this->__end_as_link();
|
||||||
pointer_traits<__node_base_pointer>::pointer_to(const_cast<__node_base&>(this->__end_)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class _Alloc>
|
template <class _Tp, class _Alloc>
|
||||||
|
|||||||
308
include/locale
308
include/locale
@@ -213,6 +213,12 @@ template <class charT> class messages_byname;
|
|||||||
#pragma GCC system_header
|
#pragma GCC system_header
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
|
||||||
|
#include <__bsd_locale_defaults.h>
|
||||||
|
#else
|
||||||
|
#include <__bsd_locale_fallbacks.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||||
|
|
||||||
#if defined(__APPLE__) || defined(__FreeBSD__)
|
#if defined(__APPLE__) || defined(__FreeBSD__)
|
||||||
@@ -228,189 +234,6 @@ _LIBCPP_BEGIN_NAMESPACE_STD
|
|||||||
|
|
||||||
typedef _VSTD::remove_pointer<locale_t>::type __locale_struct;
|
typedef _VSTD::remove_pointer<locale_t>::type __locale_struct;
|
||||||
typedef _VSTD::unique_ptr<__locale_struct, decltype(&freelocale)> __locale_unique_ptr;
|
typedef _VSTD::unique_ptr<__locale_struct, decltype(&freelocale)> __locale_unique_ptr;
|
||||||
#ifndef _LIBCPP_LOCALE__L_EXTENSIONS
|
|
||||||
typedef _VSTD::unique_ptr<__locale_struct, decltype(&uselocale)> __locale_raii;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// OSX has nice foo_l() functions that let you turn off use of the global
|
|
||||||
// locale. Linux, not so much. The following functions avoid the locale when
|
|
||||||
// that's possible and otherwise do the wrong thing. FIXME.
|
|
||||||
#if defined(__linux__) || defined(__EMSCRIPTEN__) || defined(_AIX) || \
|
|
||||||
defined(_NEWLIB_VERSION) || defined(__GLIBC__)
|
|
||||||
|
|
||||||
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
|
|
||||||
decltype(MB_CUR_MAX_L(_VSTD::declval<locale_t>()))
|
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
|
||||||
__mb_cur_max_l(locale_t __l)
|
|
||||||
{
|
|
||||||
return MB_CUR_MAX_L(__l);
|
|
||||||
}
|
|
||||||
#else // _LIBCPP_LOCALE__L_EXTENSIONS
|
|
||||||
inline _LIBCPP_ALWAYS_INLINE
|
|
||||||
decltype(MB_CUR_MAX) __mb_cur_max_l(locale_t __l)
|
|
||||||
{
|
|
||||||
__locale_raii __current(uselocale(__l), uselocale);
|
|
||||||
return MB_CUR_MAX;
|
|
||||||
}
|
|
||||||
#endif // _LIBCPP_LOCALE__L_EXTENSIONS
|
|
||||||
|
|
||||||
inline _LIBCPP_ALWAYS_INLINE
|
|
||||||
wint_t __btowc_l(int __c, locale_t __l)
|
|
||||||
{
|
|
||||||
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
|
|
||||||
return btowc_l(__c, __l);
|
|
||||||
#else
|
|
||||||
__locale_raii __current(uselocale(__l), uselocale);
|
|
||||||
return btowc(__c);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
inline _LIBCPP_ALWAYS_INLINE
|
|
||||||
int __wctob_l(wint_t __c, locale_t __l)
|
|
||||||
{
|
|
||||||
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
|
|
||||||
return wctob_l(__c, __l);
|
|
||||||
#else
|
|
||||||
__locale_raii __current(uselocale(__l), uselocale);
|
|
||||||
return wctob(__c);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
inline _LIBCPP_ALWAYS_INLINE
|
|
||||||
size_t __wcsnrtombs_l(char *__dest, const wchar_t **__src, size_t __nwc,
|
|
||||||
size_t __len, mbstate_t *__ps, locale_t __l)
|
|
||||||
{
|
|
||||||
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
|
|
||||||
return wcsnrtombs_l(__dest, __src, __nwc, __len, __ps, __l);
|
|
||||||
#else
|
|
||||||
__locale_raii __current(uselocale(__l), uselocale);
|
|
||||||
return wcsnrtombs(__dest, __src, __nwc, __len, __ps);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
inline _LIBCPP_ALWAYS_INLINE
|
|
||||||
size_t __wcrtomb_l(char *__s, wchar_t __wc, mbstate_t *__ps, locale_t __l)
|
|
||||||
{
|
|
||||||
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
|
|
||||||
return wcrtomb_l(__s, __wc, __ps, __l);
|
|
||||||
#else
|
|
||||||
__locale_raii __current(uselocale(__l), uselocale);
|
|
||||||
return wcrtomb(__s, __wc, __ps);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
inline _LIBCPP_ALWAYS_INLINE
|
|
||||||
size_t __mbsnrtowcs_l(wchar_t * __dest, const char **__src, size_t __nms,
|
|
||||||
size_t __len, mbstate_t *__ps, locale_t __l)
|
|
||||||
{
|
|
||||||
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
|
|
||||||
return mbsnrtowcs_l(__dest, __src, __nms, __len, __ps, __l);
|
|
||||||
#else
|
|
||||||
__locale_raii __current(uselocale(__l), uselocale);
|
|
||||||
return mbsnrtowcs(__dest, __src, __nms, __len, __ps);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
inline _LIBCPP_ALWAYS_INLINE
|
|
||||||
size_t __mbrtowc_l(wchar_t *__pwc, const char *__s, size_t __n,
|
|
||||||
mbstate_t *__ps, locale_t __l)
|
|
||||||
{
|
|
||||||
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
|
|
||||||
return mbrtowc_l(__pwc, __s, __n, __ps, __l);
|
|
||||||
#else
|
|
||||||
__locale_raii __current(uselocale(__l), uselocale);
|
|
||||||
return mbrtowc(__pwc, __s, __n, __ps);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
inline _LIBCPP_ALWAYS_INLINE
|
|
||||||
int __mbtowc_l(wchar_t *__pwc, const char *__pmb, size_t __max, locale_t __l)
|
|
||||||
{
|
|
||||||
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
|
|
||||||
return mbtowc_l(__pwc, __pmb, __max, __l);
|
|
||||||
#else
|
|
||||||
__locale_raii __current(uselocale(__l), uselocale);
|
|
||||||
return mbtowc(__pwc, __pmb, __max);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
inline _LIBCPP_ALWAYS_INLINE
|
|
||||||
size_t __mbrlen_l(const char *__s, size_t __n, mbstate_t *__ps, locale_t __l)
|
|
||||||
{
|
|
||||||
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
|
|
||||||
return mbrlen_l(__s, __n, __ps, __l);
|
|
||||||
#else
|
|
||||||
__locale_raii __current(uselocale(__l), uselocale);
|
|
||||||
return mbrlen(__s, __n, __ps);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
inline _LIBCPP_ALWAYS_INLINE
|
|
||||||
lconv *__localeconv_l(locale_t __l)
|
|
||||||
{
|
|
||||||
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
|
|
||||||
return localeconv_l(__l);
|
|
||||||
#else
|
|
||||||
__locale_raii __current(uselocale(__l), uselocale);
|
|
||||||
return localeconv();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
inline _LIBCPP_ALWAYS_INLINE
|
|
||||||
size_t __mbsrtowcs_l(wchar_t *__dest, const char **__src, size_t __len,
|
|
||||||
mbstate_t *__ps, locale_t __l)
|
|
||||||
{
|
|
||||||
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
|
|
||||||
return mbsrtowcs_l(__dest, __src, __len, __ps, __l);
|
|
||||||
#else
|
|
||||||
__locale_raii __current(uselocale(__l), uselocale);
|
|
||||||
return mbsrtowcs(__dest, __src, __len, __ps);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
inline
|
|
||||||
int __snprintf_l(char *__s, size_t __n, locale_t __l, const char *__format, ...) {
|
|
||||||
va_list __va;
|
|
||||||
va_start(__va, __format);
|
|
||||||
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
|
|
||||||
int __res = vsnprintf_l(__s, __n, __l, __format, __va);
|
|
||||||
#else
|
|
||||||
__locale_raii __current(uselocale(__l), uselocale);
|
|
||||||
int __res = vsnprintf(__s, __n, __format, __va);
|
|
||||||
#endif
|
|
||||||
va_end(__va);
|
|
||||||
return __res;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline
|
|
||||||
int __asprintf_l(char **__s, locale_t __l, const char *__format, ...) {
|
|
||||||
va_list __va;
|
|
||||||
va_start(__va, __format);
|
|
||||||
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
|
|
||||||
int __res = vasprintf_l(__s, __l, __format, __va);
|
|
||||||
#else
|
|
||||||
__locale_raii __current(uselocale(__l), uselocale);
|
|
||||||
int __res = vasprintf(__s, __format, __va);
|
|
||||||
#endif
|
|
||||||
va_end(__va);
|
|
||||||
return __res;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline
|
|
||||||
int __sscanf_l(const char *__s, locale_t __l, const char *__format, ...) {
|
|
||||||
va_list __va;
|
|
||||||
va_start(__va, __format);
|
|
||||||
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
|
|
||||||
int __res = vsscanf_l(__s, __l, __format, __va);
|
|
||||||
#else
|
|
||||||
__locale_raii __current(uselocale(__l), uselocale);
|
|
||||||
int __res = vsscanf(__s, __format, __va);
|
|
||||||
#endif
|
|
||||||
va_end(__va);
|
|
||||||
return __res;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // __linux__
|
|
||||||
|
|
||||||
// __scan_keyword
|
// __scan_keyword
|
||||||
// Scans [__b, __e) until a match is found in the basic_strings range
|
// Scans [__b, __e) until a match is found in the basic_strings range
|
||||||
@@ -1188,11 +1011,7 @@ num_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e,
|
|||||||
}
|
}
|
||||||
// Stage 3
|
// Stage 3
|
||||||
__buf.resize(__a_end - __a);
|
__buf.resize(__a_end - __a);
|
||||||
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
|
if (__libcpp_sscanf_l(__buf.c_str(), _LIBCPP_GET_C_LOCALE, "%p", &__v) != 1)
|
||||||
if (sscanf_l(__buf.c_str(), _LIBCPP_GET_C_LOCALE, "%p", &__v) != 1)
|
|
||||||
#else
|
|
||||||
if (__sscanf_l(__buf.c_str(), _LIBCPP_GET_C_LOCALE, "%p", &__v) != 1)
|
|
||||||
#endif
|
|
||||||
__err = ios_base::failbit;
|
__err = ios_base::failbit;
|
||||||
// EOF checked
|
// EOF checked
|
||||||
if (__b == __e)
|
if (__b == __e)
|
||||||
@@ -1556,13 +1375,9 @@ num_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob,
|
|||||||
this->__format_int(__fmt+1, __len, true, __iob.flags());
|
this->__format_int(__fmt+1, __len, true, __iob.flags());
|
||||||
const unsigned __nbuf = (numeric_limits<long>::digits / 3)
|
const unsigned __nbuf = (numeric_limits<long>::digits / 3)
|
||||||
+ ((numeric_limits<long>::digits % 3) != 0)
|
+ ((numeric_limits<long>::digits % 3) != 0)
|
||||||
+ 1;
|
+ 2;
|
||||||
char __nar[__nbuf];
|
char __nar[__nbuf];
|
||||||
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
|
int __nc = __libcpp_snprintf_l(__nar, sizeof(__nar), _LIBCPP_GET_C_LOCALE, __fmt, __v);
|
||||||
int __nc = snprintf_l(__nar, sizeof(__nar), _LIBCPP_GET_C_LOCALE, __fmt, __v);
|
|
||||||
#else
|
|
||||||
int __nc = __snprintf_l(__nar, sizeof(__nar), _LIBCPP_GET_C_LOCALE, __fmt, __v);
|
|
||||||
#endif
|
|
||||||
char* __ne = __nar + __nc;
|
char* __ne = __nar + __nc;
|
||||||
char* __np = this->__identify_padding(__nar, __ne, __iob);
|
char* __np = this->__identify_padding(__nar, __ne, __iob);
|
||||||
// Stage 2 - Widen __nar while adding thousands separators
|
// Stage 2 - Widen __nar while adding thousands separators
|
||||||
@@ -1588,11 +1403,7 @@ num_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob,
|
|||||||
+ ((numeric_limits<long long>::digits % 3) != 0)
|
+ ((numeric_limits<long long>::digits % 3) != 0)
|
||||||
+ 2;
|
+ 2;
|
||||||
char __nar[__nbuf];
|
char __nar[__nbuf];
|
||||||
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
|
int __nc = __libcpp_snprintf_l(__nar, sizeof(__nar), _LIBCPP_GET_C_LOCALE, __fmt, __v);
|
||||||
int __nc = snprintf_l(__nar, sizeof(__nar), _LIBCPP_GET_C_LOCALE, __fmt, __v);
|
|
||||||
#else
|
|
||||||
int __nc = __snprintf_l(__nar, sizeof(__nar), _LIBCPP_GET_C_LOCALE, __fmt, __v);
|
|
||||||
#endif
|
|
||||||
char* __ne = __nar + __nc;
|
char* __ne = __nar + __nc;
|
||||||
char* __np = this->__identify_padding(__nar, __ne, __iob);
|
char* __np = this->__identify_padding(__nar, __ne, __iob);
|
||||||
// Stage 2 - Widen __nar while adding thousands separators
|
// Stage 2 - Widen __nar while adding thousands separators
|
||||||
@@ -1618,11 +1429,7 @@ num_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob,
|
|||||||
+ ((numeric_limits<unsigned long>::digits % 3) != 0)
|
+ ((numeric_limits<unsigned long>::digits % 3) != 0)
|
||||||
+ 1;
|
+ 1;
|
||||||
char __nar[__nbuf];
|
char __nar[__nbuf];
|
||||||
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
|
int __nc = __libcpp_snprintf_l(__nar, sizeof(__nar), _LIBCPP_GET_C_LOCALE, __fmt, __v);
|
||||||
int __nc = snprintf_l(__nar, sizeof(__nar), _LIBCPP_GET_C_LOCALE, __fmt, __v);
|
|
||||||
#else
|
|
||||||
int __nc = __snprintf_l(__nar, sizeof(__nar), _LIBCPP_GET_C_LOCALE, __fmt, __v);
|
|
||||||
#endif
|
|
||||||
char* __ne = __nar + __nc;
|
char* __ne = __nar + __nc;
|
||||||
char* __np = this->__identify_padding(__nar, __ne, __iob);
|
char* __np = this->__identify_padding(__nar, __ne, __iob);
|
||||||
// Stage 2 - Widen __nar while adding thousands separators
|
// Stage 2 - Widen __nar while adding thousands separators
|
||||||
@@ -1648,11 +1455,7 @@ num_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob,
|
|||||||
+ ((numeric_limits<unsigned long long>::digits % 3) != 0)
|
+ ((numeric_limits<unsigned long long>::digits % 3) != 0)
|
||||||
+ 1;
|
+ 1;
|
||||||
char __nar[__nbuf];
|
char __nar[__nbuf];
|
||||||
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
|
int __nc = __libcpp_snprintf_l(__nar, sizeof(__nar), _LIBCPP_GET_C_LOCALE, __fmt, __v);
|
||||||
int __nc = snprintf_l(__nar, sizeof(__nar), _LIBCPP_GET_C_LOCALE, __fmt, __v);
|
|
||||||
#else
|
|
||||||
int __nc = __snprintf_l(__nar, sizeof(__nar), _LIBCPP_GET_C_LOCALE, __fmt, __v);
|
|
||||||
#endif
|
|
||||||
char* __ne = __nar + __nc;
|
char* __ne = __nar + __nc;
|
||||||
char* __np = this->__identify_padding(__nar, __ne, __iob);
|
char* __np = this->__identify_padding(__nar, __ne, __iob);
|
||||||
// Stage 2 - Widen __nar while adding thousands separators
|
// Stage 2 - Widen __nar while adding thousands separators
|
||||||
@@ -1679,34 +1482,17 @@ num_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob,
|
|||||||
char* __nb = __nar;
|
char* __nb = __nar;
|
||||||
int __nc;
|
int __nc;
|
||||||
if (__specify_precision)
|
if (__specify_precision)
|
||||||
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
|
__nc = __libcpp_snprintf_l(__nb, __nbuf, _LIBCPP_GET_C_LOCALE, __fmt,
|
||||||
__nc = snprintf_l(__nb, __nbuf, _LIBCPP_GET_C_LOCALE, __fmt,
|
|
||||||
(int)__iob.precision(), __v);
|
(int)__iob.precision(), __v);
|
||||||
#else
|
|
||||||
__nc = __snprintf_l(__nb, __nbuf, _LIBCPP_GET_C_LOCALE, __fmt,
|
|
||||||
(int)__iob.precision(), __v);
|
|
||||||
#endif
|
|
||||||
else
|
else
|
||||||
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
|
__nc = __libcpp_snprintf_l(__nb, __nbuf, _LIBCPP_GET_C_LOCALE, __fmt, __v);
|
||||||
__nc = snprintf_l(__nb, __nbuf, _LIBCPP_GET_C_LOCALE, __fmt, __v);
|
|
||||||
#else
|
|
||||||
__nc = __snprintf_l(__nb, __nbuf, _LIBCPP_GET_C_LOCALE, __fmt, __v);
|
|
||||||
#endif
|
|
||||||
unique_ptr<char, void(*)(void*)> __nbh(0, free);
|
unique_ptr<char, void(*)(void*)> __nbh(0, free);
|
||||||
if (__nc > static_cast<int>(__nbuf-1))
|
if (__nc > static_cast<int>(__nbuf-1))
|
||||||
{
|
{
|
||||||
if (__specify_precision)
|
if (__specify_precision)
|
||||||
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
|
__nc = __libcpp_asprintf_l(&__nb, _LIBCPP_GET_C_LOCALE, __fmt, (int)__iob.precision(), __v);
|
||||||
__nc = asprintf_l(&__nb, _LIBCPP_GET_C_LOCALE, __fmt, (int)__iob.precision(), __v);
|
|
||||||
#else
|
|
||||||
__nc = __asprintf_l(&__nb, _LIBCPP_GET_C_LOCALE, __fmt, (int)__iob.precision(), __v);
|
|
||||||
#endif
|
|
||||||
else
|
else
|
||||||
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
|
__nc = __libcpp_asprintf_l(&__nb, _LIBCPP_GET_C_LOCALE, __fmt, __v);
|
||||||
__nc = asprintf_l(&__nb, _LIBCPP_GET_C_LOCALE, __fmt, __v);
|
|
||||||
#else
|
|
||||||
__nc = __asprintf_l(&__nb, _LIBCPP_GET_C_LOCALE, __fmt, (int)__iob.precision(), __v);
|
|
||||||
#endif
|
|
||||||
if (__nb == 0)
|
if (__nb == 0)
|
||||||
__throw_bad_alloc();
|
__throw_bad_alloc();
|
||||||
__nbh.reset(__nb);
|
__nbh.reset(__nb);
|
||||||
@@ -1747,34 +1533,17 @@ num_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob,
|
|||||||
char* __nb = __nar;
|
char* __nb = __nar;
|
||||||
int __nc;
|
int __nc;
|
||||||
if (__specify_precision)
|
if (__specify_precision)
|
||||||
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
|
__nc = __libcpp_snprintf_l(__nb, __nbuf, _LIBCPP_GET_C_LOCALE, __fmt,
|
||||||
__nc = snprintf_l(__nb, __nbuf, _LIBCPP_GET_C_LOCALE, __fmt,
|
|
||||||
(int)__iob.precision(), __v);
|
(int)__iob.precision(), __v);
|
||||||
#else
|
|
||||||
__nc = __snprintf_l(__nb, __nbuf, _LIBCPP_GET_C_LOCALE, __fmt,
|
|
||||||
(int)__iob.precision(), __v);
|
|
||||||
#endif
|
|
||||||
else
|
else
|
||||||
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
|
__nc = __libcpp_snprintf_l(__nb, __nbuf, _LIBCPP_GET_C_LOCALE, __fmt, __v);
|
||||||
__nc = snprintf_l(__nb, __nbuf, _LIBCPP_GET_C_LOCALE, __fmt, __v);
|
|
||||||
#else
|
|
||||||
__nc = __snprintf_l(__nb, __nbuf, _LIBCPP_GET_C_LOCALE, __fmt, __v);
|
|
||||||
#endif
|
|
||||||
unique_ptr<char, void(*)(void*)> __nbh(0, free);
|
unique_ptr<char, void(*)(void*)> __nbh(0, free);
|
||||||
if (__nc > static_cast<int>(__nbuf-1))
|
if (__nc > static_cast<int>(__nbuf-1))
|
||||||
{
|
{
|
||||||
if (__specify_precision)
|
if (__specify_precision)
|
||||||
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
|
__nc = __libcpp_asprintf_l(&__nb, _LIBCPP_GET_C_LOCALE, __fmt, (int)__iob.precision(), __v);
|
||||||
__nc = asprintf_l(&__nb, _LIBCPP_GET_C_LOCALE, __fmt, (int)__iob.precision(), __v);
|
|
||||||
#else
|
|
||||||
__nc = __asprintf_l(&__nb, _LIBCPP_GET_C_LOCALE, __fmt, (int)__iob.precision(), __v);
|
|
||||||
#endif
|
|
||||||
else
|
else
|
||||||
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
|
__nc = __libcpp_asprintf_l(&__nb, _LIBCPP_GET_C_LOCALE, __fmt, __v);
|
||||||
__nc = asprintf_l(&__nb, _LIBCPP_GET_C_LOCALE, __fmt, __v);
|
|
||||||
#else
|
|
||||||
__nc = __asprintf_l(&__nb, _LIBCPP_GET_C_LOCALE, __fmt, __v);
|
|
||||||
#endif
|
|
||||||
if (__nb == 0)
|
if (__nb == 0)
|
||||||
__throw_bad_alloc();
|
__throw_bad_alloc();
|
||||||
__nbh.reset(__nb);
|
__nbh.reset(__nb);
|
||||||
@@ -1810,11 +1579,7 @@ num_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob,
|
|||||||
char __fmt[6] = "%p";
|
char __fmt[6] = "%p";
|
||||||
const unsigned __nbuf = 20;
|
const unsigned __nbuf = 20;
|
||||||
char __nar[__nbuf];
|
char __nar[__nbuf];
|
||||||
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
|
int __nc = __libcpp_snprintf_l(__nar, sizeof(__nar), _LIBCPP_GET_C_LOCALE, __fmt, __v);
|
||||||
int __nc = snprintf_l(__nar, sizeof(__nar), _LIBCPP_GET_C_LOCALE, __fmt, __v);
|
|
||||||
#else
|
|
||||||
int __nc = __snprintf_l(__nar, sizeof(__nar), _LIBCPP_GET_C_LOCALE, __fmt, __v);
|
|
||||||
#endif
|
|
||||||
char* __ne = __nar + __nc;
|
char* __ne = __nar + __nc;
|
||||||
char* __np = this->__identify_padding(__nar, __ne, __iob);
|
char* __np = this->__identify_padding(__nar, __ne, __iob);
|
||||||
// Stage 2 - Widen __nar
|
// Stage 2 - Widen __nar
|
||||||
@@ -1888,6 +1653,9 @@ protected:
|
|||||||
virtual const string_type& __r() const;
|
virtual const string_type& __r() const;
|
||||||
virtual const string_type& __x() const;
|
virtual const string_type& __x() const;
|
||||||
virtual const string_type& __X() const;
|
virtual const string_type& __X() const;
|
||||||
|
|
||||||
|
_LIBCPP_ALWAYS_INLINE
|
||||||
|
~__time_get_c_storage() {}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class _CharT, class _InputIterator = istreambuf_iterator<_CharT> >
|
template <class _CharT, class _InputIterator = istreambuf_iterator<_CharT> >
|
||||||
@@ -3523,11 +3291,7 @@ money_put<_CharT, _OutputIterator>::do_put(iter_type __s, bool __intl,
|
|||||||
// secure memory for digit storage
|
// secure memory for digit storage
|
||||||
if (__n > __bs-1)
|
if (__n > __bs-1)
|
||||||
{
|
{
|
||||||
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
|
__n = static_cast<size_t>(__libcpp_asprintf_l(&__bb, _LIBCPP_GET_C_LOCALE, "%.0Lf", __units));
|
||||||
__n = static_cast<size_t>(asprintf_l(&__bb, _LIBCPP_GET_C_LOCALE, "%.0Lf", __units));
|
|
||||||
#else
|
|
||||||
__n = __asprintf_l(&__bb, _LIBCPP_GET_C_LOCALE, "%.0Lf", __units);
|
|
||||||
#endif
|
|
||||||
if (__bb == 0)
|
if (__bb == 0)
|
||||||
__throw_bad_alloc();
|
__throw_bad_alloc();
|
||||||
__hn.reset(__bb);
|
__hn.reset(__bb);
|
||||||
@@ -3773,11 +3537,14 @@ private:
|
|||||||
wstring_convert(const wstring_convert& __wc);
|
wstring_convert(const wstring_convert& __wc);
|
||||||
wstring_convert& operator=(const wstring_convert& __wc);
|
wstring_convert& operator=(const wstring_convert& __wc);
|
||||||
public:
|
public:
|
||||||
|
_LIBCPP_ALWAYS_INLINE
|
||||||
_LIBCPP_EXPLICIT_AFTER_CXX11 wstring_convert(_Codecvt* __pcvt = new _Codecvt);
|
_LIBCPP_EXPLICIT_AFTER_CXX11 wstring_convert(_Codecvt* __pcvt = new _Codecvt);
|
||||||
|
_LIBCPP_ALWAYS_INLINE
|
||||||
wstring_convert(_Codecvt* __pcvt, state_type __state);
|
wstring_convert(_Codecvt* __pcvt, state_type __state);
|
||||||
_LIBCPP_EXPLICIT_AFTER_CXX11 wstring_convert(const byte_string& __byte_err,
|
_LIBCPP_EXPLICIT_AFTER_CXX11 wstring_convert(const byte_string& __byte_err,
|
||||||
const wide_string& __wide_err = wide_string());
|
const wide_string& __wide_err = wide_string());
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
_LIBCPP_ALWAYS_INLINE
|
||||||
wstring_convert(wstring_convert&& __wc);
|
wstring_convert(wstring_convert&& __wc);
|
||||||
#endif
|
#endif
|
||||||
~wstring_convert();
|
~wstring_convert();
|
||||||
@@ -3811,7 +3578,7 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
template<class _Codecvt, class _Elem, class _Wide_alloc, class _Byte_alloc>
|
template<class _Codecvt, class _Elem, class _Wide_alloc, class _Byte_alloc>
|
||||||
inline _LIBCPP_ALWAYS_INLINE
|
inline
|
||||||
wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>::
|
wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>::
|
||||||
wstring_convert(_Codecvt* __pcvt)
|
wstring_convert(_Codecvt* __pcvt)
|
||||||
: __cvtptr_(__pcvt), __cvtstate_(), __cvtcount_(0)
|
: __cvtptr_(__pcvt), __cvtstate_(), __cvtcount_(0)
|
||||||
@@ -3819,7 +3586,7 @@ wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>::
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<class _Codecvt, class _Elem, class _Wide_alloc, class _Byte_alloc>
|
template<class _Codecvt, class _Elem, class _Wide_alloc, class _Byte_alloc>
|
||||||
inline _LIBCPP_ALWAYS_INLINE
|
inline
|
||||||
wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>::
|
wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>::
|
||||||
wstring_convert(_Codecvt* __pcvt, state_type __state)
|
wstring_convert(_Codecvt* __pcvt, state_type __state)
|
||||||
: __cvtptr_(__pcvt), __cvtstate_(__state), __cvtcount_(0)
|
: __cvtptr_(__pcvt), __cvtstate_(__state), __cvtcount_(0)
|
||||||
@@ -3838,7 +3605,7 @@ wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>::
|
|||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
|
||||||
template<class _Codecvt, class _Elem, class _Wide_alloc, class _Byte_alloc>
|
template<class _Codecvt, class _Elem, class _Wide_alloc, class _Byte_alloc>
|
||||||
inline _LIBCPP_ALWAYS_INLINE
|
inline
|
||||||
wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>::
|
wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>::
|
||||||
wstring_convert(wstring_convert&& __wc)
|
wstring_convert(wstring_convert&& __wc)
|
||||||
: __byte_err_string_(_VSTD::move(__wc.__byte_err_string_)),
|
: __byte_err_string_(_VSTD::move(__wc.__byte_err_string_)),
|
||||||
@@ -4313,18 +4080,9 @@ wbuffer_convert<_Codecvt, _Elem, _Tr>::seekoff(off_type __off, ios_base::seekdir
|
|||||||
int __width = __cv_->encoding();
|
int __width = __cv_->encoding();
|
||||||
if (__cv_ == 0 || __bufptr_ == 0 || (__width <= 0 && __off != 0) || sync())
|
if (__cv_ == 0 || __bufptr_ == 0 || (__width <= 0 && __off != 0) || sync())
|
||||||
return pos_type(off_type(-1));
|
return pos_type(off_type(-1));
|
||||||
// __width > 0 || __off == 0
|
// __width > 0 || __off == 0, now check __way
|
||||||
switch (__way)
|
if (__way != ios_base::beg && __way != ios_base::cur && __way != ios_base::end)
|
||||||
{
|
|
||||||
case ios_base::beg:
|
|
||||||
break;
|
|
||||||
case ios_base::cur:
|
|
||||||
break;
|
|
||||||
case ios_base::end:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return pos_type(off_type(-1));
|
return pos_type(off_type(-1));
|
||||||
}
|
|
||||||
pos_type __r = __bufptr_->pubseekoff(__width * __off, __way, __om);
|
pos_type __r = __bufptr_->pubseekoff(__width * __off, __way, __om);
|
||||||
__r.state(__st_);
|
__r.state(__st_);
|
||||||
return __r;
|
return __r;
|
||||||
|
|||||||
520
include/map
520
include/map
@@ -126,9 +126,11 @@ public:
|
|||||||
template <class... Args>
|
template <class... Args>
|
||||||
iterator emplace_hint(const_iterator position, Args&&... args);
|
iterator emplace_hint(const_iterator position, Args&&... args);
|
||||||
pair<iterator, bool> insert(const value_type& v);
|
pair<iterator, bool> insert(const value_type& v);
|
||||||
|
pair<iterator, bool> insert( value_type&& v); // C++17
|
||||||
template <class P>
|
template <class P>
|
||||||
pair<iterator, bool> insert(P&& p);
|
pair<iterator, bool> insert(P&& p);
|
||||||
iterator insert(const_iterator position, const value_type& v);
|
iterator insert(const_iterator position, const value_type& v);
|
||||||
|
iterator insert(const_iterator position, value_type&& v); // C++17
|
||||||
template <class P>
|
template <class P>
|
||||||
iterator insert(const_iterator position, P&& p);
|
iterator insert(const_iterator position, P&& p);
|
||||||
template <class InputIterator>
|
template <class InputIterator>
|
||||||
@@ -160,7 +162,7 @@ public:
|
|||||||
|
|
||||||
void swap(map& m)
|
void swap(map& m)
|
||||||
noexcept(allocator_traits<allocator_type>::is_always_equal::value &&
|
noexcept(allocator_traits<allocator_type>::is_always_equal::value &&
|
||||||
__is_nothrow_swappable<key_compare>::value); // C++17
|
is_nothrow_swappable<key_compare>::value); // C++17
|
||||||
|
|
||||||
// observers:
|
// observers:
|
||||||
allocator_type get_allocator() const noexcept;
|
allocator_type get_allocator() const noexcept;
|
||||||
@@ -336,9 +338,11 @@ public:
|
|||||||
template <class... Args>
|
template <class... Args>
|
||||||
iterator emplace_hint(const_iterator position, Args&&... args);
|
iterator emplace_hint(const_iterator position, Args&&... args);
|
||||||
iterator insert(const value_type& v);
|
iterator insert(const value_type& v);
|
||||||
|
iterator insert( value_type&& v); // C++17
|
||||||
template <class P>
|
template <class P>
|
||||||
iterator insert(P&& p);
|
iterator insert(P&& p);
|
||||||
iterator insert(const_iterator position, const value_type& v);
|
iterator insert(const_iterator position, const value_type& v);
|
||||||
|
iterator insert(const_iterator position, value_type&& v); // C++17
|
||||||
template <class P>
|
template <class P>
|
||||||
iterator insert(const_iterator position, P&& p);
|
iterator insert(const_iterator position, P&& p);
|
||||||
template <class InputIterator>
|
template <class InputIterator>
|
||||||
@@ -353,7 +357,7 @@ public:
|
|||||||
|
|
||||||
void swap(multimap& m)
|
void swap(multimap& m)
|
||||||
noexcept(allocator_traits<allocator_type>::is_always_equal::value &&
|
noexcept(allocator_traits<allocator_type>::is_always_equal::value &&
|
||||||
__is_nothrow_swappable<key_compare>::value); // C++17
|
is_nothrow_swappable<key_compare>::value); // C++17
|
||||||
|
|
||||||
// observers:
|
// observers:
|
||||||
allocator_type get_allocator() const noexcept;
|
allocator_type get_allocator() const noexcept;
|
||||||
@@ -560,13 +564,11 @@ class __map_node_destructor
|
|||||||
{
|
{
|
||||||
typedef _Allocator allocator_type;
|
typedef _Allocator allocator_type;
|
||||||
typedef allocator_traits<allocator_type> __alloc_traits;
|
typedef allocator_traits<allocator_type> __alloc_traits;
|
||||||
typedef typename __alloc_traits::value_type::value_type value_type;
|
|
||||||
public:
|
public:
|
||||||
typedef typename __alloc_traits::pointer pointer;
|
typedef typename __alloc_traits::pointer pointer;
|
||||||
private:
|
|
||||||
typedef typename value_type::value_type::first_type first_type;
|
|
||||||
typedef typename value_type::value_type::second_type second_type;
|
|
||||||
|
|
||||||
|
private:
|
||||||
allocator_type& __na_;
|
allocator_type& __na_;
|
||||||
|
|
||||||
__map_node_destructor& operator=(const __map_node_destructor&);
|
__map_node_destructor& operator=(const __map_node_destructor&);
|
||||||
@@ -611,7 +613,7 @@ template <class _Key, class _Tp, class _Compare, class _Allocator>
|
|||||||
class multimap;
|
class multimap;
|
||||||
template <class _TreeIterator> class __map_const_iterator;
|
template <class _TreeIterator> class __map_const_iterator;
|
||||||
|
|
||||||
#if __cplusplus >= 201103L
|
#ifndef _LIBCPP_CXX03_LANG
|
||||||
|
|
||||||
template <class _Key, class _Tp>
|
template <class _Key, class _Tp>
|
||||||
union __value_type
|
union __value_type
|
||||||
@@ -624,33 +626,29 @@ union __value_type
|
|||||||
value_type __cc;
|
value_type __cc;
|
||||||
__nc_value_type __nc;
|
__nc_value_type __nc;
|
||||||
|
|
||||||
template <class ..._Args>
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
__value_type(_Args&& ...__args)
|
|
||||||
: __cc(std::forward<_Args>(__args)...) {}
|
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
__value_type(const __value_type& __v)
|
|
||||||
: __cc(__v.__cc) {}
|
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
__value_type(__value_type& __v)
|
|
||||||
: __cc(__v.__cc) {}
|
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
__value_type(__value_type&& __v)
|
|
||||||
: __nc(std::move(__v.__nc)) {}
|
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
__value_type& operator=(const __value_type& __v)
|
__value_type& operator=(const __value_type& __v)
|
||||||
{__nc = __v.__cc; return *this;}
|
{__nc = __v.__cc; return *this;}
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
__value_type& operator=(__value_type&& __v)
|
__value_type& operator=(__value_type&& __v)
|
||||||
{__nc = std::move(__v.__nc); return *this;}
|
{__nc = _VSTD::move(__v.__nc); return *this;}
|
||||||
|
|
||||||
|
template <class _ValueTp,
|
||||||
|
class = typename enable_if<
|
||||||
|
__is_same_uncvref<_ValueTp, value_type>::value
|
||||||
|
>::type
|
||||||
|
>
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
~__value_type() {__cc.~value_type();}
|
__value_type& operator=(_ValueTp&& __v) {
|
||||||
|
__nc = _VSTD::forward<_ValueTp>(__v); return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
__value_type() _LIBCPP_EQUAL_DELETE;
|
||||||
|
~__value_type() _LIBCPP_EQUAL_DELETE;
|
||||||
|
__value_type(const __value_type& __v) _LIBCPP_EQUAL_DELETE;
|
||||||
|
__value_type(__value_type&& __v) _LIBCPP_EQUAL_DELETE;
|
||||||
};
|
};
|
||||||
|
|
||||||
#else
|
#else
|
||||||
@@ -664,18 +662,11 @@ struct __value_type
|
|||||||
|
|
||||||
value_type __cc;
|
value_type __cc;
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
private:
|
||||||
__value_type() {}
|
__value_type();
|
||||||
|
__value_type(__value_type const&);
|
||||||
template <class _A0>
|
__value_type& operator=(__value_type const&);
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
~__value_type();
|
||||||
__value_type(const _A0& __a0)
|
|
||||||
: __cc(__a0) {}
|
|
||||||
|
|
||||||
template <class _A0, class _A1>
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
|
||||||
__value_type(const _A0& __a0, const _A1& __a1)
|
|
||||||
: __cc(__a0, __a1) {}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -693,24 +684,17 @@ struct __extract_key_value_types<__value_type<_Key, _Tp> >
|
|||||||
template <class _TreeIterator>
|
template <class _TreeIterator>
|
||||||
class _LIBCPP_TYPE_VIS_ONLY __map_iterator
|
class _LIBCPP_TYPE_VIS_ONLY __map_iterator
|
||||||
{
|
{
|
||||||
|
typedef typename _TreeIterator::_NodeTypes _NodeTypes;
|
||||||
|
typedef typename _TreeIterator::__pointer_traits __pointer_traits;
|
||||||
|
|
||||||
_TreeIterator __i_;
|
_TreeIterator __i_;
|
||||||
|
|
||||||
typedef typename _TreeIterator::__pointer_traits __pointer_traits;
|
|
||||||
typedef typename _TreeIterator::value_type __value_type;
|
|
||||||
typedef typename __extract_key_value_types<__value_type>::__key_type __key_type;
|
|
||||||
typedef typename __extract_key_value_types<__value_type>::__mapped_type __mapped_type;
|
|
||||||
public:
|
public:
|
||||||
typedef bidirectional_iterator_tag iterator_category;
|
typedef bidirectional_iterator_tag iterator_category;
|
||||||
typedef pair<__key_type, __mapped_type> value_type;
|
typedef typename _NodeTypes::__map_value_type value_type;
|
||||||
typedef typename _TreeIterator::difference_type difference_type;
|
typedef typename _TreeIterator::difference_type difference_type;
|
||||||
typedef value_type& reference;
|
typedef value_type& reference;
|
||||||
typedef typename __pointer_traits::template
|
typedef typename _NodeTypes::__map_value_type_pointer pointer;
|
||||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
|
||||||
rebind<value_type>
|
|
||||||
#else
|
|
||||||
rebind<value_type>::other
|
|
||||||
#endif
|
|
||||||
pointer;
|
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
__map_iterator() _NOEXCEPT {}
|
__map_iterator() _NOEXCEPT {}
|
||||||
@@ -759,24 +743,17 @@ public:
|
|||||||
template <class _TreeIterator>
|
template <class _TreeIterator>
|
||||||
class _LIBCPP_TYPE_VIS_ONLY __map_const_iterator
|
class _LIBCPP_TYPE_VIS_ONLY __map_const_iterator
|
||||||
{
|
{
|
||||||
|
typedef typename _TreeIterator::_NodeTypes _NodeTypes;
|
||||||
|
typedef typename _TreeIterator::__pointer_traits __pointer_traits;
|
||||||
|
|
||||||
_TreeIterator __i_;
|
_TreeIterator __i_;
|
||||||
|
|
||||||
typedef typename _TreeIterator::__pointer_traits __pointer_traits;
|
|
||||||
typedef typename _TreeIterator::value_type __value_type;
|
|
||||||
typedef typename __extract_key_value_types<__value_type>::__key_type __key_type;
|
|
||||||
typedef typename __extract_key_value_types<__value_type>::__mapped_type __mapped_type;
|
|
||||||
public:
|
public:
|
||||||
typedef bidirectional_iterator_tag iterator_category;
|
typedef bidirectional_iterator_tag iterator_category;
|
||||||
typedef pair<__key_type, __mapped_type> value_type;
|
typedef typename _NodeTypes::__map_value_type value_type;
|
||||||
typedef typename _TreeIterator::difference_type difference_type;
|
typedef typename _TreeIterator::difference_type difference_type;
|
||||||
typedef const value_type& reference;
|
typedef const value_type& reference;
|
||||||
typedef typename __pointer_traits::template
|
typedef typename _NodeTypes::__const_map_value_type_pointer pointer;
|
||||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
|
||||||
rebind<const value_type>
|
|
||||||
#else
|
|
||||||
rebind<const value_type>::other
|
|
||||||
#endif
|
|
||||||
pointer;
|
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
__map_const_iterator() _NOEXCEPT {}
|
__map_const_iterator() _NOEXCEPT {}
|
||||||
@@ -840,6 +817,9 @@ public:
|
|||||||
typedef value_type& reference;
|
typedef value_type& reference;
|
||||||
typedef const value_type& const_reference;
|
typedef const value_type& const_reference;
|
||||||
|
|
||||||
|
static_assert((is_same<typename allocator_type::value_type, value_type>::value),
|
||||||
|
"Allocator::value_type must be same type as value_type");
|
||||||
|
|
||||||
class _LIBCPP_TYPE_VIS_ONLY value_compare
|
class _LIBCPP_TYPE_VIS_ONLY value_compare
|
||||||
: public binary_function<value_type, value_type, bool>
|
: public binary_function<value_type, value_type, bool>
|
||||||
{
|
{
|
||||||
@@ -1046,7 +1026,7 @@ public:
|
|||||||
size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
|
size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
|
||||||
|
|
||||||
mapped_type& operator[](const key_type& __k);
|
mapped_type& operator[](const key_type& __k);
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_CXX03_LANG
|
||||||
mapped_type& operator[](key_type&& __k);
|
mapped_type& operator[](key_type&& __k);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1060,18 +1040,18 @@ public:
|
|||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
value_compare value_comp() const {return value_compare(__tree_.value_comp().key_comp());}
|
value_compare value_comp() const {return value_compare(__tree_.value_comp().key_comp());}
|
||||||
|
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_CXX03_LANG
|
||||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
template <class ..._Args>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
pair<iterator, bool> emplace(_Args&& ...__args) {
|
||||||
|
return __tree_.__emplace_unique(_VSTD::forward<_Args>(__args)...);
|
||||||
|
}
|
||||||
|
|
||||||
template <class ..._Args>
|
template <class ..._Args>
|
||||||
pair<iterator, bool>
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
emplace(_Args&& ...__args);
|
iterator emplace_hint(const_iterator __p, _Args&& ...__args) {
|
||||||
|
return __tree_.__emplace_hint_unique(__p.__i_, _VSTD::forward<_Args>(__args)...);
|
||||||
template <class ..._Args>
|
}
|
||||||
iterator
|
|
||||||
emplace_hint(const_iterator __p, _Args&& ...__args);
|
|
||||||
|
|
||||||
#endif // _LIBCPP_HAS_NO_VARIADICS
|
|
||||||
|
|
||||||
template <class _Pp,
|
template <class _Pp,
|
||||||
class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
|
class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
|
||||||
@@ -1085,7 +1065,7 @@ public:
|
|||||||
iterator insert(const_iterator __pos, _Pp&& __p)
|
iterator insert(const_iterator __pos, _Pp&& __p)
|
||||||
{return __tree_.__insert_unique(__pos.__i_, _VSTD::forward<_Pp>(__p));}
|
{return __tree_.__insert_unique(__pos.__i_, _VSTD::forward<_Pp>(__p));}
|
||||||
|
|
||||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#endif // _LIBCPP_CXX03_LANG
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
pair<iterator, bool>
|
pair<iterator, bool>
|
||||||
@@ -1096,6 +1076,16 @@ public:
|
|||||||
insert(const_iterator __p, const value_type& __v)
|
insert(const_iterator __p, const value_type& __v)
|
||||||
{return __tree_.__insert_unique(__p.__i_, __v);}
|
{return __tree_.__insert_unique(__p.__i_, __v);}
|
||||||
|
|
||||||
|
#ifndef _LIBCPP_CXX03_LANG
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
pair<iterator, bool>
|
||||||
|
insert(value_type&& __v) {return __tree_.__insert_unique(_VSTD::move(__v));}
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
iterator insert(const_iterator __p, value_type&& __v)
|
||||||
|
{return __tree_.__insert_unique(__p.__i_, _VSTD::move(__v));}
|
||||||
|
#endif
|
||||||
|
|
||||||
template <class _InputIterator>
|
template <class _InputIterator>
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void insert(_InputIterator __f, _InputIterator __l)
|
void insert(_InputIterator __f, _InputIterator __l)
|
||||||
@@ -1113,48 +1103,34 @@ public:
|
|||||||
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
||||||
|
|
||||||
#if _LIBCPP_STD_VER > 14
|
#if _LIBCPP_STD_VER > 14
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
|
||||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
|
||||||
template <class... _Args>
|
template <class... _Args>
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args)
|
pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args)
|
||||||
{
|
{
|
||||||
iterator __p = lower_bound(__k);
|
return __tree_.__emplace_unique_key_args(__k,
|
||||||
if ( __p != end() && !key_comp()(__k, __p->first))
|
_VSTD::piecewise_construct,
|
||||||
return _VSTD::make_pair(__p, false);
|
_VSTD::forward_as_tuple(__k),
|
||||||
else
|
_VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
|
||||||
return _VSTD::make_pair(
|
|
||||||
emplace_hint(__p,
|
|
||||||
_VSTD::piecewise_construct, _VSTD::forward_as_tuple(__k),
|
|
||||||
_VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)),
|
|
||||||
true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class... _Args>
|
template <class... _Args>
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args)
|
pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args)
|
||||||
{
|
{
|
||||||
iterator __p = lower_bound(__k);
|
return __tree_.__emplace_unique_key_args(__k,
|
||||||
if ( __p != end() && !key_comp()(__k, __p->first))
|
_VSTD::piecewise_construct,
|
||||||
return _VSTD::make_pair(__p, false);
|
_VSTD::forward_as_tuple(_VSTD::move(__k)),
|
||||||
else
|
_VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
|
||||||
return _VSTD::make_pair(
|
|
||||||
emplace_hint(__p,
|
|
||||||
_VSTD::piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__k)),
|
|
||||||
_VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)),
|
|
||||||
true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class... _Args>
|
template <class... _Args>
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args)
|
iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args)
|
||||||
{
|
{
|
||||||
iterator __p = lower_bound(__k);
|
return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k,
|
||||||
if ( __p != end() && !key_comp()(__k, __p->first))
|
_VSTD::piecewise_construct,
|
||||||
return __p;
|
_VSTD::forward_as_tuple(__k),
|
||||||
else
|
|
||||||
return emplace_hint(__p,
|
|
||||||
_VSTD::piecewise_construct, _VSTD::forward_as_tuple(__k),
|
|
||||||
_VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
|
_VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1162,12 +1138,9 @@ public:
|
|||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args)
|
iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args)
|
||||||
{
|
{
|
||||||
iterator __p = lower_bound(__k);
|
return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k,
|
||||||
if ( __p != end() && !key_comp()(__k, __p->first))
|
_VSTD::piecewise_construct,
|
||||||
return __p;
|
_VSTD::forward_as_tuple(_VSTD::move(__k)),
|
||||||
else
|
|
||||||
return emplace_hint(__p,
|
|
||||||
_VSTD::piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__k)),
|
|
||||||
_VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
|
_VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1222,8 +1195,7 @@ public:
|
|||||||
}
|
}
|
||||||
return emplace_hint(__h, _VSTD::move(__k), _VSTD::forward<_Vp>(__v));
|
return emplace_hint(__h, _VSTD::move(__k), _VSTD::forward<_Vp>(__v));
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
@@ -1324,38 +1296,36 @@ private:
|
|||||||
typedef typename __base::__node __node;
|
typedef typename __base::__node __node;
|
||||||
typedef typename __base::__node_allocator __node_allocator;
|
typedef typename __base::__node_allocator __node_allocator;
|
||||||
typedef typename __base::__node_pointer __node_pointer;
|
typedef typename __base::__node_pointer __node_pointer;
|
||||||
typedef typename __base::__node_const_pointer __node_const_pointer;
|
|
||||||
typedef typename __base::__node_base_pointer __node_base_pointer;
|
typedef typename __base::__node_base_pointer __node_base_pointer;
|
||||||
typedef typename __base::__node_base_const_pointer __node_base_const_pointer;
|
|
||||||
typedef __map_node_destructor<__node_allocator> _Dp;
|
typedef __map_node_destructor<__node_allocator> _Dp;
|
||||||
typedef unique_ptr<__node, _Dp> __node_holder;
|
typedef unique_ptr<__node, _Dp> __node_holder;
|
||||||
|
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifdef _LIBCPP_CXX03_LANG
|
||||||
__node_holder __construct_node();
|
|
||||||
template <class _A0>
|
|
||||||
__node_holder __construct_node(_A0&& __a0);
|
|
||||||
__node_holder __construct_node_with_key(key_type&& __k);
|
|
||||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
|
||||||
template <class _A0, class _A1, class ..._Args>
|
|
||||||
__node_holder __construct_node(_A0&& __a0, _A1&& __a1, _Args&& ...__args);
|
|
||||||
#endif // _LIBCPP_HAS_NO_VARIADICS
|
|
||||||
#endif
|
|
||||||
__node_holder __construct_node_with_key(const key_type& __k);
|
__node_holder __construct_node_with_key(const key_type& __k);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
__node_base_pointer const&
|
||||||
|
__find_equal_key(__node_base_pointer& __parent, const key_type& __k) const;
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
__node_base_pointer&
|
__node_base_pointer&
|
||||||
__find_equal_key(__node_base_pointer& __parent, const key_type& __k);
|
__find_equal_key(__node_base_pointer& __parent, const key_type& __k) {
|
||||||
__node_base_const_pointer
|
map const* __const_this = this;
|
||||||
__find_equal_key(__node_base_const_pointer& __parent, const key_type& __k) const;
|
return const_cast<__node_base_pointer&>(
|
||||||
|
__const_this->__find_equal_key(__parent, __k));
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Find place to insert if __k doesn't exist
|
|
||||||
// Set __parent to parent of null leaf
|
// Find __k
|
||||||
// Return reference to null leaf
|
// Set __parent to parent of null leaf and
|
||||||
|
// return reference to null leaf iv __k does not exist.
|
||||||
// If __k exists, set parent to node of __k and return reference to node of __k
|
// If __k exists, set parent to node of __k and return reference to node of __k
|
||||||
template <class _Key, class _Tp, class _Compare, class _Allocator>
|
template <class _Key, class _Tp, class _Compare, class _Allocator>
|
||||||
typename map<_Key, _Tp, _Compare, _Allocator>::__node_base_pointer&
|
typename map<_Key, _Tp, _Compare, _Allocator>::__node_base_pointer const&
|
||||||
map<_Key, _Tp, _Compare, _Allocator>::__find_equal_key(__node_base_pointer& __parent,
|
map<_Key, _Tp, _Compare, _Allocator>::__find_equal_key(__node_base_pointer& __parent,
|
||||||
const key_type& __k)
|
const key_type& __k) const
|
||||||
{
|
{
|
||||||
__node_pointer __nd = __tree_.__root();
|
__node_pointer __nd = __tree_.__root();
|
||||||
if (__nd != nullptr)
|
if (__nd != nullptr)
|
||||||
@@ -1393,52 +1363,7 @@ map<_Key, _Tp, _Compare, _Allocator>::__find_equal_key(__node_base_pointer& __pa
|
|||||||
return __parent->__left_;
|
return __parent->__left_;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find __k
|
#ifndef _LIBCPP_CXX03_LANG
|
||||||
// Set __parent to parent of null leaf and
|
|
||||||
// return reference to null leaf iv __k does not exist.
|
|
||||||
// If __k exists, set parent to node of __k and return reference to node of __k
|
|
||||||
template <class _Key, class _Tp, class _Compare, class _Allocator>
|
|
||||||
typename map<_Key, _Tp, _Compare, _Allocator>::__node_base_const_pointer
|
|
||||||
map<_Key, _Tp, _Compare, _Allocator>::__find_equal_key(__node_base_const_pointer& __parent,
|
|
||||||
const key_type& __k) const
|
|
||||||
{
|
|
||||||
__node_const_pointer __nd = __tree_.__root();
|
|
||||||
if (__nd != nullptr)
|
|
||||||
{
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
if (__tree_.value_comp().key_comp()(__k, __nd->__value_.__cc.first))
|
|
||||||
{
|
|
||||||
if (__nd->__left_ != nullptr)
|
|
||||||
__nd = static_cast<__node_pointer>(__nd->__left_);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
__parent = static_cast<__node_base_pointer>(__nd);
|
|
||||||
return const_cast<const __node_base_const_pointer&>(__parent->__left_);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (__tree_.value_comp().key_comp()(__nd->__value_.__cc.first, __k))
|
|
||||||
{
|
|
||||||
if (__nd->__right_ != nullptr)
|
|
||||||
__nd = static_cast<__node_pointer>(__nd->__right_);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
__parent = static_cast<__node_base_pointer>(__nd);
|
|
||||||
return const_cast<const __node_base_const_pointer&>(__parent->__right_);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
__parent = static_cast<__node_base_pointer>(__nd);
|
|
||||||
return __parent;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
__parent = static_cast<__node_base_pointer>(__tree_.__end_node());
|
|
||||||
return const_cast<const __node_base_const_pointer&>(__parent->__left_);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
|
||||||
|
|
||||||
template <class _Key, class _Tp, class _Compare, class _Allocator>
|
template <class _Key, class _Tp, class _Compare, class _Allocator>
|
||||||
map<_Key, _Tp, _Compare, _Allocator>::map(map&& __m, const allocator_type& __a)
|
map<_Key, _Tp, _Compare, _Allocator>::map(map&& __m, const allocator_type& __a)
|
||||||
@@ -1449,69 +1374,14 @@ map<_Key, _Tp, _Compare, _Allocator>::map(map&& __m, const allocator_type& __a)
|
|||||||
const_iterator __e = cend();
|
const_iterator __e = cend();
|
||||||
while (!__m.empty())
|
while (!__m.empty())
|
||||||
__tree_.__insert_unique(__e.__i_,
|
__tree_.__insert_unique(__e.__i_,
|
||||||
_VSTD::move(__m.__tree_.remove(__m.begin().__i_)->__value_));
|
_VSTD::move(__m.__tree_.remove(__m.begin().__i_)->__value_.__nc));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class _Key, class _Tp, class _Compare, class _Allocator>
|
#endif // !_LIBCPP_CXX03_LANG
|
||||||
typename map<_Key, _Tp, _Compare, _Allocator>::__node_holder
|
|
||||||
map<_Key, _Tp, _Compare, _Allocator>::__construct_node()
|
|
||||||
{
|
|
||||||
__node_allocator& __na = __tree_.__node_alloc();
|
|
||||||
__node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
|
|
||||||
__node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first));
|
|
||||||
__h.get_deleter().__first_constructed = true;
|
|
||||||
__node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second));
|
|
||||||
__h.get_deleter().__second_constructed = true;
|
|
||||||
return __h;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Key, class _Tp, class _Compare, class _Allocator>
|
|
||||||
template <class _A0>
|
|
||||||
typename map<_Key, _Tp, _Compare, _Allocator>::__node_holder
|
|
||||||
map<_Key, _Tp, _Compare, _Allocator>::__construct_node(_A0&& __a0)
|
|
||||||
{
|
|
||||||
__node_allocator& __na = __tree_.__node_alloc();
|
|
||||||
__node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
|
|
||||||
__node_traits::construct(__na, _VSTD::addressof(__h->__value_), _VSTD::forward<_A0>(__a0));
|
|
||||||
__h.get_deleter().__first_constructed = true;
|
|
||||||
__h.get_deleter().__second_constructed = true;
|
|
||||||
return __h;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Key, class _Tp, class _Compare, class _Allocator>
|
#ifdef _LIBCPP_CXX03_LANG
|
||||||
typename map<_Key, _Tp, _Compare, _Allocator>::__node_holder
|
|
||||||
map<_Key, _Tp, _Compare, _Allocator>::__construct_node_with_key(key_type&& __k)
|
|
||||||
{
|
|
||||||
__node_allocator& __na = __tree_.__node_alloc();
|
|
||||||
__node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
|
|
||||||
__node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first), _VSTD::move(__k));
|
|
||||||
__h.get_deleter().__first_constructed = true;
|
|
||||||
__node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second));
|
|
||||||
__h.get_deleter().__second_constructed = true;
|
|
||||||
return __h;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
|
||||||
|
|
||||||
template <class _Key, class _Tp, class _Compare, class _Allocator>
|
|
||||||
template <class _A0, class _A1, class ..._Args>
|
|
||||||
typename map<_Key, _Tp, _Compare, _Allocator>::__node_holder
|
|
||||||
map<_Key, _Tp, _Compare, _Allocator>::__construct_node(_A0&& __a0, _A1&& __a1, _Args&& ...__args)
|
|
||||||
{
|
|
||||||
__node_allocator& __na = __tree_.__node_alloc();
|
|
||||||
__node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
|
|
||||||
__node_traits::construct(__na, _VSTD::addressof(__h->__value_),
|
|
||||||
_VSTD::forward<_A0>(__a0), _VSTD::forward<_A1>(__a1),
|
|
||||||
_VSTD::forward<_Args>(__args)...);
|
|
||||||
__h.get_deleter().__first_constructed = true;
|
|
||||||
__h.get_deleter().__second_constructed = true;
|
|
||||||
return __h;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // _LIBCPP_HAS_NO_VARIADICS
|
|
||||||
|
|
||||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
|
||||||
|
|
||||||
template <class _Key, class _Tp, class _Compare, class _Allocator>
|
template <class _Key, class _Tp, class _Compare, class _Allocator>
|
||||||
typename map<_Key, _Tp, _Compare, _Allocator>::__node_holder
|
typename map<_Key, _Tp, _Compare, _Allocator>::__node_holder
|
||||||
@@ -1523,7 +1393,7 @@ map<_Key, _Tp, _Compare, _Allocator>::__construct_node_with_key(const key_type&
|
|||||||
__h.get_deleter().__first_constructed = true;
|
__h.get_deleter().__first_constructed = true;
|
||||||
__node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second));
|
__node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second));
|
||||||
__h.get_deleter().__second_constructed = true;
|
__h.get_deleter().__second_constructed = true;
|
||||||
return _VSTD::move(__h); // explicitly moved for C++03
|
return _LIBCPP_EXPLICIT_MOVE(__h); // explicitly moved for C++03
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class _Key, class _Tp, class _Compare, class _Allocator>
|
template <class _Key, class _Tp, class _Compare, class _Allocator>
|
||||||
@@ -1542,25 +1412,29 @@ map<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k)
|
|||||||
return __r->__value_.__cc.second;
|
return __r->__value_.__cc.second;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#else
|
||||||
|
|
||||||
|
template <class _Key, class _Tp, class _Compare, class _Allocator>
|
||||||
|
_Tp&
|
||||||
|
map<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k)
|
||||||
|
{
|
||||||
|
return __tree_.__emplace_unique_key_args(__k,
|
||||||
|
_VSTD::piecewise_construct,
|
||||||
|
_VSTD::forward_as_tuple(__k),
|
||||||
|
_VSTD::forward_as_tuple()).first->__cc.second;
|
||||||
|
}
|
||||||
|
|
||||||
template <class _Key, class _Tp, class _Compare, class _Allocator>
|
template <class _Key, class _Tp, class _Compare, class _Allocator>
|
||||||
_Tp&
|
_Tp&
|
||||||
map<_Key, _Tp, _Compare, _Allocator>::operator[](key_type&& __k)
|
map<_Key, _Tp, _Compare, _Allocator>::operator[](key_type&& __k)
|
||||||
{
|
{
|
||||||
__node_base_pointer __parent;
|
return __tree_.__emplace_unique_key_args(__k,
|
||||||
__node_base_pointer& __child = __find_equal_key(__parent, __k);
|
_VSTD::piecewise_construct,
|
||||||
__node_pointer __r = static_cast<__node_pointer>(__child);
|
_VSTD::forward_as_tuple(_VSTD::move(__k)),
|
||||||
if (__child == nullptr)
|
_VSTD::forward_as_tuple()).first->__cc.second;
|
||||||
{
|
|
||||||
__node_holder __h = __construct_node_with_key(_VSTD::move(__k));
|
|
||||||
__tree_.__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
|
|
||||||
__r = __h.release();
|
|
||||||
}
|
|
||||||
return __r->__value_.__cc.second;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#endif // !_LIBCPP_CXX03_LANG
|
||||||
|
|
||||||
template <class _Key, class _Tp, class _Compare, class _Allocator>
|
template <class _Key, class _Tp, class _Compare, class _Allocator>
|
||||||
_Tp&
|
_Tp&
|
||||||
@@ -1579,43 +1453,15 @@ template <class _Key, class _Tp, class _Compare, class _Allocator>
|
|||||||
const _Tp&
|
const _Tp&
|
||||||
map<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k) const
|
map<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k) const
|
||||||
{
|
{
|
||||||
__node_base_const_pointer __parent;
|
__node_base_pointer __parent;
|
||||||
__node_base_const_pointer __child = __find_equal_key(__parent, __k);
|
__node_base_pointer __child = __find_equal_key(__parent, __k);
|
||||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||||
if (__child == nullptr)
|
if (__child == nullptr)
|
||||||
throw out_of_range("map::at: key not found");
|
throw out_of_range("map::at: key not found");
|
||||||
#endif // _LIBCPP_NO_EXCEPTIONS
|
#endif // _LIBCPP_NO_EXCEPTIONS
|
||||||
return static_cast<__node_const_pointer>(__child)->__value_.__cc.second;
|
return static_cast<__node_pointer>(__child)->__value_.__cc.second;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
|
|
||||||
|
|
||||||
template <class _Key, class _Tp, class _Compare, class _Allocator>
|
|
||||||
template <class ..._Args>
|
|
||||||
pair<typename map<_Key, _Tp, _Compare, _Allocator>::iterator, bool>
|
|
||||||
map<_Key, _Tp, _Compare, _Allocator>::emplace(_Args&& ...__args)
|
|
||||||
{
|
|
||||||
__node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
|
|
||||||
pair<iterator, bool> __r = __tree_.__node_insert_unique(__h.get());
|
|
||||||
if (__r.second)
|
|
||||||
__h.release();
|
|
||||||
return __r;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Key, class _Tp, class _Compare, class _Allocator>
|
|
||||||
template <class ..._Args>
|
|
||||||
typename map<_Key, _Tp, _Compare, _Allocator>::iterator
|
|
||||||
map<_Key, _Tp, _Compare, _Allocator>::emplace_hint(const_iterator __p,
|
|
||||||
_Args&& ...__args)
|
|
||||||
{
|
|
||||||
__node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
|
|
||||||
iterator __r = __tree_.__node_insert_unique(__p.__i_, __h.get());
|
|
||||||
if (__r.__i_.__ptr_ == __h.get())
|
|
||||||
__h.release();
|
|
||||||
return __r;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
|
|
||||||
|
|
||||||
template <class _Key, class _Tp, class _Compare, class _Allocator>
|
template <class _Key, class _Tp, class _Compare, class _Allocator>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
@@ -1696,6 +1542,9 @@ public:
|
|||||||
typedef value_type& reference;
|
typedef value_type& reference;
|
||||||
typedef const value_type& const_reference;
|
typedef const value_type& const_reference;
|
||||||
|
|
||||||
|
static_assert((is_same<typename allocator_type::value_type, value_type>::value),
|
||||||
|
"Allocator::value_type must be same type as value_type");
|
||||||
|
|
||||||
class _LIBCPP_TYPE_VIS_ONLY value_compare
|
class _LIBCPP_TYPE_VIS_ONLY value_compare
|
||||||
: public binary_function<value_type, value_type, bool>
|
: public binary_function<value_type, value_type, bool>
|
||||||
{
|
{
|
||||||
@@ -1910,18 +1759,19 @@ public:
|
|||||||
value_compare value_comp() const
|
value_compare value_comp() const
|
||||||
{return value_compare(__tree_.value_comp().key_comp());}
|
{return value_compare(__tree_.value_comp().key_comp());}
|
||||||
|
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_CXX03_LANG
|
||||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
|
||||||
|
|
||||||
template <class ..._Args>
|
template <class ..._Args>
|
||||||
iterator
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
emplace(_Args&& ...__args);
|
iterator emplace(_Args&& ...__args) {
|
||||||
|
return __tree_.__emplace_multi(_VSTD::forward<_Args>(__args)...);
|
||||||
|
}
|
||||||
|
|
||||||
template <class ..._Args>
|
template <class ..._Args>
|
||||||
iterator
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
emplace_hint(const_iterator __p, _Args&& ...__args);
|
iterator emplace_hint(const_iterator __p, _Args&& ...__args) {
|
||||||
|
return __tree_.__emplace_hint_multi(__p.__i_, _VSTD::forward<_Args>(__args)...);
|
||||||
#endif // _LIBCPP_HAS_NO_VARIADICS
|
}
|
||||||
|
|
||||||
template <class _Pp,
|
template <class _Pp,
|
||||||
class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
|
class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
|
||||||
@@ -1935,7 +1785,15 @@ public:
|
|||||||
iterator insert(const_iterator __pos, _Pp&& __p)
|
iterator insert(const_iterator __pos, _Pp&& __p)
|
||||||
{return __tree_.__insert_multi(__pos.__i_, _VSTD::forward<_Pp>(__p));}
|
{return __tree_.__insert_multi(__pos.__i_, _VSTD::forward<_Pp>(__p));}
|
||||||
|
|
||||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
iterator insert(value_type&& __v)
|
||||||
|
{return __tree_.__insert_multi(_VSTD::move(__v));}
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
iterator insert(const_iterator __p, value_type&& __v)
|
||||||
|
{return __tree_.__insert_multi(__p.__i_, _VSTD::move(__v));}
|
||||||
|
|
||||||
|
#endif // _LIBCPP_CXX03_LANG
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
iterator insert(const value_type& __v) {return __tree_.__insert_multi(__v);}
|
iterator insert(const value_type& __v) {return __tree_.__insert_multi(__v);}
|
||||||
@@ -2057,24 +1915,12 @@ private:
|
|||||||
typedef typename __base::__node __node;
|
typedef typename __base::__node __node;
|
||||||
typedef typename __base::__node_allocator __node_allocator;
|
typedef typename __base::__node_allocator __node_allocator;
|
||||||
typedef typename __base::__node_pointer __node_pointer;
|
typedef typename __base::__node_pointer __node_pointer;
|
||||||
typedef typename __base::__node_const_pointer __node_const_pointer;
|
|
||||||
typedef __map_node_destructor<__node_allocator> _Dp;
|
typedef __map_node_destructor<__node_allocator> _Dp;
|
||||||
typedef unique_ptr<__node, _Dp> __node_holder;
|
typedef unique_ptr<__node, _Dp> __node_holder;
|
||||||
|
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
|
||||||
__node_holder __construct_node();
|
|
||||||
template <class _A0>
|
|
||||||
__node_holder
|
|
||||||
__construct_node(_A0&& __a0);
|
|
||||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
|
||||||
template <class _A0, class _A1, class ..._Args>
|
|
||||||
__node_holder __construct_node(_A0&& __a0, _A1&& __a1, _Args&& ...__args);
|
|
||||||
#endif // _LIBCPP_HAS_NO_VARIADICS
|
|
||||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_CXX03_LANG
|
||||||
|
|
||||||
template <class _Key, class _Tp, class _Compare, class _Allocator>
|
template <class _Key, class _Tp, class _Compare, class _Allocator>
|
||||||
multimap<_Key, _Tp, _Compare, _Allocator>::multimap(multimap&& __m, const allocator_type& __a)
|
multimap<_Key, _Tp, _Compare, _Allocator>::multimap(multimap&& __m, const allocator_type& __a)
|
||||||
: __tree_(_VSTD::move(__m.__tree_), __a)
|
: __tree_(_VSTD::move(__m.__tree_), __a)
|
||||||
@@ -2084,82 +1930,10 @@ multimap<_Key, _Tp, _Compare, _Allocator>::multimap(multimap&& __m, const alloca
|
|||||||
const_iterator __e = cend();
|
const_iterator __e = cend();
|
||||||
while (!__m.empty())
|
while (!__m.empty())
|
||||||
__tree_.__insert_multi(__e.__i_,
|
__tree_.__insert_multi(__e.__i_,
|
||||||
_VSTD::move(__m.__tree_.remove(__m.begin().__i_)->__value_));
|
_VSTD::move(__m.__tree_.remove(__m.begin().__i_)->__value_.__nc));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
template <class _Key, class _Tp, class _Compare, class _Allocator>
|
|
||||||
typename multimap<_Key, _Tp, _Compare, _Allocator>::__node_holder
|
|
||||||
multimap<_Key, _Tp, _Compare, _Allocator>::__construct_node()
|
|
||||||
{
|
|
||||||
__node_allocator& __na = __tree_.__node_alloc();
|
|
||||||
__node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
|
|
||||||
__node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first));
|
|
||||||
__h.get_deleter().__first_constructed = true;
|
|
||||||
__node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second));
|
|
||||||
__h.get_deleter().__second_constructed = true;
|
|
||||||
return __h;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Key, class _Tp, class _Compare, class _Allocator>
|
|
||||||
template <class _A0>
|
|
||||||
typename multimap<_Key, _Tp, _Compare, _Allocator>::__node_holder
|
|
||||||
multimap<_Key, _Tp, _Compare, _Allocator>::__construct_node(_A0&& __a0)
|
|
||||||
{
|
|
||||||
__node_allocator& __na = __tree_.__node_alloc();
|
|
||||||
__node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
|
|
||||||
__node_traits::construct(__na, _VSTD::addressof(__h->__value_), _VSTD::forward<_A0>(__a0));
|
|
||||||
__h.get_deleter().__first_constructed = true;
|
|
||||||
__h.get_deleter().__second_constructed = true;
|
|
||||||
return __h;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
|
||||||
|
|
||||||
template <class _Key, class _Tp, class _Compare, class _Allocator>
|
|
||||||
template <class _A0, class _A1, class ..._Args>
|
|
||||||
typename multimap<_Key, _Tp, _Compare, _Allocator>::__node_holder
|
|
||||||
multimap<_Key, _Tp, _Compare, _Allocator>::__construct_node(_A0&& __a0, _A1&& __a1, _Args&& ...__args)
|
|
||||||
{
|
|
||||||
__node_allocator& __na = __tree_.__node_alloc();
|
|
||||||
__node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
|
|
||||||
__node_traits::construct(__na, _VSTD::addressof(__h->__value_),
|
|
||||||
_VSTD::forward<_A0>(__a0), _VSTD::forward<_A1>(__a1),
|
|
||||||
_VSTD::forward<_Args>(__args)...);
|
|
||||||
__h.get_deleter().__first_constructed = true;
|
|
||||||
__h.get_deleter().__second_constructed = true;
|
|
||||||
return __h;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // _LIBCPP_HAS_NO_VARIADICS
|
|
||||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
|
||||||
|
|
||||||
#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
|
|
||||||
|
|
||||||
template <class _Key, class _Tp, class _Compare, class _Allocator>
|
|
||||||
template <class ..._Args>
|
|
||||||
typename multimap<_Key, _Tp, _Compare, _Allocator>::iterator
|
|
||||||
multimap<_Key, _Tp, _Compare, _Allocator>::emplace(_Args&& ...__args)
|
|
||||||
{
|
|
||||||
__node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
|
|
||||||
iterator __r = __tree_.__node_insert_multi(__h.get());
|
|
||||||
__h.release();
|
|
||||||
return __r;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Key, class _Tp, class _Compare, class _Allocator>
|
|
||||||
template <class ..._Args>
|
|
||||||
typename multimap<_Key, _Tp, _Compare, _Allocator>::iterator
|
|
||||||
multimap<_Key, _Tp, _Compare, _Allocator>::emplace_hint(const_iterator __p,
|
|
||||||
_Args&& ...__args)
|
|
||||||
{
|
|
||||||
__node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
|
|
||||||
iterator __r = __tree_.__node_insert_multi(__p.__i_, __h.get());
|
|
||||||
__h.release();
|
|
||||||
return __r;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
|
|
||||||
|
|
||||||
template <class _Key, class _Tp, class _Compare, class _Allocator>
|
template <class _Key, class _Tp, class _Compare, class _Allocator>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
|
|||||||
1419
include/math.h
Normal file
1419
include/math.h
Normal file
File diff suppressed because it is too large
Load Diff
225
include/memory
225
include/memory
@@ -607,12 +607,13 @@ void* align(size_t alignment, size_t size, void*& ptr, size_t& space);
|
|||||||
#include <__functional_base>
|
#include <__functional_base>
|
||||||
#include <iosfwd>
|
#include <iosfwd>
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
|
#include <stdexcept>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#if defined(_LIBCPP_NO_EXCEPTIONS)
|
#if defined(_LIBCPP_NO_EXCEPTIONS)
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if __has_feature(cxx_atomic) && !defined(_LIBCPP_HAS_NO_THREADS)
|
#if !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER)
|
||||||
# include <atomic>
|
# include <atomic>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -932,6 +933,15 @@ public:
|
|||||||
{return _VSTD::addressof(__r);}
|
{return _VSTD::addressof(__r);}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <class _From, class _To>
|
||||||
|
struct __rebind_pointer {
|
||||||
|
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||||
|
typedef typename pointer_traits<_From>::template rebind<_To> type;
|
||||||
|
#else
|
||||||
|
typedef typename pointer_traits<_From>::template rebind<_To>::other type;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
// allocator_traits
|
// allocator_traits
|
||||||
|
|
||||||
namespace __has_pointer_type_imp
|
namespace __has_pointer_type_imp
|
||||||
@@ -1669,7 +1679,7 @@ private:
|
|||||||
{return __a.max_size();}
|
{return __a.max_size();}
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
static size_type __max_size(false_type, const allocator_type&)
|
static size_type __max_size(false_type, const allocator_type&)
|
||||||
{return numeric_limits<size_type>::max();}
|
{return numeric_limits<size_type>::max() / sizeof(value_type);}
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
static allocator_type
|
static allocator_type
|
||||||
@@ -1717,7 +1727,12 @@ public:
|
|||||||
_LIBCPP_INLINE_VISIBILITY const_pointer address(const_reference __x) const _NOEXCEPT
|
_LIBCPP_INLINE_VISIBILITY const_pointer address(const_reference __x) const _NOEXCEPT
|
||||||
{return _VSTD::addressof(__x);}
|
{return _VSTD::addressof(__x);}
|
||||||
_LIBCPP_INLINE_VISIBILITY pointer allocate(size_type __n, allocator<void>::const_pointer = 0)
|
_LIBCPP_INLINE_VISIBILITY pointer allocate(size_type __n, allocator<void>::const_pointer = 0)
|
||||||
{return static_cast<pointer>(_VSTD::__allocate(__n * sizeof(_Tp)));}
|
{
|
||||||
|
if (__n > max_size())
|
||||||
|
__libcpp_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
|
_LIBCPP_INLINE_VISIBILITY void deallocate(pointer __p, size_type) _NOEXCEPT
|
||||||
{_VSTD::__deallocate((void*)__p);}
|
{_VSTD::__deallocate((void*)__p);}
|
||||||
_LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT
|
_LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT
|
||||||
@@ -1808,7 +1823,12 @@ public:
|
|||||||
_LIBCPP_INLINE_VISIBILITY const_pointer address(const_reference __x) const _NOEXCEPT
|
_LIBCPP_INLINE_VISIBILITY const_pointer address(const_reference __x) const _NOEXCEPT
|
||||||
{return _VSTD::addressof(__x);}
|
{return _VSTD::addressof(__x);}
|
||||||
_LIBCPP_INLINE_VISIBILITY pointer allocate(size_type __n, allocator<void>::const_pointer = 0)
|
_LIBCPP_INLINE_VISIBILITY pointer allocate(size_type __n, allocator<void>::const_pointer = 0)
|
||||||
{return static_cast<pointer>(_VSTD::__allocate(__n * sizeof(_Tp)));}
|
{
|
||||||
|
if (__n > max_size())
|
||||||
|
__libcpp_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
|
_LIBCPP_INLINE_VISIBILITY void deallocate(pointer __p, size_type) _NOEXCEPT
|
||||||
{_VSTD::__deallocate((void*)__p);}
|
{_VSTD::__deallocate((void*)__p);}
|
||||||
_LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT
|
_LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT
|
||||||
@@ -1900,6 +1920,10 @@ public:
|
|||||||
_LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator*() {return *this;}
|
_LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator*() {return *this;}
|
||||||
_LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator=(const _Tp& __element)
|
_LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator=(const _Tp& __element)
|
||||||
{::new(&*__x_) _Tp(__element); return *this;}
|
{::new(&*__x_) _Tp(__element); return *this;}
|
||||||
|
#if _LIBCPP_STD_VER >= 14
|
||||||
|
_LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator=(_Tp&& __element)
|
||||||
|
{::new(&*__x_) _Tp(_VSTD::move(__element)); return *this;}
|
||||||
|
#endif
|
||||||
_LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator++() {++__x_; return *this;}
|
_LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator++() {++__x_; return *this;}
|
||||||
_LIBCPP_INLINE_VISIBILITY raw_storage_iterator operator++(int)
|
_LIBCPP_INLINE_VISIBILITY raw_storage_iterator operator++(int)
|
||||||
{raw_storage_iterator __t(*this); ++__x_; return __t;}
|
{raw_storage_iterator __t(*this); ++__x_; return __t;}
|
||||||
@@ -2535,7 +2559,7 @@ public:
|
|||||||
typename enable_if<__same_or_less_cv_qualified<_Up*, _Tp*>::value>::type* = 0) const _NOEXCEPT
|
typename enable_if<__same_or_less_cv_qualified<_Up*, _Tp*>::value>::type* = 0) const _NOEXCEPT
|
||||||
{
|
{
|
||||||
static_assert(sizeof(_Tp) > 0, "default_delete can not delete incomplete type");
|
static_assert(sizeof(_Tp) > 0, "default_delete can not delete incomplete type");
|
||||||
static_assert(!is_void<_Tp>::value, "default_delete can not delete incomplete type");
|
static_assert(!is_void<_Tp>::value, "default_delete can not delete void type");
|
||||||
delete [] __ptr;
|
delete [] __ptr;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -2659,10 +2683,17 @@ public:
|
|||||||
: __ptr_(__u->release(), _VSTD::forward<deleter_type>(__u->get_deleter())) {}
|
: __ptr_(__u->release(), _VSTD::forward<deleter_type>(__u->get_deleter())) {}
|
||||||
|
|
||||||
template <class _Up, class _Ep>
|
template <class _Up, class _Ep>
|
||||||
_LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(unique_ptr<_Up, _Ep> __u)
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
typename enable_if<
|
||||||
|
!is_array<_Up>::value &&
|
||||||
|
is_convertible<typename unique_ptr<_Up, _Ep>::pointer, pointer>::value &&
|
||||||
|
is_assignable<deleter_type&, _Ep&>::value,
|
||||||
|
unique_ptr&
|
||||||
|
>::type
|
||||||
|
operator=(unique_ptr<_Up, _Ep> __u)
|
||||||
{
|
{
|
||||||
reset(__u.release());
|
reset(__u.release());
|
||||||
__ptr_.second() = _VSTD::forward<deleter_type>(__u.get_deleter());
|
__ptr_.second() = _VSTD::forward<_Ep>(__u.get_deleter());
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2898,7 +2929,6 @@ public:
|
|||||||
return __t;
|
return __t;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
|
||||||
template <class _Pp>
|
template <class _Pp>
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
typename enable_if<__same_or_less_cv_qualified<_Pp, pointer>::value, void>::type
|
typename enable_if<__same_or_less_cv_qualified<_Pp, pointer>::value, void>::type
|
||||||
@@ -2909,29 +2939,13 @@ public:
|
|||||||
if (__tmp)
|
if (__tmp)
|
||||||
__ptr_.second()(__tmp);
|
__ptr_.second()(__tmp);
|
||||||
}
|
}
|
||||||
_LIBCPP_INLINE_VISIBILITY void reset(nullptr_t) _NOEXCEPT
|
_LIBCPP_INLINE_VISIBILITY void reset(nullptr_t = nullptr) _NOEXCEPT
|
||||||
{
|
{
|
||||||
pointer __tmp = __ptr_.first();
|
pointer __tmp = __ptr_.first();
|
||||||
__ptr_.first() = nullptr;
|
__ptr_.first() = nullptr;
|
||||||
if (__tmp)
|
if (__tmp)
|
||||||
__ptr_.second()(__tmp);
|
__ptr_.second()(__tmp);
|
||||||
}
|
}
|
||||||
_LIBCPP_INLINE_VISIBILITY void reset() _NOEXCEPT
|
|
||||||
{
|
|
||||||
pointer __tmp = __ptr_.first();
|
|
||||||
__ptr_.first() = nullptr;
|
|
||||||
if (__tmp)
|
|
||||||
__ptr_.second()(__tmp);
|
|
||||||
}
|
|
||||||
#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
|
||||||
_LIBCPP_INLINE_VISIBILITY void reset(pointer __p = pointer())
|
|
||||||
{
|
|
||||||
pointer __tmp = __ptr_.first();
|
|
||||||
__ptr_.first() = __p;
|
|
||||||
if (__tmp)
|
|
||||||
__ptr_.second()(__tmp);
|
|
||||||
}
|
|
||||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY void swap(unique_ptr& __u) {__ptr_.swap(__u.__ptr_);}
|
_LIBCPP_INLINE_VISIBILITY void swap(unique_ptr& __u) {__ptr_.swap(__u.__ptr_);}
|
||||||
private:
|
private:
|
||||||
@@ -2955,7 +2969,10 @@ private:
|
|||||||
|
|
||||||
template <class _Tp, class _Dp>
|
template <class _Tp, class _Dp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
void
|
typename enable_if<
|
||||||
|
__is_swappable<_Dp>::value,
|
||||||
|
void
|
||||||
|
>::type
|
||||||
swap(unique_ptr<_Tp, _Dp>& __x, unique_ptr<_Tp, _Dp>& __y) _NOEXCEPT {__x.swap(__y);}
|
swap(unique_ptr<_Tp, _Dp>& __x, unique_ptr<_Tp, _Dp>& __y) _NOEXCEPT {__x.swap(__y);}
|
||||||
|
|
||||||
template <class _T1, class _D1, class _T2, class _D2>
|
template <class _T1, class _D1, class _T2, class _D2>
|
||||||
@@ -3147,8 +3164,6 @@ template<class _Tp, class... _Args>
|
|||||||
|
|
||||||
#endif // _LIBCPP_STD_VER > 11
|
#endif // _LIBCPP_STD_VER > 11
|
||||||
|
|
||||||
template <class _Tp> struct hash;
|
|
||||||
|
|
||||||
template <class _Size>
|
template <class _Size>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
_Size
|
_Size
|
||||||
@@ -3174,7 +3189,7 @@ struct __murmur2_or_cityhash<_Size, 32>
|
|||||||
// murmur2
|
// murmur2
|
||||||
template <class _Size>
|
template <class _Size>
|
||||||
_Size
|
_Size
|
||||||
__murmur2_or_cityhash<_Size, 32>::operator()(const void* __key, _Size __len)
|
__murmur2_or_cityhash<_Size, 32>::operator()(const void* __key, _Size __len) _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
|
||||||
{
|
{
|
||||||
const _Size __m = 0x5bd1e995;
|
const _Size __m = 0x5bd1e995;
|
||||||
const _Size __r = 24;
|
const _Size __r = 24;
|
||||||
@@ -3324,7 +3339,7 @@ struct __murmur2_or_cityhash<_Size, 64>
|
|||||||
// cityhash64
|
// cityhash64
|
||||||
template <class _Size>
|
template <class _Size>
|
||||||
_Size
|
_Size
|
||||||
__murmur2_or_cityhash<_Size, 64>::operator()(const void* __key, _Size __len)
|
__murmur2_or_cityhash<_Size, 64>::operator()(const void* __key, _Size __len) _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
|
||||||
{
|
{
|
||||||
const char* __s = static_cast<const char*>(__key);
|
const char* __s = static_cast<const char*>(__key);
|
||||||
if (__len <= 32) {
|
if (__len <= 32) {
|
||||||
@@ -3854,7 +3869,9 @@ private:
|
|||||||
|
|
||||||
struct __nat {int __for_bool_;};
|
struct __nat {int __for_bool_;};
|
||||||
public:
|
public:
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
_LIBCPP_CONSTEXPR shared_ptr() _NOEXCEPT;
|
_LIBCPP_CONSTEXPR shared_ptr() _NOEXCEPT;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
_LIBCPP_CONSTEXPR shared_ptr(nullptr_t) _NOEXCEPT;
|
_LIBCPP_CONSTEXPR shared_ptr(nullptr_t) _NOEXCEPT;
|
||||||
template<class _Yp>
|
template<class _Yp>
|
||||||
explicit shared_ptr(_Yp* __p,
|
explicit shared_ptr(_Yp* __p,
|
||||||
@@ -3867,15 +3884,18 @@ public:
|
|||||||
typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat());
|
typename enable_if<is_convertible<_Yp*, element_type*>::value, __nat>::type = __nat());
|
||||||
template <class _Dp> shared_ptr(nullptr_t __p, _Dp __d);
|
template <class _Dp> shared_ptr(nullptr_t __p, _Dp __d);
|
||||||
template <class _Dp, class _Alloc> shared_ptr(nullptr_t __p, _Dp __d, _Alloc __a);
|
template <class _Dp, class _Alloc> shared_ptr(nullptr_t __p, _Dp __d, _Alloc __a);
|
||||||
template<class _Yp> shared_ptr(const shared_ptr<_Yp>& __r, element_type* __p) _NOEXCEPT;
|
template<class _Yp> _LIBCPP_INLINE_VISIBILITY shared_ptr(const shared_ptr<_Yp>& __r, element_type* __p) _NOEXCEPT;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
shared_ptr(const shared_ptr& __r) _NOEXCEPT;
|
shared_ptr(const shared_ptr& __r) _NOEXCEPT;
|
||||||
template<class _Yp>
|
template<class _Yp>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
shared_ptr(const shared_ptr<_Yp>& __r,
|
shared_ptr(const shared_ptr<_Yp>& __r,
|
||||||
typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type = __nat())
|
typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type = __nat())
|
||||||
_NOEXCEPT;
|
_NOEXCEPT;
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
shared_ptr(shared_ptr&& __r) _NOEXCEPT;
|
shared_ptr(shared_ptr&& __r) _NOEXCEPT;
|
||||||
template<class _Yp> shared_ptr(shared_ptr<_Yp>&& __r,
|
template<class _Yp> _LIBCPP_INLINE_VISIBILITY shared_ptr(shared_ptr<_Yp>&& __r,
|
||||||
typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type = __nat())
|
typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type = __nat())
|
||||||
_NOEXCEPT;
|
_NOEXCEPT;
|
||||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
@@ -3932,6 +3952,7 @@ public:
|
|||||||
|
|
||||||
~shared_ptr();
|
~shared_ptr();
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
shared_ptr& operator=(const shared_ptr& __r) _NOEXCEPT;
|
shared_ptr& operator=(const shared_ptr& __r) _NOEXCEPT;
|
||||||
template<class _Yp>
|
template<class _Yp>
|
||||||
typename enable_if
|
typename enable_if
|
||||||
@@ -3939,8 +3960,10 @@ public:
|
|||||||
is_convertible<_Yp*, element_type*>::value,
|
is_convertible<_Yp*, element_type*>::value,
|
||||||
shared_ptr&
|
shared_ptr&
|
||||||
>::type
|
>::type
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
operator=(const shared_ptr<_Yp>& __r) _NOEXCEPT;
|
operator=(const shared_ptr<_Yp>& __r) _NOEXCEPT;
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
shared_ptr& operator=(shared_ptr&& __r) _NOEXCEPT;
|
shared_ptr& operator=(shared_ptr&& __r) _NOEXCEPT;
|
||||||
template<class _Yp>
|
template<class _Yp>
|
||||||
typename enable_if
|
typename enable_if
|
||||||
@@ -3948,8 +3971,10 @@ public:
|
|||||||
is_convertible<_Yp*, element_type*>::value,
|
is_convertible<_Yp*, element_type*>::value,
|
||||||
shared_ptr<_Tp>&
|
shared_ptr<_Tp>&
|
||||||
>::type
|
>::type
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
operator=(shared_ptr<_Yp>&& __r);
|
operator=(shared_ptr<_Yp>&& __r);
|
||||||
template<class _Yp>
|
template<class _Yp>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
typename enable_if
|
typename enable_if
|
||||||
<
|
<
|
||||||
!is_array<_Yp>::value &&
|
!is_array<_Yp>::value &&
|
||||||
@@ -3959,6 +3984,7 @@ public:
|
|||||||
operator=(auto_ptr<_Yp>&& __r);
|
operator=(auto_ptr<_Yp>&& __r);
|
||||||
#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
template<class _Yp>
|
template<class _Yp>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
typename enable_if
|
typename enable_if
|
||||||
<
|
<
|
||||||
!is_array<_Yp>::value &&
|
!is_array<_Yp>::value &&
|
||||||
@@ -3975,12 +4001,16 @@ public:
|
|||||||
shared_ptr&
|
shared_ptr&
|
||||||
>::type
|
>::type
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
operator=(unique_ptr<_Yp, _Dp>&& __r);
|
operator=(unique_ptr<_Yp, _Dp>&& __r);
|
||||||
#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
operator=(unique_ptr<_Yp, _Dp> __r);
|
operator=(unique_ptr<_Yp, _Dp> __r);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void swap(shared_ptr& __r) _NOEXCEPT;
|
void swap(shared_ptr& __r) _NOEXCEPT;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void reset() _NOEXCEPT;
|
void reset() _NOEXCEPT;
|
||||||
template<class _Yp>
|
template<class _Yp>
|
||||||
typename enable_if
|
typename enable_if
|
||||||
@@ -3988,6 +4018,7 @@ public:
|
|||||||
is_convertible<_Yp*, element_type*>::value,
|
is_convertible<_Yp*, element_type*>::value,
|
||||||
void
|
void
|
||||||
>::type
|
>::type
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
reset(_Yp* __p);
|
reset(_Yp* __p);
|
||||||
template<class _Yp, class _Dp>
|
template<class _Yp, class _Dp>
|
||||||
typename enable_if
|
typename enable_if
|
||||||
@@ -3995,6 +4026,7 @@ public:
|
|||||||
is_convertible<_Yp*, element_type*>::value,
|
is_convertible<_Yp*, element_type*>::value,
|
||||||
void
|
void
|
||||||
>::type
|
>::type
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
reset(_Yp* __p, _Dp __d);
|
reset(_Yp* __p, _Dp __d);
|
||||||
template<class _Yp, class _Dp, class _Alloc>
|
template<class _Yp, class _Dp, class _Alloc>
|
||||||
typename enable_if
|
typename enable_if
|
||||||
@@ -4002,6 +4034,7 @@ public:
|
|||||||
is_convertible<_Yp*, element_type*>::value,
|
is_convertible<_Yp*, element_type*>::value,
|
||||||
void
|
void
|
||||||
>::type
|
>::type
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
reset(_Yp* __p, _Dp __d, _Alloc __a);
|
reset(_Yp* __p, _Dp __d, _Alloc __a);
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
@@ -4103,7 +4136,7 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
template<class _Tp>
|
template<class _Tp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
_LIBCPP_CONSTEXPR
|
_LIBCPP_CONSTEXPR
|
||||||
shared_ptr<_Tp>::shared_ptr() _NOEXCEPT
|
shared_ptr<_Tp>::shared_ptr() _NOEXCEPT
|
||||||
: __ptr_(0),
|
: __ptr_(0),
|
||||||
@@ -4112,7 +4145,7 @@ shared_ptr<_Tp>::shared_ptr() _NOEXCEPT
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<class _Tp>
|
template<class _Tp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
_LIBCPP_CONSTEXPR
|
_LIBCPP_CONSTEXPR
|
||||||
shared_ptr<_Tp>::shared_ptr(nullptr_t) _NOEXCEPT
|
shared_ptr<_Tp>::shared_ptr(nullptr_t) _NOEXCEPT
|
||||||
: __ptr_(0),
|
: __ptr_(0),
|
||||||
@@ -4235,7 +4268,7 @@ shared_ptr<_Tp>::shared_ptr(nullptr_t __p, _Dp __d, _Alloc __a)
|
|||||||
|
|
||||||
template<class _Tp>
|
template<class _Tp>
|
||||||
template<class _Yp>
|
template<class _Yp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
shared_ptr<_Tp>::shared_ptr(const shared_ptr<_Yp>& __r, element_type *__p) _NOEXCEPT
|
shared_ptr<_Tp>::shared_ptr(const shared_ptr<_Yp>& __r, element_type *__p) _NOEXCEPT
|
||||||
: __ptr_(__p),
|
: __ptr_(__p),
|
||||||
__cntrl_(__r.__cntrl_)
|
__cntrl_(__r.__cntrl_)
|
||||||
@@ -4245,7 +4278,7 @@ shared_ptr<_Tp>::shared_ptr(const shared_ptr<_Yp>& __r, element_type *__p) _NOEX
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<class _Tp>
|
template<class _Tp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
shared_ptr<_Tp>::shared_ptr(const shared_ptr& __r) _NOEXCEPT
|
shared_ptr<_Tp>::shared_ptr(const shared_ptr& __r) _NOEXCEPT
|
||||||
: __ptr_(__r.__ptr_),
|
: __ptr_(__r.__ptr_),
|
||||||
__cntrl_(__r.__cntrl_)
|
__cntrl_(__r.__cntrl_)
|
||||||
@@ -4256,7 +4289,7 @@ shared_ptr<_Tp>::shared_ptr(const shared_ptr& __r) _NOEXCEPT
|
|||||||
|
|
||||||
template<class _Tp>
|
template<class _Tp>
|
||||||
template<class _Yp>
|
template<class _Yp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
shared_ptr<_Tp>::shared_ptr(const shared_ptr<_Yp>& __r,
|
shared_ptr<_Tp>::shared_ptr(const shared_ptr<_Yp>& __r,
|
||||||
typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type)
|
typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type)
|
||||||
_NOEXCEPT
|
_NOEXCEPT
|
||||||
@@ -4270,7 +4303,7 @@ shared_ptr<_Tp>::shared_ptr(const shared_ptr<_Yp>& __r,
|
|||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
|
||||||
template<class _Tp>
|
template<class _Tp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
shared_ptr<_Tp>::shared_ptr(shared_ptr&& __r) _NOEXCEPT
|
shared_ptr<_Tp>::shared_ptr(shared_ptr&& __r) _NOEXCEPT
|
||||||
: __ptr_(__r.__ptr_),
|
: __ptr_(__r.__ptr_),
|
||||||
__cntrl_(__r.__cntrl_)
|
__cntrl_(__r.__cntrl_)
|
||||||
@@ -4281,7 +4314,7 @@ shared_ptr<_Tp>::shared_ptr(shared_ptr&& __r) _NOEXCEPT
|
|||||||
|
|
||||||
template<class _Tp>
|
template<class _Tp>
|
||||||
template<class _Yp>
|
template<class _Yp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
shared_ptr<_Tp>::shared_ptr(shared_ptr<_Yp>&& __r,
|
shared_ptr<_Tp>::shared_ptr(shared_ptr<_Yp>&& __r,
|
||||||
typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type)
|
typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type)
|
||||||
_NOEXCEPT
|
_NOEXCEPT
|
||||||
@@ -4568,7 +4601,7 @@ shared_ptr<_Tp>::~shared_ptr()
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<class _Tp>
|
template<class _Tp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
shared_ptr<_Tp>&
|
shared_ptr<_Tp>&
|
||||||
shared_ptr<_Tp>::operator=(const shared_ptr& __r) _NOEXCEPT
|
shared_ptr<_Tp>::operator=(const shared_ptr& __r) _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -4578,7 +4611,7 @@ shared_ptr<_Tp>::operator=(const shared_ptr& __r) _NOEXCEPT
|
|||||||
|
|
||||||
template<class _Tp>
|
template<class _Tp>
|
||||||
template<class _Yp>
|
template<class _Yp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
typename enable_if
|
typename enable_if
|
||||||
<
|
<
|
||||||
is_convertible<_Yp*, _Tp*>::value,
|
is_convertible<_Yp*, _Tp*>::value,
|
||||||
@@ -4593,7 +4626,7 @@ shared_ptr<_Tp>::operator=(const shared_ptr<_Yp>& __r) _NOEXCEPT
|
|||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
|
||||||
template<class _Tp>
|
template<class _Tp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
shared_ptr<_Tp>&
|
shared_ptr<_Tp>&
|
||||||
shared_ptr<_Tp>::operator=(shared_ptr&& __r) _NOEXCEPT
|
shared_ptr<_Tp>::operator=(shared_ptr&& __r) _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -4603,7 +4636,7 @@ shared_ptr<_Tp>::operator=(shared_ptr&& __r) _NOEXCEPT
|
|||||||
|
|
||||||
template<class _Tp>
|
template<class _Tp>
|
||||||
template<class _Yp>
|
template<class _Yp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
typename enable_if
|
typename enable_if
|
||||||
<
|
<
|
||||||
is_convertible<_Yp*, _Tp*>::value,
|
is_convertible<_Yp*, _Tp*>::value,
|
||||||
@@ -4617,7 +4650,7 @@ shared_ptr<_Tp>::operator=(shared_ptr<_Yp>&& __r)
|
|||||||
|
|
||||||
template<class _Tp>
|
template<class _Tp>
|
||||||
template<class _Yp>
|
template<class _Yp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
typename enable_if
|
typename enable_if
|
||||||
<
|
<
|
||||||
!is_array<_Yp>::value &&
|
!is_array<_Yp>::value &&
|
||||||
@@ -4632,7 +4665,7 @@ shared_ptr<_Tp>::operator=(auto_ptr<_Yp>&& __r)
|
|||||||
|
|
||||||
template<class _Tp>
|
template<class _Tp>
|
||||||
template <class _Yp, class _Dp>
|
template <class _Yp, class _Dp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
typename enable_if
|
typename enable_if
|
||||||
<
|
<
|
||||||
!is_array<_Yp>::value &&
|
!is_array<_Yp>::value &&
|
||||||
@@ -4680,7 +4713,7 @@ shared_ptr<_Tp>::operator=(unique_ptr<_Yp, _Dp> __r)
|
|||||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
|
||||||
template<class _Tp>
|
template<class _Tp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
shared_ptr<_Tp>::swap(shared_ptr& __r) _NOEXCEPT
|
shared_ptr<_Tp>::swap(shared_ptr& __r) _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -4689,7 +4722,7 @@ shared_ptr<_Tp>::swap(shared_ptr& __r) _NOEXCEPT
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<class _Tp>
|
template<class _Tp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
shared_ptr<_Tp>::reset() _NOEXCEPT
|
shared_ptr<_Tp>::reset() _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -4698,7 +4731,7 @@ shared_ptr<_Tp>::reset() _NOEXCEPT
|
|||||||
|
|
||||||
template<class _Tp>
|
template<class _Tp>
|
||||||
template<class _Yp>
|
template<class _Yp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
typename enable_if
|
typename enable_if
|
||||||
<
|
<
|
||||||
is_convertible<_Yp*, _Tp*>::value,
|
is_convertible<_Yp*, _Tp*>::value,
|
||||||
@@ -4711,7 +4744,7 @@ shared_ptr<_Tp>::reset(_Yp* __p)
|
|||||||
|
|
||||||
template<class _Tp>
|
template<class _Tp>
|
||||||
template<class _Yp, class _Dp>
|
template<class _Yp, class _Dp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
typename enable_if
|
typename enable_if
|
||||||
<
|
<
|
||||||
is_convertible<_Yp*, _Tp*>::value,
|
is_convertible<_Yp*, _Tp*>::value,
|
||||||
@@ -4724,7 +4757,7 @@ shared_ptr<_Tp>::reset(_Yp* __p, _Dp __d)
|
|||||||
|
|
||||||
template<class _Tp>
|
template<class _Tp>
|
||||||
template<class _Yp, class _Dp, class _Alloc>
|
template<class _Yp, class _Dp, class _Alloc>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
typename enable_if
|
typename enable_if
|
||||||
<
|
<
|
||||||
is_convertible<_Yp*, _Tp*>::value,
|
is_convertible<_Yp*, _Tp*>::value,
|
||||||
@@ -5041,23 +5074,27 @@ private:
|
|||||||
__shared_weak_count* __cntrl_;
|
__shared_weak_count* __cntrl_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
_LIBCPP_CONSTEXPR weak_ptr() _NOEXCEPT;
|
_LIBCPP_CONSTEXPR weak_ptr() _NOEXCEPT;
|
||||||
template<class _Yp> weak_ptr(shared_ptr<_Yp> const& __r,
|
template<class _Yp> _LIBCPP_INLINE_VISIBILITY weak_ptr(shared_ptr<_Yp> const& __r,
|
||||||
typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0)
|
typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0)
|
||||||
_NOEXCEPT;
|
_NOEXCEPT;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
weak_ptr(weak_ptr const& __r) _NOEXCEPT;
|
weak_ptr(weak_ptr const& __r) _NOEXCEPT;
|
||||||
template<class _Yp> weak_ptr(weak_ptr<_Yp> const& __r,
|
template<class _Yp> _LIBCPP_INLINE_VISIBILITY weak_ptr(weak_ptr<_Yp> const& __r,
|
||||||
typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0)
|
typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0)
|
||||||
_NOEXCEPT;
|
_NOEXCEPT;
|
||||||
|
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
weak_ptr(weak_ptr&& __r) _NOEXCEPT;
|
weak_ptr(weak_ptr&& __r) _NOEXCEPT;
|
||||||
template<class _Yp> weak_ptr(weak_ptr<_Yp>&& __r,
|
template<class _Yp> _LIBCPP_INLINE_VISIBILITY weak_ptr(weak_ptr<_Yp>&& __r,
|
||||||
typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0)
|
typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0)
|
||||||
_NOEXCEPT;
|
_NOEXCEPT;
|
||||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
~weak_ptr();
|
~weak_ptr();
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
weak_ptr& operator=(weak_ptr const& __r) _NOEXCEPT;
|
weak_ptr& operator=(weak_ptr const& __r) _NOEXCEPT;
|
||||||
template<class _Yp>
|
template<class _Yp>
|
||||||
typename enable_if
|
typename enable_if
|
||||||
@@ -5065,10 +5102,12 @@ public:
|
|||||||
is_convertible<_Yp*, element_type*>::value,
|
is_convertible<_Yp*, element_type*>::value,
|
||||||
weak_ptr&
|
weak_ptr&
|
||||||
>::type
|
>::type
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
operator=(weak_ptr<_Yp> const& __r) _NOEXCEPT;
|
operator=(weak_ptr<_Yp> const& __r) _NOEXCEPT;
|
||||||
|
|
||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
weak_ptr& operator=(weak_ptr&& __r) _NOEXCEPT;
|
weak_ptr& operator=(weak_ptr&& __r) _NOEXCEPT;
|
||||||
template<class _Yp>
|
template<class _Yp>
|
||||||
typename enable_if
|
typename enable_if
|
||||||
@@ -5076,6 +5115,7 @@ public:
|
|||||||
is_convertible<_Yp*, element_type*>::value,
|
is_convertible<_Yp*, element_type*>::value,
|
||||||
weak_ptr&
|
weak_ptr&
|
||||||
>::type
|
>::type
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
operator=(weak_ptr<_Yp>&& __r) _NOEXCEPT;
|
operator=(weak_ptr<_Yp>&& __r) _NOEXCEPT;
|
||||||
|
|
||||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
@@ -5086,9 +5126,12 @@ public:
|
|||||||
is_convertible<_Yp*, element_type*>::value,
|
is_convertible<_Yp*, element_type*>::value,
|
||||||
weak_ptr&
|
weak_ptr&
|
||||||
>::type
|
>::type
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
operator=(shared_ptr<_Yp> const& __r) _NOEXCEPT;
|
operator=(shared_ptr<_Yp> const& __r) _NOEXCEPT;
|
||||||
|
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void swap(weak_ptr& __r) _NOEXCEPT;
|
void swap(weak_ptr& __r) _NOEXCEPT;
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
void reset() _NOEXCEPT;
|
void reset() _NOEXCEPT;
|
||||||
|
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
@@ -5112,7 +5155,7 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
template<class _Tp>
|
template<class _Tp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
_LIBCPP_CONSTEXPR
|
_LIBCPP_CONSTEXPR
|
||||||
weak_ptr<_Tp>::weak_ptr() _NOEXCEPT
|
weak_ptr<_Tp>::weak_ptr() _NOEXCEPT
|
||||||
: __ptr_(0),
|
: __ptr_(0),
|
||||||
@@ -5121,7 +5164,7 @@ weak_ptr<_Tp>::weak_ptr() _NOEXCEPT
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<class _Tp>
|
template<class _Tp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
weak_ptr<_Tp>::weak_ptr(weak_ptr const& __r) _NOEXCEPT
|
weak_ptr<_Tp>::weak_ptr(weak_ptr const& __r) _NOEXCEPT
|
||||||
: __ptr_(__r.__ptr_),
|
: __ptr_(__r.__ptr_),
|
||||||
__cntrl_(__r.__cntrl_)
|
__cntrl_(__r.__cntrl_)
|
||||||
@@ -5132,7 +5175,7 @@ weak_ptr<_Tp>::weak_ptr(weak_ptr const& __r) _NOEXCEPT
|
|||||||
|
|
||||||
template<class _Tp>
|
template<class _Tp>
|
||||||
template<class _Yp>
|
template<class _Yp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
weak_ptr<_Tp>::weak_ptr(shared_ptr<_Yp> const& __r,
|
weak_ptr<_Tp>::weak_ptr(shared_ptr<_Yp> const& __r,
|
||||||
typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type)
|
typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type)
|
||||||
_NOEXCEPT
|
_NOEXCEPT
|
||||||
@@ -5145,7 +5188,7 @@ weak_ptr<_Tp>::weak_ptr(shared_ptr<_Yp> const& __r,
|
|||||||
|
|
||||||
template<class _Tp>
|
template<class _Tp>
|
||||||
template<class _Yp>
|
template<class _Yp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
weak_ptr<_Tp>::weak_ptr(weak_ptr<_Yp> const& __r,
|
weak_ptr<_Tp>::weak_ptr(weak_ptr<_Yp> const& __r,
|
||||||
typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type)
|
typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type)
|
||||||
_NOEXCEPT
|
_NOEXCEPT
|
||||||
@@ -5159,7 +5202,7 @@ weak_ptr<_Tp>::weak_ptr(weak_ptr<_Yp> const& __r,
|
|||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
|
||||||
template<class _Tp>
|
template<class _Tp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
weak_ptr<_Tp>::weak_ptr(weak_ptr&& __r) _NOEXCEPT
|
weak_ptr<_Tp>::weak_ptr(weak_ptr&& __r) _NOEXCEPT
|
||||||
: __ptr_(__r.__ptr_),
|
: __ptr_(__r.__ptr_),
|
||||||
__cntrl_(__r.__cntrl_)
|
__cntrl_(__r.__cntrl_)
|
||||||
@@ -5170,7 +5213,7 @@ weak_ptr<_Tp>::weak_ptr(weak_ptr&& __r) _NOEXCEPT
|
|||||||
|
|
||||||
template<class _Tp>
|
template<class _Tp>
|
||||||
template<class _Yp>
|
template<class _Yp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
weak_ptr<_Tp>::weak_ptr(weak_ptr<_Yp>&& __r,
|
weak_ptr<_Tp>::weak_ptr(weak_ptr<_Yp>&& __r,
|
||||||
typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type)
|
typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type)
|
||||||
_NOEXCEPT
|
_NOEXCEPT
|
||||||
@@ -5191,7 +5234,7 @@ weak_ptr<_Tp>::~weak_ptr()
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<class _Tp>
|
template<class _Tp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
weak_ptr<_Tp>&
|
weak_ptr<_Tp>&
|
||||||
weak_ptr<_Tp>::operator=(weak_ptr const& __r) _NOEXCEPT
|
weak_ptr<_Tp>::operator=(weak_ptr const& __r) _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -5201,7 +5244,7 @@ weak_ptr<_Tp>::operator=(weak_ptr const& __r) _NOEXCEPT
|
|||||||
|
|
||||||
template<class _Tp>
|
template<class _Tp>
|
||||||
template<class _Yp>
|
template<class _Yp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
typename enable_if
|
typename enable_if
|
||||||
<
|
<
|
||||||
is_convertible<_Yp*, _Tp*>::value,
|
is_convertible<_Yp*, _Tp*>::value,
|
||||||
@@ -5216,7 +5259,7 @@ weak_ptr<_Tp>::operator=(weak_ptr<_Yp> const& __r) _NOEXCEPT
|
|||||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||||
|
|
||||||
template<class _Tp>
|
template<class _Tp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
weak_ptr<_Tp>&
|
weak_ptr<_Tp>&
|
||||||
weak_ptr<_Tp>::operator=(weak_ptr&& __r) _NOEXCEPT
|
weak_ptr<_Tp>::operator=(weak_ptr&& __r) _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -5226,7 +5269,7 @@ weak_ptr<_Tp>::operator=(weak_ptr&& __r) _NOEXCEPT
|
|||||||
|
|
||||||
template<class _Tp>
|
template<class _Tp>
|
||||||
template<class _Yp>
|
template<class _Yp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
typename enable_if
|
typename enable_if
|
||||||
<
|
<
|
||||||
is_convertible<_Yp*, _Tp*>::value,
|
is_convertible<_Yp*, _Tp*>::value,
|
||||||
@@ -5242,7 +5285,7 @@ weak_ptr<_Tp>::operator=(weak_ptr<_Yp>&& __r) _NOEXCEPT
|
|||||||
|
|
||||||
template<class _Tp>
|
template<class _Tp>
|
||||||
template<class _Yp>
|
template<class _Yp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
typename enable_if
|
typename enable_if
|
||||||
<
|
<
|
||||||
is_convertible<_Yp*, _Tp*>::value,
|
is_convertible<_Yp*, _Tp*>::value,
|
||||||
@@ -5255,7 +5298,7 @@ weak_ptr<_Tp>::operator=(shared_ptr<_Yp> const& __r) _NOEXCEPT
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<class _Tp>
|
template<class _Tp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
weak_ptr<_Tp>::swap(weak_ptr& __r) _NOEXCEPT
|
weak_ptr<_Tp>::swap(weak_ptr& __r) _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -5272,7 +5315,7 @@ swap(weak_ptr<_Tp>& __x, weak_ptr<_Tp>& __y) _NOEXCEPT
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<class _Tp>
|
template<class _Tp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline
|
||||||
void
|
void
|
||||||
weak_ptr<_Tp>::reset() _NOEXCEPT
|
weak_ptr<_Tp>::reset() _NOEXCEPT
|
||||||
{
|
{
|
||||||
@@ -5305,7 +5348,11 @@ weak_ptr<_Tp>::lock() const _NOEXCEPT
|
|||||||
return __r;
|
return __r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if _LIBCPP_STD_VER > 14
|
||||||
|
template <class _Tp = void> struct owner_less;
|
||||||
|
#else
|
||||||
template <class _Tp> struct owner_less;
|
template <class _Tp> struct owner_less;
|
||||||
|
#endif
|
||||||
|
|
||||||
template <class _Tp>
|
template <class _Tp>
|
||||||
struct _LIBCPP_TYPE_VIS_ONLY owner_less<shared_ptr<_Tp> >
|
struct _LIBCPP_TYPE_VIS_ONLY owner_less<shared_ptr<_Tp> >
|
||||||
@@ -5339,6 +5386,30 @@ struct _LIBCPP_TYPE_VIS_ONLY owner_less<weak_ptr<_Tp> >
|
|||||||
{return __x.owner_before(__y);}
|
{return __x.owner_before(__y);}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if _LIBCPP_STD_VER > 14
|
||||||
|
template <>
|
||||||
|
struct _LIBCPP_TYPE_VIS_ONLY owner_less<void>
|
||||||
|
{
|
||||||
|
template <class _Tp, class _Up>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
bool operator()( shared_ptr<_Tp> const& __x, shared_ptr<_Up> const& __y) const
|
||||||
|
{return __x.owner_before(__y);}
|
||||||
|
template <class _Tp, class _Up>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
bool operator()( shared_ptr<_Tp> const& __x, weak_ptr<_Up> const& __y) const
|
||||||
|
{return __x.owner_before(__y);}
|
||||||
|
template <class _Tp, class _Up>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Up> const& __y) const
|
||||||
|
{return __x.owner_before(__y);}
|
||||||
|
template <class _Tp, class _Up>
|
||||||
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
|
bool operator()( weak_ptr<_Tp> const& __x, weak_ptr<_Up> const& __y) const
|
||||||
|
{return __x.owner_before(__y);}
|
||||||
|
typedef void is_transparent;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
template<class _Tp>
|
template<class _Tp>
|
||||||
class _LIBCPP_TYPE_VIS_ONLY enable_shared_from_this
|
class _LIBCPP_TYPE_VIS_ONLY enable_shared_from_this
|
||||||
{
|
{
|
||||||
@@ -5381,7 +5452,9 @@ inline _LIBCPP_INLINE_VISIBILITY
|
|||||||
basic_ostream<_CharT, _Traits>&
|
basic_ostream<_CharT, _Traits>&
|
||||||
operator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Yp> const& __p);
|
operator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Yp> const& __p);
|
||||||
|
|
||||||
#if __has_feature(cxx_atomic) && !defined(_LIBCPP_HAS_NO_THREADS)
|
// TODO(EricWF): Enable this for both Clang and GCC. Currently it is only
|
||||||
|
// enabled with clang.
|
||||||
|
#if defined(_LIBCPP_HAS_C_ATOMIC_IMP) && !defined(_LIBCPP_HAS_NO_THREADS)
|
||||||
|
|
||||||
class _LIBCPP_TYPE_VIS __sp_mut
|
class _LIBCPP_TYPE_VIS __sp_mut
|
||||||
{
|
{
|
||||||
@@ -5468,14 +5541,17 @@ template <class _Tp>
|
|||||||
bool
|
bool
|
||||||
atomic_compare_exchange_strong(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v, shared_ptr<_Tp> __w)
|
atomic_compare_exchange_strong(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v, shared_ptr<_Tp> __w)
|
||||||
{
|
{
|
||||||
|
shared_ptr<_Tp> __temp;
|
||||||
__sp_mut& __m = __get_sp_mut(__p);
|
__sp_mut& __m = __get_sp_mut(__p);
|
||||||
__m.lock();
|
__m.lock();
|
||||||
if (__p->__owner_equivalent(*__v))
|
if (__p->__owner_equivalent(*__v))
|
||||||
{
|
{
|
||||||
|
_VSTD::swap(__temp, *__p);
|
||||||
*__p = __w;
|
*__p = __w;
|
||||||
__m.unlock();
|
__m.unlock();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
_VSTD::swap(__temp, *__v);
|
||||||
*__v = *__p;
|
*__v = *__p;
|
||||||
__m.unlock();
|
__m.unlock();
|
||||||
return false;
|
return false;
|
||||||
@@ -5507,7 +5583,7 @@ atomic_compare_exchange_weak_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v
|
|||||||
return atomic_compare_exchange_weak(__p, __v, __w);
|
return atomic_compare_exchange_weak(__p, __v, __w);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // __has_feature(cxx_atomic) && !defined(_LIBCPP_HAS_NO_THREADS)
|
#endif // defined(_LIBCPP_HAS_C_ATOMIC_IMP) && !defined(_LIBCPP_HAS_NO_THREADS)
|
||||||
|
|
||||||
//enum class
|
//enum class
|
||||||
struct _LIBCPP_TYPE_VIS pointer_safety
|
struct _LIBCPP_TYPE_VIS pointer_safety
|
||||||
@@ -5545,7 +5621,7 @@ _LIBCPP_FUNC_VIS void* align(size_t __align, size_t __sz, void*& __ptr, size_t&
|
|||||||
|
|
||||||
// --- Helper for container swap --
|
// --- Helper for container swap --
|
||||||
template <typename _Alloc>
|
template <typename _Alloc>
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
void __swap_allocator(_Alloc & __a1, _Alloc & __a2)
|
void __swap_allocator(_Alloc & __a1, _Alloc & __a2)
|
||||||
#if _LIBCPP_STD_VER >= 14
|
#if _LIBCPP_STD_VER >= 14
|
||||||
_NOEXCEPT
|
_NOEXCEPT
|
||||||
@@ -5571,9 +5647,18 @@ void __swap_allocator(_Alloc & __a1, _Alloc & __a2, true_type)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename _Alloc>
|
template <typename _Alloc>
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
void __swap_allocator(_Alloc &, _Alloc &, false_type) _NOEXCEPT {}
|
void __swap_allocator(_Alloc &, _Alloc &, false_type) _NOEXCEPT {}
|
||||||
|
|
||||||
|
template <typename _Alloc, typename _Traits=allocator_traits<_Alloc> >
|
||||||
|
struct __noexcept_move_assign_container : public integral_constant<bool,
|
||||||
|
_Traits::propagate_on_container_move_assignment::value
|
||||||
|
#if _LIBCPP_STD_VER > 14
|
||||||
|
|| _Traits::is_always_equal::value
|
||||||
|
#else
|
||||||
|
&& is_nothrow_move_assignable<_Alloc>::value
|
||||||
|
#endif
|
||||||
|
> {};
|
||||||
|
|
||||||
_LIBCPP_END_NAMESPACE_STD
|
_LIBCPP_END_NAMESPACE_STD
|
||||||
|
|
||||||
|
|||||||
@@ -455,9 +455,13 @@ module std [system] {
|
|||||||
export *
|
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.
|
// FIXME: These should be private.
|
||||||
module __bit_reference { header "__bit_reference" export * }
|
module __bit_reference { header "__bit_reference" export * }
|
||||||
module __config { header "__config" export * }
|
|
||||||
module __debug { header "__debug" export * }
|
module __debug { header "__debug" export * }
|
||||||
module __functional_base { header "__functional_base" export * }
|
module __functional_base { header "__functional_base" export * }
|
||||||
module __hash_table { header "__hash_table" export * }
|
module __hash_table { header "__hash_table" export * }
|
||||||
|
|||||||
@@ -179,7 +179,7 @@ template<class Callable, class ...Args>
|
|||||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
#endif
|
#endif
|
||||||
#include <sched.h>
|
#include <__threading_support>
|
||||||
|
|
||||||
#include <__undef_min_max>
|
#include <__undef_min_max>
|
||||||
|
|
||||||
@@ -193,7 +193,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD
|
|||||||
|
|
||||||
class _LIBCPP_TYPE_VIS recursive_mutex
|
class _LIBCPP_TYPE_VIS recursive_mutex
|
||||||
{
|
{
|
||||||
pthread_mutex_t __m_;
|
__libcpp_mutex_t __m_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
recursive_mutex();
|
recursive_mutex();
|
||||||
@@ -208,7 +208,7 @@ public:
|
|||||||
bool try_lock() _NOEXCEPT;
|
bool try_lock() _NOEXCEPT;
|
||||||
void unlock() _NOEXCEPT;
|
void unlock() _NOEXCEPT;
|
||||||
|
|
||||||
typedef pthread_mutex_t* native_handle_type;
|
typedef __libcpp_mutex_t* native_handle_type;
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
native_handle_type native_handle() {return &__m_;}
|
native_handle_type native_handle() {return &__m_;}
|
||||||
};
|
};
|
||||||
@@ -260,7 +260,7 @@ class _LIBCPP_TYPE_VIS recursive_timed_mutex
|
|||||||
mutex __m_;
|
mutex __m_;
|
||||||
condition_variable __cv_;
|
condition_variable __cv_;
|
||||||
size_t __count_;
|
size_t __count_;
|
||||||
pthread_t __id_;
|
__libcpp_thread_id __id_;
|
||||||
public:
|
public:
|
||||||
recursive_timed_mutex();
|
recursive_timed_mutex();
|
||||||
~recursive_timed_mutex();
|
~recursive_timed_mutex();
|
||||||
@@ -286,9 +286,9 @@ bool
|
|||||||
recursive_timed_mutex::try_lock_until(const chrono::time_point<_Clock, _Duration>& __t)
|
recursive_timed_mutex::try_lock_until(const chrono::time_point<_Clock, _Duration>& __t)
|
||||||
{
|
{
|
||||||
using namespace chrono;
|
using namespace chrono;
|
||||||
pthread_t __id = pthread_self();
|
__libcpp_thread_id __id = __libcpp_thread_get_current_id();
|
||||||
unique_lock<mutex> lk(__m_);
|
unique_lock<mutex> lk(__m_);
|
||||||
if (pthread_equal(__id, __id_))
|
if (__libcpp_thread_id_equal(__id, __id_))
|
||||||
{
|
{
|
||||||
if (__count_ == numeric_limits<size_t>::max())
|
if (__count_ == numeric_limits<size_t>::max())
|
||||||
return false;
|
return false;
|
||||||
@@ -360,7 +360,7 @@ lock(_L0& __l0, _L1& __l1)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sched_yield();
|
__libcpp_thread_yield();
|
||||||
{
|
{
|
||||||
unique_lock<_L1> __u1(__l1);
|
unique_lock<_L1> __u1(__l1);
|
||||||
if (__l0.try_lock())
|
if (__l0.try_lock())
|
||||||
@@ -369,7 +369,7 @@ lock(_L0& __l0, _L1& __l1)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sched_yield();
|
__libcpp_thread_yield();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -394,7 +394,7 @@ __lock_first(int __i, _L0& __l0, _L1& __l1, _L2& __l2, _L3& ...__l3)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
++__i;
|
++__i;
|
||||||
sched_yield();
|
__libcpp_thread_yield();
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
{
|
{
|
||||||
@@ -410,7 +410,7 @@ __lock_first(int __i, _L0& __l0, _L1& __l1, _L2& __l2, _L3& ...__l3)
|
|||||||
__i = 0;
|
__i = 0;
|
||||||
else
|
else
|
||||||
__i += 2;
|
__i += 2;
|
||||||
sched_yield();
|
__libcpp_thread_yield();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
__lock_first(__i - 2, __l2, __l3..., __l0, __l1);
|
__lock_first(__i - 2, __l2, __l3..., __l0, __l1);
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user