Compare commits
483 Commits
release_32
...
release_34
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
532b0b423c | ||
|
|
8070ded699 | ||
|
|
59a3ba57d0 | ||
|
|
e356070e1a | ||
|
|
971d716332 | ||
|
|
efe0484110 | ||
|
|
306553d2b0 | ||
|
|
f01e998923 | ||
|
|
ea97ae3eed | ||
|
|
81241a9440 | ||
|
|
15c04bedad | ||
|
|
35080eae90 | ||
|
|
1823bea43a | ||
|
|
c26c385592 | ||
|
|
0cdbe60481 | ||
|
|
ec5714f27a | ||
|
|
c4962b3f44 | ||
|
|
65173fee34 | ||
|
|
0c6a583e2a | ||
|
|
6b7c2aeb00 | ||
|
|
525a0fb982 | ||
|
|
3f81e9eeba | ||
|
|
a46a0ad9e5 | ||
|
|
29250b7ec8 | ||
|
|
fe2a561fca | ||
|
|
3de5086dc7 | ||
|
|
ecc8d7b334 | ||
|
|
5ffe591d55 | ||
|
|
3b3108ec59 | ||
|
|
d8a8f57387 | ||
|
|
ad2a600c2a | ||
|
|
76a8670ce4 | ||
|
|
09f8550e1c | ||
|
|
4259337da2 | ||
|
|
65ccddb341 | ||
|
|
0f7afe7b8e | ||
|
|
33ae2337e2 | ||
|
|
a36451371c | ||
|
|
8a43fca8ed | ||
|
|
0ac5cce17c | ||
|
|
aa87532fee | ||
|
|
71b52152a9 | ||
|
|
9de3d4cab3 | ||
|
|
0f91166ef8 | ||
|
|
61a8422ffa | ||
|
|
5f2d5b95e6 | ||
|
|
206ce1faaf | ||
|
|
1206720869 | ||
|
|
b8dd5caf5a | ||
|
|
dab89a1412 | ||
|
|
16f13a0b84 | ||
|
|
3f433cdb8e | ||
|
|
4a0555a9d4 | ||
|
|
ece95914ac | ||
|
|
d0d308f54b | ||
|
|
40455c65da | ||
|
|
ae2b90b86d | ||
|
|
e064055942 | ||
|
|
35a98a00b3 | ||
|
|
2bcdf5e9a0 | ||
|
|
de3cac777d | ||
|
|
69bf761909 | ||
|
|
2faa02fc3d | ||
|
|
79d8c99a62 | ||
|
|
320c80fecf | ||
|
|
8d9dd7a968 | ||
|
|
1d927e38d1 | ||
|
|
520dc52b4a | ||
|
|
adb73b1701 | ||
|
|
5a8b5783f8 | ||
|
|
9844b6796b | ||
|
|
1e564246ec | ||
|
|
f677bc4165 | ||
|
|
f7555069ab | ||
|
|
66a8fcecd9 | ||
|
|
8df0320334 | ||
|
|
4c81b00f75 | ||
|
|
f7eb5738f6 | ||
|
|
19e7862eb8 | ||
|
|
bd444af850 | ||
|
|
ff7546e974 | ||
|
|
179fa78da3 | ||
|
|
9738cafa4f | ||
|
|
6db12cb037 | ||
|
|
4af78bb10b | ||
|
|
42389d214f | ||
|
|
cb55b18fa9 | ||
|
|
91008752ed | ||
|
|
d1754fb3e9 | ||
|
|
fc910cb9a0 | ||
|
|
de589f2f8f | ||
|
|
dcc6a0bc44 | ||
|
|
0836f87fb9 | ||
|
|
23e470c348 | ||
|
|
ba898e4208 | ||
|
|
8127758024 | ||
|
|
bd64f140d4 | ||
|
|
ef5aa93b9c | ||
|
|
cd942f1840 | ||
|
|
a49a2c9deb | ||
|
|
37c4acfe5e | ||
|
|
d885143d5c | ||
|
|
6ecf7f2d54 | ||
|
|
94d3f6b518 | ||
|
|
27a1c252e3 | ||
|
|
f4107076e4 | ||
|
|
6dff618d7d | ||
|
|
599e60d2f7 | ||
|
|
f9d2680e19 | ||
|
|
7f9f52e6c6 | ||
|
|
49d596d412 | ||
|
|
24a7e331f1 | ||
|
|
e00f53bcfb | ||
|
|
6398343bfc | ||
|
|
ac04e1f5bf | ||
|
|
955f2c88a1 | ||
|
|
ab04aadaf4 | ||
|
|
62f34be0ba | ||
|
|
058655b28a | ||
|
|
f2a137d360 | ||
|
|
656ed3ca8d | ||
|
|
2a258956b0 | ||
|
|
9e613ca1b3 | ||
|
|
1b5f3adcef | ||
|
|
85bbdcdad4 | ||
|
|
05fe12bc44 | ||
|
|
01afa5c6e4 | ||
|
|
c64c980140 | ||
|
|
8a1fc89cf9 | ||
|
|
8ecb95fdec | ||
|
|
713f4db2e5 | ||
|
|
9e9d076879 | ||
|
|
d179407288 | ||
|
|
cb0e6b65a8 | ||
|
|
09da3c053c | ||
|
|
161a9bf447 | ||
|
|
5143722d14 | ||
|
|
04a2c71d67 | ||
|
|
24bf4b8597 | ||
|
|
a96d22b85d | ||
|
|
1c2e46bd56 | ||
|
|
a78b369b66 | ||
|
|
08b4f3f99b | ||
|
|
83179a788f | ||
|
|
5f36c68cb0 | ||
|
|
e42f184a76 | ||
|
|
af74651f61 | ||
|
|
5ec0ff81ce | ||
|
|
e1c5f9ec1b | ||
|
|
bce2a4752a | ||
|
|
fc3f80badf | ||
|
|
5e57142c59 | ||
|
|
5d5f9f9786 | ||
|
|
499cea12bb | ||
|
|
e31c432a33 | ||
|
|
5b7519eb15 | ||
|
|
641d3d8b4c | ||
|
|
9a894d93de | ||
|
|
1c44f51de7 | ||
|
|
8a1df3ca0c | ||
|
|
d7cddf6519 | ||
|
|
585b48ddf6 | ||
|
|
5c316a6d04 | ||
|
|
2a34052dac | ||
|
|
802daf6e16 | ||
|
|
cd17d90cbb | ||
|
|
78afc05b45 | ||
|
|
9c07b14797 | ||
|
|
de8fc6b2b1 | ||
|
|
7f76450ee9 | ||
|
|
3e005bf6b2 | ||
|
|
811e7130db | ||
|
|
e75599557a | ||
|
|
9b86fc17a0 | ||
|
|
68b4025292 | ||
|
|
2df3700879 | ||
|
|
198a2a59ee | ||
|
|
bf6eda0b1e | ||
|
|
5da3087628 | ||
|
|
5cfc6ab2b8 | ||
|
|
23d1ccc3dc | ||
|
|
6ef840818d | ||
|
|
0931015f01 | ||
|
|
83e40c4a80 | ||
|
|
8634fc5494 | ||
|
|
6b229e1ad1 | ||
|
|
deb471c3c6 | ||
|
|
437cdcf813 | ||
|
|
5d4807742f | ||
|
|
7a4e374280 | ||
|
|
4a0a98166c | ||
|
|
0f678bd69e | ||
|
|
80e19ac90f | ||
|
|
5ea5d31f6d | ||
|
|
bd7b48a628 | ||
|
|
051c848e88 | ||
|
|
a4e87abbb9 | ||
|
|
a709c823f7 | ||
|
|
70730d8f1c | ||
|
|
d8bfe7ba56 | ||
|
|
193ef03eb5 | ||
|
|
b92ee614f2 | ||
|
|
52ad482edc | ||
|
|
0f164c9d75 | ||
|
|
36ba399a33 | ||
|
|
ab61b2c9f1 | ||
|
|
f68b46f0c9 | ||
|
|
32c0969361 | ||
|
|
c29e1b949c | ||
|
|
f9c29e160c | ||
|
|
5a11f94583 | ||
|
|
65d2e6a392 | ||
|
|
824c19963e | ||
|
|
8b00e6c960 | ||
|
|
e9df0a5c6c | ||
|
|
56dcf0b809 | ||
|
|
eb34122153 | ||
|
|
a61e6f8705 | ||
|
|
0777473911 | ||
|
|
832b304076 | ||
|
|
f890d9bfaa | ||
|
|
0bb0a7c9ea | ||
|
|
d5bfe9030f | ||
|
|
ff46409221 | ||
|
|
b87922c2c5 | ||
|
|
f182038521 | ||
|
|
39213641f4 | ||
|
|
152343260f | ||
|
|
cd59accbf5 | ||
|
|
ed14a76beb | ||
|
|
01fbfc2fa6 | ||
|
|
b8e0d9086e | ||
|
|
da0a0e8a1b | ||
|
|
8fc4f5a251 | ||
|
|
f7777e8554 | ||
|
|
206f6cdc33 | ||
|
|
01a0e90783 | ||
|
|
1e1d05121d | ||
|
|
1f96a4df58 | ||
|
|
ac93d0ebf2 | ||
|
|
e8029e54f1 | ||
|
|
ef7a7b730c | ||
|
|
e840208989 | ||
|
|
37c17ed07d | ||
|
|
809e93f7f2 | ||
|
|
7670f7d1ed | ||
|
|
171771a9f5 | ||
|
|
e2735d1df0 | ||
|
|
d29bb4b7c4 | ||
|
|
0769e6a785 | ||
|
|
d712a59c7f | ||
|
|
9b128e06ed | ||
|
|
b66e1c3f96 | ||
|
|
e008d4eecc | ||
|
|
4dca0440f5 | ||
|
|
933afa9761 | ||
|
|
42e55e932e | ||
|
|
24ae8f8e5b | ||
|
|
fb5511027b | ||
|
|
9a06b9d017 | ||
|
|
4573565de0 | ||
|
|
839ae58c2e | ||
|
|
6a683bfb5f | ||
|
|
725ae713f2 | ||
|
|
dbc8cf059e | ||
|
|
eaffd0a8ff | ||
|
|
fd7481e96d | ||
|
|
7ec46bc422 | ||
|
|
11b87182b0 | ||
|
|
099dec1ba0 | ||
|
|
c05e98660f | ||
|
|
312926eed4 | ||
|
|
09ca5d49e1 | ||
|
|
a9602d56de | ||
|
|
f491e51ebd | ||
|
|
ab135d7f4e | ||
|
|
c1ecd97f00 | ||
|
|
e57b7c445b | ||
|
|
918f2a80ab | ||
|
|
b9d9fb4a17 | ||
|
|
9dcdcdee25 | ||
|
|
2c39cbe020 | ||
|
|
29f7432ff3 | ||
|
|
81381a932f | ||
|
|
c7a39cf584 | ||
|
|
fcd8db7133 | ||
|
|
7a6b7cedcb | ||
|
|
70342b99e2 | ||
|
|
ee749a403c | ||
|
|
9360e9f944 | ||
|
|
ddb4e4cbb1 | ||
|
|
8f72d5ce16 | ||
|
|
a71a952634 | ||
|
|
67444034ed | ||
|
|
9e98b34a8c | ||
|
|
6287c65a03 | ||
|
|
e27e907403 | ||
|
|
b3585e8226 | ||
|
|
bb3a0acf93 | ||
|
|
9f8f524541 | ||
|
|
be764c946c | ||
|
|
b30abdd07a | ||
|
|
5328cd307c | ||
|
|
a7f5c1bcd8 | ||
|
|
ecc9742f27 | ||
|
|
5f1286f574 | ||
|
|
dd854b2c4e | ||
|
|
8c23819220 | ||
|
|
74f4da7219 | ||
|
|
e58bc12f2a | ||
|
|
34cb066fa2 | ||
|
|
63d8f7e341 | ||
|
|
15467189c3 | ||
|
|
867deb8e06 | ||
|
|
155f06018e | ||
|
|
a9b94f1337 | ||
|
|
912438c272 | ||
|
|
d3b5b6b9f4 | ||
|
|
006ab1e213 | ||
|
|
df4182153c | ||
|
|
a5f0e6c5c1 | ||
|
|
05e7d24b3d | ||
|
|
c5e6aa5f5c | ||
|
|
f9e75aef34 | ||
|
|
9493e27c0f | ||
|
|
c52fb8d7bf | ||
|
|
9c2ce95063 | ||
|
|
08dd25303e | ||
|
|
5544f7e0c7 | ||
|
|
b4e67cfd42 | ||
|
|
2062f37772 | ||
|
|
61fe0ac9b3 | ||
|
|
4313ec3975 | ||
|
|
ae57a1ab1d | ||
|
|
993248935c | ||
|
|
4f67100219 | ||
|
|
a5733b3ad3 | ||
|
|
0795931dee | ||
|
|
6dcaf3ee1a | ||
|
|
e1e96cb840 | ||
|
|
79a35570a5 | ||
|
|
128f7bf4fa | ||
|
|
c5e8961a35 | ||
|
|
4aa8b06e67 | ||
|
|
cf31d3864e | ||
|
|
b777d6a4b2 | ||
|
|
11a50ac497 | ||
|
|
d4c96a6c89 | ||
|
|
f6bdda044c | ||
|
|
a1985ebbc8 | ||
|
|
9d00ed5d87 | ||
|
|
fc2f021bdd | ||
|
|
8b25c00ef1 | ||
|
|
302fa82a1c | ||
|
|
db4d478ff4 | ||
|
|
742fecbd2a | ||
|
|
2c0d3edf68 | ||
|
|
34d36f39b0 | ||
|
|
32d40f5f44 | ||
|
|
02d5e18917 | ||
|
|
d1c0082675 | ||
|
|
c3a9b81e67 | ||
|
|
3fbd1dfb24 | ||
|
|
d9cdb2dcfd | ||
|
|
782da33d1c | ||
|
|
c1ca2e1e8b | ||
|
|
295891fdc2 | ||
|
|
0d01eb54e7 | ||
|
|
f5f4684e71 | ||
|
|
ae7bf9daac | ||
|
|
9976b5511a | ||
|
|
06d8bf6ce2 | ||
|
|
9b145da078 | ||
|
|
04bd79b23a | ||
|
|
bdea27ba8f | ||
|
|
b74309e3ad | ||
|
|
903439f735 | ||
|
|
c19fe86743 | ||
|
|
53e2763966 | ||
|
|
dab9b2eb32 | ||
|
|
dece7fe670 | ||
|
|
a22d2addb1 | ||
|
|
e33c2d1926 | ||
|
|
e47bc9bc4f | ||
|
|
c7cbe502db | ||
|
|
c789025a5a | ||
|
|
6319f1462d | ||
|
|
23fb972520 | ||
|
|
707f318787 | ||
|
|
83eade6abb | ||
|
|
cc7bdae931 | ||
|
|
3101474720 | ||
|
|
11a31d0583 | ||
|
|
fae54b9c14 | ||
|
|
4a0e74fff8 | ||
|
|
0560f786fe | ||
|
|
76aa2ef017 | ||
|
|
0dee9cd5ad | ||
|
|
3bc6a98c3e | ||
|
|
6b875ef374 | ||
|
|
af4d161908 | ||
|
|
af69f47e86 | ||
|
|
b85dea35b0 | ||
|
|
8eba41324c | ||
|
|
1608b64881 | ||
|
|
fe14b970ac | ||
|
|
5920cfc403 | ||
|
|
b18165e704 | ||
|
|
d854ce6bfa | ||
|
|
9ae96d0f21 | ||
|
|
635bbbb6d1 | ||
|
|
46c49d19aa | ||
|
|
88c3190d6c | ||
|
|
6afc7ad3eb | ||
|
|
fd329a445e | ||
|
|
b73568dc24 | ||
|
|
66a48c5ad5 | ||
|
|
7fa0ca75e5 | ||
|
|
88dec1ef5c | ||
|
|
6b8b9922f0 | ||
|
|
cedb7fcc10 | ||
|
|
a38e2c9d1a | ||
|
|
5f4841fb83 | ||
|
|
43807c2fba | ||
|
|
4cceb7a5e8 | ||
|
|
8b9eee35d8 | ||
|
|
548d392d5d | ||
|
|
c8e1889601 | ||
|
|
edfb05351e | ||
|
|
aac8dd8331 | ||
|
|
a5b51964c1 | ||
|
|
81d1ef7a3f | ||
|
|
cccf25579a | ||
|
|
54e2fff2e1 | ||
|
|
e0f0bfb5e6 | ||
|
|
7173a501bb | ||
|
|
7b9d6a8d40 | ||
|
|
78f0de22db | ||
|
|
5ce391e336 | ||
|
|
0b93963db7 | ||
|
|
b05a55675f | ||
|
|
1b031c947f | ||
|
|
3e3ae9ec41 | ||
|
|
b4ebb0e415 | ||
|
|
750039f50c | ||
|
|
f619e230cc | ||
|
|
304c31b355 | ||
|
|
83e2c4d877 | ||
|
|
6ae47055f9 | ||
|
|
8226d0b7c5 | ||
|
|
239e341c94 | ||
|
|
ba1920fe4b | ||
|
|
002a984948 | ||
|
|
159b9ba4ce | ||
|
|
0e0bc1cfe8 | ||
|
|
352bd3a273 | ||
|
|
db8a030bd3 | ||
|
|
ed9f69d342 | ||
|
|
bbda4db0d5 | ||
|
|
d1a7479763 | ||
|
|
21772ec063 | ||
|
|
2328902ab1 | ||
|
|
5f767b7b28 | ||
|
|
bf68bdc4ed | ||
|
|
0aa900e94f | ||
|
|
c6e54b964f | ||
|
|
27c836ff3a | ||
|
|
3793a7d202 | ||
|
|
ee717d8c44 | ||
|
|
b2f2b68143 | ||
|
|
a46482e8bb | ||
|
|
3d4f92c08a | ||
|
|
0a69fa14d2 | ||
|
|
7fa77a701f | ||
|
|
a358fbe504 | ||
|
|
53008d8b0c | ||
|
|
af01e708aa | ||
|
|
b0895ff8ae | ||
|
|
641f6c1f65 | ||
|
|
8a9c5ea750 | ||
|
|
984f10fdc0 | ||
|
|
537b2fa6b8 | ||
|
|
faa17162e9 |
4
.arcconfig
Normal file
4
.arcconfig
Normal file
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"project_id" : "libcxx",
|
||||
"conduit_uri" : "http://llvm-reviews.chandlerc.com/"
|
||||
}
|
||||
127
CMakeLists.txt
127
CMakeLists.txt
@@ -14,9 +14,9 @@ set(PACKAGE_BUGREPORT "llvmbugs@cs.uiuc.edu")
|
||||
|
||||
# Add path for custom modules
|
||||
set(CMAKE_MODULE_PATH
|
||||
${CMAKE_MODULE_PATH}
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/cmake"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules"
|
||||
${CMAKE_MODULE_PATH}
|
||||
)
|
||||
|
||||
# Require out of source build.
|
||||
@@ -26,6 +26,10 @@ MACRO_ENSURE_OUT_OF_SOURCE_BUILD(
|
||||
build directory and run 'cmake /path/to/${PROJECT_NAME} [options]' there."
|
||||
)
|
||||
|
||||
if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
|
||||
set(LIBCXX_BUILT_STANDALONE 1)
|
||||
endif()
|
||||
|
||||
#===============================================================================
|
||||
# Setup CMake Options
|
||||
#===============================================================================
|
||||
@@ -38,6 +42,15 @@ option(LIBCXX_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
|
||||
option(LIBCXX_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
|
||||
option(LIBCXX_ENABLE_CXX0X "Enable -std=c++0x and use of c++0x language features if the compiler supports it." ON)
|
||||
option(LIBCXX_ENABLE_SHARED "Build libc++ as a shared library." ON)
|
||||
option(LIBCXX_INSTALL_SUPPORT_HEADERS "Install libc++ support headers." ON)
|
||||
|
||||
set(CXXABIS none libcxxabi libcxxrt libstdc++ libsupc++)
|
||||
if (NOT DEFINED LIBCXX_CXX_ABI)
|
||||
set(LIBCXX_CXX_ABI "none")
|
||||
endif()
|
||||
set(LIBCXX_CXX_ABI "${LIBCXX_CXX_ABI}" CACHE STRING
|
||||
"Specify C++ ABI library to use." FORCE)
|
||||
set_property(CACHE LIBCXX_CXX_ABI PROPERTY STRINGS ;${CXXABIS})
|
||||
|
||||
#===============================================================================
|
||||
# Configure System
|
||||
@@ -58,6 +71,100 @@ get_target_triple(LIBCXX_TARGET_TRIPLE
|
||||
)
|
||||
set(LIBCXX_TARGET_TRIPLE ${LIBCXX_TARGET_TRIPLE} CACHE STRING "Target triple.")
|
||||
|
||||
#===============================================================================
|
||||
# Add an ABI library if appropriate
|
||||
#===============================================================================
|
||||
|
||||
#
|
||||
# _setup_abi: Set up the build to use an ABI library
|
||||
#
|
||||
# Parameters:
|
||||
# abidefines: A list of defines needed to compile libc++ with the ABI library
|
||||
# abilibs : A list of libraries to link against
|
||||
# abifiles : A list of files (which may be relative paths) to copy into the
|
||||
# libc++ build tree for the build. These files will also be
|
||||
# installed alongside the libc++ headers.
|
||||
# abidirs : A list of relative paths to create under an include directory
|
||||
# in the libc++ build directory.
|
||||
#
|
||||
macro(setup_abi_lib abipathvar abidefines abilibs abifiles abidirs)
|
||||
list(APPEND LIBCXX_CXX_FEATURE_FLAGS ${abidefines})
|
||||
set(${abipathvar} "${${abipathvar}}"
|
||||
CACHE STRINGS
|
||||
"Paths to ABI include directories separate by ';'."
|
||||
)
|
||||
set(LIBCXX_CXX_ABI_LIBRARIES ${abilibs})
|
||||
set(LIBCXX_ABILIB_FILES ${abifiles})
|
||||
file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/include")
|
||||
foreach(_d ${abidirs})
|
||||
file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/include/${_d}")
|
||||
endforeach()
|
||||
set(LIBCXX_ABILIB_FILE_PATHS)
|
||||
foreach(fpath ${LIBCXX_ABILIB_FILES})
|
||||
set(found FALSE)
|
||||
foreach(incpath ${${abipathvar}})
|
||||
if (EXISTS "${incpath}/${fpath}")
|
||||
set(found TRUE)
|
||||
get_filename_component(dstdir ${fpath} PATH)
|
||||
get_filename_component(ifile ${fpath} NAME)
|
||||
add_custom_command(
|
||||
OUTPUT "${CMAKE_BINARY_DIR}/include/${dstdir}/${ifile}"
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
||||
"${incpath}/${fpath}"
|
||||
"${CMAKE_BINARY_DIR}/include/${dstdir}"
|
||||
MAIN_DEPENDENCY "${incpath}/${fpath}"
|
||||
)
|
||||
list(APPEND LIBCXX_CXX_ABI_DEPS
|
||||
"${CMAKE_BINARY_DIR}/include/${dstdir}/${ifile}"
|
||||
)
|
||||
endif()
|
||||
endforeach()
|
||||
if (NOT found)
|
||||
message(FATAL_ERROR "Failed to find ${fpath}")
|
||||
endif()
|
||||
endforeach()
|
||||
add_custom_target(abilib_headers DEPENDS ${LIBCXX_CXX_ABI_DEPS})
|
||||
set(LIBCXX_CXX_ABI_DEPS abilib_headers)
|
||||
include_directories("${CMAKE_BINARY_DIR}/include")
|
||||
install(DIRECTORY "${CMAKE_BINARY_DIR}/include/"
|
||||
DESTINATION include/c++/v1
|
||||
FILES_MATCHING
|
||||
PATTERN "*"
|
||||
)
|
||||
endmacro()
|
||||
|
||||
if ("${LIBCXX_CXX_ABI}" STREQUAL "libstdc++" OR
|
||||
"${LIBCXX_CXX_ABI}" STREQUAL "libsupc++")
|
||||
set(_LIBSUPCXX_INCLUDE_FILES
|
||||
cxxabi.h bits/c++config.h bits/os_defines.h bits/cpu_defines.h
|
||||
bits/cxxabi_tweaks.h bits/cxxabi_forced.h
|
||||
)
|
||||
if ("${LIBCXX_CXX_ABI}" STREQUAL "libstdc++")
|
||||
set(_LIBSUPCXX_DEFINES "-DLIBSTDCXX")
|
||||
set(_LIBSUPCXX_LIBNAME stdc++)
|
||||
else()
|
||||
set(_LIBSUPCXX_DEFINES "")
|
||||
set(_LIBSUPCXX_LIBNAME supc++)
|
||||
endif()
|
||||
setup_abi_lib("LIBCXX_LIBSUPCXX_INCLUDE_PATHS"
|
||||
"-D__GLIBCXX__ ${_LIBSUPCXX_DEFINES}"
|
||||
"${_LIBSUPCXX_LIBNAME}" "${_LIBSUPCXX_INCLUDE_FILES}" "bits"
|
||||
)
|
||||
elseif ("${LIBCXX_CXX_ABI}" STREQUAL "libcxxabi")
|
||||
setup_abi_lib("LIBCXX_LIBCXXABI_INCLUDE_PATHS" ""
|
||||
"c++abi" "cxxabi.h" ""
|
||||
)
|
||||
elseif ("${LIBCXX_CXX_ABI}" STREQUAL "libcxxrt")
|
||||
setup_abi_lib("LIBCXX_LIBCXXRT_INCLUDE_PATHS" "-DLIBCXXRT"
|
||||
"cxxrt" "cxxabi.h;unwind.h;unwind-arm.h;unwind-itanium.h" ""
|
||||
)
|
||||
elseif (NOT "${LIBCXX_CXX_ABI}" STREQUAL "none")
|
||||
message(FATAL_ERROR
|
||||
"Currently libstdc++, libsupc++, libcxxabi, libcxxrt and none are "
|
||||
"supported for c++ abi."
|
||||
)
|
||||
endif ()
|
||||
|
||||
# Configure compiler.
|
||||
include(config-ix)
|
||||
|
||||
@@ -87,7 +194,11 @@ macro(append_if list condition var)
|
||||
endmacro()
|
||||
|
||||
# Get warning flags
|
||||
append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_WALL_FLAG -Wall)
|
||||
if (NOT MSVC)
|
||||
append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_WALL_FLAG -Wall)
|
||||
set(LIBCXX_CXX_REQUIRED_FLAGS, -Werror=return-type)
|
||||
endif()
|
||||
|
||||
append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_W_FLAG -W)
|
||||
append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_WNO_UNUSED_PARAMETER_FLAG -Wno-unused-parameter)
|
||||
append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_WWRITE_STRINGS_FLAG -Wwrite-strings)
|
||||
@@ -95,6 +206,9 @@ append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_WNO_LONG_LONG_FLAG -Wno-long-long)
|
||||
if (LIBCXX_ENABLE_WERROR)
|
||||
append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_WERROR_FLAG -Werror)
|
||||
append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_WX_FLAG -WX)
|
||||
else()
|
||||
append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_WNO_ERROR_FLAG -Wno-error)
|
||||
append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_NO_WX_FLAG -WX-)
|
||||
endif()
|
||||
if (LIBCXX_ENABLE_PEDANTIC)
|
||||
append_if(LIBCXX_CXX_WARNING_FLAGS LIBCXX_HAS_PEDANTIC_FLAG -pedantic)
|
||||
@@ -135,8 +249,16 @@ else()
|
||||
list(APPEND LIBCXX_CXX_FEATURE_FLAGS -DNDEBUG)
|
||||
endif()
|
||||
endif()
|
||||
# Static library
|
||||
if (NOT LIBCXX_ENABLE_SHARED)
|
||||
list(APPEND LIBCXX_CXX_FEATURE_FLAGS -D_LIBCPP_BUILD_STATIC)
|
||||
endif()
|
||||
|
||||
# This is the _ONLY_ place where add_definitions is called.
|
||||
if (MSVC)
|
||||
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
|
||||
endif()
|
||||
|
||||
add_definitions(
|
||||
${LIBCXX_CXX_REQUIRED_FLAGS}
|
||||
${LIBCXX_CXX_WARNING_FLAGS}
|
||||
@@ -148,6 +270,7 @@ add_definitions(
|
||||
#===============================================================================
|
||||
|
||||
include_directories(include)
|
||||
add_subdirectory(include)
|
||||
|
||||
# Add source code. This also contains all of the logic for deciding linker flags
|
||||
# soname, etc...
|
||||
|
||||
153
CREDITS.TXT
153
CREDITS.TXT
@@ -8,61 +8,10 @@ beautification by scripts. The fields are: name (N), email (E), web-address
|
||||
(W), PGP key ID and fingerprint (P), description (D), and snail-mail address
|
||||
(S).
|
||||
|
||||
N: Howard Hinnant
|
||||
E: hhinnant@apple.com
|
||||
D: Architect and primary author of libc++
|
||||
|
||||
N: Marshall Clow
|
||||
E: mclow.lists@gmail.com
|
||||
E: marshall@idio.com
|
||||
D: Minor patches and bug fixes.
|
||||
|
||||
N: Bjorn Reese
|
||||
E: breese@users.sourceforge.net
|
||||
D: Initial regex prototype
|
||||
|
||||
N: David Chisnall
|
||||
E: theraven at theravensnest dot org
|
||||
D: FreeBSD and Solaris ports, libcxxrt support, some atomics work.
|
||||
|
||||
N: Ruben Van Boxem
|
||||
E: vanboxem dot ruben at gmail dot com
|
||||
D: Initial Windows patches.
|
||||
|
||||
N: Arvid Picciani
|
||||
E: aep at exys dot org
|
||||
D: Minor patches and musl port.
|
||||
|
||||
N: Craig Silverstein
|
||||
E: csilvers@google.com
|
||||
D: Implemented Cityhash as the string hash function on 64-bit machines
|
||||
|
||||
N: Google Inc.
|
||||
D: Copyright owner and contributor of the CityHash algorithm
|
||||
|
||||
N: Jeffrey Yasskin
|
||||
E: jyasskin@gmail.com
|
||||
E: jyasskin@google.com
|
||||
D: Linux fixes.
|
||||
|
||||
N: Jonathan Sauer
|
||||
D: Minor patches, mostly related to constexpr
|
||||
|
||||
N: Richard Smith
|
||||
D: Minor patches.
|
||||
|
||||
N: Andrew Morrow
|
||||
E: andrew.c.morrow@gmail.com
|
||||
N: Saleem Abdulrasool
|
||||
E: compnerd@compnerd.org
|
||||
D: Minor patches and Linux fixes.
|
||||
|
||||
N: Hyeon-bin Jeong
|
||||
E: tuhertz@gmail.com
|
||||
D: Minor patches and bug fixes.
|
||||
|
||||
N: Michel Morin
|
||||
E: mimomorin@gmail.com
|
||||
D: Minor patches to is_convertible.
|
||||
|
||||
N: Dimitry Andric
|
||||
E: dimitry@andric.com
|
||||
D: Visibility fixes, minor FreeBSD portability patches.
|
||||
@@ -71,6 +20,104 @@ N: Holger Arnold
|
||||
E: holgerar@gmail.com
|
||||
D: Minor fix.
|
||||
|
||||
N: Ruben Van Boxem
|
||||
E: vanboxem dot ruben at gmail dot com
|
||||
D: Initial Windows patches.
|
||||
|
||||
N: David Chisnall
|
||||
E: theraven at theravensnest dot org
|
||||
D: FreeBSD and Solaris ports, libcxxrt support, some atomics work.
|
||||
|
||||
N: Marshall Clow
|
||||
E: mclow.lists@gmail.com
|
||||
E: marshall@idio.com
|
||||
D: C++14 support, patches and bug fixes.
|
||||
|
||||
N: Bill Fisher
|
||||
E: william.w.fisher@gmail.com
|
||||
D: Regex bug fixes.
|
||||
|
||||
N: Matthew Dempsky
|
||||
E: matthew@dempsky.org
|
||||
D: Minor patches and bug fixes.
|
||||
|
||||
N: Google Inc.
|
||||
D: Copyright owner and contributor of the CityHash algorithm
|
||||
|
||||
N: Howard Hinnant
|
||||
E: hhinnant@apple.com
|
||||
D: Architect and primary author of libc++
|
||||
|
||||
N: Hyeon-bin Jeong
|
||||
E: tuhertz@gmail.com
|
||||
D: Minor patches and bug fixes.
|
||||
|
||||
N: Argyrios Kyrtzidis
|
||||
E: kyrtzidis@apple.com
|
||||
D: Bug fixes.
|
||||
|
||||
N: Bruce Mitchener, Jr.
|
||||
E: bruce.mitchener@gmail.com
|
||||
D: Emscripten-related changes.
|
||||
|
||||
N: Michel Morin
|
||||
E: mimomorin@gmail.com
|
||||
D: Minor patches to is_convertible.
|
||||
|
||||
N: Andrew Morrow
|
||||
E: andrew.c.morrow@gmail.com
|
||||
D: Minor patches and Linux fixes.
|
||||
|
||||
N: Arvid Picciani
|
||||
E: aep at exys dot org
|
||||
D: Minor patches and musl port.
|
||||
|
||||
N: Bjorn Reese
|
||||
E: breese@users.sourceforge.net
|
||||
D: Initial regex prototype
|
||||
|
||||
N: Nico Rieck
|
||||
E: nico.rieck@gmail.com
|
||||
D: Windows fixes
|
||||
|
||||
N: Jonathan Sauer
|
||||
D: Minor patches, mostly related to constexpr
|
||||
|
||||
N: Craig Silverstein
|
||||
E: csilvers@google.com
|
||||
D: Implemented Cityhash as the string hash function on 64-bit machines
|
||||
|
||||
N: Richard Smith
|
||||
D: Minor patches.
|
||||
|
||||
N: Joerg Sonnenberger
|
||||
E: joerg@NetBSD.org
|
||||
D: NetBSD port.
|
||||
|
||||
N: Stephan Tolksdorf
|
||||
E: st@quanttec.com
|
||||
D: Minor <atomic> fix
|
||||
|
||||
N: Michael van der Westhuizen
|
||||
E: r1mikey at gmail dot com
|
||||
|
||||
N: Klaas de Vries
|
||||
E: klaas at klaasgaaf dot nl
|
||||
D: Minor bug fix.
|
||||
|
||||
N: Zhang Xiongpang
|
||||
E: zhangxiongpang@gmail.com
|
||||
D: Minor patches and bug fixes.
|
||||
|
||||
N: Xing Xue
|
||||
E: xingxue@ca.ibm.com
|
||||
D: AIX port
|
||||
|
||||
N: Zhihao Yuan
|
||||
E: lichray@gmail.com
|
||||
D: Standard compatibility fixes.
|
||||
|
||||
N: Jeffrey Yasskin
|
||||
E: jyasskin@gmail.com
|
||||
E: jyasskin@google.com
|
||||
D: Linux fixes.
|
||||
|
||||
@@ -14,7 +14,7 @@ Full text of the relevant licenses is included below.
|
||||
University of Illinois/NCSA
|
||||
Open Source License
|
||||
|
||||
Copyright (c) 2009-2012 by the contributors listed in CREDITS.TXT
|
||||
Copyright (c) 2009-2013 by the contributors listed in CREDITS.TXT
|
||||
|
||||
All rights reserved.
|
||||
|
||||
@@ -55,7 +55,7 @@ SOFTWARE.
|
||||
|
||||
==============================================================================
|
||||
|
||||
Copyright (c) 2009-2012 by the contributors listed in CREDITS.TXT
|
||||
Copyright (c) 2009-2013 by the contributors listed in CREDITS.TXT
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
||||
9
Makefile
9
Makefile
@@ -1,5 +1,5 @@
|
||||
##
|
||||
# libcpp Makefile
|
||||
# libc++ Makefile
|
||||
##
|
||||
|
||||
SRCDIRS = .
|
||||
@@ -33,13 +33,14 @@ clean::
|
||||
# The installheaders target is used by clang's runtime/libcxx makefile.
|
||||
installheaders::
|
||||
mkdir -p $(HEADER_DIR)/c++/v1/ext
|
||||
rsync -r --exclude=".*" --exclude="support" $(SRCDIRS)/include/* \
|
||||
$(HEADER_DIR)/c++/v1/
|
||||
chown -R root:wheel $(HEADER_DIR)/c++
|
||||
(cd $(SRCDIRS)/include && tar cf - --exclude=support .) | \
|
||||
(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::
|
||||
|
||||
|
||||
@@ -13,9 +13,11 @@ check_cxx_compiler_flag(-Wwrite-strings LIBCXX_HAS_WWRITE_STRINGS_FLAG)
|
||||
check_cxx_compiler_flag(-Wno-long-long LIBCXX_HAS_WNO_LONG_LONG_FLAG)
|
||||
check_cxx_compiler_flag(-pedantic LIBCXX_HAS_PEDANTIC_FLAG)
|
||||
check_cxx_compiler_flag(-Werror LIBCXX_HAS_WERROR_FLAG)
|
||||
check_cxx_compiler_flag(-Wno-error LIBCXX_HAS_WNO_ERROR_FLAG)
|
||||
check_cxx_compiler_flag(-fno-exceptions LIBCXX_HAS_FNO_EXCEPTIONS_FLAG)
|
||||
check_cxx_compiler_flag(-fno-rtti LIBCXX_HAS_FNO_RTTI_FLAG)
|
||||
check_cxx_compiler_flag(/WX LIBCXX_HAS_WX_FLAG)
|
||||
check_cxx_compiler_flag(/WX- LIBCXX_HAS_NO_WX_FLAG)
|
||||
check_cxx_compiler_flag(/EHsc LIBCXX_HAS_EHSC_FLAG)
|
||||
check_cxx_compiler_flag(/EHs- LIBCXX_HAS_NO_EHS_FLAG)
|
||||
check_cxx_compiler_flag(/EHa- LIBCXX_HAS_NO_EHA_FLAG)
|
||||
|
||||
16
include/CMakeLists.txt
Normal file
16
include/CMakeLists.txt
Normal file
@@ -0,0 +1,16 @@
|
||||
if (NOT LIBCXX_INSTALL_SUPPORT_HEADERS)
|
||||
set(LIBCXX_SUPPORT_HEADER_PATTERN PATTERN "support" EXCLUDE)
|
||||
endif()
|
||||
|
||||
file(COPY .
|
||||
DESTINATION "${CMAKE_BINARY_DIR}/include/c++/v1"
|
||||
FILES_MATCHING
|
||||
PATTERN "*"
|
||||
PATTERN "CMakeLists.txt" EXCLUDE
|
||||
PATTERN ".svn" EXCLUDE
|
||||
${LIBCXX_SUPPORT_HEADER_PATTERN}
|
||||
)
|
||||
|
||||
install(DIRECTORY "${CMAKE_BINARY_DIR}/include/c++/v1/"
|
||||
DESTINATION include/c++/v1/
|
||||
)
|
||||
@@ -40,7 +40,7 @@ class __bit_reference
|
||||
__storage_pointer __seg_;
|
||||
__storage_type __mask_;
|
||||
|
||||
#if defined(__clang__)
|
||||
#if defined(__clang__) || defined(__IBMCPP__) || defined(_LIBCPP_MSVC)
|
||||
friend typename _Cp::__self;
|
||||
#else
|
||||
friend class _Cp::__self;
|
||||
@@ -81,8 +81,18 @@ class __bit_reference<_Cp, false>
|
||||
{
|
||||
};
|
||||
|
||||
template <class _Cp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
swap(__bit_reference<_Cp> __x, __bit_reference<_Cp> __y) _NOEXCEPT
|
||||
{
|
||||
bool __t = __x;
|
||||
__x = __y;
|
||||
__y = __t;
|
||||
}
|
||||
|
||||
template <class _Cp, class _Dp>
|
||||
_LIBCPP_INLINE_VISIBILITY inline
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
swap(__bit_reference<_Cp> __x, __bit_reference<_Dp> __y) _NOEXCEPT
|
||||
{
|
||||
@@ -92,7 +102,7 @@ swap(__bit_reference<_Cp> __x, __bit_reference<_Dp> __y) _NOEXCEPT
|
||||
}
|
||||
|
||||
template <class _Cp>
|
||||
_LIBCPP_INLINE_VISIBILITY inline
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
swap(__bit_reference<_Cp> __x, bool& __y) _NOEXCEPT
|
||||
{
|
||||
@@ -102,7 +112,7 @@ swap(__bit_reference<_Cp> __x, bool& __y) _NOEXCEPT
|
||||
}
|
||||
|
||||
template <class _Cp>
|
||||
_LIBCPP_INLINE_VISIBILITY inline
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
swap(bool& __x, __bit_reference<_Cp> __y) _NOEXCEPT
|
||||
{
|
||||
@@ -120,7 +130,7 @@ class __bit_const_reference
|
||||
__storage_pointer __seg_;
|
||||
__storage_type __mask_;
|
||||
|
||||
#if defined(__clang__)
|
||||
#if defined(__clang__) || defined(__IBMCPP__) || defined(_LIBCPP_MSVC)
|
||||
friend typename _Cp::__self;
|
||||
#else
|
||||
friend class _Cp::__self;
|
||||
@@ -163,6 +173,8 @@ __find_bool_true(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type
|
||||
__storage_type __b = *__first.__seg_ & __m;
|
||||
if (__b)
|
||||
return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__ctz(__b)));
|
||||
if (__n == __dn)
|
||||
return _It(__first.__seg_, __first.__ctz_ + __n);
|
||||
__n -= __dn;
|
||||
++__first.__seg_;
|
||||
}
|
||||
@@ -197,6 +209,8 @@ __find_bool_false(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type
|
||||
__storage_type __b = ~*__first.__seg_ & __m;
|
||||
if (__b)
|
||||
return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__ctz(__b)));
|
||||
if (__n == __dn)
|
||||
return _It(__first.__seg_, __first.__ctz_ + __n);
|
||||
__n -= __dn;
|
||||
++__first.__seg_;
|
||||
}
|
||||
@@ -323,7 +337,7 @@ __fill_n_false(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n)
|
||||
}
|
||||
// do middle whole words
|
||||
__storage_type __nw = __n / __bits_per_word;
|
||||
_VSTD::memset(__first.__seg_, 0, __nw * sizeof(__storage_type));
|
||||
_VSTD::memset(_VSTD::__to_raw_pointer(__first.__seg_), 0, __nw * sizeof(__storage_type));
|
||||
__n -= __nw * __bits_per_word;
|
||||
// do last partial word
|
||||
if (__n > 0)
|
||||
@@ -353,7 +367,7 @@ __fill_n_true(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n)
|
||||
}
|
||||
// do middle whole words
|
||||
__storage_type __nw = __n / __bits_per_word;
|
||||
_VSTD::memset(__first.__seg_, -1, __nw * sizeof(__storage_type));
|
||||
_VSTD::memset(_VSTD::__to_raw_pointer(__first.__seg_), -1, __nw * sizeof(__storage_type));
|
||||
__n -= __nw * __bits_per_word;
|
||||
// do last partial word
|
||||
if (__n > 0)
|
||||
@@ -365,7 +379,7 @@ __fill_n_true(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n)
|
||||
}
|
||||
|
||||
template <class _Cp>
|
||||
_LIBCPP_INLINE_VISIBILITY inline
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
fill_n(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n, bool __value_)
|
||||
{
|
||||
@@ -420,7 +434,9 @@ __copy_aligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsCon
|
||||
// __first.__ctz_ == 0;
|
||||
// do middle words
|
||||
__storage_type __nw = __n / __bits_per_word;
|
||||
_VSTD::memmove(__result.__seg_, __first.__seg_, __nw * sizeof(__storage_type));
|
||||
_VSTD::memmove(_VSTD::__to_raw_pointer(__result.__seg_),
|
||||
_VSTD::__to_raw_pointer(__first.__seg_),
|
||||
__nw * sizeof(__storage_type));
|
||||
__n -= __nw * __bits_per_word;
|
||||
__result.__seg_ += __nw;
|
||||
// do last word
|
||||
@@ -559,7 +575,9 @@ __copy_backward_aligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_C
|
||||
__storage_type __nw = __n / __bits_per_word;
|
||||
__result.__seg_ -= __nw;
|
||||
__last.__seg_ -= __nw;
|
||||
_VSTD::memmove(__result.__seg_, __last.__seg_, __nw * sizeof(__storage_type));
|
||||
_VSTD::memmove(_VSTD::__to_raw_pointer(__result.__seg_),
|
||||
_VSTD::__to_raw_pointer(__last.__seg_),
|
||||
__nw * sizeof(__storage_type));
|
||||
__n -= __nw * __bits_per_word;
|
||||
// do last word
|
||||
if (__n > 0)
|
||||
@@ -860,6 +878,7 @@ struct __bit_array
|
||||
{
|
||||
typedef typename _Cp::difference_type difference_type;
|
||||
typedef typename _Cp::__storage_type __storage_type;
|
||||
typedef typename _Cp::__storage_pointer __storage_pointer;
|
||||
typedef typename _Cp::iterator iterator;
|
||||
static const unsigned __bits_per_word = _Cp::__bits_per_word;
|
||||
static const unsigned _Np = 4;
|
||||
@@ -870,9 +889,15 @@ struct __bit_array
|
||||
_LIBCPP_INLINE_VISIBILITY static difference_type capacity()
|
||||
{return static_cast<difference_type>(_Np * __bits_per_word);}
|
||||
_LIBCPP_INLINE_VISIBILITY explicit __bit_array(difference_type __s) : __size_(__s) {}
|
||||
_LIBCPP_INLINE_VISIBILITY iterator begin() {return iterator(__word_, 0);}
|
||||
_LIBCPP_INLINE_VISIBILITY iterator end() {return iterator(__word_ + __size_ / __bits_per_word,
|
||||
static_cast<unsigned>(__size_ % __bits_per_word));}
|
||||
_LIBCPP_INLINE_VISIBILITY iterator begin()
|
||||
{
|
||||
return iterator(pointer_traits<__storage_pointer>::pointer_to(__word_[0]), 0);
|
||||
}
|
||||
_LIBCPP_INLINE_VISIBILITY iterator end()
|
||||
{
|
||||
return iterator(pointer_traits<__storage_pointer>::pointer_to(__word_[0]) + __size_ / __bits_per_word,
|
||||
static_cast<unsigned>(__size_ % __bits_per_word));
|
||||
}
|
||||
};
|
||||
|
||||
template <class _Cp>
|
||||
@@ -1083,7 +1108,11 @@ private:
|
||||
unsigned __ctz_;
|
||||
|
||||
public:
|
||||
_LIBCPP_INLINE_VISIBILITY __bit_iterator() _NOEXCEPT {}
|
||||
_LIBCPP_INLINE_VISIBILITY __bit_iterator() _NOEXCEPT
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
: __seg_(nullptr), __ctz_(0)
|
||||
#endif
|
||||
{}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__bit_iterator(const __bit_iterator<_Cp, false>& __it) _NOEXCEPT
|
||||
@@ -1193,7 +1222,7 @@ private:
|
||||
__bit_iterator(__storage_pointer __s, unsigned __ctz) _NOEXCEPT
|
||||
: __seg_(__s), __ctz_(__ctz) {}
|
||||
|
||||
#if defined(__clang__)
|
||||
#if defined(__clang__) || defined(__IBMCPP__) || defined(_LIBCPP_MSVC)
|
||||
friend typename _Cp::__self;
|
||||
#else
|
||||
friend class _Cp::__self;
|
||||
|
||||
237
include/__config
237
include/__config
@@ -11,7 +11,7 @@
|
||||
#ifndef _LIBCPP_CONFIG
|
||||
#define _LIBCPP_CONFIG
|
||||
|
||||
#if !_MSC_VER // explicit macro necessary because it is only defined below in this file
|
||||
#if !defined(_MSC_VER) || defined(__clang__)
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
@@ -51,18 +51,50 @@
|
||||
# define _LIBCPP_LITTLE_ENDIAN 0
|
||||
# define _LIBCPP_BIG_ENDIAN 1
|
||||
# endif // _BYTE_ORDER == _LITTLE_ENDIAN
|
||||
# ifndef __LONG_LONG_SUPPORTED
|
||||
# define _LIBCPP_HAS_NO_LONG_LONG
|
||||
# endif // __LONG_LONG_SUPPORTED
|
||||
#endif // __FreeBSD__
|
||||
|
||||
#ifdef __NetBSD__
|
||||
# include <sys/endian.h>
|
||||
# if _BYTE_ORDER == _LITTLE_ENDIAN
|
||||
# define _LIBCPP_LITTLE_ENDIAN 1
|
||||
# define _LIBCPP_BIG_ENDIAN 0
|
||||
# else // _BYTE_ORDER == _LITTLE_ENDIAN
|
||||
# define _LIBCPP_LITTLE_ENDIAN 0
|
||||
# define _LIBCPP_BIG_ENDIAN 1
|
||||
# endif // _BYTE_ORDER == _LITTLE_ENDIAN
|
||||
# define _LIBCPP_HAS_QUICK_EXIT
|
||||
#endif // __NetBSD__
|
||||
|
||||
#ifdef _WIN32
|
||||
# define _LIBCPP_LITTLE_ENDIAN 1
|
||||
# define _LIBCPP_BIG_ENDIAN 0
|
||||
// Compiler intrinsics (GCC or MSVC)
|
||||
# if (defined(_MSC_VER) && _MSC_VER >= 1400) \
|
||||
# if defined(__clang__) \
|
||||
|| (defined(_MSC_VER) && _MSC_VER >= 1400) \
|
||||
|| (defined(__GNUC__) && _GNUC_VER > 403)
|
||||
# define _LIBCP_HAS_IS_BASE_OF
|
||||
# define _LIBCPP_HAS_IS_BASE_OF
|
||||
# endif
|
||||
# if defined(_MSC_VER) && !defined(__clang__)
|
||||
# define _LIBCPP_MSVC // Using Microsoft Visual C++ compiler
|
||||
# define _LIBCPP_TOSTRING2(x) #x
|
||||
# define _LIBCPP_TOSTRING(x) _LIBCPP_TOSTRING2(x)
|
||||
# define _LIBCPP_WARNING(x) __pragma(message(__FILE__ "(" _LIBCPP_TOSTRING(__LINE__) ") : warning note: " x))
|
||||
# endif
|
||||
# // If mingw not explicitly detected, assume using MS C runtime only.
|
||||
# ifndef __MINGW32__
|
||||
# define _LIBCPP_MSVCRT // Using Microsoft's C Runtime library
|
||||
# endif
|
||||
#endif // _WIN32
|
||||
|
||||
#ifdef __linux__
|
||||
# if defined(__GNUC__) && _GNUC_VER >= 403
|
||||
# define _LIBCPP_HAS_IS_BASE_OF
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef __sun__
|
||||
# include <sys/isa_defs.h>
|
||||
# ifdef _LITTLE_ENDIAN
|
||||
@@ -87,24 +119,30 @@
|
||||
# endif
|
||||
#endif // !defined(_LIBCPP_LITTLE_ENDIAN) || !defined(_LIBCPP_BIG_ENDIAN)
|
||||
|
||||
#if _WIN32
|
||||
#ifdef _WIN32
|
||||
|
||||
// only really useful for a DLL
|
||||
#ifdef _LIBCPP_DLL // this should be a compiler builtin define ideally...
|
||||
# ifdef cxx_EXPORTS
|
||||
# define _LIBCPP_HIDDEN
|
||||
# define _LIBCPP_VISIBLE __declspec(dllexport)
|
||||
# define _LIBCPP_FUNC_VIS __declspec(dllexport)
|
||||
# define _LIBCPP_TYPE_VIS __declspec(dllexport)
|
||||
# else
|
||||
# define _LIBCPP_HIDDEN
|
||||
# define _LIBCPP_VISIBLE __declspec(dllimport)
|
||||
# define _LIBCPP_FUNC_VIS __declspec(dllimport)
|
||||
# define _LIBCPP_TYPE_VIS __declspec(dllimport)
|
||||
# endif
|
||||
#else
|
||||
# define _LIBCPP_HIDDEN
|
||||
# define _LIBCPP_VISIBLE
|
||||
# define _LIBCPP_FUNC_VIS
|
||||
# define _LIBCPP_TYPE_VIS
|
||||
#endif
|
||||
|
||||
#define _LIBCPP_TYPE_VIS_ONLY
|
||||
#define _LIBCPP_FUNC_VIS_ONLY
|
||||
|
||||
#ifndef _LIBCPP_INLINE_VISIBILITY
|
||||
# if _MSC_VER
|
||||
# ifdef _LIBCPP_MSVC
|
||||
# define _LIBCPP_INLINE_VISIBILITY __forceinline
|
||||
# else // MinGW GCC and Clang
|
||||
# define _LIBCPP_INLINE_VISIBILITY __attribute__ ((__always_inline__))
|
||||
@@ -112,23 +150,43 @@
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_EXCEPTION_ABI
|
||||
#define _LIBCPP_EXCEPTION_ABI _LIBCPP_VISIBLE
|
||||
#define _LIBCPP_EXCEPTION_ABI _LIBCPP_TYPE_VIS
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_ALWAYS_INLINE
|
||||
# if _MSC_VER
|
||||
# ifdef _LIBCPP_MSVC
|
||||
# define _LIBCPP_ALWAYS_INLINE __forceinline
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#endif // _WIN32
|
||||
|
||||
#ifndef __has_attribute
|
||||
#define __has_attribute(__x) 0
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_HIDDEN
|
||||
#define _LIBCPP_HIDDEN __attribute__ ((__visibility__("hidden")))
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_VISIBLE
|
||||
#define _LIBCPP_VISIBLE __attribute__ ((__visibility__("default")))
|
||||
#ifndef _LIBCPP_FUNC_VIS
|
||||
#define _LIBCPP_FUNC_VIS __attribute__ ((__visibility__("default")))
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_TYPE_VIS
|
||||
# if __has_attribute(__type_visibility__)
|
||||
# define _LIBCPP_TYPE_VIS __attribute__ ((__type_visibility__("default")))
|
||||
# else
|
||||
# define _LIBCPP_TYPE_VIS __attribute__ ((__visibility__("default")))
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_TYPE_VIS_ONLY
|
||||
# define _LIBCPP_TYPE_VIS_ONLY _LIBCPP_TYPE_VIS
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_FUNC_VIS_ONLY
|
||||
# define _LIBCPP_FUNC_VIS_ONLY _LIBCPP_FUNC_VIS
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_INLINE_VISIBILITY
|
||||
@@ -136,11 +194,7 @@
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_EXCEPTION_ABI
|
||||
#define _LIBCPP_EXCEPTION_ABI __attribute__ ((__visibility__("default")))
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_CANTTHROW
|
||||
#define _LIBCPP_CANTTHROW __attribute__ ((__nothrow__))
|
||||
#define _LIBCPP_EXCEPTION_ABI _LIBCPP_TYPE_VIS
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_ALWAYS_INLINE
|
||||
@@ -192,7 +246,9 @@ typedef __char32_t char32_t;
|
||||
# define _LIBCPP_NORETURN __attribute__ ((noreturn))
|
||||
#endif
|
||||
|
||||
#if !(__has_feature(cxx_defaulted_functions))
|
||||
#define _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
#endif // !(__has_feature(cxx_defaulted_functions))
|
||||
|
||||
#if !(__has_feature(cxx_deleted_functions))
|
||||
#define _LIBCPP_HAS_NO_DELETED_FUNCTIONS
|
||||
@@ -235,7 +291,7 @@ typedef __char32_t char32_t;
|
||||
#endif
|
||||
|
||||
#if __has_feature(is_base_of)
|
||||
# define _LIBCP_HAS_IS_BASE_OF
|
||||
# define _LIBCPP_HAS_IS_BASE_OF
|
||||
#endif
|
||||
|
||||
// Objective-C++ features (opt-in)
|
||||
@@ -252,9 +308,19 @@ typedef __char32_t char32_t;
|
||||
#define _LIBCPP_HAS_NO_CONSTEXPR
|
||||
#endif
|
||||
|
||||
#if __FreeBSD__ && (__ISO_C_VISIBLE >= 2011 || __cplusplus >= 201103L)
|
||||
#if __ISO_C_VISIBLE >= 2011 || __cplusplus >= 201103L
|
||||
#if defined(__FreeBSD__)
|
||||
#define _LIBCPP_HAS_QUICK_EXIT
|
||||
#define _LIBCPP_HAS_C11_FEATURES
|
||||
#elif defined(__linux__)
|
||||
#include <features.h>
|
||||
#if __GLIBC_PREREQ(2, 15)
|
||||
#define _LIBCPP_HAS_QUICK_EXIT
|
||||
#endif
|
||||
#if __GLIBC_PREREQ(2, 17)
|
||||
#define _LIBCPP_HAS_C11_FEATURES
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if (__has_feature(cxx_noexcept))
|
||||
@@ -348,13 +414,14 @@ namespace _LIBCPP_NAMESPACE {
|
||||
using namespace _LIBCPP_NAMESPACE __attribute__((__strong__));
|
||||
}
|
||||
|
||||
#elif defined(_MSC_VER)
|
||||
#elif defined(_LIBCPP_MSVC)
|
||||
|
||||
#define _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#define _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER
|
||||
#define _LIBCPP_HAS_NO_CONSTEXPR
|
||||
#define _LIBCPP_HAS_NO_UNICODE_CHARS
|
||||
#define _LIBCPP_HAS_NO_DELETED_FUNCTIONS
|
||||
#define _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
#define __alignof__ __alignof
|
||||
#define _LIBCPP_NORETURN __declspec(noreturn)
|
||||
#define _ALIGNAS(x) __declspec(align(x))
|
||||
@@ -367,10 +434,43 @@ using namespace _LIBCPP_NAMESPACE __attribute__((__strong__));
|
||||
#define _LIBCPP_END_NAMESPACE_STD }
|
||||
#define _VSTD std
|
||||
|
||||
# define _LIBCPP_WEAK
|
||||
namespace std {
|
||||
}
|
||||
|
||||
#endif // __clang__ || __GNUC___ || _MSC_VER
|
||||
#elif defined(__IBMCPP__)
|
||||
|
||||
#define _ALIGNAS(x) __attribute__((__aligned__(x)))
|
||||
#define _ALIGNAS_TYPE(x) __attribute__((__aligned__(__alignof(x))))
|
||||
#define _ATTRIBUTE(x) __attribute__((x))
|
||||
#define _LIBCPP_NORETURN __attribute__((noreturn))
|
||||
|
||||
#define _NOEXCEPT throw()
|
||||
#define _NOEXCEPT_(x)
|
||||
|
||||
#define _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
#define _LIBCPP_HAS_NO_ADVANCED_SFINAE
|
||||
#define _LIBCPP_HAS_NO_ALWAYS_INLINE_VARIADICS
|
||||
#define _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
||||
#define _LIBCPP_HAS_NO_NULLPTR
|
||||
#define _LIBCPP_HAS_NO_UNICODE_CHARS
|
||||
#define _LIBCPP_HAS_NO_STRONG_ENUMS
|
||||
#define _LIBCPP_HAS_IS_BASE_OF
|
||||
|
||||
#if defined(_AIX)
|
||||
#define __MULTILOCALE_API
|
||||
#endif
|
||||
|
||||
#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std {inline namespace _LIBCPP_NAMESPACE {
|
||||
#define _LIBCPP_END_NAMESPACE_STD } }
|
||||
#define _VSTD std::_LIBCPP_NAMESPACE
|
||||
|
||||
namespace std {
|
||||
inline namespace _LIBCPP_NAMESPACE {
|
||||
}
|
||||
}
|
||||
|
||||
#endif // __clang__ || __GNUC___ || _MSC_VER || __IBMCPP__
|
||||
|
||||
#ifdef _LIBCPP_HAS_NO_UNICODE_CHARS
|
||||
typedef unsigned short char16_t;
|
||||
@@ -398,8 +498,14 @@ template <unsigned> struct __static_assert_check {};
|
||||
#define _LIBCPP_CONSTEXPR constexpr
|
||||
#endif
|
||||
|
||||
#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
#define _LIBCPP_DEFAULT {}
|
||||
#else
|
||||
#define _LIBCPP_DEFAULT = default;
|
||||
#endif
|
||||
|
||||
#ifdef __GNUC__
|
||||
#define _NOALIAS __attribute__((malloc))
|
||||
#define _NOALIAS __attribute__((__malloc__))
|
||||
#else
|
||||
#define _NOALIAS
|
||||
#endif
|
||||
@@ -415,7 +521,7 @@ template <unsigned> struct __static_assert_check {};
|
||||
#endif
|
||||
|
||||
#ifdef _LIBCPP_HAS_NO_STRONG_ENUMS
|
||||
#define _LIBCPP_DECLARE_STRONG_ENUM(x) struct _LIBCPP_VISIBLE x { enum __lx
|
||||
#define _LIBCPP_DECLARE_STRONG_ENUM(x) struct _LIBCPP_TYPE_VIS x { enum __lx
|
||||
#define _LIBCPP_DECLARE_STRONG_ENUM_EPILOG(x) \
|
||||
__lx __v_; \
|
||||
_LIBCPP_ALWAYS_INLINE x(__lx __v) : __v_(__v) {} \
|
||||
@@ -423,43 +529,92 @@ template <unsigned> struct __static_assert_check {};
|
||||
_LIBCPP_ALWAYS_INLINE operator int() const {return __v_;} \
|
||||
};
|
||||
#else // _LIBCPP_HAS_NO_STRONG_ENUMS
|
||||
#define _LIBCPP_DECLARE_STRONG_ENUM(x) enum class _LIBCPP_VISIBLE x
|
||||
#define _LIBCPP_DECLARE_STRONG_ENUM(x) enum class _LIBCPP_TYPE_VIS x
|
||||
#define _LIBCPP_DECLARE_STRONG_ENUM_EPILOG(x)
|
||||
#endif // _LIBCPP_HAS_NO_STRONG_ENUMS
|
||||
|
||||
#ifndef _LIBCPP_EXTERN_TEMPLATE
|
||||
#define _LIBCPP_EXTERN_TEMPLATE(...) extern template __VA_ARGS__;
|
||||
#ifdef _LIBCPP_DEBUG
|
||||
# if _LIBCPP_DEBUG == 0
|
||||
# define _LIBCPP_DEBUG_LEVEL 1
|
||||
# elif _LIBCPP_DEBUG == 1
|
||||
# define _LIBCPP_DEBUG_LEVEL 2
|
||||
# else
|
||||
# error Supported values for _LIBCPP_DEBUG are 0 and 1
|
||||
# endif
|
||||
# define _LIBCPP_EXTERN_TEMPLATE(...)
|
||||
#endif
|
||||
|
||||
#if __APPLE__ || __FreeBSD__ || _WIN32 || __sun__
|
||||
#ifndef _LIBCPP_EXTERN_TEMPLATE
|
||||
#define _LIBCPP_EXTERN_TEMPLATE(...)
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_EXTERN_TEMPLATE2
|
||||
#define _LIBCPP_EXTERN_TEMPLATE2(...) extern template __VA_ARGS__;
|
||||
#endif
|
||||
|
||||
#if defined(__APPLE__) || defined(__FreeBSD__) || defined(_WIN32) || defined(__sun__) || defined(__NetBSD__)
|
||||
#define _LIBCPP_LOCALE__L_EXTENSIONS 1
|
||||
#endif
|
||||
#if __FreeBSD__
|
||||
#ifdef __FreeBSD__
|
||||
#define _DECLARE_C99_LDBL_MATH 1
|
||||
#endif
|
||||
|
||||
#if __APPLE__ || __FreeBSD__
|
||||
#if defined(__APPLE__) || defined(__FreeBSD__)
|
||||
#define _LIBCPP_HAS_DEFAULTRUNELOCALE
|
||||
#endif
|
||||
|
||||
#if __APPLE__ || __FreeBSD__ || __sun__
|
||||
#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__sun__)
|
||||
#define _LIBCPP_WCTYPE_IS_MASK
|
||||
#endif
|
||||
|
||||
#ifdef _LIBCPP_DEBUG2
|
||||
# if _LIBCPP_DEBUG2 == 0
|
||||
# define _LIBCPP_DEBUG_LEVEL 1
|
||||
# elif _LIBCPP_DEBUG2 == 1
|
||||
# define _LIBCPP_DEBUG_LEVEL 2
|
||||
# else
|
||||
# error Supported values for _LIBCPP_DEBUG2 are 0 and 1
|
||||
# endif
|
||||
#if defined(__APPLE__)
|
||||
#ifndef _LIBCPP_TRIVIAL_PAIR_COPY_CTOR
|
||||
# define _LIBCPP_TRIVIAL_PAIR_COPY_CTOR 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef _LIBCPP_DEBUG2
|
||||
# include <__debug>
|
||||
#ifndef _LIBCPP_TRIVIAL_PAIR_COPY_CTOR
|
||||
# define _LIBCPP_TRIVIAL_PAIR_COPY_CTOR 1
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_STD_VER
|
||||
# if __cplusplus <= 201103L
|
||||
# define _LIBCPP_STD_VER 11
|
||||
# else
|
||||
# define _LIBCPP_STD_VER 13 // current year, or date of c++14 ratification
|
||||
# endif
|
||||
#endif // _LIBCPP_STD_VER
|
||||
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
#define _LIBCPP_DEPRECATED [[deprecated]]
|
||||
#else
|
||||
# define _LIBCPP_ASSERT(x, m) ((void)0)
|
||||
#define _LIBCPP_DEPRECATED
|
||||
#endif
|
||||
|
||||
#if _LIBCPP_STD_VER <= 11
|
||||
#define _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
#define _LIBCPP_EXPLICIT_AFTER_CXX11
|
||||
#define _LIBCPP_DEPRECATED_AFTER_CXX11
|
||||
#else
|
||||
#define _LIBCPP_CONSTEXPR_AFTER_CXX11 constexpr
|
||||
#define _LIBCPP_EXPLICIT_AFTER_CXX11 explicit
|
||||
#define _LIBCPP_DEPRECATED_AFTER_CXX11 [[deprecated]]
|
||||
#endif
|
||||
|
||||
// Try to find out if RTTI is disabled.
|
||||
// g++ and cl.exe have RTTI on by default and define a macro when it is.
|
||||
// g++ only defines the macro in 4.3.2 and onwards.
|
||||
#if !defined(_LIBCPP_NO_RTTI)
|
||||
# if defined(__GNUG__) && (__GNUC__ >= 4 && \
|
||||
(__GNUC_MINOR__ >= 3 || __GNUC_PATCHLEVEL__ >= 2)) && !defined(__GXX_RTTI)
|
||||
# define _LIBCPP_NO_RTTI
|
||||
# elif (defined(_MSC_VER) && !defined(__clang__)) && !defined(_CPPRTTI)
|
||||
# define _LIBCPP_NO_RTTI
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_WEAK
|
||||
# define _LIBCPP_WEAK __attribute__((__weak__))
|
||||
#endif
|
||||
|
||||
#endif // _LIBCPP_CONFIG
|
||||
|
||||
@@ -11,12 +11,18 @@
|
||||
#ifndef _LIBCPP_DEBUG_H
|
||||
#define _LIBCPP_DEBUG_H
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 1
|
||||
|
||||
# include <cstdlib>
|
||||
# include <cstdio>
|
||||
# include <cstddef>
|
||||
# define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : (_VSTD::printf("%s\n", m), _VSTD::abort()))
|
||||
# ifndef _LIBCPP_ASSERT
|
||||
# define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : (_VSTD::printf("%s\n", m), _VSTD::abort()))
|
||||
# endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -24,23 +30,30 @@
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
struct _LIBCPP_VISIBLE __c_node;
|
||||
struct _LIBCPP_TYPE_VIS __c_node;
|
||||
|
||||
struct _LIBCPP_VISIBLE __i_node
|
||||
struct _LIBCPP_TYPE_VIS __i_node
|
||||
{
|
||||
void* __i_;
|
||||
__i_node* __next_;
|
||||
__c_node* __c_;
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS
|
||||
__i_node(const __i_node&) = delete;
|
||||
__i_node& operator=(const __i_node&) = delete;
|
||||
#else
|
||||
private:
|
||||
__i_node(const __i_node&);
|
||||
__i_node& operator=(const __i_node&);
|
||||
public:
|
||||
#endif
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__i_node(void* __i, __i_node* __next, __c_node* __c)
|
||||
: __i_(__i), __next_(__next), __c_(__c) {}
|
||||
~__i_node();
|
||||
};
|
||||
|
||||
struct _LIBCPP_VISIBLE __c_node
|
||||
struct _LIBCPP_TYPE_VIS __c_node
|
||||
{
|
||||
void* __c_;
|
||||
__c_node* __next_;
|
||||
@@ -48,8 +61,15 @@ struct _LIBCPP_VISIBLE __c_node
|
||||
__i_node** end_;
|
||||
__i_node** cap_;
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS
|
||||
__c_node(const __c_node&) = delete;
|
||||
__c_node& operator=(const __c_node&) = delete;
|
||||
#else
|
||||
private:
|
||||
__c_node(const __c_node&);
|
||||
__c_node& operator=(const __c_node&);
|
||||
public:
|
||||
#endif
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__c_node(void* __c, __c_node* __next)
|
||||
: __c_(__c), __next_(__next), beg_(nullptr), end_(nullptr), cap_(nullptr) {}
|
||||
@@ -117,7 +137,7 @@ _C_node<_Cont>::__subscriptable(const void* __i, ptrdiff_t __n) const
|
||||
return _Cp->__subscriptable(__j, __n);
|
||||
}
|
||||
|
||||
class _LIBCPP_VISIBLE __libcpp_db
|
||||
class _LIBCPP_TYPE_VIS __libcpp_db
|
||||
{
|
||||
__c_node** __cbeg_;
|
||||
__c_node** __cend_;
|
||||
@@ -128,8 +148,15 @@ class _LIBCPP_VISIBLE __libcpp_db
|
||||
|
||||
__libcpp_db();
|
||||
public:
|
||||
#ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS
|
||||
__libcpp_db(const __libcpp_db&) = delete;
|
||||
__libcpp_db& operator=(const __libcpp_db&) = delete;
|
||||
#else
|
||||
private:
|
||||
__libcpp_db(const __libcpp_db&);
|
||||
__libcpp_db& operator=(const __libcpp_db&);
|
||||
public:
|
||||
#endif
|
||||
~__libcpp_db();
|
||||
|
||||
class __db_c_iterator;
|
||||
@@ -169,18 +196,18 @@ public:
|
||||
bool __decrementable(const void* __i) const;
|
||||
bool __addable(const void* __i, ptrdiff_t __n) const;
|
||||
bool __subscriptable(const void* __i, ptrdiff_t __n) const;
|
||||
bool __comparable(const void* __i, const void* __j) const;
|
||||
bool __less_than_comparable(const void* __i, const void* __j) const;
|
||||
private:
|
||||
_LIBCPP_HIDDEN
|
||||
__i_node* __insert_iterator(void* __i);
|
||||
_LIBCPP_HIDDEN
|
||||
__i_node* __find_iterator(const void* __i) const;
|
||||
|
||||
friend _LIBCPP_VISIBLE __libcpp_db* __get_db();
|
||||
friend _LIBCPP_FUNC_VIS __libcpp_db* __get_db();
|
||||
};
|
||||
|
||||
_LIBCPP_VISIBLE __libcpp_db* __get_db();
|
||||
_LIBCPP_VISIBLE const __libcpp_db* __get_const_db();
|
||||
_LIBCPP_FUNC_VIS __libcpp_db* __get_db();
|
||||
_LIBCPP_FUNC_VIS const __libcpp_db* __get_const_db();
|
||||
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
@@ -102,98 +102,98 @@ mem_fn(_Rp (_Tp::* __pm)(_A0, _A1, _A2))
|
||||
|
||||
template<class _Rp, class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
__mem_fn<_Rp (_Tp::*)()>
|
||||
__mem_fn<_Rp (_Tp::*)() const>
|
||||
mem_fn(_Rp (_Tp::* __pm)() const)
|
||||
{
|
||||
return __mem_fn<_Rp (_Tp::*)()>(__pm);
|
||||
return __mem_fn<_Rp (_Tp::*)() const>(__pm);
|
||||
}
|
||||
|
||||
template<class _Rp, class _Tp, class _A0>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
__mem_fn<_Rp (_Tp::*)(_A0)>
|
||||
__mem_fn<_Rp (_Tp::*)(_A0) const>
|
||||
mem_fn(_Rp (_Tp::* __pm)(_A0) const)
|
||||
{
|
||||
return __mem_fn<_Rp (_Tp::*)(_A0)>(__pm);
|
||||
return __mem_fn<_Rp (_Tp::*)(_A0) const>(__pm);
|
||||
}
|
||||
|
||||
template<class _Rp, class _Tp, class _A0, class _A1>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
__mem_fn<_Rp (_Tp::*)(_A0, _A1)>
|
||||
__mem_fn<_Rp (_Tp::*)(_A0, _A1) const>
|
||||
mem_fn(_Rp (_Tp::* __pm)(_A0, _A1) const)
|
||||
{
|
||||
return __mem_fn<_Rp (_Tp::*)(_A0, _A1)>(__pm);
|
||||
return __mem_fn<_Rp (_Tp::*)(_A0, _A1) const>(__pm);
|
||||
}
|
||||
|
||||
template<class _Rp, class _Tp, class _A0, class _A1, class _A2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
__mem_fn<_Rp (_Tp::*)(_A0, _A1, _A2)>
|
||||
__mem_fn<_Rp (_Tp::*)(_A0, _A1, _A2) const>
|
||||
mem_fn(_Rp (_Tp::* __pm)(_A0, _A1, _A2) const)
|
||||
{
|
||||
return __mem_fn<_Rp (_Tp::*)(_A0, _A1, _A2)>(__pm);
|
||||
return __mem_fn<_Rp (_Tp::*)(_A0, _A1, _A2) const>(__pm);
|
||||
}
|
||||
|
||||
template<class _Rp, class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
__mem_fn<_Rp (_Tp::*)()>
|
||||
__mem_fn<_Rp (_Tp::*)() volatile>
|
||||
mem_fn(_Rp (_Tp::* __pm)() volatile)
|
||||
{
|
||||
return __mem_fn<_Rp (_Tp::*)()>(__pm);
|
||||
return __mem_fn<_Rp (_Tp::*)() volatile>(__pm);
|
||||
}
|
||||
|
||||
template<class _Rp, class _Tp, class _A0>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
__mem_fn<_Rp (_Tp::*)(_A0)>
|
||||
__mem_fn<_Rp (_Tp::*)(_A0) volatile>
|
||||
mem_fn(_Rp (_Tp::* __pm)(_A0) volatile)
|
||||
{
|
||||
return __mem_fn<_Rp (_Tp::*)(_A0)>(__pm);
|
||||
return __mem_fn<_Rp (_Tp::*)(_A0) volatile>(__pm);
|
||||
}
|
||||
|
||||
template<class _Rp, class _Tp, class _A0, class _A1>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
__mem_fn<_Rp (_Tp::*)(_A0, _A1)>
|
||||
__mem_fn<_Rp (_Tp::*)(_A0, _A1) volatile>
|
||||
mem_fn(_Rp (_Tp::* __pm)(_A0, _A1) volatile)
|
||||
{
|
||||
return __mem_fn<_Rp (_Tp::*)(_A0, _A1)>(__pm);
|
||||
return __mem_fn<_Rp (_Tp::*)(_A0, _A1) volatile>(__pm);
|
||||
}
|
||||
|
||||
template<class _Rp, class _Tp, class _A0, class _A1, class _A2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
__mem_fn<_Rp (_Tp::*)(_A0, _A1, _A2)>
|
||||
__mem_fn<_Rp (_Tp::*)(_A0, _A1, _A2) volatile>
|
||||
mem_fn(_Rp (_Tp::* __pm)(_A0, _A1, _A2) volatile)
|
||||
{
|
||||
return __mem_fn<_Rp (_Tp::*)(_A0, _A1, _A2)>(__pm);
|
||||
return __mem_fn<_Rp (_Tp::*)(_A0, _A1, _A2) volatile>(__pm);
|
||||
}
|
||||
|
||||
template<class _Rp, class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
__mem_fn<_Rp (_Tp::*)()>
|
||||
__mem_fn<_Rp (_Tp::*)() const volatile>
|
||||
mem_fn(_Rp (_Tp::* __pm)() const volatile)
|
||||
{
|
||||
return __mem_fn<_Rp (_Tp::*)()>(__pm);
|
||||
return __mem_fn<_Rp (_Tp::*)() const volatile>(__pm);
|
||||
}
|
||||
|
||||
template<class _Rp, class _Tp, class _A0>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
__mem_fn<_Rp (_Tp::*)(_A0)>
|
||||
__mem_fn<_Rp (_Tp::*)(_A0) const volatile>
|
||||
mem_fn(_Rp (_Tp::* __pm)(_A0) const volatile)
|
||||
{
|
||||
return __mem_fn<_Rp (_Tp::*)(_A0)>(__pm);
|
||||
return __mem_fn<_Rp (_Tp::*)(_A0) const volatile>(__pm);
|
||||
}
|
||||
|
||||
template<class _Rp, class _Tp, class _A0, class _A1>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
__mem_fn<_Rp (_Tp::*)(_A0, _A1)>
|
||||
__mem_fn<_Rp (_Tp::*)(_A0, _A1) const volatile>
|
||||
mem_fn(_Rp (_Tp::* __pm)(_A0, _A1) const volatile)
|
||||
{
|
||||
return __mem_fn<_Rp (_Tp::*)(_A0, _A1)>(__pm);
|
||||
return __mem_fn<_Rp (_Tp::*)(_A0, _A1) const volatile>(__pm);
|
||||
}
|
||||
|
||||
template<class _Rp, class _Tp, class _A0, class _A1, class _A2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
__mem_fn<_Rp (_Tp::*)(_A0, _A1, _A2)>
|
||||
__mem_fn<_Rp (_Tp::*)(_A0, _A1, _A2) const volatile>
|
||||
mem_fn(_Rp (_Tp::* __pm)(_A0, _A1, _A2) const volatile)
|
||||
{
|
||||
return __mem_fn<_Rp (_Tp::*)(_A0, _A1, _A2)>(__pm);
|
||||
return __mem_fn<_Rp (_Tp::*)(_A0, _A1, _A2) const volatile>(__pm);
|
||||
}
|
||||
|
||||
// bad_function_call
|
||||
@@ -203,7 +203,7 @@ class _LIBCPP_EXCEPTION_ABI bad_function_call
|
||||
{
|
||||
};
|
||||
|
||||
template<class _Fp> class _LIBCPP_VISIBLE function; // undefined
|
||||
template<class _Fp> class _LIBCPP_TYPE_VIS_ONLY function; // undefined
|
||||
|
||||
namespace __function
|
||||
{
|
||||
@@ -644,7 +644,7 @@ __func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::target_type() const
|
||||
} // __function
|
||||
|
||||
template<class _Rp>
|
||||
class _LIBCPP_VISIBLE function<_Rp()>
|
||||
class _LIBCPP_TYPE_VIS_ONLY function<_Rp()>
|
||||
{
|
||||
typedef __function::__base<_Rp()> __base;
|
||||
aligned_storage<3*sizeof(void*)>::type __buf_;
|
||||
@@ -928,7 +928,7 @@ function<_Rp()>::target() const
|
||||
#endif // _LIBCPP_NO_RTTI
|
||||
|
||||
template<class _Rp, class _A0>
|
||||
class _LIBCPP_VISIBLE function<_Rp(_A0)>
|
||||
class _LIBCPP_TYPE_VIS_ONLY function<_Rp(_A0)>
|
||||
: public unary_function<_A0, _Rp>
|
||||
{
|
||||
typedef __function::__base<_Rp(_A0)> __base;
|
||||
@@ -1230,7 +1230,7 @@ function<_Rp(_A0)>::target() const
|
||||
#endif // _LIBCPP_NO_RTTI
|
||||
|
||||
template<class _Rp, class _A0, class _A1>
|
||||
class _LIBCPP_VISIBLE function<_Rp(_A0, _A1)>
|
||||
class _LIBCPP_TYPE_VIS_ONLY function<_Rp(_A0, _A1)>
|
||||
: public binary_function<_A0, _A1, _Rp>
|
||||
{
|
||||
typedef __function::__base<_Rp(_A0, _A1)> __base;
|
||||
@@ -1532,7 +1532,7 @@ function<_Rp(_A0, _A1)>::target() const
|
||||
#endif // _LIBCPP_NO_RTTI
|
||||
|
||||
template<class _Rp, class _A0, class _A1, class _A2>
|
||||
class _LIBCPP_VISIBLE function<_Rp(_A0, _A1, _A2)>
|
||||
class _LIBCPP_TYPE_VIS_ONLY function<_Rp(_A0, _A1, _A2)>
|
||||
{
|
||||
typedef __function::__base<_Rp(_A0, _A1, _A2)> __base;
|
||||
aligned_storage<3*sizeof(void*)>::type __buf_;
|
||||
@@ -1860,11 +1860,11 @@ swap(function<_Fp>& __x, function<_Fp>& __y)
|
||||
{return __x.swap(__y);}
|
||||
|
||||
template<class _Tp> struct __is_bind_expression : public false_type {};
|
||||
template<class _Tp> struct _LIBCPP_VISIBLE is_bind_expression
|
||||
template<class _Tp> struct _LIBCPP_TYPE_VIS_ONLY is_bind_expression
|
||||
: public __is_bind_expression<typename remove_cv<_Tp>::type> {};
|
||||
|
||||
template<class _Tp> struct __is_placeholder : public integral_constant<int, 0> {};
|
||||
template<class _Tp> struct _LIBCPP_VISIBLE is_placeholder
|
||||
template<class _Tp> struct _LIBCPP_TYPE_VIS_ONLY is_placeholder
|
||||
: public __is_placeholder<typename remove_cv<_Tp>::type> {};
|
||||
|
||||
namespace placeholders
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#include <type_traits>
|
||||
#include <typeinfo>
|
||||
#include <exception>
|
||||
#include <new>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
@@ -23,21 +24,21 @@
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _Arg, class _Result>
|
||||
struct _LIBCPP_VISIBLE unary_function
|
||||
struct _LIBCPP_TYPE_VIS_ONLY unary_function
|
||||
{
|
||||
typedef _Arg argument_type;
|
||||
typedef _Result result_type;
|
||||
};
|
||||
|
||||
template <class _Arg1, class _Arg2, class _Result>
|
||||
struct _LIBCPP_VISIBLE binary_function
|
||||
struct _LIBCPP_TYPE_VIS_ONLY binary_function
|
||||
{
|
||||
typedef _Arg1 first_argument_type;
|
||||
typedef _Arg2 second_argument_type;
|
||||
typedef _Result result_type;
|
||||
};
|
||||
|
||||
template <class _Tp> struct _LIBCPP_VISIBLE hash;
|
||||
template <class _Tp> struct _LIBCPP_TYPE_VIS_ONLY hash;
|
||||
|
||||
template <class _Tp>
|
||||
struct __has_result_type
|
||||
@@ -50,13 +51,80 @@ public:
|
||||
static const bool value = sizeof(__test<_Tp>(0)) == 1;
|
||||
};
|
||||
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
template <class _Tp = void>
|
||||
#else
|
||||
template <class _Tp>
|
||||
struct _LIBCPP_VISIBLE less : binary_function<_Tp, _Tp, bool>
|
||||
#endif
|
||||
struct _LIBCPP_TYPE_VIS_ONLY less : binary_function<_Tp, _Tp, bool>
|
||||
{
|
||||
_LIBCPP_INLINE_VISIBILITY bool operator()(const _Tp& __x, const _Tp& __y) const
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
||||
bool operator()(const _Tp& __x, const _Tp& __y) const
|
||||
{return __x < __y;}
|
||||
};
|
||||
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
template <>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY less<void>
|
||||
{
|
||||
template <class _T1, class _T2>
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
|
||||
auto operator()(_T1&& __t, _T2&& __u) const
|
||||
{ return _VSTD::forward<_T1>(__t) < _VSTD::forward<_T2>(__u); }
|
||||
typedef void is_transparent;
|
||||
};
|
||||
#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
|
||||
|
||||
#ifdef _LIBCPP_HAS_NO_VARIADICS
|
||||
|
||||
#include <__functional_base_03>
|
||||
@@ -292,7 +360,8 @@ struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...) const volatile>
|
||||
|
||||
// bullets 1 and 2
|
||||
|
||||
template <class _Fp, class _A0, class ..._Args>
|
||||
template <class _Fp, class _A0, class ..._Args,
|
||||
class>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
auto
|
||||
__invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args)
|
||||
@@ -301,7 +370,8 @@ __invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args)
|
||||
return (_VSTD::forward<_A0>(__a0).*__f)(_VSTD::forward<_Args>(__args)...);
|
||||
}
|
||||
|
||||
template <class _Fp, class _A0, class ..._Args>
|
||||
template <class _Fp, class _A0, class ..._Args,
|
||||
class>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
auto
|
||||
__invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args)
|
||||
@@ -312,7 +382,8 @@ __invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args)
|
||||
|
||||
// bullets 3 and 4
|
||||
|
||||
template <class _Fp, class _A0>
|
||||
template <class _Fp, class _A0,
|
||||
class>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
auto
|
||||
__invoke(_Fp&& __f, _A0&& __a0)
|
||||
@@ -321,7 +392,8 @@ __invoke(_Fp&& __f, _A0&& __a0)
|
||||
return _VSTD::forward<_A0>(__a0).*__f;
|
||||
}
|
||||
|
||||
template <class _Fp, class _A0>
|
||||
template <class _Fp, class _A0,
|
||||
class>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
auto
|
||||
__invoke(_Fp&& __f, _A0&& __a0)
|
||||
@@ -348,7 +420,7 @@ struct __invoke_return
|
||||
};
|
||||
|
||||
template <class _Tp>
|
||||
class _LIBCPP_VISIBLE reference_wrapper
|
||||
class _LIBCPP_TYPE_VIS_ONLY reference_wrapper
|
||||
: public __weak_result_type<_Tp>
|
||||
{
|
||||
public:
|
||||
@@ -359,7 +431,8 @@ private:
|
||||
|
||||
public:
|
||||
// construct/copy/destroy
|
||||
_LIBCPP_INLINE_VISIBILITY reference_wrapper(type& __f) _NOEXCEPT : __f_(&__f) {}
|
||||
_LIBCPP_INLINE_VISIBILITY reference_wrapper(type& __f) _NOEXCEPT
|
||||
: __f_(_VSTD::addressof(__f)) {}
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
private: reference_wrapper(type&&); public: // = delete; // do not bind to temps
|
||||
#endif
|
||||
@@ -432,6 +505,111 @@ template <class _Tp> void cref(const _Tp&&);// = delete;
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_VARIADICS
|
||||
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
template <class _Tp1, class _Tp2 = void>
|
||||
struct __is_transparent
|
||||
{
|
||||
private:
|
||||
struct __two {char __lx; char __lxx;};
|
||||
template <class _Up> static __two __test(...);
|
||||
template <class _Up> static char __test(typename _Up::is_transparent* = 0);
|
||||
public:
|
||||
static const bool value = sizeof(__test<_Tp1>(0)) == 1;
|
||||
};
|
||||
#endif
|
||||
|
||||
// allocator_arg_t
|
||||
|
||||
struct _LIBCPP_TYPE_VIS_ONLY allocator_arg_t { };
|
||||
|
||||
#if defined(_LIBCPP_HAS_NO_CONSTEXPR) || defined(_LIBCPP_BUILDING_MEMORY)
|
||||
extern const allocator_arg_t allocator_arg;
|
||||
#else
|
||||
constexpr allocator_arg_t allocator_arg = allocator_arg_t();
|
||||
#endif
|
||||
|
||||
// uses_allocator
|
||||
|
||||
template <class _Tp>
|
||||
struct __has_allocator_type
|
||||
{
|
||||
private:
|
||||
struct __two {char __lx; char __lxx;};
|
||||
template <class _Up> static __two __test(...);
|
||||
template <class _Up> static char __test(typename _Up::allocator_type* = 0);
|
||||
public:
|
||||
static const bool value = sizeof(__test<_Tp>(0)) == 1;
|
||||
};
|
||||
|
||||
template <class _Tp, class _Alloc, bool = __has_allocator_type<_Tp>::value>
|
||||
struct __uses_allocator
|
||||
: public integral_constant<bool,
|
||||
is_convertible<_Alloc, typename _Tp::allocator_type>::value>
|
||||
{
|
||||
};
|
||||
|
||||
template <class _Tp, class _Alloc>
|
||||
struct __uses_allocator<_Tp, _Alloc, false>
|
||||
: public false_type
|
||||
{
|
||||
};
|
||||
|
||||
template <class _Tp, class _Alloc>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY uses_allocator
|
||||
: public __uses_allocator<_Tp, _Alloc>
|
||||
{
|
||||
};
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
||||
|
||||
// allocator construction
|
||||
|
||||
template <class _Tp, class _Alloc, class ..._Args>
|
||||
struct __uses_alloc_ctor_imp
|
||||
{
|
||||
static const bool __ua = uses_allocator<_Tp, _Alloc>::value;
|
||||
static const bool __ic =
|
||||
is_constructible<_Tp, allocator_arg_t, _Alloc, _Args...>::value;
|
||||
static const int value = __ua ? 2 - __ic : 0;
|
||||
};
|
||||
|
||||
template <class _Tp, class _Alloc, class ..._Args>
|
||||
struct __uses_alloc_ctor
|
||||
: integral_constant<int, __uses_alloc_ctor_imp<_Tp, _Alloc, _Args...>::value>
|
||||
{};
|
||||
|
||||
template <class _Tp, class _Allocator, class... _Args>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void __user_alloc_construct_impl (integral_constant<int, 0>, _Tp *__storage, const _Allocator &, _Args &&... __args )
|
||||
{
|
||||
new (__storage) _Tp (_VSTD::forward<_Args>(__args)...);
|
||||
}
|
||||
|
||||
template <class _Tp, class _Allocator, class... _Args>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void __user_alloc_construct_impl (integral_constant<int, 1>, _Tp *__storage, const _Allocator &__a, _Args &&... __args )
|
||||
{
|
||||
new (__storage) _Tp (allocator_arg, __a, _VSTD::forward<_Args>(__args)...);
|
||||
}
|
||||
|
||||
template <class _Tp, class _Allocator, class... _Args>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void __user_alloc_construct_impl (integral_constant<int, 2>, _Tp *__storage, const _Allocator &__a, _Args &&... __args )
|
||||
{
|
||||
new (__storage) _Tp (_VSTD::forward<_Args>(__args)..., __a);
|
||||
}
|
||||
|
||||
template <class _Tp, class _Allocator, class... _Args>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void __user_alloc_construct (_Tp *__storage, const _Allocator &__a, _Args &&... __args)
|
||||
{
|
||||
__user_alloc_construct_impl(
|
||||
__uses_alloc_ctor<_Tp, _Allocator>(),
|
||||
__storage, __a, _VSTD::forward<_Args>(__args)...
|
||||
);
|
||||
}
|
||||
#endif // _LIBCPP_HAS_NO_VARIADICS
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP_FUNCTIONAL_BASE
|
||||
|
||||
@@ -996,7 +996,7 @@ struct __invoke_return2
|
||||
};
|
||||
|
||||
template <class _Tp>
|
||||
class _LIBCPP_VISIBLE reference_wrapper
|
||||
class _LIBCPP_TYPE_VIS_ONLY reference_wrapper
|
||||
: public __weak_result_type<_Tp>
|
||||
{
|
||||
public:
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
110
include/__locale
110
include/__locale
@@ -19,11 +19,13 @@
|
||||
#include <cstdint>
|
||||
#include <cctype>
|
||||
#include <locale.h>
|
||||
#if _WIN32
|
||||
#if defined(_LIBCPP_MSVCRT) || defined(__MINGW32__)
|
||||
# include <support/win32/locale_win32.h>
|
||||
#elif (__GLIBC__ || __APPLE__ || __FreeBSD__ || __sun__)
|
||||
#elif _AIX
|
||||
# include <support/ibm/xlocale.h>
|
||||
#elif (defined(__GLIBC__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__sun__)) || defined(__EMSCRIPTEN__) || defined(__IBMCPP__)
|
||||
# include <xlocale.h>
|
||||
#endif // _WIN32 || __GLIBC__ || __APPLE__ || __FreeBSD_
|
||||
#endif // _WIN32 || __GLIBC__ || __APPLE__ || __FreeBSD__ || __sun__ || __EMSCRIPTEN__ || __IBMCPP__
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
@@ -31,7 +33,7 @@
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
class _LIBCPP_VISIBLE locale;
|
||||
class _LIBCPP_TYPE_VIS locale;
|
||||
|
||||
template <class _Facet>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
@@ -43,12 +45,12 @@ _LIBCPP_INLINE_VISIBILITY
|
||||
const _Facet&
|
||||
use_facet(const locale&);
|
||||
|
||||
class _LIBCPP_VISIBLE locale
|
||||
class _LIBCPP_TYPE_VIS locale
|
||||
{
|
||||
public:
|
||||
// types:
|
||||
class _LIBCPP_VISIBLE facet;
|
||||
class _LIBCPP_VISIBLE id;
|
||||
class _LIBCPP_TYPE_VIS facet;
|
||||
class _LIBCPP_TYPE_VIS id;
|
||||
|
||||
typedef int category;
|
||||
static const category // values assigned here are for exposition only
|
||||
@@ -103,7 +105,7 @@ private:
|
||||
template <class _Facet> friend const _Facet& use_facet(const locale&);
|
||||
};
|
||||
|
||||
class _LIBCPP_VISIBLE locale::facet
|
||||
class _LIBCPP_TYPE_VIS locale::facet
|
||||
: public __shared_count
|
||||
{
|
||||
protected:
|
||||
@@ -119,7 +121,7 @@ private:
|
||||
virtual void __on_zero_shared() _NOEXCEPT;
|
||||
};
|
||||
|
||||
class _LIBCPP_VISIBLE locale::id
|
||||
class _LIBCPP_TYPE_VIS locale::id
|
||||
{
|
||||
once_flag __flag_;
|
||||
int32_t __id_;
|
||||
@@ -175,7 +177,7 @@ use_facet(const locale& __l)
|
||||
// template <class _CharT> class collate;
|
||||
|
||||
template <class _CharT>
|
||||
class _LIBCPP_VISIBLE collate
|
||||
class _LIBCPP_TYPE_VIS_ONLY collate
|
||||
: public locale::facet
|
||||
{
|
||||
public:
|
||||
@@ -254,15 +256,15 @@ collate<_CharT>::do_hash(const char_type* __lo, const char_type* __hi) const
|
||||
return static_cast<long>(__h);
|
||||
}
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_VISIBLE collate<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_VISIBLE collate<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS collate<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS collate<wchar_t>)
|
||||
|
||||
// template <class CharT> class collate_byname;
|
||||
|
||||
template <class _CharT> class _LIBCPP_VISIBLE collate_byname;
|
||||
template <class _CharT> class _LIBCPP_TYPE_VIS_ONLY collate_byname;
|
||||
|
||||
template <>
|
||||
class _LIBCPP_VISIBLE collate_byname<char>
|
||||
class _LIBCPP_TYPE_VIS collate_byname<char>
|
||||
: public collate<char>
|
||||
{
|
||||
locale_t __l;
|
||||
@@ -281,7 +283,7 @@ protected:
|
||||
};
|
||||
|
||||
template <>
|
||||
class _LIBCPP_VISIBLE collate_byname<wchar_t>
|
||||
class _LIBCPP_TYPE_VIS collate_byname<wchar_t>
|
||||
: public collate<wchar_t>
|
||||
{
|
||||
locale_t __l;
|
||||
@@ -312,10 +314,10 @@ locale::operator()(const basic_string<_CharT, _Traits, _Allocator>& __x,
|
||||
|
||||
// template <class charT> class ctype
|
||||
|
||||
class _LIBCPP_VISIBLE ctype_base
|
||||
class _LIBCPP_TYPE_VIS ctype_base
|
||||
{
|
||||
public:
|
||||
#if __GLIBC__
|
||||
#ifdef __GLIBC__
|
||||
typedef unsigned short mask;
|
||||
static const mask space = _ISspace;
|
||||
static const mask print = _ISprint;
|
||||
@@ -327,7 +329,7 @@ public:
|
||||
static const mask punct = _ISpunct;
|
||||
static const mask xdigit = _ISxdigit;
|
||||
static const mask blank = _ISblank;
|
||||
#elif _WIN32
|
||||
#elif defined(_WIN32)
|
||||
typedef unsigned short mask;
|
||||
static const mask space = _SPACE;
|
||||
static const mask print = _BLANK|_PUNCT|_ALPHA|_DIGIT;
|
||||
@@ -339,11 +341,13 @@ public:
|
||||
static const mask punct = _PUNCT;
|
||||
static const mask xdigit = _HEX;
|
||||
static const mask blank = _BLANK;
|
||||
#elif (__APPLE__ || __FreeBSD__)
|
||||
#if __APPLE__
|
||||
#elif defined(__APPLE__) || defined(__FreeBSD__) || defined(__EMSCRIPTEN__) || defined(__NetBSD__)
|
||||
#ifdef __APPLE__
|
||||
typedef __uint32_t mask;
|
||||
#elif __FreeBSD__
|
||||
#elif defined(__FreeBSD__)
|
||||
typedef unsigned long mask;
|
||||
#elif defined(__EMSCRIPTEN__) || defined(__NetBSD__)
|
||||
typedef unsigned short mask;
|
||||
#endif
|
||||
static const mask space = _CTYPE_S;
|
||||
static const mask print = _CTYPE_R;
|
||||
@@ -354,8 +358,12 @@ public:
|
||||
static const mask digit = _CTYPE_D;
|
||||
static const mask punct = _CTYPE_P;
|
||||
static const mask xdigit = _CTYPE_X;
|
||||
# if defined(__NetBSD__)
|
||||
static const mask blank = _CTYPE_BL;
|
||||
# else
|
||||
static const mask blank = _CTYPE_B;
|
||||
#elif __sun__
|
||||
# endif
|
||||
#elif defined(__sun__) || defined(_AIX)
|
||||
typedef unsigned int mask;
|
||||
static const mask space = _ISSPACE;
|
||||
static const mask print = _ISPRINT;
|
||||
@@ -367,7 +375,7 @@ public:
|
||||
static const mask punct = _ISPUNCT;
|
||||
static const mask xdigit = _ISXDIGIT;
|
||||
static const mask blank = _ISBLANK;
|
||||
#else // __GLIBC__ || _WIN32 || __APPLE__ || __FreeBSD__ || __sun__
|
||||
#else // __GLIBC__ || _WIN32 || __APPLE__ || __FreeBSD__ || __EMSCRIPTEN__ || __sun__
|
||||
typedef unsigned long mask;
|
||||
static const mask space = 1<<0;
|
||||
static const mask print = 1<<1;
|
||||
@@ -386,10 +394,10 @@ public:
|
||||
_LIBCPP_ALWAYS_INLINE ctype_base() {}
|
||||
};
|
||||
|
||||
template <class _CharT> class _LIBCPP_VISIBLE ctype;
|
||||
template <class _CharT> class _LIBCPP_TYPE_VIS_ONLY ctype;
|
||||
|
||||
template <>
|
||||
class _LIBCPP_VISIBLE ctype<wchar_t>
|
||||
class _LIBCPP_TYPE_VIS ctype<wchar_t>
|
||||
: public locale::facet,
|
||||
public ctype_base
|
||||
{
|
||||
@@ -491,7 +499,7 @@ protected:
|
||||
};
|
||||
|
||||
template <>
|
||||
class _LIBCPP_VISIBLE ctype<char>
|
||||
class _LIBCPP_TYPE_VIS ctype<char>
|
||||
: public locale::facet, public ctype_base
|
||||
{
|
||||
const mask* __tab_;
|
||||
@@ -504,7 +512,7 @@ public:
|
||||
_LIBCPP_ALWAYS_INLINE
|
||||
bool is(mask __m, char_type __c) const
|
||||
{
|
||||
return isascii(__c) ? __tab_[static_cast<int>(__c)] & __m : false;
|
||||
return isascii(__c) ? (__tab_[static_cast<int>(__c)] & __m) !=0 : false;
|
||||
}
|
||||
|
||||
_LIBCPP_ALWAYS_INLINE
|
||||
@@ -590,10 +598,14 @@ public:
|
||||
#endif
|
||||
_LIBCPP_ALWAYS_INLINE const mask* table() const _NOEXCEPT {return __tab_;}
|
||||
static const mask* classic_table() _NOEXCEPT;
|
||||
#if defined(__GLIBC__)
|
||||
#if defined(__GLIBC__) || defined(__EMSCRIPTEN__)
|
||||
static const int* __classic_upper_table() _NOEXCEPT;
|
||||
static const int* __classic_lower_table() _NOEXCEPT;
|
||||
#endif
|
||||
#if defined(__NetBSD__)
|
||||
static const short* __classic_upper_table() _NOEXCEPT;
|
||||
static const short* __classic_lower_table() _NOEXCEPT;
|
||||
#endif
|
||||
|
||||
protected:
|
||||
~ctype();
|
||||
@@ -609,10 +621,10 @@ protected:
|
||||
|
||||
// template <class CharT> class ctype_byname;
|
||||
|
||||
template <class _CharT> class _LIBCPP_VISIBLE ctype_byname;
|
||||
template <class _CharT> class _LIBCPP_TYPE_VIS_ONLY ctype_byname;
|
||||
|
||||
template <>
|
||||
class _LIBCPP_VISIBLE ctype_byname<char>
|
||||
class _LIBCPP_TYPE_VIS ctype_byname<char>
|
||||
: public ctype<char>
|
||||
{
|
||||
locale_t __l;
|
||||
@@ -630,7 +642,7 @@ protected:
|
||||
};
|
||||
|
||||
template <>
|
||||
class _LIBCPP_VISIBLE ctype_byname<wchar_t>
|
||||
class _LIBCPP_TYPE_VIS ctype_byname<wchar_t>
|
||||
: public ctype<wchar_t>
|
||||
{
|
||||
locale_t __l;
|
||||
@@ -761,7 +773,7 @@ tolower(_CharT __c, const locale& __loc)
|
||||
|
||||
// codecvt_base
|
||||
|
||||
class _LIBCPP_VISIBLE codecvt_base
|
||||
class _LIBCPP_TYPE_VIS codecvt_base
|
||||
{
|
||||
public:
|
||||
_LIBCPP_ALWAYS_INLINE codecvt_base() {}
|
||||
@@ -770,12 +782,12 @@ public:
|
||||
|
||||
// template <class internT, class externT, class stateT> class codecvt;
|
||||
|
||||
template <class _InternT, class _ExternT, class _StateT> class _LIBCPP_VISIBLE codecvt;
|
||||
template <class _InternT, class _ExternT, class _StateT> class _LIBCPP_TYPE_VIS_ONLY codecvt;
|
||||
|
||||
// template <> class codecvt<char, char, mbstate_t>
|
||||
|
||||
template <>
|
||||
class _LIBCPP_VISIBLE codecvt<char, char, mbstate_t>
|
||||
class _LIBCPP_TYPE_VIS codecvt<char, char, mbstate_t>
|
||||
: public locale::facet,
|
||||
public codecvt_base
|
||||
{
|
||||
@@ -861,7 +873,7 @@ protected:
|
||||
// template <> class codecvt<wchar_t, char, mbstate_t>
|
||||
|
||||
template <>
|
||||
class _LIBCPP_VISIBLE codecvt<wchar_t, char, mbstate_t>
|
||||
class _LIBCPP_TYPE_VIS codecvt<wchar_t, char, mbstate_t>
|
||||
: public locale::facet,
|
||||
public codecvt_base
|
||||
{
|
||||
@@ -944,7 +956,7 @@ protected:
|
||||
// template <> class codecvt<char16_t, char, mbstate_t>
|
||||
|
||||
template <>
|
||||
class _LIBCPP_VISIBLE codecvt<char16_t, char, mbstate_t>
|
||||
class _LIBCPP_TYPE_VIS codecvt<char16_t, char, mbstate_t>
|
||||
: public locale::facet,
|
||||
public codecvt_base
|
||||
{
|
||||
@@ -1030,7 +1042,7 @@ protected:
|
||||
// template <> class codecvt<char32_t, char, mbstate_t>
|
||||
|
||||
template <>
|
||||
class _LIBCPP_VISIBLE codecvt<char32_t, char, mbstate_t>
|
||||
class _LIBCPP_TYPE_VIS codecvt<char32_t, char, mbstate_t>
|
||||
: public locale::facet,
|
||||
public codecvt_base
|
||||
{
|
||||
@@ -1116,7 +1128,7 @@ protected:
|
||||
// template <class _InternT, class _ExternT, class _StateT> class codecvt_byname
|
||||
|
||||
template <class _InternT, class _ExternT, class _StateT>
|
||||
class _LIBCPP_VISIBLE codecvt_byname
|
||||
class _LIBCPP_TYPE_VIS_ONLY codecvt_byname
|
||||
: public codecvt<_InternT, _ExternT, _StateT>
|
||||
{
|
||||
public:
|
||||
@@ -1135,12 +1147,12 @@ codecvt_byname<_InternT, _ExternT, _StateT>::~codecvt_byname()
|
||||
{
|
||||
}
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE(class codecvt_byname<char, char, mbstate_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class codecvt_byname<wchar_t, char, mbstate_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class codecvt_byname<char16_t, char, mbstate_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class codecvt_byname<char32_t, char, mbstate_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS codecvt_byname<char, char, mbstate_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS codecvt_byname<wchar_t, char, mbstate_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS codecvt_byname<char16_t, char, mbstate_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS codecvt_byname<char32_t, char, mbstate_t>)
|
||||
|
||||
_LIBCPP_VISIBLE void __throw_runtime_error(const char*);
|
||||
_LIBCPP_FUNC_VIS void __throw_runtime_error(const char*);
|
||||
|
||||
template <size_t _Np>
|
||||
struct __narrow_to_utf8
|
||||
@@ -1324,10 +1336,10 @@ struct __widen_from_utf8<32>
|
||||
|
||||
// template <class charT> class numpunct
|
||||
|
||||
template <class _CharT> class _LIBCPP_VISIBLE numpunct;
|
||||
template <class _CharT> class _LIBCPP_TYPE_VIS_ONLY numpunct;
|
||||
|
||||
template <>
|
||||
class _LIBCPP_VISIBLE numpunct<char>
|
||||
class _LIBCPP_TYPE_VIS numpunct<char>
|
||||
: public locale::facet
|
||||
{
|
||||
public:
|
||||
@@ -1358,7 +1370,7 @@ protected:
|
||||
};
|
||||
|
||||
template <>
|
||||
class _LIBCPP_VISIBLE numpunct<wchar_t>
|
||||
class _LIBCPP_TYPE_VIS numpunct<wchar_t>
|
||||
: public locale::facet
|
||||
{
|
||||
public:
|
||||
@@ -1390,10 +1402,10 @@ protected:
|
||||
|
||||
// template <class charT> class numpunct_byname
|
||||
|
||||
template <class charT> class _LIBCPP_VISIBLE numpunct_byname;
|
||||
template <class charT> class _LIBCPP_TYPE_VIS_ONLY numpunct_byname;
|
||||
|
||||
template <>
|
||||
class _LIBCPP_VISIBLE numpunct_byname<char>
|
||||
class _LIBCPP_TYPE_VIS numpunct_byname<char>
|
||||
: public numpunct<char>
|
||||
{
|
||||
public:
|
||||
@@ -1411,7 +1423,7 @@ private:
|
||||
};
|
||||
|
||||
template <>
|
||||
class _LIBCPP_VISIBLE numpunct_byname<wchar_t>
|
||||
class _LIBCPP_TYPE_VIS numpunct_byname<wchar_t>
|
||||
: public numpunct<wchar_t>
|
||||
{
|
||||
public:
|
||||
|
||||
@@ -20,19 +20,9 @@
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#ifdef _LIBCPP_SHARED_LOCK
|
||||
|
||||
namespace ting {
|
||||
template <class _Mutex> class shared_lock;
|
||||
template <class _Mutex> class upgrade_lock;
|
||||
}
|
||||
|
||||
#endif // _LIBCPP_SHARED_LOCK
|
||||
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
class _LIBCPP_VISIBLE mutex
|
||||
class _LIBCPP_TYPE_VIS mutex
|
||||
{
|
||||
pthread_mutex_t __m_;
|
||||
|
||||
@@ -58,9 +48,9 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY native_handle_type native_handle() {return &__m_;}
|
||||
};
|
||||
|
||||
struct _LIBCPP_VISIBLE defer_lock_t {};
|
||||
struct _LIBCPP_VISIBLE try_to_lock_t {};
|
||||
struct _LIBCPP_VISIBLE adopt_lock_t {};
|
||||
struct _LIBCPP_TYPE_VIS defer_lock_t {};
|
||||
struct _LIBCPP_TYPE_VIS try_to_lock_t {};
|
||||
struct _LIBCPP_TYPE_VIS adopt_lock_t {};
|
||||
|
||||
#if defined(_LIBCPP_HAS_NO_CONSTEXPR) || defined(_LIBCPP_BUILDING_MUTEX)
|
||||
|
||||
@@ -77,7 +67,7 @@ constexpr adopt_lock_t adopt_lock = adopt_lock_t();
|
||||
#endif
|
||||
|
||||
template <class _Mutex>
|
||||
class _LIBCPP_VISIBLE lock_guard
|
||||
class _LIBCPP_TYPE_VIS_ONLY lock_guard
|
||||
{
|
||||
public:
|
||||
typedef _Mutex mutex_type;
|
||||
@@ -101,7 +91,7 @@ private:
|
||||
};
|
||||
|
||||
template <class _Mutex>
|
||||
class _LIBCPP_VISIBLE unique_lock
|
||||
class _LIBCPP_TYPE_VIS_ONLY unique_lock
|
||||
{
|
||||
public:
|
||||
typedef _Mutex mutex_type;
|
||||
@@ -162,27 +152,6 @@ public:
|
||||
return *this;
|
||||
}
|
||||
|
||||
#ifdef _LIBCPP_SHARED_LOCK
|
||||
|
||||
unique_lock(ting::shared_lock<mutex_type>&&, try_to_lock_t);
|
||||
template <class _Clock, class _Duration>
|
||||
unique_lock(ting::shared_lock<mutex_type>&&,
|
||||
const chrono::time_point<_Clock, _Duration>&);
|
||||
template <class _Rep, class _Period>
|
||||
unique_lock(ting::shared_lock<mutex_type>&&,
|
||||
const chrono::duration<_Rep, _Period>&);
|
||||
|
||||
explicit unique_lock(ting::upgrade_lock<mutex_type>&&);
|
||||
unique_lock(ting::upgrade_lock<mutex_type>&&, try_to_lock_t);
|
||||
template <class _Clock, class _Duration>
|
||||
unique_lock(ting::upgrade_lock<mutex_type>&&,
|
||||
const chrono::time_point<_Clock, _Duration>&);
|
||||
template <class _Rep, class _Period>
|
||||
unique_lock(ting::upgrade_lock<mutex_type>&&,
|
||||
const chrono::duration<_Rep, _Period>&);
|
||||
|
||||
#endif // _LIBCPP_SHARED_LOCK
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
|
||||
void lock();
|
||||
@@ -285,7 +254,7 @@ void
|
||||
swap(unique_lock<_Mutex>& __x, unique_lock<_Mutex>& __y) _NOEXCEPT
|
||||
{__x.swap(__y);}
|
||||
|
||||
struct _LIBCPP_VISIBLE cv_status
|
||||
struct _LIBCPP_TYPE_VIS cv_status
|
||||
{
|
||||
enum __lx {
|
||||
no_timeout,
|
||||
@@ -299,7 +268,7 @@ struct _LIBCPP_VISIBLE cv_status
|
||||
|
||||
};
|
||||
|
||||
class _LIBCPP_VISIBLE condition_variable
|
||||
class _LIBCPP_TYPE_VIS condition_variable
|
||||
{
|
||||
pthread_cond_t __cv_;
|
||||
public:
|
||||
|
||||
@@ -285,16 +285,16 @@ __split_buffer<_Tp, _Allocator>::__construct_at_end(_ForwardIterator __first, _F
|
||||
}
|
||||
|
||||
template <class _Tp, class _Allocator>
|
||||
_LIBCPP_INLINE_VISIBILITY inline
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
__split_buffer<_Tp, _Allocator>::__destruct_at_begin(pointer __new_begin, false_type)
|
||||
{
|
||||
while (__begin_ != __new_begin)
|
||||
__alloc_traits::destroy(__alloc(), __begin_++);
|
||||
__alloc_traits::destroy(__alloc(), __to_raw_pointer(__begin_++));
|
||||
}
|
||||
|
||||
template <class _Tp, class _Allocator>
|
||||
_LIBCPP_INLINE_VISIBILITY inline
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
__split_buffer<_Tp, _Allocator>::__destruct_at_begin(pointer __new_begin, true_type)
|
||||
{
|
||||
@@ -302,16 +302,16 @@ __split_buffer<_Tp, _Allocator>::__destruct_at_begin(pointer __new_begin, true_t
|
||||
}
|
||||
|
||||
template <class _Tp, class _Allocator>
|
||||
_LIBCPP_INLINE_VISIBILITY inline
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
__split_buffer<_Tp, _Allocator>::__destruct_at_end(pointer __new_last, false_type) _NOEXCEPT
|
||||
{
|
||||
while (__new_last != __end_)
|
||||
__alloc_traits::destroy(__alloc(), --__end_);
|
||||
__alloc_traits::destroy(__alloc(), __to_raw_pointer(--__end_));
|
||||
}
|
||||
|
||||
template <class _Tp, class _Allocator>
|
||||
_LIBCPP_INLINE_VISIBILITY inline
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
__split_buffer<_Tp, _Allocator>::__destruct_at_end(pointer __new_last, true_type) _NOEXCEPT
|
||||
{
|
||||
@@ -320,7 +320,7 @@ __split_buffer<_Tp, _Allocator>::__destruct_at_end(pointer __new_last, true_type
|
||||
|
||||
template <class _Tp, class _Allocator>
|
||||
__split_buffer<_Tp, _Allocator>::__split_buffer(size_type __cap, size_type __start, __alloc_rr& __a)
|
||||
: __end_cap_(0, __a)
|
||||
: __end_cap_(nullptr, __a)
|
||||
{
|
||||
__first_ = __cap != 0 ? __alloc_traits::allocate(__alloc(), __cap) : nullptr;
|
||||
__begin_ = __end_ = __first_ + __start;
|
||||
@@ -328,24 +328,24 @@ __split_buffer<_Tp, _Allocator>::__split_buffer(size_type __cap, size_type __sta
|
||||
}
|
||||
|
||||
template <class _Tp, class _Allocator>
|
||||
_LIBCPP_INLINE_VISIBILITY inline
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
__split_buffer<_Tp, _Allocator>::__split_buffer()
|
||||
_NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
|
||||
: __first_(0), __begin_(0), __end_(0), __end_cap_(0)
|
||||
: __first_(nullptr), __begin_(nullptr), __end_(nullptr), __end_cap_(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
template <class _Tp, class _Allocator>
|
||||
_LIBCPP_INLINE_VISIBILITY inline
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
__split_buffer<_Tp, _Allocator>::__split_buffer(__alloc_rr& __a)
|
||||
: __first_(0), __begin_(0), __end_(0), __end_cap_(0, __a)
|
||||
: __first_(nullptr), __begin_(nullptr), __end_(nullptr), __end_cap_(nullptr, __a)
|
||||
{
|
||||
}
|
||||
|
||||
template <class _Tp, class _Allocator>
|
||||
_LIBCPP_INLINE_VISIBILITY inline
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
__split_buffer<_Tp, _Allocator>::__split_buffer(const __alloc_rr& __a)
|
||||
: __first_(0), __begin_(0), __end_(0), __end_cap_(0, __a)
|
||||
: __first_(nullptr), __begin_(nullptr), __end_(nullptr), __end_cap_(nullptr, __a)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -541,7 +541,7 @@ __split_buffer<_Tp, _Allocator>::push_front(value_type&& __x)
|
||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
|
||||
template <class _Tp, class _Allocator>
|
||||
_LIBCPP_INLINE_VISIBILITY inline
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
__split_buffer<_Tp, _Allocator>::push_back(const_reference __x)
|
||||
{
|
||||
@@ -640,7 +640,7 @@ __split_buffer<_Tp, _Allocator>::emplace_back(_Args&&... __args)
|
||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
|
||||
template <class _Tp, class _Allocator>
|
||||
_LIBCPP_INLINE_VISIBILITY inline
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
swap(__split_buffer<_Tp, _Allocator>& __x, __split_buffer<_Tp, _Allocator>& __y)
|
||||
_NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
|
||||
|
||||
@@ -41,7 +41,7 @@ public:
|
||||
typedef typename traits_type::off_type off_type;
|
||||
typedef typename traits_type::state_type state_type;
|
||||
|
||||
explicit __stdinbuf(FILE* __fp);
|
||||
__stdinbuf(FILE* __fp, state_type* __st);
|
||||
|
||||
protected:
|
||||
virtual int_type underflow();
|
||||
@@ -53,8 +53,10 @@ private:
|
||||
|
||||
FILE* __file_;
|
||||
const codecvt<char_type, char, state_type>* __cv_;
|
||||
state_type __st_;
|
||||
state_type* __st_;
|
||||
int __encoding_;
|
||||
int_type __last_consumed_;
|
||||
bool __last_consumed_is_next_;
|
||||
bool __always_noconv_;
|
||||
|
||||
__stdinbuf(const __stdinbuf&);
|
||||
@@ -64,9 +66,11 @@ private:
|
||||
};
|
||||
|
||||
template <class _CharT>
|
||||
__stdinbuf<_CharT>::__stdinbuf(FILE* __fp)
|
||||
__stdinbuf<_CharT>::__stdinbuf(FILE* __fp, state_type* __st)
|
||||
: __file_(__fp),
|
||||
__st_()
|
||||
__st_(__st),
|
||||
__last_consumed_(traits_type::eof()),
|
||||
__last_consumed_is_next_(false)
|
||||
{
|
||||
imbue(this->getloc());
|
||||
}
|
||||
@@ -100,6 +104,16 @@ template <class _CharT>
|
||||
typename __stdinbuf<_CharT>::int_type
|
||||
__stdinbuf<_CharT>::__getchar(bool __consume)
|
||||
{
|
||||
if (__last_consumed_is_next_)
|
||||
{
|
||||
int_type __result = __last_consumed_;
|
||||
if (__consume)
|
||||
{
|
||||
__last_consumed_ = traits_type::eof();
|
||||
__last_consumed_is_next_ = false;
|
||||
}
|
||||
return __result;
|
||||
}
|
||||
char __extbuf[__limit];
|
||||
int __nread = _VSTD::max(1, __encoding_);
|
||||
for (int __i = 0; __i < __nread; ++__i)
|
||||
@@ -119,15 +133,15 @@ __stdinbuf<_CharT>::__getchar(bool __consume)
|
||||
codecvt_base::result __r;
|
||||
do
|
||||
{
|
||||
state_type __sv_st = __st_;
|
||||
__r = __cv_->in(__st_, __extbuf, __extbuf + __nread, __enxt,
|
||||
state_type __sv_st = *__st_;
|
||||
__r = __cv_->in(*__st_, __extbuf, __extbuf + __nread, __enxt,
|
||||
&__1buf, &__1buf + 1, __inxt);
|
||||
switch (__r)
|
||||
{
|
||||
case _VSTD::codecvt_base::ok:
|
||||
break;
|
||||
case codecvt_base::partial:
|
||||
__st_ = __sv_st;
|
||||
*__st_ = __sv_st;
|
||||
if (__nread == sizeof(__extbuf))
|
||||
return traits_type::eof();
|
||||
{
|
||||
@@ -150,10 +164,12 @@ __stdinbuf<_CharT>::__getchar(bool __consume)
|
||||
{
|
||||
for (int __i = __nread; __i > 0;)
|
||||
{
|
||||
if (ungetc(__extbuf[--__i], __file_) == EOF)
|
||||
if (ungetc(traits_type::to_int_type(__extbuf[--__i]), __file_) == EOF)
|
||||
return traits_type::eof();
|
||||
}
|
||||
}
|
||||
else
|
||||
__last_consumed_ = traits_type::to_int_type(__1buf);
|
||||
return traits_type::to_int_type(__1buf);
|
||||
}
|
||||
|
||||
@@ -162,28 +178,41 @@ typename __stdinbuf<_CharT>::int_type
|
||||
__stdinbuf<_CharT>::pbackfail(int_type __c)
|
||||
{
|
||||
if (traits_type::eq_int_type(__c, traits_type::eof()))
|
||||
return __c;
|
||||
char __extbuf[__limit];
|
||||
char* __enxt;
|
||||
const char_type __ci = traits_type::to_char_type(__c);
|
||||
const char_type* __inxt;
|
||||
switch (__cv_->out(__st_, &__ci, &__ci + 1, __inxt,
|
||||
__extbuf, __extbuf + sizeof(__extbuf), __enxt))
|
||||
{
|
||||
case _VSTD::codecvt_base::ok:
|
||||
break;
|
||||
case _VSTD::codecvt_base::noconv:
|
||||
__extbuf[0] = static_cast<char>(__c);
|
||||
__enxt = __extbuf + 1;
|
||||
break;
|
||||
case codecvt_base::partial:
|
||||
case codecvt_base::error:
|
||||
return traits_type::eof();
|
||||
if (!__last_consumed_is_next_)
|
||||
{
|
||||
__c = __last_consumed_;
|
||||
__last_consumed_is_next_ = !traits_type::eq_int_type(__last_consumed_,
|
||||
traits_type::eof());
|
||||
}
|
||||
return __c;
|
||||
}
|
||||
while (__enxt > __extbuf)
|
||||
if (ungetc(*--__enxt, __file_) == EOF)
|
||||
if (__last_consumed_is_next_)
|
||||
{
|
||||
char __extbuf[__limit];
|
||||
char* __enxt;
|
||||
const char_type __ci = traits_type::to_char_type(__last_consumed_);
|
||||
const char_type* __inxt;
|
||||
switch (__cv_->out(*__st_, &__ci, &__ci + 1, __inxt,
|
||||
__extbuf, __extbuf + sizeof(__extbuf), __enxt))
|
||||
{
|
||||
case _VSTD::codecvt_base::ok:
|
||||
break;
|
||||
case _VSTD::codecvt_base::noconv:
|
||||
__extbuf[0] = static_cast<char>(__last_consumed_);
|
||||
__enxt = __extbuf + 1;
|
||||
break;
|
||||
case codecvt_base::partial:
|
||||
case codecvt_base::error:
|
||||
return traits_type::eof();
|
||||
return traits_type::not_eof(__c);
|
||||
}
|
||||
while (__enxt > __extbuf)
|
||||
if (ungetc(*--__enxt, __file_) == EOF)
|
||||
return traits_type::eof();
|
||||
}
|
||||
__last_consumed_ = __c;
|
||||
__last_consumed_is_next_ = true;
|
||||
return __c;
|
||||
}
|
||||
|
||||
// __stdoutbuf
|
||||
@@ -200,17 +229,18 @@ public:
|
||||
typedef typename traits_type::off_type off_type;
|
||||
typedef typename traits_type::state_type state_type;
|
||||
|
||||
explicit __stdoutbuf(FILE* __fp);
|
||||
__stdoutbuf(FILE* __fp, state_type* __st);
|
||||
|
||||
protected:
|
||||
virtual int_type overflow (int_type __c = traits_type::eof());
|
||||
virtual streamsize xsputn(const char_type* __s, streamsize __n);
|
||||
virtual int sync();
|
||||
virtual void imbue(const locale& __loc);
|
||||
|
||||
private:
|
||||
FILE* __file_;
|
||||
const codecvt<char_type, char, state_type>* __cv_;
|
||||
state_type __st_;
|
||||
state_type* __st_;
|
||||
bool __always_noconv_;
|
||||
|
||||
__stdoutbuf(const __stdoutbuf&);
|
||||
@@ -218,10 +248,10 @@ private:
|
||||
};
|
||||
|
||||
template <class _CharT>
|
||||
__stdoutbuf<_CharT>::__stdoutbuf(FILE* __fp)
|
||||
__stdoutbuf<_CharT>::__stdoutbuf(FILE* __fp, state_type* __st)
|
||||
: __file_(__fp),
|
||||
__cv_(&use_facet<codecvt<char_type, char, state_type> >(this->getloc())),
|
||||
__st_(),
|
||||
__st_(__st),
|
||||
__always_noconv_(__cv_->always_noconv())
|
||||
{
|
||||
}
|
||||
@@ -234,30 +264,31 @@ __stdoutbuf<_CharT>::overflow(int_type __c)
|
||||
char_type __1buf;
|
||||
if (!traits_type::eq_int_type(__c, traits_type::eof()))
|
||||
{
|
||||
this->setp(&__1buf, &__1buf+1);
|
||||
*this->pptr() = traits_type::to_char_type(__c);
|
||||
this->pbump(1);
|
||||
__1buf = traits_type::to_char_type(__c);
|
||||
if (__always_noconv_)
|
||||
{
|
||||
if (fwrite(this->pbase(), sizeof(char_type), 1, __file_) != 1)
|
||||
if (fwrite(&__1buf, sizeof(char_type), 1, __file_) != 1)
|
||||
return traits_type::eof();
|
||||
}
|
||||
else
|
||||
{
|
||||
char* __extbe = __extbuf;
|
||||
codecvt_base::result __r;
|
||||
char_type* pbase = &__1buf;
|
||||
char_type* pptr = pbase + 1;
|
||||
char_type* epptr = pptr;
|
||||
do
|
||||
{
|
||||
const char_type* __e;
|
||||
__r = __cv_->out(__st_, this->pbase(), this->pptr(), __e,
|
||||
__r = __cv_->out(*__st_, pbase, pptr, __e,
|
||||
__extbuf,
|
||||
__extbuf + sizeof(__extbuf),
|
||||
__extbe);
|
||||
if (__e == this->pbase())
|
||||
if (__e == pbase)
|
||||
return traits_type::eof();
|
||||
if (__r == codecvt_base::noconv)
|
||||
{
|
||||
if (fwrite(this->pbase(), 1, 1, __file_) != 1)
|
||||
if (fwrite(pbase, 1, 1, __file_) != 1)
|
||||
return traits_type::eof();
|
||||
}
|
||||
else if (__r == codecvt_base::ok || __r == codecvt_base::partial)
|
||||
@@ -267,19 +298,30 @@ __stdoutbuf<_CharT>::overflow(int_type __c)
|
||||
return traits_type::eof();
|
||||
if (__r == codecvt_base::partial)
|
||||
{
|
||||
this->setp((char_type*)__e, this->pptr());
|
||||
this->pbump(static_cast<int>(this->epptr() - this->pbase()));
|
||||
pbase = (char_type*)__e;
|
||||
}
|
||||
}
|
||||
else
|
||||
return traits_type::eof();
|
||||
} while (__r == codecvt_base::partial);
|
||||
}
|
||||
this->setp(0, 0);
|
||||
}
|
||||
return traits_type::not_eof(__c);
|
||||
}
|
||||
|
||||
template <class _CharT>
|
||||
streamsize
|
||||
__stdoutbuf<_CharT>::xsputn(const char_type* __s, streamsize __n)
|
||||
{
|
||||
if (__always_noconv_)
|
||||
return fwrite(__s, sizeof(char_type), __n, __file_);
|
||||
streamsize __i = 0;
|
||||
for (; __i < __n; ++__i, ++__s)
|
||||
if (overflow(traits_type::to_int_type(*__s)) == traits_type::eof())
|
||||
break;
|
||||
return __i;
|
||||
}
|
||||
|
||||
template <class _CharT>
|
||||
int
|
||||
__stdoutbuf<_CharT>::sync()
|
||||
@@ -289,7 +331,7 @@ __stdoutbuf<_CharT>::sync()
|
||||
do
|
||||
{
|
||||
char* __extbe;
|
||||
__r = __cv_->unshift(__st_, __extbuf,
|
||||
__r = __cv_->unshift(*__st_, __extbuf,
|
||||
__extbuf + sizeof(__extbuf),
|
||||
__extbe);
|
||||
size_t __nmemb = static_cast<size_t>(__extbe - __extbuf);
|
||||
|
||||
166
include/__tree
166
include/__tree
@@ -25,17 +25,17 @@ _LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _Tp, class _Compare, class _Allocator> class __tree;
|
||||
template <class _Tp, class _NodePtr, class _DiffType>
|
||||
class _LIBCPP_VISIBLE __tree_iterator;
|
||||
class _LIBCPP_TYPE_VIS_ONLY __tree_iterator;
|
||||
template <class _Tp, class _ConstNodePtr, class _DiffType>
|
||||
class _LIBCPP_VISIBLE __tree_const_iterator;
|
||||
class _LIBCPP_TYPE_VIS_ONLY __tree_const_iterator;
|
||||
template <class _Key, class _Tp, class _Compare, class _Allocator>
|
||||
class _LIBCPP_VISIBLE map;
|
||||
class _LIBCPP_TYPE_VIS_ONLY map;
|
||||
template <class _Key, class _Tp, class _Compare, class _Allocator>
|
||||
class _LIBCPP_VISIBLE multimap;
|
||||
class _LIBCPP_TYPE_VIS_ONLY multimap;
|
||||
template <class _Key, class _Compare, class _Allocator>
|
||||
class _LIBCPP_VISIBLE set;
|
||||
class _LIBCPP_TYPE_VIS_ONLY set;
|
||||
template <class _Key, class _Compare, class _Allocator>
|
||||
class _LIBCPP_VISIBLE multiset;
|
||||
class _LIBCPP_TYPE_VIS_ONLY multiset;
|
||||
|
||||
/*
|
||||
|
||||
@@ -614,11 +614,11 @@ public:
|
||||
#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
|
||||
};
|
||||
|
||||
template <class _TreeIterator> class _LIBCPP_VISIBLE __map_iterator;
|
||||
template <class _TreeIterator> class _LIBCPP_VISIBLE __map_const_iterator;
|
||||
template <class _TreeIterator> class _LIBCPP_TYPE_VIS_ONLY __map_iterator;
|
||||
template <class _TreeIterator> class _LIBCPP_TYPE_VIS_ONLY __map_const_iterator;
|
||||
|
||||
template <class _Tp, class _NodePtr, class _DiffType>
|
||||
class _LIBCPP_VISIBLE __tree_iterator
|
||||
class _LIBCPP_TYPE_VIS_ONLY __tree_iterator
|
||||
{
|
||||
typedef _NodePtr __node_pointer;
|
||||
typedef typename pointer_traits<__node_pointer>::element_type __node;
|
||||
@@ -641,10 +641,15 @@ public:
|
||||
#endif
|
||||
pointer;
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY __tree_iterator() _NOEXCEPT {}
|
||||
_LIBCPP_INLINE_VISIBILITY __tree_iterator() _NOEXCEPT
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
: __ptr_(nullptr)
|
||||
#endif
|
||||
{}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY reference operator*() const {return __ptr_->__value_;}
|
||||
_LIBCPP_INLINE_VISIBILITY pointer operator->() const {return &__ptr_->__value_;}
|
||||
_LIBCPP_INLINE_VISIBILITY pointer operator->() const
|
||||
{return pointer_traits<pointer>::pointer_to(__ptr_->__value_);}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__tree_iterator& operator++()
|
||||
@@ -673,20 +678,20 @@ private:
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit __tree_iterator(__node_pointer __p) _NOEXCEPT : __ptr_(__p) {}
|
||||
template <class, class, class> friend class __tree;
|
||||
template <class, class, class> friend class _LIBCPP_VISIBLE __tree_const_iterator;
|
||||
template <class> friend class _LIBCPP_VISIBLE __map_iterator;
|
||||
template <class, class, class, class> friend class _LIBCPP_VISIBLE map;
|
||||
template <class, class, class, class> friend class _LIBCPP_VISIBLE multimap;
|
||||
template <class, class, class> friend class _LIBCPP_VISIBLE set;
|
||||
template <class, class, class> friend class _LIBCPP_VISIBLE multiset;
|
||||
template <class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY __tree_const_iterator;
|
||||
template <class> friend class _LIBCPP_TYPE_VIS_ONLY __map_iterator;
|
||||
template <class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY map;
|
||||
template <class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY multimap;
|
||||
template <class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY set;
|
||||
template <class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY multiset;
|
||||
};
|
||||
|
||||
template <class _Tp, class _ConstNodePtr, class _DiffType>
|
||||
class _LIBCPP_VISIBLE __tree_const_iterator
|
||||
class _LIBCPP_TYPE_VIS_ONLY __tree_const_iterator
|
||||
{
|
||||
typedef _ConstNodePtr __node_pointer;
|
||||
typedef typename pointer_traits<__node_pointer>::element_type __node;
|
||||
typedef const typename __node::base __node_base;
|
||||
typedef typename __node::base __node_base;
|
||||
typedef typename pointer_traits<__node_pointer>::template
|
||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
rebind<__node_base>
|
||||
@@ -711,7 +716,12 @@ public:
|
||||
#endif
|
||||
pointer;
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY __tree_const_iterator() {}
|
||||
_LIBCPP_INLINE_VISIBILITY __tree_const_iterator() _NOEXCEPT
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
: __ptr_(nullptr)
|
||||
#endif
|
||||
{}
|
||||
|
||||
private:
|
||||
typedef typename remove_const<__node>::type __non_const_node;
|
||||
typedef typename pointer_traits<__node_pointer>::template
|
||||
@@ -729,7 +739,8 @@ public:
|
||||
: __ptr_(__p.__ptr_) {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY reference operator*() const {return __ptr_->__value_;}
|
||||
_LIBCPP_INLINE_VISIBILITY pointer operator->() const {return &__ptr_->__value_;}
|
||||
_LIBCPP_INLINE_VISIBILITY pointer operator->() const
|
||||
{return pointer_traits<pointer>::pointer_to(__ptr_->__value_);}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__tree_const_iterator& operator++()
|
||||
@@ -759,11 +770,11 @@ private:
|
||||
explicit __tree_const_iterator(__node_pointer __p) _NOEXCEPT
|
||||
: __ptr_(__p) {}
|
||||
template <class, class, class> friend class __tree;
|
||||
template <class, class, class, class> friend class _LIBCPP_VISIBLE map;
|
||||
template <class, class, class, class> friend class _LIBCPP_VISIBLE multimap;
|
||||
template <class, class, class> friend class _LIBCPP_VISIBLE set;
|
||||
template <class, class, class> friend class _LIBCPP_VISIBLE multiset;
|
||||
template <class> friend class _LIBCPP_VISIBLE __map_const_iterator;
|
||||
template <class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY map;
|
||||
template <class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY multimap;
|
||||
template <class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY set;
|
||||
template <class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY multiset;
|
||||
template <class> friend class _LIBCPP_TYPE_VIS_ONLY __map_const_iterator;
|
||||
};
|
||||
|
||||
template <class _Tp, class _Compare, class _Allocator>
|
||||
@@ -779,8 +790,10 @@ public:
|
||||
typedef typename __alloc_traits::size_type size_type;
|
||||
typedef typename __alloc_traits::difference_type difference_type;
|
||||
|
||||
typedef __tree_node<value_type, typename __alloc_traits::void_pointer> __node;
|
||||
typedef __tree_node_base<typename __alloc_traits::void_pointer> __node_base;
|
||||
typedef typename __alloc_traits::void_pointer __void_pointer;
|
||||
|
||||
typedef __tree_node<value_type, __void_pointer> __node;
|
||||
typedef __tree_node_base<__void_pointer> __node_base;
|
||||
typedef typename __alloc_traits::template
|
||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
rebind_alloc<__node>
|
||||
@@ -790,9 +803,9 @@ public:
|
||||
__node_allocator;
|
||||
typedef allocator_traits<__node_allocator> __node_traits;
|
||||
typedef typename __node_traits::pointer __node_pointer;
|
||||
typedef typename __node_traits::const_pointer __node_const_pointer;
|
||||
typedef typename __node_traits::pointer __node_const_pointer;
|
||||
typedef typename __node_base::pointer __node_base_pointer;
|
||||
typedef typename __node_base::const_pointer __node_base_const_pointer;
|
||||
typedef typename __node_base::pointer __node_base_const_pointer;
|
||||
private:
|
||||
typedef typename __node_base::base __end_node_t;
|
||||
typedef typename pointer_traits<__node_pointer>::template
|
||||
@@ -804,9 +817,9 @@ private:
|
||||
__end_node_ptr;
|
||||
typedef typename pointer_traits<__node_pointer>::template
|
||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
rebind<const __end_node_t>
|
||||
rebind<__end_node_t>
|
||||
#else
|
||||
rebind<const __end_node_t>::other
|
||||
rebind<__end_node_t>::other
|
||||
#endif
|
||||
__end_node_const_ptr;
|
||||
|
||||
@@ -828,7 +841,7 @@ public:
|
||||
{
|
||||
return static_cast<__node_const_pointer>
|
||||
(
|
||||
pointer_traits<__end_node_const_ptr>::pointer_to(__pair1_.first())
|
||||
pointer_traits<__end_node_const_ptr>::pointer_to(const_cast<__end_node_t&>(__pair1_.first()))
|
||||
);
|
||||
}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
@@ -865,7 +878,7 @@ public:
|
||||
{return static_cast<__node_const_pointer>(__end_node()->__left_);}
|
||||
|
||||
typedef __tree_iterator<value_type, __node_pointer, difference_type> iterator;
|
||||
typedef __tree_const_iterator<value_type, __node_const_pointer, difference_type> const_iterator;
|
||||
typedef __tree_const_iterator<value_type, __node_pointer, difference_type> const_iterator;
|
||||
|
||||
explicit __tree(const value_compare& __comp)
|
||||
_NOEXCEPT_(
|
||||
@@ -1102,6 +1115,9 @@ private:
|
||||
|
||||
__node_pointer __detach();
|
||||
static __node_pointer __detach(__node_pointer);
|
||||
|
||||
template <class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY map;
|
||||
template <class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY multimap;
|
||||
};
|
||||
|
||||
template <class _Tp, class _Compare, class _Allocator>
|
||||
@@ -1161,7 +1177,7 @@ __tree<_Tp, _Compare, _Allocator>::__detach(__node_pointer __cache)
|
||||
{
|
||||
if (__cache->__parent_ == nullptr)
|
||||
return nullptr;
|
||||
if (__tree_is_left_child(__cache))
|
||||
if (__tree_is_left_child(static_cast<__node_base_pointer>(__cache)))
|
||||
{
|
||||
__cache->__parent_->__left_ = nullptr;
|
||||
__cache = static_cast<__node_pointer>(__cache->__parent_);
|
||||
@@ -1294,7 +1310,7 @@ __tree<_Tp, _Compare, _Allocator>::__tree(__tree&& __t)
|
||||
__begin_node() = __end_node();
|
||||
else
|
||||
{
|
||||
__end_node()->__left_->__parent_ = __end_node();
|
||||
__end_node()->__left_->__parent_ = static_cast<__node_base_pointer>(__end_node());
|
||||
__t.__begin_node() = __t.__end_node();
|
||||
__t.__end_node()->__left_ = nullptr;
|
||||
__t.size() = 0;
|
||||
@@ -1314,7 +1330,7 @@ __tree<_Tp, _Compare, _Allocator>::__tree(__tree&& __t, const allocator_type& __
|
||||
{
|
||||
__begin_node() = __t.__begin_node();
|
||||
__end_node()->__left_ = __t.__end_node()->__left_;
|
||||
__end_node()->__left_->__parent_ = __end_node();
|
||||
__end_node()->__left_->__parent_ = static_cast<__node_base_pointer>(__end_node());
|
||||
size() = __t.size();
|
||||
__t.__begin_node() = __t.__end_node();
|
||||
__t.__end_node()->__left_ = nullptr;
|
||||
@@ -1342,7 +1358,7 @@ __tree<_Tp, _Compare, _Allocator>::__move_assign(__tree& __t, true_type)
|
||||
__begin_node() = __end_node();
|
||||
else
|
||||
{
|
||||
__end_node()->__left_->__parent_ = __end_node();
|
||||
__end_node()->__left_->__parent_ = static_cast<__node_base_pointer>(__end_node());
|
||||
__t.__begin_node() = __t.__end_node();
|
||||
__t.__end_node()->__left_ = nullptr;
|
||||
__t.size() = 0;
|
||||
@@ -1447,11 +1463,11 @@ __tree<_Tp, _Compare, _Allocator>::swap(__tree& __t)
|
||||
if (size() == 0)
|
||||
__begin_node() = __end_node();
|
||||
else
|
||||
__end_node()->__left_->__parent_ = __end_node();
|
||||
__end_node()->__left_->__parent_ = static_cast<__node_base_pointer>(__end_node());
|
||||
if (__t.size() == 0)
|
||||
__t.__begin_node() = __t.__end_node();
|
||||
else
|
||||
__t.__end_node()->__left_->__parent_ = __t.__end_node();
|
||||
__t.__end_node()->__left_->__parent_ = static_cast<__node_base_pointer>(__t.__end_node());
|
||||
}
|
||||
|
||||
template <class _Tp, class _Compare, class _Allocator>
|
||||
@@ -1483,7 +1499,7 @@ __tree<_Tp, _Compare, _Allocator>::__find_leaf_low(typename __node_base::pointer
|
||||
__nd = static_cast<__node_pointer>(__nd->__right_);
|
||||
else
|
||||
{
|
||||
__parent = __nd;
|
||||
__parent = static_cast<__node_base_pointer>(__nd);
|
||||
return __parent->__right_;
|
||||
}
|
||||
}
|
||||
@@ -1493,13 +1509,13 @@ __tree<_Tp, _Compare, _Allocator>::__find_leaf_low(typename __node_base::pointer
|
||||
__nd = static_cast<__node_pointer>(__nd->__left_);
|
||||
else
|
||||
{
|
||||
__parent = __nd;
|
||||
__parent = static_cast<__node_base_pointer>(__nd);
|
||||
return __parent->__left_;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
__parent = __end_node();
|
||||
__parent = static_cast<__node_base_pointer>(__end_node());
|
||||
return __parent->__left_;
|
||||
}
|
||||
|
||||
@@ -1522,7 +1538,7 @@ __tree<_Tp, _Compare, _Allocator>::__find_leaf_high(typename __node_base::pointe
|
||||
__nd = static_cast<__node_pointer>(__nd->__left_);
|
||||
else
|
||||
{
|
||||
__parent = __nd;
|
||||
__parent = static_cast<__node_base_pointer>(__nd);
|
||||
return __parent->__left_;
|
||||
}
|
||||
}
|
||||
@@ -1532,13 +1548,13 @@ __tree<_Tp, _Compare, _Allocator>::__find_leaf_high(typename __node_base::pointe
|
||||
__nd = static_cast<__node_pointer>(__nd->__right_);
|
||||
else
|
||||
{
|
||||
__parent = __nd;
|
||||
__parent = static_cast<__node_base_pointer>(__nd);
|
||||
return __parent->__right_;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
__parent = __end_node();
|
||||
__parent = static_cast<__node_base_pointer>(__end_node());
|
||||
return __parent->__left_;
|
||||
}
|
||||
|
||||
@@ -1563,12 +1579,12 @@ __tree<_Tp, _Compare, _Allocator>::__find_leaf(const_iterator __hint,
|
||||
// *prev(__hint) <= __v <= *__hint
|
||||
if (__hint.__ptr_->__left_ == nullptr)
|
||||
{
|
||||
__parent = const_cast<__node_pointer&>(__hint.__ptr_);
|
||||
__parent = static_cast<__node_base_pointer>(__hint.__ptr_);
|
||||
return __parent->__left_;
|
||||
}
|
||||
else
|
||||
{
|
||||
__parent = const_cast<__node_pointer&>(__prior.__ptr_);
|
||||
__parent = static_cast<__node_base_pointer>(__prior.__ptr_);
|
||||
return __parent->__right_;
|
||||
}
|
||||
}
|
||||
@@ -1600,7 +1616,7 @@ __tree<_Tp, _Compare, _Allocator>::__find_equal(typename __node_base::pointer& _
|
||||
__nd = static_cast<__node_pointer>(__nd->__left_);
|
||||
else
|
||||
{
|
||||
__parent = __nd;
|
||||
__parent = static_cast<__node_base_pointer>(__nd);
|
||||
return __parent->__left_;
|
||||
}
|
||||
}
|
||||
@@ -1610,18 +1626,18 @@ __tree<_Tp, _Compare, _Allocator>::__find_equal(typename __node_base::pointer& _
|
||||
__nd = static_cast<__node_pointer>(__nd->__right_);
|
||||
else
|
||||
{
|
||||
__parent = __nd;
|
||||
__parent = static_cast<__node_base_pointer>(__nd);
|
||||
return __parent->__right_;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
__parent = __nd;
|
||||
__parent = static_cast<__node_base_pointer>(__nd);
|
||||
return __parent;
|
||||
}
|
||||
}
|
||||
}
|
||||
__parent = __end_node();
|
||||
__parent = static_cast<__node_base_pointer>(__end_node());
|
||||
return __parent->__left_;
|
||||
}
|
||||
|
||||
@@ -1648,12 +1664,12 @@ __tree<_Tp, _Compare, _Allocator>::__find_equal(const_iterator __hint,
|
||||
// *prev(__hint) < __v < *__hint
|
||||
if (__hint.__ptr_->__left_ == nullptr)
|
||||
{
|
||||
__parent = const_cast<__node_pointer&>(__hint.__ptr_);
|
||||
__parent = static_cast<__node_base_pointer>(__hint.__ptr_);
|
||||
return __parent->__left_;
|
||||
}
|
||||
else
|
||||
{
|
||||
__parent = const_cast<__node_pointer&>(__prior.__ptr_);
|
||||
__parent = static_cast<__node_base_pointer>(__prior.__ptr_);
|
||||
return __parent->__right_;
|
||||
}
|
||||
}
|
||||
@@ -1669,12 +1685,12 @@ __tree<_Tp, _Compare, _Allocator>::__find_equal(const_iterator __hint,
|
||||
// *__hint < __v < *_VSTD::next(__hint)
|
||||
if (__hint.__ptr_->__right_ == nullptr)
|
||||
{
|
||||
__parent = const_cast<__node_pointer&>(__hint.__ptr_);
|
||||
__parent = static_cast<__node_base_pointer>(__hint.__ptr_);
|
||||
return __parent->__right_;
|
||||
}
|
||||
else
|
||||
{
|
||||
__parent = const_cast<__node_pointer&>(__next.__ptr_);
|
||||
__parent = static_cast<__node_base_pointer>(__next.__ptr_);
|
||||
return __parent->__left_;
|
||||
}
|
||||
}
|
||||
@@ -1682,7 +1698,7 @@ __tree<_Tp, _Compare, _Allocator>::__find_equal(const_iterator __hint,
|
||||
return __find_equal(__parent, __v);
|
||||
}
|
||||
// else __v == *__hint
|
||||
__parent = const_cast<__node_pointer&>(__hint.__ptr_);
|
||||
__parent = static_cast<__node_base_pointer>(__hint.__ptr_);
|
||||
return __parent;
|
||||
}
|
||||
|
||||
@@ -1729,7 +1745,7 @@ __tree<_Tp, _Compare, _Allocator>::__emplace_unique(_Args&&... __args)
|
||||
bool __inserted = false;
|
||||
if (__child == nullptr)
|
||||
{
|
||||
__insert_node_at(__parent, __child, __h.get());
|
||||
__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
|
||||
__r = __h.release();
|
||||
__inserted = true;
|
||||
}
|
||||
@@ -1747,7 +1763,7 @@ __tree<_Tp, _Compare, _Allocator>::__emplace_hint_unique(const_iterator __p, _Ar
|
||||
__node_pointer __r = static_cast<__node_pointer>(__child);
|
||||
if (__child == nullptr)
|
||||
{
|
||||
__insert_node_at(__parent, __child, __h.get());
|
||||
__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
|
||||
__r = __h.release();
|
||||
}
|
||||
return iterator(__r);
|
||||
@@ -1761,7 +1777,7 @@ __tree<_Tp, _Compare, _Allocator>::__emplace_multi(_Args&&... __args)
|
||||
__node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
|
||||
__node_base_pointer __parent;
|
||||
__node_base_pointer& __child = __find_leaf_high(__parent, __h->__value_);
|
||||
__insert_node_at(__parent, __child, __h.get());
|
||||
__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
|
||||
return iterator(static_cast<__node_pointer>(__h.release()));
|
||||
}
|
||||
|
||||
@@ -1774,7 +1790,7 @@ __tree<_Tp, _Compare, _Allocator>::__emplace_hint_multi(const_iterator __p,
|
||||
__node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
|
||||
__node_base_pointer __parent;
|
||||
__node_base_pointer& __child = __find_leaf(__p, __parent, __h->__value_);
|
||||
__insert_node_at(__parent, __child, __h.get());
|
||||
__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
|
||||
return iterator(static_cast<__node_pointer>(__h.release()));
|
||||
}
|
||||
|
||||
@@ -1812,7 +1828,7 @@ __tree<_Tp, _Compare, _Allocator>::__insert_multi(_Vp&& __v)
|
||||
__node_holder __h = __construct_node(_VSTD::forward<_Vp>(__v));
|
||||
__node_base_pointer __parent;
|
||||
__node_base_pointer& __child = __find_leaf_high(__parent, __h->__value_);
|
||||
__insert_node_at(__parent, __child, __h.get());
|
||||
__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
|
||||
return iterator(__h.release());
|
||||
}
|
||||
|
||||
@@ -1824,7 +1840,7 @@ __tree<_Tp, _Compare, _Allocator>::__insert_multi(const_iterator __p, _Vp&& __v)
|
||||
__node_holder __h = __construct_node(_VSTD::forward<_Vp>(__v));
|
||||
__node_base_pointer __parent;
|
||||
__node_base_pointer& __child = __find_leaf(__p, __parent, __h->__value_);
|
||||
__insert_node_at(__parent, __child, __h.get());
|
||||
__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
|
||||
return iterator(__h.release());
|
||||
}
|
||||
|
||||
@@ -1838,7 +1854,7 @@ __tree<_Tp, _Compare, _Allocator>::__construct_node(const value_type& __v)
|
||||
__node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
|
||||
__node_traits::construct(__na, _VSTD::addressof(__h->__value_), __v);
|
||||
__h.get_deleter().__value_constructed = true;
|
||||
return _VSTD::move(__h);
|
||||
return _VSTD::move(__h); // explicitly moved for C++03
|
||||
}
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
@@ -1854,7 +1870,7 @@ __tree<_Tp, _Compare, _Allocator>::__insert_unique(const value_type& __v)
|
||||
if (__child == nullptr)
|
||||
{
|
||||
__node_holder __h = __construct_node(__v);
|
||||
__insert_node_at(__parent, __child, __h.get());
|
||||
__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
|
||||
__r = __h.release();
|
||||
__inserted = true;
|
||||
}
|
||||
@@ -1871,7 +1887,7 @@ __tree<_Tp, _Compare, _Allocator>::__insert_unique(const_iterator __p, const val
|
||||
if (__child == nullptr)
|
||||
{
|
||||
__node_holder __h = __construct_node(__v);
|
||||
__insert_node_at(__parent, __child, __h.get());
|
||||
__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
|
||||
__r = __h.release();
|
||||
}
|
||||
return iterator(__r);
|
||||
@@ -1884,7 +1900,7 @@ __tree<_Tp, _Compare, _Allocator>::__insert_multi(const value_type& __v)
|
||||
__node_base_pointer __parent;
|
||||
__node_base_pointer& __child = __find_leaf_high(__parent, __v);
|
||||
__node_holder __h = __construct_node(__v);
|
||||
__insert_node_at(__parent, __child, __h.get());
|
||||
__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
|
||||
return iterator(__h.release());
|
||||
}
|
||||
|
||||
@@ -1895,7 +1911,7 @@ __tree<_Tp, _Compare, _Allocator>::__insert_multi(const_iterator __p, const valu
|
||||
__node_base_pointer __parent;
|
||||
__node_base_pointer& __child = __find_leaf(__p, __parent, __v);
|
||||
__node_holder __h = __construct_node(__v);
|
||||
__insert_node_at(__parent, __child, __h.get());
|
||||
__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
|
||||
return iterator(__h.release());
|
||||
}
|
||||
|
||||
@@ -1909,7 +1925,7 @@ __tree<_Tp, _Compare, _Allocator>::__node_insert_unique(__node_pointer __nd)
|
||||
bool __inserted = false;
|
||||
if (__child == nullptr)
|
||||
{
|
||||
__insert_node_at(__parent, __child, __nd);
|
||||
__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__nd));
|
||||
__r = __nd;
|
||||
__inserted = true;
|
||||
}
|
||||
@@ -1926,7 +1942,7 @@ __tree<_Tp, _Compare, _Allocator>::__node_insert_unique(const_iterator __p,
|
||||
__node_pointer __r = static_cast<__node_pointer>(__child);
|
||||
if (__child == nullptr)
|
||||
{
|
||||
__insert_node_at(__parent, __child, __nd);
|
||||
__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__nd));
|
||||
__r = __nd;
|
||||
}
|
||||
return iterator(__r);
|
||||
@@ -1938,7 +1954,7 @@ __tree<_Tp, _Compare, _Allocator>::__node_insert_multi(__node_pointer __nd)
|
||||
{
|
||||
__node_base_pointer __parent;
|
||||
__node_base_pointer& __child = __find_leaf_high(__parent, __nd->__value_);
|
||||
__insert_node_at(__parent, __child, __nd);
|
||||
__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__nd));
|
||||
return iterator(__nd);
|
||||
}
|
||||
|
||||
@@ -1949,7 +1965,7 @@ __tree<_Tp, _Compare, _Allocator>::__node_insert_multi(const_iterator __p,
|
||||
{
|
||||
__node_base_pointer __parent;
|
||||
__node_base_pointer& __child = __find_leaf(__p, __parent, __nd->__value_);
|
||||
__insert_node_at(__parent, __child, __nd);
|
||||
__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__nd));
|
||||
return iterator(__nd);
|
||||
}
|
||||
|
||||
@@ -1957,7 +1973,7 @@ template <class _Tp, class _Compare, class _Allocator>
|
||||
typename __tree<_Tp, _Compare, _Allocator>::iterator
|
||||
__tree<_Tp, _Compare, _Allocator>::erase(const_iterator __p)
|
||||
{
|
||||
__node_pointer __np = const_cast<__node_pointer>(__p.__ptr_);
|
||||
__node_pointer __np = __p.__ptr_;
|
||||
iterator __r(__np);
|
||||
++__r;
|
||||
if (__begin_node() == __np)
|
||||
@@ -1977,7 +1993,7 @@ __tree<_Tp, _Compare, _Allocator>::erase(const_iterator __f, const_iterator __l)
|
||||
{
|
||||
while (__f != __l)
|
||||
__f = erase(__f);
|
||||
return iterator(const_cast<__node_pointer>(__l.__ptr_));
|
||||
return iterator(__l.__ptr_);
|
||||
}
|
||||
|
||||
template <class _Tp, class _Compare, class _Allocator>
|
||||
@@ -2264,7 +2280,7 @@ template <class _Tp, class _Compare, class _Allocator>
|
||||
typename __tree<_Tp, _Compare, _Allocator>::__node_holder
|
||||
__tree<_Tp, _Compare, _Allocator>::remove(const_iterator __p) _NOEXCEPT
|
||||
{
|
||||
__node_pointer __np = const_cast<__node_pointer>(__p.__ptr_);
|
||||
__node_pointer __np = __p.__ptr_;
|
||||
if (__begin_node() == __np)
|
||||
{
|
||||
if (__np->__right_ != nullptr)
|
||||
|
||||
@@ -27,46 +27,46 @@
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _Tp> class _LIBCPP_VISIBLE tuple_size;
|
||||
template <class _Tp> class _LIBCPP_TYPE_VIS_ONLY tuple_size;
|
||||
|
||||
template <class _Tp>
|
||||
class _LIBCPP_VISIBLE tuple_size<const _Tp>
|
||||
class _LIBCPP_TYPE_VIS_ONLY tuple_size<const _Tp>
|
||||
: public tuple_size<_Tp> {};
|
||||
|
||||
template <class _Tp>
|
||||
class _LIBCPP_VISIBLE tuple_size<volatile _Tp>
|
||||
class _LIBCPP_TYPE_VIS_ONLY tuple_size<volatile _Tp>
|
||||
: public tuple_size<_Tp> {};
|
||||
|
||||
template <class _Tp>
|
||||
class _LIBCPP_VISIBLE tuple_size<const volatile _Tp>
|
||||
class _LIBCPP_TYPE_VIS_ONLY tuple_size<const volatile _Tp>
|
||||
: public tuple_size<_Tp> {};
|
||||
|
||||
template <size_t _Ip, class _Tp> class _LIBCPP_VISIBLE tuple_element;
|
||||
template <size_t _Ip, class _Tp> class _LIBCPP_TYPE_VIS_ONLY tuple_element;
|
||||
|
||||
template <size_t _Ip, class _Tp>
|
||||
class _LIBCPP_VISIBLE tuple_element<_Ip, const _Tp>
|
||||
class _LIBCPP_TYPE_VIS_ONLY tuple_element<_Ip, const _Tp>
|
||||
{
|
||||
public:
|
||||
typedef typename add_const<typename tuple_element<_Ip, _Tp>::type>::type type;
|
||||
};
|
||||
|
||||
template <size_t _Ip, class _Tp>
|
||||
class _LIBCPP_VISIBLE tuple_element<_Ip, volatile _Tp>
|
||||
class _LIBCPP_TYPE_VIS_ONLY tuple_element<_Ip, volatile _Tp>
|
||||
{
|
||||
public:
|
||||
typedef typename add_volatile<typename tuple_element<_Ip, _Tp>::type>::type type;
|
||||
};
|
||||
|
||||
template <size_t _Ip, class _Tp>
|
||||
class _LIBCPP_VISIBLE tuple_element<_Ip, const volatile _Tp>
|
||||
class _LIBCPP_TYPE_VIS_ONLY tuple_element<_Ip, const volatile _Tp>
|
||||
{
|
||||
public:
|
||||
typedef typename add_cv<typename tuple_element<_Ip, _Tp>::type>::type type;
|
||||
};
|
||||
|
||||
template <class ..._Tp> class _LIBCPP_VISIBLE tuple;
|
||||
template <class _T1, class _T2> struct _LIBCPP_VISIBLE pair;
|
||||
template <class _Tp, size_t _Size> struct _LIBCPP_VISIBLE array;
|
||||
template <class ..._Tp> class _LIBCPP_TYPE_VIS_ONLY tuple;
|
||||
template <class _T1, class _T2> struct _LIBCPP_TYPE_VIS_ONLY pair;
|
||||
template <class _Tp, size_t _Size> struct _LIBCPP_TYPE_VIS_ONLY array;
|
||||
|
||||
template <class _Tp> struct __tuple_like : false_type {};
|
||||
|
||||
@@ -79,47 +79,47 @@ template <class _T1, class _T2> struct __tuple_like<pair<_T1, _T2> > : true_type
|
||||
template <class _Tp, size_t _Size> struct __tuple_like<array<_Tp, _Size> > : true_type {};
|
||||
|
||||
template <size_t _Ip, class ..._Tp>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
typename tuple_element<_Ip, tuple<_Tp...> >::type&
|
||||
get(tuple<_Tp...>&) _NOEXCEPT;
|
||||
|
||||
template <size_t _Ip, class ..._Tp>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
const typename tuple_element<_Ip, tuple<_Tp...> >::type&
|
||||
get(const tuple<_Tp...>&) _NOEXCEPT;
|
||||
|
||||
template <size_t _Ip, class ..._Tp>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
typename tuple_element<_Ip, tuple<_Tp...> >::type&&
|
||||
get(tuple<_Tp...>&&) _NOEXCEPT;
|
||||
|
||||
template <size_t _Ip, class _T1, class _T2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
typename tuple_element<_Ip, pair<_T1, _T2> >::type&
|
||||
get(pair<_T1, _T2>&) _NOEXCEPT;
|
||||
|
||||
template <size_t _Ip, class _T1, class _T2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
const typename tuple_element<_Ip, pair<_T1, _T2> >::type&
|
||||
get(const pair<_T1, _T2>&) _NOEXCEPT;
|
||||
|
||||
template <size_t _Ip, class _T1, class _T2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
typename tuple_element<_Ip, pair<_T1, _T2> >::type&&
|
||||
get(pair<_T1, _T2>&&) _NOEXCEPT;
|
||||
|
||||
template <size_t _Ip, class _Tp, size_t _Size>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_Tp&
|
||||
get(array<_Tp, _Size>&) _NOEXCEPT;
|
||||
|
||||
template <size_t _Ip, class _Tp, size_t _Size>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
const _Tp&
|
||||
get(const array<_Tp, _Size>&) _NOEXCEPT;
|
||||
|
||||
template <size_t _Ip, class _Tp, size_t _Size>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_Tp&&
|
||||
get(array<_Tp, _Size>&&) _NOEXCEPT;
|
||||
|
||||
@@ -154,7 +154,7 @@ struct __make_tuple_indices
|
||||
template <class ..._Tp> struct __tuple_types {};
|
||||
|
||||
template <size_t _Ip>
|
||||
class _LIBCPP_VISIBLE tuple_element<_Ip, __tuple_types<> >
|
||||
class _LIBCPP_TYPE_VIS_ONLY tuple_element<_Ip, __tuple_types<> >
|
||||
{
|
||||
public:
|
||||
static_assert(_Ip == 0, "tuple_element index out of range");
|
||||
@@ -162,21 +162,21 @@ public:
|
||||
};
|
||||
|
||||
template <class _Hp, class ..._Tp>
|
||||
class _LIBCPP_VISIBLE tuple_element<0, __tuple_types<_Hp, _Tp...> >
|
||||
class _LIBCPP_TYPE_VIS_ONLY tuple_element<0, __tuple_types<_Hp, _Tp...> >
|
||||
{
|
||||
public:
|
||||
typedef _Hp type;
|
||||
};
|
||||
|
||||
template <size_t _Ip, class _Hp, class ..._Tp>
|
||||
class _LIBCPP_VISIBLE tuple_element<_Ip, __tuple_types<_Hp, _Tp...> >
|
||||
class _LIBCPP_TYPE_VIS_ONLY tuple_element<_Ip, __tuple_types<_Hp, _Tp...> >
|
||||
{
|
||||
public:
|
||||
typedef typename tuple_element<_Ip-1, __tuple_types<_Tp...> >::type type;
|
||||
};
|
||||
|
||||
template <class ..._Tp>
|
||||
class _LIBCPP_VISIBLE tuple_size<__tuple_types<_Tp...> >
|
||||
class _LIBCPP_TYPE_VIS_ONLY tuple_size<__tuple_types<_Tp...> >
|
||||
: public integral_constant<size_t, sizeof...(_Tp)>
|
||||
{
|
||||
};
|
||||
|
||||
@@ -19,8 +19,8 @@
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _Tp> class _LIBCPP_VISIBLE tuple_size;
|
||||
template <size_t _Ip, class _Tp> class _LIBCPP_VISIBLE tuple_element;
|
||||
template <class _Tp> class _LIBCPP_TYPE_VIS_ONLY tuple_size;
|
||||
template <size_t _Ip, class _Tp> class _LIBCPP_TYPE_VIS_ONLY tuple_element;
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
|
||||
@@ -9,11 +9,21 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifdef min
|
||||
#if defined(_MSC_VER) && ! defined(__clang__)
|
||||
_LIBCPP_WARNING("macro min is incompatible with C++. Try #define NOMINMAX "
|
||||
"before any Windows header. #undefing min")
|
||||
#else
|
||||
#warning: macro min is incompatible with C++. #undefing min
|
||||
#endif
|
||||
#undef min
|
||||
#endif
|
||||
|
||||
#ifdef max
|
||||
#if defined(_MSC_VER) && ! defined(__clang__)
|
||||
_LIBCPP_WARNING("macro max is incompatible with C++. Try #define NOMINMAX "
|
||||
"before any Windows header. #undefing max")
|
||||
#else
|
||||
#warning: macro max is incompatible with C++. #undefing max
|
||||
#endif
|
||||
#undef max
|
||||
#endif
|
||||
|
||||
@@ -87,30 +87,63 @@ template <class InputIterator1, class InputIterator2>
|
||||
pair<InputIterator1, InputIterator2>
|
||||
mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);
|
||||
|
||||
template <class InputIterator1, class InputIterator2>
|
||||
pair<InputIterator1, InputIterator2>
|
||||
mismatch(InputIterator1 first1, InputIterator1 last1,
|
||||
InputIterator2 first2, InputIterator2 last2); // **C++14**
|
||||
|
||||
template <class InputIterator1, class InputIterator2, class BinaryPredicate>
|
||||
pair<InputIterator1, InputIterator2>
|
||||
mismatch(InputIterator1 first1, InputIterator1 last1,
|
||||
InputIterator2 first2, BinaryPredicate pred);
|
||||
|
||||
template <class InputIterator1, class InputIterator2, class BinaryPredicate>
|
||||
pair<InputIterator1, InputIterator2>
|
||||
mismatch(InputIterator1 first1, InputIterator1 last1,
|
||||
InputIterator2 first2, InputIterator2 last2,
|
||||
BinaryPredicate pred); // **C++14**
|
||||
|
||||
template <class InputIterator1, class InputIterator2>
|
||||
bool
|
||||
equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);
|
||||
|
||||
template <class InputIterator1, class InputIterator2>
|
||||
bool
|
||||
equal(InputIterator1 first1, InputIterator1 last1,
|
||||
InputIterator2 first2, InputIterator2 last2); // **C++14**
|
||||
|
||||
template <class InputIterator1, class InputIterator2, class BinaryPredicate>
|
||||
bool
|
||||
equal(InputIterator1 first1, InputIterator1 last1,
|
||||
InputIterator2 first2, BinaryPredicate pred);
|
||||
|
||||
template <class InputIterator1, class InputIterator2, class BinaryPredicate>
|
||||
bool
|
||||
equal(InputIterator1 first1, InputIterator1 last1,
|
||||
InputIterator2 first2, InputIterator2 last2,
|
||||
BinaryPredicate pred); // **C++14**
|
||||
|
||||
template<class ForwardIterator1, class ForwardIterator2>
|
||||
bool
|
||||
is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
|
||||
ForwardIterator2 first2);
|
||||
|
||||
template<class ForwardIterator1, class ForwardIterator2>
|
||||
bool
|
||||
is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
|
||||
ForwardIterator2 first2, ForwardIterator2 last2); // **C++14**
|
||||
|
||||
template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
|
||||
bool
|
||||
is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
|
||||
ForwardIterator2 first2, BinaryPredicate pred);
|
||||
|
||||
template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
|
||||
bool
|
||||
is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
|
||||
ForwardIterator2 first2, ForwardIterator2 last2,
|
||||
BinaryPredicate pred); // **C++14**
|
||||
|
||||
template <class ForwardIterator1, class ForwardIterator2>
|
||||
ForwardIterator1
|
||||
search(ForwardIterator1 first1, ForwardIterator1 last1,
|
||||
@@ -595,6 +628,13 @@ template <class BidirectionalIterator, class Compare>
|
||||
#include <iterator>
|
||||
#include <cstddef>
|
||||
|
||||
#if defined(__IBMCPP__)
|
||||
#include "support/ibm/support.h"
|
||||
#endif
|
||||
#if defined(_LIBCPP_MSVCRT) || defined(__MINGW32__)
|
||||
#include "support/win32/support.h"
|
||||
#endif
|
||||
|
||||
#include <__undef_min_max>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
@@ -677,7 +717,7 @@ public:
|
||||
bool operator()(const _T1& __x, const _T2& __y) {return !__p_(__x, __y);}
|
||||
};
|
||||
|
||||
#ifdef _LIBCPP_DEBUG2
|
||||
#ifdef _LIBCPP_DEBUG
|
||||
|
||||
template <class _Compare>
|
||||
struct __debug_less
|
||||
@@ -694,7 +734,7 @@ struct __debug_less
|
||||
}
|
||||
};
|
||||
|
||||
#endif // _LIBCPP_DEBUG2
|
||||
#endif // _LIBCPP_DEBUG
|
||||
|
||||
// Precondition: __x != 0
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
@@ -792,7 +832,7 @@ for_each(_InputIterator __first, _InputIterator __last, _Function __f)
|
||||
{
|
||||
for (; __first != __last; ++__first)
|
||||
__f(*__first);
|
||||
return _VSTD::move(__f);
|
||||
return _VSTD::move(__f); // explicitly moved for (emulated) C++03
|
||||
}
|
||||
|
||||
// find
|
||||
@@ -1087,6 +1127,32 @@ mismatch(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __fi
|
||||
return _VSTD::mismatch(__first1, __last1, __first2, __equal_to<__v1, __v2>());
|
||||
}
|
||||
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
pair<_InputIterator1, _InputIterator2>
|
||||
mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||
_InputIterator2 __first2, _InputIterator2 __last2,
|
||||
_BinaryPredicate __pred)
|
||||
{
|
||||
for (; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2)
|
||||
if (!__pred(*__first1, *__first2))
|
||||
break;
|
||||
return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
|
||||
}
|
||||
|
||||
template <class _InputIterator1, class _InputIterator2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
pair<_InputIterator1, _InputIterator2>
|
||||
mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||
_InputIterator2 __first2, _InputIterator2 __last2)
|
||||
{
|
||||
typedef typename iterator_traits<_InputIterator1>::value_type __v1;
|
||||
typedef typename iterator_traits<_InputIterator2>::value_type __v2;
|
||||
return _VSTD::mismatch(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
|
||||
}
|
||||
#endif
|
||||
|
||||
// equal
|
||||
|
||||
template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
|
||||
@@ -1110,6 +1176,60 @@ equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first
|
||||
return _VSTD::equal(__first1, __last1, __first2, __equal_to<__v1, __v2>());
|
||||
}
|
||||
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
template <class _BinaryPredicate, class _InputIterator1, class _InputIterator2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
__equal(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||
_InputIterator2 __first2, _InputIterator2 __last2, _BinaryPredicate __pred,
|
||||
input_iterator_tag, input_iterator_tag )
|
||||
{
|
||||
for (; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2)
|
||||
if (!__pred(*__first1, *__first2))
|
||||
return false;
|
||||
return __first1 == __last1 && __first2 == __last2;
|
||||
}
|
||||
|
||||
template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
__equal(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
|
||||
_RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred,
|
||||
random_access_iterator_tag, random_access_iterator_tag )
|
||||
{
|
||||
if ( _VSTD::distance(__first1, __last1) != _VSTD::distance(__first2, __last2))
|
||||
return false;
|
||||
return _VSTD::equal<_RandomAccessIterator1, _RandomAccessIterator2,
|
||||
typename add_lvalue_reference<_BinaryPredicate>::type>
|
||||
(__first1, __last1, __first2, __pred );
|
||||
}
|
||||
|
||||
template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
equal(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||
_InputIterator2 __first2, _InputIterator2 __last2, _BinaryPredicate __pred )
|
||||
{
|
||||
return _VSTD::__equal<typename add_lvalue_reference<_BinaryPredicate>::type>
|
||||
(__first1, __last1, __first2, __last2, __pred,
|
||||
typename iterator_traits<_InputIterator1>::iterator_category(),
|
||||
typename iterator_traits<_InputIterator2>::iterator_category());
|
||||
}
|
||||
|
||||
template <class _InputIterator1, class _InputIterator2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
equal(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||
_InputIterator2 __first2, _InputIterator2 __last2)
|
||||
{
|
||||
typedef typename iterator_traits<_InputIterator1>::value_type __v1;
|
||||
typedef typename iterator_traits<_InputIterator2>::value_type __v2;
|
||||
return _VSTD::__equal(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>(),
|
||||
typename iterator_traits<_InputIterator1>::iterator_category(),
|
||||
typename iterator_traits<_InputIterator2>::iterator_category());
|
||||
}
|
||||
#endif
|
||||
|
||||
// is_permutation
|
||||
|
||||
template<class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
|
||||
@@ -1169,6 +1289,100 @@ is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
|
||||
return _VSTD::is_permutation(__first1, __last1, __first2, __equal_to<__v1, __v2>());
|
||||
}
|
||||
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
template<class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
|
||||
bool
|
||||
__is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
|
||||
_ForwardIterator2 __first2, _ForwardIterator2 __last2,
|
||||
_BinaryPredicate __pred,
|
||||
forward_iterator_tag, forward_iterator_tag )
|
||||
{
|
||||
// shorten sequences as much as possible by lopping of any equal parts
|
||||
for (; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2)
|
||||
if (!__pred(*__first1, *__first2))
|
||||
goto __not_done;
|
||||
return __first1 == __last1 && __first2 == __last2;
|
||||
__not_done:
|
||||
// __first1 != __last1 && __first2 != __last2 && *__first1 != *__first2
|
||||
typedef typename iterator_traits<_ForwardIterator1>::difference_type _D1;
|
||||
_D1 __l1 = _VSTD::distance(__first1, __last1);
|
||||
|
||||
typedef typename iterator_traits<_ForwardIterator2>::difference_type _D2;
|
||||
_D2 __l2 = _VSTD::distance(__first2, __last2);
|
||||
if (__l1 != __l2)
|
||||
return false;
|
||||
|
||||
// For each element in [f1, l1) see if there are the same number of
|
||||
// equal elements in [f2, l2)
|
||||
for (_ForwardIterator1 __i = __first1; __i != __last1; ++__i)
|
||||
{
|
||||
// Have we already counted the number of *__i in [f1, l1)?
|
||||
for (_ForwardIterator1 __j = __first1; __j != __i; ++__j)
|
||||
if (__pred(*__j, *__i))
|
||||
goto __next_iter;
|
||||
{
|
||||
// Count number of *__i in [f2, l2)
|
||||
_D1 __c2 = 0;
|
||||
for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j)
|
||||
if (__pred(*__i, *__j))
|
||||
++__c2;
|
||||
if (__c2 == 0)
|
||||
return false;
|
||||
// Count number of *__i in [__i, l1) (we can start with 1)
|
||||
_D1 __c1 = 1;
|
||||
for (_ForwardIterator1 __j = _VSTD::next(__i); __j != __last1; ++__j)
|
||||
if (__pred(*__i, *__j))
|
||||
++__c1;
|
||||
if (__c1 != __c2)
|
||||
return false;
|
||||
}
|
||||
__next_iter:;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
template<class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
|
||||
bool
|
||||
__is_permutation(_RandomAccessIterator1 __first1, _RandomAccessIterator2 __last1,
|
||||
_RandomAccessIterator1 __first2, _RandomAccessIterator2 __last2,
|
||||
_BinaryPredicate __pred,
|
||||
random_access_iterator_tag, random_access_iterator_tag )
|
||||
{
|
||||
if ( _VSTD::distance(__first1, __last1) != _VSTD::distance(__first2, __last2))
|
||||
return false;
|
||||
return _VSTD::is_permutation<_RandomAccessIterator1, _RandomAccessIterator2,
|
||||
typename add_lvalue_reference<_BinaryPredicate>::type>
|
||||
(__first1, __last1, __first2, __pred );
|
||||
}
|
||||
|
||||
template<class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
|
||||
_ForwardIterator2 __first2, _ForwardIterator2 __last2,
|
||||
_BinaryPredicate __pred )
|
||||
{
|
||||
return _VSTD::__is_permutation<typename add_lvalue_reference<_BinaryPredicate>::type>
|
||||
(__first1, __last1, __first2, __last2, __pred,
|
||||
typename iterator_traits<_ForwardIterator1>::iterator_category(),
|
||||
typename iterator_traits<_ForwardIterator2>::iterator_category());
|
||||
}
|
||||
|
||||
template<class _ForwardIterator1, class _ForwardIterator2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
|
||||
_ForwardIterator2 __first2, _ForwardIterator2 __last2)
|
||||
{
|
||||
typedef typename iterator_traits<_ForwardIterator1>::value_type __v1;
|
||||
typedef typename iterator_traits<_ForwardIterator2>::value_type __v2;
|
||||
return _VSTD::__is_permutation(__first1, __last1, __first2, __last2,
|
||||
__equal_to<__v1, __v2>(),
|
||||
typename iterator_traits<_ForwardIterator1>::iterator_category(),
|
||||
typename iterator_traits<_ForwardIterator2>::iterator_category());
|
||||
}
|
||||
#endif
|
||||
|
||||
// search
|
||||
|
||||
template <class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2>
|
||||
@@ -1398,7 +1612,7 @@ __search_n(_RandomAccessIterator __first, _RandomAccessIterator __last,
|
||||
// Find first element in sequence that matchs __value_, with a mininum of loop checks
|
||||
while (true)
|
||||
{
|
||||
if (__first == __s) // return __last if no element matches __value_
|
||||
if (__first >= __s) // return __last if no element matches __value_
|
||||
return __last;
|
||||
if (__pred(*__first, __value_))
|
||||
break;
|
||||
@@ -1481,6 +1695,8 @@ __unwrap_iter(move_iterator<_Tp*> __i)
|
||||
return __i.base();
|
||||
}
|
||||
|
||||
#if _LIBCPP_DEBUG_LEVEL < 2
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
typename enable_if
|
||||
@@ -1493,6 +1709,8 @@ __unwrap_iter(__wrap_iter<_Tp*> __i)
|
||||
return __i.base();
|
||||
}
|
||||
|
||||
#endif // _LIBCPP_DEBUG_LEVEL < 2
|
||||
|
||||
template <class _InputIterator, class _OutputIterator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_OutputIterator
|
||||
@@ -1528,10 +1746,10 @@ copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
|
||||
|
||||
// copy_backward
|
||||
|
||||
template <class _InputIterator, class _OutputIterator>
|
||||
template <class _BidirectionalIterator, class _OutputIterator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_OutputIterator
|
||||
__copy_backward(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
|
||||
__copy_backward(_BidirectionalIterator __first, _BidirectionalIterator __last, _OutputIterator __result)
|
||||
{
|
||||
while (__first != __last)
|
||||
*--__result = *--__last;
|
||||
@@ -1780,17 +1998,23 @@ replace_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator _
|
||||
template <class _OutputIterator, class _Size, class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_OutputIterator
|
||||
__fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_, false_type)
|
||||
__fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_)
|
||||
{
|
||||
for (; __n > 0; ++__first, --__n)
|
||||
*__first = __value_;
|
||||
return __first;
|
||||
}
|
||||
|
||||
template <class _OutputIterator, class _Size, class _Tp>
|
||||
template <class _Tp, class _Size, class _Up>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_OutputIterator
|
||||
__fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_, true_type)
|
||||
typename enable_if
|
||||
<
|
||||
is_integral<_Tp>::value && sizeof(_Tp) == 1 &&
|
||||
!is_same<_Tp, bool>::value &&
|
||||
is_integral<_Up>::value && sizeof(_Up) == 1,
|
||||
_Tp*
|
||||
>::type
|
||||
__fill_n(_Tp* __first, _Size __n,_Up __value_)
|
||||
{
|
||||
if (__n > 0)
|
||||
_VSTD::memset(__first, (unsigned char)__value_, (size_t)(__n));
|
||||
@@ -1802,10 +2026,7 @@ inline _LIBCPP_INLINE_VISIBILITY
|
||||
_OutputIterator
|
||||
fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_)
|
||||
{
|
||||
return _VSTD::__fill_n(__first, __n, __value_, integral_constant<bool,
|
||||
is_pointer<_OutputIterator>::value &&
|
||||
is_trivially_copy_assignable<_Tp>::value &&
|
||||
sizeof(_Tp) == 1>());
|
||||
return _VSTD::__fill_n(__first, __n, __value_);
|
||||
}
|
||||
|
||||
// fill
|
||||
@@ -2754,17 +2975,17 @@ uniform_int_distribution<_IntType>::operator()(_URNG& __g, const param_type& __p
|
||||
return static_cast<result_type>(__u + __p.a());
|
||||
}
|
||||
|
||||
class __rs_default;
|
||||
class _LIBCPP_TYPE_VIS __rs_default;
|
||||
|
||||
__rs_default __rs_get();
|
||||
_LIBCPP_FUNC_VIS __rs_default __rs_get();
|
||||
|
||||
class __rs_default
|
||||
class _LIBCPP_TYPE_VIS __rs_default
|
||||
{
|
||||
static unsigned __c_;
|
||||
|
||||
__rs_default();
|
||||
public:
|
||||
typedef unsigned result_type;
|
||||
typedef uint_fast32_t result_type;
|
||||
|
||||
static const result_type _Min = 0;
|
||||
static const result_type _Max = 0xFFFFFFFF;
|
||||
@@ -2777,10 +2998,10 @@ public:
|
||||
static _LIBCPP_CONSTEXPR result_type min() {return _Min;}
|
||||
static _LIBCPP_CONSTEXPR result_type max() {return _Max;}
|
||||
|
||||
friend __rs_default __rs_get();
|
||||
friend _LIBCPP_FUNC_VIS __rs_default __rs_get();
|
||||
};
|
||||
|
||||
__rs_default __rs_get();
|
||||
_LIBCPP_FUNC_VIS __rs_default __rs_get();
|
||||
|
||||
template <class _RandomAccessIterator>
|
||||
void
|
||||
@@ -3735,14 +3956,14 @@ inline _LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
|
||||
{
|
||||
#ifdef _LIBCPP_DEBUG2
|
||||
#ifdef _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
|
||||
__debug_less<_Compare> __c(__comp);
|
||||
__sort<_Comp_ref>(__first, __last, __c);
|
||||
#else // _LIBCPP_DEBUG2
|
||||
#else // _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
|
||||
__sort<_Comp_ref>(__first, __last, __comp);
|
||||
#endif // _LIBCPP_DEBUG2
|
||||
#endif // _LIBCPP_DEBUG
|
||||
}
|
||||
|
||||
template <class _RandomAccessIterator>
|
||||
@@ -3778,46 +3999,46 @@ sort(__wrap_iter<_Tp*> __first, __wrap_iter<_Tp*> __last, _Compare __comp)
|
||||
_VSTD::sort<_Tp*, _Comp_ref>(__first.base(), __last.base(), __comp);
|
||||
}
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#ifdef _LIBCPP_MSVC
|
||||
#pragma warning( push )
|
||||
#pragma warning( disable: 4231)
|
||||
#endif // _MSC_VER
|
||||
_LIBCPP_EXTERN_TEMPLATE(void __sort<__less<char>&, char*>(char*, char*, __less<char>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(void __sort<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(void __sort<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(void __sort<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(void __sort<__less<short>&, short*>(short*, short*, __less<short>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(void __sort<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(void __sort<__less<int>&, int*>(int*, int*, __less<int>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(void __sort<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(void __sort<__less<long>&, long*>(long*, long*, __less<long>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(void __sort<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(void __sort<__less<long long>&, long long*>(long long*, long long*, __less<long long>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(void __sort<__less<unsigned long long>&, unsigned long long*>(unsigned long long*, unsigned long long*, __less<unsigned long long>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(void __sort<__less<float>&, float*>(float*, float*, __less<float>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(void __sort<__less<double>&, double*>(double*, double*, __less<double>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(void __sort<__less<long double>&, long double*>(long double*, long double*, __less<long double>&))
|
||||
#endif // _LIBCPP_MSVC
|
||||
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<char>&, char*>(char*, char*, __less<char>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<short>&, short*>(short*, short*, __less<short>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<int>&, int*>(int*, int*, __less<int>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<long>&, long*>(long*, long*, __less<long>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<long long>&, long long*>(long long*, long long*, __less<long long>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned long long>&, unsigned long long*>(unsigned long long*, unsigned long long*, __less<unsigned long long>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<float>&, float*>(float*, float*, __less<float>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<double>&, double*>(double*, double*, __less<double>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<long double>&, long double*>(long double*, long double*, __less<long double>&))
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE(bool __insertion_sort_incomplete<__less<char>&, char*>(char*, char*, __less<char>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(bool __insertion_sort_incomplete<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(bool __insertion_sort_incomplete<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(bool __insertion_sort_incomplete<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(bool __insertion_sort_incomplete<__less<short>&, short*>(short*, short*, __less<short>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(bool __insertion_sort_incomplete<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(bool __insertion_sort_incomplete<__less<int>&, int*>(int*, int*, __less<int>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(bool __insertion_sort_incomplete<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(bool __insertion_sort_incomplete<__less<long>&, long*>(long*, long*, __less<long>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(bool __insertion_sort_incomplete<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(bool __insertion_sort_incomplete<__less<long long>&, long long*>(long long*, long long*, __less<long long>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(bool __insertion_sort_incomplete<__less<unsigned long long>&, unsigned long long*>(unsigned long long*, unsigned long long*, __less<unsigned long long>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(bool __insertion_sort_incomplete<__less<float>&, float*>(float*, float*, __less<float>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(bool __insertion_sort_incomplete<__less<double>&, double*>(double*, double*, __less<double>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(bool __insertion_sort_incomplete<__less<long double>&, long double*>(long double*, long double*, __less<long double>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<char>&, char*>(char*, char*, __less<char>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<short>&, short*>(short*, short*, __less<short>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<int>&, int*>(int*, int*, __less<int>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<long>&, long*>(long*, long*, __less<long>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<long long>&, long long*>(long long*, long long*, __less<long long>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned long long>&, unsigned long long*>(unsigned long long*, unsigned long long*, __less<unsigned long long>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<float>&, float*>(float*, float*, __less<float>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<double>&, double*>(double*, double*, __less<double>&))
|
||||
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<long double>&, long double*>(long double*, long double*, __less<long double>&))
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE(unsigned __sort5<__less<long double>&, long double*>(long double*, long double*, long double*, long double*, long double*, __less<long double>&))
|
||||
#ifdef _MSC_VER
|
||||
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS unsigned __sort5<__less<long double>&, long double*>(long double*, long double*, long double*, long double*, long double*, __less<long double>&))
|
||||
#ifdef _LIBCPP_MSVC
|
||||
#pragma warning( pop )
|
||||
#endif // _MSC_VER
|
||||
#endif // _LIBCPP_MSVC
|
||||
|
||||
// lower_bound
|
||||
|
||||
@@ -3848,14 +4069,14 @@ inline _LIBCPP_INLINE_VISIBILITY
|
||||
_ForwardIterator
|
||||
lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
|
||||
{
|
||||
#ifdef _LIBCPP_DEBUG2
|
||||
#ifdef _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
|
||||
__debug_less<_Compare> __c(__comp);
|
||||
return __lower_bound<_Comp_ref>(__first, __last, __value_, __c);
|
||||
#else // _LIBCPP_DEBUG2
|
||||
#else // _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
|
||||
return __lower_bound<_Comp_ref>(__first, __last, __value_, __comp);
|
||||
#endif // _LIBCPP_DEBUG2
|
||||
#endif // _LIBCPP_DEBUG
|
||||
}
|
||||
|
||||
template <class _ForwardIterator, class _Tp>
|
||||
@@ -3896,14 +4117,14 @@ inline _LIBCPP_INLINE_VISIBILITY
|
||||
_ForwardIterator
|
||||
upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
|
||||
{
|
||||
#ifdef _LIBCPP_DEBUG2
|
||||
#ifdef _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
|
||||
__debug_less<_Compare> __c(__comp);
|
||||
return __upper_bound<_Comp_ref>(__first, __last, __value_, __c);
|
||||
#else // _LIBCPP_DEBUG2
|
||||
#else // _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
|
||||
return __upper_bound<_Comp_ref>(__first, __last, __value_, __comp);
|
||||
#endif // _LIBCPP_DEBUG2
|
||||
#endif // _LIBCPP_DEBUG
|
||||
}
|
||||
|
||||
template <class _ForwardIterator, class _Tp>
|
||||
@@ -3956,14 +4177,14 @@ inline _LIBCPP_INLINE_VISIBILITY
|
||||
pair<_ForwardIterator, _ForwardIterator>
|
||||
equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
|
||||
{
|
||||
#ifdef _LIBCPP_DEBUG2
|
||||
#ifdef _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
|
||||
__debug_less<_Compare> __c(__comp);
|
||||
return __equal_range<_Comp_ref>(__first, __last, __value_, __c);
|
||||
#else // _LIBCPP_DEBUG2
|
||||
#else // _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
|
||||
return __equal_range<_Comp_ref>(__first, __last, __value_, __comp);
|
||||
#endif // _LIBCPP_DEBUG2
|
||||
#endif // _LIBCPP_DEBUG
|
||||
}
|
||||
|
||||
template <class _ForwardIterator, class _Tp>
|
||||
@@ -3991,14 +4212,14 @@ inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)
|
||||
{
|
||||
#ifdef _LIBCPP_DEBUG2
|
||||
#ifdef _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
|
||||
__debug_less<_Compare> __c(__comp);
|
||||
return __binary_search<_Comp_ref>(__first, __last, __value_, __c);
|
||||
#else // _LIBCPP_DEBUG2
|
||||
#else // _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
|
||||
return __binary_search<_Comp_ref>(__first, __last, __value_, __comp);
|
||||
#endif // _LIBCPP_DEBUG2
|
||||
#endif // _LIBCPP_DEBUG
|
||||
}
|
||||
|
||||
template <class _ForwardIterator, class _Tp>
|
||||
@@ -4041,14 +4262,14 @@ _OutputIterator
|
||||
merge(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||
_InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
|
||||
{
|
||||
#ifdef _LIBCPP_DEBUG2
|
||||
#ifdef _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
|
||||
__debug_less<_Compare> __c(__comp);
|
||||
return _VSTD::__merge<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
|
||||
#else // _LIBCPP_DEBUG2
|
||||
#else // _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
|
||||
return _VSTD::__merge<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
|
||||
#endif // _LIBCPP_DEBUG2
|
||||
#endif // _LIBCPP_DEBUG
|
||||
}
|
||||
|
||||
template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
|
||||
@@ -4215,16 +4436,16 @@ inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _
|
||||
__buf = _VSTD::get_temporary_buffer<value_type>(__buf_size);
|
||||
__h.reset(__buf.first);
|
||||
}
|
||||
#ifdef _LIBCPP_DEBUG2
|
||||
#ifdef _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
|
||||
__debug_less<_Compare> __c(__comp);
|
||||
return _VSTD::__inplace_merge<_Comp_ref>(__first, __middle, __last, __c, __len1, __len2,
|
||||
__buf.first, __buf.second);
|
||||
#else // _LIBCPP_DEBUG2
|
||||
#else // _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
|
||||
return _VSTD::__inplace_merge<_Comp_ref>(__first, __middle, __last, __comp, __len1, __len2,
|
||||
__buf.first, __buf.second);
|
||||
#endif // _LIBCPP_DEBUG2
|
||||
#endif // _LIBCPP_DEBUG
|
||||
}
|
||||
|
||||
template <class _BidirectionalIterator>
|
||||
@@ -4426,14 +4647,14 @@ stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compar
|
||||
__buf = _VSTD::get_temporary_buffer<value_type>(__len);
|
||||
__h.reset(__buf.first);
|
||||
}
|
||||
#ifdef _LIBCPP_DEBUG2
|
||||
#ifdef _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
|
||||
__debug_less<_Compare> __c(__comp);
|
||||
__stable_sort<_Comp_ref>(__first, __last, __c, __len, __buf.first, __buf.second);
|
||||
#else // _LIBCPP_DEBUG2
|
||||
#else // _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
|
||||
__stable_sort<_Comp_ref>(__first, __last, __comp, __len, __buf.first, __buf.second);
|
||||
#endif // _LIBCPP_DEBUG2
|
||||
#endif // _LIBCPP_DEBUG
|
||||
}
|
||||
|
||||
template <class _RandomAccessIterator>
|
||||
@@ -4575,14 +4796,14 @@ inline _LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
|
||||
{
|
||||
#ifdef _LIBCPP_DEBUG2
|
||||
#ifdef _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
|
||||
__debug_less<_Compare> __c(__comp);
|
||||
__push_heap_back<_Comp_ref>(__first, __last, __c, __last - __first);
|
||||
#else // _LIBCPP_DEBUG2
|
||||
#else // _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
|
||||
__push_heap_back<_Comp_ref>(__first, __last, __comp, __last - __first);
|
||||
#endif // _LIBCPP_DEBUG2
|
||||
#endif // _LIBCPP_DEBUG
|
||||
}
|
||||
|
||||
template <class _RandomAccessIterator>
|
||||
@@ -4613,14 +4834,14 @@ inline _LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
|
||||
{
|
||||
#ifdef _LIBCPP_DEBUG2
|
||||
#ifdef _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
|
||||
__debug_less<_Compare> __c(__comp);
|
||||
__pop_heap<_Comp_ref>(__first, __last, __c, __last - __first);
|
||||
#else // _LIBCPP_DEBUG2
|
||||
#else // _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
|
||||
__pop_heap<_Comp_ref>(__first, __last, __comp, __last - __first);
|
||||
#endif // _LIBCPP_DEBUG2
|
||||
#endif // _LIBCPP_DEBUG
|
||||
}
|
||||
|
||||
template <class _RandomAccessIterator>
|
||||
@@ -4653,14 +4874,14 @@ inline _LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
|
||||
{
|
||||
#ifdef _LIBCPP_DEBUG2
|
||||
#ifdef _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
|
||||
__debug_less<_Compare> __c(__comp);
|
||||
__make_heap<_Comp_ref>(__first, __last, __c);
|
||||
#else // _LIBCPP_DEBUG2
|
||||
#else // _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
|
||||
__make_heap<_Comp_ref>(__first, __last, __comp);
|
||||
#endif // _LIBCPP_DEBUG2
|
||||
#endif // _LIBCPP_DEBUG
|
||||
}
|
||||
|
||||
template <class _RandomAccessIterator>
|
||||
@@ -4687,14 +4908,14 @@ inline _LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
|
||||
{
|
||||
#ifdef _LIBCPP_DEBUG2
|
||||
#ifdef _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
|
||||
__debug_less<_Compare> __c(__comp);
|
||||
__sort_heap<_Comp_ref>(__first, __last, __c);
|
||||
#else // _LIBCPP_DEBUG2
|
||||
#else // _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
|
||||
__sort_heap<_Comp_ref>(__first, __last, __comp);
|
||||
#endif // _LIBCPP_DEBUG2
|
||||
#endif // _LIBCPP_DEBUG
|
||||
}
|
||||
|
||||
template <class _RandomAccessIterator>
|
||||
@@ -4731,14 +4952,14 @@ void
|
||||
partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
|
||||
_Compare __comp)
|
||||
{
|
||||
#ifdef _LIBCPP_DEBUG2
|
||||
#ifdef _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
|
||||
__debug_less<_Compare> __c(__comp);
|
||||
__partial_sort<_Comp_ref>(__first, __middle, __last, __c);
|
||||
#else // _LIBCPP_DEBUG2
|
||||
#else // _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
|
||||
__partial_sort<_Comp_ref>(__first, __middle, __last, __comp);
|
||||
#endif // _LIBCPP_DEBUG2
|
||||
#endif // _LIBCPP_DEBUG
|
||||
}
|
||||
|
||||
template <class _RandomAccessIterator>
|
||||
@@ -4781,14 +5002,14 @@ _RandomAccessIterator
|
||||
partial_sort_copy(_InputIterator __first, _InputIterator __last,
|
||||
_RandomAccessIterator __result_first, _RandomAccessIterator __result_last, _Compare __comp)
|
||||
{
|
||||
#ifdef _LIBCPP_DEBUG2
|
||||
#ifdef _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
|
||||
__debug_less<_Compare> __c(__comp);
|
||||
return __partial_sort_copy<_Comp_ref>(__first, __last, __result_first, __result_last, __c);
|
||||
#else // _LIBCPP_DEBUG2
|
||||
#else // _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
|
||||
return __partial_sort_copy<_Comp_ref>(__first, __last, __result_first, __result_last, __comp);
|
||||
#endif // _LIBCPP_DEBUG2
|
||||
#endif // _LIBCPP_DEBUG
|
||||
}
|
||||
|
||||
template <class _InputIterator, class _RandomAccessIterator>
|
||||
@@ -4995,14 +5216,14 @@ inline _LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, _Compare __comp)
|
||||
{
|
||||
#ifdef _LIBCPP_DEBUG2
|
||||
#ifdef _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
|
||||
__debug_less<_Compare> __c(__comp);
|
||||
__nth_element<_Comp_ref>(__first, __nth, __last, __c);
|
||||
#else // _LIBCPP_DEBUG2
|
||||
#else // _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
|
||||
__nth_element<_Comp_ref>(__first, __nth, __last, __comp);
|
||||
#endif // _LIBCPP_DEBUG2
|
||||
#endif // _LIBCPP_DEBUG
|
||||
}
|
||||
|
||||
template <class _RandomAccessIterator>
|
||||
@@ -5036,14 +5257,14 @@ bool
|
||||
includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2,
|
||||
_Compare __comp)
|
||||
{
|
||||
#ifdef _LIBCPP_DEBUG2
|
||||
#ifdef _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
|
||||
__debug_less<_Compare> __c(__comp);
|
||||
return __includes<_Comp_ref>(__first1, __last1, __first2, __last2, __c);
|
||||
#else // _LIBCPP_DEBUG2
|
||||
#else // _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
|
||||
return __includes<_Comp_ref>(__first1, __last1, __first2, __last2, __comp);
|
||||
#endif // _LIBCPP_DEBUG2
|
||||
#endif // _LIBCPP_DEBUG
|
||||
}
|
||||
|
||||
template <class _InputIterator1, class _InputIterator2>
|
||||
@@ -5089,14 +5310,14 @@ _OutputIterator
|
||||
set_union(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||
_InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
|
||||
{
|
||||
#ifdef _LIBCPP_DEBUG2
|
||||
#ifdef _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
|
||||
__debug_less<_Compare> __c(__comp);
|
||||
return __set_union<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
|
||||
#else // _LIBCPP_DEBUG2
|
||||
#else // _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
|
||||
return __set_union<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
|
||||
#endif // _LIBCPP_DEBUG2
|
||||
#endif // _LIBCPP_DEBUG
|
||||
}
|
||||
|
||||
template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
|
||||
@@ -5141,14 +5362,14 @@ _OutputIterator
|
||||
set_intersection(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||
_InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
|
||||
{
|
||||
#ifdef _LIBCPP_DEBUG2
|
||||
#ifdef _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
|
||||
__debug_less<_Compare> __c(__comp);
|
||||
return __set_intersection<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
|
||||
#else // _LIBCPP_DEBUG2
|
||||
#else // _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
|
||||
return __set_intersection<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
|
||||
#endif // _LIBCPP_DEBUG2
|
||||
#endif // _LIBCPP_DEBUG
|
||||
}
|
||||
|
||||
template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
|
||||
@@ -5195,14 +5416,14 @@ _OutputIterator
|
||||
set_difference(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||
_InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
|
||||
{
|
||||
#ifdef _LIBCPP_DEBUG2
|
||||
#ifdef _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
|
||||
__debug_less<_Compare> __c(__comp);
|
||||
return __set_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
|
||||
#else // _LIBCPP_DEBUG2
|
||||
#else // _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
|
||||
return __set_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
|
||||
#endif // _LIBCPP_DEBUG2
|
||||
#endif // _LIBCPP_DEBUG
|
||||
}
|
||||
|
||||
template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
|
||||
@@ -5254,14 +5475,14 @@ _OutputIterator
|
||||
set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||
_InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp)
|
||||
{
|
||||
#ifdef _LIBCPP_DEBUG2
|
||||
#ifdef _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
|
||||
__debug_less<_Compare> __c(__comp);
|
||||
return __set_symmetric_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c);
|
||||
#else // _LIBCPP_DEBUG2
|
||||
#else // _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
|
||||
return __set_symmetric_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp);
|
||||
#endif // _LIBCPP_DEBUG2
|
||||
#endif // _LIBCPP_DEBUG
|
||||
}
|
||||
|
||||
template <class _InputIterator1, class _InputIterator2, class _OutputIterator>
|
||||
@@ -5298,14 +5519,14 @@ bool
|
||||
lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||
_InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp)
|
||||
{
|
||||
#ifdef _LIBCPP_DEBUG2
|
||||
#ifdef _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
|
||||
__debug_less<_Compare> __c(__comp);
|
||||
return __lexicographical_compare<_Comp_ref>(__first1, __last1, __first2, __last2, __c);
|
||||
#else // _LIBCPP_DEBUG2
|
||||
#else // _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
|
||||
return __lexicographical_compare<_Comp_ref>(__first1, __last1, __first2, __last2, __comp);
|
||||
#endif // _LIBCPP_DEBUG2
|
||||
#endif // _LIBCPP_DEBUG
|
||||
}
|
||||
|
||||
template <class _InputIterator1, class _InputIterator2>
|
||||
@@ -5353,14 +5574,14 @@ inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
|
||||
{
|
||||
#ifdef _LIBCPP_DEBUG2
|
||||
#ifdef _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
|
||||
__debug_less<_Compare> __c(__comp);
|
||||
return __next_permutation<_Comp_ref>(__first, __last, __c);
|
||||
#else // _LIBCPP_DEBUG2
|
||||
#else // _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
|
||||
return __next_permutation<_Comp_ref>(__first, __last, __comp);
|
||||
#endif // _LIBCPP_DEBUG2
|
||||
#endif // _LIBCPP_DEBUG
|
||||
}
|
||||
|
||||
template <class _BidirectionalIterator>
|
||||
@@ -5406,14 +5627,14 @@ inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
|
||||
{
|
||||
#ifdef _LIBCPP_DEBUG2
|
||||
#ifdef _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref;
|
||||
__debug_less<_Compare> __c(__comp);
|
||||
return __prev_permutation<_Comp_ref>(__first, __last, __c);
|
||||
#else // _LIBCPP_DEBUG2
|
||||
#else // _LIBCPP_DEBUG
|
||||
typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
|
||||
return __prev_permutation<_Comp_ref>(__first, __last, __comp);
|
||||
#endif // _LIBCPP_DEBUG2
|
||||
#endif // _LIBCPP_DEBUG
|
||||
}
|
||||
|
||||
template <class _BidirectionalIterator>
|
||||
|
||||
@@ -59,14 +59,14 @@ struct array
|
||||
|
||||
// element access:
|
||||
reference operator[](size_type n);
|
||||
const_reference operator[](size_type n) const;
|
||||
const_reference at(size_type n) const;
|
||||
const_reference operator[](size_type n) const; // constexpr in C++14
|
||||
const_reference at(size_type n) const; // constexpr in C++14
|
||||
reference at(size_type n);
|
||||
|
||||
reference front();
|
||||
const_reference front() const;
|
||||
const_reference front() const; // constexpr in C++14
|
||||
reference back();
|
||||
const_reference back() const;
|
||||
const_reference back() const; // constexpr in C++14
|
||||
|
||||
T* data() noexcept;
|
||||
const T* data() const noexcept;
|
||||
@@ -92,9 +92,9 @@ template <class T> class tuple_size;
|
||||
template <int I, class T> class tuple_element;
|
||||
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 <int I, class T, size_t N> T& get(array<T, N>&) noexcept;
|
||||
template <int I, class T, size_t N> const T& get(const array<T, N>&) noexcept;
|
||||
template <int I, class T, size_t N> T&& get(array<T, N>&&) noexcept;
|
||||
template <int 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 <int I, class T, size_t N> T&& get(array<T, N>&&) noexcept; // constexpr in C++14
|
||||
|
||||
} // std
|
||||
|
||||
@@ -118,7 +118,7 @@ template <int I, class T, size_t N> T&& get(array<T, N>&&) noexcept;
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _Tp, size_t _Size>
|
||||
struct _LIBCPP_VISIBLE array
|
||||
struct _LIBCPP_TYPE_VIS_ONLY array
|
||||
{
|
||||
// types:
|
||||
typedef array __self;
|
||||
@@ -181,14 +181,14 @@ struct _LIBCPP_VISIBLE array
|
||||
|
||||
// element access:
|
||||
_LIBCPP_INLINE_VISIBILITY reference operator[](size_type __n) {return __elems_[__n];}
|
||||
_LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __n) const {return __elems_[__n];}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const_reference operator[](size_type __n) const {return __elems_[__n];}
|
||||
reference at(size_type __n);
|
||||
const_reference at(size_type __n) const;
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11 const_reference at(size_type __n) const;
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY reference front() {return __elems_[0];}
|
||||
_LIBCPP_INLINE_VISIBILITY const_reference front() const {return __elems_[0];}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const_reference front() const {return __elems_[0];}
|
||||
_LIBCPP_INLINE_VISIBILITY reference back() {return __elems_[_Size > 0 ? _Size-1 : 0];}
|
||||
_LIBCPP_INLINE_VISIBILITY const_reference back() const {return __elems_[_Size > 0 ? _Size-1 : 0];}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const_reference back() const {return __elems_[_Size > 0 ? _Size-1 : 0];}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
value_type* data() _NOEXCEPT {return __elems_;}
|
||||
@@ -210,6 +210,7 @@ array<_Tp, _Size>::at(size_type __n)
|
||||
}
|
||||
|
||||
template <class _Tp, size_t _Size>
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
typename array<_Tp, _Size>::const_reference
|
||||
array<_Tp, _Size>::at(size_type __n) const
|
||||
{
|
||||
@@ -223,7 +224,7 @@ array<_Tp, _Size>::at(size_type __n) const
|
||||
}
|
||||
|
||||
template <class _Tp, size_t _Size>
|
||||
_LIBCPP_INLINE_VISIBILITY inline
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator==(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y)
|
||||
{
|
||||
@@ -231,7 +232,7 @@ operator==(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y)
|
||||
}
|
||||
|
||||
template <class _Tp, size_t _Size>
|
||||
_LIBCPP_INLINE_VISIBILITY inline
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator!=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y)
|
||||
{
|
||||
@@ -239,7 +240,7 @@ operator!=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y)
|
||||
}
|
||||
|
||||
template <class _Tp, size_t _Size>
|
||||
_LIBCPP_INLINE_VISIBILITY inline
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator<(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y)
|
||||
{
|
||||
@@ -247,7 +248,7 @@ operator<(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y)
|
||||
}
|
||||
|
||||
template <class _Tp, size_t _Size>
|
||||
_LIBCPP_INLINE_VISIBILITY inline
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator>(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y)
|
||||
{
|
||||
@@ -255,7 +256,7 @@ operator>(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y)
|
||||
}
|
||||
|
||||
template <class _Tp, size_t _Size>
|
||||
_LIBCPP_INLINE_VISIBILITY inline
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator<=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y)
|
||||
{
|
||||
@@ -263,7 +264,7 @@ operator<=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y)
|
||||
}
|
||||
|
||||
template <class _Tp, size_t _Size>
|
||||
_LIBCPP_INLINE_VISIBILITY inline
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator>=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y)
|
||||
{
|
||||
@@ -271,7 +272,7 @@ operator>=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y)
|
||||
}
|
||||
|
||||
template <class _Tp, size_t _Size>
|
||||
_LIBCPP_INLINE_VISIBILITY inline
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
typename enable_if
|
||||
<
|
||||
__is_swappable<_Tp>::value,
|
||||
@@ -284,51 +285,54 @@ swap(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y)
|
||||
}
|
||||
|
||||
template <class _Tp, size_t _Size>
|
||||
class _LIBCPP_VISIBLE tuple_size<array<_Tp, _Size> >
|
||||
class _LIBCPP_TYPE_VIS_ONLY tuple_size<array<_Tp, _Size> >
|
||||
: public integral_constant<size_t, _Size> {};
|
||||
|
||||
template <class _Tp, size_t _Size>
|
||||
class _LIBCPP_VISIBLE tuple_size<const array<_Tp, _Size> >
|
||||
class _LIBCPP_TYPE_VIS_ONLY tuple_size<const array<_Tp, _Size> >
|
||||
: public integral_constant<size_t, _Size> {};
|
||||
|
||||
template <size_t _Ip, class _Tp, size_t _Size>
|
||||
class _LIBCPP_VISIBLE tuple_element<_Ip, array<_Tp, _Size> >
|
||||
class _LIBCPP_TYPE_VIS_ONLY tuple_element<_Ip, array<_Tp, _Size> >
|
||||
{
|
||||
public:
|
||||
typedef _Tp type;
|
||||
};
|
||||
|
||||
template <size_t _Ip, class _Tp, size_t _Size>
|
||||
class _LIBCPP_VISIBLE tuple_element<_Ip, const array<_Tp, _Size> >
|
||||
class _LIBCPP_TYPE_VIS_ONLY tuple_element<_Ip, const array<_Tp, _Size> >
|
||||
{
|
||||
public:
|
||||
typedef const _Tp type;
|
||||
};
|
||||
|
||||
template <size_t _Ip, class _Tp, size_t _Size>
|
||||
_LIBCPP_INLINE_VISIBILITY inline
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_Tp&
|
||||
get(array<_Tp, _Size>& __a) _NOEXCEPT
|
||||
{
|
||||
return __a[_Ip];
|
||||
static_assert(_Ip < _Size, "Index out of bounds in std::get<> (std::array)");
|
||||
return __a.__elems_[_Ip];
|
||||
}
|
||||
|
||||
template <size_t _Ip, class _Tp, size_t _Size>
|
||||
_LIBCPP_INLINE_VISIBILITY inline
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
const _Tp&
|
||||
get(const array<_Tp, _Size>& __a) _NOEXCEPT
|
||||
{
|
||||
return __a[_Ip];
|
||||
static_assert(_Ip < _Size, "Index out of bounds in std::get<> (const std::array)");
|
||||
return __a.__elems_[_Ip];
|
||||
}
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
|
||||
template <size_t _Ip, class _Tp, size_t _Size>
|
||||
_LIBCPP_INLINE_VISIBILITY inline
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_Tp&&
|
||||
get(array<_Tp, _Size>&& __a) _NOEXCEPT
|
||||
{
|
||||
return _VSTD::move(__a[_Ip]);
|
||||
static_assert(_Ip < _Size, "Index out of bounds in std::get<> (std::array &&)");
|
||||
return _VSTD::move(__a.__elems_[_Ip]);
|
||||
}
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
|
||||
@@ -33,6 +33,7 @@ template <class T> T kill_dependency(T y) noexcept;
|
||||
|
||||
// lock-free property
|
||||
|
||||
#define ATOMIC_BOOL_LOCK_FREE unspecified
|
||||
#define ATOMIC_CHAR_LOCK_FREE unspecified
|
||||
#define ATOMIC_CHAR16_T_LOCK_FREE unspecified
|
||||
#define ATOMIC_CHAR32_T_LOCK_FREE unspecified
|
||||
@@ -41,6 +42,7 @@ template <class T> T kill_dependency(T y) noexcept;
|
||||
#define ATOMIC_INT_LOCK_FREE unspecified
|
||||
#define ATOMIC_LONG_LOCK_FREE unspecified
|
||||
#define ATOMIC_LLONG_LOCK_FREE unspecified
|
||||
#define ATOMIC_POINTER_LOCK_FREE unspecified
|
||||
|
||||
// flag type and operations
|
||||
|
||||
@@ -472,6 +474,7 @@ template <class T>
|
||||
|
||||
// Atomics for standard typedef types
|
||||
|
||||
typedef atomic<bool> atomic_bool;
|
||||
typedef atomic<char> atomic_char;
|
||||
typedef atomic<signed char> atomic_schar;
|
||||
typedef atomic<unsigned char> atomic_uchar;
|
||||
@@ -619,7 +622,12 @@ struct __atomic_base // false
|
||||
{return __c11_atomic_compare_exchange_strong(&__a_, &__e, __d, __m, __m);}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__atomic_base() _NOEXCEPT {} // = default;
|
||||
#ifndef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
__atomic_base() _NOEXCEPT = default;
|
||||
#else
|
||||
__atomic_base() _NOEXCEPT : __a_() {}
|
||||
#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_CONSTEXPR __atomic_base(_Tp __d) _NOEXCEPT : __a_(__d) {}
|
||||
#ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS
|
||||
@@ -642,7 +650,7 @@ struct __atomic_base<_Tp, true>
|
||||
{
|
||||
typedef __atomic_base<_Tp, false> __base;
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__atomic_base() _NOEXCEPT {} // = default;
|
||||
__atomic_base() _NOEXCEPT _LIBCPP_DEFAULT
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_CONSTEXPR __atomic_base(_Tp __d) _NOEXCEPT : __base(__d) {}
|
||||
|
||||
@@ -723,7 +731,7 @@ struct atomic
|
||||
{
|
||||
typedef __atomic_base<_Tp> __base;
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
atomic() _NOEXCEPT {} // = default;
|
||||
atomic() _NOEXCEPT _LIBCPP_DEFAULT
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_CONSTEXPR atomic(_Tp __d) _NOEXCEPT : __base(__d) {}
|
||||
|
||||
@@ -743,7 +751,7 @@ struct atomic<_Tp*>
|
||||
{
|
||||
typedef __atomic_base<_Tp*> __base;
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
atomic() _NOEXCEPT {} // = default;
|
||||
atomic() _NOEXCEPT _LIBCPP_DEFAULT
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_CONSTEXPR atomic(_Tp* __d) _NOEXCEPT : __base(__d) {}
|
||||
|
||||
@@ -1364,7 +1372,12 @@ typedef struct atomic_flag
|
||||
{__c11_atomic_store(&__a_, false, __m);}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
atomic_flag() _NOEXCEPT {} // = default;
|
||||
#ifndef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
atomic_flag() _NOEXCEPT = default;
|
||||
#else
|
||||
atomic_flag() _NOEXCEPT : __a_() {}
|
||||
#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
atomic_flag(bool __b) _NOEXCEPT : __a_(__b) {}
|
||||
|
||||
@@ -1454,6 +1467,7 @@ atomic_signal_fence(memory_order __m) _NOEXCEPT
|
||||
|
||||
// Atomics for standard typedef types
|
||||
|
||||
typedef atomic<bool> atomic_bool;
|
||||
typedef atomic<char> atomic_char;
|
||||
typedef atomic<signed char> atomic_schar;
|
||||
typedef atomic<unsigned char> atomic_uchar;
|
||||
@@ -1499,14 +1513,16 @@ typedef atomic<uintmax_t> atomic_uintmax_t;
|
||||
|
||||
// lock-free property
|
||||
|
||||
#define ATOMIC_CHAR_LOCK_FREE 0
|
||||
#define ATOMIC_CHAR16_T_LOCK_FREE 0
|
||||
#define ATOMIC_CHAR32_T_LOCK_FREE 0
|
||||
#define ATOMIC_WCHAR_T_LOCK_FREE 0
|
||||
#define ATOMIC_SHORT_LOCK_FREE 0
|
||||
#define ATOMIC_INT_LOCK_FREE 0
|
||||
#define ATOMIC_LONG_LOCK_FREE 0
|
||||
#define ATOMIC_LLONG_LOCK_FREE 0
|
||||
#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)
|
||||
|
||||
|
||||
@@ -249,7 +249,13 @@ inline _LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_CONSTEXPR
|
||||
__bitset<_N_words, _Size>::__bitset(unsigned long long __v) _NOEXCEPT
|
||||
#ifndef _LIBCPP_HAS_NO_CONSTEXPR
|
||||
#if __SIZE_WIDTH__ == 64
|
||||
: __first_{__v}
|
||||
#elif __SIZE_WIDTH__ == 32
|
||||
: __first_{__v, __v >> __bits_per_word}
|
||||
#else
|
||||
#error This constructor has not been ported to this platform
|
||||
#endif
|
||||
#endif
|
||||
{
|
||||
#ifdef _LIBCPP_HAS_NO_CONSTEXPR
|
||||
@@ -626,13 +632,14 @@ __bitset<0, 0>::__bitset(unsigned long long) _NOEXCEPT
|
||||
{
|
||||
}
|
||||
|
||||
template <size_t _Size> class _LIBCPP_VISIBLE bitset;
|
||||
template <size_t _Size> struct hash<bitset<_Size> >;
|
||||
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>
|
||||
class _LIBCPP_VISIBLE bitset
|
||||
class _LIBCPP_TYPE_VIS_ONLY bitset
|
||||
: private __bitset<_Size == 0 ? 0 : (_Size - 1) / (sizeof(size_t) * CHAR_BIT) + 1, _Size>
|
||||
{
|
||||
public:
|
||||
static const unsigned __n_words = _Size == 0 ? 0 : (_Size - 1) / (sizeof(size_t) * CHAR_BIT) + 1;
|
||||
typedef __bitset<__n_words, _Size> base;
|
||||
|
||||
@@ -1053,7 +1060,7 @@ operator^(const bitset<_Size>& __x, const bitset<_Size>& __y) _NOEXCEPT
|
||||
}
|
||||
|
||||
template <size_t _Size>
|
||||
struct _LIBCPP_VISIBLE hash<bitset<_Size> >
|
||||
struct _LIBCPP_TYPE_VIS_ONLY hash<bitset<_Size> >
|
||||
: public unary_function<bitset<_Size>, size_t>
|
||||
{
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
|
||||
@@ -37,9 +37,9 @@ int toupper(int c);
|
||||
|
||||
#include <__config>
|
||||
#include <ctype.h>
|
||||
#if defined(_MSC_VER)
|
||||
#if defined(_LIBCPP_MSVCRT)
|
||||
#include "support/win32/support.h"
|
||||
#endif // _MSC_VER
|
||||
#endif // _LIBCPP_MSVCRT
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
|
||||
227
include/chrono
227
include/chrono
@@ -111,16 +111,16 @@ private:
|
||||
duration d_; // exposition only
|
||||
|
||||
public:
|
||||
time_point(); // has value "epoch"
|
||||
explicit time_point(const duration& d); // same as time_point() + d
|
||||
time_point(); // has value "epoch" // constexpr in C++14
|
||||
explicit time_point(const duration& d); // same as time_point() + d // constexpr in C++14
|
||||
|
||||
// conversions
|
||||
template <class Duration2>
|
||||
time_point(const time_point<clock, Duration2>& t);
|
||||
time_point(const time_point<clock, Duration2>& t); // constexpr in C++14
|
||||
|
||||
// observer
|
||||
|
||||
duration time_since_epoch() const;
|
||||
duration time_since_epoch() const; // constexpr in C++14
|
||||
|
||||
// arithmetic
|
||||
|
||||
@@ -194,7 +194,7 @@ template <class Rep1, class Period1, class Rep2, class Period2>
|
||||
template <class ToDuration, class Rep, class Period>
|
||||
ToDuration duration_cast(const duration<Rep, Period>& d);
|
||||
|
||||
// time_point arithmetic
|
||||
// time_point arithmetic (all constexpr in C++14)
|
||||
template <class Clock, class Duration1, class Rep2, class Period2>
|
||||
time_point<Clock, typename common_type<Duration1, duration<Rep2, Period2>>::type>
|
||||
operator+(const time_point<Clock, Duration1>& lhs, const duration<Rep2, Period2>& rhs);
|
||||
@@ -208,7 +208,7 @@ template <class Clock, class Duration1, class Duration2>
|
||||
typename common_type<Duration1, Duration2>::type
|
||||
operator-(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
|
||||
|
||||
// time_point comparisons
|
||||
// time_point comparisons (all constexpr in C++14)
|
||||
template <class Clock, class Duration1, class Duration2>
|
||||
bool operator==(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
|
||||
template <class Clock, class Duration1, class Duration2>
|
||||
@@ -222,7 +222,7 @@ template <class Clock, class Duration1, class Duration2>
|
||||
template <class Clock, class Duration1, class Duration2>
|
||||
bool operator>=(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
|
||||
|
||||
// time_point_cast
|
||||
// time_point_cast (constexpr in C++14)
|
||||
|
||||
template <class ToDuration, class Clock, class Duration>
|
||||
time_point<Clock, ToDuration> time_point_cast(const time_point<Clock, Duration>& t);
|
||||
@@ -236,7 +236,7 @@ public:
|
||||
typedef duration::rep rep;
|
||||
typedef duration::period period;
|
||||
typedef chrono::time_point<system_clock> time_point;
|
||||
static const bool is_steady = false;
|
||||
static const bool is_steady = false; // constexpr in C++14
|
||||
|
||||
static time_point now() noexcept;
|
||||
static time_t to_time_t (const time_point& __t) noexcept;
|
||||
@@ -250,7 +250,7 @@ public:
|
||||
typedef duration::rep rep;
|
||||
typedef duration::period period;
|
||||
typedef chrono::time_point<steady_clock, duration> time_point;
|
||||
static const bool is_steady = true;
|
||||
static const bool is_steady = true; // constexpr in C++14
|
||||
|
||||
static time_point now() noexcept;
|
||||
};
|
||||
@@ -259,6 +259,19 @@ typedef steady_clock high_resolution_clock;
|
||||
|
||||
} // chrono
|
||||
|
||||
constexpr chrono::hours operator "" h(unsigned long long); // C++14
|
||||
constexpr chrono::duration<unspecified , ratio<3600,1>> operator "" h(long double); // C++14
|
||||
constexpr chrono::minutes operator "" min(unsigned long long); // C++14
|
||||
constexpr chrono::duration<unspecified , ratio<60,1>> operator "" min(long double); // C++14
|
||||
constexpr chrono::seconds operator "" s(unsigned long long); // C++14
|
||||
constexpr chrono::duration<unspecified > operator "" s(long double); // C++14
|
||||
constexpr chrono::milliseconds operator "" ms(unsigned long long); // C++14
|
||||
constexpr chrono::duration<unspecified , milli> operator "" ms(long double); // C++14
|
||||
constexpr chrono::microseconds operator "" us(unsigned long long); // C++14
|
||||
constexpr chrono::duration<unspecified , micro> operator "" us(long double); // C++14
|
||||
constexpr chrono::nanoseconds operator "" ns(unsigned long long); // C++14
|
||||
constexpr chrono::duration<unspecified , nano> operator "" ns(long double); // C++14
|
||||
|
||||
} // std
|
||||
*/
|
||||
|
||||
@@ -279,7 +292,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD
|
||||
namespace chrono
|
||||
{
|
||||
|
||||
template <class _Rep, class _Period = ratio<1> > class _LIBCPP_VISIBLE duration;
|
||||
template <class _Rep, class _Period = ratio<1> > class _LIBCPP_TYPE_VIS_ONLY duration;
|
||||
|
||||
template <class _Tp>
|
||||
struct __is_duration : false_type {};
|
||||
@@ -299,8 +312,8 @@ struct __is_duration<const volatile duration<_Rep, _Period> > : true_type {};
|
||||
} // chrono
|
||||
|
||||
template <class _Rep1, class _Period1, class _Rep2, class _Period2>
|
||||
struct _LIBCPP_VISIBLE common_type<chrono::duration<_Rep1, _Period1>,
|
||||
chrono::duration<_Rep2, _Period2> >
|
||||
struct _LIBCPP_TYPE_VIS_ONLY common_type<chrono::duration<_Rep1, _Period1>,
|
||||
chrono::duration<_Rep2, _Period2> >
|
||||
{
|
||||
typedef chrono::duration<typename common_type<_Rep1, _Rep2>::type,
|
||||
typename __ratio_gcd<_Period1, _Period2>::type> type;
|
||||
@@ -377,10 +390,10 @@ duration_cast(const duration<_Rep, _Period>& __fd)
|
||||
}
|
||||
|
||||
template <class _Rep>
|
||||
struct _LIBCPP_VISIBLE treat_as_floating_point : is_floating_point<_Rep> {};
|
||||
struct _LIBCPP_TYPE_VIS_ONLY treat_as_floating_point : is_floating_point<_Rep> {};
|
||||
|
||||
template <class _Rep>
|
||||
struct _LIBCPP_VISIBLE duration_values
|
||||
struct _LIBCPP_TYPE_VIS_ONLY duration_values
|
||||
{
|
||||
public:
|
||||
_LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR _Rep zero() {return _Rep(0);}
|
||||
@@ -391,11 +404,42 @@ public:
|
||||
// duration
|
||||
|
||||
template <class _Rep, class _Period>
|
||||
class _LIBCPP_VISIBLE duration
|
||||
class _LIBCPP_TYPE_VIS_ONLY duration
|
||||
{
|
||||
static_assert(!__is_duration<_Rep>::value, "A duration representation can not be a duration");
|
||||
static_assert(__is_ratio<_Period>::value, "Second template parameter of duration must be a std::ratio");
|
||||
static_assert(_Period::num > 0, "duration period must be positive");
|
||||
|
||||
template <class _R1, class _R2>
|
||||
struct __no_overflow
|
||||
{
|
||||
private:
|
||||
static const intmax_t __gcd_n1_n2 = __static_gcd<_R1::num, _R2::num>::value;
|
||||
static const intmax_t __gcd_d1_d2 = __static_gcd<_R1::den, _R2::den>::value;
|
||||
static const intmax_t __n1 = _R1::num / __gcd_n1_n2;
|
||||
static const intmax_t __d1 = _R1::den / __gcd_d1_d2;
|
||||
static const intmax_t __n2 = _R2::num / __gcd_n1_n2;
|
||||
static const intmax_t __d2 = _R2::den / __gcd_d1_d2;
|
||||
static const intmax_t max = -((intmax_t(1) << (sizeof(intmax_t) * CHAR_BIT - 1)) + 1);
|
||||
|
||||
template <intmax_t _Xp, intmax_t _Yp, bool __overflow>
|
||||
struct __mul // __overflow == false
|
||||
{
|
||||
static const intmax_t value = _Xp * _Yp;
|
||||
};
|
||||
|
||||
template <intmax_t _Xp, intmax_t _Yp>
|
||||
struct __mul<_Xp, _Yp, true>
|
||||
{
|
||||
static const intmax_t value = 1;
|
||||
};
|
||||
|
||||
public:
|
||||
static const bool value = (__n1 <= max / __d2) && (__n2 <= max / __d1);
|
||||
typedef ratio<__mul<__n1, __d2, !value>::value,
|
||||
__mul<__n2, __d1, !value>::value> type;
|
||||
};
|
||||
|
||||
public:
|
||||
typedef _Rep rep;
|
||||
typedef _Period period;
|
||||
@@ -403,7 +447,13 @@ private:
|
||||
rep __rep_;
|
||||
public:
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR duration() {} // = default;
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
#ifndef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
duration() = default;
|
||||
#else
|
||||
duration() {}
|
||||
#endif
|
||||
|
||||
template <class _Rep2>
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
explicit duration(const _Rep2& __r,
|
||||
@@ -421,9 +471,10 @@ public:
|
||||
duration(const duration<_Rep2, _Period2>& __d,
|
||||
typename enable_if
|
||||
<
|
||||
__no_overflow<_Period2, period>::value && (
|
||||
treat_as_floating_point<rep>::value ||
|
||||
(ratio_divide<_Period2, period>::type::den == 1 &&
|
||||
!treat_as_floating_point<_Rep2>::value)
|
||||
(__no_overflow<_Period2, period>::type::den == 1 &&
|
||||
!treat_as_floating_point<_Rep2>::value))
|
||||
>::type* = 0)
|
||||
: __rep_(_VSTD::chrono::duration_cast<duration>(__d).count()) {}
|
||||
|
||||
@@ -468,7 +519,7 @@ template <class _LhsDuration, class _RhsDuration>
|
||||
struct __duration_eq
|
||||
{
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
bool operator()(const _LhsDuration& __lhs, const _RhsDuration& __rhs)
|
||||
bool operator()(const _LhsDuration& __lhs, const _RhsDuration& __rhs) const
|
||||
{
|
||||
typedef typename common_type<_LhsDuration, _RhsDuration>::type _Ct;
|
||||
return _Ct(__lhs).count() == _Ct(__rhs).count();
|
||||
@@ -479,7 +530,7 @@ template <class _LhsDuration>
|
||||
struct __duration_eq<_LhsDuration, _LhsDuration>
|
||||
{
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
bool operator()(const _LhsDuration& __lhs, const _LhsDuration& __rhs)
|
||||
bool operator()(const _LhsDuration& __lhs, const _LhsDuration& __rhs) const
|
||||
{return __lhs.count() == __rhs.count();}
|
||||
};
|
||||
|
||||
@@ -509,7 +560,7 @@ template <class _LhsDuration, class _RhsDuration>
|
||||
struct __duration_lt
|
||||
{
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
bool operator()(const _LhsDuration& __lhs, const _RhsDuration& __rhs)
|
||||
bool operator()(const _LhsDuration& __lhs, const _RhsDuration& __rhs) const
|
||||
{
|
||||
typedef typename common_type<_LhsDuration, _RhsDuration>::type _Ct;
|
||||
return _Ct(__lhs).count() < _Ct(__rhs).count();
|
||||
@@ -520,7 +571,7 @@ template <class _LhsDuration>
|
||||
struct __duration_lt<_LhsDuration, _LhsDuration>
|
||||
{
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
bool operator()(const _LhsDuration& __lhs, const _LhsDuration& __rhs)
|
||||
bool operator()(const _LhsDuration& __lhs, const _LhsDuration& __rhs) const
|
||||
{return __lhs.count() < __rhs.count();}
|
||||
};
|
||||
|
||||
@@ -696,7 +747,7 @@ operator%(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2
|
||||
//////////////////////////////////////////////////////////
|
||||
|
||||
template <class _Clock, class _Duration = typename _Clock::duration>
|
||||
class _LIBCPP_VISIBLE time_point
|
||||
class _LIBCPP_TYPE_VIS_ONLY time_point
|
||||
{
|
||||
static_assert(__is_duration<_Duration>::value,
|
||||
"Second template parameter of time_point must be a std::chrono::duration");
|
||||
@@ -709,12 +760,12 @@ private:
|
||||
duration __d_;
|
||||
|
||||
public:
|
||||
_LIBCPP_INLINE_VISIBILITY time_point() : __d_(duration::zero()) {}
|
||||
_LIBCPP_INLINE_VISIBILITY explicit time_point(const duration& __d) : __d_(__d) {}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 time_point() : __d_(duration::zero()) {}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 explicit time_point(const duration& __d) : __d_(__d) {}
|
||||
|
||||
// conversions
|
||||
template <class _Duration2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
time_point(const time_point<clock, _Duration2>& t,
|
||||
typename enable_if
|
||||
<
|
||||
@@ -724,12 +775,12 @@ public:
|
||||
|
||||
// observer
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY duration time_since_epoch() const {return __d_;}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 duration time_since_epoch() const {return __d_;}
|
||||
|
||||
// arithmetic
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY time_point& operator+=(const duration& __d) {__d_ += __d; return *this;}
|
||||
_LIBCPP_INLINE_VISIBILITY time_point& operator-=(const duration& __d) {__d_ -= __d; return *this;}
|
||||
_LIBCPP_INLINE_VISIBILITY time_point& operator+=(const duration& __d) {__d_ += __d; return *this;}
|
||||
_LIBCPP_INLINE_VISIBILITY time_point& operator-=(const duration& __d) {__d_ -= __d; return *this;}
|
||||
|
||||
// special values
|
||||
|
||||
@@ -740,8 +791,8 @@ public:
|
||||
} // chrono
|
||||
|
||||
template <class _Clock, class _Duration1, class _Duration2>
|
||||
struct _LIBCPP_VISIBLE common_type<chrono::time_point<_Clock, _Duration1>,
|
||||
chrono::time_point<_Clock, _Duration2> >
|
||||
struct _LIBCPP_TYPE_VIS_ONLY common_type<chrono::time_point<_Clock, _Duration1>,
|
||||
chrono::time_point<_Clock, _Duration2> >
|
||||
{
|
||||
typedef chrono::time_point<_Clock, typename common_type<_Duration1, _Duration2>::type> type;
|
||||
};
|
||||
@@ -749,7 +800,7 @@ struct _LIBCPP_VISIBLE common_type<chrono::time_point<_Clock, _Duration1>,
|
||||
namespace chrono {
|
||||
|
||||
template <class _ToDuration, class _Clock, class _Duration>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
time_point<_Clock, _ToDuration>
|
||||
time_point_cast(const time_point<_Clock, _Duration>& __t)
|
||||
{
|
||||
@@ -759,7 +810,7 @@ time_point_cast(const time_point<_Clock, _Duration>& __t)
|
||||
// time_point ==
|
||||
|
||||
template <class _Clock, class _Duration1, class _Duration2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
bool
|
||||
operator==(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
|
||||
{
|
||||
@@ -769,7 +820,7 @@ operator==(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock,
|
||||
// time_point !=
|
||||
|
||||
template <class _Clock, class _Duration1, class _Duration2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
bool
|
||||
operator!=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
|
||||
{
|
||||
@@ -779,7 +830,7 @@ operator!=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock,
|
||||
// time_point <
|
||||
|
||||
template <class _Clock, class _Duration1, class _Duration2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
bool
|
||||
operator<(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
|
||||
{
|
||||
@@ -789,7 +840,7 @@ operator<(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock,
|
||||
// time_point >
|
||||
|
||||
template <class _Clock, class _Duration1, class _Duration2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
bool
|
||||
operator>(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
|
||||
{
|
||||
@@ -799,7 +850,7 @@ operator>(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock,
|
||||
// time_point <=
|
||||
|
||||
template <class _Clock, class _Duration1, class _Duration2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
bool
|
||||
operator<=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
|
||||
{
|
||||
@@ -809,7 +860,7 @@ operator<=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock,
|
||||
// time_point >=
|
||||
|
||||
template <class _Clock, class _Duration1, class _Duration2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
bool
|
||||
operator>=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
|
||||
{
|
||||
@@ -819,20 +870,18 @@ operator>=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock,
|
||||
// time_point operator+(time_point x, duration y);
|
||||
|
||||
template <class _Clock, class _Duration1, class _Rep2, class _Period2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type>
|
||||
operator+(const time_point<_Clock, _Duration1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
|
||||
{
|
||||
typedef time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type> _Tr;
|
||||
_Tr __r(__lhs.time_since_epoch());
|
||||
__r += __rhs;
|
||||
return __r;
|
||||
return _Tr (__lhs.time_since_epoch() + __rhs);
|
||||
}
|
||||
|
||||
// time_point operator+(duration x, time_point y);
|
||||
|
||||
template <class _Rep1, class _Period1, class _Clock, class _Duration2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
time_point<_Clock, typename common_type<duration<_Rep1, _Period1>, _Duration2>::type>
|
||||
operator+(const duration<_Rep1, _Period1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
|
||||
{
|
||||
@@ -842,7 +891,7 @@ operator+(const duration<_Rep1, _Period1>& __lhs, const time_point<_Clock, _Dura
|
||||
// time_point operator-(time_point x, duration y);
|
||||
|
||||
template <class _Clock, class _Duration1, class _Rep2, class _Period2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type>
|
||||
operator-(const time_point<_Clock, _Duration1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
|
||||
{
|
||||
@@ -852,7 +901,7 @@ operator-(const time_point<_Clock, _Duration1>& __lhs, const duration<_Rep2, _Pe
|
||||
// duration operator-(time_point x, time_point y);
|
||||
|
||||
template <class _Clock, class _Duration1, class _Duration2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
typename common_type<_Duration1, _Duration2>::type
|
||||
operator-(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
|
||||
{
|
||||
@@ -863,28 +912,28 @@ operator-(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock,
|
||||
/////////////////////// clocks ///////////////////////////
|
||||
//////////////////////////////////////////////////////////
|
||||
|
||||
class _LIBCPP_VISIBLE system_clock
|
||||
class _LIBCPP_TYPE_VIS system_clock
|
||||
{
|
||||
public:
|
||||
typedef microseconds duration;
|
||||
typedef duration::rep rep;
|
||||
typedef duration::period period;
|
||||
typedef chrono::time_point<system_clock> time_point;
|
||||
static const bool is_steady = false;
|
||||
static _LIBCPP_CONSTEXPR_AFTER_CXX11 const bool is_steady = false;
|
||||
|
||||
static time_point now() _NOEXCEPT;
|
||||
static time_t to_time_t (const time_point& __t) _NOEXCEPT;
|
||||
static time_point from_time_t(time_t __t) _NOEXCEPT;
|
||||
};
|
||||
|
||||
class _LIBCPP_VISIBLE steady_clock
|
||||
class _LIBCPP_TYPE_VIS steady_clock
|
||||
{
|
||||
public:
|
||||
typedef nanoseconds duration;
|
||||
typedef duration::rep rep;
|
||||
typedef duration::period period;
|
||||
typedef chrono::time_point<steady_clock, duration> time_point;
|
||||
static const bool is_steady = true;
|
||||
static _LIBCPP_CONSTEXPR_AFTER_CXX11 const bool is_steady = true;
|
||||
|
||||
static time_point now() _NOEXCEPT;
|
||||
};
|
||||
@@ -893,6 +942,86 @@ typedef steady_clock high_resolution_clock;
|
||||
|
||||
} // chrono
|
||||
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
// Suffixes for duration literals [time.duration.literals]
|
||||
inline namespace literals
|
||||
{
|
||||
inline namespace chrono_literals
|
||||
{
|
||||
|
||||
constexpr chrono::hours operator"" h(unsigned long long __h)
|
||||
{
|
||||
return chrono::hours(static_cast<chrono::hours::rep>(__h));
|
||||
}
|
||||
|
||||
constexpr chrono::duration<long double, ratio<3600,1>> operator"" h(long double __h)
|
||||
{
|
||||
return chrono::duration<long double, ratio<3600,1>>(__h);
|
||||
}
|
||||
|
||||
|
||||
constexpr chrono::minutes operator"" min(unsigned long long __m)
|
||||
{
|
||||
return chrono::minutes(static_cast<chrono::minutes::rep>(__m));
|
||||
}
|
||||
|
||||
constexpr chrono::duration<long double, ratio<60,1>> operator"" min(long double __m)
|
||||
{
|
||||
return chrono::duration<long double, ratio<60,1>> (__m);
|
||||
}
|
||||
|
||||
|
||||
constexpr chrono::seconds operator"" s(unsigned long long __s)
|
||||
{
|
||||
return chrono::seconds(static_cast<chrono::seconds::rep>(__s));
|
||||
}
|
||||
|
||||
constexpr chrono::duration<long double> operator"" s(long double __s)
|
||||
{
|
||||
return chrono::duration<long double> (__s);
|
||||
}
|
||||
|
||||
|
||||
constexpr chrono::milliseconds operator"" ms(unsigned long long __ms)
|
||||
{
|
||||
return chrono::milliseconds(static_cast<chrono::milliseconds::rep>(__ms));
|
||||
}
|
||||
|
||||
constexpr chrono::duration<long double, milli> operator"" ms(long double __ms)
|
||||
{
|
||||
return chrono::duration<long double, milli>(__ms);
|
||||
}
|
||||
|
||||
|
||||
constexpr chrono::microseconds operator"" us(unsigned long long __us)
|
||||
{
|
||||
return chrono::microseconds(static_cast<chrono::microseconds::rep>(__us));
|
||||
}
|
||||
|
||||
constexpr chrono::duration<long double, micro> operator"" us(long double __us)
|
||||
{
|
||||
return chrono::duration<long double, micro> (__us);
|
||||
}
|
||||
|
||||
|
||||
constexpr chrono::nanoseconds operator"" ns(unsigned long long __ns)
|
||||
{
|
||||
return chrono::nanoseconds(static_cast<chrono::nanoseconds::rep>(__ns));
|
||||
}
|
||||
|
||||
constexpr chrono::duration<long double, nano> operator"" ns(long double __ns)
|
||||
{
|
||||
return chrono::duration<long double, nano> (__ns);
|
||||
}
|
||||
|
||||
}}
|
||||
|
||||
namespace chrono { // hoist the literals into namespace std::chrono
|
||||
using namespace literals::chrono_literals;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP_CHRONO
|
||||
|
||||
171
include/cmath
171
include/cmath
@@ -137,21 +137,21 @@ long double tanhl(long double x);
|
||||
|
||||
// C99
|
||||
|
||||
bool signbit(floating_point x);
|
||||
bool signbit(arithmetic x);
|
||||
|
||||
int fpclassify(floating_point x);
|
||||
int fpclassify(arithmetic x);
|
||||
|
||||
bool isfinite(floating_point x);
|
||||
bool isinf(floating_point x);
|
||||
bool isnan(floating_point x);
|
||||
bool isnormal(floating_point x);
|
||||
bool isfinite(arithmetic x);
|
||||
bool isinf(arithmetic x);
|
||||
bool isnan(arithmetic x);
|
||||
bool isnormal(arithmetic x);
|
||||
|
||||
bool isgreater(floating_point x, floating_point y);
|
||||
bool isgreaterequal(floating_point x, floating_point y);
|
||||
bool isless(floating_point x, floating_point y);
|
||||
bool islessequal(floating_point x, floating_point y);
|
||||
bool islessgreater(floating_point x, floating_point y);
|
||||
bool isunordered(floating_point x, floating_point y);
|
||||
bool isgreater(arithmetic x, arithmetic y);
|
||||
bool isgreaterequal(arithmetic x, arithmetic y);
|
||||
bool isless(arithmetic x, arithmetic y);
|
||||
bool islessequal(arithmetic x, arithmetic y);
|
||||
bool islessgreater(arithmetic x, arithmetic y);
|
||||
bool isunordered(arithmetic x, arithmetic y);
|
||||
|
||||
floating_point acosh (arithmetic x);
|
||||
float acoshf(float x);
|
||||
@@ -301,7 +301,7 @@ long double truncl(long double x);
|
||||
#include <math.h>
|
||||
#include <type_traits>
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#ifdef _LIBCPP_MSVCRT
|
||||
#include "support/win32/math_win32.h"
|
||||
#endif
|
||||
|
||||
@@ -325,10 +325,10 @@ __libcpp_signbit(_A1 __x) _NOEXCEPT
|
||||
|
||||
template <class _A1>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
typename std::enable_if<std::is_floating_point<_A1>::value, bool>::type
|
||||
typename std::enable_if<std::is_arithmetic<_A1>::value, bool>::type
|
||||
signbit(_A1 __x) _NOEXCEPT
|
||||
{
|
||||
return __libcpp_signbit(__x);
|
||||
return __libcpp_signbit((typename std::__promote<_A1>::type)__x);
|
||||
}
|
||||
|
||||
#endif // signbit
|
||||
@@ -349,10 +349,10 @@ __libcpp_fpclassify(_A1 __x) _NOEXCEPT
|
||||
|
||||
template <class _A1>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
typename std::enable_if<std::is_floating_point<_A1>::value, int>::type
|
||||
typename std::enable_if<std::is_arithmetic<_A1>::value, int>::type
|
||||
fpclassify(_A1 __x) _NOEXCEPT
|
||||
{
|
||||
return __libcpp_fpclassify(__x);
|
||||
return __libcpp_fpclassify((typename std::__promote<_A1>::type)__x);
|
||||
}
|
||||
|
||||
#endif // fpclassify
|
||||
@@ -373,10 +373,10 @@ __libcpp_isfinite(_A1 __x) _NOEXCEPT
|
||||
|
||||
template <class _A1>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
typename std::enable_if<std::is_floating_point<_A1>::value, bool>::type
|
||||
typename std::enable_if<std::is_arithmetic<_A1>::value, bool>::type
|
||||
isfinite(_A1 __x) _NOEXCEPT
|
||||
{
|
||||
return __libcpp_isfinite(__x);
|
||||
return __libcpp_isfinite((typename std::__promote<_A1>::type)__x);
|
||||
}
|
||||
|
||||
#endif // isfinite
|
||||
@@ -397,10 +397,10 @@ __libcpp_isinf(_A1 __x) _NOEXCEPT
|
||||
|
||||
template <class _A1>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
typename std::enable_if<std::is_floating_point<_A1>::value, bool>::type
|
||||
typename std::enable_if<std::is_arithmetic<_A1>::value, bool>::type
|
||||
isinf(_A1 __x) _NOEXCEPT
|
||||
{
|
||||
return __libcpp_isinf(__x);
|
||||
return __libcpp_isinf((typename std::__promote<_A1>::type)__x);
|
||||
}
|
||||
|
||||
#endif // isinf
|
||||
@@ -421,10 +421,10 @@ __libcpp_isnan(_A1 __x) _NOEXCEPT
|
||||
|
||||
template <class _A1>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
typename std::enable_if<std::is_floating_point<_A1>::value, bool>::type
|
||||
typename std::enable_if<std::is_arithmetic<_A1>::value, bool>::type
|
||||
isnan(_A1 __x) _NOEXCEPT
|
||||
{
|
||||
return __libcpp_isnan(__x);
|
||||
return __libcpp_isnan((typename std::__promote<_A1>::type)__x);
|
||||
}
|
||||
|
||||
#endif // isnan
|
||||
@@ -445,10 +445,10 @@ __libcpp_isnormal(_A1 __x) _NOEXCEPT
|
||||
|
||||
template <class _A1>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
typename std::enable_if<std::is_floating_point<_A1>::value, bool>::type
|
||||
typename std::enable_if<std::is_arithmetic<_A1>::value, bool>::type
|
||||
isnormal(_A1 __x) _NOEXCEPT
|
||||
{
|
||||
return __libcpp_isnormal(__x);
|
||||
return __libcpp_isnormal((typename std::__promote<_A1>::type)__x);
|
||||
}
|
||||
|
||||
#endif // isnormal
|
||||
@@ -471,13 +471,14 @@ template <class _A1, class _A2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
typename std::enable_if
|
||||
<
|
||||
std::is_floating_point<_A1>::value &&
|
||||
std::is_floating_point<_A2>::value,
|
||||
std::is_arithmetic<_A1>::value &&
|
||||
std::is_arithmetic<_A2>::value,
|
||||
bool
|
||||
>::type
|
||||
isgreater(_A1 __x, _A2 __y) _NOEXCEPT
|
||||
{
|
||||
return __libcpp_isgreater(__x, __y);
|
||||
typedef typename std::__promote<_A1, _A2>::type type;
|
||||
return __libcpp_isgreater((type)__x, (type)__y);
|
||||
}
|
||||
|
||||
#endif // isgreater
|
||||
@@ -500,13 +501,14 @@ template <class _A1, class _A2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
typename std::enable_if
|
||||
<
|
||||
std::is_floating_point<_A1>::value &&
|
||||
std::is_floating_point<_A2>::value,
|
||||
std::is_arithmetic<_A1>::value &&
|
||||
std::is_arithmetic<_A2>::value,
|
||||
bool
|
||||
>::type
|
||||
isgreaterequal(_A1 __x, _A2 __y) _NOEXCEPT
|
||||
{
|
||||
return __libcpp_isgreaterequal(__x, __y);
|
||||
typedef typename std::__promote<_A1, _A2>::type type;
|
||||
return __libcpp_isgreaterequal((type)__x, (type)__y);
|
||||
}
|
||||
|
||||
#endif // isgreaterequal
|
||||
@@ -529,13 +531,14 @@ template <class _A1, class _A2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
typename std::enable_if
|
||||
<
|
||||
std::is_floating_point<_A1>::value &&
|
||||
std::is_floating_point<_A2>::value,
|
||||
std::is_arithmetic<_A1>::value &&
|
||||
std::is_arithmetic<_A2>::value,
|
||||
bool
|
||||
>::type
|
||||
isless(_A1 __x, _A2 __y) _NOEXCEPT
|
||||
{
|
||||
return __libcpp_isless(__x, __y);
|
||||
typedef typename std::__promote<_A1, _A2>::type type;
|
||||
return __libcpp_isless((type)__x, (type)__y);
|
||||
}
|
||||
|
||||
#endif // isless
|
||||
@@ -558,13 +561,14 @@ template <class _A1, class _A2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
typename std::enable_if
|
||||
<
|
||||
std::is_floating_point<_A1>::value &&
|
||||
std::is_floating_point<_A2>::value,
|
||||
std::is_arithmetic<_A1>::value &&
|
||||
std::is_arithmetic<_A2>::value,
|
||||
bool
|
||||
>::type
|
||||
islessequal(_A1 __x, _A2 __y) _NOEXCEPT
|
||||
{
|
||||
return __libcpp_islessequal(__x, __y);
|
||||
typedef typename std::__promote<_A1, _A2>::type type;
|
||||
return __libcpp_islessequal((type)__x, (type)__y);
|
||||
}
|
||||
|
||||
#endif // islessequal
|
||||
@@ -587,13 +591,14 @@ template <class _A1, class _A2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
typename std::enable_if
|
||||
<
|
||||
std::is_floating_point<_A1>::value &&
|
||||
std::is_floating_point<_A2>::value,
|
||||
std::is_arithmetic<_A1>::value &&
|
||||
std::is_arithmetic<_A2>::value,
|
||||
bool
|
||||
>::type
|
||||
islessgreater(_A1 __x, _A2 __y) _NOEXCEPT
|
||||
{
|
||||
return __libcpp_islessgreater(__x, __y);
|
||||
typedef typename std::__promote<_A1, _A2>::type type;
|
||||
return __libcpp_islessgreater((type)__x, (type)__y);
|
||||
}
|
||||
|
||||
#endif // islessgreater
|
||||
@@ -616,13 +621,14 @@ template <class _A1, class _A2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
typename std::enable_if
|
||||
<
|
||||
std::is_floating_point<_A1>::value &&
|
||||
std::is_floating_point<_A2>::value,
|
||||
std::is_arithmetic<_A1>::value &&
|
||||
std::is_arithmetic<_A2>::value,
|
||||
bool
|
||||
>::type
|
||||
isunordered(_A1 __x, _A2 __y) _NOEXCEPT
|
||||
{
|
||||
return __libcpp_isunordered(__x, __y);
|
||||
typedef typename std::__promote<_A1, _A2>::type type;
|
||||
return __libcpp_isunordered((type)__x, (type)__y);
|
||||
}
|
||||
|
||||
#endif // isunordered
|
||||
@@ -648,6 +654,7 @@ using ::double_t;
|
||||
|
||||
// abs
|
||||
|
||||
#if !defined(_AIX)
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
float
|
||||
abs(float __x) _NOEXCEPT {return fabsf(__x);}
|
||||
@@ -659,6 +666,7 @@ abs(double __x) _NOEXCEPT {return fabs(__x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
long double
|
||||
abs(long double __x) _NOEXCEPT {return fabsl(__x);}
|
||||
#endif // !defined(_AIX)
|
||||
|
||||
#ifndef __sun__
|
||||
|
||||
@@ -667,7 +675,7 @@ abs(long double __x) _NOEXCEPT {return fabsl(__x);}
|
||||
using ::acos;
|
||||
using ::acosf;
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float acos(float __x) _NOEXCEPT {return acosf(__x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double acos(long double __x) _NOEXCEPT {return acosl(__x);}
|
||||
#endif
|
||||
@@ -682,7 +690,7 @@ acos(_A1 __x) _NOEXCEPT {return acos((double)__x);}
|
||||
using ::asin;
|
||||
using ::asinf;
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float asin(float __x) _NOEXCEPT {return asinf(__x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double asin(long double __x) _NOEXCEPT {return asinl(__x);}
|
||||
#endif
|
||||
@@ -697,7 +705,7 @@ asin(_A1 __x) _NOEXCEPT {return asin((double)__x);}
|
||||
using ::atan;
|
||||
using ::atanf;
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float atan(float __x) _NOEXCEPT {return atanf(__x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double atan(long double __x) _NOEXCEPT {return atanl(__x);}
|
||||
#endif
|
||||
@@ -712,7 +720,7 @@ atan(_A1 __x) _NOEXCEPT {return atan((double)__x);}
|
||||
using ::atan2;
|
||||
using ::atan2f;
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float atan2(float __y, float __x) _NOEXCEPT {return atan2f(__y, __x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double atan2(long double __y, long double __x) _NOEXCEPT {return atan2l(__y, __x);}
|
||||
#endif
|
||||
@@ -738,7 +746,7 @@ atan2(_A1 __y, _A2 __x) _NOEXCEPT
|
||||
using ::ceil;
|
||||
using ::ceilf;
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float ceil(float __x) _NOEXCEPT {return ceilf(__x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double ceil(long double __x) _NOEXCEPT {return ceill(__x);}
|
||||
#endif
|
||||
@@ -753,13 +761,13 @@ ceil(_A1 __x) _NOEXCEPT {return ceil((double)__x);}
|
||||
using ::cos;
|
||||
using ::cosf;
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float cos(float __x) _NOEXCEPT {return cosf(__x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double cos(long double __x) _NOEXCEPT {return cosl(__x);}
|
||||
#endif
|
||||
|
||||
template <class _A1>
|
||||
inline _LIBCPP_ALWAYS_INLINE _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
typename enable_if<is_integral<_A1>::value, double>::type
|
||||
cos(_A1 __x) _NOEXCEPT {return cos((double)__x);}
|
||||
|
||||
@@ -768,7 +776,7 @@ cos(_A1 __x) _NOEXCEPT {return cos((double)__x);}
|
||||
using ::cosh;
|
||||
using ::coshf;
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float cosh(float __x) _NOEXCEPT {return coshf(__x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double cosh(long double __x) _NOEXCEPT {return coshl(__x);}
|
||||
#endif
|
||||
@@ -786,7 +794,7 @@ using ::expf;
|
||||
|
||||
#ifndef __sun__
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float exp(float __x) _NOEXCEPT {return expf(__x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double exp(long double __x) _NOEXCEPT {return expl(__x);}
|
||||
#endif
|
||||
@@ -802,7 +810,7 @@ exp(_A1 __x) _NOEXCEPT {return exp((double)__x);}
|
||||
using ::fabs;
|
||||
using ::fabsf;
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float fabs(float __x) _NOEXCEPT {return fabsf(__x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double fabs(long double __x) _NOEXCEPT {return fabsl(__x);}
|
||||
#endif
|
||||
@@ -817,7 +825,7 @@ fabs(_A1 __x) _NOEXCEPT {return fabs((double)__x);}
|
||||
using ::floor;
|
||||
using ::floorf;
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float floor(float __x) _NOEXCEPT {return floorf(__x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double floor(long double __x) _NOEXCEPT {return floorl(__x);}
|
||||
#endif
|
||||
@@ -834,7 +842,7 @@ using ::fmod;
|
||||
using ::fmodf;
|
||||
#ifndef __sun__
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float fmod(float __x, float __y) _NOEXCEPT {return fmodf(__x, __y);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double fmod(long double __x, long double __y) _NOEXCEPT {return fmodl(__x, __y);}
|
||||
#endif
|
||||
@@ -861,7 +869,7 @@ fmod(_A1 __x, _A2 __y) _NOEXCEPT
|
||||
using ::frexp;
|
||||
using ::frexpf;
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float frexp(float __x, int* __e) _NOEXCEPT {return frexpf(__x, __e);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double frexp(long double __x, int* __e) _NOEXCEPT {return frexpl(__x, __e);}
|
||||
#endif
|
||||
@@ -876,7 +884,7 @@ frexp(_A1 __x, int* __e) _NOEXCEPT {return frexp((double)__x, __e);}
|
||||
using ::ldexp;
|
||||
using ::ldexpf;
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float ldexp(float __x, int __e) _NOEXCEPT {return ldexpf(__x, __e);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double ldexp(long double __x, int __e) _NOEXCEPT {return ldexpl(__x, __e);}
|
||||
#endif
|
||||
@@ -893,7 +901,7 @@ using ::log;
|
||||
using ::logf;
|
||||
#ifndef __sun__
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float log(float __x) _NOEXCEPT {return logf(__x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double log(long double __x) _NOEXCEPT {return logl(__x);}
|
||||
#endif
|
||||
@@ -909,7 +917,7 @@ log(_A1 __x) _NOEXCEPT {return log((double)__x);}
|
||||
using ::log10;
|
||||
using ::log10f;
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float log10(float __x) _NOEXCEPT {return log10f(__x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double log10(long double __x) _NOEXCEPT {return log10l(__x);}
|
||||
#endif
|
||||
@@ -924,7 +932,7 @@ log10(_A1 __x) _NOEXCEPT {return log10((double)__x);}
|
||||
using ::modf;
|
||||
using ::modff;
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float modf(float __x, float* __y) _NOEXCEPT {return modff(__x, __y);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double modf(long double __x, long double* __y) _NOEXCEPT {return modfl(__x, __y);}
|
||||
#endif
|
||||
@@ -937,7 +945,7 @@ using ::powf;
|
||||
|
||||
#ifndef __sun__
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float pow(float __x, float __y) _NOEXCEPT {return powf(__x, __y);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double pow(long double __x, long double __y) _NOEXCEPT {return powl(__x, __y);}
|
||||
#endif
|
||||
@@ -964,7 +972,7 @@ pow(_A1 __x, _A2 __y) _NOEXCEPT
|
||||
using ::sin;
|
||||
using ::sinf;
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float sin(float __x) _NOEXCEPT {return sinf(__x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double sin(long double __x) _NOEXCEPT {return sinl(__x);}
|
||||
#endif
|
||||
@@ -979,7 +987,7 @@ sin(_A1 __x) _NOEXCEPT {return sin((double)__x);}
|
||||
using ::sinh;
|
||||
using ::sinhf;
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float sinh(float __x) _NOEXCEPT {return sinhf(__x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double sinh(long double __x) _NOEXCEPT {return sinhl(__x);}
|
||||
#endif
|
||||
@@ -996,7 +1004,7 @@ using ::sqrt;
|
||||
using ::sqrtf;
|
||||
|
||||
|
||||
#if !(defined(_MSC_VER) || defined(__sun__))
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(__sun__) || defined(_AIX))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float sqrt(float __x) _NOEXCEPT {return sqrtf(__x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double sqrt(long double __x) _NOEXCEPT {return sqrtl(__x);}
|
||||
#endif
|
||||
@@ -1012,7 +1020,7 @@ using ::tan;
|
||||
using ::tanf;
|
||||
#ifndef __sun__
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float tan(float __x) _NOEXCEPT {return tanf(__x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double tan(long double __x) _NOEXCEPT {return tanl(__x);}
|
||||
#endif
|
||||
@@ -1027,7 +1035,7 @@ tan(_A1 __x) _NOEXCEPT {return tan((double)__x);}
|
||||
using ::tanh;
|
||||
using ::tanhf;
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#if !(defined(_LIBCPP_MSVCRT) || defined(_AIX))
|
||||
inline _LIBCPP_INLINE_VISIBILITY float tanh(float __x) _NOEXCEPT {return tanhf(__x);}
|
||||
inline _LIBCPP_INLINE_VISIBILITY long double tanh(long double __x) _NOEXCEPT {return tanhl(__x);}
|
||||
#endif
|
||||
@@ -1039,7 +1047,7 @@ tanh(_A1 __x) _NOEXCEPT {return tanh((double)__x);}
|
||||
|
||||
// acosh
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#ifndef _LIBCPP_MSVCRT
|
||||
using ::acosh;
|
||||
using ::acoshf;
|
||||
|
||||
@@ -1054,7 +1062,7 @@ acosh(_A1 __x) _NOEXCEPT {return acosh((double)__x);}
|
||||
|
||||
// asinh
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#ifndef _LIBCPP_MSVCRT
|
||||
using ::asinh;
|
||||
using ::asinhf;
|
||||
|
||||
@@ -1069,7 +1077,7 @@ asinh(_A1 __x) _NOEXCEPT {return asinh((double)__x);}
|
||||
|
||||
// atanh
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#ifndef _LIBCPP_MSVCRT
|
||||
using ::atanh;
|
||||
using ::atanhf;
|
||||
|
||||
@@ -1084,7 +1092,7 @@ atanh(_A1 __x) _NOEXCEPT {return atanh((double)__x);}
|
||||
|
||||
// cbrt
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#ifndef _LIBCPP_MSVCRT
|
||||
using ::cbrt;
|
||||
using ::cbrtf;
|
||||
|
||||
@@ -1121,7 +1129,7 @@ copysign(_A1 __x, _A2 __y) _NOEXCEPT
|
||||
return copysign((__result_type)__x, (__result_type)__y);
|
||||
}
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#ifndef _LIBCPP_MSVCRT
|
||||
|
||||
// erf
|
||||
|
||||
@@ -1420,13 +1428,18 @@ inline _LIBCPP_INLINE_VISIBILITY
|
||||
typename enable_if<is_integral<_A1>::value, long>::type
|
||||
lround(_A1 __x) _NOEXCEPT {return lround((double)__x);}
|
||||
|
||||
// nan
|
||||
#endif // _MSC_VER
|
||||
#endif // _LIBCPP_MSVCRT
|
||||
#endif // __sun__
|
||||
|
||||
// nan
|
||||
|
||||
#ifndef _LIBCPP_MSVCRT
|
||||
using ::nan;
|
||||
using ::nanf;
|
||||
#endif // _LIBCPP_MSVCRT
|
||||
|
||||
#ifndef __sun__
|
||||
#ifndef _MSC_VER
|
||||
#ifndef _LIBCPP_MSVCRT
|
||||
|
||||
// nearbyint
|
||||
|
||||
@@ -1604,7 +1617,7 @@ inline _LIBCPP_INLINE_VISIBILITY
|
||||
typename enable_if<is_integral<_A1>::value, double>::type
|
||||
trunc(_A1 __x) _NOEXCEPT {return trunc((double)__x);}
|
||||
|
||||
#endif // !_MSC_VER
|
||||
#endif // !_LIBCPP_MSVCRT
|
||||
|
||||
using ::acosl;
|
||||
using ::asinl;
|
||||
@@ -1627,15 +1640,15 @@ using ::sinl;
|
||||
using ::sinhl;
|
||||
using ::sqrtl;
|
||||
using ::tanl;
|
||||
#ifndef _MSC_VER
|
||||
#ifndef _LIBCPP_MSVCRT
|
||||
using ::tanhl;
|
||||
using ::acoshl;
|
||||
using ::asinhl;
|
||||
using ::atanhl;
|
||||
using ::cbrtl;
|
||||
#endif // !_MSC_VER
|
||||
#endif // !_LIBCPP_MSVCRT
|
||||
using ::copysignl;
|
||||
#ifndef _MSC_VER
|
||||
#ifndef _LIBCPP_MSVCRT
|
||||
using ::erfl;
|
||||
using ::erfcl;
|
||||
using ::exp2l;
|
||||
@@ -1666,7 +1679,7 @@ using ::scalblnl;
|
||||
using ::scalbnl;
|
||||
using ::tgammal;
|
||||
using ::truncl;
|
||||
#endif // !_MSC_VER
|
||||
#endif // !_LIBCPP_MSVCRT
|
||||
|
||||
#else
|
||||
using ::lgamma;
|
||||
|
||||
@@ -29,7 +29,8 @@ template <class Elem, unsigned long Maxcode = 0x10ffff,
|
||||
class codecvt_utf8
|
||||
: public codecvt<Elem, char, mbstate_t>
|
||||
{
|
||||
// unspecified
|
||||
explicit codecvt_utf8(size_t refs = 0);
|
||||
~codecvt_utf8();
|
||||
};
|
||||
|
||||
template <class Elem, unsigned long Maxcode = 0x10ffff,
|
||||
@@ -37,7 +38,8 @@ template <class Elem, unsigned long Maxcode = 0x10ffff,
|
||||
class codecvt_utf16
|
||||
: public codecvt<Elem, char, mbstate_t>
|
||||
{
|
||||
// unspecified
|
||||
explicit codecvt_utf16(size_t refs = 0);
|
||||
~codecvt_utf16();
|
||||
};
|
||||
|
||||
template <class Elem, unsigned long Maxcode = 0x10ffff,
|
||||
@@ -45,7 +47,8 @@ template <class Elem, unsigned long Maxcode = 0x10ffff,
|
||||
class codecvt_utf8_utf16
|
||||
: public codecvt<Elem, char, mbstate_t>
|
||||
{
|
||||
// unspecified
|
||||
explicit codecvt_utf8_utf16(size_t refs = 0);
|
||||
~codecvt_utf8_utf16();
|
||||
};
|
||||
|
||||
} // std
|
||||
@@ -73,7 +76,7 @@ enum codecvt_mode
|
||||
template <class _Elem> class __codecvt_utf8;
|
||||
|
||||
template <>
|
||||
class __codecvt_utf8<wchar_t>
|
||||
class _LIBCPP_TYPE_VIS __codecvt_utf8<wchar_t>
|
||||
: public codecvt<wchar_t, char, mbstate_t>
|
||||
{
|
||||
unsigned long _Maxcode_;
|
||||
@@ -108,7 +111,7 @@ protected:
|
||||
};
|
||||
|
||||
template <>
|
||||
class __codecvt_utf8<char16_t>
|
||||
class _LIBCPP_TYPE_VIS __codecvt_utf8<char16_t>
|
||||
: public codecvt<char16_t, char, mbstate_t>
|
||||
{
|
||||
unsigned long _Maxcode_;
|
||||
@@ -143,7 +146,7 @@ protected:
|
||||
};
|
||||
|
||||
template <>
|
||||
class __codecvt_utf8<char32_t>
|
||||
class _LIBCPP_TYPE_VIS __codecvt_utf8<char32_t>
|
||||
: public codecvt<char32_t, char, mbstate_t>
|
||||
{
|
||||
unsigned long _Maxcode_;
|
||||
@@ -179,7 +182,7 @@ protected:
|
||||
|
||||
template <class _Elem, unsigned long _Maxcode = 0x10ffff,
|
||||
codecvt_mode _Mode = (codecvt_mode)0>
|
||||
class _LIBCPP_VISIBLE codecvt_utf8
|
||||
class _LIBCPP_TYPE_VIS_ONLY codecvt_utf8
|
||||
: public __codecvt_utf8<_Elem>
|
||||
{
|
||||
public:
|
||||
@@ -196,7 +199,7 @@ public:
|
||||
template <class _Elem, bool _LittleEndian> class __codecvt_utf16;
|
||||
|
||||
template <>
|
||||
class __codecvt_utf16<wchar_t, false>
|
||||
class _LIBCPP_TYPE_VIS __codecvt_utf16<wchar_t, false>
|
||||
: public codecvt<wchar_t, char, mbstate_t>
|
||||
{
|
||||
unsigned long _Maxcode_;
|
||||
@@ -231,7 +234,7 @@ protected:
|
||||
};
|
||||
|
||||
template <>
|
||||
class __codecvt_utf16<wchar_t, true>
|
||||
class _LIBCPP_TYPE_VIS __codecvt_utf16<wchar_t, true>
|
||||
: public codecvt<wchar_t, char, mbstate_t>
|
||||
{
|
||||
unsigned long _Maxcode_;
|
||||
@@ -266,7 +269,7 @@ protected:
|
||||
};
|
||||
|
||||
template <>
|
||||
class __codecvt_utf16<char16_t, false>
|
||||
class _LIBCPP_TYPE_VIS __codecvt_utf16<char16_t, false>
|
||||
: public codecvt<char16_t, char, mbstate_t>
|
||||
{
|
||||
unsigned long _Maxcode_;
|
||||
@@ -301,7 +304,7 @@ protected:
|
||||
};
|
||||
|
||||
template <>
|
||||
class __codecvt_utf16<char16_t, true>
|
||||
class _LIBCPP_TYPE_VIS __codecvt_utf16<char16_t, true>
|
||||
: public codecvt<char16_t, char, mbstate_t>
|
||||
{
|
||||
unsigned long _Maxcode_;
|
||||
@@ -336,7 +339,7 @@ protected:
|
||||
};
|
||||
|
||||
template <>
|
||||
class __codecvt_utf16<char32_t, false>
|
||||
class _LIBCPP_TYPE_VIS __codecvt_utf16<char32_t, false>
|
||||
: public codecvt<char32_t, char, mbstate_t>
|
||||
{
|
||||
unsigned long _Maxcode_;
|
||||
@@ -371,7 +374,7 @@ protected:
|
||||
};
|
||||
|
||||
template <>
|
||||
class __codecvt_utf16<char32_t, true>
|
||||
class _LIBCPP_TYPE_VIS __codecvt_utf16<char32_t, true>
|
||||
: public codecvt<char32_t, char, mbstate_t>
|
||||
{
|
||||
unsigned long _Maxcode_;
|
||||
@@ -407,7 +410,7 @@ protected:
|
||||
|
||||
template <class _Elem, unsigned long _Maxcode = 0x10ffff,
|
||||
codecvt_mode _Mode = (codecvt_mode)0>
|
||||
class _LIBCPP_VISIBLE codecvt_utf16
|
||||
class _LIBCPP_TYPE_VIS_ONLY codecvt_utf16
|
||||
: public __codecvt_utf16<_Elem, _Mode & little_endian>
|
||||
{
|
||||
public:
|
||||
@@ -424,7 +427,7 @@ public:
|
||||
template <class _Elem> class __codecvt_utf8_utf16;
|
||||
|
||||
template <>
|
||||
class __codecvt_utf8_utf16<wchar_t>
|
||||
class _LIBCPP_TYPE_VIS __codecvt_utf8_utf16<wchar_t>
|
||||
: public codecvt<wchar_t, char, mbstate_t>
|
||||
{
|
||||
unsigned long _Maxcode_;
|
||||
@@ -459,7 +462,7 @@ protected:
|
||||
};
|
||||
|
||||
template <>
|
||||
class __codecvt_utf8_utf16<char32_t>
|
||||
class _LIBCPP_TYPE_VIS __codecvt_utf8_utf16<char32_t>
|
||||
: public codecvt<char32_t, char, mbstate_t>
|
||||
{
|
||||
unsigned long _Maxcode_;
|
||||
@@ -494,7 +497,7 @@ protected:
|
||||
};
|
||||
|
||||
template <>
|
||||
class __codecvt_utf8_utf16<char16_t>
|
||||
class _LIBCPP_TYPE_VIS __codecvt_utf8_utf16<char16_t>
|
||||
: public codecvt<char16_t, char, mbstate_t>
|
||||
{
|
||||
unsigned long _Maxcode_;
|
||||
@@ -530,7 +533,7 @@ protected:
|
||||
|
||||
template <class _Elem, unsigned long _Maxcode = 0x10ffff,
|
||||
codecvt_mode _Mode = (codecvt_mode)0>
|
||||
class _LIBCPP_VISIBLE codecvt_utf8_utf16
|
||||
class _LIBCPP_TYPE_VIS_ONLY codecvt_utf8_utf16
|
||||
: public __codecvt_utf8_utf16<_Elem>
|
||||
{
|
||||
public:
|
||||
|
||||
153
include/complex
153
include/complex
@@ -23,12 +23,12 @@ class complex
|
||||
public:
|
||||
typedef T value_type;
|
||||
|
||||
complex(const T& re = T(), const T& im = T());
|
||||
complex(const complex&);
|
||||
template<class X> complex(const complex<X>&);
|
||||
complex(const T& re = T(), const T& im = T()); // constexpr in C++14
|
||||
complex(const complex&); // constexpr in C++14
|
||||
template<class X> complex(const complex<X>&); // constexpr in C++14
|
||||
|
||||
T real() const;
|
||||
T imag() const;
|
||||
T real() const; // constexpr in C++14
|
||||
T imag() const; // constexpr in C++14
|
||||
|
||||
void real(T);
|
||||
void imag(T);
|
||||
@@ -149,12 +149,12 @@ template<class T> complex<T> operator/(const complex<T>&, const T&);
|
||||
template<class T> complex<T> operator/(const T&, const complex<T>&);
|
||||
template<class T> complex<T> operator+(const complex<T>&);
|
||||
template<class T> complex<T> operator-(const complex<T>&);
|
||||
template<class T> bool operator==(const complex<T>&, const complex<T>&);
|
||||
template<class T> bool operator==(const complex<T>&, const T&);
|
||||
template<class T> bool operator==(const T&, const complex<T>&);
|
||||
template<class T> bool operator!=(const complex<T>&, const complex<T>&);
|
||||
template<class T> bool operator!=(const complex<T>&, const T&);
|
||||
template<class T> bool operator!=(const T&, const complex<T>&);
|
||||
template<class T> bool operator==(const complex<T>&, const complex<T>&); // constexpr in C++14
|
||||
template<class T> bool operator==(const complex<T>&, const T&); // constexpr in C++14
|
||||
template<class T> bool operator==(const T&, const complex<T>&); // constexpr in C++14
|
||||
template<class T> bool operator!=(const complex<T>&, const complex<T>&); // constexpr in C++14
|
||||
template<class T> bool operator!=(const complex<T>&, const T&); // constexpr in C++14
|
||||
template<class T> bool operator!=(const T&, const complex<T>&); // constexpr in C++14
|
||||
|
||||
template<class T, class charT, class traits>
|
||||
basic_istream<charT, traits>&
|
||||
@@ -165,17 +165,17 @@ template<class T, class charT, class traits>
|
||||
|
||||
// 26.3.7 values:
|
||||
|
||||
template<class T> T real(const complex<T>&);
|
||||
long double real(long double);
|
||||
double real(double);
|
||||
template<Integral T> double real(T);
|
||||
float real(float);
|
||||
template<class T> T real(const complex<T>&); // constexpr in C++14
|
||||
long double real(long double); // constexpr in C++14
|
||||
double real(double); // constexpr in C++14
|
||||
template<Integral T> double real(T); // constexpr in C++14
|
||||
float real(float); // constexpr in C++14
|
||||
|
||||
template<class T> T imag(const complex<T>&);
|
||||
long double imag(long double);
|
||||
double imag(double);
|
||||
template<Integral T> double imag(T);
|
||||
float imag(float);
|
||||
template<class T> T imag(const complex<T>&); // constexpr in C++14
|
||||
long double imag(long double); // constexpr in C++14
|
||||
double imag(double); // constexpr in C++14
|
||||
template<Integral T> double imag(T); // constexpr in C++14
|
||||
float imag(float); // constexpr in C++14
|
||||
|
||||
template<class T> T abs(const complex<T>&);
|
||||
|
||||
@@ -255,13 +255,13 @@ template<class T, class charT, class traits>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template<class _Tp> class _LIBCPP_VISIBLE complex;
|
||||
template<class _Tp> class _LIBCPP_TYPE_VIS_ONLY complex;
|
||||
|
||||
template<class _Tp> complex<_Tp> operator*(const complex<_Tp>& __z, const complex<_Tp>& __w);
|
||||
template<class _Tp> complex<_Tp> operator/(const complex<_Tp>& __x, const complex<_Tp>& __y);
|
||||
|
||||
template<class _Tp>
|
||||
class _LIBCPP_VISIBLE complex
|
||||
class _LIBCPP_TYPE_VIS_ONLY complex
|
||||
{
|
||||
public:
|
||||
typedef _Tp value_type;
|
||||
@@ -269,15 +269,15 @@ private:
|
||||
value_type __re_;
|
||||
value_type __im_;
|
||||
public:
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
complex(const value_type& __re = value_type(), const value_type& __im = value_type())
|
||||
: __re_(__re), __im_(__im) {}
|
||||
template<class _Xp> _LIBCPP_INLINE_VISIBILITY
|
||||
template<class _Xp> _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
complex(const complex<_Xp>& __c)
|
||||
: __re_(__c.real()), __im_(__c.imag()) {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY value_type real() const {return __re_;}
|
||||
_LIBCPP_INLINE_VISIBILITY value_type imag() const {return __im_;}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 value_type real() const {return __re_;}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 value_type imag() const {return __im_;}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;}
|
||||
_LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;}
|
||||
@@ -309,21 +309,21 @@ public:
|
||||
}
|
||||
template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c)
|
||||
{
|
||||
*this = *this * __c;
|
||||
*this = *this * complex(__c.real(), __c.imag());
|
||||
return *this;
|
||||
}
|
||||
template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c)
|
||||
{
|
||||
*this = *this / __c;
|
||||
*this = *this / complex(__c.real(), __c.imag());
|
||||
return *this;
|
||||
}
|
||||
};
|
||||
|
||||
template<> class _LIBCPP_VISIBLE complex<double>;
|
||||
template<> class _LIBCPP_VISIBLE complex<long double>;
|
||||
template<> class _LIBCPP_TYPE_VIS_ONLY complex<double>;
|
||||
template<> class _LIBCPP_TYPE_VIS_ONLY complex<long double>;
|
||||
|
||||
template<>
|
||||
class _LIBCPP_VISIBLE complex<float>
|
||||
class _LIBCPP_TYPE_VIS_ONLY complex<float>
|
||||
{
|
||||
float __re_;
|
||||
float __im_;
|
||||
@@ -368,18 +368,18 @@ public:
|
||||
}
|
||||
template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c)
|
||||
{
|
||||
*this = *this * __c;
|
||||
*this = *this * complex(__c.real(), __c.imag());
|
||||
return *this;
|
||||
}
|
||||
template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c)
|
||||
{
|
||||
*this = *this / __c;
|
||||
*this = *this / complex(__c.real(), __c.imag());
|
||||
return *this;
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
class _LIBCPP_VISIBLE complex<double>
|
||||
class _LIBCPP_TYPE_VIS_ONLY complex<double>
|
||||
{
|
||||
double __re_;
|
||||
double __im_;
|
||||
@@ -424,18 +424,18 @@ public:
|
||||
}
|
||||
template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c)
|
||||
{
|
||||
*this = *this * __c;
|
||||
*this = *this * complex(__c.real(), __c.imag());
|
||||
return *this;
|
||||
}
|
||||
template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c)
|
||||
{
|
||||
*this = *this / __c;
|
||||
*this = *this / complex(__c.real(), __c.imag());
|
||||
return *this;
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
class _LIBCPP_VISIBLE complex<long double>
|
||||
class _LIBCPP_TYPE_VIS_ONLY complex<long double>
|
||||
{
|
||||
long double __re_;
|
||||
long double __im_;
|
||||
@@ -480,12 +480,12 @@ public:
|
||||
}
|
||||
template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c)
|
||||
{
|
||||
*this = *this * __c;
|
||||
*this = *this * complex(__c.real(), __c.imag());
|
||||
return *this;
|
||||
}
|
||||
template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c)
|
||||
{
|
||||
*this = *this / __c;
|
||||
*this = *this / complex(__c.real(), __c.imag());
|
||||
return *this;
|
||||
}
|
||||
};
|
||||
@@ -740,7 +740,7 @@ operator-(const complex<_Tp>& __x)
|
||||
}
|
||||
|
||||
template<class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
bool
|
||||
operator==(const complex<_Tp>& __x, const complex<_Tp>& __y)
|
||||
{
|
||||
@@ -748,7 +748,7 @@ operator==(const complex<_Tp>& __x, const complex<_Tp>& __y)
|
||||
}
|
||||
|
||||
template<class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
bool
|
||||
operator==(const complex<_Tp>& __x, const _Tp& __y)
|
||||
{
|
||||
@@ -756,7 +756,7 @@ operator==(const complex<_Tp>& __x, const _Tp& __y)
|
||||
}
|
||||
|
||||
template<class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
bool
|
||||
operator==(const _Tp& __x, const complex<_Tp>& __y)
|
||||
{
|
||||
@@ -764,7 +764,7 @@ operator==(const _Tp& __x, const complex<_Tp>& __y)
|
||||
}
|
||||
|
||||
template<class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
bool
|
||||
operator!=(const complex<_Tp>& __x, const complex<_Tp>& __y)
|
||||
{
|
||||
@@ -772,7 +772,7 @@ operator!=(const complex<_Tp>& __x, const complex<_Tp>& __y)
|
||||
}
|
||||
|
||||
template<class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
bool
|
||||
operator!=(const complex<_Tp>& __x, const _Tp& __y)
|
||||
{
|
||||
@@ -780,7 +780,7 @@ operator!=(const complex<_Tp>& __x, const _Tp& __y)
|
||||
}
|
||||
|
||||
template<class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
bool
|
||||
operator!=(const _Tp& __x, const complex<_Tp>& __y)
|
||||
{
|
||||
@@ -792,21 +792,21 @@ operator!=(const _Tp& __x, const complex<_Tp>& __y)
|
||||
// real
|
||||
|
||||
template<class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_Tp
|
||||
real(const complex<_Tp>& __c)
|
||||
{
|
||||
return __c.real();
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
long double
|
||||
real(long double __re)
|
||||
{
|
||||
return __re;
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
double
|
||||
real(double __re)
|
||||
{
|
||||
@@ -814,7 +814,7 @@ real(double __re)
|
||||
}
|
||||
|
||||
template<class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
typename enable_if
|
||||
<
|
||||
is_integral<_Tp>::value,
|
||||
@@ -825,7 +825,7 @@ real(_Tp __re)
|
||||
return __re;
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
float
|
||||
real(float __re)
|
||||
{
|
||||
@@ -835,21 +835,21 @@ real(float __re)
|
||||
// imag
|
||||
|
||||
template<class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_Tp
|
||||
imag(const complex<_Tp>& __c)
|
||||
{
|
||||
return __c.imag();
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
long double
|
||||
imag(long double __re)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
double
|
||||
imag(double __re)
|
||||
{
|
||||
@@ -857,7 +857,7 @@ imag(double __re)
|
||||
}
|
||||
|
||||
template<class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
typename enable_if
|
||||
<
|
||||
is_integral<_Tp>::value,
|
||||
@@ -868,7 +868,7 @@ imag(_Tp __re)
|
||||
return 0;
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
float
|
||||
imag(float __re)
|
||||
{
|
||||
@@ -1521,6 +1521,47 @@ operator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __x)
|
||||
return __os << __s.str();
|
||||
}
|
||||
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
// Literal suffix for complex number literals [complex.literals]
|
||||
inline namespace literals
|
||||
{
|
||||
inline namespace complex_literals
|
||||
{
|
||||
constexpr complex<long double> operator""il(long double __im)
|
||||
{
|
||||
return { 0.0l, __im };
|
||||
}
|
||||
|
||||
constexpr complex<long double> operator""il(unsigned long long __im)
|
||||
{
|
||||
return { 0.0l, static_cast<long double>(__im) };
|
||||
}
|
||||
|
||||
|
||||
constexpr complex<double> operator""i(long double __im)
|
||||
{
|
||||
return { 0.0, static_cast<double>(__im) };
|
||||
}
|
||||
|
||||
constexpr complex<double> operator""i(unsigned long long __im)
|
||||
{
|
||||
return { 0.0, static_cast<double>(__im) };
|
||||
}
|
||||
|
||||
|
||||
constexpr complex<float> operator""if(long double __im)
|
||||
{
|
||||
return { 0.0f, static_cast<float>(__im) };
|
||||
}
|
||||
|
||||
constexpr complex<float> operator""if(unsigned long long __im)
|
||||
{
|
||||
return { 0.0f, static_cast<float>(__im) };
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP_COMPLEX
|
||||
|
||||
@@ -117,7 +117,7 @@ public:
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
class _LIBCPP_VISIBLE condition_variable_any
|
||||
class _LIBCPP_TYPE_VIS condition_variable_any
|
||||
{
|
||||
condition_variable __cv_;
|
||||
shared_ptr<mutex> __mut_;
|
||||
@@ -248,7 +248,7 @@ condition_variable_any::wait_for(_Lock& __lock,
|
||||
_VSTD::move(__pred));
|
||||
}
|
||||
|
||||
_LIBCPP_VISIBLE
|
||||
_LIBCPP_FUNC_VIS
|
||||
void notify_all_at_thread_exit(condition_variable& cond, unique_lock<mutex> lk);
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
@@ -56,7 +56,7 @@ typedef long double max_align_t;
|
||||
|
||||
#ifdef _LIBCPP_HAS_NO_NULLPTR
|
||||
|
||||
struct _LIBCPP_VISIBLE nullptr_t
|
||||
struct _LIBCPP_TYPE_VIS_ONLY nullptr_t
|
||||
{
|
||||
void* __lx;
|
||||
|
||||
|
||||
@@ -74,7 +74,7 @@ int fputc(int c, FILE* stream);
|
||||
int fputs(const char* restrict s, FILE* restrict stream);
|
||||
int getc(FILE* stream);
|
||||
int getchar(void);
|
||||
char* gets(char* s);
|
||||
char* gets(char* s); // removed in C++14
|
||||
int putc(int c, FILE* stream);
|
||||
int putchar(int c);
|
||||
int puts(const char* s);
|
||||
@@ -103,6 +103,11 @@ void perror(const char* s);
|
||||
#pragma GCC system_header
|
||||
#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
|
||||
@@ -138,12 +143,12 @@ using ::scanf;
|
||||
using ::snprintf;
|
||||
using ::sprintf;
|
||||
using ::sscanf;
|
||||
#ifndef _MSC_VER
|
||||
#ifndef _LIBCPP_MSVCRT
|
||||
using ::vfprintf;
|
||||
using ::vfscanf;
|
||||
using ::vscanf;
|
||||
using ::vsscanf;
|
||||
#endif // _MSC_VER
|
||||
#endif // _LIBCPP_MSVCRT
|
||||
using ::vprintf;
|
||||
using ::vsnprintf;
|
||||
using ::vsprintf;
|
||||
@@ -153,7 +158,9 @@ using ::fputc;
|
||||
using ::fputs;
|
||||
using ::getc;
|
||||
using ::getchar;
|
||||
#if _LIBCPP_STD_VER <= 11
|
||||
using ::gets;
|
||||
#endif
|
||||
using ::putc;
|
||||
using ::putchar;
|
||||
using ::puts;
|
||||
|
||||
@@ -84,9 +84,9 @@ void *aligned_alloc(size_t alignment, size_t size); // C11
|
||||
|
||||
#include <__config>
|
||||
#include <stdlib.h>
|
||||
#ifdef _MSC_VER
|
||||
#ifdef _LIBCPP_MSVCRT
|
||||
#include "support/win32/locale_win32.h"
|
||||
#endif // _MSC_VER
|
||||
#endif // _LIBCPP_MSVCRT
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
@@ -97,18 +97,26 @@ _LIBCPP_BEGIN_NAMESPACE_STD
|
||||
using ::size_t;
|
||||
using ::div_t;
|
||||
using ::ldiv_t;
|
||||
#ifndef _LIBCPP_HAS_NO_LONG_LONG
|
||||
using ::lldiv_t;
|
||||
#endif // _LIBCPP_HAS_NO_LONG_LONG
|
||||
using ::atof;
|
||||
using ::atoi;
|
||||
using ::atol;
|
||||
#ifndef _LIBCPP_HAS_NO_LONG_LONG
|
||||
using ::atoll;
|
||||
#endif // _LIBCPP_HAS_NO_LONG_LONG
|
||||
using ::strtod;
|
||||
using ::strtof;
|
||||
using ::strtold;
|
||||
using ::strtol;
|
||||
#ifndef _LIBCPP_HAS_NO_LONG_LONG
|
||||
using ::strtoll;
|
||||
#endif // _LIBCPP_HAS_NO_LONG_LONG
|
||||
using ::strtoul;
|
||||
#ifndef _LIBCPP_HAS_NO_LONG_LONG
|
||||
using ::strtoull;
|
||||
#endif // _LIBCPP_HAS_NO_LONG_LONG
|
||||
using ::rand;
|
||||
using ::srand;
|
||||
using ::calloc;
|
||||
@@ -125,10 +133,14 @@ using ::bsearch;
|
||||
using ::qsort;
|
||||
using ::abs;
|
||||
using ::labs;
|
||||
#ifndef _LIBCPP_HAS_NO_LONG_LONG
|
||||
using ::llabs;
|
||||
#endif // _LIBCPP_HAS_NO_LONG_LONG
|
||||
using ::div;
|
||||
using ::ldiv;
|
||||
#ifndef _LIBCPP_HAS_NO_LONG_LONG
|
||||
using ::lldiv;
|
||||
#endif // _LIBCPP_HAS_NO_LONG_LONG
|
||||
using ::mblen;
|
||||
using ::mbtowc;
|
||||
using ::wctomb;
|
||||
@@ -142,14 +154,18 @@ using ::quick_exit;
|
||||
using ::aligned_alloc;
|
||||
#endif
|
||||
|
||||
// MSVC already has the correct prototype in <stdlib.h.h> #ifdef __cplusplus
|
||||
#if !defined(_MSC_VER) && !defined(__sun__)
|
||||
// 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 // _MSC_VER
|
||||
#endif // _LIBCPP_HAS_NO_LONG_LONG
|
||||
#endif // _LIBCPP_MSVCRT
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
|
||||
@@ -93,8 +93,8 @@ using ::strspn;
|
||||
|
||||
using ::strstr;
|
||||
|
||||
// MSVC, GNU libc and its derivates already have the correct prototype in <string.h> #ifdef __cplusplus
|
||||
#if !defined(__GLIBC__) && !defined(_MSC_VER) && !defined(__sun__)
|
||||
// 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);}
|
||||
|
||||
@@ -106,9 +106,9 @@ size_t wcsrtombs(char* restrict dst, const wchar_t** restrict src, size_t len,
|
||||
#include <__config>
|
||||
#include <cwctype>
|
||||
#include <wchar.h>
|
||||
#if _WIN32
|
||||
#if defined(_LIBCPP_MSVCRT) || defined(__MINGW32__)
|
||||
#include <support/win32/support.h> // pull in *swprintf defines
|
||||
#endif // _WIN32
|
||||
#endif // _LIBCPP_MSVCRT
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
@@ -127,12 +127,12 @@ using ::swprintf;
|
||||
using ::vfwprintf;
|
||||
using ::vswprintf;
|
||||
using ::vwprintf;
|
||||
#ifndef _MSC_VER
|
||||
#ifndef _LIBCPP_MSVCRT
|
||||
using ::swscanf;
|
||||
using ::vfwscanf;
|
||||
using ::vswscanf;
|
||||
using ::vwscanf;
|
||||
#endif // _MSC_VER
|
||||
#endif // _LIBCPP_MSVCRT
|
||||
using ::wprintf;
|
||||
using ::wscanf;
|
||||
using ::fgetwc;
|
||||
@@ -146,14 +146,18 @@ using ::putwc;
|
||||
using ::putwchar;
|
||||
using ::ungetwc;
|
||||
using ::wcstod;
|
||||
#ifndef _MSC_VER
|
||||
#ifndef _LIBCPP_MSVCRT
|
||||
using ::wcstof;
|
||||
using ::wcstold;
|
||||
#endif // _MSC_VER
|
||||
#endif // _LIBCPP_MSVCRT
|
||||
using ::wcstol;
|
||||
#ifndef _LIBCPP_HAS_NO_LONG_LONG
|
||||
using ::wcstoll;
|
||||
#endif // _LIBCPP_HAS_NO_LONG_LONG
|
||||
using ::wcstoul;
|
||||
#ifndef _LIBCPP_HAS_NO_LONG_LONG
|
||||
using ::wcstoull;
|
||||
#endif // _LIBCPP_HAS_NO_LONG_LONG
|
||||
using ::wcscpy;
|
||||
using ::wcsncpy;
|
||||
using ::wcscat;
|
||||
@@ -163,28 +167,37 @@ using ::wcscoll;
|
||||
using ::wcsncmp;
|
||||
using ::wcsxfrm;
|
||||
|
||||
#if defined(_WCHAR_H_CPLUSPLUS_98_CONFORMANCE_)
|
||||
|
||||
using ::wcschr;
|
||||
using ::wcspbrk;
|
||||
using ::wcsrchr;
|
||||
using ::wcsstr;
|
||||
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);}
|
||||
|
||||
using ::wcscspn;
|
||||
using ::wcslen;
|
||||
|
||||
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);}
|
||||
|
||||
using ::wcsspn;
|
||||
|
||||
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);}
|
||||
|
||||
using ::wcstok;
|
||||
|
||||
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 ::wcslen;
|
||||
using ::wcsspn;
|
||||
using ::wcstok;
|
||||
using ::wmemcmp;
|
||||
using ::wmemcpy;
|
||||
using ::wmemmove;
|
||||
|
||||
@@ -41,6 +41,7 @@ public:
|
||||
deque() noexcept(is_nothrow_default_constructible<allocator_type>::value);
|
||||
explicit deque(const allocator_type& a);
|
||||
explicit deque(size_type n);
|
||||
explicit deque(size_type n, const allocator_type& a); // C++14
|
||||
deque(size_type n, const value_type& v);
|
||||
deque(size_type n, const value_type& v, const allocator_type& a);
|
||||
template <class InputIterator>
|
||||
@@ -170,7 +171,7 @@ template <class _Tp, class _Allocator> class __deque_base;
|
||||
|
||||
template <class _ValueType, class _Pointer, class _Reference, class _MapPointer,
|
||||
class _DiffType, _DiffType _BlockSize>
|
||||
class _LIBCPP_VISIBLE __deque_iterator;
|
||||
class _LIBCPP_TYPE_VIS_ONLY __deque_iterator;
|
||||
|
||||
template <class _RAIter,
|
||||
class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
|
||||
@@ -262,7 +263,7 @@ move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
|
||||
|
||||
template <class _ValueType, class _Pointer, class _Reference, class _MapPointer,
|
||||
class _DiffType, _DiffType _BlockSize>
|
||||
class _LIBCPP_VISIBLE __deque_iterator
|
||||
class _LIBCPP_TYPE_VIS_ONLY __deque_iterator
|
||||
{
|
||||
typedef _MapPointer __map_iterator;
|
||||
public:
|
||||
@@ -278,7 +279,11 @@ public:
|
||||
typedef random_access_iterator_tag iterator_category;
|
||||
typedef _Reference reference;
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY __deque_iterator() _NOEXCEPT {}
|
||||
_LIBCPP_INLINE_VISIBILITY __deque_iterator() _NOEXCEPT
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
: __m_iter_(nullptr), __ptr_(nullptr)
|
||||
#endif
|
||||
{}
|
||||
|
||||
template <class _Pp, class _Rp, class _MP>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
@@ -410,9 +415,9 @@ private:
|
||||
: __m_iter_(__m), __ptr_(__p) {}
|
||||
|
||||
template <class _Tp, class _Ap> friend class __deque_base;
|
||||
template <class _Tp, class _Ap> friend class _LIBCPP_VISIBLE deque;
|
||||
template <class _Tp, class _Ap> friend class _LIBCPP_TYPE_VIS_ONLY deque;
|
||||
template <class _Vp, class _Pp, class _Rp, class _MP, class _Dp, _Dp>
|
||||
friend class _LIBCPP_VISIBLE __deque_iterator;
|
||||
friend class _LIBCPP_TYPE_VIS_ONLY __deque_iterator;
|
||||
|
||||
template <class _RAIter,
|
||||
class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
|
||||
@@ -915,7 +920,14 @@ protected:
|
||||
__pointer_allocator;
|
||||
typedef allocator_traits<__pointer_allocator> __map_traits;
|
||||
typedef typename __map_traits::pointer __map_pointer;
|
||||
typedef typename __map_traits::const_pointer __map_const_pointer;
|
||||
typedef typename __alloc_traits::template
|
||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
rebind_alloc<const_pointer>
|
||||
#else
|
||||
rebind_alloc<const_pointer>::other
|
||||
#endif
|
||||
__const_pointer_allocator;
|
||||
typedef typename allocator_traits<__const_pointer_allocator>::const_pointer __map_const_pointer;
|
||||
typedef __split_buffer<pointer, __pointer_allocator> __map;
|
||||
|
||||
typedef __deque_iterator<value_type, pointer, reference, __map_pointer,
|
||||
@@ -1053,7 +1065,7 @@ template <class _Tp, class _Allocator>
|
||||
typename __deque_base<_Tp, _Allocator>::const_iterator
|
||||
__deque_base<_Tp, _Allocator>::begin() const _NOEXCEPT
|
||||
{
|
||||
__map_const_pointer __mp = __map_.begin() + __start_ / __block_size;
|
||||
__map_const_pointer __mp = static_cast<__map_const_pointer>(__map_.begin() + __start_ / __block_size);
|
||||
return const_iterator(__mp, __map_.empty() ? 0 : *__mp + __start_ % __block_size);
|
||||
}
|
||||
|
||||
@@ -1071,7 +1083,7 @@ typename __deque_base<_Tp, _Allocator>::const_iterator
|
||||
__deque_base<_Tp, _Allocator>::end() const _NOEXCEPT
|
||||
{
|
||||
size_type __p = size() + __start_;
|
||||
__map_const_pointer __mp = __map_.begin() + __p / __block_size;
|
||||
__map_const_pointer __mp = static_cast<__map_const_pointer>(__map_.begin() + __p / __block_size);
|
||||
return const_iterator(__mp, __map_.empty() ? 0 : *__mp + __p % __block_size);
|
||||
}
|
||||
|
||||
@@ -1167,7 +1179,7 @@ __deque_base<_Tp, _Allocator>::clear() _NOEXCEPT
|
||||
}
|
||||
|
||||
template <class _Tp, class _Allocator = allocator<_Tp> >
|
||||
class _LIBCPP_VISIBLE deque
|
||||
class _LIBCPP_TYPE_VIS_ONLY deque
|
||||
: private __deque_base<_Tp, _Allocator>
|
||||
{
|
||||
public:
|
||||
@@ -1198,6 +1210,9 @@ public:
|
||||
{}
|
||||
_LIBCPP_INLINE_VISIBILITY deque(const allocator_type& __a) : __base(__a) {}
|
||||
explicit deque(size_type __n);
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
explicit deque(size_type __n, const _Allocator& __a);
|
||||
#endif
|
||||
deque(size_type __n, const value_type& __v);
|
||||
deque(size_type __n, const value_type& __v, const allocator_type& __a);
|
||||
template <class _InputIter>
|
||||
@@ -1341,6 +1356,8 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
bool __invariants() const {return __base::__invariants();}
|
||||
private:
|
||||
typedef typename __base::__map_const_pointer __map_const_pointer;
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
static size_type __recommend_blocks(size_type __n)
|
||||
{
|
||||
@@ -1418,6 +1435,16 @@ deque<_Tp, _Allocator>::deque(size_type __n)
|
||||
__append(__n);
|
||||
}
|
||||
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
template <class _Tp, class _Allocator>
|
||||
deque<_Tp, _Allocator>::deque(size_type __n, const _Allocator& __a)
|
||||
: __base(__a)
|
||||
{
|
||||
if (__n > 0)
|
||||
__append(__n);
|
||||
}
|
||||
#endif
|
||||
|
||||
template <class _Tp, class _Allocator>
|
||||
deque<_Tp, _Allocator>::deque(size_type __n, const value_type& __v)
|
||||
{
|
||||
@@ -2505,9 +2532,9 @@ void
|
||||
deque<_Tp, _Allocator>::pop_front()
|
||||
{
|
||||
allocator_type& __a = __base::__alloc();
|
||||
__alloc_traits::destroy(__a, *(__base::__map_.begin() +
|
||||
__base::__start_ / __base::__block_size) +
|
||||
__base::__start_ % __base::__block_size);
|
||||
__alloc_traits::destroy(__a, __to_raw_pointer(*(__base::__map_.begin() +
|
||||
__base::__start_ / __base::__block_size) +
|
||||
__base::__start_ % __base::__block_size));
|
||||
--__base::size();
|
||||
if (++__base::__start_ >= 2 * __base::__block_size)
|
||||
{
|
||||
@@ -2523,9 +2550,9 @@ deque<_Tp, _Allocator>::pop_back()
|
||||
{
|
||||
allocator_type& __a = __base::__alloc();
|
||||
size_type __p = __base::size() + __base::__start_ - 1;
|
||||
__alloc_traits::destroy(__a, *(__base::__map_.begin() +
|
||||
__p / __base::__block_size) +
|
||||
__p % __base::__block_size);
|
||||
__alloc_traits::destroy(__a, __to_raw_pointer(*(__base::__map_.begin() +
|
||||
__p / __base::__block_size) +
|
||||
__p % __base::__block_size));
|
||||
--__base::size();
|
||||
if (__back_spare() >= 2 * __base::__block_size)
|
||||
{
|
||||
@@ -2556,7 +2583,7 @@ deque<_Tp, _Allocator>::__move_and_check(iterator __f, iterator __l, iterator __
|
||||
__fe = __fb + __bs;
|
||||
}
|
||||
if (__fb <= __vt && __vt < __fe)
|
||||
__vt = (const_iterator(__f.__m_iter_, __vt) -= __f - __r).__ptr_;
|
||||
__vt = (const_iterator(static_cast<__map_const_pointer>(__f.__m_iter_), __vt) -= __f - __r).__ptr_;
|
||||
__r = _VSTD::move(__fb, __fe, __r);
|
||||
__n -= __bs;
|
||||
__f += __bs;
|
||||
@@ -2587,7 +2614,7 @@ deque<_Tp, _Allocator>::__move_backward_and_check(iterator __f, iterator __l, it
|
||||
__lb = __le - __bs;
|
||||
}
|
||||
if (__lb <= __vt && __vt < __le)
|
||||
__vt = (const_iterator(__l.__m_iter_, __vt) += __r - __l - 1).__ptr_;
|
||||
__vt = (const_iterator(static_cast<__map_const_pointer>(__l.__m_iter_), __vt) += __r - __l - 1).__ptr_;
|
||||
__r = _VSTD::move_backward(__lb, __le, __r);
|
||||
__n -= __bs;
|
||||
__l -= __bs - 1;
|
||||
@@ -2618,7 +2645,7 @@ deque<_Tp, _Allocator>::__move_construct_and_check(iterator __f, iterator __l,
|
||||
__fe = __fb + __bs;
|
||||
}
|
||||
if (__fb <= __vt && __vt < __fe)
|
||||
__vt = (const_iterator(__f.__m_iter_, __vt) += __r - __f).__ptr_;
|
||||
__vt = (const_iterator(static_cast<__map_const_pointer>(__f.__m_iter_), __vt) += __r - __f).__ptr_;
|
||||
for (; __fb != __fe; ++__fb, ++__r, ++__base::size())
|
||||
__alloc_traits::construct(__a, _VSTD::addressof(*__r), _VSTD::move(*__fb));
|
||||
__n -= __bs;
|
||||
@@ -2654,7 +2681,7 @@ deque<_Tp, _Allocator>::__move_construct_backward_and_check(iterator __f, iterat
|
||||
__lb = __le - __bs;
|
||||
}
|
||||
if (__lb <= __vt && __vt < __le)
|
||||
__vt = (const_iterator(__l.__m_iter_, __vt) -= __l - __r + 1).__ptr_;
|
||||
__vt = (const_iterator(static_cast<__map_const_pointer>(__l.__m_iter_), __vt) -= __l - __r + 1).__ptr_;
|
||||
while (__le != __lb)
|
||||
{
|
||||
__alloc_traits::construct(__a, _VSTD::addressof(*--__r), _VSTD::move(*--__le));
|
||||
@@ -2784,7 +2811,7 @@ deque<_Tp, _Allocator>::clear() _NOEXCEPT
|
||||
}
|
||||
|
||||
template <class _Tp, class _Allocator>
|
||||
_LIBCPP_INLINE_VISIBILITY inline
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator==(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
|
||||
{
|
||||
@@ -2793,7 +2820,7 @@ operator==(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
|
||||
}
|
||||
|
||||
template <class _Tp, class _Allocator>
|
||||
_LIBCPP_INLINE_VISIBILITY inline
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator!=(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
|
||||
{
|
||||
@@ -2801,7 +2828,7 @@ operator!=(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
|
||||
}
|
||||
|
||||
template <class _Tp, class _Allocator>
|
||||
_LIBCPP_INLINE_VISIBILITY inline
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator< (const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
|
||||
{
|
||||
@@ -2809,7 +2836,7 @@ operator< (const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
|
||||
}
|
||||
|
||||
template <class _Tp, class _Allocator>
|
||||
_LIBCPP_INLINE_VISIBILITY inline
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator> (const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
|
||||
{
|
||||
@@ -2817,7 +2844,7 @@ operator> (const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
|
||||
}
|
||||
|
||||
template <class _Tp, class _Allocator>
|
||||
_LIBCPP_INLINE_VISIBILITY inline
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator>=(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
|
||||
{
|
||||
@@ -2825,7 +2852,7 @@ operator>=(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
|
||||
}
|
||||
|
||||
template <class _Tp, class _Allocator>
|
||||
_LIBCPP_INLINE_VISIBILITY inline
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator<=(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
|
||||
{
|
||||
@@ -2833,7 +2860,7 @@ operator<=(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y)
|
||||
}
|
||||
|
||||
template <class _Tp, class _Allocator>
|
||||
_LIBCPP_INLINE_VISIBILITY inline
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
swap(deque<_Tp, _Allocator>& __x, deque<_Tp, _Allocator>& __y)
|
||||
_NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
|
||||
|
||||
@@ -105,23 +105,23 @@ public:
|
||||
};
|
||||
|
||||
typedef void (*unexpected_handler)();
|
||||
_LIBCPP_VISIBLE unexpected_handler set_unexpected(unexpected_handler) _NOEXCEPT;
|
||||
_LIBCPP_VISIBLE unexpected_handler get_unexpected() _NOEXCEPT;
|
||||
_LIBCPP_NORETURN _LIBCPP_VISIBLE void unexpected();
|
||||
_LIBCPP_FUNC_VIS unexpected_handler set_unexpected(unexpected_handler) _NOEXCEPT;
|
||||
_LIBCPP_FUNC_VIS unexpected_handler get_unexpected() _NOEXCEPT;
|
||||
_LIBCPP_NORETURN _LIBCPP_FUNC_VIS void unexpected();
|
||||
|
||||
typedef void (*terminate_handler)();
|
||||
_LIBCPP_VISIBLE terminate_handler set_terminate(terminate_handler) _NOEXCEPT;
|
||||
_LIBCPP_VISIBLE terminate_handler get_terminate() _NOEXCEPT;
|
||||
_LIBCPP_NORETURN _LIBCPP_VISIBLE void terminate() _NOEXCEPT;
|
||||
_LIBCPP_FUNC_VIS terminate_handler set_terminate(terminate_handler) _NOEXCEPT;
|
||||
_LIBCPP_FUNC_VIS terminate_handler get_terminate() _NOEXCEPT;
|
||||
_LIBCPP_NORETURN _LIBCPP_FUNC_VIS void terminate() _NOEXCEPT;
|
||||
|
||||
_LIBCPP_VISIBLE bool uncaught_exception() _NOEXCEPT;
|
||||
_LIBCPP_FUNC_VIS bool uncaught_exception() _NOEXCEPT;
|
||||
|
||||
class _LIBCPP_VISIBLE exception_ptr;
|
||||
class _LIBCPP_TYPE_VIS exception_ptr;
|
||||
|
||||
exception_ptr current_exception() _NOEXCEPT;
|
||||
_LIBCPP_NORETURN void rethrow_exception(exception_ptr);
|
||||
_LIBCPP_FUNC_VIS exception_ptr current_exception() _NOEXCEPT;
|
||||
_LIBCPP_NORETURN _LIBCPP_FUNC_VIS void rethrow_exception(exception_ptr);
|
||||
|
||||
class _LIBCPP_VISIBLE exception_ptr
|
||||
class _LIBCPP_TYPE_VIS exception_ptr
|
||||
{
|
||||
void* __ptr_;
|
||||
public:
|
||||
@@ -142,8 +142,8 @@ public:
|
||||
bool operator!=(const exception_ptr& __x, const exception_ptr& __y) _NOEXCEPT
|
||||
{return !(__x == __y);}
|
||||
|
||||
friend exception_ptr current_exception() _NOEXCEPT;
|
||||
_LIBCPP_NORETURN friend void rethrow_exception(exception_ptr);
|
||||
friend _LIBCPP_FUNC_VIS exception_ptr current_exception() _NOEXCEPT;
|
||||
friend _LIBCPP_FUNC_VIS void rethrow_exception(exception_ptr);
|
||||
};
|
||||
|
||||
template<class _Ep>
|
||||
|
||||
314
include/experimental/dynarray
Normal file
314
include/experimental/dynarray
Normal file
@@ -0,0 +1,314 @@
|
||||
// -*- C++ -*-
|
||||
//===-------------------------- dynarray ----------------------------------===//
|
||||
//
|
||||
// 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_DYNARRAY
|
||||
#define _LIBCPP_DYNARRAY
|
||||
|
||||
#include <__config>
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
|
||||
/*
|
||||
dynarray synopsis
|
||||
|
||||
namespace std { namespace experimental {
|
||||
|
||||
template< typename T >
|
||||
class dynarray
|
||||
{
|
||||
// types:
|
||||
typedef T value_type;
|
||||
typedef T& reference;
|
||||
typedef const T& const_reference;
|
||||
typedef T* pointer;
|
||||
typedef const T* const_pointer;
|
||||
typedef implementation-defined iterator;
|
||||
typedef implementation-defined const_iterator;
|
||||
typedef reverse_iterator<iterator> reverse_iterator;
|
||||
typedef reverse_iterator<const_iterator> const_reverse_iterator;
|
||||
typedef size_t size_type;
|
||||
typedef ptrdiff_t difference_type;
|
||||
|
||||
public:
|
||||
// construct/copy/destroy:
|
||||
explicit dynarray(size_type c);
|
||||
template <typename Alloc>
|
||||
dynarray(size_type c, const Alloc& alloc);
|
||||
dynarray(size_type c, const T& v);
|
||||
template <typename Alloc>
|
||||
dynarray(size_type c, const T& v, const Alloc& alloc);
|
||||
dynarray(const dynarray& d);
|
||||
template <typename Alloc>
|
||||
dynarray(const dynarray& d, const Alloc& alloc);
|
||||
dynarray(initializer_list<T>);
|
||||
template <typename Alloc>
|
||||
dynarray(initializer_list<T>, const Alloc& alloc);
|
||||
|
||||
dynarray& operator=(const dynarray&) = delete;
|
||||
~dynarray();
|
||||
|
||||
// iterators:
|
||||
iterator begin() noexcept;
|
||||
const_iterator begin() const noexcept;
|
||||
const_iterator cbegin() const noexcept;
|
||||
iterator end() noexcept;
|
||||
const_iterator end() const noexcept;
|
||||
const_iterator cend() const noexcept;
|
||||
|
||||
reverse_iterator rbegin() noexcept;
|
||||
const_reverse_iterator rbegin() const noexcept;
|
||||
const_reverse_iterator crbegin() const noexcept;
|
||||
reverse_iterator rend() noexcept;
|
||||
const_reverse_iterator rend() const noexcept;
|
||||
const_reverse_iterator crend() const noexcept;
|
||||
|
||||
// capacity:
|
||||
size_type size() const noexcept;
|
||||
size_type max_size() const noexcept;
|
||||
bool empty() const noexcept;
|
||||
|
||||
// element access:
|
||||
reference operator[](size_type n);
|
||||
const_reference operator[](size_type n) const;
|
||||
|
||||
reference front();
|
||||
const_reference front() const;
|
||||
reference back();
|
||||
const_reference back() const;
|
||||
|
||||
const_reference at(size_type n) const;
|
||||
reference at(size_type n);
|
||||
|
||||
// data access:
|
||||
T* data() noexcept;
|
||||
const T* data() const noexcept;
|
||||
|
||||
// mutating member functions:
|
||||
void fill(const T& v);
|
||||
};
|
||||
|
||||
}} // std::experimental
|
||||
|
||||
*/
|
||||
|
||||
#include <__functional_base>
|
||||
#include <iterator>
|
||||
#include <stdexcept>
|
||||
#include <initializer_list>
|
||||
#include <new>
|
||||
#include <algorithm>
|
||||
|
||||
#if defined(_LIBCPP_NO_EXCEPTIONS)
|
||||
#include <cassert>
|
||||
#endif
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
namespace std { namespace experimental { inline namespace __array_extensions_v1 {
|
||||
|
||||
template <class _Tp>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY dynarray
|
||||
{
|
||||
public:
|
||||
// types:
|
||||
typedef dynarray __self;
|
||||
typedef _Tp value_type;
|
||||
typedef value_type& reference;
|
||||
typedef const value_type& const_reference;
|
||||
typedef value_type* iterator;
|
||||
typedef const value_type* const_iterator;
|
||||
typedef value_type* pointer;
|
||||
typedef const value_type* const_pointer;
|
||||
typedef size_t size_type;
|
||||
typedef ptrdiff_t difference_type;
|
||||
typedef std::reverse_iterator<iterator> reverse_iterator;
|
||||
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
|
||||
|
||||
private:
|
||||
size_t __size_;
|
||||
value_type * __base_;
|
||||
_LIBCPP_ALWAYS_INLINE dynarray () noexcept : __base_(nullptr), __size_(0) {}
|
||||
|
||||
static inline _LIBCPP_INLINE_VISIBILITY value_type* __allocate ( size_t count )
|
||||
{
|
||||
if ( numeric_limits<size_t>::max() / sizeof (value_type) <= count )
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw bad_array_length();
|
||||
#else
|
||||
assert(!"dynarray::allocation");
|
||||
#endif
|
||||
}
|
||||
return static_cast<value_type *> (::operator new (sizeof(value_type) * count));
|
||||
}
|
||||
|
||||
static inline _LIBCPP_INLINE_VISIBILITY void __deallocate ( value_type* __ptr ) noexcept
|
||||
{
|
||||
::operator delete (static_cast<void *> (__ptr));
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
explicit dynarray(size_type __c);
|
||||
dynarray(size_type __c, const value_type& __v);
|
||||
dynarray(const dynarray& __d);
|
||||
dynarray(initializer_list<value_type>);
|
||||
|
||||
// We're not implementing these right now.
|
||||
// Waiting for the resolution of LWG issue #2235
|
||||
// template <typename _Alloc>
|
||||
// dynarray(size_type __c, const _Alloc& __alloc);
|
||||
// template <typename _Alloc>
|
||||
// dynarray(size_type __c, const value_type& __v, const _Alloc& __alloc);
|
||||
// template <typename _Alloc>
|
||||
// dynarray(const dynarray& __d, const _Alloc& __alloc);
|
||||
// template <typename _Alloc>
|
||||
// dynarray(initializer_list<value_type>, const _Alloc& __alloc);
|
||||
|
||||
dynarray& operator=(const dynarray&) = delete;
|
||||
~dynarray();
|
||||
|
||||
// iterators:
|
||||
inline _LIBCPP_INLINE_VISIBILITY iterator begin() noexcept { return iterator(data()); }
|
||||
inline _LIBCPP_INLINE_VISIBILITY const_iterator begin() const noexcept { return const_iterator(data()); }
|
||||
inline _LIBCPP_INLINE_VISIBILITY const_iterator cbegin() const noexcept { return const_iterator(data()); }
|
||||
inline _LIBCPP_INLINE_VISIBILITY iterator end() noexcept { return iterator(data() + __size_); }
|
||||
inline _LIBCPP_INLINE_VISIBILITY const_iterator end() const noexcept { return const_iterator(data() + __size_); }
|
||||
inline _LIBCPP_INLINE_VISIBILITY const_iterator cend() const noexcept { return const_iterator(data() + __size_); }
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY reverse_iterator rbegin() noexcept { return reverse_iterator(end()); }
|
||||
inline _LIBCPP_INLINE_VISIBILITY const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); }
|
||||
inline _LIBCPP_INLINE_VISIBILITY const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator(end()); }
|
||||
inline _LIBCPP_INLINE_VISIBILITY reverse_iterator rend() noexcept { return reverse_iterator(begin()); }
|
||||
inline _LIBCPP_INLINE_VISIBILITY const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); }
|
||||
inline _LIBCPP_INLINE_VISIBILITY const_reverse_iterator crend() const noexcept { return const_reverse_iterator(begin()); }
|
||||
|
||||
// capacity:
|
||||
inline _LIBCPP_INLINE_VISIBILITY size_type size() const noexcept { return __size_; }
|
||||
inline _LIBCPP_INLINE_VISIBILITY size_type max_size() const noexcept { return __size_; }
|
||||
inline _LIBCPP_INLINE_VISIBILITY bool empty() const noexcept { return __size_ == 0; }
|
||||
|
||||
// element access:
|
||||
inline _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __n) { return data()[__n]; }
|
||||
inline _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __n) const { return data()[__n]; }
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY reference front() { return data()[0]; }
|
||||
inline _LIBCPP_INLINE_VISIBILITY const_reference front() const { return data()[0]; }
|
||||
inline _LIBCPP_INLINE_VISIBILITY reference back() { return data()[__size_-1]; }
|
||||
inline _LIBCPP_INLINE_VISIBILITY const_reference back() const { return data()[__size_-1]; }
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY const_reference at(size_type __n) const;
|
||||
inline _LIBCPP_INLINE_VISIBILITY reference at(size_type __n);
|
||||
|
||||
// data access:
|
||||
inline _LIBCPP_INLINE_VISIBILITY _Tp* data() noexcept { return __base_; }
|
||||
inline _LIBCPP_INLINE_VISIBILITY const _Tp* data() const noexcept { return __base_; }
|
||||
|
||||
// mutating member functions:
|
||||
inline _LIBCPP_INLINE_VISIBILITY void fill(const value_type& __v) { fill_n(begin(), __size_, __v); }
|
||||
};
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
dynarray<_Tp>::dynarray(size_type __c) : dynarray ()
|
||||
{
|
||||
__base_ = __allocate (__c);
|
||||
value_type *__data = data ();
|
||||
for ( __size_ = 0; __size_ < __c; ++__size_, ++__data )
|
||||
::new (__data) value_type;
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
dynarray<_Tp>::dynarray(size_type __c, const value_type& __v) : dynarray ()
|
||||
{
|
||||
__base_ = __allocate (__c);
|
||||
value_type *__data = data ();
|
||||
for ( __size_ = 0; __size_ < __c; ++__size_, ++__data )
|
||||
::new (__data) value_type (__v);
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
dynarray<_Tp>::dynarray(initializer_list<value_type> __il) : dynarray ()
|
||||
{
|
||||
size_t sz = __il.size();
|
||||
__base_ = __allocate (sz);
|
||||
value_type *__data = data ();
|
||||
auto src = __il.begin();
|
||||
for ( __size_ = 0; __size_ < sz; ++__size_, ++__data, ++src )
|
||||
::new (__data) value_type (*src);
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
dynarray<_Tp>::dynarray(const dynarray& __d) : dynarray ()
|
||||
{
|
||||
size_t sz = __d.size();
|
||||
__base_ = __allocate (sz);
|
||||
value_type *__data = data ();
|
||||
auto src = __d.begin();
|
||||
for ( __size_ = 0; __size_ < sz; ++__size_, ++__data, ++src )
|
||||
::new (__data) value_type (*src);
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
dynarray<_Tp>::~dynarray()
|
||||
{
|
||||
value_type *__data = data () + __size_;
|
||||
for ( size_t i = 0; i < __size_; ++i )
|
||||
(--__data)->value_type::~value_type();
|
||||
__deallocate ( __base_ );
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
typename dynarray<_Tp>::reference
|
||||
dynarray<_Tp>::at(size_type __n)
|
||||
{
|
||||
if (__n >= __size_)
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw out_of_range("dynarray::at");
|
||||
#else
|
||||
assert(!"dynarray::at out_of_range");
|
||||
#endif
|
||||
}
|
||||
return data()[__n];
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
typename dynarray<_Tp>::const_reference
|
||||
dynarray<_Tp>::at(size_type __n) const
|
||||
{
|
||||
if (__n >= __size_)
|
||||
{
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw out_of_range("dynarray::at");
|
||||
#else
|
||||
assert(!"dynarray::at out_of_range");
|
||||
#endif
|
||||
}
|
||||
return data()[__n];
|
||||
}
|
||||
|
||||
}}}
|
||||
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
template <class _Tp, class _Alloc>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY uses_allocator<std::experimental::dynarray<_Tp>, _Alloc> : true_type {};
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // if _LIBCPP_STD_VER > 11
|
||||
#endif // _LIBCPP_DYNARRAY
|
||||
699
include/experimental/optional
Normal file
699
include/experimental/optional
Normal file
@@ -0,0 +1,699 @@
|
||||
// -*- C++ -*-
|
||||
//===-------------------------- optional ----------------------------------===//
|
||||
//
|
||||
// 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_OPTIONAL
|
||||
#define _LIBCPP_OPTIONAL
|
||||
|
||||
/*
|
||||
optional synopsis
|
||||
|
||||
// C++1y
|
||||
|
||||
#include <initializer_list>
|
||||
|
||||
namespace std { namespace experimental {
|
||||
|
||||
// optional for object types
|
||||
template <class T>
|
||||
class optional
|
||||
{
|
||||
public:
|
||||
typedef T value_type;
|
||||
|
||||
// constructors
|
||||
constexpr optional() noexcept;
|
||||
constexpr optional(nullopt_t) noexcept;
|
||||
optional(const optional&);
|
||||
optional(optional&&) noexcept(is_nothrow_move_constructible<T>::value);
|
||||
constexpr optional(const T&);
|
||||
constexpr optional(T&&);
|
||||
template <class... Args> constexpr explicit optional(in_place_t, Args&&...);
|
||||
template <class U, class... Args>
|
||||
constexpr explicit optional(in_place_t, initializer_list<U>, Args&&...);
|
||||
|
||||
// destructor
|
||||
~optional();
|
||||
|
||||
// assignment
|
||||
optional& operator=(nullopt_t) noexcept;
|
||||
optional& operator=(const optional&);
|
||||
optional& operator=(optional&&)
|
||||
noexcept(is_nothrow_move_assignable<T>::value &&
|
||||
is_nothrow_move_constructible<T>::value);
|
||||
template <class U> optional& operator=(U&&);
|
||||
template <class... Args> void emplace(Args&&...);
|
||||
template <class U, class... Args> void emplace(initializer_list<U>, Args&&...);
|
||||
|
||||
// swap
|
||||
void swap(optional&)
|
||||
noexcept(is_nothrow_move_constructible<T>::value &&
|
||||
noexcept(swap(declval<T&>(), declval<T&>())));
|
||||
|
||||
// observers
|
||||
constexpr T const* operator->() const;
|
||||
T* operator->();
|
||||
constexpr T const& operator*() const;
|
||||
T& operator*();
|
||||
constexpr explicit operator bool() const noexcept;
|
||||
constexpr T const& value() const;
|
||||
T& value();
|
||||
template <class U> constexpr T value_or(U&&) const&;
|
||||
template <class U> T value_or(U&&) &&;
|
||||
};
|
||||
|
||||
// In-place construction
|
||||
struct in_place_t{};
|
||||
constexpr in_place_t in_place{};
|
||||
|
||||
// Disengaged state indicator
|
||||
struct nullopt_t{see below};
|
||||
constexpr nullopt_t nullopt(unspecified);
|
||||
|
||||
// class bad_optional_access
|
||||
class bad_optional_access
|
||||
: public logic_error
|
||||
{
|
||||
public:
|
||||
explicit bad_optional_access(const string& what_arg);
|
||||
explicit bad_optional_access(const char* what_arg);
|
||||
};
|
||||
|
||||
// Relational operators
|
||||
template <class T> constexpr bool operator==(const optional<T>&, const optional<T>&);
|
||||
template <class T> constexpr bool operator< (const optional<T>&, const optional<T>&);
|
||||
|
||||
// Comparison with nullopt
|
||||
template <class T> constexpr bool operator==(const optional<T>&, nullopt_t) noexcept;
|
||||
template <class T> constexpr bool operator==(nullopt_t, const optional<T>&) noexcept;
|
||||
template <class T> constexpr bool operator<(const optional<T>&, nullopt_t) noexcept;
|
||||
template <class T> constexpr bool operator<(nullopt_t, const optional<T>&) noexcept;
|
||||
|
||||
// Comparison with T
|
||||
template <class T> constexpr bool operator==(const optional<T>&, const T&);
|
||||
template <class T> constexpr bool operator==(const T&, const optional<T>&);
|
||||
template <class T> constexpr bool operator<(const optional<T>&, const T&);
|
||||
template <class T> constexpr bool operator<(const T&, const optional<T>&);
|
||||
|
||||
// Specialized algorithms
|
||||
template <class T> void swap(optional<T>&, optional<T>&) noexcept(see below);
|
||||
template <class T> constexpr optional<typename decay<T>::type> make_optional(T&&);
|
||||
|
||||
// hash support
|
||||
template <class T> struct hash;
|
||||
template <class T> struct hash<optional<T>>;
|
||||
|
||||
}} // std::experimental
|
||||
|
||||
*/
|
||||
|
||||
#include <__config>
|
||||
#include <functional>
|
||||
#include <stdexcept>
|
||||
|
||||
namespace std { namespace experimental {
|
||||
|
||||
class _LIBCPP_EXCEPTION_ABI bad_optional_access
|
||||
: public logic_error
|
||||
{
|
||||
public:
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
_LIBCPP_INLINE_VISIBILITY explicit bad_optional_access(const string& __arg)
|
||||
: logic_error(__arg) {}
|
||||
_LIBCPP_INLINE_VISIBILITY explicit bad_optional_access(const char* __arg)
|
||||
: logic_error(__arg) {}
|
||||
_LIBCPP_INLINE_VISIBILITY bad_optional_access(const bad_optional_access&) noexcept = default;
|
||||
_LIBCPP_INLINE_VISIBILITY bad_optional_access& operator=(const bad_optional_access&) noexcept = default;
|
||||
#else
|
||||
private:
|
||||
bad_optional_access(const bad_optional_access&);
|
||||
bad_optional_access& operator=(const bad_optional_access&);
|
||||
public:
|
||||
#endif // _LIBCPP_STD_VER > 11
|
||||
// Get the key function ~bad_optional_access() into the dylib even if not compiling for C++1y
|
||||
virtual ~bad_optional_access() _NOEXCEPT;
|
||||
};
|
||||
|
||||
}} // std::experimental
|
||||
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
|
||||
#include <initializer_list>
|
||||
#include <type_traits>
|
||||
#include <new>
|
||||
#include <__functional_base>
|
||||
|
||||
#include <__undef_min_max>
|
||||
|
||||
#ifdef _LIBCPP_DEBUG
|
||||
# include <__debug>
|
||||
#else
|
||||
# define _LIBCPP_ASSERT(x, m) ((void)0)
|
||||
#endif
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
namespace std { namespace experimental { inline namespace __library_fundamentals_v1 {
|
||||
|
||||
struct in_place_t {};
|
||||
constexpr in_place_t in_place{};
|
||||
|
||||
struct nullopt_t
|
||||
{
|
||||
explicit constexpr nullopt_t(int) noexcept {}
|
||||
};
|
||||
|
||||
constexpr nullopt_t nullopt{0};
|
||||
|
||||
template <class _Tp, bool = is_trivially_destructible<_Tp>::value>
|
||||
class __optional_storage
|
||||
{
|
||||
protected:
|
||||
typedef _Tp value_type;
|
||||
union
|
||||
{
|
||||
char __null_state_;
|
||||
value_type __val_;
|
||||
};
|
||||
bool __engaged_ = false;
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
~__optional_storage()
|
||||
{
|
||||
if (__engaged_)
|
||||
__val_.~value_type();
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
constexpr __optional_storage() noexcept
|
||||
: __null_state_('\0') {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__optional_storage(const __optional_storage& __x)
|
||||
: __engaged_(__x.__engaged_)
|
||||
{
|
||||
if (__engaged_)
|
||||
::new(_VSTD::addressof(__val_)) value_type(__x.__val_);
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__optional_storage(__optional_storage&& __x)
|
||||
noexcept(is_nothrow_move_constructible<value_type>::value)
|
||||
: __engaged_(__x.__engaged_)
|
||||
{
|
||||
if (__engaged_)
|
||||
::new(_VSTD::addressof(__val_)) value_type(_VSTD::move(__x.__val_));
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
constexpr __optional_storage(const value_type& __v)
|
||||
: __val_(__v),
|
||||
__engaged_(true) {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
constexpr __optional_storage(value_type&& __v)
|
||||
: __val_(_VSTD::move(__v)),
|
||||
__engaged_(true) {}
|
||||
|
||||
template <class... _Args>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
constexpr
|
||||
explicit __optional_storage(in_place_t, _Args&&... __args)
|
||||
: __val_(_VSTD::forward<_Args>(__args)...),
|
||||
__engaged_(true) {}
|
||||
};
|
||||
|
||||
template <class _Tp>
|
||||
class __optional_storage<_Tp, true>
|
||||
{
|
||||
protected:
|
||||
typedef _Tp value_type;
|
||||
union
|
||||
{
|
||||
char __null_state_;
|
||||
value_type __val_;
|
||||
};
|
||||
bool __engaged_ = false;
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
constexpr __optional_storage() noexcept
|
||||
: __null_state_('\0') {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__optional_storage(const __optional_storage& __x)
|
||||
: __engaged_(__x.__engaged_)
|
||||
{
|
||||
if (__engaged_)
|
||||
::new(_VSTD::addressof(__val_)) value_type(__x.__val_);
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__optional_storage(__optional_storage&& __x)
|
||||
noexcept(is_nothrow_move_constructible<value_type>::value)
|
||||
: __engaged_(__x.__engaged_)
|
||||
{
|
||||
if (__engaged_)
|
||||
::new(_VSTD::addressof(__val_)) value_type(_VSTD::move(__x.__val_));
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
constexpr __optional_storage(const value_type& __v)
|
||||
: __val_(__v),
|
||||
__engaged_(true) {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
constexpr __optional_storage(value_type&& __v)
|
||||
: __val_(_VSTD::move(__v)),
|
||||
__engaged_(true) {}
|
||||
|
||||
template <class... _Args>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
constexpr
|
||||
explicit __optional_storage(in_place_t, _Args&&... __args)
|
||||
: __val_(_VSTD::forward<_Args>(__args)...),
|
||||
__engaged_(true) {}
|
||||
};
|
||||
|
||||
template <class _Tp>
|
||||
class optional
|
||||
: private __optional_storage<_Tp>
|
||||
{
|
||||
typedef __optional_storage<_Tp> __base;
|
||||
public:
|
||||
typedef _Tp value_type;
|
||||
|
||||
static_assert(!is_reference<value_type>::value,
|
||||
"Instantiation of optional with a reference type is ill-formed.");
|
||||
static_assert(!is_same<typename remove_cv<value_type>::type, in_place_t>::value,
|
||||
"Instantiation of optional with a in_place_t type is ill-formed.");
|
||||
static_assert(!is_same<typename remove_cv<value_type>::type, nullopt_t>::value,
|
||||
"Instantiation of optional with a nullopt_t type is ill-formed.");
|
||||
static_assert(is_object<value_type>::value,
|
||||
"Instantiation of optional with a non-object type is undefined behavior.");
|
||||
static_assert(is_nothrow_destructible<value_type>::value,
|
||||
"Instantiation of optional with an object type that is not noexcept destructible is undefined behavior.");
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY constexpr optional() noexcept {}
|
||||
_LIBCPP_INLINE_VISIBILITY optional(const optional&) = default;
|
||||
_LIBCPP_INLINE_VISIBILITY optional(optional&&) = default;
|
||||
_LIBCPP_INLINE_VISIBILITY ~optional() = default;
|
||||
_LIBCPP_INLINE_VISIBILITY constexpr optional(nullopt_t) noexcept {}
|
||||
_LIBCPP_INLINE_VISIBILITY constexpr optional(const value_type& __v)
|
||||
: __base(__v) {}
|
||||
_LIBCPP_INLINE_VISIBILITY constexpr optional(value_type&& __v)
|
||||
: __base(_VSTD::move(__v)) {}
|
||||
|
||||
template <class... _Args,
|
||||
class = typename enable_if
|
||||
<
|
||||
is_constructible<value_type, _Args...>::value
|
||||
>::type
|
||||
>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
constexpr
|
||||
explicit optional(in_place_t, _Args&&... __args)
|
||||
: __base(in_place, _VSTD::forward<_Args>(__args)...) {}
|
||||
|
||||
template <class _Up, class... _Args,
|
||||
class = typename enable_if
|
||||
<
|
||||
is_constructible<value_type, initializer_list<_Up>&, _Args...>::value
|
||||
>::type
|
||||
>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
constexpr
|
||||
explicit optional(in_place_t, initializer_list<_Up> __il, _Args&&... __args)
|
||||
: __base(in_place, __il, _VSTD::forward<_Args>(__args)...) {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
optional& operator=(nullopt_t) noexcept
|
||||
{
|
||||
if (this->__engaged_)
|
||||
{
|
||||
this->__val_.~value_type();
|
||||
this->__engaged_ = false;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
optional&
|
||||
operator=(const optional& __opt)
|
||||
{
|
||||
if (this->__engaged_ == __opt.__engaged_)
|
||||
{
|
||||
if (this->__engaged_)
|
||||
this->__val_ = __opt.__val_;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (this->__engaged_)
|
||||
this->__val_.~value_type();
|
||||
else
|
||||
::new(_VSTD::addressof(this->__val_)) value_type(__opt.__val_);
|
||||
this->__engaged_ = __opt.__engaged_;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
optional&
|
||||
operator=(optional&& __opt)
|
||||
noexcept(is_nothrow_move_assignable<value_type>::value &&
|
||||
is_nothrow_move_constructible<value_type>::value)
|
||||
{
|
||||
if (this->__engaged_ == __opt.__engaged_)
|
||||
{
|
||||
if (this->__engaged_)
|
||||
this->__val_ = _VSTD::move(__opt.__val_);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (this->__engaged_)
|
||||
this->__val_.~value_type();
|
||||
else
|
||||
::new(_VSTD::addressof(this->__val_)) value_type(_VSTD::move(__opt.__val_));
|
||||
this->__engaged_ = __opt.__engaged_;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <class _Up,
|
||||
class = typename enable_if
|
||||
<
|
||||
is_same<typename remove_reference<_Up>::type, value_type>::value &&
|
||||
is_constructible<value_type, _Up>::value &&
|
||||
is_assignable<value_type&, _Up>::value
|
||||
>::type
|
||||
>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
optional&
|
||||
operator=(_Up&& __v)
|
||||
{
|
||||
if (this->__engaged_)
|
||||
this->__val_ = _VSTD::forward<_Up>(__v);
|
||||
else
|
||||
{
|
||||
::new(_VSTD::addressof(this->__val_)) value_type(_VSTD::forward<_Up>(__v));
|
||||
this->__engaged_ = true;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <class... _Args,
|
||||
class = typename enable_if
|
||||
<
|
||||
is_constructible<value_type, _Args...>::value
|
||||
>::type
|
||||
>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
emplace(_Args&&... __args)
|
||||
{
|
||||
*this = nullopt;
|
||||
::new(_VSTD::addressof(this->__val_)) value_type(_VSTD::forward<_Args>(__args)...);
|
||||
this->__engaged_ = true;
|
||||
}
|
||||
|
||||
template <class _Up, class... _Args,
|
||||
class = typename enable_if
|
||||
<
|
||||
is_constructible<value_type, initializer_list<_Up>&, _Args...>::value
|
||||
>::type
|
||||
>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
emplace(initializer_list<_Up> __il, _Args&&... __args)
|
||||
{
|
||||
*this = nullopt;
|
||||
::new(_VSTD::addressof(this->__val_)) value_type(__il, _VSTD::forward<_Args>(__args)...);
|
||||
this->__engaged_ = true;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
swap(optional& __opt)
|
||||
noexcept(is_nothrow_move_constructible<value_type>::value &&
|
||||
__is_nothrow_swappable<value_type>::value)
|
||||
{
|
||||
using _VSTD::swap;
|
||||
if (this->__engaged_ == __opt.__engaged_)
|
||||
{
|
||||
if (this->__engaged_)
|
||||
swap(this->__val_, __opt.__val_);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (this->__engaged_)
|
||||
{
|
||||
::new(_VSTD::addressof(__opt.__val_)) value_type(_VSTD::move(this->__val_));
|
||||
this->__val_.~value_type();
|
||||
}
|
||||
else
|
||||
{
|
||||
::new(_VSTD::addressof(this->__val_)) value_type(_VSTD::move(__opt.__val_));
|
||||
__opt.__val_.~value_type();
|
||||
}
|
||||
swap(this->__engaged_, __opt.__engaged_);
|
||||
}
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
constexpr
|
||||
value_type const*
|
||||
operator->() const
|
||||
{
|
||||
_LIBCPP_ASSERT(this->__engaged_, "optional operator-> called for disengaged value");
|
||||
return __operator_arrow(__has_operator_addressof<value_type>{});
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
value_type*
|
||||
operator->()
|
||||
{
|
||||
_LIBCPP_ASSERT(this->__engaged_, "optional operator-> called for disengaged value");
|
||||
return _VSTD::addressof(this->__val_);
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
constexpr
|
||||
const value_type&
|
||||
operator*() const
|
||||
{
|
||||
_LIBCPP_ASSERT(this->__engaged_, "optional operator* called for disengaged value");
|
||||
return this->__val_;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
value_type&
|
||||
operator*()
|
||||
{
|
||||
_LIBCPP_ASSERT(this->__engaged_, "optional operator* called for disengaged value");
|
||||
return this->__val_;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
constexpr explicit operator bool() const noexcept {return this->__engaged_;}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
constexpr value_type const& value() const
|
||||
{
|
||||
if (!this->__engaged_)
|
||||
throw bad_optional_access("optional<T>::value: not engaged");
|
||||
return this->__val_;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
value_type& value()
|
||||
{
|
||||
if (!this->__engaged_)
|
||||
throw bad_optional_access("optional<T>::value: not engaged");
|
||||
return this->__val_;
|
||||
}
|
||||
|
||||
template <class _Up>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
constexpr value_type value_or(_Up&& __v) const&
|
||||
{
|
||||
static_assert(is_copy_constructible<value_type>::value,
|
||||
"optional<T>::value_or: T must be copy constructible");
|
||||
static_assert(is_convertible<_Up, value_type>::value,
|
||||
"optional<T>::value_or: U must be convertible to T");
|
||||
return this->__engaged_ ? this->__val_ :
|
||||
static_cast<value_type>(_VSTD::forward<_Up>(__v));
|
||||
}
|
||||
|
||||
template <class _Up>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
value_type value_or(_Up&& __v) &&
|
||||
{
|
||||
static_assert(is_move_constructible<value_type>::value,
|
||||
"optional<T>::value_or: T must be move constructible");
|
||||
static_assert(is_convertible<_Up, value_type>::value,
|
||||
"optional<T>::value_or: U must be convertible to T");
|
||||
return this->__engaged_ ? _VSTD::move(this->__val_) :
|
||||
static_cast<value_type>(_VSTD::forward<_Up>(__v));
|
||||
}
|
||||
|
||||
private:
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
value_type const*
|
||||
__operator_arrow(true_type) const
|
||||
{
|
||||
return _VSTD::addressof(this->__val_);
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
constexpr
|
||||
value_type const*
|
||||
__operator_arrow(false_type) const
|
||||
{
|
||||
return &this->__val_;
|
||||
}
|
||||
};
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
constexpr
|
||||
bool
|
||||
operator==(const optional<_Tp>& __x, const optional<_Tp>& __y)
|
||||
{
|
||||
if (static_cast<bool>(__x) != static_cast<bool>(__y))
|
||||
return false;
|
||||
if (!static_cast<bool>(__x))
|
||||
return true;
|
||||
return *__x == *__y;
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
constexpr
|
||||
bool
|
||||
operator<(const optional<_Tp>& __x, const optional<_Tp>& __y)
|
||||
{
|
||||
if (!static_cast<bool>(__y))
|
||||
return false;
|
||||
if (!static_cast<bool>(__x))
|
||||
return true;
|
||||
return less<_Tp>{}(*__x, *__y);
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
constexpr
|
||||
bool
|
||||
operator==(const optional<_Tp>& __x, nullopt_t) noexcept
|
||||
{
|
||||
return !static_cast<bool>(__x);
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
constexpr
|
||||
bool
|
||||
operator==(nullopt_t, const optional<_Tp>& __x) noexcept
|
||||
{
|
||||
return !static_cast<bool>(__x);
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
constexpr
|
||||
bool
|
||||
operator<(const optional<_Tp>&, nullopt_t) noexcept
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
constexpr
|
||||
bool
|
||||
operator<(nullopt_t, const optional<_Tp>& __x) noexcept
|
||||
{
|
||||
return static_cast<bool>(__x);
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
constexpr
|
||||
bool
|
||||
operator==(const optional<_Tp>& __x, const _Tp& __v)
|
||||
{
|
||||
return static_cast<bool>(__x) ? *__x == __v : false;
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
constexpr
|
||||
bool
|
||||
operator==(const _Tp& __v, const optional<_Tp>& __x)
|
||||
{
|
||||
return static_cast<bool>(__x) ? *__x == __v : false;
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
constexpr
|
||||
bool
|
||||
operator<(const optional<_Tp>& __x, const _Tp& __v)
|
||||
{
|
||||
return static_cast<bool>(__x) ? less<_Tp>{}(*__x, __v) : true;
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
constexpr
|
||||
bool
|
||||
operator<(const _Tp& __v, const optional<_Tp>& __x)
|
||||
{
|
||||
return static_cast<bool>(__x) ? less<_Tp>{}(__v, *__x) : false;
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
swap(optional<_Tp>& __x, optional<_Tp>& __y) noexcept(noexcept(__x.swap(__y)))
|
||||
{
|
||||
__x.swap(__y);
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
constexpr
|
||||
optional<typename decay<_Tp>::type>
|
||||
make_optional(_Tp&& __v)
|
||||
{
|
||||
return optional<typename decay<_Tp>::type>(_VSTD::forward<_Tp>(__v));
|
||||
}
|
||||
|
||||
}}} // namespace std::experimental::__library_fundamentals_v1
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _Tp>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY hash<std::experimental::optional<_Tp> >
|
||||
{
|
||||
typedef std::experimental::optional<_Tp> argument_type;
|
||||
typedef size_t result_type;
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
result_type operator()(const argument_type& __opt) const _NOEXCEPT
|
||||
{
|
||||
return static_cast<bool>(__opt) ? hash<_Tp>()(*__opt) : 0;
|
||||
}
|
||||
};
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP_STD_VER > 11
|
||||
|
||||
#endif // _LIBCPP_ARRAY
|
||||
@@ -19,10 +19,10 @@
|
||||
namespace __gnu_cxx {
|
||||
using namespace std;
|
||||
|
||||
template <typename T> struct _LIBCPP_VISIBLE hash : public std::hash<T>
|
||||
template <typename _Tp> struct _LIBCPP_TYPE_VIS_ONLY hash : public std::hash<_Tp>
|
||||
{ };
|
||||
|
||||
template <> struct _LIBCPP_VISIBLE hash<const char*>
|
||||
template <> struct _LIBCPP_TYPE_VIS_ONLY hash<const char*>
|
||||
: public unary_function<const char*, size_t>
|
||||
{
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
@@ -32,7 +32,7 @@ template <> struct _LIBCPP_VISIBLE hash<const char*>
|
||||
}
|
||||
};
|
||||
|
||||
template <> struct _LIBCPP_VISIBLE hash<char *>
|
||||
template <> struct _LIBCPP_TYPE_VIS_ONLY hash<char *>
|
||||
: public unary_function<char*, size_t>
|
||||
{
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
|
||||
@@ -206,7 +206,11 @@ template <class Key, class T, class Hash, class Pred, class Alloc>
|
||||
#include <ext/__hash>
|
||||
|
||||
#if __DEPRECATED
|
||||
#warning Use of the header <ext/hash_map> is deprecated. Migrate to <unordered_map>
|
||||
#if defined(_MSC_VER) && ! defined(__clang__)
|
||||
_LIBCPP_WARNING("Use of the header <ext/hash_map> is deprecated. Migrate to <unordered_map>")
|
||||
#else
|
||||
# warning Use of the header <ext/hash_map> is deprecated. Migrate to <unordered_map>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#pragma GCC system_header
|
||||
@@ -361,7 +365,7 @@ public:
|
||||
};
|
||||
|
||||
template <class _HashIterator>
|
||||
class _LIBCPP_VISIBLE __hash_map_iterator
|
||||
class _LIBCPP_TYPE_VIS_ONLY __hash_map_iterator
|
||||
{
|
||||
_HashIterator __i_;
|
||||
|
||||
@@ -404,15 +408,15 @@ public:
|
||||
bool operator!=(const __hash_map_iterator& __x, const __hash_map_iterator& __y)
|
||||
{return __x.__i_ != __y.__i_;}
|
||||
|
||||
template <class, class, class, class, class> friend class _LIBCPP_VISIBLE hash_map;
|
||||
template <class, class, class, class, class> friend class _LIBCPP_VISIBLE hash_multimap;
|
||||
template <class> friend class _LIBCPP_VISIBLE __hash_const_iterator;
|
||||
template <class> friend class _LIBCPP_VISIBLE __hash_const_local_iterator;
|
||||
template <class> friend class _LIBCPP_VISIBLE __hash_map_const_iterator;
|
||||
template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY hash_map;
|
||||
template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY hash_multimap;
|
||||
template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_iterator;
|
||||
template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_local_iterator;
|
||||
template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_map_const_iterator;
|
||||
};
|
||||
|
||||
template <class _HashIterator>
|
||||
class _LIBCPP_VISIBLE __hash_map_const_iterator
|
||||
class _LIBCPP_TYPE_VIS_ONLY __hash_map_const_iterator
|
||||
{
|
||||
_HashIterator __i_;
|
||||
|
||||
@@ -463,15 +467,15 @@ public:
|
||||
bool operator!=(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y)
|
||||
{return __x.__i_ != __y.__i_;}
|
||||
|
||||
template <class, class, class, class, class> friend class _LIBCPP_VISIBLE hash_map;
|
||||
template <class, class, class, class, class> friend class _LIBCPP_VISIBLE hash_multimap;
|
||||
template <class> friend class _LIBCPP_VISIBLE __hash_const_iterator;
|
||||
template <class> friend class _LIBCPP_VISIBLE __hash_const_local_iterator;
|
||||
template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY hash_map;
|
||||
template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY hash_multimap;
|
||||
template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_iterator;
|
||||
template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_local_iterator;
|
||||
};
|
||||
|
||||
template <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>,
|
||||
class _Alloc = allocator<pair<const _Key, _Tp> > >
|
||||
class _LIBCPP_VISIBLE hash_map
|
||||
class _LIBCPP_TYPE_VIS_ONLY hash_map
|
||||
{
|
||||
public:
|
||||
// types
|
||||
@@ -684,7 +688,7 @@ hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node(const key_type& __k)
|
||||
__h.get_deleter().__first_constructed = true;
|
||||
__node_traits::construct(__na, _VSTD::addressof(__h->__value_.second));
|
||||
__h.get_deleter().__second_constructed = true;
|
||||
return _VSTD::move(__h);
|
||||
return _VSTD::move(__h); // explicitly moved for C++03
|
||||
}
|
||||
|
||||
template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
|
||||
@@ -750,7 +754,7 @@ operator!=(const hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x,
|
||||
|
||||
template <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>,
|
||||
class _Alloc = allocator<pair<const _Key, _Tp> > >
|
||||
class _LIBCPP_VISIBLE hash_multimap
|
||||
class _LIBCPP_TYPE_VIS_ONLY hash_multimap
|
||||
{
|
||||
public:
|
||||
// types
|
||||
|
||||
@@ -199,7 +199,11 @@ template <class Value, class Hash, class Pred, class Alloc>
|
||||
#include <ext/__hash>
|
||||
|
||||
#if __DEPRECATED
|
||||
#warning Use of the header <ext/hash_set> is deprecated. Migrate to <unordered_set>
|
||||
#if defined(_MSC_VER) && ! defined(__clang__)
|
||||
_LIBCPP_WARNING("Use of the header <ext/hash_set> is deprecated. Migrate to <unordered_set>")
|
||||
#else
|
||||
# warning Use of the header <ext/hash_set> is deprecated. Migrate to <unordered_set>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
namespace __gnu_cxx {
|
||||
@@ -208,7 +212,7 @@ using namespace std;
|
||||
|
||||
template <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>,
|
||||
class _Alloc = allocator<_Value> >
|
||||
class _LIBCPP_VISIBLE hash_set
|
||||
class _LIBCPP_TYPE_VIS_ONLY hash_set
|
||||
{
|
||||
public:
|
||||
// types
|
||||
@@ -429,7 +433,7 @@ operator!=(const hash_set<_Value, _Hash, _Pred, _Alloc>& __x,
|
||||
|
||||
template <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>,
|
||||
class _Alloc = allocator<_Value> >
|
||||
class _LIBCPP_VISIBLE hash_multiset
|
||||
class _LIBCPP_TYPE_VIS_ONLY hash_multiset
|
||||
{
|
||||
public:
|
||||
// types
|
||||
|
||||
@@ -38,6 +38,7 @@ public:
|
||||
noexcept(is_nothrow_default_constructible<allocator_type>::value);
|
||||
explicit forward_list(const allocator_type& a);
|
||||
explicit forward_list(size_type n);
|
||||
explicit forward_list(size_type n, const allocator_type& a); // C++14
|
||||
forward_list(size_type n, const value_type& v);
|
||||
forward_list(size_type n, const value_type& v, const allocator_type& a);
|
||||
template <class InputIterator>
|
||||
@@ -212,11 +213,11 @@ struct __forward_list_node
|
||||
value_type __value_;
|
||||
};
|
||||
|
||||
template<class _Tp, class _Alloc> class _LIBCPP_VISIBLE forward_list;
|
||||
template<class _NodeConstPtr> class _LIBCPP_VISIBLE __forward_list_const_iterator;
|
||||
template<class _Tp, class _Alloc> class _LIBCPP_TYPE_VIS_ONLY forward_list;
|
||||
template<class _NodeConstPtr> class _LIBCPP_TYPE_VIS_ONLY __forward_list_const_iterator;
|
||||
|
||||
template <class _NodePtr>
|
||||
class _LIBCPP_VISIBLE __forward_list_iterator
|
||||
class _LIBCPP_TYPE_VIS_ONLY __forward_list_iterator
|
||||
{
|
||||
typedef _NodePtr __node_pointer;
|
||||
|
||||
@@ -225,14 +226,14 @@ class _LIBCPP_VISIBLE __forward_list_iterator
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit __forward_list_iterator(__node_pointer __p) _NOEXCEPT : __ptr_(__p) {}
|
||||
|
||||
template<class, class> friend class _LIBCPP_VISIBLE forward_list;
|
||||
template<class> friend class _LIBCPP_VISIBLE __forward_list_const_iterator;
|
||||
template<class, class> friend class _LIBCPP_TYPE_VIS_ONLY forward_list;
|
||||
template<class> friend class _LIBCPP_TYPE_VIS_ONLY __forward_list_const_iterator;
|
||||
|
||||
public:
|
||||
typedef forward_iterator_tag iterator_category;
|
||||
typedef typename pointer_traits<__node_pointer>::element_type::value_type
|
||||
value_type;
|
||||
typedef value_type& reference;
|
||||
typedef value_type& reference;
|
||||
typedef typename pointer_traits<__node_pointer>::difference_type
|
||||
difference_type;
|
||||
typedef typename pointer_traits<__node_pointer>::template
|
||||
@@ -249,7 +250,7 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
reference operator*() const {return __ptr_->__value_;}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
pointer operator->() const {return &__ptr_->__value_;}
|
||||
pointer operator->() const {return pointer_traits<pointer>::pointer_to(__ptr_->__value_);}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__forward_list_iterator& operator++()
|
||||
@@ -276,7 +277,7 @@ public:
|
||||
};
|
||||
|
||||
template <class _NodeConstPtr>
|
||||
class _LIBCPP_VISIBLE __forward_list_const_iterator
|
||||
class _LIBCPP_TYPE_VIS_ONLY __forward_list_const_iterator
|
||||
{
|
||||
typedef _NodeConstPtr __node_const_pointer;
|
||||
|
||||
@@ -303,7 +304,7 @@ class _LIBCPP_VISIBLE __forward_list_const_iterator
|
||||
public:
|
||||
typedef forward_iterator_tag iterator_category;
|
||||
typedef typename __node::value_type value_type;
|
||||
typedef const value_type& reference;
|
||||
typedef const value_type& reference;
|
||||
typedef typename pointer_traits<__node_const_pointer>::difference_type
|
||||
difference_type;
|
||||
typedef typename pointer_traits<__node_const_pointer>::template
|
||||
@@ -323,7 +324,7 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
reference operator*() const {return __ptr_->__value_;}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
pointer operator->() const {return &__ptr_->__value_;}
|
||||
pointer operator->() const {return pointer_traits<pointer>::pointer_to(__ptr_->__value_);}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__forward_list_const_iterator& operator++()
|
||||
@@ -368,18 +369,27 @@ protected:
|
||||
__node_allocator;
|
||||
typedef allocator_traits<__node_allocator> __node_traits;
|
||||
typedef typename __node_traits::pointer __node_pointer;
|
||||
typedef typename __node_traits::const_pointer __node_const_pointer;
|
||||
typedef typename __node_traits::pointer __node_const_pointer;
|
||||
|
||||
typedef typename allocator_traits<allocator_type>::template
|
||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
rebind_alloc<__begin_node>
|
||||
#else
|
||||
rebind_alloc<__begin_node>::other
|
||||
#endif
|
||||
__begin_node_allocator;
|
||||
typedef typename allocator_traits<__begin_node_allocator>::pointer __begin_node_pointer;
|
||||
|
||||
__compressed_pair<__begin_node, __node_allocator> __before_begin_;
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__node_pointer __before_begin() _NOEXCEPT
|
||||
{return pointer_traits<__node_pointer>::pointer_to(
|
||||
static_cast<__node&>(__before_begin_.first()));}
|
||||
{return static_cast<__node_pointer>(pointer_traits<__begin_node_pointer>::
|
||||
pointer_to(__before_begin_.first()));}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__node_const_pointer __before_begin() const _NOEXCEPT
|
||||
{return pointer_traits<__node_const_pointer>::pointer_to(
|
||||
static_cast<const __node&>(__before_begin_.first()));}
|
||||
{return static_cast<__node_const_pointer>(pointer_traits<__begin_node_pointer>::
|
||||
pointer_to(const_cast<__begin_node&>(__before_begin_.first())));}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__node_allocator& __alloc() _NOEXCEPT
|
||||
@@ -389,7 +399,7 @@ protected:
|
||||
{return __before_begin_.second();}
|
||||
|
||||
typedef __forward_list_iterator<__node_pointer> iterator;
|
||||
typedef __forward_list_const_iterator<__node_const_pointer> const_iterator;
|
||||
typedef __forward_list_const_iterator<__node_pointer> const_iterator;
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__forward_list_base()
|
||||
@@ -533,7 +543,7 @@ __forward_list_base<_Tp, _Alloc>::clear() _NOEXCEPT
|
||||
}
|
||||
|
||||
template <class _Tp, class _Alloc = allocator<_Tp> >
|
||||
class _LIBCPP_VISIBLE forward_list
|
||||
class _LIBCPP_TYPE_VIS_ONLY forward_list
|
||||
: private __forward_list_base<_Tp, _Alloc>
|
||||
{
|
||||
typedef __forward_list_base<_Tp, _Alloc> base;
|
||||
@@ -562,6 +572,9 @@ public:
|
||||
{} // = default;
|
||||
explicit forward_list(const allocator_type& __a);
|
||||
explicit forward_list(size_type __n);
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
explicit forward_list(size_type __n, const allocator_type& __a);
|
||||
#endif
|
||||
forward_list(size_type __n, const value_type& __v);
|
||||
forward_list(size_type __n, const value_type& __v, const allocator_type& __a);
|
||||
template <class _InputIterator>
|
||||
@@ -785,6 +798,28 @@ forward_list<_Tp, _Alloc>::forward_list(size_type __n)
|
||||
}
|
||||
}
|
||||
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
template <class _Tp, class _Alloc>
|
||||
forward_list<_Tp, _Alloc>::forward_list(size_type __n, const allocator_type& __a)
|
||||
: base ( __a )
|
||||
{
|
||||
if (__n > 0)
|
||||
{
|
||||
__node_allocator& __a = base::__alloc();
|
||||
typedef __allocator_destructor<__node_allocator> _Dp;
|
||||
unique_ptr<__node, _Dp> __h(nullptr, _Dp(__a, 1));
|
||||
for (__node_pointer __p = base::__before_begin(); __n > 0; --__n,
|
||||
__p = __p->__next_)
|
||||
{
|
||||
__h.reset(__node_traits::allocate(__a, 1));
|
||||
__node_traits::construct(__a, _VSTD::addressof(__h->__value_));
|
||||
__h->__next_ = nullptr;
|
||||
__p->__next_ = __h.release();
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
template <class _Tp, class _Alloc>
|
||||
forward_list<_Tp, _Alloc>::forward_list(size_type __n, const value_type& __v)
|
||||
{
|
||||
@@ -1050,7 +1085,7 @@ template <class... _Args>
|
||||
typename forward_list<_Tp, _Alloc>::iterator
|
||||
forward_list<_Tp, _Alloc>::emplace_after(const_iterator __p, _Args&&... __args)
|
||||
{
|
||||
__node_pointer const __r = const_cast<__node_pointer>(__p.__ptr_);
|
||||
__node_pointer const __r = __p.__ptr_;
|
||||
__node_allocator& __a = base::__alloc();
|
||||
typedef __allocator_destructor<__node_allocator> _Dp;
|
||||
unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1));
|
||||
@@ -1067,7 +1102,7 @@ template <class _Tp, class _Alloc>
|
||||
typename forward_list<_Tp, _Alloc>::iterator
|
||||
forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, value_type&& __v)
|
||||
{
|
||||
__node_pointer const __r = const_cast<__node_pointer>(__p.__ptr_);
|
||||
__node_pointer const __r = __p.__ptr_;
|
||||
__node_allocator& __a = base::__alloc();
|
||||
typedef __allocator_destructor<__node_allocator> _Dp;
|
||||
unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1));
|
||||
@@ -1083,7 +1118,7 @@ template <class _Tp, class _Alloc>
|
||||
typename forward_list<_Tp, _Alloc>::iterator
|
||||
forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, const value_type& __v)
|
||||
{
|
||||
__node_pointer const __r = const_cast<__node_pointer>(__p.__ptr_);
|
||||
__node_pointer const __r = __p.__ptr_;
|
||||
__node_allocator& __a = base::__alloc();
|
||||
typedef __allocator_destructor<__node_allocator> _Dp;
|
||||
unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1));
|
||||
@@ -1098,7 +1133,7 @@ typename forward_list<_Tp, _Alloc>::iterator
|
||||
forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, size_type __n,
|
||||
const value_type& __v)
|
||||
{
|
||||
__node_pointer __r = const_cast<__node_pointer>(__p.__ptr_);
|
||||
__node_pointer __r = __p.__ptr_;
|
||||
if (__n > 0)
|
||||
{
|
||||
__node_allocator& __a = base::__alloc();
|
||||
@@ -1148,7 +1183,7 @@ typename enable_if
|
||||
forward_list<_Tp, _Alloc>::insert_after(const_iterator __p,
|
||||
_InputIterator __f, _InputIterator __l)
|
||||
{
|
||||
__node_pointer __r = const_cast<__node_pointer>(__p.__ptr_);
|
||||
__node_pointer __r = __p.__ptr_;
|
||||
if (__f != __l)
|
||||
{
|
||||
__node_allocator& __a = base::__alloc();
|
||||
@@ -1192,7 +1227,7 @@ template <class _Tp, class _Alloc>
|
||||
typename forward_list<_Tp, _Alloc>::iterator
|
||||
forward_list<_Tp, _Alloc>::erase_after(const_iterator __f)
|
||||
{
|
||||
__node_pointer __p = const_cast<__node_pointer>(__f.__ptr_);
|
||||
__node_pointer __p = __f.__ptr_;
|
||||
__node_pointer __n = __p->__next_;
|
||||
__p->__next_ = __n->__next_;
|
||||
__node_allocator& __a = base::__alloc();
|
||||
@@ -1205,10 +1240,10 @@ template <class _Tp, class _Alloc>
|
||||
typename forward_list<_Tp, _Alloc>::iterator
|
||||
forward_list<_Tp, _Alloc>::erase_after(const_iterator __f, const_iterator __l)
|
||||
{
|
||||
__node_pointer __e = const_cast<__node_pointer>(__l.__ptr_);
|
||||
__node_pointer __e = __l.__ptr_;
|
||||
if (__f != __l)
|
||||
{
|
||||
__node_pointer __p = const_cast<__node_pointer>(__f.__ptr_);
|
||||
__node_pointer __p = __f.__ptr_;
|
||||
__node_pointer __n = __p->__next_;
|
||||
if (__n != __e)
|
||||
{
|
||||
@@ -1302,12 +1337,10 @@ forward_list<_Tp, _Alloc>::splice_after(const_iterator __p,
|
||||
const_iterator __lm1 = __x.before_begin();
|
||||
while (__lm1.__ptr_->__next_ != nullptr)
|
||||
++__lm1;
|
||||
const_cast<__node_pointer>(__lm1.__ptr_)->__next_ =
|
||||
const_cast<__node_pointer>(__p.__ptr_)->__next_;
|
||||
__lm1.__ptr_->__next_ = __p.__ptr_->__next_;
|
||||
}
|
||||
const_cast<__node_pointer>(__p.__ptr_)->__next_ =
|
||||
const_cast<__node_pointer>(__x.__before_begin())->__next_;
|
||||
const_cast<__node_pointer>(__x.__before_begin())->__next_ = nullptr;
|
||||
__p.__ptr_->__next_ = __x.__before_begin()->__next_;
|
||||
__x.__before_begin()->__next_ = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1320,12 +1353,9 @@ forward_list<_Tp, _Alloc>::splice_after(const_iterator __p,
|
||||
const_iterator __lm1 = _VSTD::next(__i);
|
||||
if (__p != __i && __p != __lm1)
|
||||
{
|
||||
const_cast<__node_pointer>(__i.__ptr_)->__next_ =
|
||||
const_cast<__node_pointer>(__lm1.__ptr_)->__next_;
|
||||
const_cast<__node_pointer>(__lm1.__ptr_)->__next_ =
|
||||
const_cast<__node_pointer>(__p.__ptr_)->__next_;
|
||||
const_cast<__node_pointer>(__p.__ptr_)->__next_ =
|
||||
const_cast<__node_pointer>(__lm1.__ptr_);
|
||||
__i.__ptr_->__next_ = __lm1.__ptr_->__next_;
|
||||
__lm1.__ptr_->__next_ = __p.__ptr_->__next_;
|
||||
__p.__ptr_->__next_ = __lm1.__ptr_;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1342,12 +1372,9 @@ forward_list<_Tp, _Alloc>::splice_after(const_iterator __p,
|
||||
++__lm1;
|
||||
if (__f != __lm1)
|
||||
{
|
||||
const_cast<__node_pointer>(__lm1.__ptr_)->__next_ =
|
||||
const_cast<__node_pointer>(__p.__ptr_)->__next_;
|
||||
const_cast<__node_pointer>(__p.__ptr_)->__next_ =
|
||||
const_cast<__node_pointer>(__f.__ptr_)->__next_;
|
||||
const_cast<__node_pointer>(__f.__ptr_)->__next_ =
|
||||
const_cast<__node_pointer>(__l.__ptr_);
|
||||
__lm1.__ptr_->__next_ = __p.__ptr_->__next_;
|
||||
__p.__ptr_->__next_ = __f.__ptr_->__next_;
|
||||
__f.__ptr_->__next_ = __l.__ptr_;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -180,7 +180,7 @@ typedef basic_fstream<wchar_t> wfstream;
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
class _LIBCPP_VISIBLE basic_filebuf
|
||||
class _LIBCPP_TYPE_VIS_ONLY basic_filebuf
|
||||
: public basic_streambuf<_CharT, _Traits>
|
||||
{
|
||||
public:
|
||||
@@ -807,9 +807,15 @@ basic_filebuf<_CharT, _Traits>::seekoff(off_type __off, ios_base::seekdir __way,
|
||||
default:
|
||||
return pos_type(off_type(-1));
|
||||
}
|
||||
#if _WIN32
|
||||
if (fseek(__file_, __width > 0 ? __width * __off : 0, __whence))
|
||||
return pos_type(off_type(-1));
|
||||
pos_type __r = ftell(__file_);
|
||||
#else
|
||||
if (fseeko(__file_, __width > 0 ? __width * __off : 0, __whence))
|
||||
return pos_type(off_type(-1));
|
||||
pos_type __r = ftello(__file_);
|
||||
#endif
|
||||
__r.state(__st_);
|
||||
return __r;
|
||||
}
|
||||
@@ -820,8 +826,13 @@ basic_filebuf<_CharT, _Traits>::seekpos(pos_type __sp, ios_base::openmode)
|
||||
{
|
||||
if (__file_ == 0 || sync())
|
||||
return pos_type(off_type(-1));
|
||||
#if _WIN32
|
||||
if (fseek(__file_, __sp, SEEK_SET))
|
||||
return pos_type(off_type(-1));
|
||||
#else
|
||||
if (fseeko(__file_, __sp, SEEK_SET))
|
||||
return pos_type(off_type(-1));
|
||||
#endif
|
||||
__st_ = __sp.state();
|
||||
return __sp;
|
||||
}
|
||||
@@ -880,8 +891,13 @@ basic_filebuf<_CharT, _Traits>::sync()
|
||||
}
|
||||
}
|
||||
}
|
||||
#if _WIN32
|
||||
if (fseek(__file_, -__c, SEEK_CUR))
|
||||
return -1;
|
||||
#else
|
||||
if (fseeko(__file_, -__c, SEEK_CUR))
|
||||
return -1;
|
||||
#endif
|
||||
if (__update_st)
|
||||
__st_ = __state;
|
||||
__extbufnext_ = __extbufend_ = __extbuf_;
|
||||
@@ -978,7 +994,7 @@ basic_filebuf<_CharT, _Traits>::__write_mode()
|
||||
// basic_ifstream
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
class _LIBCPP_VISIBLE basic_ifstream
|
||||
class _LIBCPP_TYPE_VIS_ONLY basic_ifstream
|
||||
: public basic_istream<_CharT, _Traits>
|
||||
{
|
||||
public:
|
||||
@@ -1123,7 +1139,7 @@ basic_ifstream<_CharT, _Traits>::close()
|
||||
// basic_ofstream
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
class _LIBCPP_VISIBLE basic_ofstream
|
||||
class _LIBCPP_TYPE_VIS_ONLY basic_ofstream
|
||||
: public basic_ostream<_CharT, _Traits>
|
||||
{
|
||||
public:
|
||||
@@ -1268,7 +1284,7 @@ basic_ofstream<_CharT, _Traits>::close()
|
||||
// basic_fstream
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
class _LIBCPP_VISIBLE basic_fstream
|
||||
class _LIBCPP_TYPE_VIS_ONLY basic_fstream
|
||||
: public basic_iostream<_CharT, _Traits>
|
||||
{
|
||||
public:
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
204
include/future
204
include/future
@@ -19,10 +19,10 @@ namespace std
|
||||
|
||||
enum class future_errc
|
||||
{
|
||||
broken_promise,
|
||||
future_already_retrieved,
|
||||
future_already_retrieved = 1,
|
||||
promise_already_satisfied,
|
||||
no_state
|
||||
no_state,
|
||||
broken_promise
|
||||
};
|
||||
|
||||
enum class launch
|
||||
@@ -309,11 +309,11 @@ public:
|
||||
};
|
||||
|
||||
template <class F, class... Args>
|
||||
future<typename result_of<F(Args...)>::type>
|
||||
future<typename result_of<typename decay<F>::type(typename decay<Args>::type...)>::type>
|
||||
async(F&& f, Args&&... args);
|
||||
|
||||
template <class F, class... Args>
|
||||
future<typename result_of<F(Args...)>::type>
|
||||
future<typename result_of<typename decay<F>::type(typename decay<Args>::type...)>::type>
|
||||
async(launch policy, F&& f, Args&&... args);
|
||||
|
||||
template <class> class packaged_task; // undefined
|
||||
@@ -379,19 +379,19 @@ _LIBCPP_BEGIN_NAMESPACE_STD
|
||||
//enum class future_errc
|
||||
_LIBCPP_DECLARE_STRONG_ENUM(future_errc)
|
||||
{
|
||||
broken_promise,
|
||||
future_already_retrieved,
|
||||
future_already_retrieved = 1,
|
||||
promise_already_satisfied,
|
||||
no_state
|
||||
no_state,
|
||||
broken_promise
|
||||
};
|
||||
_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(future_errc)
|
||||
|
||||
template <>
|
||||
struct _LIBCPP_VISIBLE is_error_code_enum<future_errc> : public true_type {};
|
||||
struct _LIBCPP_TYPE_VIS_ONLY is_error_code_enum<future_errc> : public true_type {};
|
||||
|
||||
#ifdef _LIBCPP_HAS_NO_STRONG_ENUMS
|
||||
template <>
|
||||
struct _LIBCPP_VISIBLE is_error_code_enum<future_errc::__lx> : public true_type { };
|
||||
struct _LIBCPP_TYPE_VIS_ONLY is_error_code_enum<future_errc::__lx> : public true_type { };
|
||||
#endif
|
||||
|
||||
//enum class launch
|
||||
@@ -403,6 +403,72 @@ _LIBCPP_DECLARE_STRONG_ENUM(launch)
|
||||
};
|
||||
_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(launch)
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_STRONG_ENUMS
|
||||
|
||||
#ifdef _LIBCXX_UNDERLYING_TYPE
|
||||
typedef underlying_type<launch>::type __launch_underlying_type;
|
||||
#else
|
||||
typedef int __launch_underlying_type;
|
||||
#endif
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_CONSTEXPR
|
||||
launch
|
||||
operator&(launch __x, launch __y)
|
||||
{
|
||||
return static_cast<launch>(static_cast<__launch_underlying_type>(__x) &
|
||||
static_cast<__launch_underlying_type>(__y));
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_CONSTEXPR
|
||||
launch
|
||||
operator|(launch __x, launch __y)
|
||||
{
|
||||
return static_cast<launch>(static_cast<__launch_underlying_type>(__x) |
|
||||
static_cast<__launch_underlying_type>(__y));
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_CONSTEXPR
|
||||
launch
|
||||
operator^(launch __x, launch __y)
|
||||
{
|
||||
return static_cast<launch>(static_cast<__launch_underlying_type>(__x) ^
|
||||
static_cast<__launch_underlying_type>(__y));
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_CONSTEXPR
|
||||
launch
|
||||
operator~(launch __x)
|
||||
{
|
||||
return static_cast<launch>(~static_cast<__launch_underlying_type>(__x) & 3);
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
launch&
|
||||
operator&=(launch& __x, launch __y)
|
||||
{
|
||||
__x = __x & __y; return __x;
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
launch&
|
||||
operator|=(launch& __x, launch __y)
|
||||
{
|
||||
__x = __x | __y; return __x;
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
launch&
|
||||
operator^=(launch& __x, launch __y)
|
||||
{
|
||||
__x = __x ^ __y; return __x;
|
||||
}
|
||||
|
||||
#endif // !_LIBCPP_HAS_NO_STRONG_ENUMS
|
||||
|
||||
//enum class future_status
|
||||
_LIBCPP_DECLARE_STRONG_ENUM(future_status)
|
||||
{
|
||||
@@ -412,7 +478,7 @@ _LIBCPP_DECLARE_STRONG_ENUM(future_status)
|
||||
};
|
||||
_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(future_status)
|
||||
|
||||
_LIBCPP_VISIBLE
|
||||
_LIBCPP_FUNC_VIS
|
||||
const error_category& future_category() _NOEXCEPT;
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
@@ -442,7 +508,7 @@ public:
|
||||
virtual ~future_error() _NOEXCEPT;
|
||||
};
|
||||
|
||||
class __assoc_sub_state
|
||||
class _LIBCPP_TYPE_VIS __assoc_sub_state
|
||||
: public __shared_count
|
||||
{
|
||||
protected:
|
||||
@@ -470,16 +536,20 @@ public:
|
||||
{return (__state_ & __constructed) || (__exception_ != nullptr);}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
void __set_future_attached() {__state_ |= __future_attached;}
|
||||
void __set_future_attached()
|
||||
{
|
||||
lock_guard<mutex> __lk(__mut_);
|
||||
__state_ |= __future_attached;
|
||||
}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
bool __has_future_attached() const {return __state_ & __future_attached;}
|
||||
bool __has_future_attached() const {return (__state_ & __future_attached) != 0;}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
void __set_deferred() {__state_ |= deferred;}
|
||||
|
||||
void __make_ready();
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
bool __is_ready() const {return __state_ & ready;}
|
||||
bool __is_ready() const {return (__state_ & ready) != 0;}
|
||||
|
||||
void set_value();
|
||||
void set_value_at_thread_exit();
|
||||
@@ -657,7 +727,7 @@ __assoc_state<_Rp&>::set_value(_Rp& __arg)
|
||||
if (this->__has_value())
|
||||
throw future_error(make_error_code(future_errc::promise_already_satisfied));
|
||||
#endif
|
||||
__value_ = &__arg;
|
||||
__value_ = _VSTD::addressof(__arg);
|
||||
this->__state_ |= base::__constructed | base::ready;
|
||||
__lk.unlock();
|
||||
__cv_.notify_all();
|
||||
@@ -672,7 +742,7 @@ __assoc_state<_Rp&>::set_value_at_thread_exit(_Rp& __arg)
|
||||
if (this->__has_value())
|
||||
throw future_error(make_error_code(future_errc::promise_already_satisfied));
|
||||
#endif
|
||||
__value_ = &__arg;
|
||||
__value_ = _VSTD::addressof(__arg);
|
||||
this->__state_ |= base::__constructed;
|
||||
__thread_local_data()->__make_ready_at_thread_exit(this);
|
||||
__lk.unlock();
|
||||
@@ -708,7 +778,7 @@ void
|
||||
__assoc_state_alloc<_Rp, _Alloc>::__on_zero_shared() _NOEXCEPT
|
||||
{
|
||||
if (this->__state_ & base::__constructed)
|
||||
reinterpret_cast<_Rp*>(&this->__value_)->~_Rp();
|
||||
reinterpret_cast<_Rp*>(_VSTD::addressof(this->__value_))->~_Rp();
|
||||
typename _Alloc::template rebind<__assoc_state_alloc>::other __a(__alloc_);
|
||||
this->~__assoc_state_alloc();
|
||||
__a.deallocate(this, 1);
|
||||
@@ -962,12 +1032,12 @@ __async_assoc_state<void, _Fp>::__on_zero_shared() _NOEXCEPT
|
||||
base::__on_zero_shared();
|
||||
}
|
||||
|
||||
template <class _Rp> class _LIBCPP_VISIBLE promise;
|
||||
template <class _Rp> class _LIBCPP_VISIBLE shared_future;
|
||||
template <class _Rp> class _LIBCPP_TYPE_VIS_ONLY promise;
|
||||
template <class _Rp> class _LIBCPP_TYPE_VIS_ONLY shared_future;
|
||||
|
||||
// future
|
||||
|
||||
template <class _Rp> class _LIBCPP_VISIBLE future;
|
||||
template <class _Rp> class _LIBCPP_TYPE_VIS_ONLY future;
|
||||
|
||||
template <class _Rp, class _Fp>
|
||||
future<_Rp>
|
||||
@@ -986,7 +1056,7 @@ __make_async_assoc_state(_Fp __f);
|
||||
#endif
|
||||
|
||||
template <class _Rp>
|
||||
class _LIBCPP_VISIBLE future
|
||||
class _LIBCPP_TYPE_VIS_ONLY future
|
||||
{
|
||||
__assoc_state<_Rp>* __state_;
|
||||
|
||||
@@ -1090,7 +1160,7 @@ future<_Rp>::get()
|
||||
}
|
||||
|
||||
template <class _Rp>
|
||||
class _LIBCPP_VISIBLE future<_Rp&>
|
||||
class _LIBCPP_TYPE_VIS_ONLY future<_Rp&>
|
||||
{
|
||||
__assoc_state<_Rp&>* __state_;
|
||||
|
||||
@@ -1189,7 +1259,7 @@ future<_Rp&>::get()
|
||||
}
|
||||
|
||||
template <>
|
||||
class _LIBCPP_VISIBLE future<void>
|
||||
class _LIBCPP_TYPE_VIS future<void>
|
||||
{
|
||||
__assoc_sub_state* __state_;
|
||||
|
||||
@@ -1271,7 +1341,7 @@ swap(future<_Rp>& __x, future<_Rp>& __y) _NOEXCEPT
|
||||
template <class _Callable> class packaged_task;
|
||||
|
||||
template <class _Rp>
|
||||
class _LIBCPP_VISIBLE promise
|
||||
class _LIBCPP_TYPE_VIS_ONLY promise
|
||||
{
|
||||
__assoc_state<_Rp>* __state_;
|
||||
|
||||
@@ -1449,7 +1519,7 @@ promise<_Rp>::set_exception_at_thread_exit(exception_ptr __p)
|
||||
// promise<R&>
|
||||
|
||||
template <class _Rp>
|
||||
class _LIBCPP_VISIBLE promise<_Rp&>
|
||||
class _LIBCPP_TYPE_VIS_ONLY promise<_Rp&>
|
||||
{
|
||||
__assoc_state<_Rp&>* __state_;
|
||||
|
||||
@@ -1592,7 +1662,7 @@ promise<_Rp&>::set_exception_at_thread_exit(exception_ptr __p)
|
||||
// promise<void>
|
||||
|
||||
template <>
|
||||
class _LIBCPP_VISIBLE promise<void>
|
||||
class _LIBCPP_TYPE_VIS promise<void>
|
||||
{
|
||||
__assoc_sub_state* __state_;
|
||||
|
||||
@@ -1666,7 +1736,7 @@ swap(promise<_Rp>& __x, promise<_Rp>& __y) _NOEXCEPT
|
||||
}
|
||||
|
||||
template <class _Rp, class _Alloc>
|
||||
struct _LIBCPP_VISIBLE uses_allocator<promise<_Rp>, _Alloc>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY uses_allocator<promise<_Rp>, _Alloc>
|
||||
: public true_type {};
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
||||
@@ -1753,7 +1823,7 @@ template<class _Rp, class ..._ArgTypes>
|
||||
class __packaged_task_function<_Rp(_ArgTypes...)>
|
||||
{
|
||||
typedef __packaged_task_base<_Rp(_ArgTypes...)> __base;
|
||||
aligned_storage<3*sizeof(void*)>::type __buf_;
|
||||
typename aligned_storage<3*sizeof(void*)>::type __buf_;
|
||||
__base* __f_;
|
||||
|
||||
public:
|
||||
@@ -1930,7 +2000,7 @@ __packaged_task_function<_Rp(_ArgTypes...)>::operator()(_ArgTypes... __arg) cons
|
||||
}
|
||||
|
||||
template<class _Rp, class ..._ArgTypes>
|
||||
class _LIBCPP_VISIBLE packaged_task<_Rp(_ArgTypes...)>
|
||||
class _LIBCPP_TYPE_VIS_ONLY packaged_task<_Rp(_ArgTypes...)>
|
||||
{
|
||||
public:
|
||||
typedef _Rp result_type;
|
||||
@@ -1943,10 +2013,26 @@ public:
|
||||
// construction and destruction
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
packaged_task() _NOEXCEPT : __p_(nullptr) {}
|
||||
template <class _Fp>
|
||||
template <class _Fp,
|
||||
class = typename enable_if
|
||||
<
|
||||
!is_same<
|
||||
typename decay<_Fp>::type,
|
||||
packaged_task
|
||||
>::value
|
||||
>::type
|
||||
>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit packaged_task(_Fp&& __f) : __f_(_VSTD::forward<_Fp>(__f)) {}
|
||||
template <class _Fp, class _Allocator>
|
||||
template <class _Fp, class _Allocator,
|
||||
class = typename enable_if
|
||||
<
|
||||
!is_same<
|
||||
typename decay<_Fp>::type,
|
||||
packaged_task
|
||||
>::value
|
||||
>::type
|
||||
>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit packaged_task(allocator_arg_t, const _Allocator& __a, _Fp&& __f)
|
||||
: __f_(allocator_arg, __a, _VSTD::forward<_Fp>(__f)),
|
||||
@@ -2045,7 +2131,7 @@ packaged_task<_Rp(_ArgTypes...)>::reset()
|
||||
}
|
||||
|
||||
template<class ..._ArgTypes>
|
||||
class _LIBCPP_VISIBLE packaged_task<void(_ArgTypes...)>
|
||||
class _LIBCPP_TYPE_VIS_ONLY packaged_task<void(_ArgTypes...)>
|
||||
{
|
||||
public:
|
||||
typedef void result_type;
|
||||
@@ -2058,10 +2144,26 @@ public:
|
||||
// construction and destruction
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
packaged_task() _NOEXCEPT : __p_(nullptr) {}
|
||||
template <class _Fp>
|
||||
template <class _Fp,
|
||||
class = typename enable_if
|
||||
<
|
||||
!is_same<
|
||||
typename decay<_Fp>::type,
|
||||
packaged_task
|
||||
>::value
|
||||
>::type
|
||||
>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit packaged_task(_Fp&& __f) : __f_(_VSTD::forward<_Fp>(__f)) {}
|
||||
template <class _Fp, class _Allocator>
|
||||
template <class _Fp, class _Allocator,
|
||||
class = typename enable_if
|
||||
<
|
||||
!is_same<
|
||||
typename decay<_Fp>::type,
|
||||
packaged_task
|
||||
>::value
|
||||
>::type
|
||||
>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit packaged_task(allocator_arg_t, const _Allocator& __a, _Fp&& __f)
|
||||
: __f_(allocator_arg, __a, _VSTD::forward<_Fp>(__f)),
|
||||
@@ -2170,7 +2272,7 @@ swap(packaged_task<_Callable>& __x, packaged_task<_Callable>& __y) _NOEXCEPT
|
||||
}
|
||||
|
||||
template <class _Callable, class _Alloc>
|
||||
struct _LIBCPP_VISIBLE uses_allocator<packaged_task<_Callable>, _Alloc>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY uses_allocator<packaged_task<_Callable>, _Alloc>
|
||||
: public true_type {};
|
||||
|
||||
template <class _Rp, class _Fp>
|
||||
@@ -2229,20 +2331,32 @@ private:
|
||||
}
|
||||
};
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY bool __does_policy_contain(launch __policy, launch __value )
|
||||
{ return (int(__policy) & int(__value)) != 0; }
|
||||
|
||||
template <class _Fp, class... _Args>
|
||||
future<typename __invoke_of<typename decay<_Fp>::type, typename decay<_Args>::type...>::type>
|
||||
async(launch __policy, _Fp&& __f, _Args&&... __args)
|
||||
{
|
||||
typedef __async_func<typename decay<_Fp>::type, typename decay<_Args>::type...> _BF;
|
||||
typedef typename _BF::_Rp _Rp;
|
||||
future<_Rp> __r;
|
||||
if (int(__policy) & int(launch::async))
|
||||
__r = _VSTD::__make_async_assoc_state<_Rp>(_BF(__decay_copy(_VSTD::forward<_Fp>(__f)),
|
||||
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
try
|
||||
{
|
||||
#endif
|
||||
if (__does_policy_contain(__policy, launch::async))
|
||||
return _VSTD::__make_async_assoc_state<_Rp>(_BF(__decay_copy(_VSTD::forward<_Fp>(__f)),
|
||||
__decay_copy(_VSTD::forward<_Args>(__args))...));
|
||||
else if (int(__policy) & int(launch::deferred))
|
||||
__r = _VSTD::__make_deferred_assoc_state<_Rp>(_BF(__decay_copy(_VSTD::forward<_Fp>(__f)),
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
}
|
||||
catch ( ... ) { if (__policy == launch::async) throw ; }
|
||||
#endif
|
||||
|
||||
if (__does_policy_contain(__policy, launch::deferred))
|
||||
return _VSTD::__make_deferred_assoc_state<_Rp>(_BF(__decay_copy(_VSTD::forward<_Fp>(__f)),
|
||||
__decay_copy(_VSTD::forward<_Args>(__args))...));
|
||||
return __r;
|
||||
return future<_Rp>{};
|
||||
}
|
||||
|
||||
template <class _Fp, class... _Args>
|
||||
@@ -2259,7 +2373,7 @@ async(_Fp&& __f, _Args&&... __args)
|
||||
// shared_future
|
||||
|
||||
template <class _Rp>
|
||||
class _LIBCPP_VISIBLE shared_future
|
||||
class _LIBCPP_TYPE_VIS_ONLY shared_future
|
||||
{
|
||||
__assoc_state<_Rp>* __state_;
|
||||
|
||||
@@ -2333,7 +2447,7 @@ shared_future<_Rp>::operator=(const shared_future& __rhs)
|
||||
}
|
||||
|
||||
template <class _Rp>
|
||||
class _LIBCPP_VISIBLE shared_future<_Rp&>
|
||||
class _LIBCPP_TYPE_VIS_ONLY shared_future<_Rp&>
|
||||
{
|
||||
__assoc_state<_Rp&>* __state_;
|
||||
|
||||
@@ -2407,7 +2521,7 @@ shared_future<_Rp&>::operator=(const shared_future& __rhs)
|
||||
}
|
||||
|
||||
template <>
|
||||
class _LIBCPP_VISIBLE shared_future<void>
|
||||
class _LIBCPP_TYPE_VIS shared_future<void>
|
||||
{
|
||||
__assoc_sub_state* __state_;
|
||||
|
||||
|
||||
@@ -29,15 +29,15 @@ public:
|
||||
typedef const E* iterator;
|
||||
typedef const E* const_iterator;
|
||||
|
||||
initializer_list() noexcept;
|
||||
initializer_list() noexcept; // constexpr in C++14
|
||||
|
||||
size_t size() const noexcept;
|
||||
const E* begin() const noexcept;
|
||||
const E* end() const noexcept;
|
||||
size_t size() const noexcept; // constexpr in C++14
|
||||
const E* begin() const noexcept; // constexpr in C++14
|
||||
const E* end() const noexcept; // constexpr in C++14
|
||||
};
|
||||
|
||||
template<class E> const E* begin(initializer_list<E> il) noexcept;
|
||||
template<class E> const E* end(initializer_list<E> il) noexcept;
|
||||
template<class E> const E* begin(initializer_list<E> il) noexcept; // constexpr in C++14
|
||||
template<class E> const E* end(initializer_list<E> il) noexcept; // constexpr in C++14
|
||||
|
||||
} // std
|
||||
|
||||
@@ -56,12 +56,13 @@ namespace std // purposefully not versioned
|
||||
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
||||
|
||||
template<class _Ep>
|
||||
class _LIBCPP_VISIBLE initializer_list
|
||||
class _LIBCPP_TYPE_VIS_ONLY initializer_list
|
||||
{
|
||||
const _Ep* __begin_;
|
||||
size_t __size_;
|
||||
|
||||
_LIBCPP_ALWAYS_INLINE
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
initializer_list(const _Ep* __b, size_t __s) _NOEXCEPT
|
||||
: __begin_(__b),
|
||||
__size_(__s)
|
||||
@@ -75,15 +76,26 @@ public:
|
||||
typedef const _Ep* iterator;
|
||||
typedef const _Ep* const_iterator;
|
||||
|
||||
_LIBCPP_ALWAYS_INLINE initializer_list() _NOEXCEPT : __begin_(nullptr), __size_(0) {}
|
||||
_LIBCPP_ALWAYS_INLINE
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
initializer_list() _NOEXCEPT : __begin_(nullptr), __size_(0) {}
|
||||
|
||||
_LIBCPP_ALWAYS_INLINE size_t size() const _NOEXCEPT {return __size_;}
|
||||
_LIBCPP_ALWAYS_INLINE const _Ep* begin() const _NOEXCEPT {return __begin_;}
|
||||
_LIBCPP_ALWAYS_INLINE const _Ep* end() const _NOEXCEPT {return __begin_ + __size_;}
|
||||
_LIBCPP_ALWAYS_INLINE
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
size_t size() const _NOEXCEPT {return __size_;}
|
||||
|
||||
_LIBCPP_ALWAYS_INLINE
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
const _Ep* begin() const _NOEXCEPT {return __begin_;}
|
||||
|
||||
_LIBCPP_ALWAYS_INLINE
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
const _Ep* end() const _NOEXCEPT {return __begin_ + __size_;}
|
||||
};
|
||||
|
||||
template<class _Ep>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
const _Ep*
|
||||
begin(initializer_list<_Ep> __il) _NOEXCEPT
|
||||
{
|
||||
@@ -92,6 +104,7 @@ begin(initializer_list<_Ep> __il) _NOEXCEPT
|
||||
|
||||
template<class _Ep>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
const _Ep*
|
||||
end(initializer_list<_Ep> __il) _NOEXCEPT
|
||||
{
|
||||
|
||||
149
include/iomanip
149
include/iomanip
@@ -14,6 +14,8 @@
|
||||
/*
|
||||
iomanip synopsis
|
||||
|
||||
namespace std {
|
||||
|
||||
// types T1, T2, ... are unspecified implementation types
|
||||
T1 resetiosflags(ios_base::fmtflags mask);
|
||||
T2 setiosflags (ios_base::fmtflags mask);
|
||||
@@ -26,6 +28,17 @@ template <class charT, class moneyT> T8 put_money(const moneyT& mon, bool intl =
|
||||
template <class charT> T9 get_time(struct tm* tmb, const charT* fmt);
|
||||
template <class charT> T10 put_time(const struct tm* tmb, const charT* fmt);
|
||||
|
||||
template <class charT>
|
||||
T11 quoted(const charT* s, charT delim=charT('"'), charT escape=charT('\\')); // C++14
|
||||
|
||||
template <class charT, class traits, class Allocator>
|
||||
T12 quoted(const basic_string<charT, traits, Allocator>& s,
|
||||
charT delim=charT('"'), charT escape=charT('\\')); // C++14
|
||||
|
||||
template <class charT, class traits, class Allocator>
|
||||
T13 quoted(basic_string<charT, traits, Allocator>& s,
|
||||
charT delim=charT('"'), charT escape=charT('\\')); // C++14
|
||||
|
||||
} // std
|
||||
|
||||
*/
|
||||
@@ -499,6 +512,142 @@ put_time(const tm* __tm, const _CharT* __fmt)
|
||||
return __iom_t10<_CharT>(__tm, __fmt);
|
||||
}
|
||||
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
|
||||
template <class _CharT, class _Traits, class _ForwardIterator>
|
||||
std::basic_ostream<_CharT, _Traits> &
|
||||
__quoted_output ( basic_ostream<_CharT, _Traits> &__os,
|
||||
_ForwardIterator __first, _ForwardIterator __last, _CharT __delim, _CharT __escape )
|
||||
{
|
||||
__os << __delim;
|
||||
for ( ; __first != __last; ++ __first )
|
||||
{
|
||||
if (_Traits::eq (*__first, __escape) || _Traits::eq (*__first, __delim))
|
||||
__os << __escape;
|
||||
__os << *__first;
|
||||
}
|
||||
__os << __delim;
|
||||
return __os;
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits, class _String>
|
||||
basic_istream<_CharT, _Traits> &
|
||||
__quoted_input ( basic_istream<_CharT, _Traits> &__is, _String & __string, _CharT __delim, _CharT __escape )
|
||||
{
|
||||
__string.clear ();
|
||||
_CharT __c;
|
||||
__is >> __c;
|
||||
if ( __is.fail ())
|
||||
return __is;
|
||||
|
||||
if (!_Traits::eq (__c, __delim)) // no delimiter, read the whole string
|
||||
{
|
||||
__is.unget ();
|
||||
__is >> __string;
|
||||
return __is;
|
||||
}
|
||||
|
||||
__save_flags<_CharT, _Traits> sf(__is);
|
||||
noskipws (__is);
|
||||
while (true)
|
||||
{
|
||||
__is >> __c;
|
||||
if ( __is.fail ())
|
||||
break;
|
||||
if (_Traits::eq (__c, __escape))
|
||||
{
|
||||
__is >> __c;
|
||||
if ( __is.fail ())
|
||||
break;
|
||||
}
|
||||
else if (_Traits::eq (__c, __delim))
|
||||
break;
|
||||
__string.push_back ( __c );
|
||||
}
|
||||
return __is;
|
||||
}
|
||||
|
||||
|
||||
template <class _CharT, class _Iter, class _Traits=char_traits<_CharT>>
|
||||
struct __quoted_output_proxy
|
||||
{
|
||||
_Iter __first;
|
||||
_Iter __last;
|
||||
_CharT __delim;
|
||||
_CharT __escape;
|
||||
|
||||
__quoted_output_proxy(_Iter __f, _Iter __l, _CharT __d, _CharT __e)
|
||||
: __first(__f), __last(__l), __delim(__d), __escape(__e) {}
|
||||
// This would be a nice place for a string_ref
|
||||
};
|
||||
|
||||
template <class _CharT, class _Traits, class _Iter>
|
||||
basic_ostream<_CharT, _Traits>& operator<<(
|
||||
basic_ostream<_CharT, _Traits>& __os,
|
||||
const __quoted_output_proxy<_CharT, _Iter, _Traits> & __proxy)
|
||||
{
|
||||
return __quoted_output (__os, __proxy.__first, __proxy.__last, __proxy.__delim, __proxy.__escape);
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits, class _Allocator>
|
||||
struct __quoted_proxy
|
||||
{
|
||||
basic_string<_CharT, _Traits, _Allocator> &__string;
|
||||
_CharT __delim;
|
||||
_CharT __escape;
|
||||
|
||||
__quoted_proxy(basic_string<_CharT, _Traits, _Allocator> &__s, _CharT __d, _CharT __e)
|
||||
: __string(__s), __delim(__d), __escape(__e) {}
|
||||
};
|
||||
|
||||
template <class _CharT, class _Traits, class _Allocator>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
basic_ostream<_CharT, _Traits>& operator<<(
|
||||
basic_ostream<_CharT, _Traits>& __os,
|
||||
const __quoted_proxy<_CharT, _Traits, _Allocator> & __proxy)
|
||||
{
|
||||
return __quoted_output (__os, __proxy.__string.cbegin (), __proxy.__string.cend (), __proxy.__delim, __proxy.__escape);
|
||||
}
|
||||
|
||||
// extractor for non-const basic_string& proxies
|
||||
template <class _CharT, class _Traits, class _Allocator>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
basic_istream<_CharT, _Traits>& operator>>(
|
||||
basic_istream<_CharT, _Traits>& __is,
|
||||
const __quoted_proxy<_CharT, _Traits, _Allocator> & __proxy)
|
||||
{
|
||||
return __quoted_input ( __is, __proxy.__string, __proxy.__delim, __proxy.__escape );
|
||||
}
|
||||
|
||||
|
||||
template <class _CharT>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__quoted_output_proxy<_CharT, const _CharT *>
|
||||
quoted ( const _CharT *__s, _CharT __delim = _CharT('"'), _CharT __escape =_CharT('\\'))
|
||||
{
|
||||
const _CharT *__end = __s;
|
||||
while ( *__end ) ++__end;
|
||||
return __quoted_output_proxy<_CharT, const _CharT *> ( __s, __end, __delim, __escape );
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits, class _Allocator>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__quoted_output_proxy<_CharT, typename basic_string <_CharT, _Traits, _Allocator>::const_iterator>
|
||||
quoted ( const basic_string <_CharT, _Traits, _Allocator> &__s, _CharT __delim = _CharT('"'), _CharT __escape=_CharT('\\'))
|
||||
{
|
||||
return __quoted_output_proxy<_CharT,
|
||||
typename basic_string <_CharT, _Traits, _Allocator>::const_iterator>
|
||||
( __s.cbegin(), __s.cend (), __delim, __escape );
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits, class _Allocator>
|
||||
__quoted_proxy<_CharT, _Traits, _Allocator>
|
||||
quoted ( basic_string <_CharT, _Traits, _Allocator> &__s, _CharT __delim = _CharT('"'), _CharT __escape=_CharT('\\'))
|
||||
{
|
||||
return __quoted_proxy<_CharT, _Traits, _Allocator>( __s, __delim, __escape );
|
||||
}
|
||||
#endif
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP_IOMANIP
|
||||
|
||||
77
include/ios
77
include/ios
@@ -203,9 +203,9 @@ enum class io_errc
|
||||
};
|
||||
|
||||
concept_map ErrorCodeEnum<io_errc> { };
|
||||
error_code make_error_code(io_errc e);
|
||||
error_condition make_error_condition(io_errc e);
|
||||
storage-class-specifier const error_category& iostream_category;
|
||||
error_code make_error_code(io_errc e) noexcept;
|
||||
error_condition make_error_condition(io_errc e) noexcept;
|
||||
storage-class-specifier const error_category& iostream_category() noexcept;
|
||||
|
||||
} // std
|
||||
|
||||
@@ -216,6 +216,10 @@ storage-class-specifier const error_category& iostream_category;
|
||||
#include <__locale>
|
||||
#include <system_error>
|
||||
|
||||
#if __has_feature(cxx_atomic)
|
||||
#include <atomic> // for __xindex_
|
||||
#endif
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
@@ -224,10 +228,10 @@ _LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
typedef ptrdiff_t streamsize;
|
||||
|
||||
class _LIBCPP_VISIBLE ios_base
|
||||
class _LIBCPP_TYPE_VIS ios_base
|
||||
{
|
||||
public:
|
||||
class _LIBCPP_VISIBLE failure;
|
||||
class _LIBCPP_TYPE_VIS failure;
|
||||
|
||||
typedef unsigned int fmtflags;
|
||||
static const fmtflags boolalpha = 0x0001;
|
||||
@@ -271,7 +275,7 @@ public:
|
||||
typedef _VSTD::streamoff streamoff;
|
||||
typedef _VSTD::streampos streampos;
|
||||
|
||||
class _LIBCPP_VISIBLE Init;
|
||||
class _LIBCPP_TYPE_VIS Init;
|
||||
|
||||
// 27.5.2.2 fmtflags state:
|
||||
_LIBCPP_INLINE_VISIBILITY fmtflags flags() const;
|
||||
@@ -319,7 +323,7 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY bool bad() const;
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY iostate exceptions() const;
|
||||
_LIBCPP_INLINE_VISIBILITY void exceptions(iostate __except);
|
||||
_LIBCPP_INLINE_VISIBILITY void exceptions(iostate __iostate);
|
||||
|
||||
void __set_badbit_and_consider_rethrow();
|
||||
void __set_failbit_and_consider_rethrow();
|
||||
@@ -363,7 +367,11 @@ private:
|
||||
int* __index_;
|
||||
size_t __event_size_;
|
||||
size_t __event_cap_;
|
||||
#if __has_feature(cxx_atomic)
|
||||
static atomic<int> __xindex_;
|
||||
#else
|
||||
static int __xindex_;
|
||||
#endif
|
||||
long* __iarray_;
|
||||
size_t __iarray_size_;
|
||||
size_t __iarray_cap_;
|
||||
@@ -380,26 +388,26 @@ _LIBCPP_DECLARE_STRONG_ENUM(io_errc)
|
||||
_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(io_errc)
|
||||
|
||||
template <>
|
||||
struct _LIBCPP_VISIBLE is_error_code_enum<io_errc> : public true_type { };
|
||||
struct _LIBCPP_TYPE_VIS_ONLY is_error_code_enum<io_errc> : public true_type { };
|
||||
|
||||
#ifdef _LIBCPP_HAS_NO_STRONG_ENUMS
|
||||
template <>
|
||||
struct _LIBCPP_VISIBLE is_error_code_enum<io_errc::__lx> : public true_type { };
|
||||
struct _LIBCPP_TYPE_VIS_ONLY is_error_code_enum<io_errc::__lx> : public true_type { };
|
||||
#endif
|
||||
|
||||
_LIBCPP_VISIBLE
|
||||
const error_category& iostream_category();
|
||||
_LIBCPP_FUNC_VIS
|
||||
const error_category& iostream_category() _NOEXCEPT;
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
error_code
|
||||
make_error_code(io_errc __e)
|
||||
make_error_code(io_errc __e) _NOEXCEPT
|
||||
{
|
||||
return error_code(static_cast<int>(__e), iostream_category());
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
error_condition
|
||||
make_error_condition(io_errc __e)
|
||||
make_error_condition(io_errc __e) _NOEXCEPT
|
||||
{
|
||||
return error_condition(static_cast<int>(__e), iostream_category());
|
||||
}
|
||||
@@ -413,7 +421,7 @@ public:
|
||||
virtual ~failure() throw();
|
||||
};
|
||||
|
||||
class _LIBCPP_VISIBLE ios_base::Init
|
||||
class _LIBCPP_TYPE_VIS ios_base::Init
|
||||
{
|
||||
public:
|
||||
Init();
|
||||
@@ -527,21 +535,21 @@ inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
ios_base::eof() const
|
||||
{
|
||||
return __rdstate_ & eofbit;
|
||||
return (__rdstate_ & eofbit) != 0;
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
ios_base::fail() const
|
||||
{
|
||||
return __rdstate_ & (failbit | badbit);
|
||||
return (__rdstate_ & (failbit | badbit)) != 0;
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
ios_base::bad() const
|
||||
{
|
||||
return __rdstate_ & badbit;
|
||||
return (__rdstate_ & badbit) != 0;
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
@@ -553,14 +561,14 @@ ios_base::exceptions() const
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
ios_base::exceptions(iostate __except)
|
||||
ios_base::exceptions(iostate __iostate)
|
||||
{
|
||||
__exceptions_ = __except;
|
||||
__exceptions_ = __iostate;
|
||||
clear(__rdstate_);
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
class _LIBCPP_VISIBLE basic_ios
|
||||
class _LIBCPP_TYPE_VIS_ONLY basic_ios
|
||||
: public ios_base
|
||||
{
|
||||
public:
|
||||
@@ -585,7 +593,7 @@ public:
|
||||
_LIBCPP_ALWAYS_INLINE bool bad() const {return ios_base::bad();}
|
||||
|
||||
_LIBCPP_ALWAYS_INLINE iostate exceptions() const {return ios_base::exceptions();}
|
||||
_LIBCPP_ALWAYS_INLINE void exceptions(iostate __except) {ios_base::exceptions(__except);}
|
||||
_LIBCPP_ALWAYS_INLINE void exceptions(iostate __iostate) {ios_base::exceptions(__iostate);}
|
||||
|
||||
// 27.5.4.1 Constructor/destructor:
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
@@ -983,6 +991,33 @@ defaultfloat(ios_base& __str)
|
||||
return __str;
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
class __save_flags
|
||||
{
|
||||
typedef basic_ios<_CharT, _Traits> __stream_type;
|
||||
typedef typename __stream_type::fmtflags fmtflags;
|
||||
|
||||
__stream_type& __stream_;
|
||||
fmtflags __fmtflags_;
|
||||
_CharT __fill_;
|
||||
|
||||
__save_flags(const __save_flags&);
|
||||
__save_flags& operator=(const __save_flags&);
|
||||
public:
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit __save_flags(__stream_type& __stream)
|
||||
: __stream_(__stream),
|
||||
__fmtflags_(__stream.flags()),
|
||||
__fill_(__stream.fill())
|
||||
{}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
~__save_flags()
|
||||
{
|
||||
__stream_.flags(__fmtflags_);
|
||||
__stream_.fill(__fill_);
|
||||
}
|
||||
};
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP_IOS
|
||||
|
||||
@@ -95,49 +95,49 @@ typedef fpos<char_traits<wchar_t>::state_type> wstreampos;
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
class _LIBCPP_VISIBLE ios_base;
|
||||
class _LIBCPP_TYPE_VIS ios_base;
|
||||
|
||||
template<class _CharT> struct _LIBCPP_VISIBLE char_traits;
|
||||
template<class _Tp> class _LIBCPP_VISIBLE allocator;
|
||||
template<class _CharT> struct _LIBCPP_TYPE_VIS_ONLY char_traits;
|
||||
template<class _Tp> class _LIBCPP_TYPE_VIS_ONLY allocator;
|
||||
|
||||
template <class _CharT, class _Traits = char_traits<_CharT> >
|
||||
class _LIBCPP_VISIBLE basic_ios;
|
||||
class _LIBCPP_TYPE_VIS_ONLY basic_ios;
|
||||
|
||||
template <class _CharT, class _Traits = char_traits<_CharT> >
|
||||
class _LIBCPP_VISIBLE basic_streambuf;
|
||||
class _LIBCPP_TYPE_VIS_ONLY basic_streambuf;
|
||||
template <class _CharT, class _Traits = char_traits<_CharT> >
|
||||
class _LIBCPP_VISIBLE basic_istream;
|
||||
class _LIBCPP_TYPE_VIS_ONLY basic_istream;
|
||||
template <class _CharT, class _Traits = char_traits<_CharT> >
|
||||
class _LIBCPP_VISIBLE basic_ostream;
|
||||
class _LIBCPP_TYPE_VIS_ONLY basic_ostream;
|
||||
template <class _CharT, class _Traits = char_traits<_CharT> >
|
||||
class _LIBCPP_VISIBLE basic_iostream;
|
||||
class _LIBCPP_TYPE_VIS_ONLY basic_iostream;
|
||||
|
||||
template <class _CharT, class _Traits = char_traits<_CharT>,
|
||||
class _Allocator = allocator<_CharT> >
|
||||
class _LIBCPP_VISIBLE basic_stringbuf;
|
||||
class _LIBCPP_TYPE_VIS_ONLY basic_stringbuf;
|
||||
template <class _CharT, class _Traits = char_traits<_CharT>,
|
||||
class _Allocator = allocator<_CharT> >
|
||||
class _LIBCPP_VISIBLE basic_istringstream;
|
||||
class _LIBCPP_TYPE_VIS_ONLY basic_istringstream;
|
||||
template <class _CharT, class _Traits = char_traits<_CharT>,
|
||||
class _Allocator = allocator<_CharT> >
|
||||
class _LIBCPP_VISIBLE basic_ostringstream;
|
||||
class _LIBCPP_TYPE_VIS_ONLY basic_ostringstream;
|
||||
template <class _CharT, class _Traits = char_traits<_CharT>,
|
||||
class _Allocator = allocator<_CharT> >
|
||||
class _LIBCPP_VISIBLE basic_stringstream;
|
||||
class _LIBCPP_TYPE_VIS_ONLY basic_stringstream;
|
||||
|
||||
template <class _CharT, class _Traits = char_traits<_CharT> >
|
||||
class _LIBCPP_VISIBLE basic_filebuf;
|
||||
class _LIBCPP_TYPE_VIS_ONLY basic_filebuf;
|
||||
template <class _CharT, class _Traits = char_traits<_CharT> >
|
||||
class _LIBCPP_VISIBLE basic_ifstream;
|
||||
class _LIBCPP_TYPE_VIS_ONLY basic_ifstream;
|
||||
template <class _CharT, class _Traits = char_traits<_CharT> >
|
||||
class _LIBCPP_VISIBLE basic_ofstream;
|
||||
class _LIBCPP_TYPE_VIS_ONLY basic_ofstream;
|
||||
template <class _CharT, class _Traits = char_traits<_CharT> >
|
||||
class _LIBCPP_VISIBLE basic_fstream;
|
||||
class _LIBCPP_TYPE_VIS_ONLY basic_fstream;
|
||||
|
||||
template <class _CharT, class _Traits = char_traits<_CharT> >
|
||||
class _LIBCPP_VISIBLE istreambuf_iterator;
|
||||
class _LIBCPP_TYPE_VIS_ONLY istreambuf_iterator;
|
||||
template <class _CharT, class _Traits = char_traits<_CharT> >
|
||||
class _LIBCPP_VISIBLE ostreambuf_iterator;
|
||||
class _LIBCPP_TYPE_VIS_ONLY ostreambuf_iterator;
|
||||
|
||||
typedef basic_ios<char> ios;
|
||||
typedef basic_ios<wchar_t> wios;
|
||||
@@ -172,7 +172,7 @@ typedef basic_ifstream<wchar_t> wifstream;
|
||||
typedef basic_ofstream<wchar_t> wofstream;
|
||||
typedef basic_fstream<wchar_t> wfstream;
|
||||
|
||||
template <class _State> class _LIBCPP_VISIBLE fpos;
|
||||
template <class _State> class _LIBCPP_TYPE_VIS_ONLY fpos;
|
||||
typedef fpos<mbstate_t> streampos;
|
||||
typedef fpos<mbstate_t> wstreampos;
|
||||
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
|
||||
@@ -185,7 +185,7 @@ typedef long long streamoff; // for char_traits in <string>
|
||||
template <class _CharT, // for <stdexcept>
|
||||
class _Traits = char_traits<_CharT>,
|
||||
class _Allocator = allocator<_CharT> >
|
||||
class _LIBCPP_VISIBLE basic_string;
|
||||
class _LIBCPP_TYPE_VIS_ONLY basic_string;
|
||||
typedef basic_string<char, char_traits<char>, allocator<char> > string;
|
||||
typedef basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > wstring;
|
||||
|
||||
|
||||
@@ -46,14 +46,14 @@ extern wostream wclog;
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
extern _LIBCPP_VISIBLE istream cin;
|
||||
extern _LIBCPP_VISIBLE ostream cout;
|
||||
extern _LIBCPP_VISIBLE ostream cerr;
|
||||
extern _LIBCPP_VISIBLE ostream clog;
|
||||
extern _LIBCPP_VISIBLE wistream wcin;
|
||||
extern _LIBCPP_VISIBLE wostream wcout;
|
||||
extern _LIBCPP_VISIBLE wostream wcerr;
|
||||
extern _LIBCPP_VISIBLE wostream wclog;
|
||||
extern _LIBCPP_FUNC_VIS istream cin;
|
||||
extern _LIBCPP_FUNC_VIS ostream cout;
|
||||
extern _LIBCPP_FUNC_VIS ostream cerr;
|
||||
extern _LIBCPP_FUNC_VIS ostream clog;
|
||||
extern _LIBCPP_FUNC_VIS wistream wcin;
|
||||
extern _LIBCPP_FUNC_VIS wostream wcout;
|
||||
extern _LIBCPP_FUNC_VIS wostream wcerr;
|
||||
extern _LIBCPP_FUNC_VIS wostream wclog;
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
|
||||
@@ -164,7 +164,7 @@ template <class charT, class traits, class T>
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
class _LIBCPP_VISIBLE basic_istream
|
||||
class _LIBCPP_TYPE_VIS_ONLY basic_istream
|
||||
: virtual public basic_ios<_CharT, _Traits>
|
||||
{
|
||||
streamsize __gc_;
|
||||
@@ -194,7 +194,7 @@ protected:
|
||||
public:
|
||||
|
||||
// 27.7.1.1.3 Prefix/suffix:
|
||||
class _LIBCPP_VISIBLE sentry;
|
||||
class _LIBCPP_TYPE_VIS_ONLY sentry;
|
||||
|
||||
// 27.7.1.2 Formatted input:
|
||||
basic_istream& operator>>(basic_istream& (*__pf)(basic_istream&));
|
||||
@@ -244,7 +244,7 @@ public:
|
||||
};
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
class _LIBCPP_VISIBLE basic_istream<_CharT, _Traits>::sentry
|
||||
class _LIBCPP_TYPE_VIS_ONLY basic_istream<_CharT, _Traits>::sentry
|
||||
{
|
||||
bool __ok_;
|
||||
|
||||
@@ -1144,8 +1144,7 @@ basic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __dlm)
|
||||
break;
|
||||
}
|
||||
++__gc_;
|
||||
char_type __ch = traits_type::to_char_type(__i);
|
||||
if (traits_type::eq(__ch, static_cast<char_type>(__dlm)))
|
||||
if (traits_type::eq_int_type(__i, __dlm))
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1160,8 +1159,7 @@ basic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __dlm)
|
||||
break;
|
||||
}
|
||||
++__gc_;
|
||||
char_type __ch = traits_type::to_char_type(__i);
|
||||
if (traits_type::eq(__ch, static_cast<char_type>(__dlm)))
|
||||
if (traits_type::eq_int_type(__i, __dlm))
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1216,16 +1214,9 @@ basic_istream<_CharT, _Traits>::read(char_type* __s, streamsize __n)
|
||||
sentry __sen(*this, true);
|
||||
if (__sen)
|
||||
{
|
||||
for (; __gc_ < __n; ++__gc_)
|
||||
{
|
||||
typename traits_type::int_type __i = this->rdbuf()->sbumpc();
|
||||
if (traits_type::eq_int_type(__i, traits_type::eof()))
|
||||
{
|
||||
this->setstate(ios_base::failbit | ios_base::eofbit);
|
||||
break;
|
||||
}
|
||||
*__s++ = traits_type::to_char_type(__i);
|
||||
}
|
||||
__gc_ = this->rdbuf()->sgetn(__s, __n);
|
||||
if (__gc_ != __n)
|
||||
this->setstate(ios_base::failbit | ios_base::eofbit);
|
||||
}
|
||||
else
|
||||
this->setstate(ios_base::failbit);
|
||||
@@ -1243,6 +1234,7 @@ template<class _CharT, class _Traits>
|
||||
streamsize
|
||||
basic_istream<_CharT, _Traits>::readsome(char_type* __s, streamsize __n)
|
||||
{
|
||||
__gc_ = 0;
|
||||
streamsize __c = this->rdbuf()->in_avail();
|
||||
switch (__c)
|
||||
{
|
||||
@@ -1377,8 +1369,10 @@ basic_istream<_CharT, _Traits>::seekg(pos_type __pos)
|
||||
this->clear(this->rdstate() & ~ios_base::eofbit);
|
||||
sentry __sen(*this, true);
|
||||
if (__sen)
|
||||
{
|
||||
if (this->rdbuf()->pubseekpos(__pos, ios_base::in) == pos_type(-1))
|
||||
this->setstate(ios_base::failbit);
|
||||
}
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
}
|
||||
catch (...)
|
||||
@@ -1399,7 +1393,10 @@ basic_istream<_CharT, _Traits>::seekg(off_type __off, ios_base::seekdir __dir)
|
||||
#endif // _LIBCPP_NO_EXCEPTIONS
|
||||
sentry __sen(*this, true);
|
||||
if (__sen)
|
||||
this->rdbuf()->pubseekoff(__off, __dir, ios_base::in);
|
||||
{
|
||||
if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::in) == pos_type(-1))
|
||||
this->setstate(ios_base::failbit);
|
||||
}
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
}
|
||||
catch (...)
|
||||
@@ -1459,7 +1456,7 @@ operator>>(basic_istream<_CharT, _Traits>&& __is, _Tp& __x)
|
||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
class _LIBCPP_VISIBLE basic_iostream
|
||||
class _LIBCPP_TYPE_VIS_ONLY basic_iostream
|
||||
: public basic_istream<_CharT, _Traits>,
|
||||
public basic_ostream<_CharT, _Traits>
|
||||
{
|
||||
@@ -1710,9 +1707,9 @@ operator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Size>& __x)
|
||||
return __is;
|
||||
}
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE(class basic_istream<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class basic_istream<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class basic_iostream<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_istream<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_istream<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_iostream<char>)
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
|
||||
627
include/iterator
627
include/iterator
@@ -309,6 +309,19 @@ template <class C> auto end(const C& c) -> decltype(c.end());
|
||||
template <class T, size_t N> T* begin(T (&array)[N]);
|
||||
template <class T, size_t N> T* end(T (&array)[N]);
|
||||
|
||||
template <class C> auto cbegin(const C& c) -> decltype(std::begin(c)); // C++14
|
||||
template <class C> auto cend(const C& c) -> decltype(std::end(c)); // C++14
|
||||
template <class C> auto rbegin(C& c) -> decltype(c.rbegin()); // C++14
|
||||
template <class C> auto rbegin(const C& c) -> decltype(c.rbegin()); // C++14
|
||||
template <class C> auto rend(C& c) -> decltype(c.rend()); // C++14
|
||||
template <class C> auto rend(const C& c) -> decltype(c.rend()); // C++14
|
||||
template <class E> reverse_iterator<const E*> rbegin(initializer_list<E> il); // C++14
|
||||
template <class E> reverse_iterator<const E*> rend(initializer_list<E> il); // C++14
|
||||
template <class T, size_t N> reverse_iterator<T*> rbegin(T (&array)[N]); // C++14
|
||||
template <class T, size_t N> reverse_iterator<T*> rend(T (&array)[N]); // C++14
|
||||
template <class C> auto crbegin(const C& c) -> decltype(std::rbegin(c)); // C++14
|
||||
template <class C> auto crend(const C& c) -> decltype(std::rend(c)); // C++14
|
||||
|
||||
} // std
|
||||
|
||||
*/
|
||||
@@ -317,8 +330,15 @@ template <class T, size_t N> T* end(T (&array)[N]);
|
||||
#include <type_traits>
|
||||
#include <cstddef>
|
||||
#include <iosfwd>
|
||||
#include <initializer_list>
|
||||
#ifdef __APPLE__
|
||||
#include <Availability.h>
|
||||
#endif
|
||||
|
||||
#ifdef _LIBCPP_DEBUG
|
||||
#include <cassert>
|
||||
# include <__debug>
|
||||
#else
|
||||
# define _LIBCPP_ASSERT(x, m) ((void)0)
|
||||
#endif
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
@@ -327,11 +347,11 @@ template <class T, size_t N> T* end(T (&array)[N]);
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
struct _LIBCPP_VISIBLE input_iterator_tag {};
|
||||
struct _LIBCPP_VISIBLE output_iterator_tag {};
|
||||
struct _LIBCPP_VISIBLE forward_iterator_tag : public input_iterator_tag {};
|
||||
struct _LIBCPP_VISIBLE bidirectional_iterator_tag : public forward_iterator_tag {};
|
||||
struct _LIBCPP_VISIBLE random_access_iterator_tag : public bidirectional_iterator_tag {};
|
||||
struct _LIBCPP_TYPE_VIS_ONLY input_iterator_tag {};
|
||||
struct _LIBCPP_TYPE_VIS_ONLY output_iterator_tag {};
|
||||
struct _LIBCPP_TYPE_VIS_ONLY forward_iterator_tag : public input_iterator_tag {};
|
||||
struct _LIBCPP_TYPE_VIS_ONLY bidirectional_iterator_tag : public forward_iterator_tag {};
|
||||
struct _LIBCPP_TYPE_VIS_ONLY random_access_iterator_tag : public bidirectional_iterator_tag {};
|
||||
|
||||
template <class _Tp>
|
||||
struct __has_iterator_category
|
||||
@@ -374,11 +394,11 @@ struct __iterator_traits<_Iter, true>
|
||||
// the client expects instead of failing at compile time.
|
||||
|
||||
template <class _Iter>
|
||||
struct _LIBCPP_VISIBLE iterator_traits
|
||||
struct _LIBCPP_TYPE_VIS_ONLY iterator_traits
|
||||
: __iterator_traits<_Iter, __has_iterator_category<_Iter>::value> {};
|
||||
|
||||
template<class _Tp>
|
||||
struct _LIBCPP_VISIBLE iterator_traits<_Tp*>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY iterator_traits<_Tp*>
|
||||
{
|
||||
typedef ptrdiff_t difference_type;
|
||||
typedef typename remove_const<_Tp>::type value_type;
|
||||
@@ -409,7 +429,7 @@ struct __is_random_access_iterator : public __has_iterator_category_convertible_
|
||||
|
||||
template<class _Category, class _Tp, class _Distance = ptrdiff_t,
|
||||
class _Pointer = _Tp*, class _Reference = _Tp&>
|
||||
struct _LIBCPP_VISIBLE iterator
|
||||
struct _LIBCPP_TYPE_VIS_ONLY iterator
|
||||
{
|
||||
typedef _Tp value_type;
|
||||
typedef _Distance difference_type;
|
||||
@@ -506,7 +526,7 @@ prev(_BidiretionalIter __x,
|
||||
}
|
||||
|
||||
template <class _Iter>
|
||||
class _LIBCPP_VISIBLE reverse_iterator
|
||||
class _LIBCPP_TYPE_VIS_ONLY reverse_iterator
|
||||
: public iterator<typename iterator_traits<_Iter>::iterator_category,
|
||||
typename iterator_traits<_Iter>::value_type,
|
||||
typename iterator_traits<_Iter>::difference_type,
|
||||
@@ -613,7 +633,7 @@ operator+(typename reverse_iterator<_Iter>::difference_type __n, const reverse_i
|
||||
}
|
||||
|
||||
template <class _Container>
|
||||
class _LIBCPP_VISIBLE back_insert_iterator
|
||||
class _LIBCPP_TYPE_VIS_ONLY back_insert_iterator
|
||||
: public iterator<output_iterator_tag,
|
||||
void,
|
||||
void,
|
||||
@@ -646,7 +666,7 @@ back_inserter(_Container& __x)
|
||||
}
|
||||
|
||||
template <class _Container>
|
||||
class _LIBCPP_VISIBLE front_insert_iterator
|
||||
class _LIBCPP_TYPE_VIS_ONLY front_insert_iterator
|
||||
: public iterator<output_iterator_tag,
|
||||
void,
|
||||
void,
|
||||
@@ -679,7 +699,7 @@ front_inserter(_Container& __x)
|
||||
}
|
||||
|
||||
template <class _Container>
|
||||
class _LIBCPP_VISIBLE insert_iterator
|
||||
class _LIBCPP_TYPE_VIS_ONLY insert_iterator
|
||||
: public iterator<output_iterator_tag,
|
||||
void,
|
||||
void,
|
||||
@@ -715,7 +735,7 @@ inserter(_Container& __x, typename _Container::iterator __i)
|
||||
|
||||
template <class _Tp, class _CharT = char,
|
||||
class _Traits = char_traits<_CharT>, class _Distance = ptrdiff_t>
|
||||
class _LIBCPP_VISIBLE istream_iterator
|
||||
class _LIBCPP_TYPE_VIS_ONLY istream_iterator
|
||||
: public iterator<input_iterator_tag, _Tp, _Distance, const _Tp*, const _Tp&>
|
||||
{
|
||||
public:
|
||||
@@ -754,7 +774,7 @@ public:
|
||||
};
|
||||
|
||||
template <class _Tp, class _CharT = char, class _Traits = char_traits<_CharT> >
|
||||
class _LIBCPP_VISIBLE ostream_iterator
|
||||
class _LIBCPP_TYPE_VIS_ONLY ostream_iterator
|
||||
: public iterator<output_iterator_tag, void, void, void, void>
|
||||
{
|
||||
public:
|
||||
@@ -783,7 +803,7 @@ public:
|
||||
};
|
||||
|
||||
template<class _CharT, class _Traits>
|
||||
class _LIBCPP_VISIBLE istreambuf_iterator
|
||||
class _LIBCPP_TYPE_VIS_ONLY istreambuf_iterator
|
||||
: public iterator<input_iterator_tag, _CharT,
|
||||
typename _Traits::off_type, _CharT*,
|
||||
_CharT>
|
||||
@@ -795,7 +815,7 @@ public:
|
||||
typedef basic_streambuf<_CharT,_Traits> streambuf_type;
|
||||
typedef basic_istream<_CharT,_Traits> istream_type;
|
||||
private:
|
||||
streambuf_type* __sbuf_;
|
||||
mutable streambuf_type* __sbuf_;
|
||||
|
||||
class __proxy
|
||||
{
|
||||
@@ -809,17 +829,18 @@ private:
|
||||
};
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
void __test_for_eof()
|
||||
bool __test_for_eof() const
|
||||
{
|
||||
if (__sbuf_ && traits_type::eq_int_type(__sbuf_->sgetc(), traits_type::eof()))
|
||||
__sbuf_ = 0;
|
||||
return __sbuf_ == 0;
|
||||
}
|
||||
public:
|
||||
_LIBCPP_INLINE_VISIBILITY istreambuf_iterator() _NOEXCEPT : __sbuf_(0) {}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR istreambuf_iterator() _NOEXCEPT : __sbuf_(0) {}
|
||||
_LIBCPP_INLINE_VISIBILITY istreambuf_iterator(istream_type& __s) _NOEXCEPT
|
||||
: __sbuf_(__s.rdbuf()) {__test_for_eof();}
|
||||
: __sbuf_(__s.rdbuf()) {}
|
||||
_LIBCPP_INLINE_VISIBILITY istreambuf_iterator(streambuf_type* __s) _NOEXCEPT
|
||||
: __sbuf_(__s) {__test_for_eof();}
|
||||
: __sbuf_(__s) {}
|
||||
_LIBCPP_INLINE_VISIBILITY istreambuf_iterator(const __proxy& __p) _NOEXCEPT
|
||||
: __sbuf_(__p.__sbuf_) {}
|
||||
|
||||
@@ -828,19 +849,16 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY char_type* operator->() const {return nullptr;}
|
||||
_LIBCPP_INLINE_VISIBILITY istreambuf_iterator& operator++()
|
||||
{
|
||||
if (traits_type::eq_int_type(__sbuf_->snextc(), traits_type::eof()))
|
||||
__sbuf_ = 0;
|
||||
__sbuf_->sbumpc();
|
||||
return *this;
|
||||
}
|
||||
_LIBCPP_INLINE_VISIBILITY __proxy operator++(int)
|
||||
{
|
||||
char_type __c = __sbuf_->sgetc();
|
||||
++(*this);
|
||||
return __proxy(__c, __sbuf_);
|
||||
return __proxy(__sbuf_->sbumpc(), __sbuf_);
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY bool equal(const istreambuf_iterator& __b) const
|
||||
{return (__sbuf_ == 0) == (__b.__sbuf_ == 0);}
|
||||
{return __test_for_eof() == __b.__test_for_eof();}
|
||||
};
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
@@ -856,7 +874,7 @@ bool operator!=(const istreambuf_iterator<_CharT,_Traits>& __a,
|
||||
{return !__a.equal(__b);}
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
class _LIBCPP_VISIBLE ostreambuf_iterator
|
||||
class _LIBCPP_TYPE_VIS_ONLY ostreambuf_iterator
|
||||
: public iterator<output_iterator_tag, void, void, void, void>
|
||||
{
|
||||
public:
|
||||
@@ -882,6 +900,10 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY ostreambuf_iterator& operator++(int) {return *this;}
|
||||
_LIBCPP_INLINE_VISIBILITY bool failed() const _NOEXCEPT {return __sbuf_ == 0;}
|
||||
|
||||
#if !defined(__APPLE__) || \
|
||||
(defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED > __MAC_10_8) || \
|
||||
(defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_6_0)
|
||||
|
||||
template <class _Ch, class _Tr>
|
||||
friend
|
||||
_LIBCPP_HIDDEN
|
||||
@@ -889,10 +911,11 @@ public:
|
||||
__pad_and_output(ostreambuf_iterator<_Ch, _Tr> __s,
|
||||
const _Ch* __ob, const _Ch* __op, const _Ch* __oe,
|
||||
ios_base& __iob, _Ch __fl);
|
||||
#endif
|
||||
};
|
||||
|
||||
template <class _Iter>
|
||||
class _LIBCPP_VISIBLE move_iterator
|
||||
class _LIBCPP_TYPE_VIS_ONLY move_iterator
|
||||
{
|
||||
private:
|
||||
_Iter __i;
|
||||
@@ -1007,7 +1030,7 @@ operator+(typename move_iterator<_Iter>::difference_type __n, const move_iterato
|
||||
template <class _Iter>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
move_iterator<_Iter>
|
||||
make_move_iterator(const _Iter& __i)
|
||||
make_move_iterator(_Iter __i)
|
||||
{
|
||||
return move_iterator<_Iter>(__i);
|
||||
}
|
||||
@@ -1084,6 +1107,9 @@ private:
|
||||
iterator_type __i;
|
||||
public:
|
||||
_LIBCPP_INLINE_VISIBILITY __wrap_iter() _NOEXCEPT
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
: __i{}
|
||||
#endif
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__insert_i(this);
|
||||
@@ -1128,7 +1154,14 @@ public:
|
||||
#endif
|
||||
return *__i;
|
||||
}
|
||||
_LIBCPP_INLINE_VISIBILITY pointer operator->() const _NOEXCEPT {return &(operator*());}
|
||||
_LIBCPP_INLINE_VISIBILITY pointer operator->() const _NOEXCEPT
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
_LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
|
||||
"Attempted to dereference a non-dereferenceable iterator");
|
||||
#endif
|
||||
return (pointer)&reinterpret_cast<const volatile char&>(*__i);
|
||||
}
|
||||
_LIBCPP_INLINE_VISIBILITY __wrap_iter& operator++() _NOEXCEPT
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
@@ -1178,12 +1211,13 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY iterator_type base() const _NOEXCEPT {return __i;}
|
||||
|
||||
private:
|
||||
_LIBCPP_INLINE_VISIBILITY __wrap_iter(iterator_type __x) _NOEXCEPT : __i(__x) {}
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
_LIBCPP_INLINE_VISIBILITY __wrap_iter(const void* __p, iterator_type __x) : __i(__x)
|
||||
{
|
||||
__get_db()->__insert_ic(this, __p);
|
||||
}
|
||||
#else
|
||||
_LIBCPP_INLINE_VISIBILITY __wrap_iter(iterator_type __x) _NOEXCEPT : __i(__x) {}
|
||||
#endif
|
||||
|
||||
template <class _Up> friend class __wrap_iter;
|
||||
@@ -1250,10 +1284,6 @@ inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator==(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
_LIBCPP_ASSERT(__get_const_db()->__comparable(&__x, &__y),
|
||||
"Attempted to compare incomparable iterators");
|
||||
#endif
|
||||
return __x.base() == __y.base();
|
||||
}
|
||||
|
||||
@@ -1263,7 +1293,7 @@ bool
|
||||
operator<(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
_LIBCPP_ASSERT(__get_const_db()->__comparable(&__x, &__y),
|
||||
_LIBCPP_ASSERT(__get_const_db()->__less_than_comparable(&__x, &__y),
|
||||
"Attempted to compare incomparable iterators");
|
||||
#endif
|
||||
return __x.base() < __y.base();
|
||||
@@ -1339,7 +1369,7 @@ typename __wrap_iter<_Iter1>::difference_type
|
||||
operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
_LIBCPP_ASSERT(__get_const_db()->__comparable(&__x, &__y),
|
||||
_LIBCPP_ASSERT(__get_const_db()->__less_than_comparable(&__x, &__y),
|
||||
"Attempted to subtract incompatible iterators");
|
||||
#endif
|
||||
return __x.base() - __y.base();
|
||||
@@ -1355,422 +1385,22 @@ operator+(typename __wrap_iter<_Iter>::difference_type __n,
|
||||
return __x;
|
||||
}
|
||||
|
||||
#ifdef _LIBCPP_DEBUG
|
||||
|
||||
// __debug_iter
|
||||
|
||||
template <class _Container, class _Iter> class __debug_iter;
|
||||
|
||||
template <class _Container, class _Iter1, class _Iter2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator==(const __debug_iter<_Container, _Iter1>&, const __debug_iter<_Container, _Iter2>&);
|
||||
|
||||
template <class _Container, class _Iter1, class _Iter2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator<(const __debug_iter<_Container, _Iter1>&, const __debug_iter<_Container, _Iter2>&);
|
||||
|
||||
template <class _Container, class _Iter1, class _Iter2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator!=(const __debug_iter<_Container, _Iter1>&, const __debug_iter<_Container, _Iter2>&);
|
||||
|
||||
template <class _Container, class _Iter1, class _Iter2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator>(const __debug_iter<_Container, _Iter1>&, const __debug_iter<_Container, _Iter2>&);
|
||||
|
||||
template <class _Container, class _Iter1, class _Iter2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator>=(const __debug_iter<_Container, _Iter1>&, const __debug_iter<_Container, _Iter2>&);
|
||||
|
||||
template <class _Container, class _Iter1, class _Iter2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator<=(const __debug_iter<_Container, _Iter1>&, const __debug_iter<_Container, _Iter2>&);
|
||||
|
||||
template <class _Container, class _Iter1, class _Iter2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
typename __debug_iter<_Container, _Iter1>::difference_type
|
||||
operator-(const __debug_iter<_Container, _Iter1>&, const __debug_iter<_Container, _Iter2>&);
|
||||
|
||||
template <class _Container, class _Iter>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__debug_iter<_Container, _Iter>
|
||||
operator+(typename __debug_iter<_Container, _Iter>::difference_type, const __debug_iter<_Container, _Iter>&);
|
||||
|
||||
template <class _Container, class _Iter>
|
||||
class __debug_iter
|
||||
{
|
||||
public:
|
||||
typedef _Iter iterator_type;
|
||||
typedef _Container __container_type;
|
||||
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>::difference_type difference_type;
|
||||
typedef typename iterator_traits<iterator_type>::pointer pointer;
|
||||
typedef typename iterator_traits<iterator_type>::reference reference;
|
||||
private:
|
||||
iterator_type __i;
|
||||
__debug_iter* __next;
|
||||
__container_type* __cont;
|
||||
|
||||
public:
|
||||
_LIBCPP_INLINE_VISIBILITY __debug_iter() : __next(0), __cont(0) {}
|
||||
_LIBCPP_INLINE_VISIBILITY __debug_iter(const __debug_iter& __x)
|
||||
: __i(__x.base()), __next(0), __cont(0) {__set_owner(__x.__cont);}
|
||||
__debug_iter& operator=(const __debug_iter& __x);
|
||||
template <class _Up> _LIBCPP_INLINE_VISIBILITY __debug_iter(const __debug_iter<_Container, _Up>& __u,
|
||||
typename enable_if<is_convertible<_Up, iterator_type>::value>::type* = 0)
|
||||
: __i(__u.base()), __next(0), __cont(0) {__set_owner(__u.__cont);}
|
||||
_LIBCPP_INLINE_VISIBILITY ~__debug_iter() {__remove_owner();}
|
||||
_LIBCPP_INLINE_VISIBILITY reference operator*() const {assert(__is_deref()); return *__i;}
|
||||
_LIBCPP_INLINE_VISIBILITY pointer operator->() const {return &(operator*());}
|
||||
_LIBCPP_INLINE_VISIBILITY __debug_iter& operator++() {assert(__can_increment()); ++__i; return *this;}
|
||||
_LIBCPP_INLINE_VISIBILITY __debug_iter operator++(int)
|
||||
{__debug_iter __tmp(*this); operator++(); return __tmp;}
|
||||
_LIBCPP_INLINE_VISIBILITY __debug_iter& operator--() {assert(__can_decrement()); --__i; return *this;}
|
||||
_LIBCPP_INLINE_VISIBILITY __debug_iter operator--(int)
|
||||
{__debug_iter __tmp(*this); operator--(); return __tmp;}
|
||||
_LIBCPP_INLINE_VISIBILITY __debug_iter operator+ (difference_type __n) const
|
||||
{__debug_iter __t(*this); __t += __n; return __t;}
|
||||
__debug_iter& operator+=(difference_type __n);
|
||||
_LIBCPP_INLINE_VISIBILITY __debug_iter operator- (difference_type __n) const
|
||||
{__debug_iter __t(*this); __t -= __n; return __t;}
|
||||
_LIBCPP_INLINE_VISIBILITY __debug_iter& operator-=(difference_type __n)
|
||||
{*this += -__n; return *this;}
|
||||
_LIBCPP_INLINE_VISIBILITY reference operator[](difference_type __n) const
|
||||
{return *(*this + __n);}
|
||||
|
||||
private:
|
||||
_LIBCPP_INLINE_VISIBILITY __debug_iter(const __container_type* __c, iterator_type __x)
|
||||
: __i(__x), __next(0), __cont(0) {__set_owner(__c);}
|
||||
_LIBCPP_INLINE_VISIBILITY iterator_type base() const {return __i;}
|
||||
|
||||
void __set_owner(const __container_type* __c);
|
||||
void __remove_owner();
|
||||
static void __remove_all(__container_type* __c);
|
||||
static void swap(__container_type* __x, __container_type* __y);
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY bool __is_deref() const
|
||||
{return __is_deref(__is_random_access_iterator<iterator_type>());}
|
||||
bool __is_deref(false_type) const;
|
||||
bool __is_deref(true_type) const;
|
||||
_LIBCPP_INLINE_VISIBILITY bool __can_decrement() const
|
||||
{return __can_decrement(integral_constant<int, is_pointer<iterator_type>::value ? 2:
|
||||
__is_random_access_iterator<iterator_type>::value ? 1 : 0>());}
|
||||
bool __can_decrement(integral_constant<int, 0>) const;
|
||||
bool __can_decrement(integral_constant<int, 1>) const;
|
||||
bool __can_decrement(integral_constant<int, 2>) const;
|
||||
_LIBCPP_INLINE_VISIBILITY bool __can_increment() const
|
||||
{return __can_increment(integral_constant<int, is_pointer<iterator_type>::value ? 2:
|
||||
__is_random_access_iterator<iterator_type>::value ? 1 : 0>());}
|
||||
bool __can_increment(integral_constant<int, 0>) const;
|
||||
bool __can_increment(integral_constant<int, 1>) const;
|
||||
bool __can_increment(integral_constant<int, 2>) const;
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY bool __can_add(difference_type __n) const
|
||||
{return __can_add(__n, is_pointer<iterator_type>());}
|
||||
bool __can_add(difference_type __n, false_type) const;
|
||||
bool __can_add(difference_type __n, true_type) const;
|
||||
|
||||
template <class _Cp, class _Up> friend class __debug_iter;
|
||||
friend class _Container::__self;
|
||||
|
||||
template <class _Cp, class _Iter1, class _Iter2>
|
||||
friend
|
||||
bool
|
||||
operator==(const __debug_iter<_Cp, _Iter1>&, const __debug_iter<_Cp, _Iter2>&);
|
||||
|
||||
template <class _Cp, class _Iter1, class _Iter2>
|
||||
friend
|
||||
bool
|
||||
operator<(const __debug_iter<_Cp, _Iter1>&, const __debug_iter<_Cp, _Iter2>&);
|
||||
|
||||
template <class _Cp, class _Iter1, class _Iter2>
|
||||
friend
|
||||
bool
|
||||
operator!=(const __debug_iter<_Cp, _Iter1>&, const __debug_iter<_Cp, _Iter2>&);
|
||||
|
||||
template <class _Cp, class _Iter1, class _Iter2>
|
||||
friend
|
||||
bool
|
||||
operator>(const __debug_iter<_Cp, _Iter1>&, const __debug_iter<_Cp, _Iter2>&);
|
||||
|
||||
template <class _Cp, class _Iter1, class _Iter2>
|
||||
friend
|
||||
bool
|
||||
operator>=(const __debug_iter<_Cp, _Iter1>&, const __debug_iter<_Cp, _Iter2>&);
|
||||
|
||||
template <class _Cp, class _Iter1, class _Iter2>
|
||||
friend
|
||||
bool
|
||||
operator<=(const __debug_iter<_Cp, _Iter1>&, const __debug_iter<_Cp, _Iter2>&);
|
||||
|
||||
template <class _Cp, class _Iter1, class _Iter2>
|
||||
friend
|
||||
typename __debug_iter<_Cp, _Iter1>::difference_type
|
||||
operator-(const __debug_iter<_Cp, _Iter1>&, const __debug_iter<_Cp, _Iter2>&);
|
||||
|
||||
template <class _Cp, class _Iter1>
|
||||
friend
|
||||
__debug_iter<_Cp, _Iter1>
|
||||
operator+(typename __debug_iter<_Cp, _Iter1>::difference_type, const __debug_iter<_Cp, _Iter1>&);
|
||||
};
|
||||
|
||||
template <class _Container, class _Iter>
|
||||
__debug_iter<_Container, _Iter>&
|
||||
__debug_iter<_Container, _Iter>::operator=(const __debug_iter& __x)
|
||||
{
|
||||
if (this != &__x)
|
||||
{
|
||||
__remove_owner();
|
||||
__i = __x.__i;
|
||||
__set_owner(__x.__cont);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <class _Container, class _Iter>
|
||||
void
|
||||
__debug_iter<_Container, _Iter>::__set_owner(const __container_type* __c)
|
||||
{
|
||||
__cont = const_cast<__container_type*>(__c);
|
||||
__debug_iter*& __head = __cont->__get_iterator_list(this);
|
||||
__next = __head;
|
||||
__head = this;
|
||||
}
|
||||
|
||||
template <class _Container, class _Iter>
|
||||
void
|
||||
__debug_iter<_Container, _Iter>::__remove_owner()
|
||||
{
|
||||
if (__cont)
|
||||
{
|
||||
__debug_iter*& __head = __cont->__get_iterator_list(this);
|
||||
if (__head == this)
|
||||
__head = __next;
|
||||
else
|
||||
{
|
||||
__debug_iter* __prev = __head;
|
||||
for (__debug_iter* __p = __head->__next; __p != this; __p = __p->__next)
|
||||
__prev = __p;
|
||||
__prev->__next = __next;
|
||||
}
|
||||
__cont = 0;
|
||||
}
|
||||
}
|
||||
|
||||
template <class _Container, class _Iter>
|
||||
void
|
||||
__debug_iter<_Container, _Iter>::__remove_all(__container_type* __c)
|
||||
{
|
||||
__debug_iter*& __head = __c->__get_iterator_list((__debug_iter*)0);
|
||||
__debug_iter* __p = __head;
|
||||
__head = 0;
|
||||
while (__p)
|
||||
{
|
||||
__p->__cont = 0;
|
||||
__debug_iter* __n = __p->__next;
|
||||
__p->__next = 0;
|
||||
__p = __n;
|
||||
}
|
||||
}
|
||||
|
||||
template <class _Container, class _Iter>
|
||||
void
|
||||
__debug_iter<_Container, _Iter>::swap(__container_type* __x, __container_type* __y)
|
||||
{
|
||||
__debug_iter*& __head_x = __x->__get_iterator_list((__debug_iter*)0);
|
||||
__debug_iter*& __head_y = __y->__get_iterator_list((__debug_iter*)0);
|
||||
__debug_iter* __p = __head_x;
|
||||
__head_x = __head_y;
|
||||
__head_y = __p;
|
||||
for (__p = __head_x; __p; __p = __p->__next)
|
||||
__p->__cont = __x;
|
||||
for (__p = __head_y; __p; __p = __p->__next)
|
||||
__p->__cont = __y;
|
||||
}
|
||||
|
||||
template <class _Container, class _Iter>
|
||||
bool
|
||||
__debug_iter<_Container, _Iter>::__is_deref(false_type) const
|
||||
{
|
||||
if (__cont == 0)
|
||||
return false;
|
||||
return __i != __cont->end().base();
|
||||
}
|
||||
|
||||
template <class _Container, class _Iter>
|
||||
bool
|
||||
__debug_iter<_Container, _Iter>::__is_deref(true_type) const
|
||||
{
|
||||
if (__cont == 0)
|
||||
return false;
|
||||
return __i < __cont->end().base();
|
||||
}
|
||||
|
||||
template <class _Container, class _Iter>
|
||||
bool
|
||||
__debug_iter<_Container, _Iter>::__can_decrement(integral_constant<int, 0>) const
|
||||
{
|
||||
if (__cont == 0)
|
||||
return false;
|
||||
return __i != __cont->begin().base();
|
||||
}
|
||||
|
||||
template <class _Container, class _Iter>
|
||||
bool
|
||||
__debug_iter<_Container, _Iter>::__can_decrement(integral_constant<int, 1>) const
|
||||
{
|
||||
if (__cont == 0)
|
||||
return false;
|
||||
iterator_type __b = __cont->begin().base();
|
||||
return __b < __i && __i <= __b + __cont->size();
|
||||
}
|
||||
|
||||
template <class _Container, class _Iter>
|
||||
bool
|
||||
__debug_iter<_Container, _Iter>::__can_decrement(integral_constant<int, 2>) const
|
||||
{
|
||||
if (__cont == 0)
|
||||
return false;
|
||||
iterator_type __b = __cont->begin().base();
|
||||
return __b < __i && __i <= __b + __cont->size();
|
||||
}
|
||||
|
||||
template <class _Container, class _Iter>
|
||||
bool
|
||||
__debug_iter<_Container, _Iter>::__can_increment(integral_constant<int, 0>) const
|
||||
{
|
||||
if (__cont == 0)
|
||||
return false;
|
||||
return __i != __cont->end().base();
|
||||
}
|
||||
|
||||
template <class _Container, class _Iter>
|
||||
bool
|
||||
__debug_iter<_Container, _Iter>::__can_increment(integral_constant<int, 1>) const
|
||||
{
|
||||
if (__cont == 0)
|
||||
return false;
|
||||
iterator_type __b = __cont->begin().base();
|
||||
return __b <= __i && __i < __b + __cont->size();
|
||||
}
|
||||
|
||||
template <class _Container, class _Iter>
|
||||
bool
|
||||
__debug_iter<_Container, _Iter>::__can_increment(integral_constant<int, 2>) const
|
||||
{
|
||||
if (__cont == 0)
|
||||
return false;
|
||||
iterator_type __b = __cont->begin().base();
|
||||
return __b <= __i && __i < __b + __cont->size();
|
||||
}
|
||||
|
||||
template <class _Container, class _Iter>
|
||||
bool
|
||||
__debug_iter<_Container, _Iter>::__can_add(difference_type __n, false_type) const
|
||||
{
|
||||
if (__cont == 0)
|
||||
return false;
|
||||
iterator_type __b = __cont->begin().base();
|
||||
iterator_type __j = __i + __n;
|
||||
return __b <= __j && __j <= __b + __cont->size();
|
||||
}
|
||||
|
||||
template <class _Container, class _Iter>
|
||||
bool
|
||||
__debug_iter<_Container, _Iter>::__can_add(difference_type __n, true_type) const
|
||||
{
|
||||
if (__cont == 0)
|
||||
return false;
|
||||
iterator_type __b = __cont->begin().base();
|
||||
iterator_type __j = __i + __n;
|
||||
return __b <= __j && __j <= __b + __cont->size();
|
||||
}
|
||||
|
||||
template <class _Container, class _Iter>
|
||||
__debug_iter<_Container, _Iter>&
|
||||
__debug_iter<_Container, _Iter>::operator+=(difference_type __n)
|
||||
{
|
||||
assert(__can_add(__n));
|
||||
__i += __n;
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <class _Container, class _Iter1, class _Iter2>
|
||||
template <class _Tp, size_t _Np>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator==(const __debug_iter<_Container, _Iter1>& __x, const __debug_iter<_Container, _Iter2>& __y)
|
||||
_Tp*
|
||||
begin(_Tp (&__array)[_Np])
|
||||
{
|
||||
assert(__x.__cont && __x.__cont == __y.__cont);
|
||||
return __x.base() == __y.base();
|
||||
return __array;
|
||||
}
|
||||
|
||||
template <class _Container, class _Iter1, class _Iter2>
|
||||
template <class _Tp, size_t _Np>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator!=(const __debug_iter<_Container, _Iter1>& __x, const __debug_iter<_Container, _Iter2>& __y)
|
||||
_Tp*
|
||||
end(_Tp (&__array)[_Np])
|
||||
{
|
||||
return !(__x == __y);
|
||||
return __array + _Np;
|
||||
}
|
||||
|
||||
template <class _Container, class _Iter1, class _Iter2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator<(const __debug_iter<_Container, _Iter1>& __x, const __debug_iter<_Container, _Iter2>& __y)
|
||||
{
|
||||
assert(__x.__cont && __x.__cont == __y.__cont);
|
||||
return __x.base() < __y.base();
|
||||
}
|
||||
|
||||
template <class _Container, class _Iter1, class _Iter2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator>(const __debug_iter<_Container, _Iter1>& __x, const __debug_iter<_Container, _Iter2>& __y)
|
||||
{
|
||||
return __y < __x;
|
||||
}
|
||||
|
||||
template <class _Container, class _Iter1, class _Iter2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator>=(const __debug_iter<_Container, _Iter1>& __x, const __debug_iter<_Container, _Iter2>& __y)
|
||||
{
|
||||
return !(__x < __y);
|
||||
}
|
||||
|
||||
template <class _Container, class _Iter1, class _Iter2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
operator<=(const __debug_iter<_Container, _Iter1>& __x, const __debug_iter<_Container, _Iter2>& __y)
|
||||
{
|
||||
return !(__y < __x);
|
||||
}
|
||||
|
||||
template <class _Container, class _Iter1, class _Iter2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
typename __debug_iter<_Container, _Iter1>::difference_type
|
||||
operator-(const __debug_iter<_Container, _Iter1>& __x, const __debug_iter<_Container, _Iter2>& __y)
|
||||
{
|
||||
assert(__x.__cont && __x.__cont == __y.__cont);
|
||||
return __x.base() - __y.base();
|
||||
}
|
||||
|
||||
template <class _Container, class _Iter>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
__debug_iter<_Container, _Iter>
|
||||
operator+(typename __debug_iter<_Container, _Iter>::difference_type __n,
|
||||
const __debug_iter<_Container, _Iter>& __x)
|
||||
{
|
||||
return __x + __n;
|
||||
}
|
||||
|
||||
#endif // _LIBCPP_DEBUG
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_TRAILING_RETURN)
|
||||
|
||||
template <class _Cp>
|
||||
@@ -1805,6 +1435,95 @@ end(const _Cp& __c) -> decltype(__c.end())
|
||||
return __c.end();
|
||||
}
|
||||
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
|
||||
template <class _Tp, size_t _Np>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
reverse_iterator<_Tp*> rbegin(_Tp (&__array)[_Np])
|
||||
{
|
||||
return reverse_iterator<_Tp*>(__array + _Np);
|
||||
}
|
||||
|
||||
template <class _Tp, size_t _Np>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
reverse_iterator<_Tp*> rend(_Tp (&__array)[_Np])
|
||||
{
|
||||
return reverse_iterator<_Tp*>(__array);
|
||||
}
|
||||
|
||||
template <class _Ep>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
reverse_iterator<const _Ep*> rbegin(initializer_list<_Ep> __il)
|
||||
{
|
||||
return reverse_iterator<const _Ep*>(__il.end());
|
||||
}
|
||||
|
||||
template <class _Ep>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
reverse_iterator<const _Ep*> rend(initializer_list<_Ep> __il)
|
||||
{
|
||||
return reverse_iterator<const _Ep*>(__il.begin());
|
||||
}
|
||||
|
||||
template <class _Cp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
auto cbegin(const _Cp& __c) -> decltype(begin(__c))
|
||||
{
|
||||
return _VSTD::begin(__c);
|
||||
}
|
||||
|
||||
template <class _Cp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
auto cend(const _Cp& __c) -> decltype(end(__c))
|
||||
{
|
||||
return _VSTD::end(__c);
|
||||
}
|
||||
|
||||
template <class _Cp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
auto rbegin(_Cp& __c) -> decltype(__c.rbegin())
|
||||
{
|
||||
return __c.rbegin();
|
||||
}
|
||||
|
||||
template <class _Cp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
auto rbegin(const _Cp& __c) -> decltype(__c.rbegin())
|
||||
{
|
||||
return __c.rbegin();
|
||||
}
|
||||
|
||||
template <class _Cp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
auto rend(_Cp& __c) -> decltype(__c.rend())
|
||||
{
|
||||
return __c.rend();
|
||||
}
|
||||
|
||||
template <class _Cp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
auto rend(const _Cp& __c) -> decltype(__c.rend())
|
||||
{
|
||||
return __c.rend();
|
||||
}
|
||||
|
||||
template <class _Cp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
auto crbegin(const _Cp& __c) -> decltype(rbegin(__c))
|
||||
{
|
||||
return rbegin(__c);
|
||||
}
|
||||
|
||||
template <class _Cp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
auto crend(const _Cp& __c) -> decltype(rend(__c))
|
||||
{
|
||||
return rend(__c);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#else // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_TRAILING_RETURN)
|
||||
|
||||
template <class _Cp>
|
||||
@@ -1841,22 +1560,6 @@ end(const _Cp& __c)
|
||||
|
||||
#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_TRAILING_RETURN)
|
||||
|
||||
template <class _Tp, size_t _Np>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_Tp*
|
||||
begin(_Tp (&__array)[_Np])
|
||||
{
|
||||
return __array;
|
||||
}
|
||||
|
||||
template <class _Tp, size_t _Np>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_Tp*
|
||||
end(_Tp (&__array)[_Np])
|
||||
{
|
||||
return __array + _Np;
|
||||
}
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP_ITERATOR
|
||||
|
||||
@@ -111,9 +111,13 @@ template<> class numeric_limits<cv long double>;
|
||||
|
||||
#include <__undef_min_max>
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#if defined(_LIBCPP_MSVCRT)
|
||||
#include "support/win32/limits_win32.h"
|
||||
#endif // _MSC_VER
|
||||
#endif // _LIBCPP_MSVCRT
|
||||
|
||||
#if defined(__IBMCPP__)
|
||||
#include "support/ibm/limits.h"
|
||||
#endif // __IBMCPP__
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
@@ -433,7 +437,7 @@ protected:
|
||||
};
|
||||
|
||||
template <class _Tp>
|
||||
class _LIBCPP_VISIBLE numeric_limits
|
||||
class _LIBCPP_TYPE_VIS_ONLY numeric_limits
|
||||
: private __libcpp_numeric_limits<typename remove_cv<_Tp>::type>
|
||||
{
|
||||
typedef __libcpp_numeric_limits<typename remove_cv<_Tp>::type> __base;
|
||||
@@ -526,7 +530,7 @@ template <class _Tp>
|
||||
_LIBCPP_CONSTEXPR const float_round_style numeric_limits<_Tp>::round_style;
|
||||
|
||||
template <class _Tp>
|
||||
class _LIBCPP_VISIBLE numeric_limits<const _Tp>
|
||||
class _LIBCPP_TYPE_VIS_ONLY numeric_limits<const _Tp>
|
||||
: private numeric_limits<_Tp>
|
||||
{
|
||||
typedef numeric_limits<_Tp> __base;
|
||||
@@ -619,7 +623,7 @@ template <class _Tp>
|
||||
_LIBCPP_CONSTEXPR const float_round_style numeric_limits<const _Tp>::round_style;
|
||||
|
||||
template <class _Tp>
|
||||
class _LIBCPP_VISIBLE numeric_limits<volatile _Tp>
|
||||
class _LIBCPP_TYPE_VIS_ONLY numeric_limits<volatile _Tp>
|
||||
: private numeric_limits<_Tp>
|
||||
{
|
||||
typedef numeric_limits<_Tp> __base;
|
||||
@@ -712,7 +716,7 @@ template <class _Tp>
|
||||
_LIBCPP_CONSTEXPR const float_round_style numeric_limits<volatile _Tp>::round_style;
|
||||
|
||||
template <class _Tp>
|
||||
class _LIBCPP_VISIBLE numeric_limits<const volatile _Tp>
|
||||
class _LIBCPP_TYPE_VIS_ONLY numeric_limits<const volatile _Tp>
|
||||
: private numeric_limits<_Tp>
|
||||
{
|
||||
typedef numeric_limits<_Tp> __base;
|
||||
|
||||
304
include/list
304
include/list
@@ -40,6 +40,7 @@ public:
|
||||
noexcept(is_nothrow_default_constructible<allocator_type>::value);
|
||||
explicit list(const allocator_type& a);
|
||||
explicit list(size_type n);
|
||||
explicit list(size_type n, const allocator_type& a); // C++14
|
||||
list(size_type n, const value_type& value);
|
||||
list(size_type n, const value_type& value, const allocator_type& a);
|
||||
template <class Iter>
|
||||
@@ -178,6 +179,12 @@ template <class T, class Alloc>
|
||||
|
||||
#include <__undef_min_max>
|
||||
|
||||
#ifdef _LIBCPP_DEBUG
|
||||
# include <__debug>
|
||||
#else
|
||||
# define _LIBCPP_ASSERT(x, m) ((void)0)
|
||||
#endif
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
@@ -196,13 +203,20 @@ struct __list_node_base
|
||||
rebind<__list_node<_Tp, _VoidPtr> >::other pointer;
|
||||
#endif
|
||||
|
||||
typedef typename pointer_traits<_VoidPtr>::template
|
||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
rebind<__list_node_base> __base_pointer;
|
||||
#else
|
||||
rebind<__list_node_base>::other __base_pointer;
|
||||
#endif
|
||||
|
||||
pointer __prev_;
|
||||
pointer __next_;
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__list_node_base()
|
||||
: __prev_(static_cast<pointer>(this)),
|
||||
__next_(static_cast<pointer>(this))
|
||||
: __prev_(static_cast<pointer>(pointer_traits<__base_pointer>::pointer_to(*this))),
|
||||
__next_(static_cast<pointer>(pointer_traits<__base_pointer>::pointer_to(*this)))
|
||||
{}
|
||||
};
|
||||
|
||||
@@ -213,12 +227,12 @@ struct __list_node
|
||||
_Tp __value_;
|
||||
};
|
||||
|
||||
template <class _Tp, class _Alloc> class _LIBCPP_VISIBLE list;
|
||||
template <class _Tp, class _Alloc> class _LIBCPP_TYPE_VIS_ONLY list;
|
||||
template <class _Tp, class _Alloc> class __list_imp;
|
||||
template <class _Tp, class _VoidPtr> class _LIBCPP_VISIBLE __list_const_iterator;
|
||||
template <class _Tp, class _VoidPtr> class _LIBCPP_TYPE_VIS_ONLY __list_const_iterator;
|
||||
|
||||
template <class _Tp, class _VoidPtr>
|
||||
class _LIBCPP_VISIBLE __list_iterator
|
||||
class _LIBCPP_TYPE_VIS_ONLY __list_iterator
|
||||
{
|
||||
typedef typename pointer_traits<_VoidPtr>::template
|
||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
@@ -260,7 +274,7 @@ public:
|
||||
typedef typename pointer_traits<pointer>::difference_type difference_type;
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__list_iterator() _NOEXCEPT
|
||||
__list_iterator() _NOEXCEPT : __ptr_(nullptr)
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__insert_i(this);
|
||||
@@ -305,7 +319,14 @@ public:
|
||||
return __ptr_->__value_;
|
||||
}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
pointer operator->() const {return &(operator*());}
|
||||
pointer operator->() const
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
_LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
|
||||
"Attempted to dereference a non-dereferenceable list::iterator");
|
||||
#endif
|
||||
return pointer_traits<pointer>::pointer_to(__ptr_->__value_);
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__list_iterator& operator++()
|
||||
@@ -336,10 +357,6 @@ public:
|
||||
friend _LIBCPP_INLINE_VISIBILITY
|
||||
bool operator==(const __list_iterator& __x, const __list_iterator& __y)
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
_LIBCPP_ASSERT(__get_const_db()->__comparable(&__x, &__y),
|
||||
"Attempted to compare non-comparable list::iterator");
|
||||
#endif
|
||||
return __x.__ptr_ == __y.__ptr_;
|
||||
}
|
||||
friend _LIBCPP_INLINE_VISIBILITY
|
||||
@@ -348,13 +365,13 @@ public:
|
||||
};
|
||||
|
||||
template <class _Tp, class _VoidPtr>
|
||||
class _LIBCPP_VISIBLE __list_const_iterator
|
||||
class _LIBCPP_TYPE_VIS_ONLY __list_const_iterator
|
||||
{
|
||||
typedef typename pointer_traits<_VoidPtr>::template
|
||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
rebind<const __list_node<_Tp, _VoidPtr> > __node_pointer;
|
||||
rebind<__list_node<_Tp, _VoidPtr> > __node_pointer;
|
||||
#else
|
||||
rebind<const __list_node<_Tp, _VoidPtr> >::other __node_pointer;
|
||||
rebind<__list_node<_Tp, _VoidPtr> >::other __node_pointer;
|
||||
#endif
|
||||
|
||||
__node_pointer __ptr_;
|
||||
@@ -387,14 +404,14 @@ public:
|
||||
typedef typename pointer_traits<pointer>::difference_type difference_type;
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__list_const_iterator() _NOEXCEPT
|
||||
__list_const_iterator() _NOEXCEPT : __ptr_(nullptr)
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__insert_i(this);
|
||||
#endif
|
||||
}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__list_const_iterator(__list_iterator<_Tp, _VoidPtr> __p) _NOEXCEPT
|
||||
__list_const_iterator(const __list_iterator<_Tp, _VoidPtr>& __p) _NOEXCEPT
|
||||
: __ptr_(__p.__ptr_)
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
@@ -439,7 +456,14 @@ public:
|
||||
return __ptr_->__value_;
|
||||
}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
pointer operator->() const {return &(operator*());}
|
||||
pointer operator->() const
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
_LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
|
||||
"Attempted to dereference a non-dereferenceable list::iterator");
|
||||
#endif
|
||||
return pointer_traits<pointer>::pointer_to(__ptr_->__value_);
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__list_const_iterator& operator++()
|
||||
@@ -470,10 +494,6 @@ public:
|
||||
friend _LIBCPP_INLINE_VISIBILITY
|
||||
bool operator==(const __list_const_iterator& __x, const __list_const_iterator& __y)
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
_LIBCPP_ASSERT(__get_const_db()->__comparable(&__x, &__y),
|
||||
"Attempted to compare non-comparable list::const_iterator");
|
||||
#endif
|
||||
return __x.__ptr_ == __y.__ptr_;
|
||||
}
|
||||
friend _LIBCPP_INLINE_VISIBILITY
|
||||
@@ -505,11 +525,20 @@ protected:
|
||||
__node_allocator;
|
||||
typedef allocator_traits<__node_allocator> __node_alloc_traits;
|
||||
typedef typename __node_alloc_traits::pointer __node_pointer;
|
||||
typedef typename __node_alloc_traits::const_pointer __node_const_pointer;
|
||||
typedef typename __node_alloc_traits::pointer __node_const_pointer;
|
||||
typedef typename __alloc_traits::pointer pointer;
|
||||
typedef typename __alloc_traits::const_pointer const_pointer;
|
||||
typedef typename __alloc_traits::difference_type difference_type;
|
||||
|
||||
typedef typename __alloc_traits::template
|
||||
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
rebind_alloc<__node_base>
|
||||
#else
|
||||
rebind_alloc<__node_base>::other
|
||||
#endif
|
||||
__node_base_allocator;
|
||||
typedef typename allocator_traits<__node_base_allocator>::pointer __node_base_pointer;
|
||||
|
||||
__node_base __end_;
|
||||
__compressed_pair<size_type, __node_allocator> __size_alloc_;
|
||||
|
||||
@@ -525,7 +554,7 @@ protected:
|
||||
const __node_allocator& __node_alloc() const _NOEXCEPT
|
||||
{return __size_alloc_.second();}
|
||||
|
||||
static void __unlink_nodes(__node_base& __f, __node_base& __l) _NOEXCEPT;
|
||||
static void __unlink_nodes(__node_pointer __f, __node_pointer __l) _NOEXCEPT;
|
||||
|
||||
__list_imp()
|
||||
_NOEXCEPT_(is_nothrow_default_constructible<__node_allocator>::value);
|
||||
@@ -557,18 +586,22 @@ protected:
|
||||
iterator end() _NOEXCEPT
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
return iterator(static_cast<__node_pointer>(&__end_), this);
|
||||
return iterator(static_cast<__node_pointer>(
|
||||
pointer_traits<__node_base_pointer>::pointer_to(__end_)), this);
|
||||
#else
|
||||
return iterator(static_cast<__node_pointer>(&__end_));
|
||||
return iterator(static_cast<__node_pointer>(
|
||||
pointer_traits<__node_base_pointer>::pointer_to(__end_)));
|
||||
#endif
|
||||
}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
const_iterator end() const _NOEXCEPT
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
return const_iterator(static_cast<__node_const_pointer>(&__end_), this);
|
||||
return const_iterator(static_cast<__node_const_pointer>(
|
||||
pointer_traits<__node_base_pointer>::pointer_to(const_cast<__node_base&>(__end_))), this);
|
||||
#else
|
||||
return const_iterator(static_cast<__node_const_pointer>(&__end_));
|
||||
return const_iterator(static_cast<__node_const_pointer>(
|
||||
pointer_traits<__node_base_pointer>::pointer_to(const_cast<__node_base&>(__end_))));
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -637,11 +670,11 @@ private:
|
||||
template <class _Tp, class _Alloc>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
__list_imp<_Tp, _Alloc>::__unlink_nodes(__node_base& __f, __node_base& __l)
|
||||
__list_imp<_Tp, _Alloc>::__unlink_nodes(__node_pointer __f, __node_pointer __l)
|
||||
_NOEXCEPT
|
||||
{
|
||||
__f.__prev_->__next_ = __l.__next_;
|
||||
__l.__next_->__prev_ = __f.__prev_;
|
||||
__f->__prev_->__next_ = __l->__next_;
|
||||
__l->__next_->__prev_ = __f->__prev_;
|
||||
}
|
||||
|
||||
template <class _Tp, class _Alloc>
|
||||
@@ -676,15 +709,16 @@ __list_imp<_Tp, _Alloc>::clear() _NOEXCEPT
|
||||
{
|
||||
__node_allocator& __na = __node_alloc();
|
||||
__node_pointer __f = __end_.__next_;
|
||||
__node_pointer __l = static_cast<__node_pointer>(&__end_);
|
||||
__unlink_nodes(*__f, *__l->__prev_);
|
||||
__node_pointer __l = static_cast<__node_pointer>(
|
||||
pointer_traits<__node_base_pointer>::pointer_to(__end_));
|
||||
__unlink_nodes(__f, __l->__prev_);
|
||||
__sz() = 0;
|
||||
while (__f != __l)
|
||||
{
|
||||
__node& __n = *__f;
|
||||
__node_pointer __n = __f;
|
||||
__f = __f->__next_;
|
||||
__node_alloc_traits::destroy(__na, _VSTD::addressof(__n.__value_));
|
||||
__node_alloc_traits::deallocate(__na, _VSTD::addressof(__n), 1);
|
||||
__node_alloc_traits::destroy(__na, _VSTD::addressof(__n->__value_));
|
||||
__node_alloc_traits::deallocate(__na, __n, 1);
|
||||
}
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__c_node* __c = __get_db()->__find_c_and_lock(this);
|
||||
@@ -719,16 +753,20 @@ __list_imp<_Tp, _Alloc>::swap(__list_imp& __c)
|
||||
swap(__sz(), __c.__sz());
|
||||
swap(__end_, __c.__end_);
|
||||
if (__sz() == 0)
|
||||
__end_.__next_ = __end_.__prev_ = &static_cast<__node&>(__end_);
|
||||
__end_.__next_ = __end_.__prev_ = static_cast<__node_pointer>(
|
||||
pointer_traits<__node_base_pointer>::pointer_to(__end_));
|
||||
else
|
||||
__end_.__prev_->__next_ = __end_.__next_->__prev_
|
||||
= &static_cast<__node&>(__end_);
|
||||
= static_cast<__node_pointer>(
|
||||
pointer_traits<__node_base_pointer>::pointer_to(__end_));
|
||||
if (__c.__sz() == 0)
|
||||
__c.__end_.__next_ = __c.__end_.__prev_
|
||||
= &static_cast<__node&>(__c.__end_);
|
||||
= static_cast<__node_pointer>(
|
||||
pointer_traits<__node_base_pointer>::pointer_to(__c.__end_));
|
||||
else
|
||||
__c.__end_.__prev_->__next_ = __c.__end_.__next_->__prev_
|
||||
= &static_cast<__node&>(__c.__end_);
|
||||
= static_cast<__node_pointer>(
|
||||
pointer_traits<__node_base_pointer>::pointer_to(__c.__end_));
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__libcpp_db* __db = __get_db();
|
||||
__c_node* __cn1 = __db->__find_c_and_lock(this);
|
||||
@@ -740,7 +778,8 @@ __list_imp<_Tp, _Alloc>::swap(__list_imp& __c)
|
||||
{
|
||||
--__p;
|
||||
const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
|
||||
if (__i->__ptr_ == static_cast<__node_pointer>(&__c.__end_))
|
||||
if (__i->__ptr_ == static_cast<__node_pointer>(
|
||||
pointer_traits<__node_base_pointer>::pointer_to(__c.__end_)))
|
||||
{
|
||||
__cn2->__add(*__p);
|
||||
if (--__cn1->end_ != __p)
|
||||
@@ -753,7 +792,8 @@ __list_imp<_Tp, _Alloc>::swap(__list_imp& __c)
|
||||
{
|
||||
--__p;
|
||||
const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
|
||||
if (__i->__ptr_ == static_cast<__node_pointer>(&__end_))
|
||||
if (__i->__ptr_ == static_cast<__node_pointer>(
|
||||
pointer_traits<__node_base_pointer>::pointer_to(__end_)))
|
||||
{
|
||||
__cn1->__add(*__p);
|
||||
if (--__cn2->end_ != __p)
|
||||
@@ -767,7 +807,7 @@ __list_imp<_Tp, _Alloc>::swap(__list_imp& __c)
|
||||
}
|
||||
|
||||
template <class _Tp, class _Alloc = allocator<_Tp> >
|
||||
class _LIBCPP_VISIBLE list
|
||||
class _LIBCPP_TYPE_VIS_ONLY list
|
||||
: private __list_imp<_Tp, _Alloc>
|
||||
{
|
||||
typedef __list_imp<_Tp, _Alloc> base;
|
||||
@@ -775,6 +815,8 @@ class _LIBCPP_VISIBLE list
|
||||
typedef typename base::__node_allocator __node_allocator;
|
||||
typedef typename base::__node_pointer __node_pointer;
|
||||
typedef typename base::__node_alloc_traits __node_alloc_traits;
|
||||
typedef typename base::__node_base __node_base;
|
||||
typedef typename base::__node_base_pointer __node_base_pointer;
|
||||
|
||||
public:
|
||||
typedef _Tp value_type;
|
||||
@@ -801,13 +843,16 @@ public:
|
||||
#endif
|
||||
}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
list(const allocator_type& __a) : base(__a)
|
||||
explicit list(const allocator_type& __a) : base(__a)
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__insert_c(this);
|
||||
#endif
|
||||
}
|
||||
list(size_type __n);
|
||||
explicit list(size_type __n);
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
explicit list(size_type __n, const allocator_type& __a);
|
||||
#endif
|
||||
list(size_type __n, const value_type& __x);
|
||||
list(size_type __n, const value_type& __x, const allocator_type& __a);
|
||||
template <class _InpIter>
|
||||
@@ -1014,7 +1059,7 @@ public:
|
||||
#endif // _LIBCPP_DEBUG_LEVEL >= 2
|
||||
|
||||
private:
|
||||
static void __link_nodes(__node& __p, __node& __f, __node& __l);
|
||||
static void __link_nodes(__node_pointer __p, __node_pointer __f, __node_pointer __l);
|
||||
iterator __iterator(size_type __n);
|
||||
template <class _Comp>
|
||||
static iterator __sort(iterator __f1, iterator __e2, size_type __n, _Comp& __comp);
|
||||
@@ -1028,12 +1073,12 @@ private:
|
||||
template <class _Tp, class _Alloc>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
list<_Tp, _Alloc>::__link_nodes(__node& __p, __node& __f, __node& __l)
|
||||
list<_Tp, _Alloc>::__link_nodes(__node_pointer __p, __node_pointer __f, __node_pointer __l)
|
||||
{
|
||||
__p.__prev_->__next_ = &__f;
|
||||
__f.__prev_ = __p.__prev_;
|
||||
__p.__prev_ = &__l;
|
||||
__l.__next_ = &__p;
|
||||
__p->__prev_->__next_ = __f;
|
||||
__f->__prev_ = __p->__prev_;
|
||||
__p->__prev_ = __l;
|
||||
__l->__next_ = __p;
|
||||
}
|
||||
|
||||
template <class _Tp, class _Alloc>
|
||||
@@ -1059,6 +1104,22 @@ list<_Tp, _Alloc>::list(size_type __n)
|
||||
#endif
|
||||
}
|
||||
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
template <class _Tp, class _Alloc>
|
||||
list<_Tp, _Alloc>::list(size_type __n, const allocator_type& __a) : base(__a)
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__insert_c(this);
|
||||
#endif
|
||||
for (; __n > 0; --__n)
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
emplace_back();
|
||||
#else
|
||||
push_back(value_type());
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
template <class _Tp, class _Alloc>
|
||||
list<_Tp, _Alloc>::list(size_type __n, const value_type& __x)
|
||||
{
|
||||
@@ -1290,9 +1351,13 @@ 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));
|
||||
__hold->__prev_ = 0;
|
||||
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
|
||||
__link_nodes(const_cast<__node&>(*__p.__ptr_), *__hold, *__hold);
|
||||
__link_nodes(__p.__ptr_, __hold.get(), __hold.get());
|
||||
++base::__sz();
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
return iterator(__hold.release(), this);
|
||||
#else
|
||||
return iterator(__hold.release());
|
||||
#endif
|
||||
}
|
||||
|
||||
template <class _Tp, class _Alloc>
|
||||
@@ -1303,9 +1368,9 @@ list<_Tp, _Alloc>::insert(const_iterator __p, size_type __n, const value_type& _
|
||||
_LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
|
||||
"list::insert(iterator, n, x) called with an iterator not"
|
||||
" referring to this list");
|
||||
iterator __r(const_cast<__node_pointer>(__p.__ptr_), this);
|
||||
iterator __r(__p.__ptr_, this);
|
||||
#else
|
||||
iterator __r(const_cast<__node_pointer>(__p.__ptr_));
|
||||
iterator __r(__p.__ptr_);
|
||||
#endif
|
||||
if (__n > 0)
|
||||
{
|
||||
@@ -1355,7 +1420,7 @@ list<_Tp, _Alloc>::insert(const_iterator __p, size_type __n, const value_type& _
|
||||
throw;
|
||||
}
|
||||
#endif // _LIBCPP_NO_EXCEPTIONS
|
||||
__link_nodes(const_cast<__node&>(*__p.__ptr_), *__r.__ptr_, *__e.__ptr_);
|
||||
__link_nodes(__p.__ptr_, __r.__ptr_, __e.__ptr_);
|
||||
base::__sz() += __ds;
|
||||
}
|
||||
return __r;
|
||||
@@ -1371,9 +1436,9 @@ list<_Tp, _Alloc>::insert(const_iterator __p, _InpIter __f, _InpIter __l,
|
||||
_LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
|
||||
"list::insert(iterator, range) called with an iterator not"
|
||||
" referring to this list");
|
||||
iterator __r(const_cast<__node_pointer>(__p.__ptr_), this);
|
||||
iterator __r(__p.__ptr_, this);
|
||||
#else
|
||||
iterator __r(const_cast<__node_pointer>(__p.__ptr_));
|
||||
iterator __r(__p.__ptr_);
|
||||
#endif
|
||||
if (__f != __l)
|
||||
{
|
||||
@@ -1423,7 +1488,7 @@ list<_Tp, _Alloc>::insert(const_iterator __p, _InpIter __f, _InpIter __l,
|
||||
throw;
|
||||
}
|
||||
#endif // _LIBCPP_NO_EXCEPTIONS
|
||||
__link_nodes(const_cast<__node&>(*__p.__ptr_), *__r.__ptr_, *__e.__ptr_);
|
||||
__link_nodes(__p.__ptr_, __r.__ptr_, __e.__ptr_);
|
||||
base::__sz() += __ds;
|
||||
}
|
||||
return __r;
|
||||
@@ -1437,7 +1502,7 @@ list<_Tp, _Alloc>::push_front(const value_type& __x)
|
||||
typedef __allocator_destructor<__node_allocator> _Dp;
|
||||
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
|
||||
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
|
||||
__link_nodes(*base::__end_.__next_, *__hold, *__hold);
|
||||
__link_nodes(base::__end_.__next_, __hold.get(), __hold.get());
|
||||
++base::__sz();
|
||||
__hold.release();
|
||||
}
|
||||
@@ -1450,7 +1515,8 @@ list<_Tp, _Alloc>::push_back(const value_type& __x)
|
||||
typedef __allocator_destructor<__node_allocator> _Dp;
|
||||
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
|
||||
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
|
||||
__link_nodes(static_cast<__node&>(base::__end_), *__hold, *__hold);
|
||||
__link_nodes(static_cast<__node_pointer>(pointer_traits<__node_base_pointer>::
|
||||
pointer_to(base::__end_)), __hold.get(), __hold.get());
|
||||
++base::__sz();
|
||||
__hold.release();
|
||||
}
|
||||
@@ -1465,7 +1531,7 @@ list<_Tp, _Alloc>::push_front(value_type&& __x)
|
||||
typedef __allocator_destructor<__node_allocator> _Dp;
|
||||
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));
|
||||
__link_nodes(*base::__end_.__next_, *__hold, *__hold);
|
||||
__link_nodes(base::__end_.__next_, __hold.get(), __hold.get());
|
||||
++base::__sz();
|
||||
__hold.release();
|
||||
}
|
||||
@@ -1478,7 +1544,8 @@ list<_Tp, _Alloc>::push_back(value_type&& __x)
|
||||
typedef __allocator_destructor<__node_allocator> _Dp;
|
||||
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));
|
||||
__link_nodes(static_cast<__node&>(base::__end_), *__hold, *__hold);
|
||||
__link_nodes(static_cast<__node_pointer>(pointer_traits<__node_base_pointer>::
|
||||
pointer_to(base::__end_)), __hold.get(), __hold.get());
|
||||
++base::__sz();
|
||||
__hold.release();
|
||||
}
|
||||
@@ -1494,7 +1561,7 @@ list<_Tp, _Alloc>::emplace_front(_Args&&... __args)
|
||||
typedef __allocator_destructor<__node_allocator> _Dp;
|
||||
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)...);
|
||||
__link_nodes(*base::__end_.__next_, *__hold, *__hold);
|
||||
__link_nodes(base::__end_.__next_, __hold.get(), __hold.get());
|
||||
++base::__sz();
|
||||
__hold.release();
|
||||
}
|
||||
@@ -1508,7 +1575,8 @@ list<_Tp, _Alloc>::emplace_back(_Args&&... __args)
|
||||
typedef __allocator_destructor<__node_allocator> _Dp;
|
||||
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)...);
|
||||
__link_nodes(static_cast<__node&>(base::__end_), *__hold, *__hold);
|
||||
__link_nodes(static_cast<__node_pointer>(pointer_traits<__node_base_pointer>::
|
||||
pointer_to(base::__end_)), __hold.get(), __hold.get());
|
||||
++base::__sz();
|
||||
__hold.release();
|
||||
}
|
||||
@@ -1518,12 +1586,17 @@ template <class... _Args>
|
||||
typename list<_Tp, _Alloc>::iterator
|
||||
list<_Tp, _Alloc>::emplace(const_iterator __p, _Args&&... __args)
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
_LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
|
||||
"list::emplace(iterator, args...) called with an iterator not"
|
||||
" referring to this list");
|
||||
#endif
|
||||
__node_allocator& __na = base::__node_alloc();
|
||||
typedef __allocator_destructor<__node_allocator> _Dp;
|
||||
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
|
||||
__hold->__prev_ = 0;
|
||||
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::forward<_Args>(__args)...);
|
||||
__link_nodes(const_cast<__node&>(*__p.__ptr_), *__hold, *__hold);
|
||||
__link_nodes(__p.__ptr_, __hold.get(), __hold.get());
|
||||
++base::__sz();
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
return iterator(__hold.release(), this);
|
||||
@@ -1548,7 +1621,7 @@ list<_Tp, _Alloc>::insert(const_iterator __p, value_type&& __x)
|
||||
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
|
||||
__hold->__prev_ = 0;
|
||||
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::move(__x));
|
||||
__link_nodes(const_cast<__node&>(*__p.__ptr_), *__hold, *__hold);
|
||||
__link_nodes(__p.__ptr_, __hold.get(), __hold.get());
|
||||
++base::__sz();
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
return iterator(__hold.release(), this);
|
||||
@@ -1565,7 +1638,7 @@ list<_Tp, _Alloc>::pop_front()
|
||||
{
|
||||
_LIBCPP_ASSERT(!empty(), "list::pop_front() called with empty list");
|
||||
__node_allocator& __na = base::__node_alloc();
|
||||
__node& __n = *base::__end_.__next_;
|
||||
__node_pointer __n = base::__end_.__next_;
|
||||
base::__unlink_nodes(__n, __n);
|
||||
--base::__sz();
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
@@ -1574,7 +1647,7 @@ list<_Tp, _Alloc>::pop_front()
|
||||
{
|
||||
--__p;
|
||||
iterator* __i = static_cast<iterator*>((*__p)->__i_);
|
||||
if (__i->__ptr_ == &__n)
|
||||
if (__i->__ptr_ == __n)
|
||||
{
|
||||
(*__p)->__c_ = nullptr;
|
||||
if (--__c->end_ != __p)
|
||||
@@ -1583,17 +1656,17 @@ list<_Tp, _Alloc>::pop_front()
|
||||
}
|
||||
__get_db()->unlock();
|
||||
#endif
|
||||
__node_alloc_traits::destroy(__na, _VSTD::addressof(__n.__value_));
|
||||
__node_alloc_traits::deallocate(__na, _VSTD::addressof(__n), 1);
|
||||
__node_alloc_traits::destroy(__na, _VSTD::addressof(__n->__value_));
|
||||
__node_alloc_traits::deallocate(__na, __n, 1);
|
||||
}
|
||||
|
||||
template <class _Tp, class _Alloc>
|
||||
void
|
||||
list<_Tp, _Alloc>::pop_back()
|
||||
{
|
||||
_LIBCPP_ASSERT(!empty(), "list::pop_front() called with empty list");
|
||||
_LIBCPP_ASSERT(!empty(), "list::pop_back() called with empty list");
|
||||
__node_allocator& __na = base::__node_alloc();
|
||||
__node& __n = *base::__end_.__prev_;
|
||||
__node_pointer __n = base::__end_.__prev_;
|
||||
base::__unlink_nodes(__n, __n);
|
||||
--base::__sz();
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
@@ -1602,7 +1675,7 @@ list<_Tp, _Alloc>::pop_back()
|
||||
{
|
||||
--__p;
|
||||
iterator* __i = static_cast<iterator*>((*__p)->__i_);
|
||||
if (__i->__ptr_ == &__n)
|
||||
if (__i->__ptr_ == __n)
|
||||
{
|
||||
(*__p)->__c_ = nullptr;
|
||||
if (--__c->end_ != __p)
|
||||
@@ -1611,8 +1684,8 @@ list<_Tp, _Alloc>::pop_back()
|
||||
}
|
||||
__get_db()->unlock();
|
||||
#endif
|
||||
__node_alloc_traits::destroy(__na, _VSTD::addressof(__n.__value_));
|
||||
__node_alloc_traits::deallocate(__na, _VSTD::addressof(__n), 1);
|
||||
__node_alloc_traits::destroy(__na, _VSTD::addressof(__n->__value_));
|
||||
__node_alloc_traits::deallocate(__na, __n, 1);
|
||||
}
|
||||
|
||||
template <class _Tp, class _Alloc>
|
||||
@@ -1624,9 +1697,11 @@ list<_Tp, _Alloc>::erase(const_iterator __p)
|
||||
"list::erase(iterator) called with an iterator not"
|
||||
" referring to this list");
|
||||
#endif
|
||||
_LIBCPP_ASSERT(__p != end(),
|
||||
"list::erase(iterator) called with a non-dereferenceable iterator");
|
||||
__node_allocator& __na = base::__node_alloc();
|
||||
__node& __n = const_cast<__node&>(*__p.__ptr_);
|
||||
__node_pointer __r = __n.__next_;
|
||||
__node_pointer __n = __p.__ptr_;
|
||||
__node_pointer __r = __n->__next_;
|
||||
base::__unlink_nodes(__n, __n);
|
||||
--base::__sz();
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
@@ -1635,7 +1710,7 @@ list<_Tp, _Alloc>::erase(const_iterator __p)
|
||||
{
|
||||
--__p;
|
||||
iterator* __i = static_cast<iterator*>((*__p)->__i_);
|
||||
if (__i->__ptr_ == &__n)
|
||||
if (__i->__ptr_ == __n)
|
||||
{
|
||||
(*__p)->__c_ = nullptr;
|
||||
if (--__c->end_ != __p)
|
||||
@@ -1644,8 +1719,8 @@ list<_Tp, _Alloc>::erase(const_iterator __p)
|
||||
}
|
||||
__get_db()->unlock();
|
||||
#endif
|
||||
__node_alloc_traits::destroy(__na, _VSTD::addressof(__n.__value_));
|
||||
__node_alloc_traits::deallocate(__na, _VSTD::addressof(__n), 1);
|
||||
__node_alloc_traits::destroy(__na, _VSTD::addressof(__n->__value_));
|
||||
__node_alloc_traits::deallocate(__na, __n, 1);
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
return iterator(__r, this);
|
||||
#else
|
||||
@@ -1665,10 +1740,10 @@ list<_Tp, _Alloc>::erase(const_iterator __f, const_iterator __l)
|
||||
if (__f != __l)
|
||||
{
|
||||
__node_allocator& __na = base::__node_alloc();
|
||||
base::__unlink_nodes(const_cast<__node&>(*__f.__ptr_), *__l.__ptr_->__prev_);
|
||||
base::__unlink_nodes(__f.__ptr_, __l.__ptr_->__prev_);
|
||||
while (__f != __l)
|
||||
{
|
||||
__node& __n = const_cast<__node&>(*__f.__ptr_);
|
||||
__node_pointer __n = __f.__ptr_;
|
||||
++__f;
|
||||
--base::__sz();
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
@@ -1677,7 +1752,7 @@ list<_Tp, _Alloc>::erase(const_iterator __f, const_iterator __l)
|
||||
{
|
||||
--__p;
|
||||
iterator* __i = static_cast<iterator*>((*__p)->__i_);
|
||||
if (__i->__ptr_ == &__n)
|
||||
if (__i->__ptr_ == __n)
|
||||
{
|
||||
(*__p)->__c_ = nullptr;
|
||||
if (--__c->end_ != __p)
|
||||
@@ -1686,14 +1761,14 @@ list<_Tp, _Alloc>::erase(const_iterator __f, const_iterator __l)
|
||||
}
|
||||
__get_db()->unlock();
|
||||
#endif
|
||||
__node_alloc_traits::destroy(__na, _VSTD::addressof(__n.__value_));
|
||||
__node_alloc_traits::deallocate(__na, _VSTD::addressof(__n), 1);
|
||||
__node_alloc_traits::destroy(__na, _VSTD::addressof(__n->__value_));
|
||||
__node_alloc_traits::deallocate(__na, __n, 1);
|
||||
}
|
||||
}
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
return iterator(const_cast<__node_pointer>(__l.__ptr_), this);
|
||||
return iterator(__l.__ptr_, this);
|
||||
#else
|
||||
return iterator(const_cast<__node_pointer>(__l.__ptr_));
|
||||
return iterator(__l.__ptr_);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -1751,7 +1826,8 @@ list<_Tp, _Alloc>::resize(size_type __n)
|
||||
throw;
|
||||
}
|
||||
#endif // _LIBCPP_NO_EXCEPTIONS
|
||||
__link_nodes(static_cast<__node&>(base::__end_), *__r.__ptr_, *__e.__ptr_);
|
||||
__link_nodes(static_cast<__node_pointer>(pointer_traits<__node_base_pointer>::
|
||||
pointer_to(base::__end_)), __r.__ptr_, __e.__ptr_);
|
||||
base::__sz() += __ds;
|
||||
}
|
||||
}
|
||||
@@ -1810,7 +1886,8 @@ list<_Tp, _Alloc>::resize(size_type __n, const value_type& __x)
|
||||
throw;
|
||||
}
|
||||
#endif // _LIBCPP_NO_EXCEPTIONS
|
||||
__link_nodes(static_cast<__node&>(base::__end_), *__r.__ptr_, *__e.__ptr_);
|
||||
__link_nodes(static_cast<__node_pointer>(pointer_traits<__node_base_pointer>::
|
||||
pointer_to(base::__end_)), __r.__ptr_, __e.__ptr_);
|
||||
base::__sz() += __ds;
|
||||
}
|
||||
}
|
||||
@@ -1828,10 +1905,10 @@ list<_Tp, _Alloc>::splice(const_iterator __p, list& __c)
|
||||
#endif
|
||||
if (!__c.empty())
|
||||
{
|
||||
__node& __f = *__c.__end_.__next_;
|
||||
__node& __l = *__c.__end_.__prev_;
|
||||
__node_pointer __f = __c.__end_.__next_;
|
||||
__node_pointer __l = __c.__end_.__prev_;
|
||||
base::__unlink_nodes(__f, __l);
|
||||
__link_nodes(const_cast<__node&>(*__p.__ptr_), __f, __l);
|
||||
__link_nodes(__p.__ptr_, __f, __l);
|
||||
base::__sz() += __c.__sz();
|
||||
__c.__sz() = 0;
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
@@ -1842,7 +1919,8 @@ list<_Tp, _Alloc>::splice(const_iterator __p, list& __c)
|
||||
{
|
||||
--__p;
|
||||
iterator* __i = static_cast<iterator*>((*__p)->__i_);
|
||||
if (__i->__ptr_ != static_cast<__node_pointer>(&__c.__end_))
|
||||
if (__i->__ptr_ != static_cast<__node_pointer>(
|
||||
pointer_traits<__node_base_pointer>::pointer_to(__c.__end_)))
|
||||
{
|
||||
__cn1->__add(*__p);
|
||||
(*__p)->__c_ = __cn1;
|
||||
@@ -1872,9 +1950,9 @@ list<_Tp, _Alloc>::splice(const_iterator __p, list& __c, const_iterator __i)
|
||||
#endif
|
||||
if (__p.__ptr_ != __i.__ptr_ && __p.__ptr_ != __i.__ptr_->__next_)
|
||||
{
|
||||
__node& __f = const_cast<__node&>(*__i.__ptr_);
|
||||
__node_pointer __f = __i.__ptr_;
|
||||
base::__unlink_nodes(__f, __f);
|
||||
__link_nodes(const_cast<__node&>(*__p.__ptr_), __f, __f);
|
||||
__link_nodes(__p.__ptr_, __f, __f);
|
||||
--__c.__sz();
|
||||
++base::__sz();
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
@@ -1885,7 +1963,7 @@ list<_Tp, _Alloc>::splice(const_iterator __p, list& __c, const_iterator __i)
|
||||
{
|
||||
--__p;
|
||||
iterator* __j = static_cast<iterator*>((*__p)->__i_);
|
||||
if (__j->__ptr_ == &__f)
|
||||
if (__j->__ptr_ == __f)
|
||||
{
|
||||
__cn1->__add(*__p);
|
||||
(*__p)->__c_ = __cn1;
|
||||
@@ -1926,11 +2004,11 @@ list<_Tp, _Alloc>::splice(const_iterator __p, list& __c, const_iterator __f, con
|
||||
__c.__sz() -= __s;
|
||||
base::__sz() += __s;
|
||||
}
|
||||
__node& __first = const_cast<__node&>(*__f.__ptr_);
|
||||
__node_pointer __first = __f.__ptr_;
|
||||
--__l;
|
||||
__node& __last = const_cast<__node&>(*__l.__ptr_);
|
||||
__node_pointer __last = __l.__ptr_;
|
||||
base::__unlink_nodes(__first, __last);
|
||||
__link_nodes(const_cast<__node&>(*__p.__ptr_), __first, __last);
|
||||
__link_nodes(__p.__ptr_, __first, __last);
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__libcpp_db* __db = __get_db();
|
||||
__c_node* __cn1 = __db->__find_c_and_lock(this);
|
||||
@@ -1939,7 +2017,7 @@ list<_Tp, _Alloc>::splice(const_iterator __p, list& __c, const_iterator __f, con
|
||||
{
|
||||
--__p;
|
||||
iterator* __j = static_cast<iterator*>((*__p)->__i_);
|
||||
for (__node_pointer __k = const_cast<__node_pointer>(__f.__ptr_);
|
||||
for (__node_pointer __k = __f.__ptr_;
|
||||
__k != __l.__ptr_; __k = __k->__next_)
|
||||
{
|
||||
if (__j->__ptr_ == __k)
|
||||
@@ -2045,12 +2123,12 @@ list<_Tp, _Alloc>::merge(list& __c, _Comp __comp)
|
||||
;
|
||||
base::__sz() += __ds;
|
||||
__c.__sz() -= __ds;
|
||||
__node& __f = *__f2.__ptr_;
|
||||
__node& __l = *__m2.__ptr_->__prev_;
|
||||
__node_pointer __f = __f2.__ptr_;
|
||||
__node_pointer __l = __m2.__ptr_->__prev_;
|
||||
__f2 = __m2;
|
||||
base::__unlink_nodes(__f, __l);
|
||||
__m2 = _VSTD::next(__f1);
|
||||
__link_nodes(*__f1.__ptr_, __f, __l);
|
||||
__link_nodes(__f1.__ptr_, __f, __l);
|
||||
__f1 = __m2;
|
||||
}
|
||||
else
|
||||
@@ -2065,7 +2143,8 @@ list<_Tp, _Alloc>::merge(list& __c, _Comp __comp)
|
||||
{
|
||||
--__p;
|
||||
iterator* __i = static_cast<iterator*>((*__p)->__i_);
|
||||
if (__i->__ptr_ != static_cast<__node_pointer>(&__c.__end_))
|
||||
if (__i->__ptr_ != static_cast<__node_pointer>(
|
||||
pointer_traits<__node_base_pointer>::pointer_to(__c.__end_)))
|
||||
{
|
||||
__cn1->__add(*__p);
|
||||
(*__p)->__c_ = __cn1;
|
||||
@@ -2108,9 +2187,9 @@ list<_Tp, _Alloc>::__sort(iterator __f1, iterator __e2, size_type __n, _Comp& __
|
||||
case 2:
|
||||
if (__comp(*--__e2, *__f1))
|
||||
{
|
||||
__node& __f = *__e2.__ptr_;
|
||||
__node_pointer __f = __e2.__ptr_;
|
||||
base::__unlink_nodes(__f, __f);
|
||||
__link_nodes(*__f1.__ptr_, __f, __f);
|
||||
__link_nodes(__f1.__ptr_, __f, __f);
|
||||
return __e2;
|
||||
}
|
||||
return __f1;
|
||||
@@ -2124,13 +2203,13 @@ list<_Tp, _Alloc>::__sort(iterator __f1, iterator __e2, size_type __n, _Comp& __
|
||||
iterator __m2 = _VSTD::next(__f2);
|
||||
for (; __m2 != __e2 && __comp(*__m2, *__f1); ++__m2)
|
||||
;
|
||||
__node& __f = *__f2.__ptr_;
|
||||
__node& __l = *__m2.__ptr_->__prev_;
|
||||
__node_pointer __f = __f2.__ptr_;
|
||||
__node_pointer __l = __m2.__ptr_->__prev_;
|
||||
__r = __f2;
|
||||
__e1 = __f2 = __m2;
|
||||
base::__unlink_nodes(__f, __l);
|
||||
__m2 = _VSTD::next(__f1);
|
||||
__link_nodes(*__f1.__ptr_, __f, __l);
|
||||
__link_nodes(__f1.__ptr_, __f, __l);
|
||||
__f1 = __m2;
|
||||
}
|
||||
else
|
||||
@@ -2142,14 +2221,14 @@ list<_Tp, _Alloc>::__sort(iterator __f1, iterator __e2, size_type __n, _Comp& __
|
||||
iterator __m2 = _VSTD::next(__f2);
|
||||
for (; __m2 != __e2 && __comp(*__m2, *__f1); ++__m2)
|
||||
;
|
||||
__node& __f = *__f2.__ptr_;
|
||||
__node& __l = *__m2.__ptr_->__prev_;
|
||||
__node_pointer __f = __f2.__ptr_;
|
||||
__node_pointer __l = __m2.__ptr_->__prev_;
|
||||
if (__e1 == __f2)
|
||||
__e1 = __m2;
|
||||
__f2 = __m2;
|
||||
base::__unlink_nodes(__f, __l);
|
||||
__m2 = _VSTD::next(__f1);
|
||||
__link_nodes(*__f1.__ptr_, __f, __l);
|
||||
__link_nodes(__f1.__ptr_, __f, __l);
|
||||
__f1 = __m2;
|
||||
}
|
||||
else
|
||||
@@ -2187,7 +2266,8 @@ template <class _Tp, class _Alloc>
|
||||
bool
|
||||
list<_Tp, _Alloc>::__dereferenceable(const const_iterator* __i) const
|
||||
{
|
||||
return __i->__ptr_ != &this->__end_;
|
||||
return __i->__ptr_ != static_cast<__node_pointer>(
|
||||
pointer_traits<__node_base_pointer>::pointer_to(const_cast<__node_base&>(this->__end_)));
|
||||
}
|
||||
|
||||
template <class _Tp, class _Alloc>
|
||||
|
||||
640
include/locale
640
include/locale
File diff suppressed because it is too large
Load Diff
587
include/map
587
include/map
File diff suppressed because it is too large
Load Diff
340
include/memory
340
include/memory
@@ -90,7 +90,7 @@ struct allocator_traits
|
||||
template <class T>
|
||||
static void destroy(allocator_type& a, T* p);
|
||||
|
||||
static size_type max_size(const allocator_type& a);
|
||||
static size_type max_size(const allocator_type& a); // noexcept in C++14
|
||||
|
||||
static allocator_type
|
||||
select_on_container_copy_construction(const allocator_type& a);
|
||||
@@ -350,6 +350,10 @@ class bad_weak_ptr
|
||||
bad_weak_ptr() noexcept;
|
||||
};
|
||||
|
||||
template<class T, class... Args> unique_ptr<T> make_unique(Args&&... args); // C++14
|
||||
template<class T> unique_ptr<T> make_unique(size_t n); // C++14
|
||||
template<class T, class... Args> unspecified make_unique(Args&&...) = delete; // C++14, T == U[N]
|
||||
|
||||
template<class T>
|
||||
class shared_ptr
|
||||
{
|
||||
@@ -492,8 +496,8 @@ public:
|
||||
long use_count() const noexcept;
|
||||
bool expired() const noexcept;
|
||||
shared_ptr<T> lock() const noexcept;
|
||||
template<class U> bool owner_before(shared_ptr<U> const& b);
|
||||
template<class U> bool owner_before(weak_ptr<U> const& b);
|
||||
template<class U> bool owner_before(shared_ptr<U> const& b) const;
|
||||
template<class U> bool owner_before(weak_ptr<U> const& b) const;
|
||||
};
|
||||
|
||||
// weak_ptr specialized algorithms:
|
||||
@@ -614,60 +618,12 @@ void* align(size_t alignment, size_t size, void*& ptr, size_t& space);
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
// addressof
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_Tp*
|
||||
addressof(_Tp& __x) _NOEXCEPT
|
||||
{
|
||||
return (_Tp*)&(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
|
||||
// addressof moved to <__functional_base>
|
||||
|
||||
template <class _Tp> class allocator;
|
||||
|
||||
template <>
|
||||
class _LIBCPP_VISIBLE allocator<void>
|
||||
class _LIBCPP_TYPE_VIS_ONLY allocator<void>
|
||||
{
|
||||
public:
|
||||
typedef void* pointer;
|
||||
@@ -678,7 +634,7 @@ public:
|
||||
};
|
||||
|
||||
template <>
|
||||
class _LIBCPP_VISIBLE allocator<const void>
|
||||
class _LIBCPP_TYPE_VIS_ONLY allocator<const void>
|
||||
{
|
||||
public:
|
||||
typedef const void* pointer;
|
||||
@@ -913,7 +869,7 @@ struct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1, _A2>, _Up, false>
|
||||
#endif // _LIBCPP_HAS_NO_VARIADICS
|
||||
|
||||
template <class _Ptr>
|
||||
struct _LIBCPP_VISIBLE pointer_traits
|
||||
struct _LIBCPP_TYPE_VIS_ONLY pointer_traits
|
||||
{
|
||||
typedef _Ptr pointer;
|
||||
typedef typename __pointer_traits_element_type<pointer>::type element_type;
|
||||
@@ -936,7 +892,7 @@ public:
|
||||
};
|
||||
|
||||
template <class _Tp>
|
||||
struct _LIBCPP_VISIBLE pointer_traits<_Tp*>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY pointer_traits<_Tp*>
|
||||
{
|
||||
typedef _Tp* pointer;
|
||||
typedef _Tp element_type;
|
||||
@@ -961,13 +917,13 @@ public:
|
||||
|
||||
namespace __has_pointer_type_imp
|
||||
{
|
||||
template <class _Up> static __two test(...);
|
||||
template <class _Up> static char test(typename _Up::pointer* = 0);
|
||||
template <class _Up> static __two __test(...);
|
||||
template <class _Up> static char __test(typename _Up::pointer* = 0);
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
struct __has_pointer_type
|
||||
: public integral_constant<bool, sizeof(__has_pointer_type_imp::test<_Tp>(0)) == 1>
|
||||
: public integral_constant<bool, sizeof(__has_pointer_type_imp::__test<_Tp>(0)) == 1>
|
||||
{
|
||||
};
|
||||
|
||||
@@ -1443,7 +1399,7 @@ struct __alloc_traits_difference_type<_Alloc, _Ptr, true>
|
||||
};
|
||||
|
||||
template <class _Alloc>
|
||||
struct _LIBCPP_VISIBLE allocator_traits
|
||||
struct _LIBCPP_TYPE_VIS_ONLY allocator_traits
|
||||
{
|
||||
typedef _Alloc allocator_type;
|
||||
typedef typename allocator_type::value_type value_type;
|
||||
@@ -1527,7 +1483,7 @@ struct _LIBCPP_VISIBLE allocator_traits
|
||||
{__destroy(__has_destroy<allocator_type, _Tp*>(), __a, __p);}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
static size_type max_size(const allocator_type& __a)
|
||||
static size_type max_size(const allocator_type& __a) _NOEXCEPT
|
||||
{return __max_size(__has_max_size<const allocator_type>(), __a);}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
@@ -1571,7 +1527,10 @@ struct _LIBCPP_VISIBLE allocator_traits
|
||||
__construct_backward(allocator_type& __a, _Ptr __begin1, _Ptr __end1, _Ptr& __end2)
|
||||
{
|
||||
while (__end1 != __begin1)
|
||||
construct(__a, _VSTD::__to_raw_pointer(--__end2), _VSTD::move_if_noexcept(*--__end1));
|
||||
{
|
||||
construct(__a, _VSTD::__to_raw_pointer(__end2-1), _VSTD::move_if_noexcept(*--__end1));
|
||||
--__end2;
|
||||
}
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
@@ -1646,7 +1605,7 @@ private:
|
||||
// allocator
|
||||
|
||||
template <class _Tp>
|
||||
class _LIBCPP_VISIBLE allocator
|
||||
class _LIBCPP_TYPE_VIS_ONLY allocator
|
||||
{
|
||||
public:
|
||||
typedef size_t size_type;
|
||||
@@ -1738,7 +1697,7 @@ public:
|
||||
};
|
||||
|
||||
template <class _Tp>
|
||||
class _LIBCPP_VISIBLE allocator<const _Tp>
|
||||
class _LIBCPP_TYPE_VIS_ONLY allocator<const _Tp>
|
||||
{
|
||||
public:
|
||||
typedef size_t size_type;
|
||||
@@ -1747,7 +1706,7 @@ public:
|
||||
typedef const _Tp* const_pointer;
|
||||
typedef const _Tp& reference;
|
||||
typedef const _Tp& const_reference;
|
||||
typedef _Tp value_type;
|
||||
typedef const _Tp value_type;
|
||||
|
||||
typedef true_type propagate_on_container_move_assignment;
|
||||
|
||||
@@ -1836,7 +1795,7 @@ inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool operator!=(const allocator<_Tp>&, const allocator<_Up>&) _NOEXCEPT {return false;}
|
||||
|
||||
template <class _OutputIterator, class _Tp>
|
||||
class _LIBCPP_VISIBLE raw_storage_iterator
|
||||
class _LIBCPP_TYPE_VIS_ONLY raw_storage_iterator
|
||||
: public iterator<output_iterator_tag,
|
||||
_Tp, // purposefully not C++03
|
||||
ptrdiff_t, // purposefully not C++03
|
||||
@@ -1889,7 +1848,7 @@ struct auto_ptr_ref
|
||||
};
|
||||
|
||||
template<class _Tp>
|
||||
class _LIBCPP_VISIBLE auto_ptr
|
||||
class _LIBCPP_TYPE_VIS_ONLY auto_ptr
|
||||
{
|
||||
private:
|
||||
_Tp* __ptr_;
|
||||
@@ -1933,7 +1892,7 @@ public:
|
||||
};
|
||||
|
||||
template <>
|
||||
class _LIBCPP_VISIBLE auto_ptr<void>
|
||||
class _LIBCPP_TYPE_VIS_ONLY auto_ptr<void>
|
||||
{
|
||||
public:
|
||||
typedef void element_type;
|
||||
@@ -1995,7 +1954,7 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(_T1_param __t1, _T2_param __t2)
|
||||
: __first_(_VSTD::forward<_T1_param>(__t1)), __second_(_VSTD::forward<_T2_param>(__t2)) {}
|
||||
|
||||
#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
#if defined(_LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS) && !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES)
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__libcpp_compressed_pair_imp(const __libcpp_compressed_pair_imp& __p)
|
||||
@@ -2014,8 +1973,6 @@ public:
|
||||
return *this;
|
||||
}
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__libcpp_compressed_pair_imp(__libcpp_compressed_pair_imp&& __p)
|
||||
_NOEXCEPT_(is_nothrow_move_constructible<_T1>::value &&
|
||||
@@ -2033,6 +1990,8 @@ public:
|
||||
return *this;
|
||||
}
|
||||
|
||||
#endif // defined(_LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS) && !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES)
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
||||
|
||||
template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2>
|
||||
@@ -2048,10 +2007,6 @@ public:
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_VARIADICS
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return __first_;}
|
||||
_LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return __first_;}
|
||||
|
||||
@@ -2092,7 +2047,7 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(_T1_param __t1, _T2_param __t2)
|
||||
: _T1(_VSTD::forward<_T1_param>(__t1)), __second_(_VSTD::forward<_T2_param>(__t2)) {}
|
||||
|
||||
#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
#if defined(_LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS) && !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES)
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__libcpp_compressed_pair_imp(const __libcpp_compressed_pair_imp& __p)
|
||||
@@ -2110,8 +2065,6 @@ public:
|
||||
return *this;
|
||||
}
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__libcpp_compressed_pair_imp(__libcpp_compressed_pair_imp&& __p)
|
||||
_NOEXCEPT_(is_nothrow_move_constructible<_T1>::value &&
|
||||
@@ -2128,6 +2081,8 @@ public:
|
||||
return *this;
|
||||
}
|
||||
|
||||
#endif // defined(_LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS) && !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES)
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
||||
|
||||
template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2>
|
||||
@@ -2143,10 +2098,6 @@ public:
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_VARIADICS
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return *this;}
|
||||
_LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return *this;}
|
||||
|
||||
@@ -2188,7 +2139,7 @@ public:
|
||||
is_nothrow_move_constructible<_T2>::value)
|
||||
: _T2(_VSTD::forward<_T2_param>(__t2)), __first_(_VSTD::forward<_T1_param>(__t1)) {}
|
||||
|
||||
#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
#if defined(_LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS) && !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES)
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__libcpp_compressed_pair_imp(const __libcpp_compressed_pair_imp& __p)
|
||||
@@ -2206,8 +2157,6 @@ public:
|
||||
return *this;
|
||||
}
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__libcpp_compressed_pair_imp(__libcpp_compressed_pair_imp&& __p)
|
||||
_NOEXCEPT_(is_nothrow_move_constructible<_T1>::value &&
|
||||
@@ -2224,6 +2173,8 @@ public:
|
||||
return *this;
|
||||
}
|
||||
|
||||
#endif // defined(_LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS) && !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES)
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
||||
|
||||
template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2>
|
||||
@@ -2240,10 +2191,6 @@ public:
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_VARIADICS
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return __first_;}
|
||||
_LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return __first_;}
|
||||
|
||||
@@ -2282,7 +2229,7 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(_T1_param __t1, _T2_param __t2)
|
||||
: _T1(_VSTD::forward<_T1_param>(__t1)), _T2(_VSTD::forward<_T2_param>(__t2)) {}
|
||||
|
||||
#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
#if defined(_LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS) && !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES)
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__libcpp_compressed_pair_imp(const __libcpp_compressed_pair_imp& __p)
|
||||
@@ -2300,8 +2247,6 @@ public:
|
||||
return *this;
|
||||
}
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__libcpp_compressed_pair_imp(__libcpp_compressed_pair_imp&& __p)
|
||||
_NOEXCEPT_(is_nothrow_move_constructible<_T1>::value &&
|
||||
@@ -2318,6 +2263,8 @@ public:
|
||||
return *this;
|
||||
}
|
||||
|
||||
#endif // defined(_LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS) && !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES)
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
||||
|
||||
template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2>
|
||||
@@ -2333,10 +2280,6 @@ public:
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_VARIADICS
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return *this;}
|
||||
_LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return *this;}
|
||||
|
||||
@@ -2373,7 +2316,7 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY __compressed_pair(_T1_param __t1, _T2_param __t2)
|
||||
: base(_VSTD::forward<_T1_param>(__t1), _VSTD::forward<_T2_param>(__t2)) {}
|
||||
|
||||
#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
#if defined(_LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS) && !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES)
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__compressed_pair(const __compressed_pair& __p)
|
||||
@@ -2390,7 +2333,6 @@ public:
|
||||
return *this;
|
||||
}
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__compressed_pair(__compressed_pair&& __p)
|
||||
_NOEXCEPT_(is_nothrow_move_constructible<_T1>::value &&
|
||||
@@ -2406,6 +2348,8 @@ public:
|
||||
return *this;
|
||||
}
|
||||
|
||||
#endif // defined(_LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS) && !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES)
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
||||
|
||||
template <class... _Args1, class... _Args2>
|
||||
@@ -2419,10 +2363,6 @@ public:
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_VARIADICS
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return base::first();}
|
||||
_LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return base::first();}
|
||||
|
||||
@@ -2469,7 +2409,7 @@ struct __same_or_less_cv_qualified<_Ptr1, _Ptr2, true>
|
||||
// default_delete
|
||||
|
||||
template <class _Tp>
|
||||
struct _LIBCPP_VISIBLE default_delete
|
||||
struct _LIBCPP_TYPE_VIS_ONLY default_delete
|
||||
{
|
||||
#ifndef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR default_delete() _NOEXCEPT = default;
|
||||
@@ -2482,12 +2422,13 @@ struct _LIBCPP_VISIBLE default_delete
|
||||
_LIBCPP_INLINE_VISIBILITY void operator() (_Tp* __ptr) const _NOEXCEPT
|
||||
{
|
||||
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");
|
||||
delete __ptr;
|
||||
}
|
||||
};
|
||||
|
||||
template <class _Tp>
|
||||
struct _LIBCPP_VISIBLE default_delete<_Tp[]>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY default_delete<_Tp[]>
|
||||
{
|
||||
public:
|
||||
#ifndef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
@@ -2504,12 +2445,13 @@ public:
|
||||
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(!is_void<_Tp>::value, "default_delete can not delete incomplete type");
|
||||
delete [] __ptr;
|
||||
}
|
||||
};
|
||||
|
||||
template <class _Tp, class _Dp = default_delete<_Tp> >
|
||||
class _LIBCPP_VISIBLE unique_ptr
|
||||
class _LIBCPP_TYPE_VIS_ONLY unique_ptr
|
||||
{
|
||||
public:
|
||||
typedef _Tp element_type;
|
||||
@@ -2688,7 +2630,7 @@ public:
|
||||
};
|
||||
|
||||
template <class _Tp, class _Dp>
|
||||
class _LIBCPP_VISIBLE unique_ptr<_Tp[], _Dp>
|
||||
class _LIBCPP_TYPE_VIS_ONLY unique_ptr<_Tp[], _Dp>
|
||||
{
|
||||
public:
|
||||
typedef _Tp element_type;
|
||||
@@ -3074,8 +3016,61 @@ move(unique_ptr<_Tp, _Dp>& __t)
|
||||
|
||||
#endif
|
||||
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
|
||||
template<class _Tp>
|
||||
struct __unique_if
|
||||
{
|
||||
typedef unique_ptr<_Tp> __unique_single;
|
||||
};
|
||||
|
||||
template<class _Tp>
|
||||
struct __unique_if<_Tp[]>
|
||||
{
|
||||
typedef unique_ptr<_Tp[]> __unique_array_unknown_bound;
|
||||
};
|
||||
|
||||
template<class _Tp, size_t _Np>
|
||||
struct __unique_if<_Tp[_Np]>
|
||||
{
|
||||
typedef void __unique_array_known_bound;
|
||||
};
|
||||
|
||||
template<class _Tp, class... _Args>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
typename __unique_if<_Tp>::__unique_single
|
||||
make_unique(_Args&&... __args)
|
||||
{
|
||||
return unique_ptr<_Tp>(new _Tp(_VSTD::forward<_Args>(__args)...));
|
||||
}
|
||||
|
||||
template<class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
typename __unique_if<_Tp>::__unique_array_unknown_bound
|
||||
make_unique(size_t __n)
|
||||
{
|
||||
typedef typename remove_extent<_Tp>::type _Up;
|
||||
return unique_ptr<_Tp>(new _Up[__n]());
|
||||
}
|
||||
|
||||
template<class _Tp, class... _Args>
|
||||
typename __unique_if<_Tp>::__unique_array_known_bound
|
||||
make_unique(_Args&&...) = delete;
|
||||
|
||||
#endif // _LIBCPP_STD_VER > 11
|
||||
|
||||
template <class _Tp> struct hash;
|
||||
|
||||
template <class _Size>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_Size
|
||||
__loadword(const void* __p)
|
||||
{
|
||||
_Size __r;
|
||||
std::memcpy(&__r, __p, sizeof(__r));
|
||||
return __r;
|
||||
}
|
||||
|
||||
// We use murmur2 when size_t is 32 bits, and cityhash64 when size_t
|
||||
// is 64 bits. This is because cityhash64 uses 64bit x 64bit
|
||||
// multiplication, which can be very slow on 32-bit systems.
|
||||
@@ -3099,7 +3094,7 @@ __murmur2_or_cityhash<_Size, 32>::operator()(const void* __key, _Size __len)
|
||||
const unsigned char* __data = static_cast<const unsigned char*>(__key);
|
||||
for (; __len >= 4; __data += 4, __len -= 4)
|
||||
{
|
||||
_Size __k = *(const _Size*)__data;
|
||||
_Size __k = __loadword<_Size>(__data);
|
||||
__k *= __m;
|
||||
__k ^= __k >> __r;
|
||||
__k *= __m;
|
||||
@@ -3158,13 +3153,13 @@ struct __murmur2_or_cityhash<_Size, 64>
|
||||
|
||||
static _Size __hash_len_0_to_16(const char* __s, _Size __len) {
|
||||
if (__len > 8) {
|
||||
const _Size __a = *(const _Size*)__s;
|
||||
const _Size __b = *(const _Size*)(__s + __len - 8);
|
||||
const _Size __a = __loadword<_Size>(__s);
|
||||
const _Size __b = __loadword<_Size>(__s + __len - 8);
|
||||
return __hash_len_16(__a, __rotate_by_at_least_1(__b + __len, __len)) ^ __b;
|
||||
}
|
||||
if (__len >= 4) {
|
||||
const uint32_t __a = *(const uint32_t*)(__s);
|
||||
const uint32_t __b = *(const uint32_t*)(__s + __len - 4);
|
||||
const uint32_t __a = __loadword<uint32_t>(__s);
|
||||
const uint32_t __b = __loadword<uint32_t>(__s + __len - 4);
|
||||
return __hash_len_16(__len + (__a << 3), __b);
|
||||
}
|
||||
if (__len > 0) {
|
||||
@@ -3180,10 +3175,10 @@ struct __murmur2_or_cityhash<_Size, 64>
|
||||
}
|
||||
|
||||
static _Size __hash_len_17_to_32(const char *__s, _Size __len) {
|
||||
const _Size __a = *(const _Size*)(__s) * __k1;
|
||||
const _Size __b = *(const _Size*)(__s + 8);
|
||||
const _Size __c = *(const _Size*)(__s + __len - 8) * __k2;
|
||||
const _Size __d = *(const _Size*)(__s + __len - 16) * __k0;
|
||||
const _Size __a = __loadword<_Size>(__s) * __k1;
|
||||
const _Size __b = __loadword<_Size>(__s + 8);
|
||||
const _Size __c = __loadword<_Size>(__s + __len - 8) * __k2;
|
||||
const _Size __d = __loadword<_Size>(__s + __len - 16) * __k0;
|
||||
return __hash_len_16(__rotate(__a - __b, 43) + __rotate(__c, 30) + __d,
|
||||
__a + __rotate(__b ^ __k3, 20) - __c + __len);
|
||||
}
|
||||
@@ -3204,33 +3199,33 @@ struct __murmur2_or_cityhash<_Size, 64>
|
||||
// Return a 16-byte hash for s[0] ... s[31], a, and b. Quick and dirty.
|
||||
static pair<_Size, _Size> __weak_hash_len_32_with_seeds(
|
||||
const char* __s, _Size __a, _Size __b) {
|
||||
return __weak_hash_len_32_with_seeds(*(const _Size*)(__s),
|
||||
*(const _Size*)(__s + 8),
|
||||
*(const _Size*)(__s + 16),
|
||||
*(const _Size*)(__s + 24),
|
||||
return __weak_hash_len_32_with_seeds(__loadword<_Size>(__s),
|
||||
__loadword<_Size>(__s + 8),
|
||||
__loadword<_Size>(__s + 16),
|
||||
__loadword<_Size>(__s + 24),
|
||||
__a,
|
||||
__b);
|
||||
}
|
||||
|
||||
// Return an 8-byte hash for 33 to 64 bytes.
|
||||
static _Size __hash_len_33_to_64(const char *__s, size_t __len) {
|
||||
_Size __z = *(const _Size*)(__s + 24);
|
||||
_Size __a = *(const _Size*)(__s) +
|
||||
(__len + *(const _Size*)(__s + __len - 16)) * __k0;
|
||||
_Size __z = __loadword<_Size>(__s + 24);
|
||||
_Size __a = __loadword<_Size>(__s) +
|
||||
(__len + __loadword<_Size>(__s + __len - 16)) * __k0;
|
||||
_Size __b = __rotate(__a + __z, 52);
|
||||
_Size __c = __rotate(__a, 37);
|
||||
__a += *(const _Size*)(__s + 8);
|
||||
__a += __loadword<_Size>(__s + 8);
|
||||
__c += __rotate(__a, 7);
|
||||
__a += *(const _Size*)(__s + 16);
|
||||
__a += __loadword<_Size>(__s + 16);
|
||||
_Size __vf = __a + __z;
|
||||
_Size __vs = __b + __rotate(__a, 31) + __c;
|
||||
__a = *(const _Size*)(__s + 16) + *(const _Size*)(__s + __len - 32);
|
||||
__z += *(const _Size*)(__s + __len - 8);
|
||||
__a = __loadword<_Size>(__s + 16) + __loadword<_Size>(__s + __len - 32);
|
||||
__z += __loadword<_Size>(__s + __len - 8);
|
||||
__b = __rotate(__a + __z, 52);
|
||||
__c = __rotate(__a, 37);
|
||||
__a += *(const _Size*)(__s + __len - 24);
|
||||
__a += __loadword<_Size>(__s + __len - 24);
|
||||
__c += __rotate(__a, 7);
|
||||
__a += *(const _Size*)(__s + __len - 16);
|
||||
__a += __loadword<_Size>(__s + __len - 16);
|
||||
_Size __wf = __a + __z;
|
||||
_Size __ws = __b + __rotate(__a, 31) + __c;
|
||||
_Size __r = __shift_mix((__vf + __ws) * __k2 + (__wf + __vs) * __k0);
|
||||
@@ -3256,26 +3251,26 @@ __murmur2_or_cityhash<_Size, 64>::operator()(const void* __key, _Size __len)
|
||||
|
||||
// For strings over 64 bytes we hash the end first, and then as we
|
||||
// loop we keep 56 bytes of state: v, w, x, y, and z.
|
||||
_Size __x = *(const _Size*)(__s + __len - 40);
|
||||
_Size __y = *(const _Size*)(__s + __len - 16) +
|
||||
*(const _Size*)(__s + __len - 56);
|
||||
_Size __z = __hash_len_16(*(const _Size*)(__s + __len - 48) + __len,
|
||||
*(const _Size*)(__s + __len - 24));
|
||||
_Size __x = __loadword<_Size>(__s + __len - 40);
|
||||
_Size __y = __loadword<_Size>(__s + __len - 16) +
|
||||
__loadword<_Size>(__s + __len - 56);
|
||||
_Size __z = __hash_len_16(__loadword<_Size>(__s + __len - 48) + __len,
|
||||
__loadword<_Size>(__s + __len - 24));
|
||||
pair<_Size, _Size> __v = __weak_hash_len_32_with_seeds(__s + __len - 64, __len, __z);
|
||||
pair<_Size, _Size> __w = __weak_hash_len_32_with_seeds(__s + __len - 32, __y + __k1, __x);
|
||||
__x = __x * __k1 + *(const _Size*)(__s);
|
||||
__x = __x * __k1 + __loadword<_Size>(__s);
|
||||
|
||||
// Decrease len to the nearest multiple of 64, and operate on 64-byte chunks.
|
||||
__len = (__len - 1) & ~static_cast<_Size>(63);
|
||||
do {
|
||||
__x = __rotate(__x + __y + __v.first + *(const _Size*)(__s + 8), 37) * __k1;
|
||||
__y = __rotate(__y + __v.second + *(const _Size*)(__s + 48), 42) * __k1;
|
||||
__x = __rotate(__x + __y + __v.first + __loadword<_Size>(__s + 8), 37) * __k1;
|
||||
__y = __rotate(__y + __v.second + __loadword<_Size>(__s + 48), 42) * __k1;
|
||||
__x ^= __w.second;
|
||||
__y += __v.first + *(const _Size*)(__s + 40);
|
||||
__y += __v.first + __loadword<_Size>(__s + 40);
|
||||
__z = __rotate(__z + __w.first, 33) * __k1;
|
||||
__v = __weak_hash_len_32_with_seeds(__s, __v.second * __k1, __x + __w.first);
|
||||
__w = __weak_hash_len_32_with_seeds(__s + 32, __z + __w.second,
|
||||
__y + *(const _Size*)(__s + 16));
|
||||
__y + __loadword<_Size>(__s + 16));
|
||||
std::swap(__z, __x);
|
||||
__s += 64;
|
||||
__len -= 64;
|
||||
@@ -3390,7 +3385,7 @@ struct __scalar_hash<_Tp, 4>
|
||||
};
|
||||
|
||||
template<class _Tp>
|
||||
struct _LIBCPP_VISIBLE hash<_Tp*>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY hash<_Tp*>
|
||||
: public unary_function<_Tp*, size_t>
|
||||
{
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
@@ -3407,7 +3402,7 @@ struct _LIBCPP_VISIBLE hash<_Tp*>
|
||||
};
|
||||
|
||||
template <class _Tp, class _Dp>
|
||||
struct _LIBCPP_VISIBLE hash<unique_ptr<_Tp, _Dp> >
|
||||
struct _LIBCPP_TYPE_VIS_ONLY hash<unique_ptr<_Tp, _Dp> >
|
||||
{
|
||||
typedef unique_ptr<_Tp, _Dp> argument_type;
|
||||
typedef size_t result_type;
|
||||
@@ -3580,9 +3575,9 @@ public:
|
||||
virtual const char* what() const _NOEXCEPT;
|
||||
};
|
||||
|
||||
template<class _Tp> class _LIBCPP_VISIBLE weak_ptr;
|
||||
template<class _Tp> class _LIBCPP_TYPE_VIS_ONLY weak_ptr;
|
||||
|
||||
class __shared_count
|
||||
class _LIBCPP_TYPE_VIS __shared_count
|
||||
{
|
||||
__shared_count(const __shared_count&);
|
||||
__shared_count& operator=(const __shared_count&);
|
||||
@@ -3604,7 +3599,7 @@ public:
|
||||
long use_count() const _NOEXCEPT {return __shared_owners_ + 1;}
|
||||
};
|
||||
|
||||
class __shared_weak_count
|
||||
class _LIBCPP_TYPE_VIS __shared_weak_count
|
||||
: private __shared_count
|
||||
{
|
||||
long __shared_weak_owners_;
|
||||
@@ -3626,10 +3621,13 @@ public:
|
||||
long use_count() const _NOEXCEPT {return __shared_count::use_count();}
|
||||
__shared_weak_count* lock() _NOEXCEPT;
|
||||
|
||||
// purposefully not protected with #ifndef _LIBCPP_NO_RTTI because doing so
|
||||
// breaks ABI for those clients who need to compile their projects with
|
||||
// -fno-rtti and yet link against a libc++.dylib compiled without -fno-rtti.
|
||||
// Define the function out only if we build static libc++ without RTTI.
|
||||
// Otherwise we may break clients who need to compile their projects with
|
||||
// -fno-rtti and yet link against a libc++.dylib compiled
|
||||
// without -fno-rtti.
|
||||
#if !defined(_LIBCPP_NO_RTTI) || !defined(_LIBCPP_BUILD_STATIC)
|
||||
virtual const void* __get_deleter(const type_info&) const _NOEXCEPT;
|
||||
#endif
|
||||
private:
|
||||
virtual void __on_zero_shared_weak() _NOEXCEPT = 0;
|
||||
};
|
||||
@@ -3746,10 +3744,10 @@ __shared_ptr_emplace<_Tp, _Alloc>::__on_zero_shared_weak() _NOEXCEPT
|
||||
__a.deallocate(this, 1);
|
||||
}
|
||||
|
||||
template<class _Tp> class _LIBCPP_VISIBLE enable_shared_from_this;
|
||||
template<class _Tp> class _LIBCPP_TYPE_VIS_ONLY enable_shared_from_this;
|
||||
|
||||
template<class _Tp>
|
||||
class _LIBCPP_VISIBLE shared_ptr
|
||||
class _LIBCPP_TYPE_VIS_ONLY shared_ptr
|
||||
{
|
||||
public:
|
||||
typedef _Tp element_type;
|
||||
@@ -3878,8 +3876,8 @@ public:
|
||||
<
|
||||
!is_array<_Yp>::value &&
|
||||
is_convertible<_Yp*, element_type*>::value,
|
||||
shared_ptr&
|
||||
>::type
|
||||
shared_ptr
|
||||
>::type&
|
||||
operator=(auto_ptr<_Yp>&& __r);
|
||||
#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
template<class _Yp>
|
||||
@@ -4018,8 +4016,8 @@ private:
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
void __enable_weak_this(const void*) _NOEXCEPT {}
|
||||
|
||||
template <class _Up> friend class _LIBCPP_VISIBLE shared_ptr;
|
||||
template <class _Up> friend class _LIBCPP_VISIBLE weak_ptr;
|
||||
template <class _Up> friend class _LIBCPP_TYPE_VIS_ONLY shared_ptr;
|
||||
template <class _Up> friend class _LIBCPP_TYPE_VIS_ONLY weak_ptr;
|
||||
};
|
||||
|
||||
template<class _Tp>
|
||||
@@ -4505,8 +4503,8 @@ typename enable_if
|
||||
<
|
||||
!is_array<_Yp>::value &&
|
||||
is_convertible<_Yp*, _Tp*>::value,
|
||||
shared_ptr<_Tp>&
|
||||
>::type
|
||||
shared_ptr<_Tp>
|
||||
>::type&
|
||||
shared_ptr<_Tp>::operator=(auto_ptr<_Yp>&& __r)
|
||||
{
|
||||
shared_ptr(_VSTD::move(__r)).swap(*this);
|
||||
@@ -4915,7 +4913,7 @@ get_deleter(const shared_ptr<_Tp>& __p) _NOEXCEPT
|
||||
#endif // _LIBCPP_NO_RTTI
|
||||
|
||||
template<class _Tp>
|
||||
class _LIBCPP_VISIBLE weak_ptr
|
||||
class _LIBCPP_TYPE_VIS_ONLY weak_ptr
|
||||
{
|
||||
public:
|
||||
typedef _Tp element_type;
|
||||
@@ -4990,8 +4988,8 @@ public:
|
||||
bool owner_before(const weak_ptr<_Up>& __r) const
|
||||
{return __cntrl_ < __r.__cntrl_;}
|
||||
|
||||
template <class _Up> friend class _LIBCPP_VISIBLE weak_ptr;
|
||||
template <class _Up> friend class _LIBCPP_VISIBLE shared_ptr;
|
||||
template <class _Up> friend class _LIBCPP_TYPE_VIS_ONLY weak_ptr;
|
||||
template <class _Up> friend class _LIBCPP_TYPE_VIS_ONLY shared_ptr;
|
||||
};
|
||||
|
||||
template<class _Tp>
|
||||
@@ -5191,7 +5189,7 @@ weak_ptr<_Tp>::lock() const _NOEXCEPT
|
||||
template <class _Tp> struct owner_less;
|
||||
|
||||
template <class _Tp>
|
||||
struct _LIBCPP_VISIBLE owner_less<shared_ptr<_Tp> >
|
||||
struct _LIBCPP_TYPE_VIS_ONLY owner_less<shared_ptr<_Tp> >
|
||||
: binary_function<shared_ptr<_Tp>, shared_ptr<_Tp>, bool>
|
||||
{
|
||||
typedef bool result_type;
|
||||
@@ -5207,7 +5205,7 @@ struct _LIBCPP_VISIBLE owner_less<shared_ptr<_Tp> >
|
||||
};
|
||||
|
||||
template <class _Tp>
|
||||
struct _LIBCPP_VISIBLE owner_less<weak_ptr<_Tp> >
|
||||
struct _LIBCPP_TYPE_VIS_ONLY owner_less<weak_ptr<_Tp> >
|
||||
: binary_function<weak_ptr<_Tp>, weak_ptr<_Tp>, bool>
|
||||
{
|
||||
typedef bool result_type;
|
||||
@@ -5223,7 +5221,7 @@ struct _LIBCPP_VISIBLE owner_less<weak_ptr<_Tp> >
|
||||
};
|
||||
|
||||
template<class _Tp>
|
||||
class _LIBCPP_VISIBLE enable_shared_from_this
|
||||
class _LIBCPP_TYPE_VIS_ONLY enable_shared_from_this
|
||||
{
|
||||
mutable weak_ptr<_Tp> __weak_this_;
|
||||
protected:
|
||||
@@ -5248,7 +5246,7 @@ public:
|
||||
};
|
||||
|
||||
template <class _Tp>
|
||||
struct _LIBCPP_VISIBLE hash<shared_ptr<_Tp> >
|
||||
struct _LIBCPP_TYPE_VIS_ONLY hash<shared_ptr<_Tp> >
|
||||
{
|
||||
typedef shared_ptr<_Tp> argument_type;
|
||||
typedef size_t result_type;
|
||||
@@ -5266,7 +5264,7 @@ operator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Yp> const& __p);
|
||||
|
||||
#if __has_feature(cxx_atomic)
|
||||
|
||||
class __sp_mut
|
||||
class _LIBCPP_TYPE_VIS __sp_mut
|
||||
{
|
||||
void* __lx;
|
||||
public:
|
||||
@@ -5278,10 +5276,10 @@ private:
|
||||
__sp_mut(const __sp_mut&);
|
||||
__sp_mut& operator=(const __sp_mut&);
|
||||
|
||||
friend _LIBCPP_VISIBLE __sp_mut& __get_sp_mut(const void*);
|
||||
friend _LIBCPP_FUNC_VIS __sp_mut& __get_sp_mut(const void*);
|
||||
};
|
||||
|
||||
_LIBCPP_VISIBLE __sp_mut& __get_sp_mut(const void*);
|
||||
_LIBCPP_FUNC_VIS __sp_mut& __get_sp_mut(const void*);
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
@@ -5393,7 +5391,7 @@ atomic_compare_exchange_weak_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v
|
||||
#endif // __has_feature(cxx_atomic)
|
||||
|
||||
//enum class
|
||||
struct _LIBCPP_VISIBLE pointer_safety
|
||||
struct _LIBCPP_TYPE_VIS pointer_safety
|
||||
{
|
||||
enum __lx
|
||||
{
|
||||
@@ -5410,11 +5408,11 @@ struct _LIBCPP_VISIBLE pointer_safety
|
||||
operator int() const {return __v_;}
|
||||
};
|
||||
|
||||
void declare_reachable(void* __p);
|
||||
void declare_no_pointers(char* __p, size_t __n);
|
||||
void undeclare_no_pointers(char* __p, size_t __n);
|
||||
pointer_safety get_pointer_safety() _NOEXCEPT;
|
||||
void* __undeclare_reachable(void* __p);
|
||||
_LIBCPP_FUNC_VIS void declare_reachable(void* __p);
|
||||
_LIBCPP_FUNC_VIS void declare_no_pointers(char* __p, size_t __n);
|
||||
_LIBCPP_FUNC_VIS void undeclare_no_pointers(char* __p, size_t __n);
|
||||
_LIBCPP_FUNC_VIS pointer_safety get_pointer_safety() _NOEXCEPT;
|
||||
_LIBCPP_FUNC_VIS void* __undeclare_reachable(void* __p);
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
@@ -5424,7 +5422,7 @@ undeclare_reachable(_Tp* __p)
|
||||
return static_cast<_Tp*>(__undeclare_reachable(__p));
|
||||
}
|
||||
|
||||
void* align(size_t __align, size_t __sz, void*& __ptr, size_t& __space);
|
||||
_LIBCPP_FUNC_VIS void* align(size_t __align, size_t __sz, void*& __ptr, size_t& __space);
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
|
||||
@@ -187,7 +187,7 @@ template<class Callable, class ...Args>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
class _LIBCPP_VISIBLE recursive_mutex
|
||||
class _LIBCPP_TYPE_VIS recursive_mutex
|
||||
{
|
||||
pthread_mutex_t __m_;
|
||||
|
||||
@@ -209,7 +209,7 @@ public:
|
||||
native_handle_type native_handle() {return &__m_;}
|
||||
};
|
||||
|
||||
class _LIBCPP_VISIBLE timed_mutex
|
||||
class _LIBCPP_TYPE_VIS timed_mutex
|
||||
{
|
||||
mutex __m_;
|
||||
condition_variable __cv_;
|
||||
@@ -251,7 +251,7 @@ timed_mutex::try_lock_until(const chrono::time_point<_Clock, _Duration>& __t)
|
||||
return false;
|
||||
}
|
||||
|
||||
class _LIBCPP_VISIBLE recursive_timed_mutex
|
||||
class _LIBCPP_TYPE_VIS recursive_timed_mutex
|
||||
{
|
||||
mutex __m_;
|
||||
condition_variable __cv_;
|
||||
@@ -425,7 +425,7 @@ lock(_L0& __l0, _L1& __l1, _L2& __l2, _L3& ...__l3)
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_VARIADICS
|
||||
|
||||
struct _LIBCPP_VISIBLE once_flag;
|
||||
struct _LIBCPP_TYPE_VIS once_flag;
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
||||
|
||||
@@ -441,7 +441,7 @@ void call_once(once_flag&, _Callable);
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_VARIADICS
|
||||
|
||||
struct _LIBCPP_VISIBLE once_flag
|
||||
struct _LIBCPP_TYPE_VIS_ONLY once_flag
|
||||
{
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_CONSTEXPR
|
||||
@@ -527,7 +527,7 @@ __call_once_proxy(void* __vp)
|
||||
(*__p)();
|
||||
}
|
||||
|
||||
void __call_once(volatile unsigned long&, void*, void(*)(void*));
|
||||
_LIBCPP_FUNC_VIS void __call_once(volatile unsigned long&, void*, void(*)(void*));
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
||||
|
||||
|
||||
67
include/new
67
include/new
@@ -27,6 +27,18 @@ public:
|
||||
virtual const char* what() const noexcept;
|
||||
};
|
||||
|
||||
class bad_array_length : public bad_alloc // C++14
|
||||
{
|
||||
public:
|
||||
bad_array_length() noexcept;
|
||||
};
|
||||
|
||||
class bad_array_new_length : public bad_alloc
|
||||
{
|
||||
public:
|
||||
bad_array_new_length() noexcept;
|
||||
};
|
||||
|
||||
struct nothrow_t {};
|
||||
extern const nothrow_t nothrow;
|
||||
typedef void (*new_handler)();
|
||||
@@ -81,37 +93,58 @@ public:
|
||||
virtual const char* what() const _NOEXCEPT;
|
||||
};
|
||||
|
||||
void __throw_bad_alloc(); // not in C++ spec
|
||||
#if defined(_LIBCPP_BUILDING_NEW) || (_LIBCPP_STD_VER > 11)
|
||||
|
||||
struct _LIBCPP_VISIBLE nothrow_t {};
|
||||
extern _LIBCPP_VISIBLE const nothrow_t nothrow;
|
||||
class _LIBCPP_EXCEPTION_ABI bad_array_length
|
||||
: public bad_alloc
|
||||
{
|
||||
public:
|
||||
bad_array_length() _NOEXCEPT;
|
||||
virtual ~bad_array_length() _NOEXCEPT;
|
||||
virtual const char* what() const _NOEXCEPT;
|
||||
};
|
||||
|
||||
#define _LIBCPP_BAD_ARRAY_LENGTH_DEFINED
|
||||
|
||||
#endif // defined(_LIBCPP_BUILDING_NEW) || (_LIBCPP_STD_VER > 11)
|
||||
|
||||
_LIBCPP_FUNC_VIS void __throw_bad_alloc(); // not in C++ spec
|
||||
|
||||
struct _LIBCPP_TYPE_VIS nothrow_t {};
|
||||
extern _LIBCPP_FUNC_VIS const nothrow_t nothrow;
|
||||
typedef void (*new_handler)();
|
||||
_LIBCPP_VISIBLE new_handler set_new_handler(new_handler) _NOEXCEPT;
|
||||
_LIBCPP_VISIBLE new_handler get_new_handler() _NOEXCEPT;
|
||||
_LIBCPP_FUNC_VIS new_handler set_new_handler(new_handler) _NOEXCEPT;
|
||||
_LIBCPP_FUNC_VIS new_handler get_new_handler() _NOEXCEPT;
|
||||
|
||||
} // std
|
||||
|
||||
_LIBCPP_VISIBLE void* operator new(std::size_t __sz)
|
||||
#if defined(_WIN32) && !defined(cxx_EXPORTS)
|
||||
# define _LIBCPP_NEW_DELETE_VIS _LIBCPP_FUNC_VIS_ONLY
|
||||
#else
|
||||
# define _LIBCPP_NEW_DELETE_VIS _LIBCPP_FUNC_VIS
|
||||
#endif
|
||||
|
||||
_LIBCPP_NEW_DELETE_VIS void* operator new(std::size_t __sz)
|
||||
#if !__has_feature(cxx_noexcept)
|
||||
throw(std::bad_alloc)
|
||||
#endif
|
||||
;
|
||||
_LIBCPP_VISIBLE void* operator new(std::size_t __sz, const std::nothrow_t&) _NOEXCEPT _NOALIAS;
|
||||
_LIBCPP_VISIBLE void operator delete(void* __p) _NOEXCEPT;
|
||||
_LIBCPP_VISIBLE void operator delete(void* __p, const std::nothrow_t&) _NOEXCEPT;
|
||||
_LIBCPP_NEW_DELETE_VIS void* operator new(std::size_t __sz, const std::nothrow_t&) _NOEXCEPT _NOALIAS;
|
||||
_LIBCPP_NEW_DELETE_VIS void operator delete(void* __p) _NOEXCEPT;
|
||||
_LIBCPP_NEW_DELETE_VIS void operator delete(void* __p, const std::nothrow_t&) _NOEXCEPT;
|
||||
|
||||
_LIBCPP_VISIBLE void* operator new[](std::size_t __sz)
|
||||
_LIBCPP_NEW_DELETE_VIS void* operator new[](std::size_t __sz)
|
||||
#if !__has_feature(cxx_noexcept)
|
||||
throw(std::bad_alloc)
|
||||
#endif
|
||||
;
|
||||
_LIBCPP_VISIBLE void* operator new[](std::size_t __sz, const std::nothrow_t&) _NOEXCEPT _NOALIAS;
|
||||
_LIBCPP_VISIBLE void operator delete[](void* __p) _NOEXCEPT;
|
||||
_LIBCPP_VISIBLE void operator delete[](void* __p, const std::nothrow_t&) _NOEXCEPT;
|
||||
_LIBCPP_NEW_DELETE_VIS void* operator new[](std::size_t __sz, const std::nothrow_t&) _NOEXCEPT _NOALIAS;
|
||||
_LIBCPP_NEW_DELETE_VIS void operator delete[](void* __p) _NOEXCEPT;
|
||||
_LIBCPP_NEW_DELETE_VIS void operator delete[](void* __p, const std::nothrow_t&) _NOEXCEPT;
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY inline void* operator new (std::size_t, void* __p) _NOEXCEPT {return __p;}
|
||||
_LIBCPP_INLINE_VISIBILITY inline void* operator new[](std::size_t, void* __p) _NOEXCEPT {return __p;}
|
||||
_LIBCPP_INLINE_VISIBILITY inline void operator delete (void*, void*) _NOEXCEPT {}
|
||||
_LIBCPP_INLINE_VISIBILITY inline void operator delete[](void*, void*) _NOEXCEPT {}
|
||||
inline _LIBCPP_INLINE_VISIBILITY void* operator new (std::size_t, void* __p) _NOEXCEPT {return __p;}
|
||||
inline _LIBCPP_INLINE_VISIBILITY void* operator new[](std::size_t, void* __p) _NOEXCEPT {return __p;}
|
||||
inline _LIBCPP_INLINE_VISIBILITY void operator delete (void*, void*) _NOEXCEPT {}
|
||||
inline _LIBCPP_INLINE_VISIBILITY void operator delete[](void*, void*) _NOEXCEPT {}
|
||||
|
||||
#endif // _LIBCPP_NEW
|
||||
|
||||
@@ -157,7 +157,7 @@ adjacent_difference(_InputIterator __first, _InputIterator __last, _OutputIterat
|
||||
{
|
||||
typename iterator_traits<_InputIterator>::value_type __t2(*__first);
|
||||
*__result = __t2 - __t1;
|
||||
__t1 = __t2;
|
||||
__t1 = _VSTD::move(__t2);
|
||||
}
|
||||
}
|
||||
return __result;
|
||||
@@ -177,7 +177,7 @@ adjacent_difference(_InputIterator __first, _InputIterator __last, _OutputIterat
|
||||
{
|
||||
typename iterator_traits<_InputIterator>::value_type __t2(*__first);
|
||||
*__result = __binary_op(__t2, __t1);
|
||||
__t1 = __t2;
|
||||
__t1 = _VSTD::move(__t2);
|
||||
}
|
||||
}
|
||||
return __result;
|
||||
|
||||
@@ -32,6 +32,7 @@ public:
|
||||
virtual ~basic_ostream();
|
||||
|
||||
// 27.7.2.3 Assign/swap
|
||||
basic_ostream& operator=(const basic_ostream& rhs) = delete; // C++14
|
||||
basic_ostream& operator=(basic_ostream&& rhs);
|
||||
void swap(basic_ostream& rhs);
|
||||
|
||||
@@ -140,7 +141,7 @@ template <class charT, class traits, class T>
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
class _LIBCPP_VISIBLE basic_ostream
|
||||
class _LIBCPP_TYPE_VIS_ONLY basic_ostream
|
||||
: virtual public basic_ios<_CharT, _Traits>
|
||||
{
|
||||
public:
|
||||
@@ -161,6 +162,9 @@ protected:
|
||||
#endif
|
||||
|
||||
// 27.7.2.3 Assign/swap
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
basic_ostream& operator=(const basic_ostream&) = delete;
|
||||
#endif
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
basic_ostream& operator=(basic_ostream&& __rhs);
|
||||
@@ -169,7 +173,7 @@ protected:
|
||||
public:
|
||||
|
||||
// 27.7.2.4 Prefix/suffix:
|
||||
class _LIBCPP_VISIBLE sentry;
|
||||
class _LIBCPP_TYPE_VIS_ONLY sentry;
|
||||
|
||||
// 27.7.2.6 Formatted output:
|
||||
basic_ostream& operator<<(basic_ostream& (*__pf)(basic_ostream&));
|
||||
@@ -207,7 +211,7 @@ protected:
|
||||
};
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
class _LIBCPP_VISIBLE basic_ostream<_CharT, _Traits>::sentry
|
||||
class _LIBCPP_TYPE_VIS_ONLY basic_ostream<_CharT, _Traits>::sentry
|
||||
{
|
||||
bool __ok_;
|
||||
basic_ostream<_CharT, _Traits>& __os_;
|
||||
@@ -1100,17 +1104,8 @@ basic_ostream<_CharT, _Traits>::write(const char_type* __s, streamsize __n)
|
||||
sentry __sen(*this);
|
||||
if (__sen && __n)
|
||||
{
|
||||
typedef ostreambuf_iterator<_CharT, _Traits> _Op;
|
||||
_Op __o(*this);
|
||||
for (; __n; --__n, ++__o, ++__s)
|
||||
{
|
||||
*__o = *__s;
|
||||
if (__o.failed())
|
||||
{
|
||||
this->setstate(ios_base::badbit);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (this->rdbuf()->sputn(__s, __n) != __n)
|
||||
this->setstate(ios_base::badbit);
|
||||
}
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
}
|
||||
@@ -1164,7 +1159,8 @@ inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_ostream<_CharT, _Traits>&
|
||||
basic_ostream<_CharT, _Traits>::seekp(pos_type __pos)
|
||||
{
|
||||
if (!this->fail())
|
||||
sentry __s(*this);
|
||||
if (__s)
|
||||
{
|
||||
if (this->rdbuf()->pubseekpos(__pos, ios_base::out) == pos_type(-1))
|
||||
this->setstate(ios_base::failbit);
|
||||
@@ -1177,8 +1173,12 @@ inline _LIBCPP_INLINE_VISIBILITY
|
||||
basic_ostream<_CharT, _Traits>&
|
||||
basic_ostream<_CharT, _Traits>::seekp(off_type __off, ios_base::seekdir __dir)
|
||||
{
|
||||
if (!this->fail())
|
||||
this->rdbuf()->pubseekoff(__off, __dir, ios_base::out);
|
||||
sentry __s(*this);
|
||||
if (__s)
|
||||
{
|
||||
if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::out) == pos_type(-1))
|
||||
this->setstate(ios_base::failbit);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
@@ -1287,8 +1287,8 @@ operator<<(basic_ostream<_CharT, _Traits>& __os, const bitset<_Size>& __x)
|
||||
use_facet<ctype<_CharT> >(__os.getloc()).widen('1'));
|
||||
}
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE(class basic_ostream<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class basic_ostream<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_ostream<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_ostream<wchar_t>)
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
|
||||
@@ -177,7 +177,7 @@ template <class T, class Container, class Compare>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _Tp, class _Container> class _LIBCPP_VISIBLE queue;
|
||||
template <class _Tp, class _Container> class _LIBCPP_TYPE_VIS_ONLY queue;
|
||||
|
||||
template <class _Tp, class _Container>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
@@ -190,7 +190,7 @@ bool
|
||||
operator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y);
|
||||
|
||||
template <class _Tp, class _Container = deque<_Tp> >
|
||||
class _LIBCPP_VISIBLE queue
|
||||
class _LIBCPP_TYPE_VIS_ONLY queue
|
||||
{
|
||||
public:
|
||||
typedef _Container container_type;
|
||||
@@ -376,14 +376,14 @@ swap(queue<_Tp, _Container>& __x, queue<_Tp, _Container>& __y)
|
||||
}
|
||||
|
||||
template <class _Tp, class _Container, class _Alloc>
|
||||
struct _LIBCPP_VISIBLE uses_allocator<queue<_Tp, _Container>, _Alloc>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY uses_allocator<queue<_Tp, _Container>, _Alloc>
|
||||
: public uses_allocator<_Container, _Alloc>
|
||||
{
|
||||
};
|
||||
|
||||
template <class _Tp, class _Container = vector<_Tp>,
|
||||
class _Compare = less<typename _Container::value_type> >
|
||||
class _LIBCPP_VISIBLE priority_queue
|
||||
class _LIBCPP_TYPE_VIS_ONLY priority_queue
|
||||
{
|
||||
public:
|
||||
typedef _Container container_type;
|
||||
@@ -707,7 +707,7 @@ swap(priority_queue<_Tp, _Container, _Compare>& __x,
|
||||
}
|
||||
|
||||
template <class _Tp, class _Container, class _Compare, class _Alloc>
|
||||
struct _LIBCPP_VISIBLE uses_allocator<priority_queue<_Tp, _Container, _Compare>, _Alloc>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY uses_allocator<priority_queue<_Tp, _Container, _Compare>, _Alloc>
|
||||
: public uses_allocator<_Container, _Alloc>
|
||||
{
|
||||
};
|
||||
|
||||
137
include/random
137
include/random
@@ -1813,7 +1813,7 @@ struct __lce_ta<__a, __c, __m, (unsigned short)(~0), __b>
|
||||
};
|
||||
|
||||
template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
|
||||
class _LIBCPP_VISIBLE linear_congruential_engine;
|
||||
class _LIBCPP_TYPE_VIS_ONLY linear_congruential_engine;
|
||||
|
||||
template <class _CharT, class _Traits,
|
||||
class _Up, _Up _Ap, _Up _Cp, _Up _Np>
|
||||
@@ -1829,7 +1829,7 @@ operator>>(basic_istream<_CharT, _Traits>& __is,
|
||||
linear_congruential_engine<_Up, _Ap, _Cp, _Np>& __x);
|
||||
|
||||
template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
|
||||
class _LIBCPP_VISIBLE linear_congruential_engine
|
||||
class _LIBCPP_TYPE_VIS_ONLY linear_congruential_engine
|
||||
{
|
||||
public:
|
||||
// types
|
||||
@@ -1880,7 +1880,7 @@ public:
|
||||
seed(_Sseq& __q)
|
||||
{__seed(__q, integral_constant<unsigned,
|
||||
1 + (__m == 0 ? (sizeof(result_type) * __CHAR_BIT__ - 1)/32
|
||||
: (__m-1) / 0x100000000ull)>());}
|
||||
: (__m > 0x100000000ull))>());}
|
||||
|
||||
// generating functions
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
@@ -1969,37 +1969,10 @@ linear_congruential_engine<_UIntType, __a, __c, __m>::__seed(_Sseq& __q,
|
||||
uint32_t __ar[__k+3];
|
||||
__q.generate(__ar, __ar + __k + 3);
|
||||
result_type __s = static_cast<result_type>((__ar[3] +
|
||||
(uint64_t)__ar[4] << 32) % __m);
|
||||
((uint64_t)__ar[4] << 32)) % __m);
|
||||
__x_ = __c == 0 && __s == 0 ? result_type(1) : __s;
|
||||
}
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
class __save_flags
|
||||
{
|
||||
typedef basic_ios<_CharT, _Traits> __stream_type;
|
||||
typedef typename __stream_type::fmtflags fmtflags;
|
||||
|
||||
__stream_type& __stream_;
|
||||
fmtflags __fmtflags_;
|
||||
_CharT __fill_;
|
||||
|
||||
__save_flags(const __save_flags&);
|
||||
__save_flags& operator=(const __save_flags&);
|
||||
public:
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit __save_flags(__stream_type& __stream)
|
||||
: __stream_(__stream),
|
||||
__fmtflags_(__stream.flags()),
|
||||
__fill_(__stream.fill())
|
||||
{}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
~__save_flags()
|
||||
{
|
||||
__stream_.flags(__fmtflags_);
|
||||
__stream_.fill(__fill_);
|
||||
}
|
||||
};
|
||||
|
||||
template <class _CharT, class _Traits,
|
||||
class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
@@ -2038,7 +2011,7 @@ typedef minstd_rand default_random_engine;
|
||||
template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
|
||||
_UIntType __a, size_t __u, _UIntType __d, size_t __s,
|
||||
_UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
|
||||
class _LIBCPP_VISIBLE mersenne_twister_engine;
|
||||
class _LIBCPP_TYPE_VIS_ONLY mersenne_twister_engine;
|
||||
|
||||
template <class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp,
|
||||
_UI _Ap, size_t _Up, _UI _Dp, size_t _Sp,
|
||||
@@ -2080,7 +2053,7 @@ operator>>(basic_istream<_CharT, _Traits>& __is,
|
||||
template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r,
|
||||
_UIntType __a, size_t __u, _UIntType __d, size_t __s,
|
||||
_UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f>
|
||||
class _LIBCPP_VISIBLE mersenne_twister_engine
|
||||
class _LIBCPP_TYPE_VIS_ONLY mersenne_twister_engine
|
||||
{
|
||||
public:
|
||||
// types
|
||||
@@ -2526,7 +2499,7 @@ typedef mersenne_twister_engine<uint_fast64_t, 64, 312, 156, 31,
|
||||
// subtract_with_carry_engine
|
||||
|
||||
template<class _UIntType, size_t __w, size_t __s, size_t __r>
|
||||
class _LIBCPP_VISIBLE subtract_with_carry_engine;
|
||||
class _LIBCPP_TYPE_VIS_ONLY subtract_with_carry_engine;
|
||||
|
||||
template<class _UI, size_t _Wp, size_t _Sp, size_t _Rp>
|
||||
bool
|
||||
@@ -2554,7 +2527,7 @@ operator>>(basic_istream<_CharT, _Traits>& __is,
|
||||
subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x);
|
||||
|
||||
template<class _UIntType, size_t __w, size_t __s, size_t __r>
|
||||
class _LIBCPP_VISIBLE subtract_with_carry_engine
|
||||
class _LIBCPP_TYPE_VIS_ONLY subtract_with_carry_engine
|
||||
{
|
||||
public:
|
||||
// types
|
||||
@@ -2837,7 +2810,7 @@ typedef subtract_with_carry_engine<uint_fast64_t, 48, 5, 12> ranlux48_base;
|
||||
// discard_block_engine
|
||||
|
||||
template<class _Engine, size_t __p, size_t __r>
|
||||
class _LIBCPP_VISIBLE discard_block_engine
|
||||
class _LIBCPP_TYPE_VIS_ONLY discard_block_engine
|
||||
{
|
||||
_Engine __e_;
|
||||
int __n_;
|
||||
@@ -3010,7 +2983,7 @@ typedef discard_block_engine<ranlux48_base, 389, 11> ranlux48;
|
||||
// independent_bits_engine
|
||||
|
||||
template<class _Engine, size_t __w, class _UIntType>
|
||||
class _LIBCPP_VISIBLE independent_bits_engine
|
||||
class _LIBCPP_TYPE_VIS_ONLY independent_bits_engine
|
||||
{
|
||||
template <class _UI, _UI _R0, size_t _Wp, size_t _Mp>
|
||||
class __get_n
|
||||
@@ -3273,7 +3246,7 @@ public:
|
||||
};
|
||||
|
||||
template<class _Engine, size_t __k>
|
||||
class _LIBCPP_VISIBLE shuffle_order_engine
|
||||
class _LIBCPP_TYPE_VIS_ONLY shuffle_order_engine
|
||||
{
|
||||
static_assert(0 < __k, "shuffle_order_engine invalid parameters");
|
||||
public:
|
||||
@@ -3500,9 +3473,11 @@ typedef shuffle_order_engine<minstd_rand0, 256> knuth_b;
|
||||
|
||||
// random_device
|
||||
|
||||
class _LIBCPP_VISIBLE random_device
|
||||
class _LIBCPP_TYPE_VIS random_device
|
||||
{
|
||||
#if !defined(_WIN32)
|
||||
int __f_;
|
||||
#endif // defined(_WIN32)
|
||||
public:
|
||||
// types
|
||||
typedef unsigned result_type;
|
||||
@@ -3534,7 +3509,7 @@ private:
|
||||
|
||||
// seed_seq
|
||||
|
||||
class _LIBCPP_VISIBLE seed_seq
|
||||
class _LIBCPP_TYPE_VIS_ONLY seed_seq
|
||||
{
|
||||
public:
|
||||
// types
|
||||
@@ -3548,7 +3523,7 @@ private:
|
||||
public:
|
||||
// constructors
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
seed_seq() {}
|
||||
seed_seq() _NOEXCEPT {}
|
||||
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
||||
template<class _Tp>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
@@ -3566,7 +3541,7 @@ public:
|
||||
|
||||
// property functions
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
size_t size() const {return __v_.size();}
|
||||
size_t size() const _NOEXCEPT {return __v_.size();}
|
||||
template<class _OutputIterator>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
void param(_OutputIterator __dest) const
|
||||
@@ -3711,13 +3686,13 @@ operator>>(basic_istream<_CharT, _Traits>& __is,
|
||||
// uniform_real_distribution
|
||||
|
||||
template<class _RealType = double>
|
||||
class _LIBCPP_VISIBLE uniform_real_distribution
|
||||
class _LIBCPP_TYPE_VIS_ONLY uniform_real_distribution
|
||||
{
|
||||
public:
|
||||
// types
|
||||
typedef _RealType result_type;
|
||||
|
||||
class _LIBCPP_VISIBLE param_type
|
||||
class _LIBCPP_TYPE_VIS_ONLY param_type
|
||||
{
|
||||
result_type __a_;
|
||||
result_type __b_;
|
||||
@@ -3832,13 +3807,13 @@ operator>>(basic_istream<_CharT, _Traits>& __is,
|
||||
|
||||
// bernoulli_distribution
|
||||
|
||||
class _LIBCPP_VISIBLE bernoulli_distribution
|
||||
class _LIBCPP_TYPE_VIS_ONLY bernoulli_distribution
|
||||
{
|
||||
public:
|
||||
// types
|
||||
typedef bool result_type;
|
||||
|
||||
class _LIBCPP_VISIBLE param_type
|
||||
class _LIBCPP_TYPE_VIS_ONLY param_type
|
||||
{
|
||||
double __p_;
|
||||
public:
|
||||
@@ -3941,13 +3916,13 @@ operator>>(basic_istream<_CharT, _Traits>& __is, bernoulli_distribution& __x)
|
||||
// binomial_distribution
|
||||
|
||||
template<class _IntType = int>
|
||||
class _LIBCPP_VISIBLE binomial_distribution
|
||||
class _LIBCPP_TYPE_VIS_ONLY binomial_distribution
|
||||
{
|
||||
public:
|
||||
// types
|
||||
typedef _IntType result_type;
|
||||
|
||||
class _LIBCPP_VISIBLE param_type
|
||||
class _LIBCPP_TYPE_VIS_ONLY param_type
|
||||
{
|
||||
result_type __t_;
|
||||
double __p_;
|
||||
@@ -4106,13 +4081,13 @@ operator>>(basic_istream<_CharT, _Traits>& __is,
|
||||
// exponential_distribution
|
||||
|
||||
template<class _RealType = double>
|
||||
class _LIBCPP_VISIBLE exponential_distribution
|
||||
class _LIBCPP_TYPE_VIS_ONLY exponential_distribution
|
||||
{
|
||||
public:
|
||||
// types
|
||||
typedef _RealType result_type;
|
||||
|
||||
class _LIBCPP_VISIBLE param_type
|
||||
class _LIBCPP_TYPE_VIS_ONLY param_type
|
||||
{
|
||||
result_type __lambda_;
|
||||
public:
|
||||
@@ -4221,13 +4196,13 @@ operator>>(basic_istream<_CharT, _Traits>& __is,
|
||||
// normal_distribution
|
||||
|
||||
template<class _RealType = double>
|
||||
class _LIBCPP_VISIBLE normal_distribution
|
||||
class _LIBCPP_TYPE_VIS_ONLY normal_distribution
|
||||
{
|
||||
public:
|
||||
// types
|
||||
typedef _RealType result_type;
|
||||
|
||||
class _LIBCPP_VISIBLE param_type
|
||||
class _LIBCPP_TYPE_VIS_ONLY param_type
|
||||
{
|
||||
result_type __mean_;
|
||||
result_type __stddev_;
|
||||
@@ -4389,13 +4364,13 @@ operator>>(basic_istream<_CharT, _Traits>& __is,
|
||||
// lognormal_distribution
|
||||
|
||||
template<class _RealType = double>
|
||||
class _LIBCPP_VISIBLE lognormal_distribution
|
||||
class _LIBCPP_TYPE_VIS_ONLY lognormal_distribution
|
||||
{
|
||||
public:
|
||||
// types
|
||||
typedef _RealType result_type;
|
||||
|
||||
class _LIBCPP_VISIBLE param_type
|
||||
class _LIBCPP_TYPE_VIS_ONLY param_type
|
||||
{
|
||||
normal_distribution<result_type> __nd_;
|
||||
public:
|
||||
@@ -4514,13 +4489,13 @@ operator>>(basic_istream<_CharT, _Traits>& __is,
|
||||
// poisson_distribution
|
||||
|
||||
template<class _IntType = int>
|
||||
class _LIBCPP_VISIBLE poisson_distribution
|
||||
class _LIBCPP_TYPE_VIS_ONLY poisson_distribution
|
||||
{
|
||||
public:
|
||||
// types
|
||||
typedef _IntType result_type;
|
||||
|
||||
class _LIBCPP_VISIBLE param_type
|
||||
class _LIBCPP_TYPE_VIS_ONLY param_type
|
||||
{
|
||||
double __mean_;
|
||||
double __s_;
|
||||
@@ -4745,13 +4720,13 @@ operator>>(basic_istream<_CharT, _Traits>& __is,
|
||||
// weibull_distribution
|
||||
|
||||
template<class _RealType = double>
|
||||
class _LIBCPP_VISIBLE weibull_distribution
|
||||
class _LIBCPP_TYPE_VIS_ONLY weibull_distribution
|
||||
{
|
||||
public:
|
||||
// types
|
||||
typedef _RealType result_type;
|
||||
|
||||
class _LIBCPP_VISIBLE param_type
|
||||
class _LIBCPP_TYPE_VIS_ONLY param_type
|
||||
{
|
||||
result_type __a_;
|
||||
result_type __b_;
|
||||
@@ -4859,13 +4834,13 @@ operator>>(basic_istream<_CharT, _Traits>& __is,
|
||||
}
|
||||
|
||||
template<class _RealType = double>
|
||||
class _LIBCPP_VISIBLE extreme_value_distribution
|
||||
class _LIBCPP_TYPE_VIS_ONLY extreme_value_distribution
|
||||
{
|
||||
public:
|
||||
// types
|
||||
typedef _RealType result_type;
|
||||
|
||||
class _LIBCPP_VISIBLE param_type
|
||||
class _LIBCPP_TYPE_VIS_ONLY param_type
|
||||
{
|
||||
result_type __a_;
|
||||
result_type __b_;
|
||||
@@ -4980,13 +4955,13 @@ operator>>(basic_istream<_CharT, _Traits>& __is,
|
||||
// gamma_distribution
|
||||
|
||||
template<class _RealType = double>
|
||||
class _LIBCPP_VISIBLE gamma_distribution
|
||||
class _LIBCPP_TYPE_VIS_ONLY gamma_distribution
|
||||
{
|
||||
public:
|
||||
// types
|
||||
typedef _RealType result_type;
|
||||
|
||||
class _LIBCPP_VISIBLE param_type
|
||||
class _LIBCPP_TYPE_VIS_ONLY param_type
|
||||
{
|
||||
result_type __alpha_;
|
||||
result_type __beta_;
|
||||
@@ -5152,13 +5127,13 @@ operator>>(basic_istream<_CharT, _Traits>& __is,
|
||||
// negative_binomial_distribution
|
||||
|
||||
template<class _IntType = int>
|
||||
class _LIBCPP_VISIBLE negative_binomial_distribution
|
||||
class _LIBCPP_TYPE_VIS_ONLY negative_binomial_distribution
|
||||
{
|
||||
public:
|
||||
// types
|
||||
typedef _IntType result_type;
|
||||
|
||||
class _LIBCPP_VISIBLE param_type
|
||||
class _LIBCPP_TYPE_VIS_ONLY param_type
|
||||
{
|
||||
result_type __k_;
|
||||
double __p_;
|
||||
@@ -5287,13 +5262,13 @@ operator>>(basic_istream<_CharT, _Traits>& __is,
|
||||
// geometric_distribution
|
||||
|
||||
template<class _IntType = int>
|
||||
class _LIBCPP_VISIBLE geometric_distribution
|
||||
class _LIBCPP_TYPE_VIS_ONLY geometric_distribution
|
||||
{
|
||||
public:
|
||||
// types
|
||||
typedef _IntType result_type;
|
||||
|
||||
class _LIBCPP_VISIBLE param_type
|
||||
class _LIBCPP_TYPE_VIS_ONLY param_type
|
||||
{
|
||||
double __p_;
|
||||
public:
|
||||
@@ -5389,13 +5364,13 @@ operator>>(basic_istream<_CharT, _Traits>& __is,
|
||||
// chi_squared_distribution
|
||||
|
||||
template<class _RealType = double>
|
||||
class _LIBCPP_VISIBLE chi_squared_distribution
|
||||
class _LIBCPP_TYPE_VIS_ONLY chi_squared_distribution
|
||||
{
|
||||
public:
|
||||
// types
|
||||
typedef _RealType result_type;
|
||||
|
||||
class _LIBCPP_VISIBLE param_type
|
||||
class _LIBCPP_TYPE_VIS_ONLY param_type
|
||||
{
|
||||
result_type __n_;
|
||||
public:
|
||||
@@ -5495,13 +5470,13 @@ operator>>(basic_istream<_CharT, _Traits>& __is,
|
||||
// cauchy_distribution
|
||||
|
||||
template<class _RealType = double>
|
||||
class _LIBCPP_VISIBLE cauchy_distribution
|
||||
class _LIBCPP_TYPE_VIS_ONLY cauchy_distribution
|
||||
{
|
||||
public:
|
||||
// types
|
||||
typedef _RealType result_type;
|
||||
|
||||
class _LIBCPP_VISIBLE param_type
|
||||
class _LIBCPP_TYPE_VIS_ONLY param_type
|
||||
{
|
||||
result_type __a_;
|
||||
result_type __b_;
|
||||
@@ -5618,13 +5593,13 @@ operator>>(basic_istream<_CharT, _Traits>& __is,
|
||||
// fisher_f_distribution
|
||||
|
||||
template<class _RealType = double>
|
||||
class _LIBCPP_VISIBLE fisher_f_distribution
|
||||
class _LIBCPP_TYPE_VIS_ONLY fisher_f_distribution
|
||||
{
|
||||
public:
|
||||
// types
|
||||
typedef _RealType result_type;
|
||||
|
||||
class _LIBCPP_VISIBLE param_type
|
||||
class _LIBCPP_TYPE_VIS_ONLY param_type
|
||||
{
|
||||
result_type __m_;
|
||||
result_type __n_;
|
||||
@@ -5740,13 +5715,13 @@ operator>>(basic_istream<_CharT, _Traits>& __is,
|
||||
// student_t_distribution
|
||||
|
||||
template<class _RealType = double>
|
||||
class _LIBCPP_VISIBLE student_t_distribution
|
||||
class _LIBCPP_TYPE_VIS_ONLY student_t_distribution
|
||||
{
|
||||
public:
|
||||
// types
|
||||
typedef _RealType result_type;
|
||||
|
||||
class _LIBCPP_VISIBLE param_type
|
||||
class _LIBCPP_TYPE_VIS_ONLY param_type
|
||||
{
|
||||
result_type __n_;
|
||||
public:
|
||||
@@ -5853,13 +5828,13 @@ operator>>(basic_istream<_CharT, _Traits>& __is,
|
||||
// discrete_distribution
|
||||
|
||||
template<class _IntType = int>
|
||||
class _LIBCPP_VISIBLE discrete_distribution
|
||||
class _LIBCPP_TYPE_VIS_ONLY discrete_distribution
|
||||
{
|
||||
public:
|
||||
// types
|
||||
typedef _IntType result_type;
|
||||
|
||||
class _LIBCPP_VISIBLE param_type
|
||||
class _LIBCPP_TYPE_VIS_ONLY param_type
|
||||
{
|
||||
vector<double> __p_;
|
||||
public:
|
||||
@@ -5928,8 +5903,8 @@ public:
|
||||
discrete_distribution(size_t __nw, double __xmin, double __xmax,
|
||||
_UnaryOperation __fw)
|
||||
: __p_(__nw, __xmin, __xmax, __fw) {}
|
||||
explicit discrete_distribution(const param_type& __p)
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit discrete_distribution(const param_type& __p)
|
||||
: __p_(__p) {}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
void reset() {}
|
||||
@@ -6084,13 +6059,13 @@ operator>>(basic_istream<_CharT, _Traits>& __is,
|
||||
// piecewise_constant_distribution
|
||||
|
||||
template<class _RealType = double>
|
||||
class _LIBCPP_VISIBLE piecewise_constant_distribution
|
||||
class _LIBCPP_TYPE_VIS_ONLY piecewise_constant_distribution
|
||||
{
|
||||
public:
|
||||
// types
|
||||
typedef _RealType result_type;
|
||||
|
||||
class _LIBCPP_VISIBLE param_type
|
||||
class _LIBCPP_TYPE_VIS_ONLY param_type
|
||||
{
|
||||
vector<result_type> __b_;
|
||||
vector<result_type> __densities_;
|
||||
@@ -6408,13 +6383,13 @@ operator>>(basic_istream<_CharT, _Traits>& __is,
|
||||
// piecewise_linear_distribution
|
||||
|
||||
template<class _RealType = double>
|
||||
class _LIBCPP_VISIBLE piecewise_linear_distribution
|
||||
class _LIBCPP_TYPE_VIS_ONLY piecewise_linear_distribution
|
||||
{
|
||||
public:
|
||||
// types
|
||||
typedef _RealType result_type;
|
||||
|
||||
class _LIBCPP_VISIBLE param_type
|
||||
class _LIBCPP_TYPE_VIS_ONLY param_type
|
||||
{
|
||||
vector<result_type> __b_;
|
||||
vector<result_type> __densities_;
|
||||
|
||||
@@ -231,7 +231,7 @@ public:
|
||||
};
|
||||
|
||||
template <intmax_t _Num, intmax_t _Den = 1>
|
||||
class _LIBCPP_VISIBLE ratio
|
||||
class _LIBCPP_TYPE_VIS_ONLY ratio
|
||||
{
|
||||
static_assert(__static_abs<_Num>::value >= 0, "ratio numerator is out of range");
|
||||
static_assert(_Den != 0, "ratio divide by 0");
|
||||
@@ -292,7 +292,7 @@ template <class _R1, class _R2> using ratio_multiply
|
||||
#else // _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
|
||||
template <class _R1, class _R2>
|
||||
struct _LIBCPP_VISIBLE ratio_multiply
|
||||
struct _LIBCPP_TYPE_VIS_ONLY ratio_multiply
|
||||
: public __ratio_multiply<_R1, _R2>::type {};
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
@@ -319,7 +319,7 @@ template <class _R1, class _R2> using ratio_divide
|
||||
#else // _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
|
||||
template <class _R1, class _R2>
|
||||
struct _LIBCPP_VISIBLE ratio_divide
|
||||
struct _LIBCPP_TYPE_VIS_ONLY ratio_divide
|
||||
: public __ratio_divide<_R1, _R2>::type {};
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
@@ -354,7 +354,7 @@ template <class _R1, class _R2> using ratio_add
|
||||
#else // _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
|
||||
template <class _R1, class _R2>
|
||||
struct _LIBCPP_VISIBLE ratio_add
|
||||
struct _LIBCPP_TYPE_VIS_ONLY ratio_add
|
||||
: public __ratio_add<_R1, _R2>::type {};
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
@@ -389,7 +389,7 @@ template <class _R1, class _R2> using ratio_subtract
|
||||
#else // _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
|
||||
template <class _R1, class _R2>
|
||||
struct _LIBCPP_VISIBLE ratio_subtract
|
||||
struct _LIBCPP_TYPE_VIS_ONLY ratio_subtract
|
||||
: public __ratio_subtract<_R1, _R2>::type {};
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_TEMPLATE_ALIASES
|
||||
@@ -397,11 +397,11 @@ struct _LIBCPP_VISIBLE ratio_subtract
|
||||
// ratio_equal
|
||||
|
||||
template <class _R1, class _R2>
|
||||
struct _LIBCPP_VISIBLE ratio_equal
|
||||
struct _LIBCPP_TYPE_VIS_ONLY ratio_equal
|
||||
: public integral_constant<bool, _R1::num == _R2::num && _R1::den == _R2::den> {};
|
||||
|
||||
template <class _R1, class _R2>
|
||||
struct _LIBCPP_VISIBLE ratio_not_equal
|
||||
struct _LIBCPP_TYPE_VIS_ONLY ratio_not_equal
|
||||
: public integral_constant<bool, !ratio_equal<_R1, _R2>::value> {};
|
||||
|
||||
// ratio_less
|
||||
@@ -460,19 +460,19 @@ struct __ratio_less<_R1, _R2, -1LL, -1LL>
|
||||
};
|
||||
|
||||
template <class _R1, class _R2>
|
||||
struct _LIBCPP_VISIBLE ratio_less
|
||||
struct _LIBCPP_TYPE_VIS_ONLY ratio_less
|
||||
: public integral_constant<bool, __ratio_less<_R1, _R2>::value> {};
|
||||
|
||||
template <class _R1, class _R2>
|
||||
struct _LIBCPP_VISIBLE ratio_less_equal
|
||||
struct _LIBCPP_TYPE_VIS_ONLY ratio_less_equal
|
||||
: public integral_constant<bool, !ratio_less<_R2, _R1>::value> {};
|
||||
|
||||
template <class _R1, class _R2>
|
||||
struct _LIBCPP_VISIBLE ratio_greater
|
||||
struct _LIBCPP_TYPE_VIS_ONLY ratio_greater
|
||||
: public integral_constant<bool, ratio_less<_R2, _R1>::value> {};
|
||||
|
||||
template <class _R1, class _R2>
|
||||
struct _LIBCPP_VISIBLE ratio_greater_equal
|
||||
struct _LIBCPP_TYPE_VIS_ONLY ratio_greater_equal
|
||||
: public integral_constant<bool, !ratio_less<_R1, _R2>::value> {};
|
||||
|
||||
template <class _R1, class _R2>
|
||||
|
||||
126
include/regex
126
include/regex
@@ -764,7 +764,7 @@ _LIBCPP_CONSTEXPR
|
||||
syntax_option_type
|
||||
operator~(syntax_option_type __x)
|
||||
{
|
||||
return syntax_option_type(~int(__x));
|
||||
return syntax_option_type(~int(__x) & 0x1FF);
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
@@ -840,7 +840,7 @@ _LIBCPP_CONSTEXPR
|
||||
match_flag_type
|
||||
operator~(match_flag_type __x)
|
||||
{
|
||||
return match_flag_type(~int(__x));
|
||||
return match_flag_type(~int(__x) & 0x0FFF);
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
@@ -925,7 +925,7 @@ public:
|
||||
};
|
||||
|
||||
template <class _CharT>
|
||||
struct _LIBCPP_VISIBLE regex_traits
|
||||
struct _LIBCPP_TYPE_VIS_ONLY regex_traits
|
||||
{
|
||||
public:
|
||||
typedef _CharT char_type;
|
||||
@@ -970,7 +970,7 @@ public:
|
||||
bool isctype(char_type __c, char_class_type __m) const;
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
int value(char_type __ch, int __radix) const
|
||||
{return __value(__ch, __radix);}
|
||||
{return __regex_traits_value(__ch, __radix);}
|
||||
locale_type imbue(locale_type __l);
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
locale_type getloc()const {return __loc_;}
|
||||
@@ -1001,13 +1001,17 @@ private:
|
||||
__lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
|
||||
bool __icase, wchar_t) const;
|
||||
|
||||
static int __value(unsigned char __ch, int __radix);
|
||||
static int __regex_traits_value(unsigned char __ch, int __radix);
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
int __value(char __ch, int __radix) const
|
||||
{return __value(static_cast<unsigned char>(__ch), __radix);}
|
||||
int __value(wchar_t __ch, int __radix) const;
|
||||
int __regex_traits_value(char __ch, int __radix) const
|
||||
{return __regex_traits_value(static_cast<unsigned char>(__ch), __radix);}
|
||||
int __regex_traits_value(wchar_t __ch, int __radix) const;
|
||||
};
|
||||
|
||||
template <class _CharT>
|
||||
const typename regex_traits<_CharT>::char_class_type
|
||||
regex_traits<_CharT>::__regex_word;
|
||||
|
||||
template <class _CharT>
|
||||
regex_traits<_CharT>::regex_traits()
|
||||
{
|
||||
@@ -1096,7 +1100,7 @@ regex_traits<_CharT>::__transform_primary(_ForwardIterator __f,
|
||||
|
||||
// lookup_collatename is very FreeBSD-specific
|
||||
|
||||
string __get_collation_name(const char* __s);
|
||||
_LIBCPP_FUNC_VIS string __get_collation_name(const char* __s);
|
||||
|
||||
template <class _CharT>
|
||||
template <class _ForwardIterator>
|
||||
@@ -1157,7 +1161,7 @@ regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f,
|
||||
|
||||
// lookup_classname
|
||||
|
||||
ctype_base::mask __get_classname(const char* __s, bool __icase);
|
||||
ctype_base::mask _LIBCPP_FUNC_VIS __get_classname(const char* __s, bool __icase);
|
||||
|
||||
template <class _CharT>
|
||||
template <class _ForwardIterator>
|
||||
@@ -1203,7 +1207,7 @@ regex_traits<_CharT>::isctype(char_type __c, char_class_type __m) const
|
||||
|
||||
template <class _CharT>
|
||||
int
|
||||
regex_traits<_CharT>::__value(unsigned char __ch, int __radix)
|
||||
regex_traits<_CharT>::__regex_traits_value(unsigned char __ch, int __radix)
|
||||
{
|
||||
if ((__ch & 0xF8u) == 0x30) // '0' <= __ch && __ch <= '7'
|
||||
return __ch - '0';
|
||||
@@ -1224,18 +1228,18 @@ regex_traits<_CharT>::__value(unsigned char __ch, int __radix)
|
||||
template <class _CharT>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
int
|
||||
regex_traits<_CharT>::__value(wchar_t __ch, int __radix) const
|
||||
regex_traits<_CharT>::__regex_traits_value(wchar_t __ch, int __radix) const
|
||||
{
|
||||
return __value(static_cast<unsigned char>(__ct_->narrow(__ch, char_type())), __radix);
|
||||
return __regex_traits_value(static_cast<unsigned char>(__ct_->narrow(__ch, char_type())), __radix);
|
||||
}
|
||||
|
||||
template <class _CharT> class __node;
|
||||
|
||||
template <class _BidirectionalIterator> class _LIBCPP_VISIBLE sub_match;
|
||||
template <class _BidirectionalIterator> class _LIBCPP_TYPE_VIS_ONLY sub_match;
|
||||
|
||||
template <class _BidirectionalIterator,
|
||||
class _Allocator = allocator<sub_match<_BidirectionalIterator> > >
|
||||
class _LIBCPP_VISIBLE match_results;
|
||||
class _LIBCPP_TYPE_VIS_ONLY match_results;
|
||||
|
||||
template <class _CharT>
|
||||
struct __state
|
||||
@@ -2010,6 +2014,9 @@ public:
|
||||
virtual void __exec(__state&) const;
|
||||
};
|
||||
|
||||
template <> _LIBCPP_FUNC_VIS void __match_any_but_newline<char>::__exec(__state&) const;
|
||||
template <> _LIBCPP_FUNC_VIS void __match_any_but_newline<wchar_t>::__exec(__state&) const;
|
||||
|
||||
// __match_char
|
||||
|
||||
template <class _CharT>
|
||||
@@ -2411,7 +2418,7 @@ __exit:
|
||||
template <class _CharT, class _Traits> class __lookahead;
|
||||
|
||||
template <class _CharT, class _Traits = regex_traits<_CharT> >
|
||||
class _LIBCPP_VISIBLE basic_regex
|
||||
class _LIBCPP_TYPE_VIS_ONLY basic_regex
|
||||
{
|
||||
public:
|
||||
// types:
|
||||
@@ -2765,7 +2772,7 @@ private:
|
||||
void __push_end_marked_subexpression(unsigned);
|
||||
void __push_empty();
|
||||
void __push_word_boundary(bool);
|
||||
void __push_lookahead(const basic_regex&, bool);
|
||||
void __push_lookahead(const basic_regex&, bool, unsigned);
|
||||
|
||||
template <class _Allocator>
|
||||
bool
|
||||
@@ -2839,6 +2846,15 @@ private:
|
||||
const basic_regex<_Cp, _Tp>& __e,
|
||||
regex_constants::match_flag_type __flags);
|
||||
|
||||
template <class _Iter, class _Ap, class _Cp, class _Tp>
|
||||
friend
|
||||
bool
|
||||
regex_search(__wrap_iter<_Iter> __first,
|
||||
__wrap_iter<_Iter> __last,
|
||||
match_results<__wrap_iter<_Iter>, _Ap>& __m,
|
||||
const basic_regex<_Cp, _Tp>& __e,
|
||||
regex_constants::match_flag_type __flags);
|
||||
|
||||
template <class, class> friend class __lookahead;
|
||||
};
|
||||
|
||||
@@ -2894,6 +2910,7 @@ class __lookahead
|
||||
typedef __owns_one_state<_CharT> base;
|
||||
|
||||
basic_regex<_CharT, _Traits> __exp_;
|
||||
unsigned __mexp_;
|
||||
bool __invert_;
|
||||
|
||||
__lookahead(const __lookahead&);
|
||||
@@ -2902,8 +2919,8 @@ public:
|
||||
typedef _VSTD::__state<_CharT> __state;
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__lookahead(const basic_regex<_CharT, _Traits>& __exp, bool __invert, __node<_CharT>* __s)
|
||||
: base(__s), __exp_(__exp), __invert_(__invert) {}
|
||||
__lookahead(const basic_regex<_CharT, _Traits>& __exp, bool __invert, __node<_CharT>* __s, unsigned __mexp)
|
||||
: base(__s), __exp_(__exp), __invert_(__invert), __mexp_(__mexp) {}
|
||||
|
||||
virtual void __exec(__state&) const;
|
||||
};
|
||||
@@ -2917,11 +2934,14 @@ __lookahead<_CharT, _Traits>::__exec(__state& __s) const
|
||||
bool __matched = __exp_.__match_at_start_ecma(__s.__current_, __s.__last_,
|
||||
__m,
|
||||
__s.__flags_ | regex_constants::match_continuous,
|
||||
true);
|
||||
__s.__at_first_ && __s.__current_ == __s.__first_);
|
||||
if (__matched != __invert_)
|
||||
{
|
||||
__s.__do_ = __state::__accept_but_not_consume;
|
||||
__s.__node_ = this->first();
|
||||
for (unsigned __i = 1; __i < __m.size(); ++__i) {
|
||||
__s.__sub_matches_[__mexp_ + __i - 1] = __m.__matches_[__i];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -3416,6 +3436,7 @@ basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR_ERE(_ForwardIterator __first,
|
||||
case '+':
|
||||
case '?':
|
||||
case '{':
|
||||
case '}':
|
||||
__push_char(*__temp);
|
||||
__first = ++__temp;
|
||||
break;
|
||||
@@ -3764,7 +3785,7 @@ basic_regex<_CharT, _Traits>::__parse_expression_term(_ForwardIterator __first,
|
||||
}
|
||||
__ml->__add_range(_VSTD::move(__start_range), _VSTD::move(__end_range));
|
||||
}
|
||||
else
|
||||
else if (!__start_range.empty())
|
||||
{
|
||||
if (__start_range.size() == 1)
|
||||
__ml->__add_char(__start_range[0]);
|
||||
@@ -3772,7 +3793,7 @@ basic_regex<_CharT, _Traits>::__parse_expression_term(_ForwardIterator __first,
|
||||
__ml->__add_digraph(__start_range[0], __start_range[1]);
|
||||
}
|
||||
}
|
||||
else
|
||||
else if (!__start_range.empty())
|
||||
{
|
||||
if (__start_range.size() == 1)
|
||||
__ml->__add_char(__start_range[0]);
|
||||
@@ -3899,7 +3920,7 @@ basic_regex<_CharT, _Traits>::__parse_awk_escape(_ForwardIterator __first,
|
||||
{
|
||||
__val = 8 * __val + *__first - '0';
|
||||
if (++__first != __last && ('0' <= *__first && *__first <= '7'))
|
||||
__val = 8 * __val + *__first - '0';
|
||||
__val = 8 * __val + *__first++ - '0';
|
||||
}
|
||||
if (__str)
|
||||
*__str = _CharT(__val);
|
||||
@@ -4154,7 +4175,9 @@ basic_regex<_CharT, _Traits>::__parse_assertion(_ForwardIterator __first,
|
||||
basic_regex __exp;
|
||||
__exp.__flags_ = __flags_;
|
||||
__temp = __exp.__parse(++__temp, __last);
|
||||
__push_lookahead(_VSTD::move(__exp), false);
|
||||
unsigned __mexp = __exp.__marked_count_;
|
||||
__push_lookahead(_VSTD::move(__exp), false, __marked_count_);
|
||||
__marked_count_ += __mexp;
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
if (__temp == __last || *__temp != ')')
|
||||
throw regex_error(regex_constants::error_paren);
|
||||
@@ -4167,7 +4190,9 @@ basic_regex<_CharT, _Traits>::__parse_assertion(_ForwardIterator __first,
|
||||
basic_regex __exp;
|
||||
__exp.__flags_ = __flags_;
|
||||
__temp = __exp.__parse(++__temp, __last);
|
||||
__push_lookahead(_VSTD::move(__exp), true);
|
||||
unsigned __mexp = __exp.__marked_count_;
|
||||
__push_lookahead(_VSTD::move(__exp), true, __marked_count_);
|
||||
__marked_count_ += __mexp;
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
if (__temp == __last || *__temp != ')')
|
||||
throw regex_error(regex_constants::error_paren);
|
||||
@@ -4404,7 +4429,8 @@ basic_regex<_CharT, _Traits>::__parse_character_escape(_ForwardIterator __first,
|
||||
case 'c':
|
||||
if ((__t = _VSTD::next(__first)) != __last)
|
||||
{
|
||||
if ('A' <= *__t <= 'Z' || 'a' <= *__t <= 'z')
|
||||
if (('A' <= *__t && *__t <= 'Z') ||
|
||||
('a' <= *__t && *__t <= 'z'))
|
||||
{
|
||||
if (__str)
|
||||
*__str = _CharT(*__t % 32);
|
||||
@@ -4412,7 +4438,15 @@ basic_regex<_CharT, _Traits>::__parse_character_escape(_ForwardIterator __first,
|
||||
__push_char(_CharT(*__t % 32));
|
||||
__first = ++__t;
|
||||
}
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
else
|
||||
throw regex_error(regex_constants::error_escape);
|
||||
#endif // _LIBCPP_NO_EXCEPTIONS
|
||||
}
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
else
|
||||
throw regex_error(regex_constants::error_escape);
|
||||
#endif // _LIBCPP_NO_EXCEPTIONS
|
||||
break;
|
||||
case 'u':
|
||||
++__first;
|
||||
@@ -4477,7 +4511,7 @@ basic_regex<_CharT, _Traits>::__parse_character_escape(_ForwardIterator __first,
|
||||
++__first;
|
||||
}
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
else if (__str)
|
||||
else
|
||||
throw regex_error(regex_constants::error_escape);
|
||||
#endif // _LIBCPP_NO_EXCEPTIONS
|
||||
break;
|
||||
@@ -4736,10 +4770,11 @@ basic_regex<_CharT, _Traits>::__start_matching_list(bool __negate)
|
||||
template <class _CharT, class _Traits>
|
||||
void
|
||||
basic_regex<_CharT, _Traits>::__push_lookahead(const basic_regex& __exp,
|
||||
bool __invert)
|
||||
bool __invert,
|
||||
unsigned __mexp)
|
||||
{
|
||||
__end_->first() = new __lookahead<_CharT, _Traits>(__exp, __invert,
|
||||
__end_->first());
|
||||
__end_->first(), __mexp);
|
||||
__end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
|
||||
}
|
||||
|
||||
@@ -4749,7 +4784,7 @@ typedef basic_regex<wchar_t> wregex;
|
||||
// sub_match
|
||||
|
||||
template <class _BidirectionalIterator>
|
||||
class _LIBCPP_VISIBLE sub_match
|
||||
class _LIBCPP_TYPE_VIS_ONLY sub_match
|
||||
: public pair<_BidirectionalIterator, _BidirectionalIterator>
|
||||
{
|
||||
public:
|
||||
@@ -5172,7 +5207,7 @@ operator<<(basic_ostream<_CharT, _ST>& __os, const sub_match<_BiIter>& __m)
|
||||
}
|
||||
|
||||
template <class _BidirectionalIterator, class _Allocator>
|
||||
class _LIBCPP_VISIBLE match_results
|
||||
class _LIBCPP_TYPE_VIS_ONLY match_results
|
||||
{
|
||||
public:
|
||||
typedef _Allocator allocator_type;
|
||||
@@ -5759,7 +5794,8 @@ basic_regex<_CharT, _Traits>::__search(
|
||||
{
|
||||
__m.__init(1 + mark_count(), __first, __last,
|
||||
__flags & regex_constants::__no_update_pos);
|
||||
if (__match_at_start(__first, __last, __m, __flags, true))
|
||||
if (__match_at_start(__first, __last, __m, __flags,
|
||||
!(__flags & regex_constants::__no_update_pos)))
|
||||
{
|
||||
__m.__prefix_.second = __m[0].first;
|
||||
__m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
|
||||
@@ -5796,9 +5832,25 @@ regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
|
||||
const basic_regex<_CharT, _Traits>& __e,
|
||||
regex_constants::match_flag_type __flags = regex_constants::match_default)
|
||||
{
|
||||
basic_string<_CharT> __s(__first, __last);
|
||||
int __offset = (__flags & regex_constants::match_prev_avail) ? 1 : 0;
|
||||
basic_string<_CharT> __s(_VSTD::prev(__first, __offset), __last);
|
||||
match_results<const _CharT*> __mc;
|
||||
bool __r = __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
|
||||
bool __r = __e.__search(__s.data() + __offset, __s.data() + __s.size(), __mc, __flags);
|
||||
__m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
|
||||
return __r;
|
||||
}
|
||||
|
||||
template <class _Iter, class _Allocator, class _CharT, class _Traits>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
regex_search(__wrap_iter<_Iter> __first,
|
||||
__wrap_iter<_Iter> __last,
|
||||
match_results<__wrap_iter<_Iter>, _Allocator>& __m,
|
||||
const basic_regex<_CharT, _Traits>& __e,
|
||||
regex_constants::match_flag_type __flags = regex_constants::match_default)
|
||||
{
|
||||
match_results<const _CharT*> __mc;
|
||||
bool __r = __e.__search(__first.base(), __last.base(), __mc, __flags);
|
||||
__m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
|
||||
return __r;
|
||||
}
|
||||
@@ -5958,7 +6010,7 @@ regex_match(const basic_string<_CharT, _ST, _SA>& __s,
|
||||
template <class _BidirectionalIterator,
|
||||
class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
|
||||
class _Traits = regex_traits<_CharT> >
|
||||
class _LIBCPP_VISIBLE regex_iterator
|
||||
class _LIBCPP_TYPE_VIS_ONLY regex_iterator
|
||||
{
|
||||
public:
|
||||
typedef basic_regex<_CharT, _Traits> regex_type;
|
||||
@@ -6040,7 +6092,7 @@ regex_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
|
||||
{
|
||||
__flags_ |= regex_constants::__no_update_pos;
|
||||
_BidirectionalIterator __start = __match_[0].second;
|
||||
if (__match_.length() == 0)
|
||||
if (__match_.empty())
|
||||
{
|
||||
if (__start == __end_)
|
||||
{
|
||||
@@ -6070,7 +6122,7 @@ typedef regex_iterator<wstring::const_iterator> wsregex_iterator;
|
||||
template <class _BidirectionalIterator,
|
||||
class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
|
||||
class _Traits = regex_traits<_CharT> >
|
||||
class _LIBCPP_VISIBLE regex_token_iterator
|
||||
class _LIBCPP_TYPE_VIS_ONLY regex_token_iterator
|
||||
{
|
||||
public:
|
||||
typedef basic_regex<_CharT, _Traits> regex_type;
|
||||
|
||||
@@ -365,7 +365,7 @@ struct __outermost<_Alloc, true>
|
||||
};
|
||||
|
||||
template <class _OuterAlloc, class... _InnerAllocs>
|
||||
class _LIBCPP_VISIBLE scoped_allocator_adaptor<_OuterAlloc, _InnerAllocs...>
|
||||
class _LIBCPP_TYPE_VIS_ONLY scoped_allocator_adaptor<_OuterAlloc, _InnerAllocs...>
|
||||
: public __scoped_allocator_storage<_OuterAlloc, _InnerAllocs...>
|
||||
{
|
||||
typedef __scoped_allocator_storage<_OuterAlloc, _InnerAllocs...> base;
|
||||
|
||||
168
include/set
168
include/set
@@ -66,6 +66,11 @@ public:
|
||||
set(initializer_list<value_type> il, const value_compare& comp = value_compare());
|
||||
set(initializer_list<value_type> il, const value_compare& comp,
|
||||
const allocator_type& a);
|
||||
template <class InputIterator>
|
||||
set(InputIterator first, InputIterator last, const allocator_type& a)
|
||||
: set(first, last, Compare(), a) {} // C++14
|
||||
set(initializer_list<value_type> il, const allocator_type& a)
|
||||
: set(il, Compare(), a) {} // C++14
|
||||
~set();
|
||||
|
||||
set& operator=(const set& s);
|
||||
@@ -129,13 +134,33 @@ public:
|
||||
// set operations:
|
||||
iterator find(const key_type& k);
|
||||
const_iterator find(const key_type& k) const;
|
||||
template<typename K>
|
||||
iterator find(const K& x);
|
||||
template<typename K>
|
||||
const_iterator find(const K& x) const; // C++14
|
||||
template<typename K>
|
||||
size_type count(const K& x) const; // C++14
|
||||
|
||||
size_type count(const key_type& k) const;
|
||||
iterator lower_bound(const key_type& k);
|
||||
const_iterator lower_bound(const key_type& k) const;
|
||||
template<typename K>
|
||||
iterator lower_bound(const K& x); // C++14
|
||||
template<typename K>
|
||||
const_iterator lower_bound(const K& x) const; // C++14
|
||||
|
||||
iterator upper_bound(const key_type& k);
|
||||
const_iterator upper_bound(const key_type& k) const;
|
||||
template<typename K>
|
||||
iterator upper_bound(const K& x); // C++14
|
||||
template<typename K>
|
||||
const_iterator upper_bound(const K& x) const; // C++14
|
||||
pair<iterator,iterator> equal_range(const key_type& k);
|
||||
pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
|
||||
template<typename K>
|
||||
pair<iterator,iterator> equal_range(const K& x); // C++14
|
||||
template<typename K>
|
||||
pair<const_iterator,const_iterator> equal_range(const K& x) const; // C++14
|
||||
};
|
||||
|
||||
template <class Key, class Compare, class Allocator>
|
||||
@@ -222,6 +247,11 @@ public:
|
||||
multiset(initializer_list<value_type> il, const value_compare& comp = value_compare());
|
||||
multiset(initializer_list<value_type> il, const value_compare& comp,
|
||||
const allocator_type& a);
|
||||
template <class InputIterator>
|
||||
multiset(InputIterator first, InputIterator last, const allocator_type& a)
|
||||
: set(first, last, Compare(), a) {} // C++14
|
||||
multiset(initializer_list<value_type> il, const allocator_type& a)
|
||||
: set(il, Compare(), a) {} // C++14
|
||||
~multiset();
|
||||
|
||||
multiset& operator=(const multiset& s);
|
||||
@@ -285,13 +315,32 @@ public:
|
||||
// set operations:
|
||||
iterator find(const key_type& k);
|
||||
const_iterator find(const key_type& k) const;
|
||||
template<typename K>
|
||||
iterator find(const K& x);
|
||||
template<typename K>
|
||||
const_iterator find(const K& x) const; // C++14
|
||||
|
||||
size_type count(const key_type& k) const;
|
||||
iterator lower_bound(const key_type& k);
|
||||
const_iterator lower_bound(const key_type& k) const;
|
||||
template<typename K>
|
||||
iterator lower_bound(const K& x); // C++14
|
||||
template<typename K>
|
||||
const_iterator lower_bound(const K& x) const; // C++14
|
||||
|
||||
iterator upper_bound(const key_type& k);
|
||||
const_iterator upper_bound(const key_type& k) const;
|
||||
template<typename K>
|
||||
iterator upper_bound(const K& x); // C++14
|
||||
template<typename K>
|
||||
const_iterator upper_bound(const K& x) const; // C++14
|
||||
|
||||
pair<iterator,iterator> equal_range(const key_type& k);
|
||||
pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
|
||||
template<typename K>
|
||||
pair<iterator,iterator> equal_range(const K& x); // C++14
|
||||
template<typename K>
|
||||
pair<const_iterator,const_iterator> equal_range(const K& x) const; // C++14
|
||||
};
|
||||
|
||||
template <class Key, class Compare, class Allocator>
|
||||
@@ -346,7 +395,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _Key, class _Compare = less<_Key>,
|
||||
class _Allocator = allocator<_Key> >
|
||||
class _LIBCPP_VISIBLE set
|
||||
class _LIBCPP_TYPE_VIS_ONLY set
|
||||
{
|
||||
public:
|
||||
// types:
|
||||
@@ -403,6 +452,13 @@ public:
|
||||
insert(__f, __l);
|
||||
}
|
||||
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
template <class _InputIterator>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
set(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
|
||||
: set(__f, __l, key_compare(), __a) {}
|
||||
#endif
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
set(const set& __s)
|
||||
: __tree_(__s.__tree_)
|
||||
@@ -455,6 +511,12 @@ public:
|
||||
insert(__il.begin(), __il.end());
|
||||
}
|
||||
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
set(initializer_list<value_type> __il, const allocator_type& __a)
|
||||
: set(__il, key_compare(), __a) {}
|
||||
#endif
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
set& operator=(initializer_list<value_type> __il)
|
||||
{
|
||||
@@ -579,6 +641,17 @@ public:
|
||||
iterator find(const key_type& __k) {return __tree_.find(__k);}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
template <typename _K2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
|
||||
find(const _K2& __k) {return __tree_.find(__k);}
|
||||
template <typename _K2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
|
||||
find(const _K2& __k) const {return __tree_.find(__k);}
|
||||
#endif
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
size_type count(const key_type& __k) const
|
||||
{return __tree_.__count_unique(__k);}
|
||||
@@ -588,18 +661,51 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
const_iterator lower_bound(const key_type& __k) const
|
||||
{return __tree_.lower_bound(__k);}
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
template <typename _K2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
|
||||
lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);}
|
||||
|
||||
template <typename _K2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
|
||||
lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
|
||||
#endif
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
iterator upper_bound(const key_type& __k)
|
||||
{return __tree_.upper_bound(__k);}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
const_iterator upper_bound(const key_type& __k) const
|
||||
{return __tree_.upper_bound(__k);}
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
template <typename _K2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
|
||||
upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);}
|
||||
template <typename _K2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
|
||||
upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
|
||||
#endif
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
pair<iterator,iterator> equal_range(const key_type& __k)
|
||||
{return __tree_.__equal_range_unique(__k);}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
|
||||
{return __tree_.__equal_range_unique(__k);}
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
template <typename _K2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
|
||||
equal_range(const _K2& __k) {return __tree_.__equal_range_unique(__k);}
|
||||
template <typename _K2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
|
||||
equal_range(const _K2& __k) const {return __tree_.__equal_range_unique(__k);}
|
||||
#endif
|
||||
};
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
@@ -685,7 +791,7 @@ swap(set<_Key, _Compare, _Allocator>& __x,
|
||||
|
||||
template <class _Key, class _Compare = less<_Key>,
|
||||
class _Allocator = allocator<_Key> >
|
||||
class _LIBCPP_VISIBLE multiset
|
||||
class _LIBCPP_TYPE_VIS_ONLY multiset
|
||||
{
|
||||
public:
|
||||
// types:
|
||||
@@ -734,6 +840,13 @@ public:
|
||||
insert(__f, __l);
|
||||
}
|
||||
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
template <class _InputIterator>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
multiset(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
|
||||
: multiset(__f, __l, key_compare(), __a) {}
|
||||
#endif
|
||||
|
||||
template <class _InputIterator>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
multiset(_InputIterator __f, _InputIterator __l,
|
||||
@@ -793,6 +906,12 @@ public:
|
||||
insert(__il.begin(), __il.end());
|
||||
}
|
||||
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
multiset(initializer_list<value_type> __il, const allocator_type& __a)
|
||||
: multiset(__il, key_compare(), __a) {}
|
||||
#endif
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
multiset& operator=(initializer_list<value_type> __il)
|
||||
{
|
||||
@@ -917,27 +1036,72 @@ public:
|
||||
iterator find(const key_type& __k) {return __tree_.find(__k);}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
template <typename _K2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,iterator>::type
|
||||
find(const _K2& __k) {return __tree_.find(__k);}
|
||||
template <typename _K2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,const_iterator>::type
|
||||
find(const _K2& __k) const {return __tree_.find(__k);}
|
||||
#endif
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
size_type count(const key_type& __k) const
|
||||
{return __tree_.__count_multi(__k);}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
iterator lower_bound(const key_type& __k)
|
||||
{return __tree_.lower_bound(__k);}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
const_iterator lower_bound(const key_type& __k) const
|
||||
{return __tree_.lower_bound(__k);}
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
template <typename _K2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,iterator>::type
|
||||
lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);}
|
||||
|
||||
template <typename _K2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,const_iterator>::type
|
||||
lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
|
||||
#endif
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
iterator upper_bound(const key_type& __k)
|
||||
{return __tree_.upper_bound(__k);}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
const_iterator upper_bound(const key_type& __k) const
|
||||
{return __tree_.upper_bound(__k);}
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
template <typename _K2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,iterator>::type
|
||||
upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);}
|
||||
template <typename _K2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,const_iterator>::type
|
||||
upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
|
||||
#endif
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
pair<iterator,iterator> equal_range(const key_type& __k)
|
||||
{return __tree_.__equal_range_multi(__k);}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
|
||||
{return __tree_.__equal_range_multi(__k);}
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
template <typename _K2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
|
||||
equal_range(const _K2& __k) {return __tree_.__equal_range_multi(__k);}
|
||||
template <typename _K2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
|
||||
equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
|
||||
#endif
|
||||
};
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
|
||||
419
include/shared_mutex
Normal file
419
include/shared_mutex
Normal file
@@ -0,0 +1,419 @@
|
||||
// -*- C++ -*-
|
||||
//===------------------------ shared_mutex --------------------------------===//
|
||||
//
|
||||
// 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_SHARED_MUTEX
|
||||
#define _LIBCPP_SHARED_MUTEX
|
||||
|
||||
/*
|
||||
shared_mutex synopsis
|
||||
|
||||
// C++1y
|
||||
|
||||
namespace std
|
||||
{
|
||||
|
||||
class shared_mutex
|
||||
{
|
||||
public:
|
||||
shared_mutex();
|
||||
~shared_mutex();
|
||||
|
||||
shared_mutex(const shared_mutex&) = delete;
|
||||
shared_mutex& operator=(const shared_mutex&) = delete;
|
||||
|
||||
// Exclusive ownership
|
||||
void lock(); // blocking
|
||||
bool try_lock();
|
||||
template <class Rep, class Period>
|
||||
bool try_lock_for(const chrono::duration<Rep, Period>& rel_time);
|
||||
template <class Clock, class Duration>
|
||||
bool try_lock_until(const chrono::time_point<Clock, Duration>& abs_time);
|
||||
void unlock();
|
||||
|
||||
// Shared ownership
|
||||
void lock_shared(); // blocking
|
||||
bool try_lock_shared();
|
||||
template <class Rep, class Period>
|
||||
bool
|
||||
try_lock_shared_for(const chrono::duration<Rep, Period>& rel_time);
|
||||
template <class Clock, class Duration>
|
||||
bool
|
||||
try_lock_shared_until(const chrono::time_point<Clock, Duration>& abs_time);
|
||||
void unlock_shared();
|
||||
};
|
||||
|
||||
template <class Mutex>
|
||||
class shared_lock
|
||||
{
|
||||
public:
|
||||
typedef Mutex mutex_type;
|
||||
|
||||
// Shared locking
|
||||
shared_lock() noexcept;
|
||||
explicit shared_lock(mutex_type& m); // blocking
|
||||
shared_lock(mutex_type& m, defer_lock_t) noexcept;
|
||||
shared_lock(mutex_type& m, try_to_lock_t);
|
||||
shared_lock(mutex_type& m, adopt_lock_t);
|
||||
template <class Clock, class Duration>
|
||||
shared_lock(mutex_type& m,
|
||||
const chrono::time_point<Clock, Duration>& abs_time);
|
||||
template <class Rep, class Period>
|
||||
shared_lock(mutex_type& m,
|
||||
const chrono::duration<Rep, Period>& rel_time);
|
||||
~shared_lock();
|
||||
|
||||
shared_lock(shared_lock const&) = delete;
|
||||
shared_lock& operator=(shared_lock const&) = delete;
|
||||
|
||||
shared_lock(shared_lock&& u) noexcept;
|
||||
shared_lock& operator=(shared_lock&& u) noexcept;
|
||||
|
||||
void lock(); // blocking
|
||||
bool try_lock();
|
||||
template <class Rep, class Period>
|
||||
bool try_lock_for(const chrono::duration<Rep, Period>& rel_time);
|
||||
template <class Clock, class Duration>
|
||||
bool try_lock_until(const chrono::time_point<Clock, Duration>& abs_time);
|
||||
void unlock();
|
||||
|
||||
// Setters
|
||||
void swap(shared_lock& u) noexcept;
|
||||
mutex_type* release() noexcept;
|
||||
|
||||
// Getters
|
||||
bool owns_lock() const noexcept;
|
||||
explicit operator bool () const noexcept;
|
||||
mutex_type* mutex() const noexcept;
|
||||
};
|
||||
|
||||
template <class Mutex>
|
||||
void swap(shared_lock<Mutex>& x, shared_lock<Mutex>& y) noexcept;
|
||||
|
||||
} // std
|
||||
|
||||
*/
|
||||
|
||||
#include <__config>
|
||||
|
||||
#if _LIBCPP_STD_VER > 11 || defined(_LIBCPP_BUILDING_SHARED_MUTEX)
|
||||
|
||||
#include <__mutex_base>
|
||||
|
||||
#include <__undef_min_max>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
#pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
class _LIBCPP_TYPE_VIS shared_mutex
|
||||
{
|
||||
mutex __mut_;
|
||||
condition_variable __gate1_;
|
||||
condition_variable __gate2_;
|
||||
unsigned __state_;
|
||||
|
||||
static const unsigned __write_entered_ = 1U << (sizeof(unsigned)*__CHAR_BIT__ - 1);
|
||||
static const unsigned __n_readers_ = ~__write_entered_;
|
||||
public:
|
||||
shared_mutex();
|
||||
_LIBCPP_INLINE_VISIBILITY ~shared_mutex() = default;
|
||||
|
||||
shared_mutex(const shared_mutex&) = delete;
|
||||
shared_mutex& operator=(const shared_mutex&) = delete;
|
||||
|
||||
// Exclusive ownership
|
||||
void lock();
|
||||
bool try_lock();
|
||||
template <class _Rep, class _Period>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
try_lock_for(const chrono::duration<_Rep, _Period>& __rel_time)
|
||||
{
|
||||
return try_lock_until(chrono::steady_clock::now() + __rel_time);
|
||||
}
|
||||
template <class _Clock, class _Duration>
|
||||
bool
|
||||
try_lock_until(const chrono::time_point<_Clock, _Duration>& __abs_time);
|
||||
void unlock();
|
||||
|
||||
// Shared ownership
|
||||
void lock_shared();
|
||||
bool try_lock_shared();
|
||||
template <class _Rep, class _Period>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
bool
|
||||
try_lock_shared_for(const chrono::duration<_Rep, _Period>& __rel_time)
|
||||
{
|
||||
return try_lock_shared_until(chrono::steady_clock::now() + __rel_time);
|
||||
}
|
||||
template <class _Clock, class _Duration>
|
||||
bool
|
||||
try_lock_shared_until(const chrono::time_point<_Clock, _Duration>& __abs_time);
|
||||
void unlock_shared();
|
||||
};
|
||||
|
||||
template <class _Clock, class _Duration>
|
||||
bool
|
||||
shared_mutex::try_lock_until(
|
||||
const chrono::time_point<_Clock, _Duration>& __abs_time)
|
||||
{
|
||||
unique_lock<mutex> __lk(__mut_);
|
||||
if (__state_ & __write_entered_)
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
cv_status __status = __gate1_.wait_until(__lk, __abs_time);
|
||||
if ((__state_ & __write_entered_) == 0)
|
||||
break;
|
||||
if (__status == cv_status::timeout)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
__state_ |= __write_entered_;
|
||||
if (__state_ & __n_readers_)
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
cv_status __status = __gate2_.wait_until(__lk, __abs_time);
|
||||
if ((__state_ & __n_readers_) == 0)
|
||||
break;
|
||||
if (__status == cv_status::timeout)
|
||||
{
|
||||
__state_ &= ~__write_entered_;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
template <class _Clock, class _Duration>
|
||||
bool
|
||||
shared_mutex::try_lock_shared_until(
|
||||
const chrono::time_point<_Clock, _Duration>& __abs_time)
|
||||
{
|
||||
unique_lock<mutex> __lk(__mut_);
|
||||
if ((__state_ & __write_entered_) || (__state_ & __n_readers_) == __n_readers_)
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
cv_status status = __gate1_.wait_until(__lk, __abs_time);
|
||||
if ((__state_ & __write_entered_) == 0 &&
|
||||
(__state_ & __n_readers_) < __n_readers_)
|
||||
break;
|
||||
if (status == cv_status::timeout)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
unsigned __num_readers = (__state_ & __n_readers_) + 1;
|
||||
__state_ &= ~__n_readers_;
|
||||
__state_ |= __num_readers;
|
||||
return true;
|
||||
}
|
||||
|
||||
template <class _Mutex>
|
||||
class shared_lock
|
||||
{
|
||||
public:
|
||||
typedef _Mutex mutex_type;
|
||||
|
||||
private:
|
||||
mutex_type* __m_;
|
||||
bool __owns_;
|
||||
|
||||
public:
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
shared_lock() noexcept
|
||||
: __m_(nullptr),
|
||||
__owns_(false)
|
||||
{}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit shared_lock(mutex_type& __m)
|
||||
: __m_(&__m),
|
||||
__owns_(true)
|
||||
{__m_->lock_shared();}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
shared_lock(mutex_type& __m, defer_lock_t) noexcept
|
||||
: __m_(&__m),
|
||||
__owns_(false)
|
||||
{}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
shared_lock(mutex_type& __m, try_to_lock_t)
|
||||
: __m_(&__m),
|
||||
__owns_(__m.try_lock_shared())
|
||||
{}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
shared_lock(mutex_type& __m, adopt_lock_t)
|
||||
: __m_(&__m),
|
||||
__owns_(true)
|
||||
{}
|
||||
|
||||
template <class _Clock, class _Duration>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
shared_lock(mutex_type& __m,
|
||||
const chrono::time_point<_Clock, _Duration>& __abs_time)
|
||||
: __m_(&__m),
|
||||
__owns_(__m.try_lock_shared_until(__abs_time))
|
||||
{}
|
||||
|
||||
template <class _Rep, class _Period>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
shared_lock(mutex_type& __m,
|
||||
const chrono::duration<_Rep, _Period>& __rel_time)
|
||||
: __m_(&__m),
|
||||
__owns_(__m.try_lock_shared_for(__rel_time))
|
||||
{}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
~shared_lock()
|
||||
{
|
||||
if (__owns_)
|
||||
__m_->unlock_shared();
|
||||
}
|
||||
|
||||
shared_lock(shared_lock const&) = delete;
|
||||
shared_lock& operator=(shared_lock const&) = delete;
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
shared_lock(shared_lock&& __u) noexcept
|
||||
: __m_(__u.__m_),
|
||||
__owns_(__u.__owns_)
|
||||
{
|
||||
__u.__m_ = nullptr;
|
||||
__u.__owns_ = false;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
shared_lock& operator=(shared_lock&& __u) noexcept
|
||||
{
|
||||
if (__owns_)
|
||||
__m_->unlock_shared();
|
||||
__m_ = nullptr;
|
||||
__owns_ = false;
|
||||
__m_ = __u.__m_;
|
||||
__owns_ = __u.__owns_;
|
||||
__u.__m_ = nullptr;
|
||||
__u.__owns_ = false;
|
||||
return *this;
|
||||
}
|
||||
|
||||
void lock();
|
||||
bool try_lock();
|
||||
template <class Rep, class Period>
|
||||
bool try_lock_for(const chrono::duration<Rep, Period>& rel_time);
|
||||
template <class Clock, class Duration>
|
||||
bool try_lock_until(const chrono::time_point<Clock, Duration>& abs_time);
|
||||
void unlock();
|
||||
|
||||
// Setters
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
void swap(shared_lock& __u) noexcept
|
||||
{
|
||||
_VSTD::swap(__m_, __u.__m_);
|
||||
_VSTD::swap(__owns_, __u.__owns_);
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
mutex_type* release() noexcept
|
||||
{
|
||||
mutex_type* __m = __m_;
|
||||
__m_ = nullptr;
|
||||
__owns_ = false;
|
||||
return __m;
|
||||
}
|
||||
|
||||
// Getters
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
bool owns_lock() const noexcept {return __owns_;}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit operator bool () const noexcept {return __owns_;}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
mutex_type* mutex() const noexcept {return __m_;}
|
||||
};
|
||||
|
||||
template <class _Mutex>
|
||||
void
|
||||
shared_lock<_Mutex>::lock()
|
||||
{
|
||||
if (__m_ == nullptr)
|
||||
__throw_system_error(EPERM, "shared_lock::lock: references null mutex");
|
||||
if (__owns_)
|
||||
__throw_system_error(EDEADLK, "shared_lock::lock: already locked");
|
||||
__m_->lock_shared();
|
||||
__owns_ = true;
|
||||
}
|
||||
|
||||
template <class _Mutex>
|
||||
bool
|
||||
shared_lock<_Mutex>::try_lock()
|
||||
{
|
||||
if (__m_ == nullptr)
|
||||
__throw_system_error(EPERM, "shared_lock::try_lock: references null mutex");
|
||||
if (__owns_)
|
||||
__throw_system_error(EDEADLK, "shared_lock::try_lock: already locked");
|
||||
__owns_ = __m_->try_lock_shared();
|
||||
return __owns_;
|
||||
}
|
||||
|
||||
template <class _Mutex>
|
||||
template <class _Rep, class _Period>
|
||||
bool
|
||||
shared_lock<_Mutex>::try_lock_for(const chrono::duration<_Rep, _Period>& __d)
|
||||
{
|
||||
if (__m_ == nullptr)
|
||||
__throw_system_error(EPERM, "shared_lock::try_lock_for: references null mutex");
|
||||
if (__owns_)
|
||||
__throw_system_error(EDEADLK, "shared_lock::try_lock_for: already locked");
|
||||
__owns_ = __m_->try_lock_shared_for(__d);
|
||||
return __owns_;
|
||||
}
|
||||
|
||||
template <class _Mutex>
|
||||
template <class _Clock, class _Duration>
|
||||
bool
|
||||
shared_lock<_Mutex>::try_lock_until(const chrono::time_point<_Clock, _Duration>& __t)
|
||||
{
|
||||
if (__m_ == nullptr)
|
||||
__throw_system_error(EPERM, "shared_lock::try_lock_until: references null mutex");
|
||||
if (__owns_)
|
||||
__throw_system_error(EDEADLK, "shared_lock::try_lock_until: already locked");
|
||||
__owns_ = __m_->try_lock_shared_until(__t);
|
||||
return __owns_;
|
||||
}
|
||||
|
||||
template <class _Mutex>
|
||||
void
|
||||
shared_lock<_Mutex>::unlock()
|
||||
{
|
||||
if (!__owns_)
|
||||
__throw_system_error(EPERM, "shared_lock::unlock: not locked");
|
||||
__m_->unlock_shared();
|
||||
__owns_ = false;
|
||||
}
|
||||
|
||||
template <class _Mutex>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
swap(shared_lock<_Mutex>& __x, shared_lock<_Mutex>& __y) noexcept
|
||||
{__x.swap(__y);}
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP_STD_VER > 11
|
||||
|
||||
#endif // _LIBCPP_SHARED_MUTEX
|
||||
172
include/sstream
172
include/sstream
@@ -186,7 +186,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD
|
||||
// basic_stringbuf
|
||||
|
||||
template <class _CharT, class _Traits, class _Allocator>
|
||||
class _LIBCPP_VISIBLE basic_stringbuf
|
||||
class _LIBCPP_TYPE_VIS_ONLY basic_stringbuf
|
||||
: public basic_streambuf<_CharT, _Traits>
|
||||
{
|
||||
public:
|
||||
@@ -260,17 +260,36 @@ template <class _CharT, class _Traits, class _Allocator>
|
||||
basic_stringbuf<_CharT, _Traits, _Allocator>::basic_stringbuf(basic_stringbuf&& __rhs)
|
||||
: __mode_(__rhs.__mode_)
|
||||
{
|
||||
ptrdiff_t __ninp = __rhs.gptr() - __rhs.eback();
|
||||
ptrdiff_t __einp = __rhs.egptr() - __rhs.eback();
|
||||
ptrdiff_t __nout = __rhs.pptr() - __rhs.pbase();
|
||||
ptrdiff_t __eout = __rhs.epptr() - __rhs.pbase();
|
||||
ptrdiff_t __hm = __rhs.__hm_ - __rhs.pbase();
|
||||
char_type* __p = const_cast<char_type*>(__rhs.__str_.data());
|
||||
ptrdiff_t __binp = -1;
|
||||
ptrdiff_t __ninp = -1;
|
||||
ptrdiff_t __einp = -1;
|
||||
if (__rhs.eback() != nullptr)
|
||||
{
|
||||
__binp = __rhs.eback() - __p;
|
||||
__ninp = __rhs.gptr() - __p;
|
||||
__einp = __rhs.egptr() - __p;
|
||||
}
|
||||
ptrdiff_t __bout = -1;
|
||||
ptrdiff_t __nout = -1;
|
||||
ptrdiff_t __eout = -1;
|
||||
if (__rhs.pbase() != nullptr)
|
||||
{
|
||||
__bout = __rhs.pbase() - __p;
|
||||
__nout = __rhs.pptr() - __p;
|
||||
__eout = __rhs.epptr() - __p;
|
||||
}
|
||||
ptrdiff_t __hm = __rhs.__hm_ == nullptr ? -1 : __rhs.__hm_ - __p;
|
||||
__str_ = _VSTD::move(__rhs.__str_);
|
||||
char_type* __p = const_cast<char_type*>(__str_.data());
|
||||
this->setg(__p, __p + __ninp, __p + __einp);
|
||||
this->setp(__p, __p + __eout);
|
||||
this->pbump(__nout);
|
||||
__hm_ = __p + __hm;
|
||||
__p = const_cast<char_type*>(__str_.data());
|
||||
if (__binp != -1)
|
||||
this->setg(__p + __binp, __p + __ninp, __p + __einp);
|
||||
if (__bout != -1)
|
||||
{
|
||||
this->setp(__p + __bout, __p + __eout);
|
||||
this->pbump(__nout);
|
||||
}
|
||||
__hm_ = __hm == -1 ? nullptr : __p + __hm;
|
||||
__p = const_cast<char_type*>(__rhs.__str_.data());
|
||||
__rhs.setg(__p, __p, __p);
|
||||
__rhs.setp(__p, __p);
|
||||
@@ -282,18 +301,37 @@ template <class _CharT, class _Traits, class _Allocator>
|
||||
basic_stringbuf<_CharT, _Traits, _Allocator>&
|
||||
basic_stringbuf<_CharT, _Traits, _Allocator>::operator=(basic_stringbuf&& __rhs)
|
||||
{
|
||||
ptrdiff_t __ninp = __rhs.gptr() - __rhs.eback();
|
||||
ptrdiff_t __einp = __rhs.egptr() - __rhs.eback();
|
||||
ptrdiff_t __nout = __rhs.pptr() - __rhs.pbase();
|
||||
ptrdiff_t __eout = __rhs.epptr() - __rhs.pbase();
|
||||
ptrdiff_t __hm = __rhs.__hm_ - __rhs.pbase();
|
||||
__mode_ = __rhs.__mode_;
|
||||
char_type* __p = const_cast<char_type*>(__rhs.__str_.data());
|
||||
ptrdiff_t __binp = -1;
|
||||
ptrdiff_t __ninp = -1;
|
||||
ptrdiff_t __einp = -1;
|
||||
if (__rhs.eback() != nullptr)
|
||||
{
|
||||
__binp = __rhs.eback() - __p;
|
||||
__ninp = __rhs.gptr() - __p;
|
||||
__einp = __rhs.egptr() - __p;
|
||||
}
|
||||
ptrdiff_t __bout = -1;
|
||||
ptrdiff_t __nout = -1;
|
||||
ptrdiff_t __eout = -1;
|
||||
if (__rhs.pbase() != nullptr)
|
||||
{
|
||||
__bout = __rhs.pbase() - __p;
|
||||
__nout = __rhs.pptr() - __p;
|
||||
__eout = __rhs.epptr() - __p;
|
||||
}
|
||||
ptrdiff_t __hm = __rhs.__hm_ == nullptr ? -1 : __rhs.__hm_ - __p;
|
||||
__str_ = _VSTD::move(__rhs.__str_);
|
||||
char_type* __p = const_cast<char_type*>(__str_.data());
|
||||
this->setg(__p, __p + __ninp, __p + __einp);
|
||||
this->setp(__p, __p + __eout);
|
||||
this->pbump(__nout);
|
||||
__hm_ = __p + __hm;
|
||||
__p = const_cast<char_type*>(__str_.data());
|
||||
if (__binp != -1)
|
||||
this->setg(__p + __binp, __p + __ninp, __p + __einp);
|
||||
if (__bout != -1)
|
||||
{
|
||||
this->setp(__p + __bout, __p + __eout);
|
||||
this->pbump(__nout);
|
||||
}
|
||||
__hm_ = __hm == -1 ? nullptr : __p + __hm;
|
||||
__mode_ = __rhs.__mode_;
|
||||
__p = const_cast<char_type*>(__rhs.__str_.data());
|
||||
__rhs.setg(__p, __p, __p);
|
||||
__rhs.setp(__p, __p);
|
||||
@@ -308,28 +346,74 @@ template <class _CharT, class _Traits, class _Allocator>
|
||||
void
|
||||
basic_stringbuf<_CharT, _Traits, _Allocator>::swap(basic_stringbuf& __rhs)
|
||||
{
|
||||
ptrdiff_t __rninp = __rhs.gptr() - __rhs.eback();
|
||||
ptrdiff_t __reinp = __rhs.egptr() - __rhs.eback();
|
||||
ptrdiff_t __rnout = __rhs.pptr() - __rhs.pbase();
|
||||
ptrdiff_t __reout = __rhs.epptr() - __rhs.pbase();
|
||||
ptrdiff_t __rhm = __rhs.__hm_ - __rhs.pbase();
|
||||
ptrdiff_t __lninp = this->gptr() - this->eback();
|
||||
ptrdiff_t __leinp = this->egptr() - this->eback();
|
||||
ptrdiff_t __lnout = this->pptr() - this->pbase();
|
||||
ptrdiff_t __leout = this->epptr() - this->pbase();
|
||||
ptrdiff_t __lhm = this->__hm_ - this->pbase();
|
||||
char_type* __p = const_cast<char_type*>(__rhs.__str_.data());
|
||||
ptrdiff_t __rbinp = -1;
|
||||
ptrdiff_t __rninp = -1;
|
||||
ptrdiff_t __reinp = -1;
|
||||
if (__rhs.eback() != nullptr)
|
||||
{
|
||||
__rbinp = __rhs.eback() - __p;
|
||||
__rninp = __rhs.gptr() - __p;
|
||||
__reinp = __rhs.egptr() - __p;
|
||||
}
|
||||
ptrdiff_t __rbout = -1;
|
||||
ptrdiff_t __rnout = -1;
|
||||
ptrdiff_t __reout = -1;
|
||||
if (__rhs.pbase() != nullptr)
|
||||
{
|
||||
__rbout = __rhs.pbase() - __p;
|
||||
__rnout = __rhs.pptr() - __p;
|
||||
__reout = __rhs.epptr() - __p;
|
||||
}
|
||||
ptrdiff_t __rhm = __rhs.__hm_ == nullptr ? -1 : __rhs.__hm_ - __p;
|
||||
__p = const_cast<char_type*>(__str_.data());
|
||||
ptrdiff_t __lbinp = -1;
|
||||
ptrdiff_t __lninp = -1;
|
||||
ptrdiff_t __leinp = -1;
|
||||
if (this->eback() != nullptr)
|
||||
{
|
||||
__lbinp = this->eback() - __p;
|
||||
__lninp = this->gptr() - __p;
|
||||
__leinp = this->egptr() - __p;
|
||||
}
|
||||
ptrdiff_t __lbout = -1;
|
||||
ptrdiff_t __lnout = -1;
|
||||
ptrdiff_t __leout = -1;
|
||||
if (this->pbase() != nullptr)
|
||||
{
|
||||
__lbout = this->pbase() - __p;
|
||||
__lnout = this->pptr() - __p;
|
||||
__leout = this->epptr() - __p;
|
||||
}
|
||||
ptrdiff_t __lhm = __hm_ == nullptr ? -1 : __hm_ - __p;
|
||||
_VSTD::swap(__mode_, __rhs.__mode_);
|
||||
__str_.swap(__rhs.__str_);
|
||||
char_type* __p = const_cast<char_type*>(__str_.data());
|
||||
this->setg(__p, __p + __rninp, __p + __reinp);
|
||||
this->setp(__p, __p + __reout);
|
||||
this->pbump(__rnout);
|
||||
__hm_ = __p + __rhm;
|
||||
__p = const_cast<char_type*>(__str_.data());
|
||||
if (__rbinp != -1)
|
||||
this->setg(__p + __rbinp, __p + __rninp, __p + __reinp);
|
||||
else
|
||||
this->setg(nullptr, nullptr, nullptr);
|
||||
if (__rbout != -1)
|
||||
{
|
||||
this->setp(__p + __rbout, __p + __reout);
|
||||
this->pbump(__rnout);
|
||||
}
|
||||
else
|
||||
this->setp(nullptr, nullptr);
|
||||
__hm_ = __rhm == -1 ? nullptr : __p + __rhm;
|
||||
__p = const_cast<char_type*>(__rhs.__str_.data());
|
||||
__rhs.setg(__p, __p + __lninp, __p + __leinp);
|
||||
__rhs.setp(__p, __p + __leout);
|
||||
__rhs.pbump(__lnout);
|
||||
__rhs.__hm_ = __p + __lhm;
|
||||
if (__lbinp != -1)
|
||||
__rhs.setg(__p + __lbinp, __p + __lninp, __p + __leinp);
|
||||
else
|
||||
__rhs.setg(nullptr, nullptr, nullptr);
|
||||
if (__lbout != -1)
|
||||
{
|
||||
__rhs.setp(__p + __lbout, __p + __leout);
|
||||
__rhs.pbump(__lnout);
|
||||
}
|
||||
else
|
||||
__rhs.setp(nullptr, nullptr);
|
||||
__rhs.__hm_ = __lhm == -1 ? nullptr : __p + __lhm;
|
||||
locale __tl = __rhs.getloc();
|
||||
__rhs.pubimbue(this->getloc());
|
||||
this->pubimbue(__tl);
|
||||
@@ -529,7 +613,7 @@ basic_stringbuf<_CharT, _Traits, _Allocator>::seekpos(pos_type __sp,
|
||||
// basic_istringstream
|
||||
|
||||
template <class _CharT, class _Traits, class _Allocator>
|
||||
class _LIBCPP_VISIBLE basic_istringstream
|
||||
class _LIBCPP_TYPE_VIS_ONLY basic_istringstream
|
||||
: public basic_istream<_CharT, _Traits>
|
||||
{
|
||||
public:
|
||||
@@ -648,7 +732,7 @@ basic_istringstream<_CharT, _Traits, _Allocator>::str(const string_type& __s)
|
||||
// basic_ostringstream
|
||||
|
||||
template <class _CharT, class _Traits, class _Allocator>
|
||||
class _LIBCPP_VISIBLE basic_ostringstream
|
||||
class _LIBCPP_TYPE_VIS_ONLY basic_ostringstream
|
||||
: public basic_ostream<_CharT, _Traits>
|
||||
{
|
||||
public:
|
||||
@@ -767,7 +851,7 @@ basic_ostringstream<_CharT, _Traits, _Allocator>::str(const string_type& __s)
|
||||
// basic_stringstream
|
||||
|
||||
template <class _CharT, class _Traits, class _Allocator>
|
||||
class _LIBCPP_VISIBLE basic_stringstream
|
||||
class _LIBCPP_TYPE_VIS_ONLY basic_stringstream
|
||||
: public basic_iostream<_CharT, _Traits>
|
||||
{
|
||||
public:
|
||||
|
||||
@@ -91,7 +91,7 @@ template <class T, class Container>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _Tp, class _Container> class _LIBCPP_VISIBLE stack;
|
||||
template <class _Tp, class _Container> class _LIBCPP_TYPE_VIS_ONLY stack;
|
||||
|
||||
template <class _Tp, class _Container>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
@@ -104,7 +104,7 @@ bool
|
||||
operator< (const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y);
|
||||
|
||||
template <class _Tp, class _Container = deque<_Tp> >
|
||||
class _LIBCPP_VISIBLE stack
|
||||
class _LIBCPP_TYPE_VIS_ONLY stack
|
||||
{
|
||||
public:
|
||||
typedef _Container container_type;
|
||||
@@ -282,7 +282,7 @@ swap(stack<_Tp, _Container>& __x, stack<_Tp, _Container>& __y)
|
||||
}
|
||||
|
||||
template <class _Tp, class _Container, class _Alloc>
|
||||
struct _LIBCPP_VISIBLE uses_allocator<stack<_Tp, _Container>, _Alloc>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY uses_allocator<stack<_Tp, _Container>, _Alloc>
|
||||
: public uses_allocator<_Container, _Alloc>
|
||||
{
|
||||
};
|
||||
|
||||
@@ -119,7 +119,7 @@ protected:
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _CharT, class _Traits>
|
||||
class _LIBCPP_VISIBLE basic_streambuf
|
||||
class _LIBCPP_TYPE_VIS_ONLY basic_streambuf
|
||||
{
|
||||
public:
|
||||
// types:
|
||||
@@ -553,11 +553,11 @@ basic_streambuf<_CharT, _Traits>::overflow(int_type)
|
||||
return traits_type::eof();
|
||||
}
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE(class basic_streambuf<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class basic_streambuf<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_streambuf<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_streambuf<wchar_t>)
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE(class basic_ios<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class basic_ios<wchar_t>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_ios<char>)
|
||||
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_ios<wchar_t>)
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
|
||||
1215
include/string
1215
include/string
File diff suppressed because it is too large
Load Diff
@@ -137,7 +137,7 @@ private:
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
class _LIBCPP_VISIBLE strstreambuf
|
||||
class _LIBCPP_TYPE_VIS strstreambuf
|
||||
: public streambuf
|
||||
{
|
||||
public:
|
||||
@@ -228,7 +228,7 @@ strstreambuf::operator=(strstreambuf&& __rhs)
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
|
||||
class _LIBCPP_VISIBLE istrstream
|
||||
class _LIBCPP_TYPE_VIS istrstream
|
||||
: public istream
|
||||
{
|
||||
public:
|
||||
@@ -281,7 +281,7 @@ private:
|
||||
strstreambuf __sb_;
|
||||
};
|
||||
|
||||
class _LIBCPP_VISIBLE ostrstream
|
||||
class _LIBCPP_TYPE_VIS ostrstream
|
||||
: public ostream
|
||||
{
|
||||
public:
|
||||
@@ -334,7 +334,7 @@ private:
|
||||
strstreambuf __sb_; // exposition only
|
||||
};
|
||||
|
||||
class _LIBCPP_VISIBLE strstream
|
||||
class _LIBCPP_TYPE_VIS strstream
|
||||
: public iostream
|
||||
{
|
||||
public:
|
||||
|
||||
99
include/support/ibm/limits.h
Normal file
99
include/support/ibm/limits.h
Normal file
@@ -0,0 +1,99 @@
|
||||
// -*- C++ -*-
|
||||
//===--------------------- support/ibm/limits.h ---------------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is dual licensed under the MIT and the University of Illinois Open
|
||||
// Source Licenses. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef _LIBCPP_SUPPORT_IBM_LIMITS_H
|
||||
#define _LIBCPP_SUPPORT_IBM_LIMITS_H
|
||||
|
||||
#if !defined(_AIX) // Linux
|
||||
#include <math.h> // for HUGE_VAL, HUGE_VALF, HUGE_VALL, and NAN
|
||||
|
||||
static const unsigned int _QNAN_F = 0x7fc00000;
|
||||
#define NANF (*((float *)(&_QNAN_F)))
|
||||
static const unsigned int _QNAN_LDBL128[4] = {0x7ff80000, 0x0, 0x0, 0x0};
|
||||
#define NANL (*((long double *)(&_QNAN_LDBL128)))
|
||||
static const unsigned int _SNAN_F= 0x7f855555;
|
||||
#define NANSF (*((float *)(&_SNAN_F)))
|
||||
static const unsigned int _SNAN_D[2] = {0x7ff55555, 0x55555555};
|
||||
#define NANS (*((double *)(&_SNAN_D)))
|
||||
static const unsigned int _SNAN_LDBL128[4] = {0x7ff55555, 0x55555555, 0x0, 0x0};
|
||||
#define NANSL (*((long double *)(&_SNAN_LDBL128)))
|
||||
|
||||
#define __builtin_huge_val() HUGE_VAL
|
||||
#define __builtin_huge_valf() HUGE_VALF
|
||||
#define __builtin_huge_vall() HUGE_VALL
|
||||
#define __builtin_nan(__dummy) NAN
|
||||
#define __builtin_nanf(__dummy) NANF
|
||||
#define __builtin_nanl(__dummy) NANL
|
||||
#define __builtin_nans(__dummy) NANS
|
||||
#define __builtin_nansf(__dummy) NANSF
|
||||
#define __builtin_nansl(__dummy) NANSL
|
||||
|
||||
#else
|
||||
|
||||
#include <math.h>
|
||||
#include <float.h> // limit constants
|
||||
|
||||
#define __builtin_huge_val() HUGE_VAL //0x7ff0000000000000
|
||||
#define __builtin_huge_valf() HUGE_VALF //0x7f800000
|
||||
#define __builtin_huge_vall() HUGE_VALL //0x7ff0000000000000
|
||||
#define __builtin_nan(__dummy) nan(__dummy) //0x7ff8000000000000
|
||||
#define __builtin_nanf(__dummy) nanf(__dummy) // 0x7ff80000
|
||||
#define __builtin_nanl(__dummy) nanl(__dummy) //0x7ff8000000000000
|
||||
#define __builtin_nans(__dummy) DBL_SNAN //0x7ff5555555555555
|
||||
#define __builtin_nansf(__dummy) FLT_SNAN //0x7f855555
|
||||
#define __builtin_nansl(__dummy) DBL_SNAN //0x7ff5555555555555
|
||||
|
||||
#define __FLT_MANT_DIG__ FLT_MANT_DIG
|
||||
#define __FLT_DIG__ FLT_DIG
|
||||
#define __FLT_RADIX__ FLT_RADIX
|
||||
#define __FLT_MIN_EXP__ FLT_MIN_EXP
|
||||
#define __FLT_MIN_10_EXP__ FLT_MIN_10_EXP
|
||||
#define __FLT_MAX_EXP__ FLT_MAX_EXP
|
||||
#define __FLT_MAX_10_EXP__ FLT_MAX_10_EXP
|
||||
#define __FLT_MIN__ FLT_MIN
|
||||
#define __FLT_MAX__ FLT_MAX
|
||||
#define __FLT_EPSILON__ FLT_EPSILON
|
||||
// predefined by XLC on LoP
|
||||
#define __FLT_DENORM_MIN__ 1.40129846e-45F
|
||||
|
||||
#define __DBL_MANT_DIG__ DBL_MANT_DIG
|
||||
#define __DBL_DIG__ DBL_DIG
|
||||
#define __DBL_MIN_EXP__ DBL_MIN_EXP
|
||||
#define __DBL_MIN_10_EXP__ DBL_MIN_10_EXP
|
||||
#define __DBL_MAX_EXP__ DBL_MAX_EXP
|
||||
#define __DBL_MAX_10_EXP__ DBL_MAX_10_EXP
|
||||
#define __DBL_MIN__ DBL_MIN
|
||||
#define __DBL_MAX__ DBL_MAX
|
||||
#define __DBL_EPSILON__ DBL_EPSILON
|
||||
// predefined by XLC on LoP
|
||||
#define __DBL_DENORM_MIN__ 4.9406564584124654e-324
|
||||
|
||||
#define __LDBL_MANT_DIG__ LDBL_MANT_DIG
|
||||
#define __LDBL_DIG__ LDBL_DIG
|
||||
#define __LDBL_MIN_EXP__ LDBL_MIN_EXP
|
||||
#define __LDBL_MIN_10_EXP__ LDBL_MIN_10_EXP
|
||||
#define __LDBL_MAX_EXP__ LDBL_MAX_EXP
|
||||
#define __LDBL_MAX_10_EXP__ LDBL_MAX_10_EXP
|
||||
#define __LDBL_MIN__ LDBL_MIN
|
||||
#define __LDBL_MAX__ LDBL_MAX
|
||||
#define __LDBL_EPSILON__ LDBL_EPSILON
|
||||
// predefined by XLC on LoP
|
||||
#if __LONGDOUBLE128
|
||||
#define __LDBL_DENORM_MIN__ 4.94065645841246544176568792868221e-324L
|
||||
#else
|
||||
#define __LDBL_DENORM_MIN__ 4.9406564584124654e-324L
|
||||
#endif
|
||||
|
||||
// predefined by XLC on LoP
|
||||
#define __CHAR_BIT__ 8
|
||||
|
||||
#endif // _AIX
|
||||
|
||||
#endif // _LIBCPP_SUPPORT_IBM_LIMITS_H
|
||||
54
include/support/ibm/support.h
Normal file
54
include/support/ibm/support.h
Normal file
@@ -0,0 +1,54 @@
|
||||
// -*- C++ -*-
|
||||
//===----------------------- support/ibm/support.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_SUPPORT_IBM_SUPPORT_H
|
||||
#define _LIBCPP_SUPPORT_IBM_SUPPORT_H
|
||||
|
||||
extern "builtin" int __popcnt4(unsigned int);
|
||||
extern "builtin" int __popcnt8(unsigned long long);
|
||||
extern "builtin" unsigned int __cnttz4(unsigned int);
|
||||
extern "builtin" unsigned int __cnttz8(unsigned long long);
|
||||
extern "builtin" unsigned int __cntlz4(unsigned long long);
|
||||
extern "builtin" unsigned int __cntlz8(unsigned long long);
|
||||
|
||||
// Builtin functions for counting population
|
||||
#define __builtin_popcount(x) __popcnt4(x)
|
||||
#define __builtin_popcountll(x) __popcnt8(x)
|
||||
#if defined(__64BIT__)
|
||||
#define __builtin_popcountl(x) __builtin_popcountll(x)
|
||||
#else
|
||||
#define __builtin_popcountl(x) __builtin_popcount(x)
|
||||
#endif
|
||||
|
||||
// Builtin functions for counting trailing zeros
|
||||
#define __builtin_ctz(x) __cnttz4(x)
|
||||
#define __builtin_ctzll(x) __cnttz8(x)
|
||||
#if defined(__64BIT__)
|
||||
#define __builtin_ctzl(x) __builtin_ctzll(x)
|
||||
#else
|
||||
#define __builtin_ctzl(x) __builtin_ctz(x)
|
||||
#endif
|
||||
|
||||
// Builtin functions for counting leading zeros
|
||||
#define __builtin_clz(x) __cntlz4(x)
|
||||
#define __builtin_clzll(x) __cntlz8(x)
|
||||
#if defined(__64BIT__)
|
||||
#define __builtin_clzl(x) __builtin_clzll(x)
|
||||
#else
|
||||
#define __builtin_clzl(x) __builtin_clz(x)
|
||||
#endif
|
||||
|
||||
#if defined(__64BIT__)
|
||||
#define __SIZE_WIDTH__ 64
|
||||
#else
|
||||
#define __SIZE_WIDTH__ 32
|
||||
#endif
|
||||
|
||||
#endif // _LIBCPP_SUPPORT_IBM_SUPPORT_H
|
||||
326
include/support/ibm/xlocale.h
Normal file
326
include/support/ibm/xlocale.h
Normal file
@@ -0,0 +1,326 @@
|
||||
// -*- C++ -*-
|
||||
//===--------------------- support/ibm/xlocale.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_SUPPORT_IBM_XLOCALE_H
|
||||
#define _LIBCPP_SUPPORT_IBM_XLOCALE_H
|
||||
|
||||
#if defined(_AIX)
|
||||
#include "cstdlib"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#if !defined(_AIX71)
|
||||
// AIX 7.1 and higher has these definitions. Definitions and stubs
|
||||
// are provied here as a temporary workaround on AIX 6.1.
|
||||
|
||||
#define LC_COLLATE_MASK 1
|
||||
#define LC_CTYPE_MASK 2
|
||||
#define LC_MESSAGES_MASK 4
|
||||
#define LC_MONETARY_MASK 8
|
||||
#define LC_NUMERIC_MASK 16
|
||||
#define LC_TIME_MASK 32
|
||||
#define LC_ALL_MASK (LC_COLLATE_MASK | LC_CTYPE_MASK | \
|
||||
LC_MESSAGES_MASK | LC_MONETARY_MASK |\
|
||||
LC_NUMERIC_MASK | LC_TIME_MASK)
|
||||
|
||||
typedef void* locale_t;
|
||||
|
||||
// The following are stubs. They are not supported on AIX 6.1.
|
||||
static inline
|
||||
locale_t newlocale(int category_mask, const char *locale, locale_t base)
|
||||
{
|
||||
_LC_locale_t *newloc, *loc;
|
||||
if ((loc = (_LC_locale_t *)__xopen_locale(locale)) == NULL)
|
||||
{
|
||||
errno = EINVAL;
|
||||
return (locale_t)0;
|
||||
}
|
||||
if ((newloc = (_LC_locale_t *)calloc(1, sizeof(_LC_locale_t))) == NULL)
|
||||
{
|
||||
errno = ENOMEM;
|
||||
return (locale_t)0;
|
||||
}
|
||||
if (!base)
|
||||
base = (_LC_locale_t *)__xopen_locale("C");
|
||||
memcpy(newloc, base, sizeof (_LC_locale_t));
|
||||
if (category_mask & LC_COLLATE_MASK)
|
||||
newloc->lc_collate = loc->lc_collate;
|
||||
if (category_mask & LC_CTYPE_MASK)
|
||||
newloc->lc_ctype = loc->lc_ctype;
|
||||
//if (category_mask & LC_MESSAGES_MASK)
|
||||
// newloc->lc_messages = loc->lc_messages;
|
||||
if (category_mask & LC_MONETARY_MASK)
|
||||
newloc->lc_monetary = loc->lc_monetary;
|
||||
if (category_mask & LC_TIME_MASK)
|
||||
newloc->lc_time = loc->lc_time;
|
||||
if (category_mask & LC_NUMERIC_MASK)
|
||||
newloc->lc_numeric = loc->lc_numeric;
|
||||
return (locale_t)newloc;
|
||||
}
|
||||
static inline
|
||||
void freelocale(locale_t locobj)
|
||||
{
|
||||
free(locobj);
|
||||
}
|
||||
static inline
|
||||
locale_t uselocale(locale_t newloc)
|
||||
{
|
||||
return (locale_t)0;
|
||||
}
|
||||
|
||||
static inline
|
||||
int isalnum_l(int c, locale_t locale)
|
||||
{
|
||||
return __xisalnum(locale, c);
|
||||
}
|
||||
static inline
|
||||
int isalpha_l(int c, locale_t locale)
|
||||
{
|
||||
return __xisalpha(locale, c);
|
||||
}
|
||||
static inline
|
||||
int isblank_l(int c, locale_t locale)
|
||||
{
|
||||
return __xisblank(locale, c);
|
||||
}
|
||||
static inline
|
||||
int iscntrl_l(int c, locale_t locale)
|
||||
{
|
||||
return __xiscntrl(locale, c);
|
||||
}
|
||||
static inline
|
||||
int isdigit_l(int c, locale_t locale)
|
||||
{
|
||||
return __xisdigit(locale, c);
|
||||
}
|
||||
static inline
|
||||
int isgraph_l(int c, locale_t locale)
|
||||
{
|
||||
return __xisgraph(locale, c);
|
||||
}
|
||||
static inline
|
||||
int islower_l(int c, locale_t locale)
|
||||
{
|
||||
return __xislower(locale, c);
|
||||
}
|
||||
static inline
|
||||
int isprint_l(int c, locale_t locale)
|
||||
{
|
||||
return __xisprint(locale, c);
|
||||
}
|
||||
|
||||
static inline
|
||||
int ispunct_l(int c, locale_t locale)
|
||||
{
|
||||
return __xispunct(locale, c);
|
||||
}
|
||||
static inline
|
||||
int isspace_l(int c, locale_t locale)
|
||||
{
|
||||
return __xisspace(locale, c);
|
||||
}
|
||||
static inline
|
||||
int isupper_l(int c, locale_t locale)
|
||||
{
|
||||
return __xisupper(locale, c);
|
||||
}
|
||||
|
||||
static inline
|
||||
int isxdigit_l(int c, locale_t locale)
|
||||
{
|
||||
return __xisxdigit(locale, c);
|
||||
}
|
||||
|
||||
static inline
|
||||
int iswalnum_l(wchar_t wc, locale_t locale)
|
||||
{
|
||||
return __xiswalnum(locale, wc);
|
||||
}
|
||||
|
||||
static inline
|
||||
int iswalpha_l(wchar_t wc, locale_t locale)
|
||||
{
|
||||
return __xiswalpha(locale, wc);
|
||||
}
|
||||
|
||||
static inline
|
||||
int iswblank_l(wchar_t wc, locale_t locale)
|
||||
{
|
||||
return __xiswblank(locale, wc);
|
||||
}
|
||||
|
||||
static inline
|
||||
int iswcntrl_l(wchar_t wc, locale_t locale)
|
||||
{
|
||||
return __xiswcntrl(locale, wc);
|
||||
}
|
||||
|
||||
static inline
|
||||
int iswdigit_l(wchar_t wc, locale_t locale)
|
||||
{
|
||||
return __xiswdigit(locale, wc);
|
||||
}
|
||||
|
||||
static inline
|
||||
int iswgraph_l(wchar_t wc, locale_t locale)
|
||||
{
|
||||
return __xiswgraph(locale, wc);
|
||||
}
|
||||
|
||||
static inline
|
||||
int iswlower_l(wchar_t wc, locale_t locale)
|
||||
{
|
||||
return __xiswlower(locale, wc);
|
||||
}
|
||||
|
||||
static inline
|
||||
int iswprint_l(wchar_t wc, locale_t locale)
|
||||
{
|
||||
return __xiswprint(locale, wc);
|
||||
}
|
||||
|
||||
static inline
|
||||
int iswpunct_l(wchar_t wc, locale_t locale)
|
||||
{
|
||||
return __xiswpunct(locale, wc);
|
||||
}
|
||||
|
||||
static inline
|
||||
int iswspace_l(wchar_t wc, locale_t locale)
|
||||
{
|
||||
return __xiswspace(locale, wc);
|
||||
}
|
||||
|
||||
static inline
|
||||
int iswupper_l(wchar_t wc, locale_t locale)
|
||||
{
|
||||
return __xiswupper(locale, wc);
|
||||
}
|
||||
|
||||
static inline
|
||||
int iswxdigit_l(wchar_t wc, locale_t locale)
|
||||
{
|
||||
return __xiswxdigit(locale, wc);
|
||||
}
|
||||
|
||||
static inline
|
||||
int iswctype_l(wint_t wc, wctype_t desc, locale_t locale)
|
||||
{
|
||||
return __xiswctype(locale, wc, desc);
|
||||
}
|
||||
|
||||
static inline
|
||||
int toupper_l(int c, locale_t locale)
|
||||
{
|
||||
return __xtoupper(locale, c);
|
||||
}
|
||||
static inline
|
||||
int tolower_l(int c, locale_t locale)
|
||||
{
|
||||
return __xtolower(locale, c);
|
||||
}
|
||||
static inline
|
||||
wint_t towupper_l(wint_t wc, locale_t locale)
|
||||
{
|
||||
return __xtowupper(locale, wc);
|
||||
}
|
||||
static inline
|
||||
wint_t towlower_l(wint_t wc, locale_t locale)
|
||||
{
|
||||
return __xtowlower(locale, wc);
|
||||
}
|
||||
|
||||
static inline
|
||||
int strcoll_l(const char *__s1, const char *__s2, locale_t locale)
|
||||
{
|
||||
return __xstrcoll(locale, __s1, __s2);
|
||||
}
|
||||
static inline
|
||||
int wcscoll_l(const wchar_t *__s1, const wchar_t *__s2, locale_t locale)
|
||||
{
|
||||
return __xwcscoll(locale, __s1, __s2);
|
||||
}
|
||||
static inline
|
||||
size_t strxfrm_l(char *__s1, const char *__s2, size_t __n, locale_t locale)
|
||||
{
|
||||
return __xstrxfrm(locale, __s1, __s2, __n);
|
||||
}
|
||||
|
||||
static inline
|
||||
size_t wcsxfrm_l(wchar_t *__ws1, const wchar_t *__ws2, size_t __n,
|
||||
locale_t locale)
|
||||
{
|
||||
return __xwcsxfrm(locale, __ws1, __ws2, __n);
|
||||
}
|
||||
#endif // !defined(_AIX71)
|
||||
|
||||
// strftime_l() is defined by POSIX. However, AIX 7.1 does not have it
|
||||
// implemented yet.
|
||||
static inline
|
||||
size_t strftime_l(char *__s, size_t __size, const char *__fmt,
|
||||
const struct tm *__tm, locale_t locale) {
|
||||
return __xstrftime(locale, __s, __size, __fmt, __tm);
|
||||
}
|
||||
|
||||
// The following are not POSIX routines. These are quick-and-dirty hacks
|
||||
// to make things pretend to work
|
||||
static inline
|
||||
long long strtoll_l(const char *__nptr, char **__endptr,
|
||||
int __base, locale_t locale) {
|
||||
return strtoll(__nptr, __endptr, __base);
|
||||
}
|
||||
static inline
|
||||
long strtol_l(const char *__nptr, char **__endptr,
|
||||
int __base, locale_t locale) {
|
||||
return strtol(__nptr, __endptr, __base);
|
||||
}
|
||||
static inline
|
||||
long double strtold_l(const char *__nptr, char **__endptr,
|
||||
locale_t locale) {
|
||||
return strtold(__nptr, __endptr);
|
||||
}
|
||||
static inline
|
||||
unsigned long long strtoull_l(const char *__nptr, char **__endptr,
|
||||
int __base, locale_t locale) {
|
||||
return strtoull(__nptr, __endptr, __base);
|
||||
}
|
||||
static inline
|
||||
unsigned long strtoul_l(const char *__nptr, char **__endptr,
|
||||
int __base, locale_t locale) {
|
||||
return strtoul(__nptr, __endptr, __base);
|
||||
}
|
||||
|
||||
static inline
|
||||
int vasprintf(char **strp, const char *fmt, va_list ap)
|
||||
{
|
||||
const size_t buff_size = 256;
|
||||
int str_size;
|
||||
if ((*strp = (char *)malloc(buff_size)) == NULL)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
if ((str_size = vsnprintf(*strp, buff_size, fmt, ap)) >= buff_size)
|
||||
{
|
||||
if ((*strp = (char *)realloc(*strp, str_size + 1)) == NULL)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
str_size = vsnprintf(*strp, str_size + 1, fmt, ap);
|
||||
}
|
||||
return str_size;
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif // defined(_AIX)
|
||||
#endif // _LIBCPP_SUPPORT_IBM_XLOCALE_H
|
||||
@@ -11,17 +11,16 @@
|
||||
#ifndef _LIBCPP_SUPPORT_WIN32_LIMITS_WIN32_H
|
||||
#define _LIBCPP_SUPPORT_WIN32_LIMITS_WIN32_H
|
||||
|
||||
#if !defined(_MSC_VER)
|
||||
#error "This header is MSVC specific, Clang and GCC should not include it"
|
||||
#if !defined(_LIBCPP_MSVCRT)
|
||||
#error "This header complements the Microsoft C Runtime library, and should not be included otherwise."
|
||||
#else
|
||||
|
||||
#ifndef NOMINMAX
|
||||
#define NOMINMAX
|
||||
#endif
|
||||
#include <windows.h> // ymath.h works correctly
|
||||
|
||||
#include <limits.h> // CHAR_BIT
|
||||
#include <float.h> // limit constants
|
||||
|
||||
#if ! defined(__clang__)
|
||||
#define __CHAR_BIT__ CHAR_BIT
|
||||
|
||||
#define __FLT_MANT_DIG__ FLT_MANT_DIG
|
||||
#define __FLT_DIG__ FLT_DIG
|
||||
#define __FLT_RADIX__ FLT_RADIX
|
||||
@@ -73,7 +72,8 @@
|
||||
#define __builtin_nans(__dummy) _Snan._Double
|
||||
#define __builtin_nansf(__dummy) _FSnan._Float
|
||||
#define __builtin_nansl(__dummy) _LSnan._Long_double
|
||||
#endif // ! defined(__clang__)
|
||||
|
||||
#endif // _MSC_VER
|
||||
#endif // _LIBCPP_MSVCRT
|
||||
|
||||
#endif // _LIBCPP_SUPPORT_WIN32_LIMITS_WIN32_H
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
extern "C" unsigned short __declspec(dllimport) _ctype[];
|
||||
|
||||
#include "support/win32/support.h"
|
||||
#include <stdio.h>
|
||||
#include <memory>
|
||||
#include <xlocinfo.h> // _locale_t
|
||||
#define locale_t _locale_t
|
||||
@@ -35,23 +36,23 @@ extern "C" unsigned short __declspec(dllimport) _ctype[];
|
||||
locale_t newlocale( int mask, const char * locale, locale_t base );
|
||||
locale_t uselocale( locale_t newloc );
|
||||
lconv *localeconv_l( locale_t loc );
|
||||
size_t mbrlen_l( const char *__restrict__ s, size_t n,
|
||||
mbstate_t *__restrict__ ps, locale_t loc);
|
||||
size_t mbsrtowcs_l( wchar_t *__restrict__ dst, const char **__restrict__ src,
|
||||
size_t len, mbstate_t *__restrict__ ps, locale_t loc );
|
||||
size_t wcrtomb_l( char *__restrict__ s, wchar_t wc, mbstate_t *__restrict__ ps,
|
||||
size_t mbrlen_l( const char *__restrict s, size_t n,
|
||||
mbstate_t *__restrict ps, locale_t loc);
|
||||
size_t mbsrtowcs_l( wchar_t *__restrict dst, const char **__restrict src,
|
||||
size_t len, mbstate_t *__restrict ps, locale_t loc );
|
||||
size_t wcrtomb_l( char *__restrict s, wchar_t wc, mbstate_t *__restrict ps,
|
||||
locale_t loc);
|
||||
size_t mbrtowc_l( wchar_t *__restrict__ pwc, const char *__restrict__ s,
|
||||
size_t n, mbstate_t *__restrict__ ps, locale_t loc);
|
||||
size_t mbsnrtowcs_l( wchar_t *__restrict__ dst, const char **__restrict__ src,
|
||||
size_t nms, size_t len, mbstate_t *__restrict__ ps, locale_t loc);
|
||||
size_t wcsnrtombs_l( char *__restrict__ dst, const wchar_t **__restrict__ src,
|
||||
size_t nwc, size_t len, mbstate_t *__restrict__ ps, locale_t loc);
|
||||
size_t mbrtowc_l( wchar_t *__restrict pwc, const char *__restrict s,
|
||||
size_t n, mbstate_t *__restrict ps, locale_t loc);
|
||||
size_t mbsnrtowcs_l( wchar_t *__restrict dst, const char **__restrict src,
|
||||
size_t nms, size_t len, mbstate_t *__restrict ps, locale_t loc);
|
||||
size_t wcsnrtombs_l( char *__restrict dst, const wchar_t **__restrict src,
|
||||
size_t nwc, size_t len, mbstate_t *__restrict ps, locale_t loc);
|
||||
wint_t btowc_l( int c, locale_t loc );
|
||||
int wctob_l( wint_t c, locale_t loc );
|
||||
typedef _VSTD::remove_pointer<locale_t>::type __locale_struct;
|
||||
typedef _VSTD::unique_ptr<__locale_struct, decltype(&uselocale)> __locale_raii;
|
||||
_LIBCPP_ALWAYS_INLINE inline
|
||||
inline _LIBCPP_ALWAYS_INLINE
|
||||
decltype(MB_CUR_MAX) MB_CUR_MAX_L( locale_t __l )
|
||||
{
|
||||
__locale_raii __current( uselocale(__l), uselocale );
|
||||
@@ -59,14 +60,26 @@ decltype(MB_CUR_MAX) MB_CUR_MAX_L( locale_t __l )
|
||||
}
|
||||
|
||||
// the *_l functions are prefixed on Windows, only available for msvcr80+, VS2005+
|
||||
#include <stdio.h>
|
||||
#define mbtowc_l _mbtowc_l
|
||||
#define strtoll_l _strtoi64_l
|
||||
#define strtoull_l _strtoui64_l
|
||||
// FIXME: current msvcrt does not know about long double
|
||||
#define strtold_l _strtod_l
|
||||
#define islower_l _islower_l
|
||||
#define isupper_l _isupper_l
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
int
|
||||
islower_l(int c, _locale_t loc)
|
||||
{
|
||||
return _islower_l((int)c, loc);
|
||||
}
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
int
|
||||
isupper_l(int c, _locale_t loc)
|
||||
{
|
||||
return _isupper_l((int)c, loc);
|
||||
}
|
||||
|
||||
#define isdigit_l _isdigit_l
|
||||
#define isxdigit_l _isxdigit_l
|
||||
#define strcoll_l _strcoll_l
|
||||
@@ -90,9 +103,9 @@ decltype(MB_CUR_MAX) MB_CUR_MAX_L( locale_t __l )
|
||||
#define sscanf_l( __s, __l, __f, ...) _sscanf_l( __s, __f, __l, __VA_ARGS__ )
|
||||
#define vsscanf_l( __s, __l, __f, ...) _sscanf_l( __s, __f, __l, __VA_ARGS__ )
|
||||
#define sprintf_l( __s, __l, __f, ... ) _sprintf_l( __s, __f, __l, __VA_ARGS__ )
|
||||
#define snprintf_l( __s, __n, __l, __f, ... ) _snprintf_l( __s, __n, __f, __l, __VA_ARGS__ )
|
||||
#define vsprintf_l( __s, __l, __f, ... ) _vsprintf_l( __s, __f, __l, __VA_ARGS__ )
|
||||
#define vsnprintf_l( __s, __n, __l, __f, ... ) _vsnprintf_l( __s, __n, __f, __l, __VA_ARGS__ )
|
||||
int snprintf_l(char *ret, size_t n, locale_t loc, const char *format, ...);
|
||||
int asprintf_l( char **ret, locale_t loc, const char *format, ... );
|
||||
int vasprintf_l( char **ret, locale_t loc, const char *format, va_list ap );
|
||||
|
||||
@@ -107,10 +120,10 @@ inline int iswblank_l( wint_t c, locale_t /*loc*/ )
|
||||
return ( c == L' ' || c == L'\t' );
|
||||
}
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#if defined(_LIBCPP_MSVCRT)
|
||||
inline int isblank( int c, locale_t /*loc*/ )
|
||||
{ return ( c == ' ' || c == '\t' ); }
|
||||
inline int iswblank( wint_t c, locale_t /*loc*/ )
|
||||
{ return ( c == L' ' || c == L'\t' ); }
|
||||
#endif // _MSC_VER
|
||||
#endif // _LIBCPP_MSVCRT
|
||||
#endif // _LIBCPP_SUPPORT_WIN32_LOCALE_WIN32_H
|
||||
|
||||
@@ -11,12 +11,14 @@
|
||||
#ifndef _LIBCPP_SUPPORT_WIN32_MATH_WIN32_H
|
||||
#define _LIBCPP_SUPPORT_WIN32_MATH_WIN32_H
|
||||
|
||||
#if !defined(_MSC_VER)
|
||||
#error "This header is MSVC specific, Clang and GCC should not include it"
|
||||
#if !defined(_LIBCPP_MSVCRT)
|
||||
#error "This header complements Microsoft's C Runtime library, and should not be included otherwise."
|
||||
#else
|
||||
|
||||
#include <math.h>
|
||||
#include <float.h> // _FPCLASS_PN etc.
|
||||
|
||||
// Necessary?
|
||||
typedef float float_t;
|
||||
typedef double double_t;
|
||||
|
||||
@@ -108,6 +110,6 @@ _LIBCPP_ALWAYS_INLINE int fpclassify( double num )
|
||||
return _fpclass(num);
|
||||
}
|
||||
|
||||
#endif // _MSC_VER
|
||||
#endif // _LIBCPP_MSVCRT
|
||||
|
||||
#endif // _LIBCPP_SUPPORT_WIN32_MATH_WIN32_H
|
||||
|
||||
@@ -15,26 +15,27 @@
|
||||
Functions and constants used in libc++ that are missing from the Windows C library.
|
||||
*/
|
||||
|
||||
#include <__config>
|
||||
#include <wchar.h> // mbstate_t
|
||||
#include <stdio.h> // _snwprintf
|
||||
#include <cstdarg> // va_ macros
|
||||
#define swprintf _snwprintf
|
||||
#define vswprintf _vsnwprintf
|
||||
#define vfscnaf fscanf
|
||||
|
||||
int vasprintf( char **sptr, const char *__restrict fmt , va_list ap );
|
||||
#ifndef NOMINMAX
|
||||
#define NOMINMAX
|
||||
#endif
|
||||
|
||||
extern "C" {
|
||||
|
||||
int vasprintf( char **sptr, const char *__restrict fmt, va_list ap );
|
||||
int asprintf( char **sptr, const char *__restrict fmt, ...);
|
||||
//int vfscanf( FILE *__restrict stream, const char *__restrict format,
|
||||
// va_list arg);
|
||||
|
||||
size_t mbsnrtowcs( wchar_t *__restrict dst, const char **__restrict src,
|
||||
size_t nmc, size_t len, mbstate_t *__restrict ps );
|
||||
size_t wcsnrtombs( char *__restrict dst, const wchar_t **__restrict src,
|
||||
size_t nwc, size_t len, mbstate_t *__restrict ps );
|
||||
}
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#if defined(_LIBCPP_MSVCRT)
|
||||
#define snprintf _snprintf
|
||||
|
||||
#include <xlocinfo.h>
|
||||
#define atoll _atoi64
|
||||
#define strtoll _strtoi64
|
||||
@@ -85,9 +86,11 @@ _LIBCPP_ALWAYS_INLINE int __builtin_ctz( unsigned int x )
|
||||
_BitScanReverse(&r, x);
|
||||
return static_cast<int>(r);
|
||||
}
|
||||
|
||||
// sizeof(long) == sizeof(int) on Windows
|
||||
_LIBCPP_ALWAYS_INLINE int __builtin_ctzl( unsigned long x )
|
||||
{ return __builtin_ctz( static_cast<int>(x) ); }
|
||||
|
||||
_LIBCPP_ALWAYS_INLINE int __builtin_ctzll( unsigned long long x )
|
||||
{
|
||||
DWORD r = 0;
|
||||
@@ -110,6 +113,6 @@ _LIBCPP_ALWAYS_INLINE int __builtin_clzll( unsigned long long x )
|
||||
return static_cast<int>(r);
|
||||
}
|
||||
#endif // !__clang__
|
||||
#endif // _MSC_VER
|
||||
#endif // _LIBCPP_MSVCRT
|
||||
|
||||
#endif // _LIBCPP_SUPPORT_WIN32_SUPPORT_H
|
||||
|
||||
@@ -22,6 +22,7 @@ class error_category
|
||||
public:
|
||||
virtual ~error_category() noexcept;
|
||||
|
||||
constexpr error_category();
|
||||
error_category(const error_category&) = delete;
|
||||
error_category& operator=(const error_category&) = delete;
|
||||
|
||||
@@ -232,13 +233,13 @@ _LIBCPP_BEGIN_NAMESPACE_STD
|
||||
// is_error_code_enum
|
||||
|
||||
template <class _Tp>
|
||||
struct _LIBCPP_VISIBLE is_error_code_enum
|
||||
struct _LIBCPP_TYPE_VIS_ONLY is_error_code_enum
|
||||
: public false_type {};
|
||||
|
||||
// is_error_condition_enum
|
||||
|
||||
template <class _Tp>
|
||||
struct _LIBCPP_VISIBLE is_error_condition_enum
|
||||
struct _LIBCPP_TYPE_VIS_ONLY is_error_condition_enum
|
||||
: public false_type {};
|
||||
|
||||
// Some error codes are not present on all platforms, so we provide equivalents
|
||||
@@ -345,28 +346,33 @@ _LIBCPP_DECLARE_STRONG_ENUM(errc)
|
||||
_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(errc)
|
||||
|
||||
template <>
|
||||
struct _LIBCPP_VISIBLE is_error_condition_enum<errc>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY is_error_condition_enum<errc>
|
||||
: true_type { };
|
||||
|
||||
#ifdef _LIBCPP_HAS_NO_STRONG_ENUMS
|
||||
template <>
|
||||
struct _LIBCPP_VISIBLE is_error_condition_enum<errc::__lx>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY is_error_condition_enum<errc::__lx>
|
||||
: true_type { };
|
||||
#endif
|
||||
|
||||
class _LIBCPP_VISIBLE error_condition;
|
||||
class _LIBCPP_VISIBLE error_code;
|
||||
class _LIBCPP_TYPE_VIS error_condition;
|
||||
class _LIBCPP_TYPE_VIS error_code;
|
||||
|
||||
// class error_category
|
||||
|
||||
class _LIBCPP_HIDDEN __do_message;
|
||||
|
||||
class _LIBCPP_VISIBLE error_category
|
||||
class _LIBCPP_TYPE_VIS error_category
|
||||
{
|
||||
public:
|
||||
virtual ~error_category() _NOEXCEPT;
|
||||
|
||||
#ifdef _LIBCPP_BUILDING_SYSTEM_ERROR
|
||||
error_category() _NOEXCEPT;
|
||||
#else
|
||||
_LIBCPP_ALWAYS_INLINE
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11 error_category() _NOEXCEPT _LIBCPP_DEFAULT;
|
||||
#endif
|
||||
private:
|
||||
error_category(const error_category&);// = delete;
|
||||
error_category& operator=(const error_category&);// = delete;
|
||||
@@ -397,10 +403,10 @@ public:
|
||||
virtual string message(int ev) const;
|
||||
};
|
||||
|
||||
const error_category& generic_category() _NOEXCEPT;
|
||||
const error_category& system_category() _NOEXCEPT;
|
||||
_LIBCPP_FUNC_VIS const error_category& generic_category() _NOEXCEPT;
|
||||
_LIBCPP_FUNC_VIS const error_category& system_category() _NOEXCEPT;
|
||||
|
||||
class _LIBCPP_VISIBLE error_condition
|
||||
class _LIBCPP_TYPE_VIS error_condition
|
||||
{
|
||||
int __val_;
|
||||
const error_category* __cat_;
|
||||
@@ -472,7 +478,7 @@ operator<(const error_condition& __x, const error_condition& __y) _NOEXCEPT
|
||||
|
||||
// error_code
|
||||
|
||||
class _LIBCPP_VISIBLE error_code
|
||||
class _LIBCPP_TYPE_VIS error_code
|
||||
{
|
||||
int __val_;
|
||||
const error_category* __cat_;
|
||||
@@ -597,7 +603,7 @@ operator!=(const error_condition& __x, const error_condition& __y) _NOEXCEPT
|
||||
{return !(__x == __y);}
|
||||
|
||||
template <>
|
||||
struct _LIBCPP_VISIBLE hash<error_code>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY hash<error_code>
|
||||
: public unary_function<error_code, size_t>
|
||||
{
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
@@ -609,7 +615,7 @@ struct _LIBCPP_VISIBLE hash<error_code>
|
||||
|
||||
// system_error
|
||||
|
||||
class _LIBCPP_VISIBLE system_error
|
||||
class _LIBCPP_TYPE_VIS system_error
|
||||
: public runtime_error
|
||||
{
|
||||
error_code __ec_;
|
||||
@@ -629,7 +635,7 @@ private:
|
||||
static string __init(const error_code&, string);
|
||||
};
|
||||
|
||||
void __throw_system_error(int ev, const char* what_arg);
|
||||
_LIBCPP_FUNC_VIS void __throw_system_error(int ev, const char* what_arg);
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
|
||||
@@ -144,9 +144,11 @@ template <class _Tp>
|
||||
__thread_specific_ptr<_Tp>::__thread_specific_ptr()
|
||||
{
|
||||
int __ec = pthread_key_create(&__key_, &__thread_specific_ptr::__at_thread_exit);
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
if (__ec)
|
||||
throw system_error(error_code(__ec, system_category()),
|
||||
"__thread_specific_ptr construction failed");
|
||||
#endif
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
@@ -173,8 +175,8 @@ __thread_specific_ptr<_Tp>::reset(pointer __p)
|
||||
delete __p_old;
|
||||
}
|
||||
|
||||
class _LIBCPP_VISIBLE thread;
|
||||
class _LIBCPP_VISIBLE __thread_id;
|
||||
class _LIBCPP_TYPE_VIS thread;
|
||||
class _LIBCPP_TYPE_VIS __thread_id;
|
||||
|
||||
namespace this_thread
|
||||
{
|
||||
@@ -183,10 +185,9 @@ _LIBCPP_INLINE_VISIBILITY __thread_id get_id() _NOEXCEPT;
|
||||
|
||||
} // this_thread
|
||||
|
||||
class _LIBCPP_VISIBLE __thread_id;
|
||||
template<> struct _LIBCPP_VISIBLE hash<__thread_id>;
|
||||
template<> struct _LIBCPP_TYPE_VIS_ONLY hash<__thread_id>;
|
||||
|
||||
class _LIBCPP_VISIBLE __thread_id
|
||||
class _LIBCPP_TYPE_VIS_ONLY __thread_id
|
||||
{
|
||||
// FIXME: pthread_t is a pointer on Darwin but a long on Linux.
|
||||
// NULL is the no-thread value on Darwin. Someone needs to check
|
||||
@@ -228,12 +229,12 @@ private:
|
||||
__thread_id(pthread_t __id) : __id_(__id) {}
|
||||
|
||||
friend __thread_id this_thread::get_id() _NOEXCEPT;
|
||||
friend class _LIBCPP_VISIBLE thread;
|
||||
friend struct _LIBCPP_VISIBLE hash<__thread_id>;
|
||||
friend class _LIBCPP_TYPE_VIS thread;
|
||||
friend struct _LIBCPP_TYPE_VIS_ONLY hash<__thread_id>;
|
||||
};
|
||||
|
||||
template<>
|
||||
struct _LIBCPP_VISIBLE hash<__thread_id>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY hash<__thread_id>
|
||||
: public unary_function<__thread_id, size_t>
|
||||
{
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
@@ -255,7 +256,7 @@ get_id() _NOEXCEPT
|
||||
|
||||
} // this_thread
|
||||
|
||||
class _LIBCPP_VISIBLE thread
|
||||
class _LIBCPP_TYPE_VIS thread
|
||||
{
|
||||
pthread_t __t_;
|
||||
|
||||
@@ -305,7 +306,7 @@ class __assoc_sub_state;
|
||||
|
||||
class _LIBCPP_HIDDEN __thread_struct_imp;
|
||||
|
||||
class __thread_struct
|
||||
class _LIBCPP_TYPE_VIS __thread_struct
|
||||
{
|
||||
__thread_struct_imp* __p_;
|
||||
|
||||
@@ -319,14 +320,14 @@ public:
|
||||
void __make_ready_at_thread_exit(__assoc_sub_state*);
|
||||
};
|
||||
|
||||
__thread_specific_ptr<__thread_struct>& __thread_local_data();
|
||||
_LIBCPP_FUNC_VIS __thread_specific_ptr<__thread_struct>& __thread_local_data();
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
||||
|
||||
template <class _Fp, class ..._Args, size_t ..._Indices>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void
|
||||
__threaad_execute(tuple<_Fp, _Args...>& __t, __tuple_indices<_Indices...>)
|
||||
__thread_execute(tuple<_Fp, _Args...>& __t, __tuple_indices<_Indices...>)
|
||||
{
|
||||
__invoke(_VSTD::move(_VSTD::get<0>(__t)), _VSTD::move(_VSTD::get<_Indices>(__t))...);
|
||||
}
|
||||
@@ -338,7 +339,7 @@ __thread_proxy(void* __vp)
|
||||
__thread_local_data().reset(new __thread_struct);
|
||||
std::unique_ptr<_Fp> __p(static_cast<_Fp*>(__vp));
|
||||
typedef typename __make_tuple_indices<tuple_size<_Fp>::value, 1>::type _Index;
|
||||
__threaad_execute(*__p, _Index());
|
||||
__thread_execute(*__p, _Index());
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@@ -403,7 +404,7 @@ void swap(thread& __x, thread& __y) _NOEXCEPT {__x.swap(__y);}
|
||||
namespace this_thread
|
||||
{
|
||||
|
||||
void sleep_for(const chrono::nanoseconds& ns);
|
||||
_LIBCPP_FUNC_VIS void sleep_for(const chrono::nanoseconds& ns);
|
||||
|
||||
template <class _Rep, class _Period>
|
||||
void
|
||||
|
||||
294
include/tuple
294
include/tuple
@@ -21,19 +21,19 @@ template <class... T>
|
||||
class tuple {
|
||||
public:
|
||||
constexpr tuple();
|
||||
explicit tuple(const T&...);
|
||||
explicit tuple(const T&...); // constexpr in C++14
|
||||
template <class... U>
|
||||
explicit tuple(U&&...);
|
||||
explicit tuple(U&&...); // constexpr in C++14
|
||||
tuple(const tuple&) = default;
|
||||
tuple(tuple&&) = default;
|
||||
template <class... U>
|
||||
tuple(const tuple<U...>&);
|
||||
tuple(const tuple<U...>&); // constexpr in C++14
|
||||
template <class... U>
|
||||
tuple(tuple<U...>&&);
|
||||
tuple(tuple<U...>&&); // constexpr in C++14
|
||||
template <class U1, class U2>
|
||||
tuple(const pair<U1, U2>&); // iff sizeof...(T) == 2
|
||||
tuple(const pair<U1, U2>&); // iff sizeof...(T) == 2 // constexpr in C++14
|
||||
template <class U1, class U2>
|
||||
tuple(pair<U1, U2>&&); // iff sizeof...(T) == 2
|
||||
tuple(pair<U1, U2>&&); // iff sizeof...(T) == 2 // constexpr in C++14
|
||||
|
||||
// allocator-extended constructors
|
||||
template <class Alloc>
|
||||
@@ -72,10 +72,10 @@ public:
|
||||
|
||||
const unspecified ignore;
|
||||
|
||||
template <class... T> tuple<V...> make_tuple(T&&...);
|
||||
template <class... T> tuple<ATypes...> forward_as_tuple(T&&...) noexcept;
|
||||
template <class... T> tuple<V...> make_tuple(T&&...); // constexpr in C++14
|
||||
template <class... T> tuple<ATypes...> forward_as_tuple(T&&...) noexcept; // constexpr in C++14
|
||||
template <class... T> tuple<T&...> tie(T&...) noexcept;
|
||||
template <class... Tuples> tuple<CTypes...> tuple_cat(Tuples&&... tpls);
|
||||
template <class... Tuples> tuple<CTypes...> tuple_cat(Tuples&&... tpls); // constexpr in C++14
|
||||
|
||||
// 20.4.1.4, tuple helper classes:
|
||||
template <class T> class tuple_size; // undefined
|
||||
@@ -86,21 +86,28 @@ template <intsize_t I, class... T> class tuple_element<I, tuple<T...>>;
|
||||
// 20.4.1.5, element access:
|
||||
template <intsize_t I, class... T>
|
||||
typename tuple_element<I, tuple<T...>>::type&
|
||||
get(tuple<T...>&) noexcept;
|
||||
get(tuple<T...>&) noexcept; // constexpr in C++14
|
||||
template <intsize_t I, class... T>
|
||||
typename tuple_element<I, tuple<T...>>::type const&
|
||||
get(const tuple<T...>&) noexcept;
|
||||
get(const tuple<T...>&) noexcept; // constexpr in C++14
|
||||
template <intsize_t I, class... T>
|
||||
typename tuple_element<I, tuple<T...>>::type&&
|
||||
get(tuple<T...>&&) noexcept;
|
||||
get(tuple<T...>&&) noexcept; // constexpr in C++14
|
||||
|
||||
template <class T1, class... T>
|
||||
constexpr T1& get(tuple<T...>&) noexcept; // C++14
|
||||
template <class T1, class... T>
|
||||
constexpr T1 const& get(const tuple<T...>&) noexcept; // C++14
|
||||
template <class T1, class... T>
|
||||
constexpr T1&& get(tuple<T...>&&) noexcept; // C++14
|
||||
|
||||
// 20.4.1.6, relational operators:
|
||||
template<class... T, class... U> bool operator==(const tuple<T...>&, const tuple<U...>&);
|
||||
template<class... T, class... U> bool operator<(const tuple<T...>&, const tuple<U...>&);
|
||||
template<class... T, class... U> bool operator!=(const tuple<T...>&, const tuple<U...>&);
|
||||
template<class... T, class... U> bool operator>(const tuple<T...>&, const tuple<U...>&);
|
||||
template<class... T, class... U> bool operator<=(const tuple<T...>&, const tuple<U...>&);
|
||||
template<class... T, class... U> bool operator>=(const tuple<T...>&, const tuple<U...>&);
|
||||
template<class... T, class... U> bool operator==(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14
|
||||
template<class... T, class... U> bool operator<(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14
|
||||
template<class... T, class... U> bool operator!=(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14
|
||||
template<class... T, class... U> bool operator>(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14
|
||||
template<class... T, class... U> bool operator<=(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14
|
||||
template<class... T, class... U> bool operator>=(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14
|
||||
|
||||
template <class... Types, class Alloc>
|
||||
struct uses_allocator<tuple<Types...>, Alloc>;
|
||||
@@ -126,74 +133,12 @@ template <class... Types>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
// allocator_arg_t
|
||||
|
||||
struct _LIBCPP_VISIBLE allocator_arg_t { };
|
||||
|
||||
#if defined(_LIBCPP_HAS_NO_CONSTEXPR) || defined(_LIBCPP_BUILDING_MEMORY)
|
||||
extern const allocator_arg_t allocator_arg;
|
||||
#else
|
||||
constexpr allocator_arg_t allocator_arg = allocator_arg_t();
|
||||
#endif
|
||||
|
||||
// uses_allocator
|
||||
|
||||
template <class _Tp>
|
||||
struct __has_allocator_type
|
||||
{
|
||||
private:
|
||||
struct __two {char __lx; char __lxx;};
|
||||
template <class _Up> static __two __test(...);
|
||||
template <class _Up> static char __test(typename _Up::allocator_type* = 0);
|
||||
public:
|
||||
static const bool value = sizeof(__test<_Tp>(0)) == 1;
|
||||
};
|
||||
|
||||
template <class _Tp, class _Alloc, bool = __has_allocator_type<_Tp>::value>
|
||||
struct __uses_allocator
|
||||
: public integral_constant<bool,
|
||||
is_convertible<_Alloc, typename _Tp::allocator_type>::value>
|
||||
{
|
||||
};
|
||||
|
||||
template <class _Tp, class _Alloc>
|
||||
struct __uses_allocator<_Tp, _Alloc, false>
|
||||
: public false_type
|
||||
{
|
||||
};
|
||||
|
||||
template <class _Tp, class _Alloc>
|
||||
struct _LIBCPP_VISIBLE uses_allocator
|
||||
: public __uses_allocator<_Tp, _Alloc>
|
||||
{
|
||||
};
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
||||
|
||||
// uses-allocator construction
|
||||
|
||||
template <class _Tp, class _Alloc, class ..._Args>
|
||||
struct __uses_alloc_ctor_imp
|
||||
{
|
||||
static const bool __ua = uses_allocator<_Tp, _Alloc>::value;
|
||||
static const bool __ic =
|
||||
is_constructible<_Tp, allocator_arg_t, _Alloc, _Args...>::value;
|
||||
static const int value = __ua ? 2 - __ic : 0;
|
||||
};
|
||||
|
||||
template <class _Tp, class _Alloc, class ..._Args>
|
||||
struct __uses_alloc_ctor
|
||||
: integral_constant<int, __uses_alloc_ctor_imp<_Tp, _Alloc, _Args...>::value>
|
||||
{};
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_VARIADICS
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_VARIADICS
|
||||
|
||||
// tuple_size
|
||||
|
||||
template <class ..._Tp>
|
||||
class _LIBCPP_VISIBLE tuple_size<tuple<_Tp...> >
|
||||
class _LIBCPP_TYPE_VIS_ONLY tuple_size<tuple<_Tp...> >
|
||||
: public integral_constant<size_t, sizeof...(_Tp)>
|
||||
{
|
||||
};
|
||||
@@ -201,7 +146,7 @@ class _LIBCPP_VISIBLE tuple_size<tuple<_Tp...> >
|
||||
// tuple_element
|
||||
|
||||
template <size_t _Ip, class ..._Tp>
|
||||
class _LIBCPP_VISIBLE tuple_element<_Ip, tuple<_Tp...> >
|
||||
class _LIBCPP_TYPE_VIS_ONLY tuple_element<_Ip, tuple<_Tp...> >
|
||||
{
|
||||
public:
|
||||
typedef typename tuple_element<_Ip, __tuple_types<_Tp...> >::type type;
|
||||
@@ -259,7 +204,7 @@ public:
|
||||
|
||||
template <class _Tp,
|
||||
class = typename enable_if<is_constructible<_Hp, _Tp>::value>::type>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
explicit __tuple_leaf(_Tp&& __t) _NOEXCEPT_((is_nothrow_constructible<_Hp, _Tp>::value))
|
||||
: value(_VSTD::forward<_Tp>(__t))
|
||||
{static_assert(!is_reference<_Hp>::value ||
|
||||
@@ -316,15 +261,17 @@ public:
|
||||
>::value)),
|
||||
"Attempted to construct a reference element in a tuple with an rvalue");}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
__tuple_leaf(const __tuple_leaf& __t) _NOEXCEPT_(is_nothrow_copy_constructible<_Hp>::value)
|
||||
: value(__t.get())
|
||||
{static_assert(!is_rvalue_reference<_Hp>::value, "Can not copy a tuple with rvalue reference member");}
|
||||
|
||||
template <class _Tp>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit __tuple_leaf(const __tuple_leaf<_Ip, _Tp>& __t)
|
||||
_NOEXCEPT_((is_nothrow_constructible<_Hp, const _Tp&>::value))
|
||||
: value(__t.get()) {}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
__tuple_leaf(__tuple_leaf&& __t) _NOEXCEPT_(is_nothrow_move_constructible<_Hp>::value)
|
||||
: value(_VSTD::forward<_Hp>(__t.get()))
|
||||
{}
|
||||
|
||||
template <class _Tp>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
@@ -342,8 +289,8 @@ public:
|
||||
return 0;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _Hp& get() _NOEXCEPT {return value;}
|
||||
_LIBCPP_INLINE_VISIBILITY const _Hp& get() const _NOEXCEPT {return value;}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 _Hp& get() _NOEXCEPT {return value;}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const _Hp& get() const _NOEXCEPT {return value;}
|
||||
};
|
||||
|
||||
template <size_t _Ip, class _Hp>
|
||||
@@ -372,7 +319,7 @@ public:
|
||||
|
||||
template <class _Tp,
|
||||
class = typename enable_if<is_constructible<_Hp, _Tp>::value>::type>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
explicit __tuple_leaf(_Tp&& __t) _NOEXCEPT_((is_nothrow_constructible<_Hp, _Tp>::value))
|
||||
: _Hp(_VSTD::forward<_Tp>(__t)) {}
|
||||
|
||||
@@ -391,12 +338,6 @@ public:
|
||||
explicit __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a, _Tp&& __t)
|
||||
: _Hp(_VSTD::forward<_Tp>(__t), __a) {}
|
||||
|
||||
template <class _Tp>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
explicit __tuple_leaf(const __tuple_leaf<_Ip, _Tp>& __t)
|
||||
_NOEXCEPT_((is_nothrow_constructible<_Hp, const _Tp&>::value))
|
||||
: _Hp(__t.get()) {}
|
||||
|
||||
template <class _Tp>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__tuple_leaf&
|
||||
@@ -414,8 +355,8 @@ public:
|
||||
return 0;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _Hp& get() _NOEXCEPT {return static_cast<_Hp&>(*this);}
|
||||
_LIBCPP_INLINE_VISIBILITY const _Hp& get() const _NOEXCEPT {return static_cast<const _Hp&>(*this);}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 _Hp& get() _NOEXCEPT {return static_cast<_Hp&>(*this);}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const _Hp& get() const _NOEXCEPT {return static_cast<const _Hp&>(*this);}
|
||||
};
|
||||
|
||||
template <class ..._Tp>
|
||||
@@ -450,7 +391,7 @@ struct __tuple_impl<__tuple_indices<_Indx...>, _Tp...>
|
||||
|
||||
template <size_t ..._Uf, class ..._Tf,
|
||||
size_t ..._Ul, class ..._Tl, class ..._Up>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
explicit
|
||||
__tuple_impl(__tuple_indices<_Uf...>, __tuple_types<_Tf...>,
|
||||
__tuple_indices<_Ul...>, __tuple_types<_Tl...>,
|
||||
@@ -477,10 +418,10 @@ struct __tuple_impl<__tuple_indices<_Indx...>, _Tp...>
|
||||
template <class _Tuple,
|
||||
class = typename enable_if
|
||||
<
|
||||
__tuple_convertible<_Tuple, tuple<_Tp...> >::value
|
||||
__tuple_constructible<_Tuple, tuple<_Tp...> >::value
|
||||
>::type
|
||||
>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
__tuple_impl(_Tuple&& __t) _NOEXCEPT_((__all<is_nothrow_constructible<_Tp, typename tuple_element<_Indx,
|
||||
typename __make_tuple_types<_Tuple>::type>::type>::value...>::value))
|
||||
: __tuple_leaf<_Indx, _Tp>(_VSTD::forward<typename tuple_element<_Indx,
|
||||
@@ -516,13 +457,24 @@ struct __tuple_impl<__tuple_indices<_Indx...>, _Tp...>
|
||||
return *this;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__tuple_impl&
|
||||
operator=(const __tuple_impl& __t) _NOEXCEPT_((__all<is_nothrow_copy_assignable<_Tp>::value...>::value))
|
||||
{
|
||||
__swallow(__tuple_leaf<_Indx, _Tp>::operator=(static_cast<const __tuple_leaf<_Indx, _Tp>&>(__t).get())...);
|
||||
return *this;
|
||||
}
|
||||
__tuple_impl(const __tuple_impl&) = default;
|
||||
__tuple_impl(__tuple_impl&&) = default;
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__tuple_impl&
|
||||
operator=(const __tuple_impl& __t) _NOEXCEPT_((__all<is_nothrow_copy_assignable<_Tp>::value...>::value))
|
||||
{
|
||||
__swallow(__tuple_leaf<_Indx, _Tp>::operator=(static_cast<const __tuple_leaf<_Indx, _Tp>&>(__t).get())...);
|
||||
return *this;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
__tuple_impl&
|
||||
operator=(__tuple_impl&& __t) _NOEXCEPT_((__all<is_nothrow_move_assignable<_Tp>::value...>::value))
|
||||
{
|
||||
__swallow(__tuple_leaf<_Indx, _Tp>::operator=(_VSTD::forward<_Tp>(static_cast<__tuple_leaf<_Indx, _Tp>&>(__t).get()))...);
|
||||
return *this;
|
||||
}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
void swap(__tuple_impl& __t)
|
||||
@@ -533,17 +485,17 @@ struct __tuple_impl<__tuple_indices<_Indx...>, _Tp...>
|
||||
};
|
||||
|
||||
template <class ..._Tp>
|
||||
class _LIBCPP_VISIBLE tuple
|
||||
class _LIBCPP_TYPE_VIS_ONLY tuple
|
||||
{
|
||||
typedef __tuple_impl<typename __make_tuple_indices<sizeof...(_Tp)>::type, _Tp...> base;
|
||||
|
||||
base base_;
|
||||
|
||||
template <size_t _Jp, class ..._Up> friend
|
||||
template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
typename tuple_element<_Jp, tuple<_Up...> >::type& get(tuple<_Up...>&) _NOEXCEPT;
|
||||
template <size_t _Jp, class ..._Up> friend
|
||||
template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
const typename tuple_element<_Jp, tuple<_Up...> >::type& get(const tuple<_Up...>&) _NOEXCEPT;
|
||||
template <size_t _Jp, class ..._Up> friend
|
||||
template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
typename tuple_element<_Jp, tuple<_Up...> >::type&& get(tuple<_Up...>&&) _NOEXCEPT;
|
||||
public:
|
||||
|
||||
@@ -551,7 +503,7 @@ public:
|
||||
_LIBCPP_CONSTEXPR tuple()
|
||||
_NOEXCEPT_(__all<is_nothrow_default_constructible<_Tp>::value...>::value) {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
explicit tuple(const _Tp& ... __t) _NOEXCEPT_((__all<is_nothrow_copy_constructible<_Tp>::value...>::value))
|
||||
: base_(typename __make_tuple_indices<sizeof...(_Tp)>::type(),
|
||||
typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(),
|
||||
@@ -586,7 +538,7 @@ public:
|
||||
bool
|
||||
>::type = false
|
||||
>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
tuple(_Up&&... __u)
|
||||
_NOEXCEPT_((
|
||||
is_nothrow_constructible<
|
||||
@@ -626,7 +578,7 @@ public:
|
||||
bool
|
||||
>::type =false
|
||||
>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
explicit
|
||||
tuple(_Up&&... __u)
|
||||
_NOEXCEPT_((
|
||||
@@ -674,7 +626,7 @@ public:
|
||||
bool
|
||||
>::type = false
|
||||
>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
tuple(_Tuple&& __t) _NOEXCEPT_((is_nothrow_constructible<base, _Tuple>::value))
|
||||
: base_(_VSTD::forward<_Tuple>(__t)) {}
|
||||
|
||||
@@ -686,7 +638,7 @@ public:
|
||||
bool
|
||||
>::type = false
|
||||
>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
explicit
|
||||
tuple(_Tuple&& __t) _NOEXCEPT_((is_nothrow_constructible<base, _Tuple>::value))
|
||||
: base_(_VSTD::forward<_Tuple>(__t)) {}
|
||||
@@ -721,7 +673,7 @@ public:
|
||||
};
|
||||
|
||||
template <>
|
||||
class _LIBCPP_VISIBLE tuple<>
|
||||
class _LIBCPP_TYPE_VIS_ONLY tuple<>
|
||||
{
|
||||
public:
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
@@ -756,7 +708,7 @@ swap(tuple<_Tp...>& __t, tuple<_Tp...>& __u)
|
||||
// get
|
||||
|
||||
template <size_t _Ip, class ..._Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
typename tuple_element<_Ip, tuple<_Tp...> >::type&
|
||||
get(tuple<_Tp...>& __t) _NOEXCEPT
|
||||
{
|
||||
@@ -765,7 +717,7 @@ get(tuple<_Tp...>& __t) _NOEXCEPT
|
||||
}
|
||||
|
||||
template <size_t _Ip, class ..._Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
const typename tuple_element<_Ip, tuple<_Tp...> >::type&
|
||||
get(const tuple<_Tp...>& __t) _NOEXCEPT
|
||||
{
|
||||
@@ -774,7 +726,7 @@ get(const tuple<_Tp...>& __t) _NOEXCEPT
|
||||
}
|
||||
|
||||
template <size_t _Ip, class ..._Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
typename tuple_element<_Ip, tuple<_Tp...> >::type&&
|
||||
get(tuple<_Tp...>&& __t) _NOEXCEPT
|
||||
{
|
||||
@@ -783,6 +735,64 @@ get(tuple<_Tp...>&& __t) _NOEXCEPT
|
||||
static_cast<__tuple_leaf<_Ip, type>&&>(__t.base_).get());
|
||||
}
|
||||
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
// get by type
|
||||
template <typename _T1, size_t _Idx, typename... _Args>
|
||||
struct __find_exactly_one_t_helper;
|
||||
|
||||
// -- find exactly one
|
||||
template <typename _T1, size_t _Idx, typename... _Args>
|
||||
struct __find_exactly_one_t_checker {
|
||||
static constexpr size_t value = _Idx;
|
||||
// Check the rest of the list to make sure there's only one
|
||||
static_assert ( __find_exactly_one_t_helper<_T1, 0, _Args...>::value == -1, "type can only occur once in type list" );
|
||||
};
|
||||
|
||||
|
||||
template <typename _T1, size_t _Idx>
|
||||
struct __find_exactly_one_t_helper <_T1, _Idx> {
|
||||
static constexpr size_t value = -1;
|
||||
};
|
||||
|
||||
template <typename _T1, size_t _Idx, typename _Head, typename... _Args>
|
||||
struct __find_exactly_one_t_helper <_T1, _Idx, _Head, _Args...> {
|
||||
static constexpr size_t value =
|
||||
std::conditional<
|
||||
std::is_same<_T1, _Head>::value,
|
||||
__find_exactly_one_t_checker<_T1, _Idx, _Args...>,
|
||||
__find_exactly_one_t_helper <_T1, _Idx+1, _Args...>
|
||||
>::type::value;
|
||||
};
|
||||
|
||||
template <typename _T1, typename... _Args>
|
||||
struct __find_exactly_one_t {
|
||||
static constexpr size_t value = __find_exactly_one_t_helper<_T1, 0, _Args...>::value;
|
||||
static_assert ( value != -1, "type not found in type list" );
|
||||
};
|
||||
|
||||
template <class _T1, class... _Args>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
constexpr _T1& get(tuple<_Args...>& __tup) noexcept
|
||||
{
|
||||
return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(__tup);
|
||||
}
|
||||
|
||||
template <class _T1, class... _Args>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
constexpr _T1 const& get(tuple<_Args...> const& __tup) noexcept
|
||||
{
|
||||
return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(__tup);
|
||||
}
|
||||
|
||||
template <class _T1, class... _Args>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
constexpr _T1&& get(tuple<_Args...>&& __tup) noexcept
|
||||
{
|
||||
return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(_VSTD::move(__tup));
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
// tie
|
||||
|
||||
template <class ..._Tp>
|
||||
@@ -803,7 +813,7 @@ struct __ignore_t
|
||||
|
||||
namespace { const __ignore_t<unsigned char> ignore = __ignore_t<unsigned char>(); }
|
||||
|
||||
template <class _Tp> class _LIBCPP_VISIBLE reference_wrapper;
|
||||
template <class _Tp> class _LIBCPP_TYPE_VIS_ONLY reference_wrapper;
|
||||
|
||||
template <class _Tp>
|
||||
struct ___make_tuple_return
|
||||
@@ -824,7 +834,7 @@ struct __make_tuple_return
|
||||
};
|
||||
|
||||
template <class... _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
tuple<typename __make_tuple_return<_Tp>::type...>
|
||||
make_tuple(_Tp&&... __t)
|
||||
{
|
||||
@@ -832,7 +842,7 @@ make_tuple(_Tp&&... __t)
|
||||
}
|
||||
|
||||
template <class... _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
tuple<_Tp&&...>
|
||||
forward_as_tuple(_Tp&&... __t) _NOEXCEPT
|
||||
{
|
||||
@@ -843,7 +853,7 @@ template <size_t _Ip>
|
||||
struct __tuple_equal
|
||||
{
|
||||
template <class _Tp, class _Up>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
bool operator()(const _Tp& __x, const _Up& __y)
|
||||
{
|
||||
return __tuple_equal<_Ip - 1>()(__x, __y) && get<_Ip-1>(__x) == get<_Ip-1>(__y);
|
||||
@@ -854,7 +864,7 @@ template <>
|
||||
struct __tuple_equal<0>
|
||||
{
|
||||
template <class _Tp, class _Up>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
bool operator()(const _Tp&, const _Up&)
|
||||
{
|
||||
return true;
|
||||
@@ -862,7 +872,7 @@ struct __tuple_equal<0>
|
||||
};
|
||||
|
||||
template <class ..._Tp, class ..._Up>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
bool
|
||||
operator==(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
|
||||
{
|
||||
@@ -870,7 +880,7 @@ operator==(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
|
||||
}
|
||||
|
||||
template <class ..._Tp, class ..._Up>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
bool
|
||||
operator!=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
|
||||
{
|
||||
@@ -881,7 +891,7 @@ template <size_t _Ip>
|
||||
struct __tuple_less
|
||||
{
|
||||
template <class _Tp, class _Up>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
bool operator()(const _Tp& __x, const _Up& __y)
|
||||
{
|
||||
return __tuple_less<_Ip-1>()(__x, __y) ||
|
||||
@@ -893,7 +903,7 @@ template <>
|
||||
struct __tuple_less<0>
|
||||
{
|
||||
template <class _Tp, class _Up>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
bool operator()(const _Tp&, const _Up&)
|
||||
{
|
||||
return false;
|
||||
@@ -901,7 +911,7 @@ struct __tuple_less<0>
|
||||
};
|
||||
|
||||
template <class ..._Tp, class ..._Up>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
bool
|
||||
operator<(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
|
||||
{
|
||||
@@ -909,7 +919,7 @@ operator<(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
|
||||
}
|
||||
|
||||
template <class ..._Tp, class ..._Up>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
bool
|
||||
operator>(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
|
||||
{
|
||||
@@ -917,7 +927,7 @@ operator>(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
|
||||
}
|
||||
|
||||
template <class ..._Tp, class ..._Up>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
bool
|
||||
operator>=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
|
||||
{
|
||||
@@ -925,7 +935,7 @@ operator>=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
|
||||
}
|
||||
|
||||
template <class ..._Tp, class ..._Up>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
bool
|
||||
operator<=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y)
|
||||
{
|
||||
@@ -983,7 +993,7 @@ struct __tuple_cat_return<>
|
||||
typedef tuple<> type;
|
||||
};
|
||||
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
tuple<>
|
||||
tuple_cat()
|
||||
{
|
||||
@@ -1030,16 +1040,16 @@ template <class ..._Types, size_t ..._I0, size_t ..._J0>
|
||||
struct __tuple_cat<tuple<_Types...>, __tuple_indices<_I0...>, __tuple_indices<_J0...> >
|
||||
{
|
||||
template <class _Tuple0>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
typename __tuple_cat_return_ref<tuple<_Types...>&&, _Tuple0&&>::type
|
||||
operator()(tuple<_Types...> __t, _Tuple0&& __t0)
|
||||
{
|
||||
return _VSTD::forward_as_tuple(_VSTD::forward<_Types>(get<_I0>(__t))...,
|
||||
return forward_as_tuple(_VSTD::forward<_Types>(get<_I0>(__t))...,
|
||||
get<_J0>(_VSTD::forward<_Tuple0>(__t0))...);
|
||||
}
|
||||
|
||||
template <class _Tuple0, class _Tuple1, class ..._Tuples>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
typename __tuple_cat_return_ref<tuple<_Types...>&&, _Tuple0&&, _Tuple1&&, _Tuples&&...>::type
|
||||
operator()(tuple<_Types...> __t, _Tuple0&& __t0, _Tuple1&& __t1, _Tuples&& ...__tpls)
|
||||
{
|
||||
@@ -1049,7 +1059,7 @@ struct __tuple_cat<tuple<_Types...>, __tuple_indices<_I0...>, __tuple_indices<_J
|
||||
tuple<_Types..., typename __apply_cv<_Tuple0, typename tuple_element<_J0, _T0>::type>::type&&...>,
|
||||
typename __make_tuple_indices<sizeof ...(_Types) + tuple_size<_T0>::value>::type,
|
||||
typename __make_tuple_indices<tuple_size<_T1>::value>::type>()
|
||||
(_VSTD::forward_as_tuple(
|
||||
(forward_as_tuple(
|
||||
_VSTD::forward<_Types>(get<_I0>(__t))...,
|
||||
get<_J0>(_VSTD::forward<_Tuple0>(__t0))...
|
||||
),
|
||||
@@ -1059,7 +1069,7 @@ struct __tuple_cat<tuple<_Types...>, __tuple_indices<_I0...>, __tuple_indices<_J
|
||||
};
|
||||
|
||||
template <class _Tuple0, class... _Tuples>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
typename __tuple_cat_return<_Tuple0, _Tuples...>::type
|
||||
tuple_cat(_Tuple0&& __t0, _Tuples&&... __tpls)
|
||||
{
|
||||
@@ -1071,7 +1081,7 @@ tuple_cat(_Tuple0&& __t0, _Tuples&&... __tpls)
|
||||
}
|
||||
|
||||
template <class ..._Tp, class _Alloc>
|
||||
struct _LIBCPP_VISIBLE uses_allocator<tuple<_Tp...>, _Alloc>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY uses_allocator<tuple<_Tp...>, _Alloc>
|
||||
: true_type {};
|
||||
|
||||
template <class _T1, class _T2>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -55,7 +55,7 @@ struct hash<type_index>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
class _LIBCPP_VISIBLE type_index
|
||||
class _LIBCPP_TYPE_VIS_ONLY type_index
|
||||
{
|
||||
const type_info* __t_;
|
||||
public:
|
||||
@@ -87,10 +87,10 @@ public:
|
||||
const char* name() const _NOEXCEPT {return __t_->name();}
|
||||
};
|
||||
|
||||
template <class _Tp> struct _LIBCPP_VISIBLE hash;
|
||||
template <class _Tp> struct _LIBCPP_TYPE_VIS_ONLY hash;
|
||||
|
||||
template <>
|
||||
struct _LIBCPP_VISIBLE hash<type_index>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY hash<type_index>
|
||||
: public unary_function<type_index, size_t>
|
||||
{
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -68,6 +68,16 @@ public:
|
||||
unordered_set(initializer_list<value_type>, size_type n = 0,
|
||||
const hasher& hf = hasher(), const key_equal& eql = key_equal(),
|
||||
const allocator_type& a = allocator_type());
|
||||
unordered_set(size_type n, const allocator_type& a); // C++14
|
||||
unordered_set(size_type n, const hasher& hf, const allocator_type& a); // C++14
|
||||
template <class InputIterator>
|
||||
unordered_set(InputIterator f, InputIterator l, size_type n, const allocator_type& a); // C++14
|
||||
template <class InputIterator>
|
||||
unordered_set(InputIterator f, InputIterator l, size_type n,
|
||||
const hasher& hf, const allocator_type& a); // C++14
|
||||
unordered_set(initializer_list<value_type> il, size_type n, const allocator_type& a); // C++14
|
||||
unordered_set(initializer_list<value_type> il, size_type n,
|
||||
const hasher& hf, const allocator_type& a); // C++14
|
||||
~unordered_set();
|
||||
unordered_set& operator=(const unordered_set&);
|
||||
unordered_set& operator=(unordered_set&&)
|
||||
@@ -207,6 +217,16 @@ public:
|
||||
unordered_multiset(initializer_list<value_type>, size_type n = /see below/,
|
||||
const hasher& hf = hasher(), const key_equal& eql = key_equal(),
|
||||
const allocator_type& a = allocator_type());
|
||||
unordered_multiset(size_type n, const allocator_type& a); // C++14
|
||||
unordered_multiset(size_type n, const hasher& hf, const allocator_type& a); // C++14
|
||||
template <class InputIterator>
|
||||
unordered_multiset(InputIterator f, InputIterator l, size_type n, const allocator_type& a); // C++14
|
||||
template <class InputIterator>
|
||||
unordered_multiset(InputIterator f, InputIterator l, size_type n,
|
||||
const hasher& hf, const allocator_type& a); // C++14
|
||||
unordered_multiset(initializer_list<value_type> il, size_type n, const allocator_type& a); // C++14
|
||||
unordered_multiset(initializer_list<value_type> il, size_type n,
|
||||
const hasher& hf, const allocator_type& a); // C++14
|
||||
~unordered_multiset();
|
||||
unordered_multiset& operator=(const unordered_multiset&);
|
||||
unordered_multiset& operator=(unordered_multiset&&)
|
||||
@@ -313,7 +333,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>,
|
||||
class _Alloc = allocator<_Value> >
|
||||
class _LIBCPP_VISIBLE unordered_set
|
||||
class _LIBCPP_TYPE_VIS_ONLY unordered_set
|
||||
{
|
||||
public:
|
||||
// types
|
||||
@@ -324,6 +344,8 @@ public:
|
||||
typedef _Alloc allocator_type;
|
||||
typedef value_type& reference;
|
||||
typedef const value_type& const_reference;
|
||||
static_assert((is_same<value_type, typename allocator_type::value_type>::value),
|
||||
"Invalid allocator::value_type");
|
||||
|
||||
private:
|
||||
typedef __hash_table<value_type, hasher, key_equal, allocator_type> __table;
|
||||
@@ -344,9 +366,21 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
unordered_set()
|
||||
_NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
|
||||
{} // = default;
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__insert_c(this);
|
||||
#endif
|
||||
}
|
||||
explicit unordered_set(size_type __n, const hasher& __hf = hasher(),
|
||||
const key_equal& __eql = key_equal());
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
unordered_set(size_type __n, const allocator_type& __a)
|
||||
: unordered_set(__n, hasher(), key_equal(), __a) {}
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
unordered_set(size_type __n, const hasher& __hf, const allocator_type& __a)
|
||||
: unordered_set(__n, __hf, key_equal(), __a) {}
|
||||
#endif
|
||||
unordered_set(size_type __n, const hasher& __hf, const key_equal& __eql,
|
||||
const allocator_type& __a);
|
||||
template <class _InputIterator>
|
||||
@@ -359,6 +393,17 @@ public:
|
||||
unordered_set(_InputIterator __first, _InputIterator __last,
|
||||
size_type __n, const hasher& __hf, const key_equal& __eql,
|
||||
const allocator_type& __a);
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
template <class _InputIterator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
unordered_set(_InputIterator __first, _InputIterator __last,
|
||||
size_type __n, const allocator_type& __a)
|
||||
: unordered_set(__first, __last, __n, hasher(), key_equal(), __a) {}
|
||||
template <class _InputIterator>
|
||||
unordered_set(_InputIterator __first, _InputIterator __last,
|
||||
size_type __n, const hasher& __hf, const allocator_type& __a)
|
||||
: unordered_set(__first, __last, __n, __hf, key_equal(), __a) {}
|
||||
#endif
|
||||
explicit unordered_set(const allocator_type& __a);
|
||||
unordered_set(const unordered_set& __u);
|
||||
unordered_set(const unordered_set& __u, const allocator_type& __a);
|
||||
@@ -375,6 +420,16 @@ public:
|
||||
unordered_set(initializer_list<value_type> __il, size_type __n,
|
||||
const hasher& __hf, const key_equal& __eql,
|
||||
const allocator_type& __a);
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
unordered_set(initializer_list<value_type> __il, size_type __n,
|
||||
const allocator_type& __a)
|
||||
: unordered_set(__il, __n, hasher(), key_equal(), __a) {}
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
unordered_set(initializer_list<value_type> __il, size_type __n,
|
||||
const hasher& __hf, const allocator_type& __a)
|
||||
: unordered_set(__il, __n, __hf, key_equal(), __a) {}
|
||||
#endif
|
||||
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
||||
// ~unordered_set() = default;
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
@@ -422,8 +477,18 @@ public:
|
||||
{return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...);}
|
||||
template <class... _Args>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
iterator emplace_hint(const_iterator __p, _Args&&... __args)
|
||||
{
|
||||
_LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
|
||||
"unordered_set::emplace_hint(const_iterator, args...) called with an iterator not"
|
||||
" referring to this unordered_set");
|
||||
return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first;
|
||||
}
|
||||
#else
|
||||
iterator emplace_hint(const_iterator, _Args&&... __args)
|
||||
{return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first;}
|
||||
#endif
|
||||
#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
pair<iterator, bool> insert(const value_type& __x)
|
||||
@@ -434,12 +499,32 @@ public:
|
||||
{return __table_.__insert_unique(_VSTD::move(__x));}
|
||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
iterator insert(const_iterator __p, const value_type& __x)
|
||||
{
|
||||
_LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
|
||||
"unordered_set::insert(const_iterator, const value_type&) called with an iterator not"
|
||||
" referring to this unordered_set");
|
||||
return insert(__x).first;
|
||||
}
|
||||
#else
|
||||
iterator insert(const_iterator, const value_type& __x)
|
||||
{return insert(__x).first;}
|
||||
#endif
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
iterator insert(const_iterator __p, value_type&& __x)
|
||||
{
|
||||
_LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
|
||||
"unordered_set::insert(const_iterator, value_type&&) called with an iterator not"
|
||||
" referring to this unordered_set");
|
||||
return insert(_VSTD::move(__x)).first;
|
||||
}
|
||||
#else
|
||||
iterator insert(const_iterator, value_type&& __x)
|
||||
{return insert(_VSTD::move(__x)).first;}
|
||||
#endif
|
||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
template <class _InputIterator>
|
||||
void insert(_InputIterator __first, _InputIterator __last);
|
||||
@@ -515,6 +600,20 @@ public:
|
||||
void rehash(size_type __n) {__table_.rehash(__n);}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
void reserve(size_type __n) {__table_.reserve(__n);}
|
||||
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
|
||||
bool __dereferenceable(const const_iterator* __i) const
|
||||
{return __table_.__dereferenceable(__i);}
|
||||
bool __decrementable(const const_iterator* __i) const
|
||||
{return __table_.__decrementable(__i);}
|
||||
bool __addable(const const_iterator* __i, ptrdiff_t __n) const
|
||||
{return __table_.__addable(__i, __n);}
|
||||
bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
|
||||
{return __table_.__addable(__i, __n);}
|
||||
|
||||
#endif // _LIBCPP_DEBUG_LEVEL >= 2
|
||||
|
||||
};
|
||||
|
||||
template <class _Value, class _Hash, class _Pred, class _Alloc>
|
||||
@@ -522,6 +621,9 @@ unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(size_type __n,
|
||||
const hasher& __hf, const key_equal& __eql)
|
||||
: __table_(__hf, __eql)
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__insert_c(this);
|
||||
#endif
|
||||
__table_.rehash(__n);
|
||||
}
|
||||
|
||||
@@ -530,6 +632,9 @@ unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(size_type __n,
|
||||
const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
|
||||
: __table_(__hf, __eql, __a)
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__insert_c(this);
|
||||
#endif
|
||||
__table_.rehash(__n);
|
||||
}
|
||||
|
||||
@@ -538,6 +643,9 @@ template <class _InputIterator>
|
||||
unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
|
||||
_InputIterator __first, _InputIterator __last)
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__insert_c(this);
|
||||
#endif
|
||||
insert(__first, __last);
|
||||
}
|
||||
|
||||
@@ -548,6 +656,9 @@ unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
|
||||
const hasher& __hf, const key_equal& __eql)
|
||||
: __table_(__hf, __eql)
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__insert_c(this);
|
||||
#endif
|
||||
__table_.rehash(__n);
|
||||
insert(__first, __last);
|
||||
}
|
||||
@@ -559,6 +670,9 @@ unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
|
||||
const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
|
||||
: __table_(__hf, __eql, __a)
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__insert_c(this);
|
||||
#endif
|
||||
__table_.rehash(__n);
|
||||
insert(__first, __last);
|
||||
}
|
||||
@@ -569,6 +683,9 @@ unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
|
||||
const allocator_type& __a)
|
||||
: __table_(__a)
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__insert_c(this);
|
||||
#endif
|
||||
}
|
||||
|
||||
template <class _Value, class _Hash, class _Pred, class _Alloc>
|
||||
@@ -576,6 +693,9 @@ unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
|
||||
const unordered_set& __u)
|
||||
: __table_(__u.__table_)
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__insert_c(this);
|
||||
#endif
|
||||
__table_.rehash(__u.bucket_count());
|
||||
insert(__u.begin(), __u.end());
|
||||
}
|
||||
@@ -585,6 +705,9 @@ unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
|
||||
const unordered_set& __u, const allocator_type& __a)
|
||||
: __table_(__u.__table_, __a)
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__insert_c(this);
|
||||
#endif
|
||||
__table_.rehash(__u.bucket_count());
|
||||
insert(__u.begin(), __u.end());
|
||||
}
|
||||
@@ -598,6 +721,10 @@ unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
|
||||
_NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
|
||||
: __table_(_VSTD::move(__u.__table_))
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__insert_c(this);
|
||||
__get_db()->swap(this, &__u);
|
||||
#endif
|
||||
}
|
||||
|
||||
template <class _Value, class _Hash, class _Pred, class _Alloc>
|
||||
@@ -605,12 +732,19 @@ unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
|
||||
unordered_set&& __u, const allocator_type& __a)
|
||||
: __table_(_VSTD::move(__u.__table_), __a)
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__insert_c(this);
|
||||
#endif
|
||||
if (__a != __u.get_allocator())
|
||||
{
|
||||
iterator __i = __u.begin();
|
||||
while (__u.size() != 0)
|
||||
__table_.__insert_unique(_VSTD::move(__u.__table_.remove(__i++)->__value_));
|
||||
}
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
else
|
||||
__get_db()->swap(this, &__u);
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
@@ -621,6 +755,9 @@ template <class _Value, class _Hash, class _Pred, class _Alloc>
|
||||
unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
|
||||
initializer_list<value_type> __il)
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__insert_c(this);
|
||||
#endif
|
||||
insert(__il.begin(), __il.end());
|
||||
}
|
||||
|
||||
@@ -630,6 +767,9 @@ unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
|
||||
const key_equal& __eql)
|
||||
: __table_(__hf, __eql)
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__insert_c(this);
|
||||
#endif
|
||||
__table_.rehash(__n);
|
||||
insert(__il.begin(), __il.end());
|
||||
}
|
||||
@@ -640,6 +780,9 @@ unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
|
||||
const key_equal& __eql, const allocator_type& __a)
|
||||
: __table_(__hf, __eql, __a)
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__insert_c(this);
|
||||
#endif
|
||||
__table_.rehash(__n);
|
||||
insert(__il.begin(), __il.end());
|
||||
}
|
||||
@@ -725,7 +868,7 @@ operator!=(const unordered_set<_Value, _Hash, _Pred, _Alloc>& __x,
|
||||
|
||||
template <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>,
|
||||
class _Alloc = allocator<_Value> >
|
||||
class _LIBCPP_VISIBLE unordered_multiset
|
||||
class _LIBCPP_TYPE_VIS_ONLY unordered_multiset
|
||||
{
|
||||
public:
|
||||
// types
|
||||
@@ -736,6 +879,8 @@ public:
|
||||
typedef _Alloc allocator_type;
|
||||
typedef value_type& reference;
|
||||
typedef const value_type& const_reference;
|
||||
static_assert((is_same<value_type, typename allocator_type::value_type>::value),
|
||||
"Invalid allocator::value_type");
|
||||
|
||||
private:
|
||||
typedef __hash_table<value_type, hasher, key_equal, allocator_type> __table;
|
||||
@@ -756,11 +901,23 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
unordered_multiset()
|
||||
_NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
|
||||
{} // = default
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__insert_c(this);
|
||||
#endif
|
||||
}
|
||||
explicit unordered_multiset(size_type __n, const hasher& __hf = hasher(),
|
||||
const key_equal& __eql = key_equal());
|
||||
unordered_multiset(size_type __n, const hasher& __hf,
|
||||
const key_equal& __eql, const allocator_type& __a);
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
unordered_multiset(size_type __n, const allocator_type& __a)
|
||||
: unordered_multiset(__n, hasher(), key_equal(), __a) {}
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
unordered_multiset(size_type __n, const hasher& __hf, const allocator_type& __a)
|
||||
: unordered_multiset(__n, __hf, key_equal(), __a) {}
|
||||
#endif
|
||||
template <class _InputIterator>
|
||||
unordered_multiset(_InputIterator __first, _InputIterator __last);
|
||||
template <class _InputIterator>
|
||||
@@ -771,6 +928,18 @@ public:
|
||||
unordered_multiset(_InputIterator __first, _InputIterator __last,
|
||||
size_type __n , const hasher& __hf,
|
||||
const key_equal& __eql, const allocator_type& __a);
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
template <class _InputIterator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
unordered_multiset(_InputIterator __first, _InputIterator __last,
|
||||
size_type __n, const allocator_type& __a)
|
||||
: unordered_multiset(__first, __last, __n, hasher(), key_equal(), __a) {}
|
||||
template <class _InputIterator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
unordered_multiset(_InputIterator __first, _InputIterator __last,
|
||||
size_type __n, const hasher& __hf, const allocator_type& __a)
|
||||
: unordered_multiset(__first, __last, __n, __hf, key_equal(), __a) {}
|
||||
#endif
|
||||
explicit unordered_multiset(const allocator_type& __a);
|
||||
unordered_multiset(const unordered_multiset& __u);
|
||||
unordered_multiset(const unordered_multiset& __u, const allocator_type& __a);
|
||||
@@ -787,6 +956,14 @@ public:
|
||||
unordered_multiset(initializer_list<value_type> __il, size_type __n,
|
||||
const hasher& __hf, const key_equal& __eql,
|
||||
const allocator_type& __a);
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
unordered_multiset(initializer_list<value_type> __il, size_type __n, const allocator_type& __a)
|
||||
: unordered_multiset(__il, __n, hasher(), key_equal(), __a) {}
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
unordered_multiset(initializer_list<value_type> __il, size_type __n, const hasher& __hf, const allocator_type& __a)
|
||||
: unordered_multiset(__il, __n, __hf, key_equal(), __a) {}
|
||||
#endif
|
||||
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
|
||||
// ~unordered_multiset() = default;
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
@@ -925,6 +1102,20 @@ public:
|
||||
void rehash(size_type __n) {__table_.rehash(__n);}
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
void reserve(size_type __n) {__table_.reserve(__n);}
|
||||
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
|
||||
bool __dereferenceable(const const_iterator* __i) const
|
||||
{return __table_.__dereferenceable(__i);}
|
||||
bool __decrementable(const const_iterator* __i) const
|
||||
{return __table_.__decrementable(__i);}
|
||||
bool __addable(const const_iterator* __i, ptrdiff_t __n) const
|
||||
{return __table_.__addable(__i, __n);}
|
||||
bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const
|
||||
{return __table_.__addable(__i, __n);}
|
||||
|
||||
#endif // _LIBCPP_DEBUG_LEVEL >= 2
|
||||
|
||||
};
|
||||
|
||||
template <class _Value, class _Hash, class _Pred, class _Alloc>
|
||||
@@ -932,6 +1123,9 @@ unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
|
||||
size_type __n, const hasher& __hf, const key_equal& __eql)
|
||||
: __table_(__hf, __eql)
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__insert_c(this);
|
||||
#endif
|
||||
__table_.rehash(__n);
|
||||
}
|
||||
|
||||
@@ -941,6 +1135,9 @@ unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
|
||||
const allocator_type& __a)
|
||||
: __table_(__hf, __eql, __a)
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__insert_c(this);
|
||||
#endif
|
||||
__table_.rehash(__n);
|
||||
}
|
||||
|
||||
@@ -949,6 +1146,9 @@ template <class _InputIterator>
|
||||
unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
|
||||
_InputIterator __first, _InputIterator __last)
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__insert_c(this);
|
||||
#endif
|
||||
insert(__first, __last);
|
||||
}
|
||||
|
||||
@@ -959,6 +1159,9 @@ unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
|
||||
const hasher& __hf, const key_equal& __eql)
|
||||
: __table_(__hf, __eql)
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__insert_c(this);
|
||||
#endif
|
||||
__table_.rehash(__n);
|
||||
insert(__first, __last);
|
||||
}
|
||||
@@ -970,6 +1173,9 @@ unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
|
||||
const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
|
||||
: __table_(__hf, __eql, __a)
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__insert_c(this);
|
||||
#endif
|
||||
__table_.rehash(__n);
|
||||
insert(__first, __last);
|
||||
}
|
||||
@@ -980,6 +1186,9 @@ unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
|
||||
const allocator_type& __a)
|
||||
: __table_(__a)
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__insert_c(this);
|
||||
#endif
|
||||
}
|
||||
|
||||
template <class _Value, class _Hash, class _Pred, class _Alloc>
|
||||
@@ -987,6 +1196,9 @@ unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
|
||||
const unordered_multiset& __u)
|
||||
: __table_(__u.__table_)
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__insert_c(this);
|
||||
#endif
|
||||
__table_.rehash(__u.bucket_count());
|
||||
insert(__u.begin(), __u.end());
|
||||
}
|
||||
@@ -996,6 +1208,9 @@ unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
|
||||
const unordered_multiset& __u, const allocator_type& __a)
|
||||
: __table_(__u.__table_, __a)
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__insert_c(this);
|
||||
#endif
|
||||
__table_.rehash(__u.bucket_count());
|
||||
insert(__u.begin(), __u.end());
|
||||
}
|
||||
@@ -1009,6 +1224,10 @@ unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
|
||||
_NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
|
||||
: __table_(_VSTD::move(__u.__table_))
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__insert_c(this);
|
||||
__get_db()->swap(this, &__u);
|
||||
#endif
|
||||
}
|
||||
|
||||
template <class _Value, class _Hash, class _Pred, class _Alloc>
|
||||
@@ -1016,12 +1235,19 @@ unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
|
||||
unordered_multiset&& __u, const allocator_type& __a)
|
||||
: __table_(_VSTD::move(__u.__table_), __a)
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__insert_c(this);
|
||||
#endif
|
||||
if (__a != __u.get_allocator())
|
||||
{
|
||||
iterator __i = __u.begin();
|
||||
while (__u.size() != 0)
|
||||
__table_.__insert_multi(_VSTD::move(__u.__table_.remove(__i++)->__value_));
|
||||
}
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
else
|
||||
__get_db()->swap(this, &__u);
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
@@ -1032,6 +1258,9 @@ template <class _Value, class _Hash, class _Pred, class _Alloc>
|
||||
unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
|
||||
initializer_list<value_type> __il)
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__insert_c(this);
|
||||
#endif
|
||||
insert(__il.begin(), __il.end());
|
||||
}
|
||||
|
||||
@@ -1041,6 +1270,9 @@ unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
|
||||
const key_equal& __eql)
|
||||
: __table_(__hf, __eql)
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__insert_c(this);
|
||||
#endif
|
||||
__table_.rehash(__n);
|
||||
insert(__il.begin(), __il.end());
|
||||
}
|
||||
@@ -1051,6 +1283,9 @@ unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
|
||||
const key_equal& __eql, const allocator_type& __a)
|
||||
: __table_(__hf, __eql, __a)
|
||||
{
|
||||
#if _LIBCPP_DEBUG_LEVEL >= 2
|
||||
__get_db()->__insert_c(this);
|
||||
#endif
|
||||
__table_.rehash(__n);
|
||||
insert(__il.begin(), __il.end());
|
||||
}
|
||||
|
||||
283
include/utility
283
include/utility
@@ -38,10 +38,10 @@ template <class T, size_t N>
|
||||
void
|
||||
swap(T (&a)[N], T (&b)[N]) noexcept(noexcept(swap(*a, *b)));
|
||||
|
||||
template <class T> T&& forward(typename remove_reference<T>::type& t) noexcept;
|
||||
template <class T> T&& forward(typename remove_reference<T>::type&& t) noexcept;
|
||||
template <class T> T&& forward(typename remove_reference<T>::type& t) noexcept; // constexpr in C++14
|
||||
template <class T> T&& forward(typename remove_reference<T>::type&& t) noexcept; // constexpr in C++14
|
||||
|
||||
template <class T> typename remove_reference<T>::type&& move(T&&) noexcept;
|
||||
template <class T> typename remove_reference<T>::type&& move(T&&) noexcept; // constexpr in C++14
|
||||
|
||||
template <class T>
|
||||
typename conditional
|
||||
@@ -50,7 +50,7 @@ template <class T>
|
||||
const T&,
|
||||
T&&
|
||||
>::type
|
||||
move_if_noexcept(T& x) noexcept;
|
||||
move_if_noexcept(T& x) noexcept; // constexpr in C++14
|
||||
|
||||
template <class T> typename add_rvalue_reference<T>::type declval() noexcept;
|
||||
|
||||
@@ -66,10 +66,10 @@ struct pair
|
||||
pair(const pair&) = default;
|
||||
pair(pair&&) = default;
|
||||
constexpr pair();
|
||||
pair(const T1& x, const T2& y);
|
||||
template <class U, class V> pair(U&& x, V&& y);
|
||||
template <class U, class V> pair(const pair<U, V>& p);
|
||||
template <class U, class V> pair(pair<U, V>&& p);
|
||||
pair(const T1& x, const T2& y); // constexpr in C++14
|
||||
template <class U, class V> pair(U&& x, V&& y); // constexpr in C++14
|
||||
template <class U, class V> pair(const pair<U, V>& p); // constexpr in C++14
|
||||
template <class U, class V> pair(pair<U, V>&& p); // constexpr in C++14
|
||||
template <class... Args1, class... Args2>
|
||||
pair(piecewise_construct_t, tuple<Args1...> first_args,
|
||||
tuple<Args2...> second_args);
|
||||
@@ -83,14 +83,14 @@ struct pair
|
||||
noexcept(swap(second, p.second)));
|
||||
};
|
||||
|
||||
template <class T1, class T2> bool operator==(const pair<T1,T2>&, const pair<T1,T2>&);
|
||||
template <class T1, class T2> bool operator!=(const pair<T1,T2>&, const pair<T1,T2>&);
|
||||
template <class T1, class T2> bool operator< (const pair<T1,T2>&, const pair<T1,T2>&);
|
||||
template <class T1, class T2> bool operator> (const pair<T1,T2>&, const pair<T1,T2>&);
|
||||
template <class T1, class T2> bool operator>=(const pair<T1,T2>&, const pair<T1,T2>&);
|
||||
template <class T1, class T2> bool operator<=(const pair<T1,T2>&, const pair<T1,T2>&);
|
||||
template <class T1, class T2> bool operator==(const pair<T1,T2>&, const pair<T1,T2>&); // constexpr in C++14
|
||||
template <class T1, class T2> bool operator!=(const pair<T1,T2>&, const pair<T1,T2>&); // constexpr in C++14
|
||||
template <class T1, class T2> bool operator< (const pair<T1,T2>&, const pair<T1,T2>&); // constexpr in C++14
|
||||
template <class T1, class T2> bool operator> (const pair<T1,T2>&, const pair<T1,T2>&); // constexpr in C++14
|
||||
template <class T1, class T2> bool operator>=(const pair<T1,T2>&, const pair<T1,T2>&); // constexpr in C++14
|
||||
template <class T1, class T2> bool operator<=(const pair<T1,T2>&, const pair<T1,T2>&); // constexpr in C++14
|
||||
|
||||
template <class T1, class T2> pair<V1, V2> make_pair(T1&&, T2&&);
|
||||
template <class T1, class T2> pair<V1, V2> make_pair(T1&&, T2&&); // constexpr in C++14
|
||||
template <class T1, class T2>
|
||||
void
|
||||
swap(pair<T1, T2>& x, pair<T1, T2>& y) noexcept(noexcept(x.swap(y)));
|
||||
@@ -107,16 +107,48 @@ template <class T1, class T2> struct tuple_element<1, std::pair<T1, T2> >;
|
||||
|
||||
template<size_t I, class T1, class T2>
|
||||
typename tuple_element<I, std::pair<T1, T2> >::type&
|
||||
get(std::pair<T1, T2>&) noexcept;
|
||||
get(std::pair<T1, T2>&) noexcept; // constexpr in C++14
|
||||
|
||||
template<size_t I, class T1, class T2>
|
||||
const typename const tuple_element<I, std::pair<T1, T2> >::type&
|
||||
get(const std::pair<T1, T2>&) noexcept;
|
||||
get(const std::pair<T1, T2>&) noexcept; // constexpr in C++14
|
||||
|
||||
template<size_t I, class T1, class T2>
|
||||
typename tuple_element<I, std::pair<T1, T2> >::type&&
|
||||
get(std::pair<T1, T2>&&) noexcept;
|
||||
get(std::pair<T1, T2>&&) noexcept; // constexpr in C++14
|
||||
|
||||
template<class T1, class T2>
|
||||
constexpr T1& get(std::pair<T1, T2>&) noexcept; // C++14
|
||||
|
||||
template<size_t I, class T1, class T2>
|
||||
constexpr T1 const& get(std::pair<T1, T2> const &) noexcept; // C++14
|
||||
|
||||
template<size_t I, class T1, class T2>
|
||||
constexpr T1&& get(std::pair<T1, T2>&&) noexcept; // C++14
|
||||
|
||||
// C++14
|
||||
|
||||
template<class T, T... I>
|
||||
struct integer_sequence
|
||||
{
|
||||
typedef T value_type;
|
||||
|
||||
static constexpr size_t size() noexcept;
|
||||
};
|
||||
|
||||
template<size_t... I>
|
||||
using index_sequence = integer_sequence<size_t, I...>;
|
||||
|
||||
template<class T, T N>
|
||||
using make_integer_sequence = integer_sequence<T, 0, 1, ..., N-1>;
|
||||
template<size_t N>
|
||||
using make_index_sequence = make_integer_sequence<size_t, N>;
|
||||
|
||||
template<class... T>
|
||||
using index_sequence_for = make_index_sequence<sizeof...(T)>;
|
||||
|
||||
template<class T, class U=T>
|
||||
T exchange(T& obj, U&& new_value);
|
||||
} // std
|
||||
|
||||
*/
|
||||
@@ -189,7 +221,7 @@ swap(_Tp (&__a)[_Np], _Tp (&__b)[_Np]) _NOEXCEPT_(__is_nothrow_swappable<_Tp>::v
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
typename conditional
|
||||
<
|
||||
@@ -205,7 +237,7 @@ move_if_noexcept(_Tp& __x) _NOEXCEPT
|
||||
return _VSTD::move(__x);
|
||||
}
|
||||
|
||||
struct _LIBCPP_VISIBLE piecewise_construct_t { };
|
||||
struct _LIBCPP_TYPE_VIS_ONLY piecewise_construct_t { };
|
||||
#if defined(_LIBCPP_HAS_NO_CONSTEXPR) || defined(_LIBCPP_BUILDING_UTILITY)
|
||||
extern const piecewise_construct_t piecewise_construct;// = piecewise_construct_t();
|
||||
#else
|
||||
@@ -213,7 +245,7 @@ constexpr piecewise_construct_t piecewise_construct = piecewise_construct_t();
|
||||
#endif
|
||||
|
||||
template <class _T1, class _T2>
|
||||
struct _LIBCPP_VISIBLE pair
|
||||
struct _LIBCPP_TYPE_VIS_ONLY pair
|
||||
{
|
||||
typedef _T1 first_type;
|
||||
typedef _T2 second_type;
|
||||
@@ -226,11 +258,12 @@ struct _LIBCPP_VISIBLE pair
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR pair() : first(), second() {}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY pair(const _T1& __x, const _T2& __y)
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
pair(const _T1& __x, const _T2& __y)
|
||||
: first(__x), second(__y) {}
|
||||
|
||||
template<class _U1, class _U2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
pair(const pair<_U1, _U2>& __p
|
||||
#ifndef _LIBCPP_HAS_NO_ADVANCED_SFINAE
|
||||
,typename enable_if<is_convertible<const _U1&, _T1>::value &&
|
||||
@@ -239,6 +272,10 @@ struct _LIBCPP_VISIBLE pair
|
||||
)
|
||||
: first(__p.first), second(__p.second) {}
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS) && _LIBCPP_TRIVIAL_PAIR_COPY_CTOR
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
pair(const pair& __p) = default;
|
||||
#elif !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) || !_LIBCPP_TRIVIAL_PAIR_COPY_CTOR
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
pair(const pair& __p)
|
||||
_NOEXCEPT_(is_nothrow_copy_constructible<first_type>::value &&
|
||||
@@ -247,6 +284,7 @@ struct _LIBCPP_VISIBLE pair
|
||||
second(__p.second)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
pair& operator=(const pair& __p)
|
||||
@@ -263,20 +301,24 @@ struct _LIBCPP_VISIBLE pair
|
||||
template <class _U1, class _U2,
|
||||
class = typename enable_if<is_convertible<_U1, first_type>::value &&
|
||||
is_convertible<_U2, second_type>::value>::type>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
pair(_U1&& __u1, _U2&& __u2)
|
||||
: first(_VSTD::forward<_U1>(__u1)),
|
||||
second(_VSTD::forward<_U2>(__u2))
|
||||
{}
|
||||
|
||||
template<class _U1, class _U2>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
pair(pair<_U1, _U2>&& __p,
|
||||
typename enable_if<is_convertible<_U1, _T1>::value &&
|
||||
is_convertible<_U2, _T2>::value>::type* = 0)
|
||||
: first(_VSTD::forward<_U1>(__p.first)),
|
||||
second(_VSTD::forward<_U2>(__p.second)) {}
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
pair(pair&& __p) = default;
|
||||
#else
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
pair(pair&& __p) _NOEXCEPT_(is_nothrow_move_constructible<first_type>::value &&
|
||||
is_nothrow_move_constructible<second_type>::value)
|
||||
@@ -284,6 +326,7 @@ struct _LIBCPP_VISIBLE pair
|
||||
second(_VSTD::forward<second_type>(__p.second))
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
pair&
|
||||
@@ -299,7 +342,7 @@ struct _LIBCPP_VISIBLE pair
|
||||
|
||||
template<class _Tuple,
|
||||
class = typename enable_if<__tuple_convertible<_Tuple, pair>::value>::type>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
pair(_Tuple&& __p)
|
||||
: first(_VSTD::forward<typename tuple_element<0,
|
||||
typename __make_tuple_types<_Tuple>::type>::type>(get<0>(__p))),
|
||||
@@ -355,7 +398,7 @@ private:
|
||||
};
|
||||
|
||||
template <class _T1, class _T2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
bool
|
||||
operator==(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y)
|
||||
{
|
||||
@@ -363,7 +406,7 @@ operator==(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y)
|
||||
}
|
||||
|
||||
template <class _T1, class _T2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
bool
|
||||
operator!=(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y)
|
||||
{
|
||||
@@ -371,7 +414,7 @@ operator!=(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y)
|
||||
}
|
||||
|
||||
template <class _T1, class _T2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
bool
|
||||
operator< (const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y)
|
||||
{
|
||||
@@ -379,7 +422,7 @@ operator< (const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y)
|
||||
}
|
||||
|
||||
template <class _T1, class _T2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
bool
|
||||
operator> (const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y)
|
||||
{
|
||||
@@ -387,7 +430,7 @@ operator> (const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y)
|
||||
}
|
||||
|
||||
template <class _T1, class _T2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
bool
|
||||
operator>=(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y)
|
||||
{
|
||||
@@ -395,7 +438,7 @@ operator>=(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y)
|
||||
}
|
||||
|
||||
template <class _T1, class _T2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
bool
|
||||
operator<=(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y)
|
||||
{
|
||||
@@ -419,7 +462,7 @@ swap(pair<_T1, _T2>& __x, pair<_T1, _T2>& __y)
|
||||
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
|
||||
template <class _Tp> class _LIBCPP_VISIBLE reference_wrapper;
|
||||
template <class _Tp> class _LIBCPP_TYPE_VIS_ONLY reference_wrapper;
|
||||
|
||||
template <class _Tp>
|
||||
struct ___make_pair_return
|
||||
@@ -440,7 +483,7 @@ struct __make_pair_return
|
||||
};
|
||||
|
||||
template <class _T1, class _T2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
pair<typename __make_pair_return<_T1>::type, typename __make_pair_return<_T2>::type>
|
||||
make_pair(_T1&& __t1, _T2&& __t2)
|
||||
{
|
||||
@@ -461,36 +504,36 @@ make_pair(_T1 __x, _T2 __y)
|
||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
|
||||
template <class _T1, class _T2>
|
||||
class _LIBCPP_VISIBLE tuple_size<pair<_T1, _T2> >
|
||||
class _LIBCPP_TYPE_VIS_ONLY tuple_size<pair<_T1, _T2> >
|
||||
: public integral_constant<size_t, 2> {};
|
||||
|
||||
template <class _T1, class _T2>
|
||||
class _LIBCPP_VISIBLE tuple_size<const pair<_T1, _T2> >
|
||||
class _LIBCPP_TYPE_VIS_ONLY tuple_size<const pair<_T1, _T2> >
|
||||
: public integral_constant<size_t, 2> {};
|
||||
|
||||
template <class _T1, class _T2>
|
||||
class _LIBCPP_VISIBLE tuple_element<0, pair<_T1, _T2> >
|
||||
class _LIBCPP_TYPE_VIS_ONLY tuple_element<0, pair<_T1, _T2> >
|
||||
{
|
||||
public:
|
||||
typedef _T1 type;
|
||||
};
|
||||
|
||||
template <class _T1, class _T2>
|
||||
class _LIBCPP_VISIBLE tuple_element<1, pair<_T1, _T2> >
|
||||
class _LIBCPP_TYPE_VIS_ONLY tuple_element<1, pair<_T1, _T2> >
|
||||
{
|
||||
public:
|
||||
typedef _T2 type;
|
||||
};
|
||||
|
||||
template <class _T1, class _T2>
|
||||
class _LIBCPP_VISIBLE tuple_element<0, const pair<_T1, _T2> >
|
||||
class _LIBCPP_TYPE_VIS_ONLY tuple_element<0, const pair<_T1, _T2> >
|
||||
{
|
||||
public:
|
||||
typedef const _T1 type;
|
||||
};
|
||||
|
||||
template <class _T1, class _T2>
|
||||
class _LIBCPP_VISIBLE tuple_element<1, const pair<_T1, _T2> >
|
||||
class _LIBCPP_TYPE_VIS_ONLY tuple_element<1, const pair<_T1, _T2> >
|
||||
{
|
||||
public:
|
||||
typedef const _T2 type;
|
||||
@@ -503,13 +546,13 @@ struct __get_pair<0>
|
||||
{
|
||||
template <class _T1, class _T2>
|
||||
static
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_T1&
|
||||
get(pair<_T1, _T2>& __p) _NOEXCEPT {return __p.first;}
|
||||
|
||||
template <class _T1, class _T2>
|
||||
static
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
const _T1&
|
||||
get(const pair<_T1, _T2>& __p) _NOEXCEPT {return __p.first;}
|
||||
|
||||
@@ -517,7 +560,7 @@ struct __get_pair<0>
|
||||
|
||||
template <class _T1, class _T2>
|
||||
static
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_T1&&
|
||||
get(pair<_T1, _T2>&& __p) _NOEXCEPT {return _VSTD::forward<_T1>(__p.first);}
|
||||
|
||||
@@ -529,13 +572,13 @@ struct __get_pair<1>
|
||||
{
|
||||
template <class _T1, class _T2>
|
||||
static
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_T2&
|
||||
get(pair<_T1, _T2>& __p) _NOEXCEPT {return __p.second;}
|
||||
|
||||
template <class _T1, class _T2>
|
||||
static
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
const _T2&
|
||||
get(const pair<_T1, _T2>& __p) _NOEXCEPT {return __p.second;}
|
||||
|
||||
@@ -543,7 +586,7 @@ struct __get_pair<1>
|
||||
|
||||
template <class _T1, class _T2>
|
||||
static
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_T2&&
|
||||
get(pair<_T1, _T2>&& __p) _NOEXCEPT {return _VSTD::forward<_T2>(__p.second);}
|
||||
|
||||
@@ -551,7 +594,7 @@ struct __get_pair<1>
|
||||
};
|
||||
|
||||
template <size_t _Ip, class _T1, class _T2>
|
||||
_LIBCPP_INLINE_VISIBILITY inline
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
typename tuple_element<_Ip, pair<_T1, _T2> >::type&
|
||||
get(pair<_T1, _T2>& __p) _NOEXCEPT
|
||||
{
|
||||
@@ -559,7 +602,7 @@ get(pair<_T1, _T2>& __p) _NOEXCEPT
|
||||
}
|
||||
|
||||
template <size_t _Ip, class _T1, class _T2>
|
||||
_LIBCPP_INLINE_VISIBILITY inline
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
const typename tuple_element<_Ip, pair<_T1, _T2> >::type&
|
||||
get(const pair<_T1, _T2>& __p) _NOEXCEPT
|
||||
{
|
||||
@@ -569,7 +612,7 @@ get(const pair<_T1, _T2>& __p) _NOEXCEPT
|
||||
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
|
||||
template <size_t _Ip, class _T1, class _T2>
|
||||
_LIBCPP_INLINE_VISIBILITY inline
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
typename tuple_element<_Ip, pair<_T1, _T2> >::type&&
|
||||
get(pair<_T1, _T2>&& __p) _NOEXCEPT
|
||||
{
|
||||
@@ -578,6 +621,148 @@ get(pair<_T1, _T2>&& __p) _NOEXCEPT
|
||||
|
||||
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
||||
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
template <class _T1, class _T2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
constexpr _T1 & get(pair<_T1, _T2>& __p) _NOEXCEPT
|
||||
{
|
||||
return __get_pair<0>::get(__p);
|
||||
}
|
||||
|
||||
template <class _T1, class _T2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
constexpr _T1 const & get(pair<_T1, _T2> const& __p) _NOEXCEPT
|
||||
{
|
||||
return __get_pair<0>::get(__p);
|
||||
}
|
||||
|
||||
template <class _T1, class _T2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
constexpr _T1 && get(pair<_T1, _T2>&& __p) _NOEXCEPT
|
||||
{
|
||||
return __get_pair<0>::get(_VSTD::move(__p));
|
||||
}
|
||||
|
||||
template <class _T1, class _T2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
constexpr _T1 & get(pair<_T2, _T1>& __p) _NOEXCEPT
|
||||
{
|
||||
return __get_pair<1>::get(__p);
|
||||
}
|
||||
|
||||
template <class _T1, class _T2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
constexpr _T1 const & get(pair<_T2, _T1> const& __p) _NOEXCEPT
|
||||
{
|
||||
return __get_pair<1>::get(__p);
|
||||
}
|
||||
|
||||
template <class _T1, class _T2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
constexpr _T1 && get(pair<_T2, _T1>&& __p) _NOEXCEPT
|
||||
{
|
||||
return __get_pair<1>::get(_VSTD::move(__p));
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
|
||||
template<class _Tp, _Tp... _Ip>
|
||||
struct _LIBCPP_TYPE_VIS_ONLY integer_sequence
|
||||
{
|
||||
typedef _Tp value_type;
|
||||
static_assert( is_integral<_Tp>::value,
|
||||
"std::integer_sequence can only be instantiated with an integral type" );
|
||||
static
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
constexpr
|
||||
size_t
|
||||
size() noexcept { return sizeof...(_Ip); }
|
||||
};
|
||||
|
||||
template<size_t... _Ip>
|
||||
using index_sequence = integer_sequence<size_t, _Ip...>;
|
||||
|
||||
namespace __detail {
|
||||
|
||||
template<typename _Tp, size_t ..._Extra> struct __repeat;
|
||||
template<typename _Tp, _Tp ..._Np, size_t ..._Extra> struct __repeat<integer_sequence<_Tp, _Np...>, _Extra...> {
|
||||
typedef integer_sequence<_Tp,
|
||||
_Np...,
|
||||
sizeof...(_Np) + _Np...,
|
||||
2 * sizeof...(_Np) + _Np...,
|
||||
3 * sizeof...(_Np) + _Np...,
|
||||
4 * sizeof...(_Np) + _Np...,
|
||||
5 * sizeof...(_Np) + _Np...,
|
||||
6 * sizeof...(_Np) + _Np...,
|
||||
7 * sizeof...(_Np) + _Np...,
|
||||
_Extra...> type;
|
||||
};
|
||||
|
||||
template<size_t _Np> struct __parity;
|
||||
template<size_t _Np> struct __make : __parity<_Np % 8>::template __pmake<_Np> {};
|
||||
|
||||
template<> struct __make<0> { typedef integer_sequence<size_t> type; };
|
||||
template<> struct __make<1> { typedef integer_sequence<size_t, 0> type; };
|
||||
template<> struct __make<2> { typedef integer_sequence<size_t, 0, 1> type; };
|
||||
template<> struct __make<3> { typedef integer_sequence<size_t, 0, 1, 2> type; };
|
||||
template<> struct __make<4> { typedef integer_sequence<size_t, 0, 1, 2, 3> type; };
|
||||
template<> struct __make<5> { typedef integer_sequence<size_t, 0, 1, 2, 3, 4> type; };
|
||||
template<> struct __make<6> { typedef integer_sequence<size_t, 0, 1, 2, 3, 4, 5> type; };
|
||||
template<> struct __make<7> { typedef integer_sequence<size_t, 0, 1, 2, 3, 4, 5, 6> type; };
|
||||
|
||||
template<> struct __parity<0> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type> {}; };
|
||||
template<> struct __parity<1> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 1> {}; };
|
||||
template<> struct __parity<2> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 2, _Np - 1> {}; };
|
||||
template<> struct __parity<3> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 3, _Np - 2, _Np - 1> {}; };
|
||||
template<> struct __parity<4> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; };
|
||||
template<> struct __parity<5> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 5, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; };
|
||||
template<> struct __parity<6> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 6, _Np - 5, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; };
|
||||
template<> struct __parity<7> { template<size_t _Np> struct __pmake : __repeat<typename __make<_Np / 8>::type, _Np - 7, _Np - 6, _Np - 5, _Np - 4, _Np - 3, _Np - 2, _Np - 1> {}; };
|
||||
|
||||
template<typename _Tp, typename _Up> struct __convert {
|
||||
template<typename> struct __result;
|
||||
template<_Tp ..._Np> struct __result<integer_sequence<_Tp, _Np...> > { typedef integer_sequence<_Up, _Np...> type; };
|
||||
};
|
||||
template<typename _Tp> struct __convert<_Tp, _Tp> { template<typename _Up> struct __result { typedef _Up type; }; };
|
||||
|
||||
}
|
||||
|
||||
template<typename _Tp, _Tp _Np> using __make_integer_sequence_unchecked =
|
||||
typename __detail::__convert<size_t, _Tp>::template __result<typename __detail::__make<_Np>::type>::type;
|
||||
|
||||
template <class _Tp, _Tp _Ep>
|
||||
struct __make_integer_sequence
|
||||
{
|
||||
static_assert(is_integral<_Tp>::value,
|
||||
"std::make_integer_sequence can only be instantiated with an integral type" );
|
||||
static_assert(0 <= _Ep, "std::make_integer_sequence input shall not be negative");
|
||||
typedef __make_integer_sequence_unchecked<_Tp, _Ep> type;
|
||||
};
|
||||
|
||||
template<class _Tp, _Tp _Np>
|
||||
using make_integer_sequence = typename __make_integer_sequence<_Tp, _Np>::type;
|
||||
|
||||
template<size_t _Np>
|
||||
using make_index_sequence = make_integer_sequence<size_t, _Np>;
|
||||
|
||||
template<class... _Tp>
|
||||
using index_sequence_for = make_index_sequence<sizeof...(_Tp)>;
|
||||
|
||||
#endif // _LIBCPP_STD_VER > 11
|
||||
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
template<class _T1, class _T2 = _T1>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_T1 exchange(_T1& __obj, _T2 && __new_value)
|
||||
{
|
||||
_T1 __old_value = _VSTD::move(__obj);
|
||||
__obj = _VSTD::forward<_T2>(__new_value);
|
||||
return __old_value;
|
||||
}
|
||||
#endif // _LIBCPP_STD_VER > 11
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP_UTILITY
|
||||
|
||||
@@ -354,9 +354,9 @@ template <class T> unspecified2 end(const valarray<T>& v);
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template<class _Tp> class _LIBCPP_VISIBLE valarray;
|
||||
template<class _Tp> class _LIBCPP_TYPE_VIS_ONLY valarray;
|
||||
|
||||
class _LIBCPP_VISIBLE slice
|
||||
class _LIBCPP_TYPE_VIS_ONLY slice
|
||||
{
|
||||
size_t __start_;
|
||||
size_t __size_;
|
||||
@@ -381,11 +381,11 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY size_t stride() const {return __stride_;}
|
||||
};
|
||||
|
||||
template <class _Tp> class _LIBCPP_VISIBLE slice_array;
|
||||
class _LIBCPP_VISIBLE gslice;
|
||||
template <class _Tp> class _LIBCPP_VISIBLE gslice_array;
|
||||
template <class _Tp> class _LIBCPP_VISIBLE mask_array;
|
||||
template <class _Tp> class _LIBCPP_VISIBLE indirect_array;
|
||||
template <class _Tp> class _LIBCPP_TYPE_VIS_ONLY slice_array;
|
||||
class _LIBCPP_TYPE_VIS gslice;
|
||||
template <class _Tp> class _LIBCPP_TYPE_VIS_ONLY gslice_array;
|
||||
template <class _Tp> class _LIBCPP_TYPE_VIS_ONLY mask_array;
|
||||
template <class _Tp> class _LIBCPP_TYPE_VIS_ONLY indirect_array;
|
||||
|
||||
template <class _Tp>
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
@@ -671,7 +671,7 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
size_t size() const {return __size_;}
|
||||
|
||||
template <class> friend class _LIBCPP_VISIBLE valarray;
|
||||
template <class> friend class _LIBCPP_TYPE_VIS_ONLY valarray;
|
||||
};
|
||||
|
||||
template <class _ValExpr>
|
||||
@@ -786,7 +786,7 @@ template<class _Tp>
|
||||
struct __is_val_expr<valarray<_Tp> > : true_type {};
|
||||
|
||||
template<class _Tp>
|
||||
class _LIBCPP_VISIBLE valarray
|
||||
class _LIBCPP_TYPE_VIS_ONLY valarray
|
||||
{
|
||||
public:
|
||||
typedef _Tp value_type;
|
||||
@@ -976,12 +976,12 @@ public:
|
||||
void resize(size_t __n, value_type __x = value_type());
|
||||
|
||||
private:
|
||||
template <class> friend class _LIBCPP_VISIBLE valarray;
|
||||
template <class> friend class _LIBCPP_VISIBLE slice_array;
|
||||
template <class> friend class _LIBCPP_VISIBLE gslice_array;
|
||||
template <class> friend class _LIBCPP_VISIBLE mask_array;
|
||||
template <class> friend class _LIBCPP_TYPE_VIS_ONLY valarray;
|
||||
template <class> friend class _LIBCPP_TYPE_VIS_ONLY slice_array;
|
||||
template <class> friend class _LIBCPP_TYPE_VIS_ONLY gslice_array;
|
||||
template <class> friend class _LIBCPP_TYPE_VIS_ONLY mask_array;
|
||||
template <class> friend class __mask_expr;
|
||||
template <class> friend class _LIBCPP_VISIBLE indirect_array;
|
||||
template <class> friend class _LIBCPP_TYPE_VIS_ONLY indirect_array;
|
||||
template <class> friend class __indirect_expr;
|
||||
template <class> friend class __val_expr;
|
||||
|
||||
@@ -1006,6 +1006,10 @@ private:
|
||||
end(const valarray<_Up>& __v);
|
||||
};
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS valarray<size_t>::valarray(size_t))
|
||||
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS valarray<size_t>::~valarray())
|
||||
_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void valarray<size_t>::resize(size_t, size_t))
|
||||
|
||||
template <class _Op, class _Tp>
|
||||
struct _UnaryOp<_Op, valarray<_Tp> >
|
||||
{
|
||||
@@ -1091,7 +1095,7 @@ struct _BinaryOp<_Op, valarray<_Tp>, valarray<_Tp> >
|
||||
// slice_array
|
||||
|
||||
template <class _Tp>
|
||||
class _LIBCPP_VISIBLE slice_array
|
||||
class _LIBCPP_TYPE_VIS_ONLY slice_array
|
||||
{
|
||||
public:
|
||||
typedef _Tp value_type;
|
||||
@@ -1394,7 +1398,7 @@ slice_array<_Tp>::operator=(const value_type& __x) const
|
||||
|
||||
// gslice
|
||||
|
||||
class _LIBCPP_VISIBLE gslice
|
||||
class _LIBCPP_TYPE_VIS gslice
|
||||
{
|
||||
valarray<size_t> __size_;
|
||||
valarray<size_t> __stride_;
|
||||
@@ -1461,7 +1465,7 @@ private:
|
||||
// gslice_array
|
||||
|
||||
template <class _Tp>
|
||||
class _LIBCPP_VISIBLE gslice_array
|
||||
class _LIBCPP_TYPE_VIS_ONLY gslice_array
|
||||
{
|
||||
public:
|
||||
typedef _Tp value_type;
|
||||
@@ -1790,7 +1794,7 @@ gslice_array<_Tp>::operator=(const value_type& __x) const
|
||||
// mask_array
|
||||
|
||||
template <class _Tp>
|
||||
class _LIBCPP_VISIBLE mask_array
|
||||
class _LIBCPP_TYPE_VIS_ONLY mask_array
|
||||
{
|
||||
public:
|
||||
typedef _Tp value_type;
|
||||
@@ -2134,7 +2138,7 @@ public:
|
||||
// indirect_array
|
||||
|
||||
template <class _Tp>
|
||||
class _LIBCPP_VISIBLE indirect_array
|
||||
class _LIBCPP_TYPE_VIS_ONLY indirect_array
|
||||
{
|
||||
public:
|
||||
typedef _Tp value_type;
|
||||
@@ -2485,7 +2489,7 @@ public:
|
||||
_LIBCPP_INLINE_VISIBILITY
|
||||
size_t size() const {return __1d_.size();}
|
||||
|
||||
template <class> friend class _LIBCPP_VISIBLE valarray;
|
||||
template <class> friend class _LIBCPP_TYPE_VIS_ONLY valarray;
|
||||
};
|
||||
|
||||
template<class _ValExpr>
|
||||
@@ -2624,7 +2628,7 @@ public:
|
||||
};
|
||||
|
||||
template<class _ValExpr>
|
||||
__val_expr<_ValExpr>::operator valarray<result_type>() const
|
||||
__val_expr<_ValExpr>::operator valarray<__val_expr::result_type>() const
|
||||
{
|
||||
valarray<result_type> __r;
|
||||
size_t __n = __expr_.size();
|
||||
@@ -4770,10 +4774,6 @@ end(const valarray<_Tp>& __v)
|
||||
return __v.__end_;
|
||||
}
|
||||
|
||||
_LIBCPP_EXTERN_TEMPLATE(valarray<size_t>::valarray(size_t))
|
||||
_LIBCPP_EXTERN_TEMPLATE(valarray<size_t>::~valarray())
|
||||
_LIBCPP_EXTERN_TEMPLATE(void valarray<size_t>::resize(size_t, size_t))
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP_VALARRAY
|
||||
|
||||
395
include/vector
395
include/vector
File diff suppressed because it is too large
Load Diff
@@ -31,7 +31,12 @@ else()
|
||||
)
|
||||
endif()
|
||||
|
||||
if (DEFINED LIBCXX_CXX_ABI_DEPS)
|
||||
add_dependencies(cxx ${LIBCXX_CXX_ABI_DEPS})
|
||||
endif()
|
||||
|
||||
# Generate library list.
|
||||
set(libraries ${LIBCXX_CXX_ABI_LIBRARIES})
|
||||
append_if(libraries LIBCXX_HAS_PTHREAD_LIB pthread)
|
||||
append_if(libraries LIBCXX_HAS_C_LIB c)
|
||||
append_if(libraries LIBCXX_HAS_M_LIB m)
|
||||
@@ -44,6 +49,43 @@ target_link_libraries(cxx ${libraries})
|
||||
append_if(compile_flags LIBCXX_HAS_FPIC_FLAG -fPIC)
|
||||
append_if(link_flags LIBCXX_HAS_NODEFAULTLIBS_FLAG -nodefaultlibs)
|
||||
|
||||
if ( APPLE )
|
||||
if ( CMAKE_OSX_DEPLOYMENT_TARGET STREQUAL "10.6" )
|
||||
list(APPEND compile_flags "-U__STRICT_ANSI__")
|
||||
list(APPEND link_flags
|
||||
"-compatibility_version 1"
|
||||
"-current_version ${LIBCXX_VERSION}"
|
||||
"-install_name /usr/lib/libc++.1.dylib"
|
||||
"-Wl,-reexport_library,/usr/lib/libc++abi.dylib"
|
||||
"-Wl,-unexported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/libc++unexp.exp"
|
||||
"/usr/lib/libSystem.B.dylib")
|
||||
else()
|
||||
if ( ${CMAKE_OSX_SYSROOT} )
|
||||
list(FIND ${CMAKE_OSX_ARCHITECTURES} "armv7" OSX_HAS_ARMV7)
|
||||
if (OSX_HAS_ARMV7)
|
||||
set(OSX_RE_EXPORT_LINE
|
||||
"${CMAKE_OSX_SYSROOT}/usr/lib/libc++abi.dylib"
|
||||
"-Wl,-reexported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/libc++sjlj-abi.exp")
|
||||
else()
|
||||
set(OSX_RE_EXPORT_LINE
|
||||
"-Wl,-reexport_library,${CMAKE_OSX_SYSROOT}/usr/lib/libc++abi.dylib")
|
||||
endif()
|
||||
else()
|
||||
set (OSX_RE_EXPORT_LINE "/usr/lib/libc++abi.dylib -Wl,-reexported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/libc++abi${LIBCXX_LIBCPPABI_VERSION}.exp")
|
||||
endif()
|
||||
|
||||
list(APPEND link_flags
|
||||
"-compatibility_version 1"
|
||||
"-install_name /usr/lib/libc++.1.dylib"
|
||||
"-Wl,-unexported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/libc++unexp.exp"
|
||||
"${OSX_RE_EXPORT_LINE}"
|
||||
"-Wl,-force_symbols_not_weak_list,${CMAKE_CURRENT_SOURCE_DIR}/notweak.exp"
|
||||
"-Wl,-force_symbols_weak_list,${CMAKE_CURRENT_SOURCE_DIR}/weak.exp")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
string(REPLACE ";" " " link_flags "${link_flags}")
|
||||
|
||||
set_target_properties(cxx
|
||||
PROPERTIES
|
||||
COMPILE_FLAGS "${compile_flags}"
|
||||
@@ -57,10 +99,3 @@ install(TARGETS cxx
|
||||
LIBRARY DESTINATION lib
|
||||
ARCHIVE DESTINATION lib
|
||||
)
|
||||
|
||||
install(DIRECTORY ../include/
|
||||
DESTINATION include/c++/v1
|
||||
FILES_MATCHING
|
||||
PATTERN "*"
|
||||
PATTERN ".svn" EXCLUDE
|
||||
)
|
||||
|
||||
153
lib/buildit
153
lib/buildit
@@ -8,13 +8,13 @@ set -e
|
||||
|
||||
if [ `basename $(pwd)` != "lib" ]
|
||||
then
|
||||
echo "current directory must be lib"
|
||||
exit 1
|
||||
echo "current directory must be lib"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$CXX" ]
|
||||
then
|
||||
CXX=clang++
|
||||
CXX=clang++
|
||||
fi
|
||||
|
||||
if [ -z "$CC" ]
|
||||
@@ -22,22 +22,21 @@ then
|
||||
CC=clang
|
||||
fi
|
||||
|
||||
if [ -z $MACOSX_DEPLOYMENT_TARGET ]
|
||||
if [ -z "$MACOSX_DEPLOYMENT_TARGET" ]
|
||||
then
|
||||
if [ -z $IPHONEOS_DEPLOYMENT_TARGET ]
|
||||
then
|
||||
MACOSX_DEPLOYMENT_TARGET=10.7
|
||||
fi
|
||||
if [ -z "$IPHONEOS_DEPLOYMENT_TARGET" ]
|
||||
then
|
||||
MACOSX_DEPLOYMENT_TARGET=10.7
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z $RC_ProjectSourceVersion ]
|
||||
if [ -z "$RC_ProjectSourceVersion" ]
|
||||
then
|
||||
RC_ProjectSourceVersion=1
|
||||
fi
|
||||
|
||||
EXTRA_FLAGS="-std=c++0x -fstrict-aliasing -Wall -Wextra -Wshadow -Wconversion \
|
||||
-Wnewline-eof -Wpadded -Wmissing-prototypes -Wstrict-aliasing=2 \
|
||||
-Wstrict-overflow=4"
|
||||
EXTRA_FLAGS="-nostdinc++ -std=c++11 -fstrict-aliasing -Wall -Wextra -Wshadow -Wconversion \
|
||||
-Wpadded -Wstrict-aliasing=2 -Wstrict-overflow=4 "
|
||||
|
||||
case $TRIPLE in
|
||||
*-apple-*)
|
||||
@@ -46,41 +45,49 @@ case $TRIPLE in
|
||||
RC_CFLAGS="-arch i386 -arch x86_64"
|
||||
fi
|
||||
SOEXT=dylib
|
||||
if [ "$MACOSX_DEPLOYMENT_TARGET" == "10.6" ]
|
||||
then
|
||||
EXTRA_FLAGS="-std=c++0x -U__STRICT_ANSI__"
|
||||
LDSHARED_FLAGS="-o libc++.1.dylib \
|
||||
-dynamiclib -nodefaultlibs -current_version 1 \
|
||||
-compatibility_version 1 \
|
||||
-install_name /usr/lib/libc++.1.dylib \
|
||||
-Wl,-reexport_library,/usr/lib/libc++abi.dylib \
|
||||
-Wl,-unexported_symbols_list,libc++unexp.exp \
|
||||
/usr/lib/libSystem.B.dylib"
|
||||
else
|
||||
RE_EXPORT_LINE="/usr/lib/libc++abi.dylib -Wl,-reexported_symbols_list,libc++abi.exp"
|
||||
if [ -n "$SDKROOT" ]
|
||||
then
|
||||
EXTRA_FLAGS+="-isysroot ${SDKROOT}"
|
||||
if echo "${RC_ARCHS}" | grep -q "armv7"
|
||||
then
|
||||
RE_EXPORT_LINE="${SDKROOT}/usr/lib/libc++abi.dylib -Wl,-reexported_symbols_list,libc++sjlj-abi.exp"
|
||||
else
|
||||
RE_EXPORT_LINE="-Wl,-reexport_library,${SDKROOT}/usr/lib/libc++abi.dylib"
|
||||
fi
|
||||
CXX=`xcrun -sdk "${SDKROOT}" -find clang++`
|
||||
CC=`xcrun -sdk "${SDKROOT}" -find clang`
|
||||
fi
|
||||
LDSHARED_FLAGS="-o libc++.1.dylib \
|
||||
-dynamiclib -nodefaultlibs \
|
||||
-current_version ${RC_ProjectSourceVersion} \
|
||||
-compatibility_version 1 \
|
||||
-install_name /usr/lib/libc++.1.dylib \
|
||||
-lSystem \
|
||||
-Wl,-unexported_symbols_list,libc++unexp.exp \
|
||||
${RE_EXPORT_LINE} \
|
||||
-Wl,-force_symbols_not_weak_list,notweak.exp \
|
||||
-Wl,-force_symbols_weak_list,weak.exp"
|
||||
fi
|
||||
if [ "$MACOSX_DEPLOYMENT_TARGET" == "10.6" ]
|
||||
then
|
||||
EXTRA_FLAGS="-nostdinc++ -std=c++11 -U__STRICT_ANSI__"
|
||||
LDSHARED_FLAGS="-o libc++.1.dylib \
|
||||
-dynamiclib -nodefaultlibs -current_version 1 \
|
||||
-compatibility_version 1 \
|
||||
-install_name /usr/lib/libc++.1.dylib \
|
||||
-Wl,-reexport_library,/usr/lib/libc++abi.dylib \
|
||||
-Wl,-unexported_symbols_list,libc++unexp.exp \
|
||||
/usr/lib/libSystem.B.dylib"
|
||||
else
|
||||
if [ -n "$SDKROOT" ]
|
||||
then
|
||||
EXTRA_FLAGS+="-nostdinc++ -isysroot ${SDKROOT}"
|
||||
if echo "${RC_ARCHS}" | grep -q "armv7"
|
||||
then
|
||||
RE_EXPORT_LINE="${SDKROOT}/usr/lib/libc++abi.dylib -Wl,-reexported_symbols_list,libc++sjlj-abi.exp"
|
||||
else
|
||||
RE_EXPORT_LINE="-Wl,-reexport_library,${SDKROOT}/usr/lib/libc++abi.dylib"
|
||||
fi
|
||||
CXX=`xcrun -sdk "${SDKROOT}" -find clang++`
|
||||
CC=`xcrun -sdk "${SDKROOT}" -find clang`
|
||||
else
|
||||
# Check if we have _LIBCPPABI_VERSION, to determine the reexport list to use.
|
||||
if (echo "#include <cxxabi.h>" | $CXX -E -dM -x c++ - | \
|
||||
grep _LIBCPPABI_VERSION > /dev/null)
|
||||
then
|
||||
RE_EXPORT_LINE="/usr/lib/libc++abi.dylib -Wl,-reexported_symbols_list,libc++abi2.exp"
|
||||
else
|
||||
RE_EXPORT_LINE="/usr/lib/libc++abi.dylib -Wl,-reexported_symbols_list,libc++abi.exp"
|
||||
fi
|
||||
fi
|
||||
LDSHARED_FLAGS="-o libc++.1.dylib \
|
||||
-dynamiclib -nodefaultlibs \
|
||||
-current_version ${RC_ProjectSourceVersion} \
|
||||
-compatibility_version 1 \
|
||||
-install_name /usr/lib/libc++.1.dylib \
|
||||
-lSystem \
|
||||
-Wl,-unexported_symbols_list,libc++unexp.exp \
|
||||
${RE_EXPORT_LINE} \
|
||||
-Wl,-force_symbols_not_weak_list,notweak.exp \
|
||||
-Wl,-force_symbols_weak_list,weak.exp"
|
||||
fi
|
||||
;;
|
||||
*-*-mingw*)
|
||||
# FIXME: removing libgcc and libsupc++ dependencies means porting libcxxrt and LLVM/compiler-rt
|
||||
@@ -88,7 +95,24 @@ case $TRIPLE in
|
||||
LDSHARED_FLAGS="-o libc++.dll \
|
||||
-shared -nodefaultlibs -Wl,--export-all-symbols -Wl,--allow-multiple-definition -Wl,--out-implib,libc++.dll.a \
|
||||
-lsupc++ -lpthread -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcr100 -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt"
|
||||
;;
|
||||
;;
|
||||
*-ibm-*)
|
||||
hostOS=`uname`
|
||||
hostOS=`echo $hostOS | sed -e "s/\s+$//"`
|
||||
hostOS=`echo $hostOS | tr '[A-Z]' '[a-z]'`
|
||||
|
||||
if [ $hostOS == "linux" ]
|
||||
then
|
||||
LDSHARED_FLAGS="-o libc++.so.1 \
|
||||
-qmkshrobj -Wl,-soname,libc++.so.1 \
|
||||
-lpthread -lrt -lc -lstdc++"
|
||||
EXTRA_FLAGS="-qlanglvl=extended0x -D__GLIBCXX__=1"
|
||||
else
|
||||
LDSHARED_FLAGS="-o shr.o -qmkshrobj -lpthread -bnoquiet"
|
||||
EXTRA_FLAGS="-qlanglvl=extended0x"
|
||||
fi
|
||||
RC_CFLAGS="-qpic=large"
|
||||
;;
|
||||
*)
|
||||
RC_CFLAGS="-fPIC"
|
||||
SOEXT=so
|
||||
@@ -98,7 +122,7 @@ case $TRIPLE in
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ -z $RC_XBS ]
|
||||
if [ -z "$RC_XBS" ]
|
||||
then
|
||||
rm -f libc++.1.$SOEXT*
|
||||
fi
|
||||
@@ -106,12 +130,12 @@ fi
|
||||
set -x
|
||||
|
||||
for FILE in ../src/*.cpp; do
|
||||
$CXX -c -g -Os $RC_CFLAGS $EXTRA_FLAGS -nostdinc++ -I../include $FILE
|
||||
$CXX -c -g -Os $RC_CFLAGS $EXTRA_FLAGS -I../include $FILE
|
||||
done
|
||||
case $TRIPLE in
|
||||
*-*-mingw*)
|
||||
for FILE in ../src/support/win32/*.cpp; do
|
||||
$CXX -c -g -Os $RC_CFLAGS $EXTRA_FLAGS -nostdinc++ -I../include $FILE
|
||||
$CXX -c -g -Os $RC_CFLAGS $EXTRA_FLAGS -I../include $FILE
|
||||
done
|
||||
;;
|
||||
esac
|
||||
@@ -119,7 +143,32 @@ $CC *.o $RC_CFLAGS $LDSHARED_FLAGS $EXTRA_FLAGS
|
||||
|
||||
#libtool -static -o libc++.a *.o
|
||||
|
||||
if [ -z $RC_XBS ]
|
||||
# Create the link for the final library name, so that we can use this directory
|
||||
# as a link target for the tests.
|
||||
case $TRIPLE in
|
||||
*-apple-*)
|
||||
rm -f libc++.dylib
|
||||
ln -s libc++.1.dylib libc++.dylib
|
||||
;;
|
||||
*-*-mingw*)
|
||||
;;
|
||||
*-ibm-*)
|
||||
if [ $hostOS == "linux" ]
|
||||
then
|
||||
rm -f libc++.so
|
||||
ln -s libc++.so.1 libc++.so
|
||||
else #AIX
|
||||
rm -f libc++.a
|
||||
ar r libc++.a shr.o
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
rm -f libc++.so
|
||||
ln -s libc++.so.1 libc++.so
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ -z "$RC_XBS" ]
|
||||
then
|
||||
rm *.o
|
||||
fi
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#define _LIBCPP_EXTERN_TEMPLATE(...) extern template __VA_ARGS__;
|
||||
#include "algorithm"
|
||||
#include "random"
|
||||
#include "mutex"
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
#include "chrono"
|
||||
#include <sys/time.h> //for gettimeofday and timeval
|
||||
#if __APPLE__
|
||||
#ifdef __APPLE__
|
||||
#include <mach/mach_time.h> // mach_absolute_time, mach_timebase_info_data_t
|
||||
#else /* !__APPLE__ */
|
||||
#include <cerrno> // errno
|
||||
@@ -50,7 +50,7 @@ system_clock::from_time_t(time_t t) _NOEXCEPT
|
||||
|
||||
const bool steady_clock::is_steady;
|
||||
|
||||
#if __APPLE__
|
||||
#ifdef __APPLE__
|
||||
// mach_absolute_time() * MachInfo.numer / MachInfo.denom is the number of
|
||||
// nanoseconds since the computer booted up. MachInfo.numer and MachInfo.denom
|
||||
// are run time constants supplied by the OS. This clock has no relationship
|
||||
|
||||
134
src/debug.cpp
134
src/debug.cpp
@@ -7,7 +7,7 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#define _LIBCPP_DEBUG2 1
|
||||
#define _LIBCPP_DEBUG 1
|
||||
#include "__config"
|
||||
#include "__debug"
|
||||
#include "functional"
|
||||
@@ -17,15 +17,15 @@
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
_LIBCPP_VISIBLE
|
||||
_LIBCPP_FUNC_VIS
|
||||
__libcpp_db*
|
||||
__get_db()
|
||||
{
|
||||
static __libcpp_db db;
|
||||
return &db;
|
||||
};
|
||||
}
|
||||
|
||||
_LIBCPP_VISIBLE
|
||||
_LIBCPP_FUNC_VIS
|
||||
const __libcpp_db*
|
||||
__get_const_db()
|
||||
{
|
||||
@@ -110,8 +110,7 @@ __libcpp_db::__find_c_from_i(void* __i) const
|
||||
{
|
||||
RLock _(mut());
|
||||
__i_node* i = __find_iterator(__i);
|
||||
_LIBCPP_ASSERT(i != nullptr, "iterator constructed in translation unit with debug mode not enabled."
|
||||
" #define _LIBCPP_DEBUG2 1 for that translation unit.");
|
||||
_LIBCPP_ASSERT(i != nullptr, "iterator not found in debug database.");
|
||||
return i->__c_ != nullptr ? i->__c_->__c_ : nullptr;
|
||||
}
|
||||
|
||||
@@ -119,20 +118,19 @@ void
|
||||
__libcpp_db::__insert_ic(void* __i, const void* __c)
|
||||
{
|
||||
WLock _(mut());
|
||||
__i_node* i = __insert_iterator(__i);
|
||||
const char* errmsg =
|
||||
"Container constructed in a translation unit with debug mode disabled."
|
||||
" But it is being used in a translation unit with debug mode enabled."
|
||||
" Enable it in the other translation unit with #define _LIBCPP_DEBUG2 1";
|
||||
_LIBCPP_ASSERT(__cbeg_ != __cend_, errmsg);
|
||||
if (__cbeg_ == __cend_)
|
||||
return;
|
||||
size_t hc = hash<const void*>()(__c) % static_cast<size_t>(__cend_ - __cbeg_);
|
||||
__c_node* c = __cbeg_[hc];
|
||||
_LIBCPP_ASSERT(c != nullptr, errmsg);
|
||||
if (c == nullptr)
|
||||
return;
|
||||
while (c->__c_ != __c)
|
||||
{
|
||||
c = c->__next_;
|
||||
_LIBCPP_ASSERT(c != nullptr, errmsg);
|
||||
if (c == nullptr)
|
||||
return;
|
||||
}
|
||||
__i_node* i = __insert_iterator(__i);
|
||||
c->__add(i);
|
||||
i->__c_ = c;
|
||||
}
|
||||
@@ -144,7 +142,7 @@ __libcpp_db::__insert_c(void* __c)
|
||||
if (__csz_ + 1 > static_cast<size_t>(__cend_ - __cbeg_))
|
||||
{
|
||||
size_t nc = __next_prime(2*static_cast<size_t>(__cend_ - __cbeg_) + 1);
|
||||
__c_node** cbeg = (__c_node**)calloc(nc, sizeof(void*));
|
||||
__c_node** cbeg = static_cast<__c_node**>(calloc(nc, sizeof(void*)));
|
||||
if (cbeg == nullptr)
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw bad_alloc();
|
||||
@@ -169,7 +167,8 @@ __libcpp_db::__insert_c(void* __c)
|
||||
}
|
||||
size_t hc = hash<void*>()(__c) % static_cast<size_t>(__cend_ - __cbeg_);
|
||||
__c_node* p = __cbeg_[hc];
|
||||
__c_node* r = __cbeg_[hc] = (__c_node*)malloc(sizeof(__c_node));
|
||||
__c_node* r = __cbeg_[hc] =
|
||||
static_cast<__c_node*>(malloc(sizeof(__c_node)));
|
||||
if (__cbeg_[hc] == nullptr)
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw bad_alloc();
|
||||
@@ -217,18 +216,23 @@ void
|
||||
__libcpp_db::__invalidate_all(void* __c)
|
||||
{
|
||||
WLock _(mut());
|
||||
size_t hc = hash<void*>()(__c) % static_cast<size_t>(__cend_ - __cbeg_);
|
||||
__c_node* p = __cbeg_[hc];
|
||||
_LIBCPP_ASSERT(p != nullptr, "debug mode internal logic error __invalidate_all A");
|
||||
while (p->__c_ != __c)
|
||||
if (__cend_ != __cbeg_)
|
||||
{
|
||||
p = p->__next_;
|
||||
_LIBCPP_ASSERT(p != nullptr, "debug mode internal logic error __invalidate_all B");
|
||||
}
|
||||
while (p->end_ != p->beg_)
|
||||
{
|
||||
--p->end_;
|
||||
(*p->end_)->__c_ = nullptr;
|
||||
size_t hc = hash<void*>()(__c) % static_cast<size_t>(__cend_ - __cbeg_);
|
||||
__c_node* p = __cbeg_[hc];
|
||||
if (p == nullptr)
|
||||
return;
|
||||
while (p->__c_ != __c)
|
||||
{
|
||||
p = p->__next_;
|
||||
if (p == nullptr)
|
||||
return;
|
||||
}
|
||||
while (p->end_ != p->beg_)
|
||||
{
|
||||
--p->end_;
|
||||
(*p->end_)->__c_ = nullptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -236,13 +240,26 @@ __c_node*
|
||||
__libcpp_db::__find_c_and_lock(void* __c) const
|
||||
{
|
||||
mut().lock();
|
||||
if (__cend_ == __cbeg_)
|
||||
{
|
||||
mut().unlock();
|
||||
return nullptr;
|
||||
}
|
||||
size_t hc = hash<void*>()(__c) % static_cast<size_t>(__cend_ - __cbeg_);
|
||||
__c_node* p = __cbeg_[hc];
|
||||
_LIBCPP_ASSERT(p != nullptr, "debug mode internal logic error __find_c_and_lock A");
|
||||
if (p == nullptr)
|
||||
{
|
||||
mut().unlock();
|
||||
return nullptr;
|
||||
}
|
||||
while (p->__c_ != __c)
|
||||
{
|
||||
p = p->__next_;
|
||||
_LIBCPP_ASSERT(p != nullptr, "debug mode internal logic error __find_c_and_lock B");
|
||||
if (p == nullptr)
|
||||
{
|
||||
mut().unlock();
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
return p;
|
||||
}
|
||||
@@ -271,28 +288,35 @@ void
|
||||
__libcpp_db::__erase_c(void* __c)
|
||||
{
|
||||
WLock _(mut());
|
||||
size_t hc = hash<void*>()(__c) % static_cast<size_t>(__cend_ - __cbeg_);
|
||||
__c_node* p = __cbeg_[hc];
|
||||
__c_node* q = nullptr;
|
||||
_LIBCPP_ASSERT(p != nullptr, "debug mode internal logic error __erase_c A");
|
||||
while (p->__c_ != __c)
|
||||
if (__cend_ != __cbeg_)
|
||||
{
|
||||
q = p;
|
||||
p = p->__next_;
|
||||
_LIBCPP_ASSERT(p != nullptr, "debug mode internal logic error __erase_c B");
|
||||
size_t hc = hash<void*>()(__c) % static_cast<size_t>(__cend_ - __cbeg_);
|
||||
__c_node* p = __cbeg_[hc];
|
||||
if (p == nullptr)
|
||||
return;
|
||||
__c_node* q = nullptr;
|
||||
_LIBCPP_ASSERT(p != nullptr, "debug mode internal logic error __erase_c A");
|
||||
while (p->__c_ != __c)
|
||||
{
|
||||
q = p;
|
||||
p = p->__next_;
|
||||
if (p == nullptr)
|
||||
return;
|
||||
_LIBCPP_ASSERT(p != nullptr, "debug mode internal logic error __erase_c B");
|
||||
}
|
||||
if (q == nullptr)
|
||||
__cbeg_[hc] = p->__next_;
|
||||
else
|
||||
q->__next_ = p->__next_;
|
||||
while (p->end_ != p->beg_)
|
||||
{
|
||||
--p->end_;
|
||||
(*p->end_)->__c_ = nullptr;
|
||||
}
|
||||
free(p->beg_);
|
||||
free(p);
|
||||
--__csz_;
|
||||
}
|
||||
if (q == nullptr)
|
||||
__cbeg_[hc] = p->__next_;
|
||||
else
|
||||
q->__next_ = p->__next_;
|
||||
while (p->end_ != p->beg_)
|
||||
{
|
||||
--p->end_;
|
||||
(*p->end_)->__c_ = nullptr;
|
||||
}
|
||||
free(p->beg_);
|
||||
free(p);
|
||||
--__csz_;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -302,7 +326,7 @@ __libcpp_db::__iterator_copy(void* __i, const void* __i0)
|
||||
__i_node* i = __find_iterator(__i);
|
||||
__i_node* i0 = __find_iterator(__i0);
|
||||
__c_node* c0 = i0 != nullptr ? i0->__c_ : nullptr;
|
||||
if (i == nullptr && c0 != nullptr)
|
||||
if (i == nullptr && i0 != nullptr)
|
||||
i = __insert_iterator(__i);
|
||||
__c_node* c = i != nullptr ? i->__c_ : nullptr;
|
||||
if (c != c0)
|
||||
@@ -354,7 +378,7 @@ __libcpp_db::__subscriptable(const void* __i, ptrdiff_t __n) const
|
||||
}
|
||||
|
||||
bool
|
||||
__libcpp_db::__comparable(const void* __i, const void* __j) const
|
||||
__libcpp_db::__less_than_comparable(const void* __i, const void* __j) const
|
||||
{
|
||||
RLock _(mut());
|
||||
__i_node* i = __find_iterator(__i);
|
||||
@@ -408,7 +432,8 @@ __c_node::__add(__i_node* i)
|
||||
size_t nc = 2*static_cast<size_t>(cap_ - beg_);
|
||||
if (nc == 0)
|
||||
nc = 1;
|
||||
__i_node** beg = (__i_node**)malloc(nc * sizeof(__i_node*));
|
||||
__i_node** beg =
|
||||
static_cast<__i_node**>(malloc(nc * sizeof(__i_node*)));
|
||||
if (beg == nullptr)
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw bad_alloc();
|
||||
@@ -434,7 +459,7 @@ __libcpp_db::__insert_iterator(void* __i)
|
||||
if (__isz_ + 1 > static_cast<size_t>(__iend_ - __ibeg_))
|
||||
{
|
||||
size_t nc = __next_prime(2*static_cast<size_t>(__iend_ - __ibeg_) + 1);
|
||||
__i_node** ibeg = (__i_node**)calloc(nc, sizeof(void*));
|
||||
__i_node** ibeg = static_cast<__i_node**>(calloc(nc, sizeof(void*)));
|
||||
if (ibeg == nullptr)
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw bad_alloc();
|
||||
@@ -459,7 +484,8 @@ __libcpp_db::__insert_iterator(void* __i)
|
||||
}
|
||||
size_t hi = hash<void*>()(__i) % static_cast<size_t>(__iend_ - __ibeg_);
|
||||
__i_node* p = __ibeg_[hi];
|
||||
__i_node* r = __ibeg_[hi] = (__i_node*)malloc(sizeof(__i_node));
|
||||
__i_node* r = __ibeg_[hi] =
|
||||
static_cast<__i_node*>(malloc(sizeof(__i_node)));
|
||||
if (r == nullptr)
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
throw bad_alloc();
|
||||
|
||||
@@ -7,14 +7,16 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "exception"
|
||||
#include "new"
|
||||
|
||||
#ifndef __has_include
|
||||
#define __has_include(inc) 0
|
||||
#endif
|
||||
|
||||
#if __APPLE__
|
||||
#ifdef __APPLE__
|
||||
#include <cxxabi.h>
|
||||
|
||||
using namespace __cxxabiv1;
|
||||
@@ -22,7 +24,7 @@
|
||||
#ifndef _LIBCPPABI_VERSION
|
||||
using namespace __cxxabiapple;
|
||||
// On Darwin, there are two STL shared libraries and a lower level ABI
|
||||
// shared libray. The globals holding the current terminate handler and
|
||||
// shared library. The globals holding the current terminate handler and
|
||||
// current unexpected handler are in the ABI library.
|
||||
#define __terminate_handler __cxxabiapple::__cxa_terminate_handler
|
||||
#define __unexpected_handler __cxxabiapple::__cxa_unexpected_handler
|
||||
@@ -33,7 +35,7 @@
|
||||
#if defined(LIBCXXRT) || defined(_LIBCPPABI_VERSION)
|
||||
#define HAVE_DEPENDENT_EH_ABI 1
|
||||
#endif
|
||||
#else // __has_include(<cxxabi.h>)
|
||||
#elif !defined(__GLIBCXX__) // __has_include(<cxxabi.h>)
|
||||
static std::terminate_handler __terminate_handler;
|
||||
static std::unexpected_handler __unexpected_handler;
|
||||
#endif // __has_include(<cxxabi.h>)
|
||||
@@ -41,7 +43,7 @@
|
||||
namespace std
|
||||
{
|
||||
|
||||
#if !defined(LIBCXXRT) && !defined(_LIBCPPABI_VERSION)
|
||||
#if !defined(LIBCXXRT) && !defined(_LIBCPPABI_VERSION) && !defined(__GLIBCXX__)
|
||||
|
||||
// libcxxrt provides implementations of these functions itself.
|
||||
unexpected_handler
|
||||
@@ -77,6 +79,7 @@ get_terminate() _NOEXCEPT
|
||||
return __sync_fetch_and_add(&__terminate_handler, (terminate_handler)0);
|
||||
}
|
||||
|
||||
#ifndef __EMSCRIPTEN__ // We provide this in JS
|
||||
_LIBCPP_NORETURN
|
||||
void
|
||||
terminate() _NOEXCEPT
|
||||
@@ -87,30 +90,39 @@ terminate() _NOEXCEPT
|
||||
#endif // _LIBCPP_NO_EXCEPTIONS
|
||||
(*get_terminate())();
|
||||
// handler should not return
|
||||
::abort ();
|
||||
printf("terminate_handler unexpectedly returned\n");
|
||||
::abort();
|
||||
#ifndef _LIBCPP_NO_EXCEPTIONS
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
// handler should not throw exception
|
||||
::abort ();
|
||||
printf("terminate_handler unexpectedly threw an exception\n");
|
||||
::abort();
|
||||
}
|
||||
#endif // _LIBCPP_NO_EXCEPTIONS
|
||||
}
|
||||
#endif // !__EMSCRIPTEN__
|
||||
#endif // !defined(LIBCXXRT) && !defined(_LIBCPPABI_VERSION)
|
||||
|
||||
#ifndef LIBCXXRT
|
||||
#if !defined(LIBCXXRT) && !defined(__GLIBCXX__) && !defined(__EMSCRIPTEN__)
|
||||
bool uncaught_exception() _NOEXCEPT
|
||||
{
|
||||
#if __APPLE__ || defined(_LIBCPPABI_VERSION)
|
||||
#if defined(__APPLE__) || defined(_LIBCPPABI_VERSION)
|
||||
// on Darwin, there is a helper function so __cxa_get_globals is private
|
||||
return __cxa_uncaught_exception();
|
||||
#else // __APPLE__
|
||||
#warning uncaught_exception not yet implemented
|
||||
# if defined(_MSC_VER) && ! defined(__clang__)
|
||||
_LIBCPP_WARNING("uncaught_exception not yet implemented")
|
||||
# else
|
||||
# warning uncaught_exception not yet implemented
|
||||
# endif
|
||||
printf("uncaught_exception not yet implemented\n");
|
||||
::abort();
|
||||
#endif // __APPLE__
|
||||
}
|
||||
|
||||
|
||||
#ifndef _LIBCPPABI_VERSION
|
||||
|
||||
exception::~exception() _NOEXCEPT
|
||||
@@ -124,7 +136,7 @@ const char* exception::what() const _NOEXCEPT
|
||||
|
||||
#endif // _LIBCPPABI_VERSION
|
||||
#endif //LIBCXXRT
|
||||
#ifndef _LIBCPPABI_VERSION
|
||||
#if !defined(_LIBCPPABI_VERSION) && !defined(__GLIBCXX__)
|
||||
|
||||
bad_exception::~bad_exception() _NOEXCEPT
|
||||
{
|
||||
@@ -137,15 +149,50 @@ const char* bad_exception::what() const _NOEXCEPT
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(__GLIBCXX__)
|
||||
|
||||
// libsupc++ does not implement the dependent EH ABI and the functionality
|
||||
// it uses to implement std::exception_ptr (which it declares as an alias of
|
||||
// std::__exception_ptr::exception_ptr) is not directly exported to clients. So
|
||||
// we have little choice but to hijack std::__exception_ptr::exception_ptr's
|
||||
// (which fortunately has the same layout as our std::exception_ptr) copy
|
||||
// constructor, assignment operator and destructor (which are part of its
|
||||
// stable ABI), and its rethrow_exception(std::__exception_ptr::exception_ptr)
|
||||
// function.
|
||||
|
||||
namespace __exception_ptr
|
||||
{
|
||||
|
||||
struct exception_ptr
|
||||
{
|
||||
void* __ptr_;
|
||||
|
||||
exception_ptr(const exception_ptr&) _NOEXCEPT;
|
||||
exception_ptr& operator=(const exception_ptr&) _NOEXCEPT;
|
||||
~exception_ptr() _NOEXCEPT;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
_LIBCPP_NORETURN void rethrow_exception(__exception_ptr::exception_ptr);
|
||||
|
||||
#endif
|
||||
|
||||
exception_ptr::~exception_ptr() _NOEXCEPT
|
||||
{
|
||||
#if HAVE_DEPENDENT_EH_ABI
|
||||
__cxa_decrement_exception_refcount(__ptr_);
|
||||
#elif defined(__GLIBCXX__)
|
||||
reinterpret_cast<__exception_ptr::exception_ptr*>(this)->~exception_ptr();
|
||||
#else
|
||||
#warning exception_ptr not yet implemented
|
||||
# if defined(_MSC_VER) && ! defined(__clang__)
|
||||
_LIBCPP_WARNING("exception_ptr not yet implemented")
|
||||
# else
|
||||
# warning exception_ptr not yet implemented
|
||||
# endif
|
||||
printf("exception_ptr not yet implemented\n");
|
||||
::abort();
|
||||
#endif // __APPLE__
|
||||
#endif
|
||||
}
|
||||
|
||||
exception_ptr::exception_ptr(const exception_ptr& other) _NOEXCEPT
|
||||
@@ -153,10 +200,18 @@ exception_ptr::exception_ptr(const exception_ptr& other) _NOEXCEPT
|
||||
{
|
||||
#if HAVE_DEPENDENT_EH_ABI
|
||||
__cxa_increment_exception_refcount(__ptr_);
|
||||
#elif defined(__GLIBCXX__)
|
||||
new (reinterpret_cast<void*>(this)) __exception_ptr::exception_ptr(
|
||||
reinterpret_cast<const __exception_ptr::exception_ptr&>(other));
|
||||
#else
|
||||
#warning exception_ptr not yet implemented
|
||||
# if defined(_MSC_VER) && ! defined(__clang__)
|
||||
_LIBCPP_WARNING("exception_ptr not yet implemented")
|
||||
# else
|
||||
# warning exception_ptr not yet implemented
|
||||
# endif
|
||||
printf("exception_ptr not yet implemented\n");
|
||||
::abort();
|
||||
#endif // __APPLE__
|
||||
#endif
|
||||
}
|
||||
|
||||
exception_ptr& exception_ptr::operator=(const exception_ptr& other) _NOEXCEPT
|
||||
@@ -169,10 +224,19 @@ exception_ptr& exception_ptr::operator=(const exception_ptr& other) _NOEXCEPT
|
||||
__ptr_ = other.__ptr_;
|
||||
}
|
||||
return *this;
|
||||
#else // __APPLE__
|
||||
#warning exception_ptr not yet implemented
|
||||
#elif defined(__GLIBCXX__)
|
||||
*reinterpret_cast<__exception_ptr::exception_ptr*>(this) =
|
||||
reinterpret_cast<const __exception_ptr::exception_ptr&>(other);
|
||||
return *this;
|
||||
#else
|
||||
# if defined(_MSC_VER) && ! defined(__clang__)
|
||||
_LIBCPP_WARNING("exception_ptr not yet implemented")
|
||||
# else
|
||||
# warning exception_ptr not yet implemented
|
||||
# endif
|
||||
printf("exception_ptr not yet implemented\n");
|
||||
::abort();
|
||||
#endif // __APPLE__
|
||||
#endif
|
||||
}
|
||||
|
||||
nested_exception::nested_exception() _NOEXCEPT
|
||||
@@ -180,10 +244,14 @@ nested_exception::nested_exception() _NOEXCEPT
|
||||
{
|
||||
}
|
||||
|
||||
#if !defined(__GLIBCXX__)
|
||||
|
||||
nested_exception::~nested_exception() _NOEXCEPT
|
||||
{
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
_LIBCPP_NORETURN
|
||||
void
|
||||
nested_exception::rethrow_nested() const
|
||||
@@ -193,6 +261,7 @@ nested_exception::rethrow_nested() const
|
||||
rethrow_exception(__ptr_);
|
||||
}
|
||||
|
||||
#if !defined(__GLIBCXX__)
|
||||
|
||||
exception_ptr current_exception() _NOEXCEPT
|
||||
{
|
||||
@@ -203,12 +272,19 @@ exception_ptr current_exception() _NOEXCEPT
|
||||
exception_ptr ptr;
|
||||
ptr.__ptr_ = __cxa_current_primary_exception();
|
||||
return ptr;
|
||||
#else // __APPLE__
|
||||
#warning exception_ptr not yet implemented
|
||||
#else
|
||||
# if defined(_MSC_VER) && ! defined(__clang__)
|
||||
_LIBCPP_WARNING( "exception_ptr not yet implemented" )
|
||||
# else
|
||||
# warning exception_ptr not yet implemented
|
||||
# endif
|
||||
printf("exception_ptr not yet implemented\n");
|
||||
::abort();
|
||||
#endif // __APPLE__
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif // !__GLIBCXX__
|
||||
|
||||
_LIBCPP_NORETURN
|
||||
void rethrow_exception(exception_ptr p)
|
||||
{
|
||||
@@ -216,9 +292,16 @@ void rethrow_exception(exception_ptr p)
|
||||
__cxa_rethrow_primary_exception(p.__ptr_);
|
||||
// if p.__ptr_ is NULL, above returns so we terminate
|
||||
terminate();
|
||||
#else // __APPLE__
|
||||
#warning exception_ptr not yet implemented
|
||||
#elif defined(__GLIBCXX__)
|
||||
rethrow_exception(reinterpret_cast<__exception_ptr::exception_ptr&>(p));
|
||||
#else
|
||||
# if defined(_MSC_VER) && ! defined(__clang__)
|
||||
_LIBCPP_WARNING("exception_ptr not yet implemented")
|
||||
# else
|
||||
# warning exception_ptr not yet implemented
|
||||
# endif
|
||||
printf("exception_ptr not yet implemented\n");
|
||||
::abort();
|
||||
#endif // __APPLE__
|
||||
#endif
|
||||
}
|
||||
} // std
|
||||
|
||||
@@ -26,11 +26,20 @@ __future_error_category::name() const _NOEXCEPT
|
||||
return "future";
|
||||
}
|
||||
|
||||
#if defined(__clang__)
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wswitch"
|
||||
#elif defined(__GNUC__) || defined(__GNUG__)
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wswitch"
|
||||
#endif
|
||||
|
||||
string
|
||||
__future_error_category::message(int ev) const
|
||||
{
|
||||
switch (static_cast<future_errc>(ev))
|
||||
{
|
||||
case future_errc(0): // For backwards compatibility with C++11 (LWG 2056)
|
||||
case future_errc::broken_promise:
|
||||
return string("The associated promise has been destructed prior "
|
||||
"to the associated state becoming ready.");
|
||||
@@ -46,6 +55,12 @@ __future_error_category::message(int ev) const
|
||||
return string("unspecified future_errc value\n");
|
||||
}
|
||||
|
||||
#if defined(__clang__)
|
||||
#pragma clang diagnostic pop
|
||||
#elif defined(__GNUC__) || defined(__GNUG__)
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
|
||||
const error_category&
|
||||
future_category() _NOEXCEPT
|
||||
{
|
||||
@@ -78,8 +93,8 @@ __assoc_sub_state::set_value()
|
||||
throw future_error(make_error_code(future_errc::promise_already_satisfied));
|
||||
#endif
|
||||
__state_ |= __constructed | ready;
|
||||
__lk.unlock();
|
||||
__cv_.notify_all();
|
||||
__lk.unlock();
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user