mirror of
https://github.com/topjohnwu/libcxx.git
synced 2024-11-23 03:39:39 +00:00
Upstream to latest libcxx from NDK
This commit is contained in:
parent
82090ae75f
commit
12c8f4e93f
@ -12,10 +12,10 @@ AllowShortFunctionsOnASingleLine: true
|
||||
AllowShortLambdasOnASingleLine: All
|
||||
AttributeMacros: ['_LIBCPP_HIDE_FROM_ABI',
|
||||
'_LIBCPP_CONSTEXPR',
|
||||
'_LIBCPP_CONSTEXPR_AFTER_CXX11',
|
||||
'_LIBCPP_CONSTEXPR_AFTER_CXX14',
|
||||
'_LIBCPP_CONSTEXPR_AFTER_CXX17',
|
||||
'_LIBCPP_CONSTEXPR_AFTER_CXX20',
|
||||
'_LIBCPP_CONSTEXPR_SINCE_CXX14',
|
||||
'_LIBCPP_CONSTEXPR_SINCE_CXX17',
|
||||
'_LIBCPP_CONSTEXPR_SINCE_CXX20',
|
||||
'_LIBCPP_CONSTEXPR_SINCE_CXX23',
|
||||
'_LIBCPP_ALIGNOF',
|
||||
'_ALIGNAS_TYPE',
|
||||
'_ALIGNAS',
|
||||
@ -65,7 +65,6 @@ IndentRequires: true
|
||||
InsertTrailingCommas: Wrapped
|
||||
KeepEmptyLinesAtTheStartOfBlocks: false
|
||||
MaxEmptyLinesToKeep: 1
|
||||
NamespaceIndentation: Inner
|
||||
PackConstructorInitializers: NextLine
|
||||
|
||||
PenaltyIndentedWhitespace: 2
|
||||
|
11
.clang-tidy
11
.clang-tidy
@ -15,6 +15,7 @@ Checks: >
|
||||
|
||||
modernize-loop-convert,
|
||||
modernize-redundant-void-arg,
|
||||
modernize-use-override,
|
||||
|
||||
readability-duplicate-include,
|
||||
readability-identifier-naming,
|
||||
@ -24,6 +25,7 @@ Checks: >
|
||||
readability-redundant-control-flow,
|
||||
readability-redundant-function-ptr-dereference,
|
||||
readability-redundant-preprocessor,
|
||||
readability-simplify-boolean-expr,
|
||||
readability-simplify-subscript-expr,
|
||||
readability-uniqueptr-delete-release,
|
||||
|
||||
@ -38,6 +40,12 @@ CheckOptions:
|
||||
value: lower_case
|
||||
- key: readability-identifier-naming.ParameterPrefix
|
||||
value: __
|
||||
- key: readability-identifier-naming.PrivateMemberCase
|
||||
value: lower_case
|
||||
- key: readability-identifier-naming.PrivateMemberPrefix
|
||||
value: __
|
||||
- key: readability-identifier-naming.PrivateMemberSuffix
|
||||
value: _
|
||||
|
||||
# TODO: investigate these checks
|
||||
# bugprone-branch-clone,
|
||||
@ -49,7 +57,6 @@ CheckOptions:
|
||||
# modernize-use-equals-default,
|
||||
# modernize-use-equals-delete,
|
||||
# modernize-use-nullptr,
|
||||
# modernize-use-override,
|
||||
# portability-restrict-system-includes,
|
||||
# readability-function-cognitive-complexity,
|
||||
# readability-implicit-bool-conversion,
|
||||
@ -57,4 +64,4 @@ CheckOptions:
|
||||
# readability-redundant-access-specifiers,
|
||||
# readability-redundant-declaration,
|
||||
# readability-redundant-member-init,
|
||||
# readability-simplify-boolean-expr,
|
||||
#
|
||||
|
@ -31,6 +31,7 @@ libcxx_sources := \
|
||||
legacy_pointer_safety.cpp \
|
||||
locale.cpp \
|
||||
memory.cpp \
|
||||
memory_resource.cpp \
|
||||
mutex.cpp \
|
||||
mutex_destructor.cpp \
|
||||
new.cpp \
|
||||
|
@ -176,6 +176,7 @@ set(BENCHMARK_TESTS
|
||||
algorithms/stable_sort.bench.cpp
|
||||
allocation.bench.cpp
|
||||
deque.bench.cpp
|
||||
deque_iterator.bench.cpp
|
||||
filesystem.bench.cpp
|
||||
format_to_n.bench.cpp
|
||||
format_to.bench.cpp
|
||||
@ -184,7 +185,9 @@ set(BENCHMARK_TESTS
|
||||
formatter_float.bench.cpp
|
||||
formatter_int.bench.cpp
|
||||
function.bench.cpp
|
||||
join_view.bench.cpp
|
||||
map.bench.cpp
|
||||
monotonic_buffer.bench.cpp
|
||||
ordered_set.bench.cpp
|
||||
std_format_spec_string_unicode.bench.cpp
|
||||
string.bench.cpp
|
||||
|
@ -49,8 +49,8 @@ struct AllOrders : EnumValuesAsTuple<AllOrders, Order, 7> {
|
||||
// These values are arranged in such a way that they would invoke O(N^2)
|
||||
// behavior on any quick sort implementation that satisifies certain conditions.
|
||||
// Details are available in the following paper:
|
||||
// "A Killer Adversary for Quicksort", M. D. McIlroy, Software—Practice &
|
||||
// ExperienceVolume 29 Issue 4 April 10, 1999 pp 341–344.
|
||||
// "A Killer Adversary for Quicksort", M. D. McIlroy, Software-Practice &
|
||||
// Experience Volume 29 Issue 4 April 10, 1999 pp 341-344.
|
||||
// https://dl.acm.org/doi/10.5555/311868.311871.
|
||||
template <class T>
|
||||
void fillAdversarialQuickSortInput(T& V, size_t N) {
|
||||
|
232
benchmarks/deque_iterator.bench.cpp
Normal file
232
benchmarks/deque_iterator.bench.cpp
Normal file
@ -0,0 +1,232 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include <algorithm>
|
||||
#include <deque>
|
||||
|
||||
#include "benchmark/benchmark.h"
|
||||
|
||||
namespace {
|
||||
void run_sizes(auto benchmark) {
|
||||
benchmark->Arg(0)
|
||||
->Arg(1)
|
||||
->Arg(2)
|
||||
->Arg(64)
|
||||
->Arg(512)
|
||||
->Arg(1024)
|
||||
->Arg(4000)
|
||||
->Arg(4096)
|
||||
->Arg(5500)
|
||||
->Arg(64000)
|
||||
->Arg(65536)
|
||||
->Arg(70000);
|
||||
}
|
||||
|
||||
template <class FromContainer, class ToContainer, class Func>
|
||||
void benchmark_containers(benchmark::State& state, FromContainer& d, ToContainer& v, Func&& func) {
|
||||
for (auto _ : state) {
|
||||
benchmark::DoNotOptimize(v);
|
||||
benchmark::DoNotOptimize(d);
|
||||
func(d.begin(), d.end(), v.begin());
|
||||
}
|
||||
}
|
||||
|
||||
template <class Func>
|
||||
void benchmark_deque_vector(benchmark::State& state, Func&& func) {
|
||||
auto size = state.range(0);
|
||||
std::deque<int> d;
|
||||
d.resize(size);
|
||||
std::ranges::fill(d, 10);
|
||||
std::vector<int> v;
|
||||
v.resize(size);
|
||||
benchmark_containers(state, d, v, func);
|
||||
}
|
||||
|
||||
template <class Func>
|
||||
void benchmark_deque_deque(benchmark::State& state, Func&& func) {
|
||||
auto size = state.range(0);
|
||||
std::deque<int> d;
|
||||
d.resize(size);
|
||||
std::ranges::fill(d, 10);
|
||||
std::deque<int> v;
|
||||
v.resize(size);
|
||||
benchmark_containers(state, d, v, func);
|
||||
}
|
||||
|
||||
template <class Func>
|
||||
void benchmark_vector_deque(benchmark::State& state, Func&& func) {
|
||||
auto size = state.range(0);
|
||||
std::vector<int> d;
|
||||
d.resize(size);
|
||||
std::ranges::fill(d, 10);
|
||||
std::deque<int> v;
|
||||
v.resize(size);
|
||||
benchmark_containers(state, d, v, func);
|
||||
}
|
||||
|
||||
template <class FromContainer, class ToContainer, class Func>
|
||||
void benchmark_containers_backward(benchmark::State& state, FromContainer& d, ToContainer& v, Func&& func) {
|
||||
for (auto _ : state) {
|
||||
benchmark::DoNotOptimize(v);
|
||||
benchmark::DoNotOptimize(d);
|
||||
func(d.begin(), d.end(), v.end());
|
||||
}
|
||||
}
|
||||
|
||||
template <class Func>
|
||||
void benchmark_deque_vector_backward(benchmark::State& state, Func&& func) {
|
||||
auto size = state.range(0);
|
||||
std::deque<int> d;
|
||||
d.resize(size);
|
||||
std::ranges::fill(d, 10);
|
||||
std::vector<int> v;
|
||||
v.resize(size);
|
||||
benchmark_containers_backward(state, d, v, func);
|
||||
}
|
||||
|
||||
template <class Func>
|
||||
void benchmark_deque_deque_backward(benchmark::State& state, Func&& func) {
|
||||
auto size = state.range(0);
|
||||
std::deque<int> d;
|
||||
d.resize(size);
|
||||
std::ranges::fill(d, 10);
|
||||
std::deque<int> v;
|
||||
v.resize(size);
|
||||
benchmark_containers_backward(state, d, v, func);
|
||||
}
|
||||
|
||||
template <class Func>
|
||||
void benchmark_vector_deque_backward(benchmark::State& state, Func&& func) {
|
||||
auto size = state.range(0);
|
||||
std::vector<int> d;
|
||||
d.resize(size);
|
||||
std::ranges::fill(d, 10);
|
||||
std::deque<int> v;
|
||||
v.resize(size);
|
||||
benchmark_containers_backward(state, d, v, func);
|
||||
}
|
||||
|
||||
struct CopyFunctor {
|
||||
template <class... Args>
|
||||
auto operator()(Args... args) const {
|
||||
std::copy(std::forward<Args>(args)...);
|
||||
}
|
||||
} copy;
|
||||
|
||||
struct MoveFunctor {
|
||||
template <class... Args>
|
||||
auto operator()(Args... args) const {
|
||||
std::move(std::forward<Args>(args)...);
|
||||
}
|
||||
} move;
|
||||
|
||||
struct CopyBackwardFunctor {
|
||||
template <class... Args>
|
||||
auto operator()(Args... args) const {
|
||||
std::copy_backward(std::forward<Args>(args)...);
|
||||
}
|
||||
} copy_backward;
|
||||
|
||||
struct MoveBackwardFunctor {
|
||||
template <class... Args>
|
||||
auto operator()(Args... args) const {
|
||||
std::move_backward(std::forward<Args>(args)...);
|
||||
}
|
||||
} move_backward;
|
||||
|
||||
// copy
|
||||
void BM_deque_vector_copy(benchmark::State& state) { benchmark_deque_vector(state, copy); }
|
||||
BENCHMARK(BM_deque_vector_copy)->Apply(run_sizes);
|
||||
|
||||
void BM_deque_vector_ranges_copy(benchmark::State& state) { benchmark_deque_vector(state, std::ranges::copy); }
|
||||
BENCHMARK(BM_deque_vector_ranges_copy)->Apply(run_sizes);
|
||||
|
||||
void BM_deque_deque_copy(benchmark::State& state) { benchmark_deque_deque(state, copy); }
|
||||
BENCHMARK(BM_deque_deque_copy)->Apply(run_sizes);
|
||||
|
||||
void BM_deque_deque_ranges_copy(benchmark::State& state) { benchmark_deque_deque(state, std::ranges::copy); }
|
||||
BENCHMARK(BM_deque_deque_ranges_copy)->Apply(run_sizes);
|
||||
|
||||
void BM_vector_deque_copy(benchmark::State& state) { benchmark_vector_deque(state, copy); }
|
||||
BENCHMARK(BM_vector_deque_copy)->Apply(run_sizes);
|
||||
|
||||
void BM_vector_deque_ranges_copy(benchmark::State& state) { benchmark_vector_deque(state, std::ranges::copy); }
|
||||
BENCHMARK(BM_vector_deque_ranges_copy)->Apply(run_sizes);
|
||||
|
||||
// move
|
||||
void BM_deque_vector_move(benchmark::State& state) { benchmark_deque_vector(state, move); }
|
||||
BENCHMARK(BM_deque_vector_move)->Apply(run_sizes);
|
||||
|
||||
void BM_deque_vector_ranges_move(benchmark::State& state) { benchmark_deque_vector(state, std::ranges::move); }
|
||||
BENCHMARK(BM_deque_vector_ranges_move)->Apply(run_sizes);
|
||||
|
||||
void BM_deque_deque_move(benchmark::State& state) { benchmark_deque_deque(state, move); }
|
||||
BENCHMARK(BM_deque_deque_move)->Apply(run_sizes);
|
||||
|
||||
void BM_deque_deque_ranges_move(benchmark::State& state) { benchmark_deque_deque(state, std::ranges::move); }
|
||||
BENCHMARK(BM_deque_deque_ranges_move)->Apply(run_sizes);
|
||||
|
||||
void BM_vector_deque_move(benchmark::State& state) { benchmark_vector_deque(state, move); }
|
||||
BENCHMARK(BM_vector_deque_move)->Apply(run_sizes);
|
||||
|
||||
void BM_vector_deque_ranges_move(benchmark::State& state) { benchmark_vector_deque(state, std::ranges::move); }
|
||||
BENCHMARK(BM_vector_deque_ranges_move)->Apply(run_sizes);
|
||||
|
||||
// copy_backward
|
||||
void BM_deque_vector_copy_backward(benchmark::State& state) { benchmark_deque_vector_backward(state, copy_backward); }
|
||||
BENCHMARK(BM_deque_vector_copy_backward)->Apply(run_sizes);
|
||||
|
||||
void BM_deque_vector_ranges_copy_backward(benchmark::State& state) {
|
||||
benchmark_deque_vector_backward(state, std::ranges::copy_backward);
|
||||
}
|
||||
BENCHMARK(BM_deque_vector_ranges_copy_backward)->Apply(run_sizes);
|
||||
|
||||
void BM_deque_deque_copy_backward(benchmark::State& state) { benchmark_deque_deque_backward(state, copy_backward); }
|
||||
BENCHMARK(BM_deque_deque_copy_backward)->Apply(run_sizes);
|
||||
|
||||
void BM_deque_deque_ranges_copy_backward(benchmark::State& state) {
|
||||
benchmark_deque_deque_backward(state, std::ranges::copy_backward);
|
||||
}
|
||||
BENCHMARK(BM_deque_deque_ranges_copy_backward)->Apply(run_sizes);
|
||||
|
||||
void BM_vector_deque_copy_backward(benchmark::State& state) { benchmark_vector_deque_backward(state, copy_backward); }
|
||||
BENCHMARK(BM_vector_deque_copy_backward)->Apply(run_sizes);
|
||||
|
||||
void BM_vector_deque_ranges_copy_backward(benchmark::State& state) {
|
||||
benchmark_vector_deque_backward(state, std::ranges::copy_backward);
|
||||
}
|
||||
BENCHMARK(BM_vector_deque_ranges_copy_backward)->Apply(run_sizes);
|
||||
|
||||
// move_backward
|
||||
void BM_deque_vector_move_backward(benchmark::State& state) { benchmark_deque_vector_backward(state, move_backward); }
|
||||
BENCHMARK(BM_deque_vector_move_backward)->Apply(run_sizes);
|
||||
|
||||
void BM_deque_vector_ranges_move_backward(benchmark::State& state) {
|
||||
benchmark_deque_vector_backward(state, std::ranges::move_backward);
|
||||
}
|
||||
BENCHMARK(BM_deque_vector_ranges_move_backward)->Apply(run_sizes);
|
||||
|
||||
void BM_deque_deque_move_backward(benchmark::State& state) { benchmark_deque_deque_backward(state, move_backward); }
|
||||
BENCHMARK(BM_deque_deque_move_backward)->Apply(run_sizes);
|
||||
|
||||
void BM_deque_deque_ranges_move_backward(benchmark::State& state) {
|
||||
benchmark_deque_deque_backward(state, std::ranges::move_backward);
|
||||
}
|
||||
BENCHMARK(BM_deque_deque_ranges_move_backward)->Apply(run_sizes);
|
||||
|
||||
void BM_vector_deque_move_backward(benchmark::State& state) { benchmark_vector_deque_backward(state, move_backward); }
|
||||
BENCHMARK(BM_vector_deque_move_backward)->Apply(run_sizes);
|
||||
|
||||
void BM_vector_deque_ranges_move_backward(benchmark::State& state) {
|
||||
benchmark_vector_deque_backward(state, std::ranges::move_backward);
|
||||
}
|
||||
BENCHMARK(BM_vector_deque_ranges_move_backward)->Apply(run_sizes);
|
||||
|
||||
} // namespace
|
||||
|
||||
BENCHMARK_MAIN();
|
@ -203,7 +203,7 @@ struct Precision<PrecisionE::Small> {
|
||||
|
||||
template <>
|
||||
struct Precision<PrecisionE::Huge> {
|
||||
// The maximum precision for a minimal sub normal long double is ±0x1p-16494.
|
||||
// The maximum precision for a minimal sub normal long double is +/- 0x1p-16494.
|
||||
// This value is always larger than that value forcing the trailing zero path
|
||||
// to be executed.
|
||||
static constexpr const char* fmt = ".17000";
|
||||
|
77
benchmarks/join_view.bench.cpp
Normal file
77
benchmarks/join_view.bench.cpp
Normal file
@ -0,0 +1,77 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include <algorithm>
|
||||
#include <deque>
|
||||
#include <ranges>
|
||||
|
||||
#include "benchmark/benchmark.h"
|
||||
|
||||
namespace {
|
||||
void run_sizes(auto benchmark) {
|
||||
benchmark->Arg(0)
|
||||
->Arg(1)
|
||||
->Arg(2)
|
||||
->Arg(64)
|
||||
->Arg(512)
|
||||
->Arg(1024)
|
||||
->Arg(4000)
|
||||
->Arg(4096)
|
||||
->Arg(5500)
|
||||
->Arg(64000)
|
||||
->Arg(65536)
|
||||
->Arg(70000);
|
||||
}
|
||||
|
||||
void BM_join_view_in_vectors(benchmark::State& state) {
|
||||
auto size = state.range(0);
|
||||
std::vector<std::vector<int>> input(size, std::vector<int>(32));
|
||||
std::ranges::fill(input | std::views::join, 10);
|
||||
std::vector<int> output;
|
||||
output.resize(size * 32);
|
||||
|
||||
for (auto _ : state) {
|
||||
benchmark::DoNotOptimize(input);
|
||||
benchmark::DoNotOptimize(output);
|
||||
std::ranges::copy(input | std::views::join, output.begin());
|
||||
}
|
||||
}
|
||||
BENCHMARK(BM_join_view_in_vectors)->Apply(run_sizes);
|
||||
|
||||
void BM_join_view_out_vectors(benchmark::State& state) {
|
||||
auto size = state.range(0);
|
||||
std::vector<std::vector<int>> output(size, std::vector<int>(32));
|
||||
std::vector<int> input;
|
||||
input.resize(size * 32);
|
||||
std::ranges::fill(input, 10);
|
||||
|
||||
for (auto _ : state) {
|
||||
benchmark::DoNotOptimize(output);
|
||||
benchmark::DoNotOptimize(input);
|
||||
std::ranges::copy(input, (output | std::views::join).begin());
|
||||
}
|
||||
}
|
||||
BENCHMARK(BM_join_view_out_vectors)->Apply(run_sizes);
|
||||
|
||||
void BM_join_view_deques(benchmark::State& state) {
|
||||
auto size = state.range(0);
|
||||
std::deque<std::deque<int>> deque(size, std::deque<int>(32));
|
||||
std::ranges::fill(deque | std::views::join, 10);
|
||||
std::vector<int> output;
|
||||
output.resize(size * 32);
|
||||
|
||||
for (auto _ : state) {
|
||||
benchmark::DoNotOptimize(deque);
|
||||
benchmark::DoNotOptimize(output);
|
||||
std::ranges::copy(deque | std::views::join, output.begin());
|
||||
}
|
||||
}
|
||||
BENCHMARK(BM_join_view_deques)->Apply(run_sizes);
|
||||
} // namespace
|
||||
|
||||
BENCHMARK_MAIN();
|
28
benchmarks/monotonic_buffer.bench.cpp
Normal file
28
benchmarks/monotonic_buffer.bench.cpp
Normal file
@ -0,0 +1,28 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include <list>
|
||||
#include <memory_resource>
|
||||
|
||||
#include "benchmark/benchmark.h"
|
||||
|
||||
static void bm_list(benchmark::State& state) {
|
||||
char buffer[16384];
|
||||
std::pmr::monotonic_buffer_resource resource(buffer, sizeof(buffer));
|
||||
for (auto _ : state) {
|
||||
std::pmr::list<int> l(&resource);
|
||||
for (size_t i = 0; i != state.range(); ++i) {
|
||||
l.push_back(1);
|
||||
benchmark::DoNotOptimize(l);
|
||||
}
|
||||
resource.release();
|
||||
}
|
||||
}
|
||||
BENCHMARK(bm_list)->Range(1, 2048);
|
||||
|
||||
BENCHMARK_MAIN();
|
@ -63,22 +63,24 @@ function(import_private_headers target include_dirs headers)
|
||||
target_include_directories(${target} INTERFACE "${LIBCXX_BINARY_DIR}/private-abi-headers")
|
||||
endfunction()
|
||||
|
||||
# This function creates an imported library named <target> of the given <kind> (SHARED|STATIC).
|
||||
# This function creates an imported static library named <target>.
|
||||
# It imports a library named <name> searched at the given <path>.
|
||||
function(imported_library target kind path name)
|
||||
add_library(${target} ${kind} IMPORTED GLOBAL)
|
||||
set(libnames "${CMAKE_${kind}_LIBRARY_PREFIX}${name}${CMAKE_${kind}_LIBRARY_SUFFIX}")
|
||||
# Make sure we find .tbd files on macOS
|
||||
if (kind STREQUAL "SHARED")
|
||||
list(APPEND libnames "${CMAKE_${kind}_LIBRARY_PREFIX}${name}.tbd")
|
||||
endif()
|
||||
function(import_static_library target path name)
|
||||
add_library(${target} STATIC IMPORTED GLOBAL)
|
||||
find_library(file
|
||||
NAMES ${libnames}
|
||||
NAMES "${CMAKE_STATIC_LIBRARY_PREFIX}${name}${CMAKE_STATIC_LIBRARY_SUFFIX}"
|
||||
PATHS "${path}"
|
||||
NO_CACHE)
|
||||
set_target_properties(${target} PROPERTIES IMPORTED_LOCATION "${file}")
|
||||
endfunction()
|
||||
|
||||
# This function creates an imported shared (interface) library named <target>
|
||||
# for the given library <name>.
|
||||
function(import_shared_library target name)
|
||||
add_library(${target} INTERFACE IMPORTED GLOBAL)
|
||||
set_target_properties(${target} PROPERTIES IMPORTED_LIBNAME "${name}")
|
||||
endfunction()
|
||||
|
||||
# Link against a system-provided libstdc++
|
||||
if ("${LIBCXX_CXX_ABI}" STREQUAL "libstdc++")
|
||||
add_library(libcxx-abi-headers INTERFACE)
|
||||
@ -86,10 +88,10 @@ if ("${LIBCXX_CXX_ABI}" STREQUAL "libstdc++")
|
||||
"cxxabi.h;bits/c++config.h;bits/os_defines.h;bits/cpu_defines.h;bits/cxxabi_tweaks.h;bits/cxxabi_forced.h")
|
||||
target_compile_definitions(libcxx-abi-headers INTERFACE "-DLIBSTDCXX" "-D__GLIBCXX__")
|
||||
|
||||
imported_library(libcxx-abi-shared SHARED "${LIBCXX_CXX_ABI_LIBRARY_PATH}" stdc++)
|
||||
import_shared_library(libcxx-abi-shared stdc++)
|
||||
target_link_libraries(libcxx-abi-shared INTERFACE libcxx-abi-headers)
|
||||
|
||||
imported_library(libcxx-abi-static STATIC "${LIBCXX_CXX_ABI_LIBRARY_PATH}" stdc++)
|
||||
import_static_library(libcxx-abi-static "${LIBCXX_CXX_ABI_LIBRARY_PATH}" stdc++)
|
||||
target_link_libraries(libcxx-abi-static INTERFACE libcxx-abi-headers)
|
||||
|
||||
# Link against a system-provided libsupc++
|
||||
@ -99,10 +101,10 @@ elseif ("${LIBCXX_CXX_ABI}" STREQUAL "libsupc++")
|
||||
"cxxabi.h;bits/c++config.h;bits/os_defines.h;bits/cpu_defines.h;bits/cxxabi_tweaks.h;bits/cxxabi_forced.h")
|
||||
target_compile_definitions(libcxx-abi-headers INTERFACE "-D__GLIBCXX__")
|
||||
|
||||
imported_library(libcxx-abi-shared SHARED "${LIBCXX_CXX_ABI_LIBRARY_PATH}" supc++)
|
||||
import_shared_library(libcxx-abi-shared supc++)
|
||||
target_link_libraries(libcxx-abi-shared INTERFACE libcxx-abi-headers)
|
||||
|
||||
imported_library(libcxx-abi-static STATIC "${LIBCXX_CXX_ABI_LIBRARY_PATH}" supc++)
|
||||
import_static_library(libcxx-abi-static "${LIBCXX_CXX_ABI_LIBRARY_PATH}" supc++)
|
||||
target_link_libraries(libcxx-abi-static INTERFACE libcxx-abi-headers)
|
||||
|
||||
# Link against the in-tree libc++abi
|
||||
@ -133,10 +135,10 @@ elseif ("${LIBCXX_CXX_ABI}" STREQUAL "system-libcxxabi")
|
||||
import_private_headers(libcxx-abi-headers "${LIBCXX_CXX_ABI_INCLUDE_PATHS}" "cxxabi.h;__cxxabi_config.h")
|
||||
target_compile_definitions(libcxx-abi-headers INTERFACE "-DLIBCXX_BUILDING_LIBCXXABI")
|
||||
|
||||
imported_library(libcxx-abi-shared SHARED "${LIBCXX_CXX_ABI_LIBRARY_PATH}" c++abi)
|
||||
import_shared_library(libcxx-abi-shared c++abi)
|
||||
target_link_libraries(libcxx-abi-shared INTERFACE libcxx-abi-headers)
|
||||
|
||||
imported_library(libcxx-abi-static STATIC "${LIBCXX_CXX_ABI_LIBRARY_PATH}" c++abi)
|
||||
import_static_library(libcxx-abi-static "${LIBCXX_CXX_ABI_LIBRARY_PATH}" c++abi)
|
||||
target_link_libraries(libcxx-abi-static INTERFACE libcxx-abi-headers)
|
||||
|
||||
# Link against a system-provided libcxxrt
|
||||
@ -154,10 +156,10 @@ elseif ("${LIBCXX_CXX_ABI}" STREQUAL "libcxxrt")
|
||||
"cxxabi.h;unwind.h;unwind-arm.h;unwind-itanium.h")
|
||||
target_compile_definitions(libcxx-abi-headers INTERFACE "-DLIBCXXRT")
|
||||
|
||||
imported_library(libcxx-abi-shared SHARED "${LIBCXX_CXX_ABI_LIBRARY_PATH}" cxxrt)
|
||||
import_shared_library(libcxx-abi-shared cxxrt)
|
||||
target_link_libraries(libcxx-abi-shared INTERFACE libcxx-abi-headers)
|
||||
|
||||
imported_library(libcxx-abi-static STATIC "${LIBCXX_CXX_ABI_LIBRARY_PATH}" cxxrt)
|
||||
import_static_library(libcxx-abi-static "${LIBCXX_CXX_ABI_LIBRARY_PATH}" cxxrt)
|
||||
target_link_libraries(libcxx-abi-static INTERFACE libcxx-abi-headers)
|
||||
|
||||
# Link against a system-provided vcruntime
|
||||
|
38
cmake/caches/AndroidNDK.cmake
Normal file
38
cmake/caches/AndroidNDK.cmake
Normal file
@ -0,0 +1,38 @@
|
||||
# Use CMake's built-in Android NDK support. This will also use the compiler from
|
||||
# the NDK.
|
||||
|
||||
set(CMAKE_ANDROID_NDK "$ENV{ANDROID_NDK_HOME}" CACHE STRING "")
|
||||
set(CMAKE_SYSTEM_NAME Android CACHE STRING "")
|
||||
|
||||
# Default architecture and Android API level. Selecting a much earlier API may
|
||||
# require adding a toybox build to the device's PATH.
|
||||
set(CMAKE_ANDROID_ARCH_ABI "x86_64" CACHE STRING "")
|
||||
set(CMAKE_SYSTEM_VERSION 21 CACHE STRING "")
|
||||
|
||||
# Rename libc++.so to libc++_shared.so to ensure that it doesn't interfere with
|
||||
# the libc++.so on the device, then use LD_LIBRARY_PATH to point test
|
||||
# executables at the library. Also rename the static library for consistency
|
||||
# and to help prevent -lc++ from linking libc++.a.
|
||||
set(LIBCXX_SHARED_OUTPUT_NAME c++_shared CACHE STRING "")
|
||||
set(LIBCXX_STATIC_OUTPUT_NAME c++_static CACHE STRING "")
|
||||
|
||||
# Use a different C++ namespace for the NDK libc++_shared.so to help avoid
|
||||
# symbol conflicts on older versions of Android.
|
||||
set(LIBCXX_ABI_NAMESPACE __test CACHE STRING "")
|
||||
|
||||
# The build doesn't add a suffix to an Android shared object filename, so it
|
||||
# writes both a libc++_shared.so ELF file and a libc++_shared.so linker script
|
||||
# to the same output path (the script clobbers the binary). Turn off the linker
|
||||
# script.
|
||||
set(LIBCXX_ENABLE_ABI_LINKER_SCRIPT OFF CACHE BOOL "")
|
||||
|
||||
set(LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY ON CACHE BOOL "")
|
||||
set(LIBCXXABI_ENABLE_SHARED OFF CACHE BOOL "")
|
||||
|
||||
# Use adb to push tests to a locally-connected device (e.g. emulator) and run them.
|
||||
set(LIBCXX_TEST_CONFIG "llvm-libc++-android-ndk.cfg.in" CACHE STRING "")
|
||||
set(LIBCXXABI_TEST_CONFIG "llvm-libc++abi-android-ndk.cfg.in" CACHE STRING "")
|
||||
|
||||
# CMAKE_SOURCE_DIR refers to the "<monorepo>/runtimes" directory.
|
||||
set(LIBCXX_EXECUTOR "${CMAKE_SOURCE_DIR}/../libcxx/utils/adb_run.py" CACHE STRING "")
|
||||
set(LIBCXXABI_EXECUTOR "${LIBCXX_EXECUTOR}" CACHE STRING "")
|
1
cmake/caches/Generic-no-fstream.cmake
Normal file
1
cmake/caches/Generic-no-fstream.cmake
Normal file
@ -0,0 +1 @@
|
||||
set(LIBCXX_ENABLE_FSTREAM OFF CACHE BOOL "")
|
@ -1,2 +0,0 @@
|
||||
set(LIBCXX_TEST_PARAMS "enable_transitive_includes=False" CACHE STRING "")
|
||||
set(LIBCXXABI_TEST_PARAMS "${LIBCXX_TEST_PARAMS}" CACHE STRING "")
|
@ -8,8 +8,6 @@ set(LIBCXX_USE_COMPILER_RT ON CACHE BOOL "")
|
||||
set(LIBCXXABI_USE_COMPILER_RT ON CACHE BOOL "")
|
||||
set(LIBUNWIND_USE_COMPILER_RT ON CACHE BOOL "")
|
||||
|
||||
set(LIBCXX_TARGET_INFO "libcxx.test.target_info.MingwLocalTI" CACHE STRING "")
|
||||
|
||||
# Without this flag, 'long double' (which is 80 bit on x86 mingw, but
|
||||
# 64 bit in MSVC) isn't handled correctly in printf.
|
||||
set(LIBCXX_EXTRA_SITE_DEFINES "__USE_MINGW_ANSI_STDIO=1" CACHE STRING "")
|
||||
|
22
cmake/caches/s390x-ibm-zos-ascii.cmake
Normal file
22
cmake/caches/s390x-ibm-zos-ascii.cmake
Normal file
@ -0,0 +1,22 @@
|
||||
# Common
|
||||
set(CMAKE_BUILD_TYPE Release CACHE STRING "")
|
||||
|
||||
set(LIBCXX_ENABLE_ABI_LINKER_SCRIPT OFF CACHE BOOL "")
|
||||
set(LIBCXX_ENABLE_SHARED ON CACHE BOOL "")
|
||||
set(LIBCXX_ENABLE_STATIC OFF CACHE BOOL "")
|
||||
set(LIBCXX_INCLUDE_TESTS OFF CACHE BOOL "")
|
||||
set(LIBCXX_INSTALL_HEADERS OFF CACHE BOOL "")
|
||||
set(LIBCXX_INCLUDE_BENCHMARKS OFF CACHE BOOL "")
|
||||
|
||||
set(LIBCXXABI_ENABLE_SHARED OFF CACHE BOOL "")
|
||||
set(LIBCXXABI_ENABLE_STATIC OFF CACHE BOOL "")
|
||||
set(LIBCXXABI_INCLUDE_TESTS OFF CACHE BOOL "")
|
||||
|
||||
# Target Specific
|
||||
set(LIBCXX_DLL_NAME CRTEQCXS CACHE STRING "")
|
||||
set(LIBCXX_SHARED_OUTPUT_NAME "c++_a" CACHE STRING
|
||||
"Output name for the shared libc++ runtime library.")
|
||||
set(LIBCXX_CXX_ABI system-libcxxabi CACHE STRING "")
|
||||
|
||||
set(LIBCXX_ADDITIONAL_COMPILE_FLAGS "-fzos-le-char-mode=ascii" CACHE STRING "")
|
||||
set(LIBCXX_ADDITIONAL_LIBRARIES "-L../s390x-ibm-zos/lib -Wl,../s390x-ibm-zos/lib/libunwind.x" CACHE STRING "")
|
17
cmake/caches/s390x-ibm-zos.cmake
Normal file
17
cmake/caches/s390x-ibm-zos.cmake
Normal file
@ -0,0 +1,17 @@
|
||||
set(CMAKE_BUILD_TYPE Release CACHE STRING "")
|
||||
|
||||
# Common
|
||||
set(LIBCXX_ENABLE_ABI_LINKER_SCRIPT OFF CACHE BOOL "")
|
||||
set(LIBCXX_ENABLE_SHARED ON CACHE BOOL "")
|
||||
set(LIBCXX_ENABLE_STATIC OFF CACHE BOOL "")
|
||||
set(LIBCXX_INCLUDE_TESTS ON CACHE BOOL "")
|
||||
|
||||
set(LIBCXXABI_ENABLE_SHARED ON CACHE BOOL "")
|
||||
set(LIBCXXABI_ENABLE_STATIC OFF CACHE BOOL "")
|
||||
set(LIBCXXABI_INCLUDE_TESTS ON CACHE BOOL "")
|
||||
|
||||
# Target Specific
|
||||
set(LIBCXX_DLL_NAME CRTEQCXE CACHE STRING "")
|
||||
|
||||
set(LIBCXXABI_DLL_NAME CRTEQCXA CACHE STRING "")
|
||||
set(LIBCXXABI_ADDITIONAL_LIBRARIES "-Wl,lib/libunwind.x" CACHE STRING "")
|
22
cmake/caches/s390x32-ibm-zos-ascii.cmake
Normal file
22
cmake/caches/s390x32-ibm-zos-ascii.cmake
Normal file
@ -0,0 +1,22 @@
|
||||
# Common
|
||||
set(CMAKE_BUILD_TYPE Release CACHE STRING "")
|
||||
|
||||
set(LIBCXX_ENABLE_ABI_LINKER_SCRIPT OFF CACHE BOOL "")
|
||||
set(LIBCXX_ENABLE_SHARED ON CACHE BOOL "")
|
||||
set(LIBCXX_ENABLE_STATIC OFF CACHE BOOL "")
|
||||
set(LIBCXX_INCLUDE_TESTS OFF CACHE BOOL "")
|
||||
set(LIBCXX_INSTALL_HEADERS OFF CACHE BOOL "")
|
||||
set(LIBCXX_INCLUDE_BENCHMARKS OFF CACHE BOOL "")
|
||||
|
||||
set(LIBCXXABI_ENABLE_SHARED OFF CACHE BOOL "")
|
||||
set(LIBCXXABI_ENABLE_STATIC OFF CACHE BOOL "")
|
||||
set(LIBCXXABI_INCLUDE_TESTS OFF CACHE BOOL "")
|
||||
|
||||
# Target Specific
|
||||
set(LIBCXX_DLL_NAME CRTEHCXS CACHE STRING "")
|
||||
set(LIBCXX_SHARED_OUTPUT_NAME "c++_a" CACHE STRING
|
||||
"Output name for the shared libc++ runtime library.")
|
||||
set(LIBCXX_CXX_ABI system-libcxxabi CACHE STRING "")
|
||||
|
||||
set(LIBCXX_ADDITIONAL_COMPILE_FLAGS "-fzos-le-char-mode=ascii" CACHE STRING "")
|
||||
set(LIBCXX_ADDITIONAL_LIBRARIES "-L../s390x32-ibm-zos/lib -Wl,../s390x32-ibm-zos/lib/libunwind.x" CACHE STRING "")
|
18
cmake/caches/s390x32-ibm-zos.cmake
Normal file
18
cmake/caches/s390x32-ibm-zos.cmake
Normal file
@ -0,0 +1,18 @@
|
||||
# Common
|
||||
set(CMAKE_BUILD_TYPE Release CACHE STRING "")
|
||||
|
||||
set(LIBCXX_ENABLE_ABI_LINKER_SCRIPT OFF CACHE BOOL "")
|
||||
set(LIBCXX_ENABLE_SHARED ON CACHE BOOL "")
|
||||
set(LIBCXX_ENABLE_STATIC OFF CACHE BOOL "")
|
||||
set(LIBCXX_INCLUDE_TESTS ON CACHE BOOL "")
|
||||
|
||||
set(LIBCXXABI_ENABLE_SHARED ON CACHE BOOL "")
|
||||
set(LIBCXXABI_ENABLE_STATIC OFF CACHE BOOL "")
|
||||
set(LIBCXXABI_INCLUDE_TESTS ON CACHE BOOL "")
|
||||
|
||||
# Target Specific
|
||||
set(LIBCXX_DLL_NAME CRTEHCXE CACHE STRING "")
|
||||
|
||||
set(LIBCXXABI_DLL_NAME CRTEHCXA CACHE STRING "")
|
||||
|
||||
set(LIBCXXABI_ADDITIONAL_LIBRARIES "-Wl,lib/libunwind.x" CACHE STRING "")
|
@ -61,7 +61,11 @@ if (CXX_SUPPORTS_NOSTDLIBXX_FLAG OR C_SUPPORTS_NODEFAULTLIBS_FLAG)
|
||||
include(HandleCompilerRT)
|
||||
find_compiler_rt_library(builtins LIBCXX_BUILTINS_LIBRARY
|
||||
FLAGS ${LIBCXX_COMPILE_FLAGS})
|
||||
list(APPEND CMAKE_REQUIRED_LIBRARIES "${LIBCXX_BUILTINS_LIBRARY}")
|
||||
if (LIBCXX_BUILTINS_LIBRARY)
|
||||
list(APPEND CMAKE_REQUIRED_LIBRARIES "${LIBCXX_BUILTINS_LIBRARY}")
|
||||
else()
|
||||
message(WARNING "Could not find builtins library from libc++")
|
||||
endif()
|
||||
elseif (LIBCXX_HAS_GCC_LIB)
|
||||
list(APPEND CMAKE_REQUIRED_LIBRARIES gcc)
|
||||
elseif (LIBCXX_HAS_GCC_S_LIB)
|
||||
@ -94,7 +98,7 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Werror=unknown-pragmas")
|
||||
check_c_source_compiles("
|
||||
#pragma comment(lib, \"c\")
|
||||
int main() { return 0; }
|
||||
int main(void) { return 0; }
|
||||
" C_SUPPORTS_COMMENT_LIB_PRAGMA)
|
||||
cmake_pop_check_state()
|
||||
endif()
|
||||
|
@ -46,6 +46,9 @@ it's possible to reproduce CI issues locally with ease, understanding of
|
||||
course that some setups may require access to special hardware that is not
|
||||
available.
|
||||
|
||||
Finally, add your contact info to ``libcxx/utils/ci/BOT_OWNERS.txt``. This will
|
||||
be used to contact you when there are issues with the bot.
|
||||
|
||||
Testing Your New Job
|
||||
====================
|
||||
|
||||
|
@ -157,8 +157,7 @@ e.g. the ``mingw-w64-x86_64-clang`` package), together with CMake and ninja.
|
||||
-DCMAKE_C_COMPILER=clang \
|
||||
-DCMAKE_CXX_COMPILER=clang++ \
|
||||
-DLLVM_ENABLE_RUNTIMES=libcxx \
|
||||
-DLIBCXX_CXX_ABI=libstdc++ \
|
||||
-DLIBCXX_TARGET_INFO="libcxx.test.target_info.MingwLocalTI"
|
||||
-DLIBCXX_CXX_ABI=libstdc++
|
||||
> ninja -C build cxx
|
||||
> cp /mingw64/bin/{libstdc++-6,libgcc_s_seh-1,libwinpthread-1}.dll lib
|
||||
> ninja -C build check-cxx
|
||||
@ -287,6 +286,24 @@ libc++ specific options
|
||||
Path where target-specific libc++ headers should be installed. If a relative
|
||||
path, relative to ``CMAKE_INSTALL_PREFIX``.
|
||||
|
||||
.. option:: LIBCXX_SHARED_OUTPUT_NAME:STRING
|
||||
|
||||
**Default**: ``c++``
|
||||
|
||||
Output name for the shared libc++ runtime library.
|
||||
|
||||
.. option:: LIBCXX_ADDITIONAL_COMPILE_FLAGS:STRING
|
||||
|
||||
**Default**: ``""``
|
||||
|
||||
Additional Compile only flags which can be provided in cache.
|
||||
|
||||
.. option:: LIBCXX_ADDITIONAL_LIBRARIES:STRING
|
||||
|
||||
**Default**: ``""``
|
||||
|
||||
Additional libraries libc++ is linked to which can be provided in cache.
|
||||
|
||||
|
||||
.. _ABI Library Specific Options:
|
||||
|
||||
@ -330,6 +347,18 @@ ABI Library Specific Options
|
||||
Build and use the LLVM unwinder. Note: This option can only be used when
|
||||
libc++abi is the C++ ABI library used.
|
||||
|
||||
.. option:: LIBCXXABI_ADDITIONAL_COMPILE_FLAGS:STRING
|
||||
|
||||
**Default**: ``""``
|
||||
|
||||
Additional Compile only flags which can be provided in cache.
|
||||
|
||||
.. option:: LIBCXXABI_ADDITIONAL_LIBRARIES:STRING
|
||||
|
||||
**Default**: ``""``
|
||||
|
||||
Additional libraries libc++abi is linked to which can be provided in cache.
|
||||
|
||||
|
||||
libc++ Feature Options
|
||||
----------------------
|
||||
|
@ -70,6 +70,8 @@ After branching for an LLVM release:
|
||||
2. Update the version number in ``libcxx/docs/conf.py``
|
||||
3. Update ``_LIBCPPABI_VERSION`` in ``libcxxabi/include/cxxabi.h``
|
||||
4. Update ``_LIBUNWIND_VERSION`` in ``libunwind/include/__libunwind_config.h``
|
||||
5. Update the list of supported clang versions in ``libcxx/docs/index.rst``
|
||||
6. Remove the in-progress warning from ``libcxx/docs/ReleaseNotes.rst``
|
||||
|
||||
Exporting new symbols from the library
|
||||
======================================
|
||||
@ -84,5 +86,136 @@ updated list from the failed build at
|
||||
Look for the failed build and select the ``artifacts`` tab. There, download the
|
||||
abilist for the platform, e.g.:
|
||||
|
||||
* C++20 for the Linux platform.
|
||||
* MacOS C++20 for the Apple platform.
|
||||
* C++<version>.
|
||||
* MacOS X86_64 and MacOS arm64 for the Apple platform.
|
||||
|
||||
|
||||
Pre-commit CI
|
||||
=============
|
||||
|
||||
Introduction
|
||||
------------
|
||||
|
||||
Unlike most parts of the LLVM project, libc++ uses a pre-commit CI [#]_. This
|
||||
CI is hosted on `Buildkite <https://buildkite.com/llvm-project/libcxx-ci>`__ and
|
||||
the build results are visible in the review on Phabricator. Please make sure
|
||||
the CI is green before committing a patch.
|
||||
|
||||
The CI tests libc++ for all :ref:`supported platforms <SupportedPlatforms>`.
|
||||
The build is started for every diff uploaded to Phabricator. A complete CI run
|
||||
takes approximately one hour. To reduce the load:
|
||||
|
||||
* The build is cancelled when a new diff for the same revision is uploaded.
|
||||
* The build is done in several stages and cancelled when a stage fails.
|
||||
|
||||
Typically, the libc++ jobs use a Ubuntu Docker image. This image contains
|
||||
recent `nightly builds <https://apt.llvm.org>`__ of all supported versions of
|
||||
Clang and the current version of the ``main`` branch. These versions of Clang
|
||||
are used to build libc++ and execute its tests.
|
||||
|
||||
Unless specified otherwise, the configurations:
|
||||
|
||||
* use a nightly build of the ``main`` branch of Clang,
|
||||
* execute the tests using the language C++<latest>. This is the version
|
||||
"developed" by the C++ committee.
|
||||
|
||||
.. note:: Updating the Clang nightly builds in the Docker image is a manual
|
||||
process and is done at an irregular interval on purpose. When you need to
|
||||
have the latest nightly build to test recent Clang changes, ask in the
|
||||
``#libcxx`` channel on `LLVM's Discord server
|
||||
<https://discord.gg/jzUbyP26tQ>`__.
|
||||
|
||||
.. [#] There's `LLVM Dev Meeting talk <https://www.youtube.com/watch?v=B7gB6van7Bw>`__
|
||||
explaining the benefits of libc++'s pre-commit CI.
|
||||
|
||||
Builds
|
||||
------
|
||||
|
||||
Below is a short description of the most interesting CI builds [#]_:
|
||||
|
||||
* ``Format`` runs ``clang-format`` and uploads its output as an artifact. At the
|
||||
moment this build is a soft error and doesn't fail the build.
|
||||
* ``Generated output`` runs the ``libcxx-generate-files`` build target and
|
||||
tests for non-ASCII characters in libcxx. Some files are excluded since they
|
||||
use Unicode, mainly tests. The output of these commands are uploaded as
|
||||
artifact.
|
||||
* ``Documentation`` builds the documentation. (This is done early in the build
|
||||
process since it is cheap to run.)
|
||||
* ``C++<version>`` these build steps test the various C++ versions, making sure all
|
||||
C++ language versions work with the changes made.
|
||||
* ``Clang <version>`` these build steps test whether the changes work with all
|
||||
supported Clang versions.
|
||||
* ``Booststrapping build`` builds Clang using the revision of the patch and
|
||||
uses that Clang version to build and test libc++. This validates the current
|
||||
Clang and lib++ are compatible.
|
||||
|
||||
When a crash occurs in this build, the crash reproducer is available as an
|
||||
artifact.
|
||||
|
||||
* ``Modular build`` tests libc++ using Clang modules [#]_.
|
||||
* ``GCC <version>`` tests libc++ with the latest stable GCC version. Only C++11
|
||||
and the latest C++ version are tested.
|
||||
* ``Santitizers`` tests libc++ using the Clang sanitizers.
|
||||
* ``Parts disabled`` tests libc++ with certain libc++ features disabled.
|
||||
* ``Windows`` tests libc++ using MinGW and clang-cl.
|
||||
* ``Apple`` tests libc++ on MacOS.
|
||||
* ``ARM`` tests libc++ on various Linux ARM platforms.
|
||||
* ``AIX`` tests libc++ on AIX.
|
||||
|
||||
.. [#] Not all all steps are listed: steps are added and removed when the need
|
||||
arises.
|
||||
.. [#] Clang modules are not the same as C++20's modules.
|
||||
|
||||
Infrastructure
|
||||
--------------
|
||||
|
||||
All files of the CI infrastructure are in the directory ``libcxx/utils/ci``.
|
||||
Note that quite a bit of this infrastructure is heavily Linux focused. This is
|
||||
the platform used by most of libc++'s Buildkite runners and developers.
|
||||
|
||||
Dockerfile
|
||||
~~~~~~~~~~
|
||||
|
||||
Contains the Docker image for the Ubuntu CI. Because the same Docker image is
|
||||
used for the ``main`` and ``release`` branch, it should contain no hard-coded
|
||||
versions. It contains the used versions of Clang, various clang-tools,
|
||||
GCC, and CMake.
|
||||
|
||||
.. note:: This image is pulled from Docker hub and not rebuild when changing
|
||||
the Dockerfile.
|
||||
|
||||
run-buildbot-container
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Helper script that pulls and runs the Docker image. This image mounts the LLVM
|
||||
monorepo at ``/llvm``. This can be used to test with compilers not available on
|
||||
your system.
|
||||
|
||||
run-buildbot
|
||||
~~~~~~~~~~~~
|
||||
|
||||
Contains the buld script executed on Buildkite. This script can be executed
|
||||
locally or inside ``run-buildbot-container``. The script must be called with
|
||||
the target to test. For example, ``run-buildbot generic-cxx20`` will build
|
||||
libc++ and test it using C++20.
|
||||
|
||||
.. warning:: This script will overwrite the directory ``<llvm-root>/build/XX``
|
||||
where ``XX`` is the target of ``run-buildbot``.
|
||||
|
||||
This script contains as little version information as possible. This makes it
|
||||
easy to use the script with a different compiler. This allows testing a
|
||||
combination not in the libc++ CI. It can be used to add a new (temporary)
|
||||
job to the CI. For example, testing the C++17 build with Clang-14 can be done
|
||||
like:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
CC=clang-14 CXX=clang++-14 run-buildbot generic-cxx17
|
||||
|
||||
buildkite-pipeline.yml
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Contains the jobs executed in the CI. This file contains the version
|
||||
information of the jobs being executed. Since this script differs between the
|
||||
``main`` and ``release`` branch, both branches can use different compiler
|
||||
versions.
|
||||
|
@ -35,10 +35,23 @@ user-provided comparator to assert that `!comp(y, x)` whenever `comp(x, y)`. Thi
|
||||
user-provided comparator to be evaluated up to twice as many times as it would be without the
|
||||
debug mode, and causes the library to violate some of the Standard's complexity clauses.
|
||||
|
||||
Iterator debugging checks
|
||||
-------------------------
|
||||
The library contains various assertions to check the validity of iterators used
|
||||
by the program. The following containers and classes support iterator debugging:
|
||||
Iterator bounds checking
|
||||
------------------------
|
||||
The library provides iterators that ensure they are within the bounds of their container when dereferenced.
|
||||
Arithmetic can be performed on these iterators to create out-of-bounds iterators, but they cannot be dereferenced
|
||||
when out-of-bounds. The following classes currently provide iterators that have bounds checking:
|
||||
|
||||
- ``std::string``
|
||||
- ``std::vector<T>`` (``T != bool``)
|
||||
- ``std::span``
|
||||
|
||||
.. TODO: Add support for iterator bounds checking in ``std::string_view`` and ``std::array``
|
||||
|
||||
Iterator ownership checking
|
||||
---------------------------
|
||||
The library provides iterator ownership checking, which allows catching cases where e.g.
|
||||
an iterator from container ``X`` is used as a position to insert into container ``Y``.
|
||||
The following classes support iterator ownership checking:
|
||||
|
||||
- ``std::string``
|
||||
- ``std::vector<T>`` (``T != bool``)
|
||||
@ -48,9 +61,6 @@ by the program. The following containers and classes support iterator debugging:
|
||||
- ``std::unordered_set``
|
||||
- ``std::unordered_multiset``
|
||||
|
||||
The remaining containers do not currently support iterator debugging.
|
||||
Patches welcome.
|
||||
|
||||
Randomizing unspecified behavior
|
||||
--------------------------------
|
||||
The library supports the randomization of unspecified behavior. For example, randomizing
|
||||
|
61
docs/DesignDocs/HeaderRemovalPolicy.rst
Normal file
61
docs/DesignDocs/HeaderRemovalPolicy.rst
Normal file
@ -0,0 +1,61 @@
|
||||
=====================
|
||||
Header Removal Policy
|
||||
=====================
|
||||
|
||||
Policy
|
||||
------
|
||||
|
||||
Libc++ is in the process of splitting larger headers into smaller modular
|
||||
headers. This makes it possible to remove these large headers from other
|
||||
headers. For example, instead of including ``<algorithm>`` entirely it is
|
||||
possible to only include the headers for the algorithms used. When the
|
||||
Standard indirectly adds additional header includes, using the smaller headers
|
||||
aids reducing the growth of top-level headers. For example ``<atomic>`` uses
|
||||
``std::chrono::nanoseconds`` and included ``<chrono>``. In C++20 ``<chrono>``
|
||||
requires ``<format>`` which adds several other headers (like ``<string>``,
|
||||
``<optional>``, ``<tuple>``) which are not needed in ``<atomic>``.
|
||||
|
||||
The benefit of using minimal headers is that the size of libc++'s top-level
|
||||
headers becomes smaller. This improves the compilation time when users include
|
||||
a top-level header. It also avoids header inclusion cycles and makes it easier
|
||||
to port headers to platforms with reduced functionality.
|
||||
|
||||
A disadvantage is that users unknowingly depend on these transitive includes.
|
||||
Thus removing an include might break their build after upgrading a newer
|
||||
version of libc++. For example, ``<algorithm>`` is often forgotten but using
|
||||
algorithms will still work through those transitive includes. This problem is
|
||||
solved by modules, however in practice most people do not use modules (yet).
|
||||
|
||||
To ease the removal of transitive includes in libc++, libc++ will remove
|
||||
unnecessary transitive includes in newly supported C++ versions. This means
|
||||
that users will have to fix their missing includes in order to upgrade to a
|
||||
newer version of the Standard. Libc++ also reserves the right to remove
|
||||
transitive includes at any other time, however new language versions will be
|
||||
used as a convenient way to perform bulk removals of transitive includes.
|
||||
|
||||
For libc++ developers, this means that any transitive include removal must be
|
||||
guarded by something of the form:
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <algorithm>
|
||||
# include <iterator>
|
||||
# include <utility>
|
||||
#endif
|
||||
|
||||
When users define ``_LIBCPP_REMOVE_TRANSITIVE_INCLUDES``, libc++ will not
|
||||
include transitive headers, regardless of the language version. This can be
|
||||
useful for users to aid the transition to a newer language version, or by users
|
||||
who simply want to make sure they include what they use in their code.
|
||||
|
||||
|
||||
Rationale
|
||||
---------
|
||||
|
||||
Removing headers is not only an issue for software developers, but also for
|
||||
vendors. When a vendor updates libc++ several of their upstream packages might
|
||||
fail to compile, forcing them to fix these packages or file a bug with their
|
||||
upstream packages. Usually upgrading software to a new language standard is
|
||||
done explicitly by software developers. This means they most likely will
|
||||
discover and fix the missing includes, lessening the burden for the vendors.
|
@ -1,9 +1,9 @@
|
||||
====================
|
||||
===================
|
||||
``noexcept`` Policy
|
||||
====================
|
||||
===================
|
||||
|
||||
Extended applications of ``noexcept``
|
||||
------------------------------------------
|
||||
-------------------------------------
|
||||
|
||||
As of version 13 libc++ may mark functions that do not throw (i.e.,
|
||||
"Throws: Nothing") as ``noexcept``. This has two primary consequences:
|
||||
|
@ -126,7 +126,7 @@ Status
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_math_special_functions`` *unimplemented*
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_memory_resource`` *unimplemented*
|
||||
``__cpp_lib_memory_resource`` ``201603L``
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_node_extract`` ``201606L``
|
||||
------------------------------------------------- -----------------
|
||||
@ -202,7 +202,7 @@ Status
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_constexpr_algorithms`` ``201806L``
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_constexpr_complex`` *unimplemented*
|
||||
``__cpp_lib_constexpr_complex`` ``201711L``
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_constexpr_dynamic_alloc`` ``201907L``
|
||||
------------------------------------------------- -----------------
|
||||
@ -222,7 +222,7 @@ Status
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_constexpr_utility`` ``201811L``
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_constexpr_vector`` *unimplemented*
|
||||
``__cpp_lib_constexpr_vector`` ``201907L``
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_coroutine`` ``201902L``
|
||||
------------------------------------------------- -----------------
|
||||
@ -234,7 +234,7 @@ Status
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_execution`` *unimplemented*
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_format`` ``202106L``
|
||||
``__cpp_lib_format`` *unimplemented*
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_generic_unordered_lookup`` ``201811L``
|
||||
------------------------------------------------- -----------------
|
||||
@ -260,9 +260,9 @@ Status
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_math_constants`` ``201907L``
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_polymorphic_allocator`` *unimplemented*
|
||||
``__cpp_lib_polymorphic_allocator`` ``201902L``
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_ranges`` *unimplemented*
|
||||
``__cpp_lib_ranges`` ``202106L``
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_remove_cvref`` ``201711L``
|
||||
------------------------------------------------- -----------------
|
||||
@ -274,7 +274,7 @@ Status
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_smart_ptr_for_overwrite`` *unimplemented*
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_source_location`` *unimplemented*
|
||||
``__cpp_lib_source_location`` ``201907L``
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_span`` ``202002L``
|
||||
------------------------------------------------- -----------------
|
||||
@ -308,10 +308,20 @@ Status
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_byteswap`` ``202110L``
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_constexpr_bitset`` ``202207L``
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_constexpr_charconv`` ``202207L``
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_constexpr_cmath`` *unimplemented*
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_constexpr_memory`` ``202202L``
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_constexpr_typeinfo`` *unimplemented*
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_expected`` ``202202L``
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_forward_like`` ``202207L``
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_invoke_r`` *unimplemented*
|
||||
------------------------------------------------- -----------------
|
||||
``__cpp_lib_is_scoped_enum`` ``202011L``
|
||||
|
@ -21,6 +21,8 @@
|
||||
.format { background-color: #FFE4B5; }
|
||||
.ranges { background-color: #7FFFD4; }
|
||||
.spaceship { background-color: #B0E0E6; }
|
||||
.fc { background-color: #8EAF63; white-space:nowrap; }
|
||||
.concurrency { background-color: #909090; white-space:nowrap; }
|
||||
</style>
|
||||
|
||||
.. role:: notstarted
|
||||
@ -41,11 +43,15 @@
|
||||
.. role:: format
|
||||
.. role:: ranges
|
||||
.. role:: spaceship
|
||||
.. role:: fc
|
||||
.. role:: concurrency
|
||||
|
||||
.. |chrono| replace:: :chrono:`chrono`
|
||||
.. |format| replace:: :format:`format`
|
||||
.. |ranges| replace:: :ranges:`ranges`
|
||||
.. |spaceship| replace:: :spaceship:`spaceship`
|
||||
.. |flat_containers| replace:: :fc:`flat containers`
|
||||
.. |concurrency TS| replace:: :concurrency:`concurrency TS`
|
||||
|
||||
.. |sect| unicode:: U+00A7
|
||||
.. |hellip| unicode:: U+2026
|
||||
|
@ -1,5 +1,5 @@
|
||||
=========================================
|
||||
Libc++ 15.0.0 (In-Progress) Release Notes
|
||||
Libc++ 17.0.0 (In-Progress) Release Notes
|
||||
=========================================
|
||||
|
||||
.. contents::
|
||||
@ -10,7 +10,7 @@ Written by the `Libc++ Team <https://libcxx.llvm.org>`_
|
||||
|
||||
.. warning::
|
||||
|
||||
These are in-progress notes for the upcoming libc++ 15 release.
|
||||
These are in-progress notes for the upcoming libc++ 17 release.
|
||||
Release notes for previous releases can be found on
|
||||
`the Download Page <https://releases.llvm.org/download.html>`_.
|
||||
|
||||
@ -18,7 +18,7 @@ Introduction
|
||||
============
|
||||
|
||||
This document contains the release notes for the libc++ C++ Standard Library,
|
||||
part of the LLVM Compiler Infrastructure, release 15.0.0. Here we describe the
|
||||
part of the LLVM Compiler Infrastructure, release 17.0.0. Here we describe the
|
||||
status of libc++ in some detail, including major improvements from the previous
|
||||
release and new feature work. For the general LLVM release notes, see `the LLVM
|
||||
documentation <https://llvm.org/docs/ReleaseNotes.html>`_. All LLVM releases may
|
||||
@ -32,238 +32,30 @@ main Libc++ web page, this document applies to the *next* release, not
|
||||
the current one. To see the release notes for a specific release, please
|
||||
see the `releases page <https://llvm.org/releases/>`_.
|
||||
|
||||
What's New in Libc++ 15.0.0?
|
||||
What's New in Libc++ 17.0.0?
|
||||
============================
|
||||
|
||||
The main focus of the libc++ team has been to implement new C++20 and C++23
|
||||
features.
|
||||
|
||||
The C++20 ``format`` library is feature complete, but not all Standard LWG
|
||||
issues have been addressed. Since it is expected that at least one of these
|
||||
issues will cause an ABI break the ``format`` library is considered
|
||||
experimental.
|
||||
|
||||
The C++20 ``ranges`` library has progressed a lot since the last release and is
|
||||
almost complete. The ``ranges`` library is considered experimental.
|
||||
|
||||
|
||||
Implemented Papers
|
||||
------------------
|
||||
|
||||
- P1004R2 - Making ``std::vector`` constexpr
|
||||
- P0627R6 - Function to mark unreachable code
|
||||
- P1165R1 - Make stateful allocator propagation more consistent for ``operator+(basic_string)``
|
||||
- P0674R1 - Support arrays in ``make_shared`` and ``allocate_shared``
|
||||
- P0980R1 - Making ``std::string`` constexpr
|
||||
- P2216R3 - ``std::format`` improvements
|
||||
- P0174R2 - Deprecating Vestigial Library Parts in C++17
|
||||
- N4190 - Removing ``auto_ptr``, ``random_shuffle()``, And Old ``<functional>`` Stuff
|
||||
- P0154R1 - Hardware inference size
|
||||
- P0618R0 - Deprecating ``<codecvt>``
|
||||
- P2418R2 - Add support for ``std::generator``-like types to ``std::format``
|
||||
- LWG3659 - Consider ``ATOMIC_FLAG_INIT`` undeprecation
|
||||
- P1423R3 - ``char8_t`` backward compatibility remediation
|
||||
|
||||
- Marked the following papers as "Complete" (note that some of those might have
|
||||
been implemented in a previous release but not marked as such):
|
||||
|
||||
- P1207R4 - Movability of Single-pass Iterators
|
||||
- P1474R1 - Helpful pointers for ``ContiguousIterator``
|
||||
- P1522R1 - Iterator Difference Type and Integer Overflow
|
||||
- P1523R1 - Views and Size Types
|
||||
- P1456R1 - Move-only views
|
||||
- P1870R1 - ``forwarding-range`` is too subtle
|
||||
- P1878R1 - Constraining Readable Types
|
||||
- P1970R2 - Consistency for ``size()`` functions: Add ``ranges::ssize``
|
||||
- P1983R0 - Wording for GB301, US296, US292, US291, and US283
|
||||
|
||||
Improvements and New Features
|
||||
-----------------------------
|
||||
|
||||
- ``std::pop_heap`` now uses an algorithm known as "bottom-up heapsort" or
|
||||
"heapsort with bounce" to reduce the number of comparisons, and rearranges
|
||||
elements using move-assignment instead of ``std::swap``.
|
||||
|
||||
- Libc++ now supports a variety of assertions that can be turned on to help catch
|
||||
undefined behavior in user code. This new support is now separate from the old
|
||||
(and incomplete) Debug Mode. Vendors can select whether the library they ship
|
||||
should include assertions or not by default. For details, see
|
||||
:ref:`the documentation <assertions-mode>` about this new feature.
|
||||
|
||||
- Clang now implements the ``-fexperimental-library`` flag. This flag can be used to
|
||||
enable experimental library features such as TSes and other in-progress work like
|
||||
``<ranges>`` and ``<format>``. Using this flag makes it unnecessary to manually link
|
||||
against ``libc++experimental.a`` -- just use ``-fexperimental-library`` and the
|
||||
compiler will do what's needed to make experimental features work. However, be
|
||||
aware that experimental features are not stable!
|
||||
|
||||
- The implementation of the function ``std::to_chars`` for integral types using
|
||||
base 10 has moved from the dylib to the header. This means the function no
|
||||
longer has a minimum deployment target.
|
||||
|
||||
- The performance for ``std::to_chars``, for integral types using base 2, 8,
|
||||
10, or 16 has been improved.
|
||||
|
||||
- The functions ``std::from_chars`` and ``std::to_chars`` now have 128-bit integral
|
||||
support.
|
||||
|
||||
- The format functions (``std::format``, ``std::format_to``, ``std::format_to_n``, and
|
||||
``std::formatted_size``) now validate the format string at compile time.
|
||||
When the format string is invalid this will make the code ill-formed instead
|
||||
of throwing an exception at run-time. (This does not affect the ``v``
|
||||
functions.)
|
||||
|
||||
- All format functions in ``<format>`` allow the usage of non-copyable types as
|
||||
argument for the formatting functions. This change causes bit fields to become
|
||||
invalid arguments for the formatting functions.
|
||||
|
||||
- The ``_LIBCPP_ENABLE_CXX20_REMOVED_ALLOCATOR_VOID_SPECIALIZATION`` macro has been added to allow
|
||||
re-enabling the ``allocator<void>`` specialization. When used in conjunction with
|
||||
``_LIBCPP_ENABLE_CXX20_REMOVED_ALLOCATOR_MEMBERS``, this ensures that the members of
|
||||
``allocator<void>`` removed in C++20 can be accessed.
|
||||
|
||||
- ``boyer_moore_searcher`` and ``boyer_moore_horspool_searcher`` have been implemented.
|
||||
|
||||
- ``vector<bool>::const_reference``, ``vector<bool>::const_iterator::reference``
|
||||
and ``bitset::const_reference`` are now aliases for `bool` in the unstable ABI,
|
||||
which improves libc++'s conformance to the Standard.
|
||||
|
||||
Deprecations and Removals
|
||||
-------------------------
|
||||
|
||||
- The header ``<experimental/filesystem>`` has been removed. Instead, use
|
||||
``<filesystem>`` header. The associated macro
|
||||
``_LIBCPP_DEPRECATED_EXPERIMENTAL_FILESYSTEM`` has been removed too.
|
||||
|
||||
- The C++14 function ``std::quoted(const char*)`` is no longer supported in
|
||||
C++03 or C++11 modes.
|
||||
|
||||
- Setting a custom debug handler with ``std::__libcpp_debug_function`` is not
|
||||
supported anymore. Please migrate to using the new support for
|
||||
:ref:`assertions <assertions-mode>` instead.
|
||||
|
||||
- ``std::function`` has been removed in C++03. If you are using it, please remove usages
|
||||
or upgrade to C++11 or later. It is possible to re-enable ``std::function`` in C++03 by defining
|
||||
``_LIBCPP_ENABLE_CXX03_FUNCTION``. This option will be removed in LLVM 16.
|
||||
|
||||
- ``unary_function`` and ``binary_function`` are no longer available in C++17 and C++20.
|
||||
They can be re-enabled by defining ``_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION``.
|
||||
They are also marked as ``[[deprecated]]`` in C++11 and later. To disable deprecation warnings
|
||||
you have to define ``_LIBCPP_DISABLE_DEPRECATION_WARNINGS``. Note that this disables
|
||||
all deprecation warnings.
|
||||
|
||||
- The contents of ``<codecvt>``, ``wstring_convert`` and ``wbuffer_convert`` have been marked as deprecated.
|
||||
To disable deprecation warnings you have to define ``_LIBCPP_DISABLE_DEPRECATION_WARNINGS``. Note that this
|
||||
disables all deprecation warnings.
|
||||
|
||||
- The ``_LIBCPP_DISABLE_EXTERN_TEMPLATE`` macro is not honored anymore when defined by
|
||||
users of libc++. Instead, users not wishing to take a dependency on libc++ should link
|
||||
against the static version of libc++, which will result in no dependency being
|
||||
taken against the shared library.
|
||||
|
||||
- The ``_LIBCPP_ABI_UNSTABLE`` macro has been removed in favour of setting
|
||||
``_LIBCPP_ABI_VERSION=2``. This should not have any impact on users because
|
||||
they were not supposed to set ``_LIBCPP_ABI_UNSTABLE`` manually, however we
|
||||
still feel that it is worth mentioning in the release notes in case some users
|
||||
had been doing it.
|
||||
|
||||
- The integer distributions ``binomial_distribution``, ``discrete_distribution``,
|
||||
``geometric_distribution``, ``negative_binomial_distribution``, ``poisson_distribution``,
|
||||
and ``uniform_int_distribution`` now conform to the Standard by rejecting
|
||||
template parameter types other than ``short``, ``int``, ``long``, ``long long``,
|
||||
and the unsigned versions thereof. As an extension, ``int8_t``, ``__int128_t`` and
|
||||
their unsigned versions are supported too. In particular, instantiating these
|
||||
distributions with non-integer types like ``bool`` and ``char`` will not compile
|
||||
anymore.
|
||||
|
||||
Upcoming Deprecations and Removals
|
||||
----------------------------------
|
||||
|
||||
- The ``_LIBCPP_DEBUG`` macro is not supported anymore. It will be honoured until
|
||||
LLVM 16, and then it will be an error to define that macro. To enable basic
|
||||
assertions (previously ``_LIBCPP_DEBUG=0``), please use ``_LIBCPP_ENABLE_ASSERTIONS=1``.
|
||||
To enable the debug mode (previously ``_LIBCPP_DEBUG=1|2``), please ensure that
|
||||
the library has been built with support for the debug mode, and it will be
|
||||
enabled automatically (no need to define ``_LIBCPP_DEBUG``).
|
||||
- The ``_LIBCPP_AVAILABILITY_CUSTOM_VERBOSE_ABORT_PROVIDED`` macro will not be honored anymore in LLVM 18.
|
||||
Please see the updated documentation about the safe libc++ mode and in particular the ``_LIBCPP_VERBOSE_ABORT``
|
||||
macro for details.
|
||||
|
||||
- The experimental versions of ``boyer_moore_searcher`` and ``boyer_moore_horspool_searcher``
|
||||
will be removed in LLVM 17. You can disable the deprecation warnings by defining
|
||||
``_LIBCPP_NO_EXPERIMENTAL_DEPRECATION_WARNING_SEARCHERS``.
|
||||
|
||||
- The implementation of the Coroutines TS in ``std::experimental`` will be removed in LLVM 16.
|
||||
|
||||
- Libc++ is getting ready to remove unnecessary transitive inclusions. This may
|
||||
break your code in the future. To future-proof your code to these removals,
|
||||
please compile your code with ``_LIBCPP_REMOVE_TRANSITIVE_INCLUDES`` defined
|
||||
and fix any compilation error resulting from missing includes.
|
||||
API Changes
|
||||
-----------
|
||||
|
||||
ABI Affecting Changes
|
||||
---------------------
|
||||
|
||||
- The ``_LIBCPP_ABI_USE_CXX03_NULLPTR_EMULATION`` macro controlling whether we use an
|
||||
emulation for ``std::nullptr_t`` in C++03 mode has been removed. After this change,
|
||||
``_LIBCPP_ABI_USE_CXX03_NULLPTR_EMULATION`` will not be honoured anymore and there
|
||||
will be no way to opt back into the C++03 emulation of ``std::nullptr_t``.
|
||||
|
||||
- On FreeBSD, NetBSD, DragonFlyBSD and Solaris, ``std::random_device`` is now implemented on
|
||||
top of ``arc4random()`` instead of reading from ``/dev/urandom``. Any implementation-defined
|
||||
token used when constructing a ``std::random_device`` will now be ignored instead of
|
||||
interpreted as a file to read entropy from.
|
||||
|
||||
- ``std::valarray``'s unary operators ``!``, ``+``, ``~`` and ``-`` now return an expression
|
||||
object instead of a ``valarray``. This was done to fix an issue where any expression involving
|
||||
other ``valarray`` operators and one of these unary operators would end up with a dangling
|
||||
reference. This is a potential ABI break for code that exposes ``std::valarray`` on an ABI
|
||||
boundary, specifically if the return type of an ABI-boundary function is ``auto``-deduced
|
||||
from an expression involving unary operators on ``valarray``. If you are concerned by this,
|
||||
you can audit whether your executable or library exports any function that returns a
|
||||
``valarray``, and if so ensure that any such function uses ``std::valarray`` directly
|
||||
as a return type instead of relying on the type of ``valarray``-expressions, which is
|
||||
not guaranteed by the Standard anyway.
|
||||
|
||||
- By default, the legacy debug mode symbols are not provided with the library anymore. If
|
||||
you are a vendor and need to re-enable them, please use the ``LIBCXX_ENABLE_BACKWARDS_COMPATIBILITY_DEBUG_MODE_SYMBOLS``
|
||||
CMake flag, and contact the libc++ developers as this will be removed in LLVM 16.
|
||||
Furthermore, please note that ``LIBCXX_ENABLE_DEBUG_MODE_SUPPORT`` is not honored anymore.
|
||||
|
||||
Build System Changes
|
||||
--------------------
|
||||
|
||||
- Support for standalone builds have been entirely removed from libc++, libc++abi and
|
||||
libunwind. Please use :ref:`these instructions <build instructions>` for building
|
||||
libc++, libc++abi and/or libunwind.
|
||||
|
||||
- The ``{LIBCXX,LIBCXXABI,LIBUNWIND}_TARGET_TRIPLE``, ``{LIBCXX,LIBCXXABI,LIBUNWIND}_SYSROOT`` and
|
||||
``{LIBCXX,LIBCXXABI,LIBUNWIND}_GCC_TOOLCHAIN`` CMake variables have been removed. Instead, please
|
||||
use the ``CMAKE_CXX_COMPILER_TARGET``, ``CMAKE_SYSROOT`` and ``CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN``
|
||||
variables provided by CMake.
|
||||
|
||||
- When building for Windows, vendors who want to avoid dll-exporting symbols from the static libc++abi
|
||||
library should set ``LIBCXXABI_HERMETIC_STATIC_LIBRARY=ON`` when configuring CMake. The current
|
||||
behavior, which tries to guess the correct dll-export semantics based on whether we're building
|
||||
the libc++ shared library, will be removed in LLVM 16.
|
||||
|
||||
- Previously, the C++ ABI library headers would be installed inside ``<prefix>/include/c++/v1``
|
||||
alongside the libc++ headers as part of building libc++. This is not the case anymore -- the
|
||||
ABI library is expected to install its headers where it wants them as part of its own build.
|
||||
Note that no action is required for most users, who build libc++ against libc++abi, since
|
||||
libc++abi already installs its headers in the right location. However, vendors building
|
||||
libc++ against alternate ABI libraries should make sure that their ABI library installs
|
||||
its own headers.
|
||||
|
||||
- The legacy testing configuration is now deprecated and will be removed in LLVM 16. For
|
||||
most users, this should not have any impact. However, if you are testing libc++, libc++abi, or
|
||||
libunwind in a configuration or on a platform that used to be supported by the legacy testing
|
||||
configuration and isn't supported by one of the configurations in ``libcxx/test/configs``,
|
||||
``libcxxabi/test/configs``, or ``libunwind/test/configs``, please move to one of those
|
||||
configurations or define your own.
|
||||
|
||||
- MinGW DLL builds of libc++ no longer use dllimport in their headers, which
|
||||
means that the same set of installed headers works for both DLL and static
|
||||
linkage. This means that distributors finally can build both library
|
||||
versions with a single CMake invocation.
|
||||
|
||||
- The ``LIBCXX_HIDE_FROM_ABI_PER_TU_BY_DEFAULT`` configuration option has been removed. Indeed,
|
||||
the risk of ODR violations from mixing different versions of libc++ in the same program has
|
||||
been mitigated with a different technique that is simpler and does not have the drawbacks of
|
||||
using internal linkage.
|
||||
|
@ -176,7 +176,7 @@
|
||||
"`2720 <https://wg21.link/LWG2720>`__","permissions function incorrectly specified for symlinks","Oulu","|Complete|",""
|
||||
"`2721 <https://wg21.link/LWG2721>`__","remove_all has incorrect post conditions","Oulu","|Complete|",""
|
||||
"`2723 <https://wg21.link/LWG2723>`__","Do directory_iterator and recursive_directory_iterator become the end iterator upon error?","Oulu","|Complete|",""
|
||||
"`2724 <https://wg21.link/LWG2724>`__","The protected virtual member functions of memory_resource should be private","Oulu","",""
|
||||
"`2724 <https://wg21.link/LWG2724>`__","The protected virtual member functions of memory_resource should be private","Oulu","|Complete|","16.0"
|
||||
"`2725 <https://wg21.link/LWG2725>`__","filesystem::exists(const path&, error_code&) error reporting","Oulu","|Complete|",""
|
||||
"`2726 <https://wg21.link/LWG2726>`__","``[recursive_]directory_iterator::increment(error_code&)`` is underspecified","Oulu","|Complete|",""
|
||||
"`2727 <https://wg21.link/LWG2727>`__","Parallel algorithms with constexpr specifier","Oulu","",""
|
||||
|
|
@ -27,7 +27,7 @@
|
||||
"","","","","",""
|
||||
"`P0024R2 <https://wg21.link/P0024R2>`__","LWG","The Parallelism TS Should be Standardized","Jacksonville","",""
|
||||
"`P0226R1 <https://wg21.link/P0226R1>`__","LWG","Mathematical Special Functions for C++17","Jacksonville","",""
|
||||
"`P0220R1 <https://wg21.link/P0220R1>`__","LWG","Adopt Library Fundamentals V1 TS Components for C++17","Jacksonville","|In Progress|",""
|
||||
"`P0220R1 <https://wg21.link/P0220R1>`__","LWG","Adopt Library Fundamentals V1 TS Components for C++17","Jacksonville","|Complete|","16.0"
|
||||
"`P0218R1 <https://wg21.link/P0218R1>`__","LWG","Adopt the File System TS for C++17","Jacksonville","|Complete|","7.0"
|
||||
"`P0033R1 <https://wg21.link/P0033R1>`__","LWG","Re-enabling shared_from_this","Jacksonville","|Complete|","3.9"
|
||||
"`P0005R4 <https://wg21.link/P0005R4>`__","LWG","Adopt not_fn from Library Fundamentals 2 for C++17","Jacksonville","|Complete|","3.9"
|
||||
|
|
@ -40,7 +40,7 @@ Paper Status
|
||||
|
||||
.. note::
|
||||
|
||||
.. [#note-P0600] P0600: The missing bits in P0600 are in |sect|\ [mem.res.class] and |sect|\ [mem.poly.allocator.class].
|
||||
.. [#note-P0591] P0591: The changes in [mem.poly.allocator.mem] are missing.
|
||||
.. [#note-P0645] P0645: The paper is implemented but still marked as an incomplete feature
|
||||
(the feature-test macro is not set and the libary is only available when built with ``-fexperimental-library``).
|
||||
Not yet implemented LWG-issues will cause API and ABI breakage.
|
||||
@ -50,7 +50,6 @@ Paper Status
|
||||
.. [#note-P0883.2] P0883: ``ATOMIC_FLAG_INIT`` was marked deprecated in version 14.0, but was undeprecated with the implementation of LWG3659 in version 15.0.
|
||||
.. [#note-P2231] P2231: Optional is complete. The changes to variant haven't been implemented yet.
|
||||
|
||||
|
||||
.. _issues-status-cxx20:
|
||||
|
||||
Library Working Group Issues Status
|
||||
|
@ -9,10 +9,10 @@
|
||||
"`2940 <https://wg21.link/LWG2940>`__","``result_of``\ specification also needs a little cleanup","Toronto","|Nothing To Do|",""
|
||||
"`2942 <https://wg21.link/LWG2942>`__","LWG 2873's resolution missed ``weak_ptr::owner_before``\ ","Toronto","|Complete|",""
|
||||
"`2954 <https://wg21.link/LWG2954>`__","Specialization of the convenience variable templates should be prohibited","Toronto","|Complete|",""
|
||||
"`2961 <https://wg21.link/LWG2961>`__","Bad postcondition for ``set_default_resource``\ ","Toronto","",""
|
||||
"`2961 <https://wg21.link/LWG2961>`__","Bad postcondition for ``set_default_resource``\ ","Toronto","|Complete|","16.0"
|
||||
"`2966 <https://wg21.link/LWG2966>`__","Incomplete resolution of US 74","Toronto","|Nothing To Do|",""
|
||||
"`2974 <https://wg21.link/LWG2974>`__","Diagnose out of bounds ``tuple_element/variant_alternative``\ ","Toronto","|Complete|",""
|
||||
"","","","",""
|
||||
"","","","","",""
|
||||
"`2779 <https://wg21.link/LWG2779>`__","[networking.ts] Relax requirements on buffer sequence iterators","Albuquerque","",""
|
||||
"`2870 <https://wg21.link/LWG2870>`__","Default value of parameter theta of polar should be dependent","Albuquerque","|Complete|",""
|
||||
"`2935 <https://wg21.link/LWG2935>`__","What should create_directories do when p already exists but is not a directory?","Albuquerque","|Nothing To Do|",""
|
||||
@ -29,7 +29,7 @@
|
||||
"`2972 <https://wg21.link/LWG2972>`__","What is ``is_trivially_destructible_v<int>``\ ?","Albuquerque","|Complete|",""
|
||||
"`2976 <https://wg21.link/LWG2976>`__","Dangling uses_allocator specialization for packaged_task","Albuquerque","|Complete|",""
|
||||
"`2977 <https://wg21.link/LWG2977>`__","unordered_meow::merge() has incorrect Throws: clause","Albuquerque","|Nothing To Do|",""
|
||||
"`2978 <https://wg21.link/LWG2978>`__","Hash support for pmr::string and friends","Albuquerque","",""
|
||||
"`2978 <https://wg21.link/LWG2978>`__","Hash support for pmr::string and friends","Albuquerque","|Complete|","16.0"
|
||||
"`2979 <https://wg21.link/LWG2979>`__","aligned_union should require complete object types","Albuquerque","|Complete|",""
|
||||
"`2980 <https://wg21.link/LWG2980>`__","Cannot compare_exchange empty pointers","Albuquerque","",""
|
||||
"`2981 <https://wg21.link/LWG2981>`__","Remove redundant deduction guides from standard library","Albuquerque","|Nothing To Do|",""
|
||||
@ -39,7 +39,7 @@
|
||||
"`2998 <https://wg21.link/LWG2998>`__","Requirements on function objects passed to {``forward_``,}list-specific algorithms","Albuquerque","|Nothing To Do|",""
|
||||
"`3001 <https://wg21.link/LWG3001>`__","weak_ptr::element_type needs remove_extent_t","Albuquerque","|Complete|","14.0"
|
||||
"`3024 <https://wg21.link/LWG3024>`__","variant's copies must be deleted instead of disabled via SFINAE","Albuquerque","|Complete|",""
|
||||
"","","","",""
|
||||
"","","","","",""
|
||||
"`2164 <https://wg21.link/LWG2164>`__","What are the semantics of ``vector.emplace(vector.begin(), vector.back())``\ ?","Jacksonville","|Complete|",""
|
||||
"`2243 <https://wg21.link/LWG2243>`__","``istream::putback``\ problem","Jacksonville","|Complete|",""
|
||||
"`2816 <https://wg21.link/LWG2816>`__","``resize_file``\ has impossible postcondition","Jacksonville","|Nothing To Do|",""
|
||||
@ -50,7 +50,7 @@
|
||||
"`2969 <https://wg21.link/LWG2969>`__","``polymorphic_allocator::construct()``\ shouldn't pass ``resource()``\ ","Jacksonville","|Complete|",""
|
||||
"`2975 <https://wg21.link/LWG2975>`__","Missing case for ``pair``\ construction in scoped and polymorphic allocators","Jacksonville","",""
|
||||
"`2989 <https://wg21.link/LWG2989>`__","``path``\ 's stream insertion operator lets you insert everything under the sun","Jacksonville","|Complete|",""
|
||||
"`3000 <https://wg21.link/LWG3000>`__","``monotonic_memory_resource::do_is_equal``\ uses ``dynamic_cast``\ unnecessarily","Jacksonville","",""
|
||||
"`3000 <https://wg21.link/LWG3000>`__","``monotonic_memory_resource::do_is_equal``\ uses ``dynamic_cast``\ unnecessarily","Jacksonville","|Complete|","16.0"
|
||||
"`3002 <https://wg21.link/LWG3002>`__","[networking.ts] ``basic_socket_acceptor::is_open()``\ isn't ``noexcept``\ ","Jacksonville","",""
|
||||
"`3004 <https://wg21.link/LWG3004>`__","|sect|\ [string.capacity] and |sect|\ [vector.capacity] should specify time complexity for ``capacity()``\ ","Jacksonville","|Nothing To Do|",""
|
||||
"`3005 <https://wg21.link/LWG3005>`__","Destruction order of arrays by ``make_shared/allocate_shared``\ only recommended?","Jacksonville","",""
|
||||
@ -74,7 +74,7 @@
|
||||
"`3048 <https://wg21.link/LWG3048>`__","``transform_reduce(exec, first1, last1, first2, init)``\ discards execution policy","Jacksonville","",""
|
||||
"`3051 <https://wg21.link/LWG3051>`__","Floating point classifications were inadvertently changed in P0175","Jacksonville","|Nothing To Do|",""
|
||||
"`3075 <https://wg21.link/LWG3075>`__","``basic_string``\ needs deduction guides from ``basic_string_view``\ ","Jacksonville","|Complete|",""
|
||||
"","","","",""
|
||||
"","","","","",""
|
||||
"`2139 <https://wg21.link/LWG2139>`__","What is a user-defined type?","Rapperswil","",""
|
||||
"`2970 <https://wg21.link/LWG2970>`__","Return type of std::visit misspecified","Rapperswil","",""
|
||||
"`3058 <https://wg21.link/LWG3058>`__","Parallel adjacent_difference shouldn't require creating temporaries","Rapperswil","",""
|
||||
@ -90,7 +90,7 @@
|
||||
"`3100 <https://wg21.link/LWG3100>`__","Unnecessary and confusing ""empty span"" wording","Rapperswil","|Nothing To Do|",""
|
||||
"`3102 <https://wg21.link/LWG3102>`__","Clarify span iterator and ``const_iterator`` behavior","Rapperswil","|Complete|",""
|
||||
"`3104 <https://wg21.link/LWG3104>`__","Fixing duration division","Rapperswil","|Complete|",""
|
||||
"","","","",""
|
||||
"","","","","",""
|
||||
"`2183 <https://wg21.link/LWG2183>`__","Muddled allocator requirements for ``match_results``\ constructors","San Diego","|Complete|",""
|
||||
"`2184 <https://wg21.link/LWG2184>`__","Muddled allocator requirements for ``match_results``\ assignments","San Diego","|Complete|",""
|
||||
"`2412 <https://wg21.link/LWG2412>`__","``promise::set_value()``\ and ``promise::get_future()``\ should not race","San Diego","",""
|
||||
@ -107,7 +107,7 @@
|
||||
"`3022 <https://wg21.link/LWG3022>`__","``is_convertible<derived*, base*>``\ may lead to ODR","San Diego","Resolved by 1285R0",""
|
||||
"`3025 <https://wg21.link/LWG3025>`__","Map-like container deduction guides should use ``pair<Key, T>``\ , not ``pair<const Key, T>``\ ","San Diego","|Complete|",""
|
||||
"`3031 <https://wg21.link/LWG3031>`__","Algorithms and predicates with non-const reference arguments","San Diego","",""
|
||||
"`3037 <https://wg21.link/LWG3037>`__","``polymorphic_allocator``\ and incomplete types","San Diego","",""
|
||||
"`3037 <https://wg21.link/LWG3037>`__","``polymorphic_allocator``\ and incomplete types","San Diego","|Complete|","16.0"
|
||||
"`3038 <https://wg21.link/LWG3038>`__","``polymorphic_allocator::allocate``\ should not allow integer overflow to create vulnerabilities","San Diego","|Complete|","14.0"
|
||||
"`3054 <https://wg21.link/LWG3054>`__","``uninitialized_copy``\ appears to not be able to meet its exception-safety guarantee","San Diego","|Nothing To Do|",""
|
||||
"`3065 <https://wg21.link/LWG3065>`__","LWG 2989 missed that all ``path``\ 's other operators should be hidden friends as well","San Diego","|Complete|",""
|
||||
@ -128,7 +128,7 @@
|
||||
"`3148 <https://wg21.link/LWG3148>`__","``<concepts>``\ should be freestanding","San Diego","",""
|
||||
"`3153 <https://wg21.link/LWG3153>`__","``Common``\ and ``common_type``\ have too little in common","San Diego","|Complete|","13.0"
|
||||
"`3154 <https://wg21.link/LWG3154>`__","``Common``\ and ``CommonReference``\ have a common defect","San Diego","|Nothing To Do|",""
|
||||
"","","","",""
|
||||
"","","","","",""
|
||||
"`3012 <https://wg21.link/LWG3012>`__","``atomic<T>``\ is unimplementable for non-``is_trivially_copy_constructible T``\ ","Kona","",""
|
||||
"`3040 <https://wg21.link/LWG3040>`__","``basic_string_view::starts_with``\ *Effects* are incorrect","Kona","|Complete|",""
|
||||
"`3077 <https://wg21.link/LWG3077>`__","``(push|emplace)_back``\ should invalidate the ``end``\ iterator","Kona","|Nothing To Do|",""
|
||||
@ -142,14 +142,14 @@
|
||||
"`3179 <https://wg21.link/LWG3179>`__","``subrange``\ should always model ``Range``\ ","Kona","|Nothing To Do|","","|ranges|"
|
||||
"`3180 <https://wg21.link/LWG3180>`__","Inconsistently named return type for ``ranges::minmax_element``\ ","Kona","|Complete|","15.0","|ranges|"
|
||||
"`3182 <https://wg21.link/LWG3182>`__","Specification of ``Same``\ could be clearer","Kona","|Complete|","15.0"
|
||||
"","","","",""
|
||||
"","","","","",""
|
||||
"`2899 <https://wg21.link/LWG2899>`__","``is_(nothrow_)move_constructible``\ and ``tuple``\ , ``optional``\ and ``unique_ptr``\ ","Cologne","",""
|
||||
"`3055 <https://wg21.link/LWG3055>`__","``path::operator+=(*single-character*)``\ misspecified","Cologne","|Complete|","7.0"
|
||||
"`3158 <https://wg21.link/LWG3158>`__","``tuple(allocator_arg_t, const Alloc&)``\ should be conditionally explicit","Cologne","|Complete|","10.0"
|
||||
"`3169 <https://wg21.link/LWG3169>`__","``ranges``\ permutation generators discard useful information","Cologne","|Complete|","15.0","|ranges|"
|
||||
"`3183 <https://wg21.link/LWG3183>`__","Normative permission to specialize Ranges variable templates","Cologne","|Nothing To Do|","","|ranges|"
|
||||
"`3184 <https://wg21.link/LWG3184>`__","Inconsistencies in ``bind_front``\ wording","Cologne","|Complete|","13.0"
|
||||
"`3185 <https://wg21.link/LWG3185>`__","Uses-allocator construction functions missing ``constexpr``\ and ``noexcept``\ ","Cologne","",""
|
||||
"`3185 <https://wg21.link/LWG3185>`__","Uses-allocator construction functions missing ``constexpr``\ and ``noexcept``\ ","Cologne","|Complete|","16.0"
|
||||
"`3186 <https://wg21.link/LWG3186>`__","``ranges``\ removal, partition, and ``partial_sort_copy``\ algorithms discard useful information","Cologne","|Complete|","15.0","|ranges|"
|
||||
"`3187 <https://wg21.link/LWG3187>`__","`P0591R4 <https://wg21.link/p0591r4>`__ reverted DR 2586 fixes to ``scoped_allocator_adaptor::construct()``\ ","Cologne","",""
|
||||
"`3191 <https://wg21.link/LWG3191>`__","``std::ranges::shuffle``\ synopsis does not match algorithm definition","Cologne","|Complete|","15.0","|ranges|"
|
||||
@ -160,13 +160,13 @@
|
||||
"`3206 <https://wg21.link/LWG3206>`__","``year_month_day``\ conversion to ``sys_days``\ uses not-existing member function","Cologne","|Complete|",""
|
||||
"`3208 <https://wg21.link/LWG3208>`__","``Boolean``\ 's expression requirements are ordered inconsistently","Cologne","|Nothing To Do|",""
|
||||
"`3209 <https://wg21.link/LWG3209>`__","Expression in ``year::ok()``\ returns clause is ill-formed","Cologne","|Complete|",""
|
||||
"","","","",""
|
||||
"","","","","",""
|
||||
"`3231 <https://wg21.link/LWG3231>`__","``year_month_day_last::day``\ specification does not cover ``!ok()``\ values","Belfast","|Nothing To Do|",""
|
||||
"`3225 <https://wg21.link/LWG3225>`__","``zoned_time``\ converting constructor shall not be ``noexcept``\ ","Belfast","","","|chrono|"
|
||||
"`3190 <https://wg21.link/LWG3190>`__","``std::allocator::allocate``\ sometimes returns too little storage","Belfast","|Complete|","14.0"
|
||||
"`3218 <https://wg21.link/LWG3218>`__","Modifier for ``%d``\ parse flag does not match POSIX and ``format``\ specification","Belfast","","","|chrono| |format|"
|
||||
"`3224 <https://wg21.link/LWG3224>`__","``zoned_time``\ constructor from ``TimeZonePtr``\ does not specify initialization of ``tp_``\ ","Belfast","","","|chrono|"
|
||||
"`3230 <https://wg21.link/LWG3230>`__","Format specifier ``%y/%Y``\ is missing locale alternative versions","Belfast","","","|chrono| |format|"
|
||||
"`3230 <https://wg21.link/LWG3230>`__","Format specifier ``%y/%Y``\ is missing locale alternative versions","Belfast","|Complete|","16.0","|chrono| |format|"
|
||||
"`3232 <https://wg21.link/LWG3232>`__","Inconsistency in ``zoned_time``\ deduction guides","Belfast","","","|chrono|"
|
||||
"`3222 <https://wg21.link/LWG3222>`__","P0574R1 introduced preconditions on non-existent parameters","Belfast","",""
|
||||
"`3221 <https://wg21.link/LWG3221>`__","Result of ``year_month``\ arithmetic with ``months``\ is ambiguous","Belfast","|Complete|","8.0"
|
||||
@ -175,33 +175,33 @@
|
||||
"`3253 <https://wg21.link/LWG3253>`__","``basic_syncbuf::basic_syncbuf()``\ should not be explicit","Belfast","",""
|
||||
"`3245 <https://wg21.link/LWG3245>`__","Unnecessary restriction on ``'%p'``\ parse specifier","Belfast","","","|chrono|"
|
||||
"`3244 <https://wg21.link/LWG3244>`__","Constraints for ``Source``\ in |sect|\ [fs.path.req] insufficiently constrainty","Belfast","",""
|
||||
"`3241 <https://wg21.link/LWG3241>`__","``chrono-spec``\ grammar ambiguity in |sect|\ [time.format]","Belfast","","","|chrono| |format|"
|
||||
"`3241 <https://wg21.link/LWG3241>`__","``chrono-spec``\ grammar ambiguity in |sect|\ [time.format]","Belfast","|Complete|","16.0","|chrono| |format|"
|
||||
"`3257 <https://wg21.link/LWG3257>`__","Missing feature testing macro update from P0858","Belfast","",""
|
||||
"`3256 <https://wg21.link/LWG3256>`__","Feature testing macro for ``constexpr``\ algorithms","Belfast","|Complete|","13.0"
|
||||
"`3273 <https://wg21.link/LWG3273>`__","Specify ``weekday_indexed``\ to range of ``[0, 7]``\ ","Belfast","","","|chrono|"
|
||||
"`3273 <https://wg21.link/LWG3273>`__","Specify ``weekday_indexed``\ to range of ``[0, 7]``\ ","Belfast","|Complete|","16.0","|chrono|"
|
||||
"`3070 <https://wg21.link/LWG3070>`__","``path::lexically_relative``\ causes surprising results if a filename can also be a *root-name*","Belfast","",""
|
||||
"`3266 <https://wg21.link/LWG3266>`__","``to_chars(bool)``\ should be deleted","Belfast","|Complete|","14.0"
|
||||
"`3272 <https://wg21.link/LWG3272>`__","``%I%p``\ should parse/format ``duration``\ since midnight","Belfast","","","|chrono| |format|"
|
||||
"`3259 <https://wg21.link/LWG3259>`__","The definition of *constexpr iterators* should be adjusted","Belfast","|Nothing To Do|","","|ranges|"
|
||||
"`3259 <https://wg21.link/LWG3259>`__","The definition of *constexpr iterators* should be adjusted","Belfast","|Nothing To Do|",""
|
||||
"`3103 <https://wg21.link/LWG3103>`__","Errors in taking subview of ``span``\ should be ill-formed where possible","Belfast","",""
|
||||
"`3274 <https://wg21.link/LWG3274>`__","Missing feature test macro for ``<span>``\ ","Belfast","|Complete|","11.0"
|
||||
"`3276 <https://wg21.link/LWG3276>`__","Class ``split_view::outer_iterator::value_type``\ should inherit from ``view_interface``\ ","Belfast","|Complete|","15.0","|ranges|"
|
||||
"`3277 <https://wg21.link/LWG3277>`__","Pre-increment on prvalues is not a requirement of ``weakly_incrementable``\ ","Belfast","|Nothing To Do|","","|ranges|"
|
||||
"`3149 <https://wg21.link/LWG3149>`__","``DefaultConstructible``\ should require default initialization","Belfast","|Complete|","13.0"
|
||||
"","","","",""
|
||||
"","","","","",""
|
||||
"`1203 <https://wg21.link/LWG1203>`__","More useful rvalue stream insertion","Prague","|Complete|","12.0"
|
||||
"`2859 <https://wg21.link/LWG2859>`__","Definition of *reachable* in [ptr.launder] misses pointer arithmetic from pointer-interconvertible object","Prague","",""
|
||||
"`3018 <https://wg21.link/LWG3018>`__","``shared_ptr``\ of function type","Prague","",""
|
||||
"`3050 <https://wg21.link/LWG3050>`__","Conversion specification problem in ``chrono::duration``\ constructor","Prague","","","|chrono|"
|
||||
"`3141 <https://wg21.link/LWG3141>`__","``CopyConstructible``\ doesn't preserve source values","Prague","|Nothing to do|",""
|
||||
"`3150 <https://wg21.link/LWG3150>`__","``UniformRandomBitGenerator``\ should validate ``min``\ and ``max``\ ","Prague","|Complete|","13.0"
|
||||
"`3150 <https://wg21.link/LWG3150>`__","``UniformRandomBitGenerator``\ should validate ``min``\ and ``max``\ ","Prague","|Complete|","13.0","|ranges|"
|
||||
"`3175 <https://wg21.link/LWG3175>`__","The ``CommonReference``\ requirement of concept ``SwappableWith``\ is not satisfied in the example","Prague","|Complete|","13.0"
|
||||
"`3194 <https://wg21.link/LWG3194>`__","``ConvertibleTo``\ prose does not match code","Prague","|Complete|","13.0"
|
||||
"`3200 <https://wg21.link/LWG3200>`__","``midpoint``\ should not constrain ``T``\ is complete","Prague","|Nothing To Do|",""
|
||||
"`3201 <https://wg21.link/LWG3201>`__","``lerp``\ should be marked as ``noexcept``\ ","Prague","|Complete|",""
|
||||
"`3226 <https://wg21.link/LWG3226>`__","``zoned_time``\ constructor from ``string_view``\ should accept ``zoned_time<Duration2, TimeZonePtr2>``\ ","Prague","","","|chrono|"
|
||||
"`3233 <https://wg21.link/LWG3233>`__","Broken requirements for ``shared_ptr``\ converting constructors","Prague","",""
|
||||
"`3237 <https://wg21.link/LWG3237>`__","LWG 3038 and 3190 have inconsistent PRs","Prague","|Complete|","14.0"
|
||||
"`3237 <https://wg21.link/LWG3237>`__","LWG 3038 and 3190 have inconsistent PRs","Prague","|Complete|","16.0"
|
||||
"`3238 <https://wg21.link/LWG3238>`__","Insufficiently-defined behavior of ``std::function``\ deduction guides","Prague","",""
|
||||
"`3242 <https://wg21.link/LWG3242>`__","``std::format``\ : missing rules for ``arg-id``\ in ``width``\ and ``precision``\ ","Prague","|Complete|","Clang 14","|format|"
|
||||
"`3243 <https://wg21.link/LWG3243>`__","``std::format``\ and negative zeroes","Prague","|Complete|","14.0","|format|"
|
||||
@ -213,10 +213,10 @@
|
||||
"`3254 <https://wg21.link/LWG3254>`__","Strike ``stop_token``\ 's ``operator!=``\ ","Prague","",""
|
||||
"`3255 <https://wg21.link/LWG3255>`__","``span``\ 's ``array``\ constructor is too strict","Prague","|Complete|",""
|
||||
"`3260 <https://wg21.link/LWG3260>`__","``year_month*``\ arithmetic rejects durations convertible to years","Prague","","","|chrono|"
|
||||
"`3262 <https://wg21.link/LWG3262>`__","Formatting of negative durations is not specified","Prague","","","|chrono| |format|"
|
||||
"`3262 <https://wg21.link/LWG3262>`__","Formatting of negative durations is not specified","Prague","|Complete|","16.0","|chrono| |format|"
|
||||
"`3264 <https://wg21.link/LWG3264>`__","``sized_range``\ and ``ranges::size``\ redundantly use ``disable_sized_range``\ ","Prague","|Complete|","15.0","|ranges|"
|
||||
"`3269 <https://wg21.link/LWG3269>`__","Parse manipulators do not specify the result of the extraction from stream","Prague","","","|chrono|"
|
||||
"`3270 <https://wg21.link/LWG3270>`__","Parsing and formatting ``%j``\ with ``duration``\ s","Prague","","","|chrono| |format|"
|
||||
"`3270 <https://wg21.link/LWG3270>`__","Parsing and formatting ``%j``\ with ``duration``\ s","Prague","|Partial|","","|chrono| |format|"
|
||||
"`3280 <https://wg21.link/LWG3280>`__","View converting constructors can cause constraint recursion and are unneeded","Prague","|Complete|","15.0","|ranges|"
|
||||
"`3281 <https://wg21.link/LWG3281>`__","Conversion from ``*pair-like*``\ types to ``subrange``\ is a silent semantic promotion","Prague","|Complete|","15.0","|ranges|"
|
||||
"`3282 <https://wg21.link/LWG3282>`__","``subrange``\ converting constructor should disallow derived to base conversions","Prague","|Complete|","15.0","|ranges|"
|
||||
@ -230,21 +230,21 @@
|
||||
"`3299 <https://wg21.link/LWG3299>`__","Pointers don't need customized iterator behavior","Prague","|Complete|","15.0","|ranges|"
|
||||
"`3300 <https://wg21.link/LWG3300>`__","Non-array ``ssize``\ overload is underconstrained","Prague","|Nothing To Do|",""
|
||||
"`3301 <https://wg21.link/LWG3301>`__","``transform_view::iterator``\ has incorrect ``iterator_category``\ ","Prague","|Complete|","15.0","|ranges|"
|
||||
"`3302 <https://wg21.link/LWG3302>`__","Range adaptor objects ``keys``\ and ``values``\ are unspecified","Prague","","","|ranges|"
|
||||
"`3302 <https://wg21.link/LWG3302>`__","Range adaptor objects ``keys``\ and ``values``\ are unspecified","Prague","|Complete|","16.0","|ranges|"
|
||||
"`3303 <https://wg21.link/LWG3303>`__","Bad ""``constexpr``\ "" marker for ``destroy/destroy_n``\ ","Prague","",""
|
||||
"`3304 <https://wg21.link/LWG3304>`__","Allocate functions of ``std::polymorphic_allocator``\ should require ``[[nodiscard]]``\ ","Prague","",""
|
||||
"`3304 <https://wg21.link/LWG3304>`__","Allocate functions of ``std::polymorphic_allocator``\ should require ``[[nodiscard]]``\ ","Prague","|Complete|","16.0"
|
||||
"`3307 <https://wg21.link/LWG3307>`__","``std::allocator<void>().allocate(n)``\ ","Prague","",""
|
||||
"`3310 <https://wg21.link/LWG3310>`__","Replace ``SIZE_MAX``\ with ``numeric_limits<size_t>::max()``\ ","Prague","",""
|
||||
"`3310 <https://wg21.link/LWG3310>`__","Replace ``SIZE_MAX``\ with ``numeric_limits<size_t>::max()``\ ","Prague","|Complete|","16.0"
|
||||
"`3313 <https://wg21.link/LWG3313>`__","``join_view::iterator::operator--``\ is incorrectly constrained","Prague","|Complete|","14.0","|ranges|"
|
||||
"`3314 <https://wg21.link/LWG3314>`__","Is stream insertion behavior locale dependent when ``Period::type``\ is ``micro``\ ?","Prague","","","|chrono|"
|
||||
"`3314 <https://wg21.link/LWG3314>`__","Is stream insertion behavior locale dependent when ``Period::type``\ is ``micro``\ ?","Prague","|Complete|","16.0","|chrono|"
|
||||
"`3315 <https://wg21.link/LWG3315>`__","Correct Allocator Default Behavior","Prague","",""
|
||||
"`3316 <https://wg21.link/LWG3316>`__","Correctly define epoch for ``utc_clock``\ / ``utc_timepoint``\ ","Prague","","","|chrono|"
|
||||
"`3317 <https://wg21.link/LWG3317>`__","Incorrect ``operator<<``\ for floating-point durations","Prague","","","|chrono|"
|
||||
"`3318 <https://wg21.link/LWG3318>`__","Clarify whether clocks can represent time before their epoch","Prague","","","|chrono|"
|
||||
"`3319 <https://wg21.link/LWG3319>`__","Properly reference specification of IANA time zone database","Prague","","","|chrono|"
|
||||
"`3320 <https://wg21.link/LWG3320>`__","``span::cbegin/cend``\ methods produce different results than ``std::[ranges::]cbegin/cend``\ ","Prague","|Complete|",""
|
||||
"`3321 <https://wg21.link/LWG3321>`__","``uninitialized_construct_using_allocator``\ should use ``construct_at``\ ","Prague","",""
|
||||
"`3323 <https://wg21.link/LWG3323>`__","``*has-tuple-element*``\ helper concept needs ``convertible_to``\ ","Prague","","","|ranges|"
|
||||
"`3321 <https://wg21.link/LWG3321>`__","``uninitialized_construct_using_allocator``\ should use ``construct_at``\ ","Prague","|Complete|","16.0"
|
||||
"`3323 <https://wg21.link/LWG3323>`__","``*has-tuple-element*``\ helper concept needs ``convertible_to``\ ","Prague","|Complete|","16.0","|ranges|"
|
||||
"`3324 <https://wg21.link/LWG3324>`__","Special-case ``std::strong/weak/partial_order``\ for pointers","Prague","|Complete|","14.0","|spaceship|"
|
||||
"`3325 <https://wg21.link/LWG3325>`__","Constrain return type of transformation function for ``transform_view``\ ","Prague","|Complete|","15.0","|ranges|"
|
||||
"`3326 <https://wg21.link/LWG3326>`__","``enable_view``\ has false positives","Prague","|Complete|","15.0","|ranges|"
|
||||
@ -253,7 +253,7 @@
|
||||
"`3329 <https://wg21.link/LWG3329>`__","``totally_ordered_with``\ both directly and indirectly requires ``common_reference_with``\ ","Prague","|Complete|","13.0"
|
||||
"`3330 <https://wg21.link/LWG3330>`__","Include ``<compare>``\ from most library headers","Prague","|Complete|","13.0","|spaceship|"
|
||||
"`3331 <https://wg21.link/LWG3331>`__","Define ``totally_ordered/_with``\ in terms of ``partially-ordered-with``\ ","Prague","|Complete|","13.0"
|
||||
"`3332 <https://wg21.link/LWG3332>`__","Issue in |sect|\ [time.format]","Prague","","","|chrono| |format|"
|
||||
"`3332 <https://wg21.link/LWG3332>`__","Issue in |sect|\ [time.format]","Prague","|Complete|","16.0","|chrono| |format|"
|
||||
"`3334 <https://wg21.link/LWG3334>`__","``basic_osyncstream``\ move assignment and destruction calls ``basic_syncbuf::emit()``\ twice","Prague","",""
|
||||
"`3335 <https://wg21.link/LWG3335>`__","Resolve C++20 NB comments US 273 and GB 274","Prague","|Complete|","15.0","|ranges|"
|
||||
"`3338 <https://wg21.link/LWG3338>`__","Rename ``default_constructible``\ to ``default_initializable``\ ","Prague","|Complete|","13.0"
|
||||
@ -261,7 +261,7 @@
|
||||
"`3346 <https://wg21.link/LWG3346>`__","``pair``\ and ``tuple``\ copy and move constructor have backwards specification","Prague","",""
|
||||
"`3347 <https://wg21.link/LWG3347>`__","``std::pair<T, U>``\ now requires ``T``\ and ``U``\ to be less-than-comparable","Prague","",""
|
||||
"`3348 <https://wg21.link/LWG3348>`__","``__cpp_lib_unwrap_ref``\ in wrong header","Prague","|Complete|","12.0"
|
||||
"`3349 <https://wg21.link/LWG3349>`__","Missing ``__cpp_lib_constexpr_complex``\ for P0415R1","Prague","",""
|
||||
"`3349 <https://wg21.link/LWG3349>`__","Missing ``__cpp_lib_constexpr_complex``\ for P0415R1","Prague","|Complete|","16.0"
|
||||
"`3350 <https://wg21.link/LWG3350>`__","Simplify return type of ``lexicographical_compare_three_way``\ ","Prague","","","|spaceship|"
|
||||
"`3351 <https://wg21.link/LWG3351>`__","``ranges::enable_safe_range``\ should not be constrained","Prague","|Complete|","15.0","|ranges|"
|
||||
"`3352 <https://wg21.link/LWG3352>`__","``strong_equality``\ isn't a thing","Prague","|Nothing To Do|","","|spaceship|"
|
||||
@ -273,7 +273,7 @@
|
||||
"`3360 <https://wg21.link/LWG3360>`__","``three_way_comparable_with``\ is inconsistent with similar concepts","Prague","|Nothing To Do|","","|spaceship|"
|
||||
"`3362 <https://wg21.link/LWG3362>`__","Strike ``stop_source``\ 's ``operator!=``\ ","Prague","",""
|
||||
"`3363 <https://wg21.link/LWG3363>`__","``drop_while_view``\ should opt-out of ``sized_range``\ ","Prague","|Nothing To Do|","","|ranges|"
|
||||
"`3364 <https://wg21.link/LWG3364>`__","Initialize data members of ranges and their iterators","Prague","","","|ranges|"
|
||||
"`3364 <https://wg21.link/LWG3364>`__","Initialize data members of ranges and their iterators","Prague","|Complete|","16.0","|ranges|"
|
||||
"`3367 <https://wg21.link/LWG3367>`__","Integer-class conversions should not throw","Prague","|Nothing To Do|",""
|
||||
"`3369 <https://wg21.link/LWG3369>`__","``span``\ 's deduction-guide for built-in arrays doesn't work","Prague","|Complete|","14.0"
|
||||
"`3371 <https://wg21.link/LWG3371>`__","``visit_format_arg``\ and ``make_format_args``\ are not hidden friends","Prague","|Complete|","14.0","|format|"
|
||||
@ -281,7 +281,7 @@
|
||||
"`3373 <https://wg21.link/LWG3373>`__","``{to,from}_chars_result``\ and ``format_to_n_result``\ need the ""we really mean what we say"" wording","Prague","|Complete|","14.0","|format|"
|
||||
"`3374 <https://wg21.link/LWG3374>`__","P0653 + P1006 should have made the other ``std::to_address``\ overload ``constexpr``\ ","Prague","|Complete|","12.0"
|
||||
"`3375 <https://wg21.link/LWG3375>`__","``decay``\ in ``viewable_range``\ should be ``remove_cvref``\ ","Prague","|Complete|","15.0","|ranges|"
|
||||
"`3377 <https://wg21.link/LWG3377>`__","``elements_view::iterator``\ befriends a specialization of itself","Prague","","","|ranges|"
|
||||
"`3377 <https://wg21.link/LWG3377>`__","``elements_view::iterator``\ befriends a specialization of itself","Prague","|Nothing To Do|","","|ranges|"
|
||||
"`3379 <https://wg21.link/LWG3379>`__","""``safe``\ "" in several library names is misleading","Prague","|Complete|","15.0","|ranges|"
|
||||
"`3380 <https://wg21.link/LWG3380>`__","``common_type``\ and comparison categories","Prague","|Complete|","15.0","|spaceship|"
|
||||
"`3381 <https://wg21.link/LWG3381>`__","``begin``\ and ``data``\ must agree for ``contiguous_range``\ ","Prague","|Nothing To Do|","","|ranges|"
|
||||
@ -290,12 +290,12 @@
|
||||
"`3384 <https://wg21.link/LWG3384>`__","``transform_view::*sentinel*``\ has an incorrect ``operator-``\ ","Prague","|Complete|","15.0","|ranges|"
|
||||
"`3385 <https://wg21.link/LWG3385>`__","``common_iterator``\ is not sufficiently constrained for non-copyable iterators","Prague","|Complete|","15.0","|ranges|"
|
||||
"`3387 <https://wg21.link/LWG3387>`__","|sect|\ [range.reverse.view] ``reverse_view<V>``\ unintentionally requires ``range<const V>``\ ","Prague","|Complete|","15.0","|ranges|"
|
||||
"`3388 <https://wg21.link/LWG3388>`__","``view``\ iterator types have ill-formed ``<=>``\ operators","Prague","","","|ranges|"
|
||||
"`3388 <https://wg21.link/LWG3388>`__","``view``\ iterator types have ill-formed ``<=>``\ operators","Prague","|Complete|","16.0","|ranges|"
|
||||
"`3389 <https://wg21.link/LWG3389>`__","A move-only iterator still does not have a ``counted_iterator``\ ","Prague","|Complete|","15.0","|ranges|"
|
||||
"`3390 <https://wg21.link/LWG3390>`__","``make_move_iterator()``\ cannot be used to construct a ``move_iterator``\ for a move-only iterator","Prague","|Complete|","14.0","|ranges|"
|
||||
"`3393 <https://wg21.link/LWG3393>`__","Missing/incorrect feature test macro for coroutines","Prague","|Complete|","14.0"
|
||||
"`3395 <https://wg21.link/LWG3395>`__","Definition for three-way comparison needs to be updated (US 152)","Prague","","","|spaceship|"
|
||||
"`3396 <https://wg21.link/LWG3396>`__","Clarify point of reference for ``source_location::current()``\ (DE 169)","Prague","",""
|
||||
"`3397 <https://wg21.link/LWG3397>`__","``ranges::basic_istream_view::iterator``\ should not provide ``iterator_category``\ ","Prague","","","|ranges|"
|
||||
"`3396 <https://wg21.link/LWG3396>`__","Clarify point of reference for ``source_location::current()``\ (DE 169)","Prague","|Nothing To Do|","16.0"
|
||||
"`3397 <https://wg21.link/LWG3397>`__","``ranges::basic_istream_view::iterator``\ should not provide ``iterator_category``\ ","Prague","|Complete|","16.0","|ranges|"
|
||||
"`3398 <https://wg21.link/LWG3398>`__","``tuple_element_t``\ is also wrong for ``const subrange``\ ","Prague","|Complete|","14.0","|ranges|"
|
||||
"`3446 <https://wg21.link/LWG3446>`__","``indirectly_readable_traits``\ ambiguity for types with both ``value_type``\ and ``element_type``\ ","November virtual meeting","|Complete|","13.0"
|
||||
"`3446 <https://wg21.link/LWG3446>`__","``indirectly_readable_traits``\ ambiguity for types with both ``value_type``\ and ``element_type``\ ","November virtual meeting","|Complete|","13.0","|ranges|"
|
||||
|
Can't render this file because it has a wrong number of fields in line 2.
|
@ -1,15 +1,15 @@
|
||||
"Paper #","Group","Paper Name","Meeting","Status","First released version"
|
||||
"Paper #","Group","Paper Name","Meeting","Status","First released version","Labels"
|
||||
"`P0463R1 <https://wg21.link/P0463R1>`__","LWG","Endian just Endian","Toronto","|Complete|","7.0"
|
||||
"`P0674R1 <https://wg21.link/P0674R1>`__","LWG","Extending make_shared to Support Arrays","Toronto","|Complete|","15.0"
|
||||
"","","","","",""
|
||||
"","","","","","",""
|
||||
"`P0020R6 <https://wg21.link/P0020R6>`__","LWG","Floating Point Atomic","Albuquerque","",""
|
||||
"`P0053R7 <https://wg21.link/P0053R7>`__","LWG","C++ Synchronized Buffered Ostream","Albuquerque","",""
|
||||
"`P0202R3 <https://wg21.link/P0202R3>`__","LWG","Add constexpr modifiers to functions in <algorithm> and <utility> Headers","Albuquerque","|Complete|","12.0"
|
||||
"`P0415R1 <https://wg21.link/P0415R1>`__","LWG","Constexpr for ``std::complex``\ ","Albuquerque","|In Progress|","7.0"
|
||||
"`P0415R1 <https://wg21.link/P0415R1>`__","LWG","Constexpr for ``std::complex``\ ","Albuquerque","|Complete|","16.0"
|
||||
"`P0439R0 <https://wg21.link/P0439R0>`__","LWG","Make ``std::memory_order``\ a scoped enumeration","Albuquerque","|Complete|",""
|
||||
"`P0457R2 <https://wg21.link/P0457R2>`__","LWG","String Prefix and Suffix Checking","Albuquerque","|Complete|","6.0"
|
||||
"`P0550R2 <https://wg21.link/P0550R2>`__","LWG","Transformation Trait ``remove_cvref``\ ","Albuquerque","|Complete|","6.0"
|
||||
"`P0600R1 <https://wg21.link/P0600R1>`__","LWG","nodiscard in the Library","Albuquerque","|In Progress| [#note-P0600]_","7.0"
|
||||
"`P0600R1 <https://wg21.link/P0600R1>`__","LWG","nodiscard in the Library","Albuquerque","|Complete|","16.0"
|
||||
"`P0616R0 <https://wg21.link/P0616R0>`__","LWG","de-pessimize legacy <numeric> algorithms with std::move","Albuquerque","|Complete|","12.0"
|
||||
"`P0653R2 <https://wg21.link/P0653R2>`__","LWG","Utility to convert a pointer to a raw pointer","Albuquerque","|Complete|","6.0"
|
||||
"`P0718R2 <https://wg21.link/P0718R2>`__","LWG","Atomic shared_ptr","Albuquerque","",""
|
||||
@ -25,7 +25,7 @@
|
||||
"`P0858R0 <https://wg21.link/P0858R0>`__","LWG","Constexpr iterator requirements","Jacksonville","|Complete|","12.0"
|
||||
"`P0905R1 <https://wg21.link/P0905R1>`__","CWG","Symmetry for spaceship","Jacksonville","",""
|
||||
"`P0966R1 <https://wg21.link/P0966R1>`__","LWG","``string::reserve``\ Should Not Shrink","Jacksonville","|Complete| [#note-P0966]_","12.0"
|
||||
"","","","","",""
|
||||
"","","","","","",""
|
||||
"`P0019R8 <https://wg21.link/P0019R8>`__","LWG","Atomic Ref","Rapperswil","",""
|
||||
"`P0458R2 <https://wg21.link/P0458R2>`__","LWG","Checking for Existence of an Element in Associative Containers","Rapperswil","|Complete|","13.0"
|
||||
"`P0475R1 <https://wg21.link/P0475R1>`__","LWG","LWG 2511: guaranteed copy elision for piecewise construction","Rapperswil","|Complete|",""
|
||||
@ -49,25 +49,25 @@
|
||||
"`P1023R0 <https://wg21.link/P1023R0>`__","LWG","constexpr comparison operators for std::array","Rapperswil","|Complete|","8.0"
|
||||
"`P1025R1 <https://wg21.link/P1025R1>`__","CWG","Update The Reference To The Unicode Standard","Rapperswil","",""
|
||||
"`P1120R0 <https://wg21.link/P1120R0>`__","CWG","Consistency improvements for <=> and other comparison operators","Rapperswil","",""
|
||||
"","","","","",""
|
||||
"","","","","","",""
|
||||
"`P0318R1 <https://wg21.link/P0318R1>`__","LWG","unwrap_ref_decay and unwrap_reference","San Diego","|Complete|","8.0"
|
||||
"`P0356R5 <https://wg21.link/P0356R5>`__","LWG","Simplified partial function application","San Diego","|Complete|","13.0"
|
||||
"`P0357R3 <https://wg21.link/P0357R3>`__","LWG","reference_wrapper for incomplete types","San Diego","|Complete|","8.0"
|
||||
"`P0482R6 <https://wg21.link/P0482R6>`__","CWG","char8_t: A type for UTF-8 characters and strings","San Diego","|In Progress|",""
|
||||
"`P0482R6 <https://wg21.link/P0482R6>`__","CWG","char8_t: A type for UTF-8 characters and strings","San Diego","|Complete|","16.0"
|
||||
"`P0487R1 <https://wg21.link/P0487R1>`__","LWG","Fixing ``operator>>(basic_istream&, CharT*)``\ (LWG 2499)","San Diego","|Complete|","8.0"
|
||||
"`P0591R4 <https://wg21.link/P0591R4>`__","LWG","Utility functions to implement uses-allocator construction","San Diego","* *",""
|
||||
"`P0595R2 <https://wg21.link/P0595R2>`__","CWG","P0595R2 std::is_constant_evaluated()","San Diego","|Complete|","9.0"
|
||||
"`P0591R4 <https://wg21.link/P0591R4>`__","LWG","Utility functions to implement uses-allocator construction","San Diego","|Partial| [#note-P0591]_",""
|
||||
"`P0595R2 <https://wg21.link/P0595R2>`__","CWG","std::is_constant_evaluated()","San Diego","|Complete|","9.0"
|
||||
"`P0602R4 <https://wg21.link/P0602R4>`__","LWG","variant and optional should propagate copy/move triviality","San Diego","|Complete|","8.0"
|
||||
"`P0608R3 <https://wg21.link/P0608R3>`__","LWG","A sane variant converting constructor","San Diego","|Complete|","9.0"
|
||||
"`P0655R1 <https://wg21.link/P0655R1>`__","LWG","visit<R>: Explicit Return Type for visit","San Diego","|Complete|","12.0"
|
||||
"`P0771R1 <https://wg21.link/P0771R1>`__","LWG","std::function move constructor should be noexcept","San Diego","|Complete|","6.0"
|
||||
"`P0896R4 <https://wg21.link/P0896R4>`__","LWG","The One Ranges Proposal","San Diego","|Complete|","15.0"
|
||||
"`P0896R4 <https://wg21.link/P0896R4>`__","LWG","The One Ranges Proposal","San Diego","|Complete|","15.0","|ranges|"
|
||||
"`P0899R1 <https://wg21.link/P0899R1>`__","LWG","P0899R1 - LWG 3016 is not a defect","San Diego","|Nothing To Do|",""
|
||||
"`P0919R3 <https://wg21.link/P0919R3>`__","LWG","Heterogeneous lookup for unordered containers","San Diego","|Complete|","12.0"
|
||||
"`P0972R0 <https://wg21.link/P0972R0>`__","LWG","<chrono> ``zero()``\ , ``min()``\ , and ``max()``\ should be noexcept","San Diego","|Complete|","8.0"
|
||||
"`P1006R1 <https://wg21.link/P1006R1>`__","LWG","Constexpr in std::pointer_traits","San Diego","|Complete|","8.0"
|
||||
"`P1007R3 <https://wg21.link/P1007R3>`__","LWG","``std::assume_aligned``\ ","San Diego","|Complete|","15.0"
|
||||
"`P1020R1 <https://wg21.link/P1020R1>`__","LWG","Smart pointer creation with default initialization","San Diego","* *",""
|
||||
"`P1020R1 <https://wg21.link/P1020R1>`__","LWG","Smart pointer creation with default initialization","San Diego","|Complete|","16.0"
|
||||
"`P1032R1 <https://wg21.link/P1032R1>`__","LWG","Misc constexpr bits","San Diego","|Complete|","13.0"
|
||||
"`P1085R2 <https://wg21.link/P1085R2>`__","LWG","Should Span be Regular?","San Diego","|Complete|","8.0"
|
||||
"`P1123R0 <https://wg21.link/P1123R0>`__","LWG","Editorial Guidance for merging P0019r8 and P0528r3","San Diego","* *",""
|
||||
@ -79,8 +79,8 @@
|
||||
"`P1248R1 <https://wg21.link/P1248R1>`__","LWG","Remove CommonReference requirement from StrictWeakOrdering (a.k.a Fixing Relations)","San Diego","|Complete|","13.0"
|
||||
"`P1285R0 <https://wg21.link/P1285R0>`__","LWG","Improving Completeness Requirements for Type Traits","San Diego","* *",""
|
||||
"`P1353R0 <https://wg21.link/P1353R0>`__","CWG","Missing feature test macros","San Diego","* *",""
|
||||
"","","","","",""
|
||||
"`P0339R6 <https://wg21.link/P0339R6>`__","LWG","polymorphic_allocator<> as a vocabulary type","Kona","",""
|
||||
"","","","","","",""
|
||||
"`P0339R6 <https://wg21.link/P0339R6>`__","LWG","polymorphic_allocator<> as a vocabulary type","Kona","|Complete|","16.0"
|
||||
"`P0340R3 <https://wg21.link/P0340R3>`__","LWG","Making std::underlying_type SFINAE-friendly","Kona","|Complete|","9.0"
|
||||
"`P0738R2 <https://wg21.link/P0738R2>`__","LWG","I Stream, You Stream, We All Stream for istream_iterator","Kona","",""
|
||||
"`P0811R3 <https://wg21.link/P0811R3>`__","LWG","Well-behaved interpolation for numbers and pointers","Kona","|Complete|","9.0"
|
||||
@ -89,7 +89,7 @@
|
||||
"`P1024R3 <https://wg21.link/P1024R3>`__","LWG","Usability Enhancements for std::span","Kona","|Complete|","9.0"
|
||||
"`P1164R1 <https://wg21.link/P1164R1>`__","LWG","Make create_directory() Intuitive","Kona","|Complete|","12.0"
|
||||
"`P1227R2 <https://wg21.link/P1227R2>`__","LWG","Signed ssize() functions, unsigned size() functions","Kona","|Complete|","9.0"
|
||||
"`P1252R2 <https://wg21.link/P1252R2>`__","LWG","Ranges Design Cleanup","Kona","|Complete|","15.0"
|
||||
"`P1252R2 <https://wg21.link/P1252R2>`__","LWG","Ranges Design Cleanup","Kona","|Complete|","15.0","|ranges|"
|
||||
"`P1286R2 <https://wg21.link/P1286R2>`__","CWG","Contra CWG DR1778","Kona","",""
|
||||
"`P1357R1 <https://wg21.link/P1357R1>`__","LWG","Traits for [Un]bounded Arrays","Kona","|Complete|","9.0"
|
||||
"`P1458R1 <https://wg21.link/P1458R1>`__","LWG","Mandating the Standard Library: Clause 16 - Language support library","Kona","|Complete|","9.0"
|
||||
@ -97,7 +97,7 @@
|
||||
"`P1462R1 <https://wg21.link/P1462R1>`__","LWG","Mandating the Standard Library: Clause 20 - Strings library","Kona","|Complete|","9.0"
|
||||
"`P1463R1 <https://wg21.link/P1463R1>`__","LWG","Mandating the Standard Library: Clause 21 - Containers library","Kona","",""
|
||||
"`P1464R1 <https://wg21.link/P1464R1>`__","LWG","Mandating the Standard Library: Clause 22 - Iterators library","Kona","|Complete|","9.0"
|
||||
"","","","","",""
|
||||
"","","","","","",""
|
||||
"`P0325R4 <https://wg21.link/P0325R4>`__","LWG","to_array from LFTS with updates","Cologne","|Complete|","10.0"
|
||||
"`P0408R7 <https://wg21.link/P0408R7>`__","LWG","Efficient Access to basic_stringbuf's Buffer","Cologne","",""
|
||||
"`P0466R5 <https://wg21.link/P0466R5>`__","LWG","Layout-compatibility and Pointer-interconvertibility Traits","Cologne","",""
|
||||
@ -108,40 +108,40 @@
|
||||
"`P0784R7 <https://wg21.link/P0784R7>`__","CWG","More constexpr containers","Cologne","|Complete|","12.0"
|
||||
"`P0980R1 <https://wg21.link/P0980R1>`__","LWG","Making std::string constexpr","Cologne","|Complete|","15.0"
|
||||
"`P1004R2 <https://wg21.link/P1004R2>`__","LWG","Making std::vector constexpr","Cologne","|Complete|","15.0"
|
||||
"`P1035R7 <https://wg21.link/P1035R7>`__","LWG","Input Range Adaptors","Cologne","",""
|
||||
"`P1035R7 <https://wg21.link/P1035R7>`__","LWG","Input Range Adaptors","Cologne","|Complete|","16.0","|ranges|"
|
||||
"`P1065R2 <https://wg21.link/P1065R2>`__","LWG","Constexpr INVOKE","Cologne","|Complete|","12.0"
|
||||
"`P1135R6 <https://wg21.link/P1135R6>`__","LWG","The C++20 Synchronization Library","Cologne","|Complete|","11.0"
|
||||
"`P1207R4 <https://wg21.link/P1207R4>`__","LWG","Movability of Single-pass Iterators","Cologne","|Complete|","15.0"
|
||||
"`P1208R6 <https://wg21.link/P1208R6>`__","LWG","Adopt source_location for C++20","Cologne","",""
|
||||
"`P1207R4 <https://wg21.link/P1207R4>`__","LWG","Movability of Single-pass Iterators","Cologne","|Complete|","15.0","|ranges|"
|
||||
"`P1208R6 <https://wg21.link/P1208R6>`__","LWG","Adopt source_location for C++20","Cologne","|Complete|","16.0"
|
||||
"`P1355R2 <https://wg21.link/P1355R2>`__","LWG","Exposing a narrow contract for ceil2","Cologne","|Complete|","9.0"
|
||||
"`P1361R2 <https://wg21.link/P1361R2>`__","LWG","Integration of chrono with text formatting","Cologne","",""
|
||||
"`P1361R2 <https://wg21.link/P1361R2>`__","LWG","Integration of chrono with text formatting","Cologne","|Partial|",""
|
||||
"`P1423R3 <https://wg21.link/P1423R3>`__","LWG","char8_t backward compatibility remediation","Cologne","|Complete|","15.0"
|
||||
"`P1424R1 <https://wg21.link/P1424R1>`__","LWG","'constexpr' feature macro concerns","Cologne","Superseded by `P1902 <https://wg21.link/P1902>`__",""
|
||||
"`P1466R3 <https://wg21.link/P1466R3>`__","LWG","Miscellaneous minor fixes for chrono","Cologne","",""
|
||||
"`P1474R1 <https://wg21.link/P1474R1>`__","LWG","Helpful pointers for ContiguousIterator","Cologne","|Complete|","15.0"
|
||||
"`P1474R1 <https://wg21.link/P1474R1>`__","LWG","Helpful pointers for ContiguousIterator","Cologne","|Complete|","15.0","|ranges|"
|
||||
"`P1502R1 <https://wg21.link/P1502R1>`__","LWG","Standard library header units for C++20","Cologne","",""
|
||||
"`P1522R1 <https://wg21.link/P1522R1>`__","LWG","Iterator Difference Type and Integer Overflow","Cologne","|Complete|","15.0"
|
||||
"`P1523R1 <https://wg21.link/P1523R1>`__","LWG","Views and Size Types","Cologne","|Complete|","15.0"
|
||||
"`P1522R1 <https://wg21.link/P1522R1>`__","LWG","Iterator Difference Type and Integer Overflow","Cologne","|Complete|","15.0","|ranges|"
|
||||
"`P1523R1 <https://wg21.link/P1523R1>`__","LWG","Views and Size Types","Cologne","|Complete|","15.0","|ranges|"
|
||||
"`P1612R1 <https://wg21.link/P1612R1>`__","LWG","Relocate Endian's Specification","Cologne","|Complete|","10.0"
|
||||
"`P1614R2 <https://wg21.link/P1614R2>`__","LWG","The Mothership has Landed","Cologne","|In Progress|",""
|
||||
"`P1638R1 <https://wg21.link/P1638R1>`__","LWG","basic_istream_view::iterator should not be copyable","Cologne","",""
|
||||
"`P1638R1 <https://wg21.link/P1638R1>`__","LWG","basic_istream_view::iterator should not be copyable","Cologne","|Complete|","16.0","|ranges|"
|
||||
"`P1643R1 <https://wg21.link/P1643R1>`__","LWG","Add wait/notify to atomic_ref","Cologne","",""
|
||||
"`P1644R0 <https://wg21.link/P1644R0>`__","LWG","Add wait/notify to atomic<shared_ptr>","Cologne","",""
|
||||
"`P1650R0 <https://wg21.link/P1650R0>`__","LWG","Output std::chrono::days with 'd' suffix","Cologne","",""
|
||||
"`P1650R0 <https://wg21.link/P1650R0>`__","LWG","Output std::chrono::days with 'd' suffix","Cologne","|Complete|","16.0"
|
||||
"`P1651R0 <https://wg21.link/P1651R0>`__","LWG","bind_front should not unwrap reference_wrapper","Cologne","|Complete|","13.0"
|
||||
"`P1652R1 <https://wg21.link/P1652R1>`__","LWG","Printf corner cases in std::format","Cologne","|Complete|","14.0"
|
||||
"`P1661R1 <https://wg21.link/P1661R1>`__","LWG","Remove dedicated precalculated hash lookup interface","Cologne","|Nothing To Do|",""
|
||||
"`P1754R1 <https://wg21.link/P1754R1>`__","LWG","Rename concepts to standard_case for C++20, while we still can","Cologne","|In Progress|",""
|
||||
"`P1754R1 <https://wg21.link/P1754R1>`__","LWG","Rename concepts to standard_case for C++20, while we still can","Cologne","|Complete|","15.0","|ranges|"
|
||||
"","","","","",""
|
||||
"`P0883R2 <https://wg21.link/P0883R2>`__","LWG","Fixing Atomic Initialization","Belfast","|Complete| [#note-P0883.1]_ [#note-P0883.2]_","14.0"
|
||||
"`P1391R4 <https://wg21.link/P1391R4>`__","LWG","Range constructor for std::string_view","Belfast","|Complete|","14.0"
|
||||
"`P1394R4 <https://wg21.link/P1394R4>`__","LWG","Range constructor for std::span","Belfast","|Complete|","14.0"
|
||||
"`P1456R1 <https://wg21.link/P1456R1>`__","LWG","Move-only views","Belfast","|Complete|","15.0"
|
||||
"`P1391R4 <https://wg21.link/P1391R4>`__","LWG","Range constructor for std::string_view","Belfast","|Complete|","14.0","|ranges|"
|
||||
"`P1394R4 <https://wg21.link/P1394R4>`__","LWG","Range constructor for std::span","Belfast","|Complete|","14.0","|ranges|"
|
||||
"`P1456R1 <https://wg21.link/P1456R1>`__","LWG","Move-only views","Belfast","|Complete|","15.0","|ranges|"
|
||||
"`P1622R3 <https://wg21.link/P1622R3>`__","LWG","Mandating the Standard Library: Clause 32 - Thread support library","Belfast","* *",""
|
||||
"`P1645R1 <https://wg21.link/P1645R1>`__","LWG","constexpr for numeric algorithms","Belfast","|Complete|","12.0"
|
||||
"`P1686R2 <https://wg21.link/P1686R2>`__","LWG","Mandating the Standard Library: Clause 27 - Time library","Belfast","* *",""
|
||||
"`P1690R1 <https://wg21.link/P1690R1>`__","LWG","Refinement Proposal for P0919 Heterogeneous lookup for unordered containers","Belfast","|Complete|","12.0"
|
||||
"`P1716R3 <https://wg21.link/P1716R3>`__","LWG","ranges compare algorithm are over-constrained","Belfast","|Complete|","15.0"
|
||||
"`P1716R3 <https://wg21.link/P1716R3>`__","LWG","ranges compare algorithm are over-constrained","Belfast","|Complete|","15.0","|ranges|"
|
||||
"`P1718R2 <https://wg21.link/P1718R2>`__","LWG","Mandating the Standard Library: Clause 25 - Algorithms library","Belfast","* *",""
|
||||
"`P1719R2 <https://wg21.link/P1719R2>`__","LWG","Mandating the Standard Library: Clause 26 - Numerics library","Belfast","* *",""
|
||||
"`P1720R2 <https://wg21.link/P1720R2>`__","LWG","Mandating the Standard Library: Clause 28 - Localization library","Belfast","* *",""
|
||||
@ -149,59 +149,58 @@
|
||||
"`P1722R2 <https://wg21.link/P1722R2>`__","LWG","Mandating the Standard Library: Clause 30 - Regular Expression library","Belfast","* *",""
|
||||
"`P1723R2 <https://wg21.link/P1723R2>`__","LWG","Mandating the Standard Library: Clause 31 - Atomics library","Belfast","* *",""
|
||||
"`P1855R0 <https://wg21.link/P1855R0>`__","LWG","Make ``<compare>``\ freestanding","Belfast","* *",""
|
||||
"`P1862R1 <https://wg21.link/P1862R1>`__","LWG","Ranges adaptors for non-copyable iterators","Belfast","* *",""
|
||||
"`P1862R1 <https://wg21.link/P1862R1>`__","LWG","Ranges adaptors for non-copyable iterators","Belfast","|Complete|","16.0","|ranges|"
|
||||
"`P1865R1 <https://wg21.link/P1865R1>`__","LWG","Add max() to latch and barrier","Belfast","|Complete|","11.0"
|
||||
"`P1869R1 <https://wg21.link/P1869R1>`__","LWG","Rename 'condition_variable_any' interruptible wait methods","Belfast","* *",""
|
||||
"`P1870R1 <https://wg21.link/P1870R1>`__","LWG","forwarding-range is too subtle","Belfast","|Complete|","15.0"
|
||||
"`P1871R1 <https://wg21.link/P1871R1>`__","LWG","Concept traits should be named after concepts","Belfast","|Complete|","14.0"
|
||||
"`P1870R1 <https://wg21.link/P1870R1>`__","LWG","forwarding-range is too subtle","Belfast","|Complete|","15.0","|ranges|"
|
||||
"`P1871R1 <https://wg21.link/P1871R1>`__","LWG","Concept traits should be named after concepts","Belfast","|Complete|","14.0","|ranges|"
|
||||
"`P1872R0 <https://wg21.link/P1872R0>`__","LWG","span should have size_type, not index_type","Belfast","|Complete|","10.0"
|
||||
"`P1878R1 <https://wg21.link/P1878R1>`__","LWG","Constraining Readable Types","Belfast","|Complete|","15.0"
|
||||
"`P1878R1 <https://wg21.link/P1878R1>`__","LWG","Constraining Readable Types","Belfast","|Complete|","15.0","|ranges|"
|
||||
"`P1892R1 <https://wg21.link/P1892R1>`__","LWG","Extended locale-specific presentation specifiers for std::format","Belfast","|Complete|","14.0"
|
||||
"`P1902R1 <https://wg21.link/P1902R1>`__","LWG","Missing feature-test macros 2018-2019","Belfast","* *",""
|
||||
"`P1959R0 <https://wg21.link/P1959R0>`__","LWG","Remove std::weak_equality and std::strong_equality","Belfast","* *",""
|
||||
"`P1959R0 <https://wg21.link/P1959R0>`__","LWG","Remove std::weak_equality and std::strong_equality","Belfast","|Nothing To Do|",""
|
||||
"`P1960R0 <https://wg21.link/P1960R0>`__","LWG","NB Comment Changes Reviewed by SG1","Belfast","* *",""
|
||||
"`P1961R0 <https://wg21.link/P1961R0>`__","LWG","Harmonizing the definitions of total order for pointers","Belfast","* *",""
|
||||
"`P1965R0 <https://wg21.link/P1965R0>`__","LWG","Blanket Wording for Specifying ""Hidden Friends""","Belfast","* *",""
|
||||
"","","","","",""
|
||||
"","","","","","",""
|
||||
"`P0586R2 <https://wg21.link/P0586R2>`__","LWG","Safe integral comparisons","Prague","|Complete|","13.0"
|
||||
"`P0593R6 <https://wg21.link/P0593R6>`__","CWG","Implicit creation of objects for low-level object manipulation","Prague","* *",""
|
||||
"`P1115R3 <https://wg21.link/P1115R3>`__","LWG","Improving the Return Value of Erase-Like Algorithms II: Free erase/erase if","Prague","|Complete|","11.0"
|
||||
"`P1243R4 <https://wg21.link/P1243R4>`__","LWG","Rangify New Algorithms","Prague","|Complete|","15.0"
|
||||
"`P1243R4 <https://wg21.link/P1243R4>`__","LWG","Rangify New Algorithms","Prague","|Complete|","15.0","|ranges|"
|
||||
"`P1460R1 <https://wg21.link/P1460R1>`__","LWG","Mandating the Standard Library: Clause 20 - Utilities library","Prague","* *",""
|
||||
"`P1739R4 <https://wg21.link/P1739R4>`__","LWG","Avoid template bloat for safe_ranges in combination with ""subrange-y"" view adaptors","Prague","|Complete|","15.0"
|
||||
"`P1739R4 <https://wg21.link/P1739R4>`__","LWG","Avoid template bloat for safe_ranges in combination with ""subrange-y"" view adaptors","Prague","|Complete|","15.0","|ranges|"
|
||||
"`P1831R1 <https://wg21.link/P1831R1>`__","LWG","Deprecating volatile: library","Prague","* *",""
|
||||
"`P1868R2 <https://wg21.link/P1868R2>`__","LWG","width: clarifying units of width and precision in std::format","Prague","|Complete|","14.0"
|
||||
"`P1908R1 <https://wg21.link/P1908R1>`__","CWG","Reserving Attribute Namespaces for Future Use","Prague","* *",""
|
||||
"`P1937R2 <https://wg21.link/P1937R2>`__","CWG","Fixing inconsistencies between constexpr and consteval functions","Prague","* *",""
|
||||
"`P1956R1 <https://wg21.link/P1956R1>`__","LWG","On the names of low-level bit manipulation functions","Prague","|Complete|","12.0"
|
||||
"`P1957R2 <https://wg21.link/P1957R2>`__","CWG","Converting from ``T*``\ to bool should be considered narrowing (re: US 212)","Prague","* *",""
|
||||
"`P1963R0 <https://wg21.link/P1963R0>`__","LWG","Fixing US 313","Prague","* *",""
|
||||
"`P1963R0 <https://wg21.link/P1963R0>`__","LWG","Fixing US 313","Prague","* *","",""
|
||||
"`P1964R2 <https://wg21.link/P1964R2>`__","LWG","Wording for boolean-testable","Prague","|Complete|","13.0"
|
||||
"`P1970R2 <https://wg21.link/P1970R2>`__","LWG","Consistency for size() functions: Add ranges::ssize","Prague","|Complete|","15.0"
|
||||
"`P1973R1 <https://wg21.link/P1973R1>`__","LWG","Rename ""_default_init"" Functions, Rev1","Prague","* *",""
|
||||
"`P1976R2 <https://wg21.link/P1976R2>`__","LWG","Fixed-size span construction from dynamic range","Prague","|Complete|","11.0"
|
||||
"`P1970R2 <https://wg21.link/P1970R2>`__","LWG","Consistency for size() functions: Add ranges::ssize","Prague","|Complete|","15.0","|ranges|"
|
||||
"`P1973R1 <https://wg21.link/P1973R1>`__","LWG","Rename ""_default_init"" Functions, Rev1","Prague","|Complete|","16.0"
|
||||
"`P1976R2 <https://wg21.link/P1976R2>`__","LWG","Fixed-size span construction from dynamic range","Prague","|Complete|","11.0","|ranges|"
|
||||
"`P1981R0 <https://wg21.link/P1981R0>`__","LWG","Rename leap to leap_second","Prague","* *",""
|
||||
"`P1982R0 <https://wg21.link/P1982R0>`__","LWG","Rename link to time_zone_link","Prague","* *",""
|
||||
"`P1983R0 <https://wg21.link/P1983R0>`__","LWG","Wording for GB301, US296, US292, US291, and US283","Prague","|Complete|","15.0"
|
||||
"`P1994R1 <https://wg21.link/P1994R1>`__","LWG","elements_view needs its own sentinel","Prague","* *",""
|
||||
"`P1983R0 <https://wg21.link/P1983R0>`__","LWG","Wording for GB301, US296, US292, US291, and US283","Prague","|Complete|","15.0","|ranges|"
|
||||
"`P1994R1 <https://wg21.link/P1994R1>`__","LWG","elements_view needs its own sentinel","Prague","|Complete|","16.0","|ranges|"
|
||||
"`P2002R1 <https://wg21.link/P2002R1>`__","CWG","Defaulted comparison specification cleanups","Prague","* *",""
|
||||
"`P2045R1 <https://wg21.link/P2045R1>`__","LWG","Missing Mandates for the standard library","Prague","* *",""
|
||||
"`P2085R0 <https://wg21.link/P2085R0>`__","CWG","Consistent defaulted comparisons","Prague","* *",""
|
||||
"`P2091R0 <https://wg21.link/P2091R0>`__","LWG","Issues with range access CPOs","Prague","|Complete|","15.0"
|
||||
"`P2091R0 <https://wg21.link/P2091R0>`__","LWG","Issues with range access CPOs","Prague","|Complete|","15.0","|ranges|"
|
||||
"`P2101R0 <https://wg21.link/P2101R0>`__","LWG","'Models' subsumes 'satisfies' (Wording for US298 and US300)","Prague","* *",""
|
||||
"`P2102R0 <https://wg21.link/P2102R0>`__","LWG","Make 'implicit expression variations' more explicit (Wording for US185)","Prague","* *",""
|
||||
"`P2106R0 <https://wg21.link/P2106R0>`__","LWG","Alternative wording for GB315 and GB316","Prague","|Complete|","15.0"
|
||||
"`P2106R0 <https://wg21.link/P2106R0>`__","LWG","Alternative wording for GB315 and GB316","Prague","|Complete|","15.0","|ranges|"
|
||||
"`P2116R0 <https://wg21.link/P2116R0>`__","LWG","Remove tuple-like protocol support from fixed-extent span","Prague","|Complete|","11.0"
|
||||
"","","","","",""
|
||||
"","","","","","",""
|
||||
"`P2231R1 <https://wg21.link/P2231R1>`__","LWG","Missing constexpr in std::optional and std::variant","June 2021","|Partial| [#note-P2231]_","13.0"
|
||||
"`P2325R3 <https://wg21.link/P2325R3>`__","LWG","Views should not be required to be default constructible","June 2021","|In progress|",""
|
||||
"`P2210R2 <https://wg21.link/P2210R2>`__","LWG",Superior String Splitting,"June 2021","",""
|
||||
"`P2216R3 <https://wg21.link/P2216R3>`__","LWG",std::format improvements,"June 2021","|Complete|","15.0"
|
||||
"`P2281R1 <https://wg21.link/P2281R1>`__","LWG",Clarifying range adaptor objects,"June 2021","|Complete|","14.0"
|
||||
"`P2328R1 <https://wg21.link/P2328R1>`__","LWG",join_view should join all views of ranges,"June 2021","",""
|
||||
"`P2367R0 <https://wg21.link/P2367R0>`__","LWG",Remove misuses of list-initialization from Clause 24,"June 2021","",""
|
||||
"","","","","",""
|
||||
"`P2372R3 <https://wg21.link/P2372R3>`__","LWG","Fixing locale handling in chrono formatters","October 2021","",""
|
||||
"`P2415R2 <https://wg21.link/P2415R2>`__","LWG","What is a ``view``","October 2021","|Complete|","14.0"
|
||||
"`P2325R3 <https://wg21.link/P2325R3>`__","LWG","Views should not be required to be default constructible","June 2021","|Complete|","16.0","|ranges|"
|
||||
"`P2210R2 <https://wg21.link/P2210R2>`__","LWG","Superior String Splitting","June 2021","|Complete|","16.0","|ranges|"
|
||||
"`P2216R3 <https://wg21.link/P2216R3>`__","LWG","std::format improvements","June 2021","|Complete|","15.0"
|
||||
"`P2281R1 <https://wg21.link/P2281R1>`__","LWG","Clarifying range adaptor objects","June 2021","|Complete|","14.0","|ranges|"
|
||||
"`P2328R1 <https://wg21.link/P2328R1>`__","LWG","join_view should join all views of ranges","June 2021","|Complete|","15.0","|ranges|"
|
||||
"`P2367R0 <https://wg21.link/P2367R0>`__","LWG","Remove misuses of list-initialization from Clause 24","June 2021","|Complete|","15.0","|ranges|"
|
||||
"","","","","","",""
|
||||
"`P2372R3 <https://wg21.link/P2372R3>`__","LWG","Fixing locale handling in chrono formatters","October 2021","|In Progress|",""
|
||||
"`P2415R2 <https://wg21.link/P2415R2>`__","LWG","What is a ``view``","October 2021","|Complete|","14.0","|ranges|"
|
||||
"`P2418R2 <https://wg21.link/P2418R2>`__","LWG","Add support for ``std::generator``-like types to ``std::format``","October 2021","|Complete|","15.0"
|
||||
"`P2432R1 <https://wg21.link/P2432R1>`__","LWG","Fix ``istream_view``","October 2021","",""
|
||||
"`P2432R1 <https://wg21.link/P2432R1>`__","LWG","Fix ``istream_view``","October 2021","|Complete|","16.0","|ranges|"
|
||||
|
Can't render this file because it has a wrong number of fields in line 2.
|
@ -37,6 +37,12 @@ Paper Status
|
||||
:header-rows: 1
|
||||
:widths: auto
|
||||
|
||||
.. note::
|
||||
|
||||
.. [#note-P0533R9] P0533R9: ``isfinite``, ``isinf``, ``isnan`` and ``isnormal`` are implemented.
|
||||
.. [#note-P1413R3] P1413R3: ``std::aligned_storage_t`` and ``std::aligned_union_t`` are marked deprecated, but
|
||||
clang doesn't issue a diagnostic for deprecated using template declarations.
|
||||
|
||||
.. _issues-status-cxx2b:
|
||||
|
||||
Library Working Group Issues Status
|
||||
|
@ -1,15 +1,15 @@
|
||||
"Issue #","Issue Name","Meeting","Status","First released version","Labels"
|
||||
"`2839 <https://wg21.link/LWG2839>`__","Self-move-assignment of library types, again","November 2020","|Nothing To Do|",""
|
||||
"`3117 <https://wg21.link/LWG3117>`__","Missing ``packaged_task`` deduction guides","November 2020","",""
|
||||
"`3117 <https://wg21.link/LWG3117>`__","Missing ``packaged_task`` deduction guides","November 2020","|Complete|","16.0"
|
||||
"`3143 <https://wg21.link/LWG3143>`__","``monotonic_buffer_resource`` growth policy is unclear","November 2020","",""
|
||||
"`3195 <https://wg21.link/LWG3195>`__","What is the stored pointer value of an empty ``weak_ptr``?","November 2020","|Nothing To Do|",""
|
||||
"`3211 <https://wg21.link/LWG3211>`__","``std::tuple<>`` should be trivially constructible","November 2020","|Complete|","9.0"
|
||||
"`3236 <https://wg21.link/LWG3236>`__","Random access iterator requirements lack limiting relational operators domain to comparing those from the same range","November 2020","|Nothing To Do|","","|ranges|"
|
||||
"`3236 <https://wg21.link/LWG3236>`__","Random access iterator requirements lack limiting relational operators domain to comparing those from the same range","November 2020","|Nothing To Do|",""
|
||||
"`3265 <https://wg21.link/LWG3265>`__","``move_iterator``'s conversions are more broken after P1207","November 2020","Fixed by `LWG3435 <https://wg21.link/LWG3435>`__",""
|
||||
"`3435 <https://wg21.link/LWG3435>`__","``three_way_comparable_with<reverse_iterator<int*>, reverse_iterator<const int*>>``","November 2020","|Complete|","13.0"
|
||||
"`3432 <https://wg21.link/LWG3432>`__","Missing requirement for ``comparison_category``","November 2020","","","|spaceship|"
|
||||
"`3447 <https://wg21.link/LWG3447>`__","Deduction guides for ``take_view`` and ``drop_view`` have different constraints","November 2020","|Complete|","14.0"
|
||||
"`3450 <https://wg21.link/LWG3450>`__","The const overloads of ``take_while_view::begin/end`` are underconstrained","November 2020","","","|ranges|"
|
||||
"`3432 <https://wg21.link/LWG3432>`__","Missing requirement for ``comparison_category``","November 2020","|Complete|","16.0","|spaceship|"
|
||||
"`3447 <https://wg21.link/LWG3447>`__","Deduction guides for ``take_view`` and ``drop_view`` have different constraints","November 2020","|Complete|","14.0","|ranges|"
|
||||
"`3450 <https://wg21.link/LWG3450>`__","The const overloads of ``take_while_view::begin/end`` are underconstrained","November 2020","|Complete|","16.0","|ranges|"
|
||||
"`3464 <https://wg21.link/LWG3464>`__","``istream::gcount()`` can overflow","November 2020","",""
|
||||
"`2731 <https://wg21.link/LWG2731>`__","Existence of ``lock_guard<MutexTypes...>::mutex_type`` typedef unclear","November 2020","|Complete|","5.0"
|
||||
"`2743 <https://wg21.link/LWG2743>`__","P0083R3 ``node_handle`` private members missing ""exposition only"" comment","November 2020","|Nothing To Do|",""
|
||||
@ -22,26 +22,26 @@
|
||||
"`3403 <https://wg21.link/LWG3403>`__","Domain of ``ranges::ssize(E)`` doesn't ``match ranges::size(E)``","November 2020","","","|ranges|"
|
||||
"`3404 <https://wg21.link/LWG3404>`__","Finish removing subrange's conversions from pair-like","November 2020","","","|ranges|"
|
||||
"`3405 <https://wg21.link/LWG3405>`__","``common_view``'s converting constructor is bad, too","November 2020","|Complete|","14.0","|ranges|"
|
||||
"`3406 <https://wg21.link/LWG3406>`__","``elements_view::begin()`` and ``elements_view::end()`` have incompatible constraints","November 2020","","","|ranges|"
|
||||
"`3406 <https://wg21.link/LWG3406>`__","``elements_view::begin()`` and ``elements_view::end()`` have incompatible constraints","November 2020","|Complete|","16.0","|ranges|"
|
||||
"`3419 <https://wg21.link/LWG3419>`__","[algorithms.requirements]/15 doesn't reserve as many rights as it intends to","November 2020","|Nothing To Do|",""
|
||||
"`3420 <https://wg21.link/LWG3420>`__","cpp17-iterator should check that the type looks like an iterator first","November 2020","|Complete|","14.0","|ranges|"
|
||||
"`3421 <https://wg21.link/LWG3421>`__","Imperfect ADL emulation for boolean-testable","November 2020","|Nothing To Do|","","|ranges|"
|
||||
"`3425 <https://wg21.link/LWG3425>`__","``condition_variable_any`` fails to constrain its Lock parameters","November 2020","|Nothing To Do|",""
|
||||
"`3426 <https://wg21.link/LWG3426>`__","``operator<=>(const unique_ptr<T, D>&, nullptr_t)`` can't get no satisfaction","November 2020","","","|spaceship|"
|
||||
"`3427 <https://wg21.link/LWG3427>`__","``operator<=>(const shared_ptr<T>&, nullptr_t)`` definition ill-formed","November 2020","","","|spaceship|"
|
||||
"`3426 <https://wg21.link/LWG3426>`__","``operator<=>(const unique_ptr<T, D>&, nullptr_t)`` can't get no satisfaction","November 2020","|Complete|","16.0","|spaceship|"
|
||||
"`3427 <https://wg21.link/LWG3427>`__","``operator<=>(const shared_ptr<T>&, nullptr_t)`` definition ill-formed","November 2020","|Complete|","16.0","|spaceship|"
|
||||
"`3428 <https://wg21.link/LWG3428>`__","``single_view``'s in place constructor should be explicit","November 2020","|Complete|","14.0","|ranges|"
|
||||
"`3434 <https://wg21.link/LWG3434>`__","``ios_base`` never reclaims memory for iarray and parray","November 2020","|Nothing To Do|",""
|
||||
"`3437 <https://wg21.link/LWG3437>`__","``__cpp_lib_polymorphic_allocator`` is in the wrong header","November 2020","|Complete|","14.0"
|
||||
"`3446 <https://wg21.link/LWG3446>`__","``indirectly_readable_traits`` ambiguity for types with both ``value_type`` and ``element_type``","November 2020","|Complete|","14.0","|ranges|"
|
||||
"`3448 <https://wg21.link/LWG3448>`__","``transform_view``'s ``sentinel<false>`` not comparable with ``iterator<true>``","November 2020","","","|ranges|"
|
||||
"`3449 <https://wg21.link/LWG3449>`__","``take_view`` and ``take_while_view``'s ``sentinel<false>`` not comparable with their ``const iterator``","November 2020","","","|ranges|"
|
||||
"`3449 <https://wg21.link/LWG3449>`__","``take_view`` and ``take_while_view``'s ``sentinel<false>`` not comparable with their ``const iterator``","November 2020","|Complete|","16.0","|ranges|"
|
||||
"`3453 <https://wg21.link/LWG3453>`__","Generic code cannot call ``ranges::advance(i, s)``","November 2020","|Nothing To Do|","","|ranges|"
|
||||
"`3455 <https://wg21.link/LWG3455>`__","Incorrect Postconditions on ``unique_ptr`` move assignment","November 2020","|Nothing To Do|",""
|
||||
"`3460 <https://wg21.link/LWG3460>`__","Unimplementable ``noop_coroutine_handle`` guarantees","November 2020","|Complete|","14.0"
|
||||
"`3461 <https://wg21.link/LWG3461>`__","``convertible_to``'s description mishandles cv-qualified ``void``","November 2020","|Nothing To Do|",""
|
||||
"`3465 <https://wg21.link/LWG3465>`__","``compare_partial_order_fallback`` requires ``F < E``","November 2020","|Complete|","14.0","|spaceship|"
|
||||
"`3466 <https://wg21.link/LWG3466>`__","Specify the requirements for ``promise``/``future``/``shared_future`` consistently","November 2020","|Nothing To Do|",""
|
||||
"`3467 <https://wg21.link/LWG3467>`__","``bool`` can't be an integer-like type","November 2020","|Complete|","14.0"
|
||||
"`3467 <https://wg21.link/LWG3467>`__","``bool`` can't be an integer-like type","November 2020","|Complete|","14.0","|ranges|"
|
||||
"`3472 <https://wg21.link/LWG3472>`__","``counted_iterator`` is missing preconditions","November 2020","|Complete|","14.0","|ranges|"
|
||||
"`3473 <https://wg21.link/LWG3473>`__","Normative encouragement in non-normative note","November 2020","|Complete|","15.0","|format|"
|
||||
"`3474 <https://wg21.link/LWG3474>`__","Nesting ``join_views`` is broken because of CTAD","November 2020","|Complete|","15.0","|ranges|"
|
||||
@ -49,17 +49,17 @@
|
||||
"`3477 <https://wg21.link/LWG3477>`__","Simplify constraints for ``semiregular-box``","November 2020","","","|ranges|"
|
||||
"`3482 <https://wg21.link/LWG3482>`__","``drop_view``'s const begin should additionally require ``sized_range``","November 2020","|Complete|","14.0","|ranges|"
|
||||
"`3483 <https://wg21.link/LWG3483>`__","``transform_view::iterator``'s difference is overconstrained","November 2020","|Complete|","14.0","|ranges|"
|
||||
"","","","",""
|
||||
"","","","","",""
|
||||
"`3391 <https://wg21.link/LWG3391>`__","Problems with ``counted_iterator``/``move_iterator::base() const &``","February 2021","","","|ranges|"
|
||||
"`3433 <https://wg21.link/LWG3433>`__","``subrange::advance(n)`` has UB when ``n < 0``","February 2021","|Complete|","14.0","|ranges|"
|
||||
"`3490 <https://wg21.link/LWG3490>`__","``ranges::drop_while_view::begin()`` is missing a precondition","February 2021","|Nothing To Do|","","|ranges|"
|
||||
"`3492 <https://wg21.link/LWG3492>`__","Minimal improvements to ``elements_view::iterator``","February 2021","","","|ranges|"
|
||||
"`3492 <https://wg21.link/LWG3492>`__","Minimal improvements to ``elements_view::iterator``","February 2021","|Complete|","16.0","|ranges|"
|
||||
"`3494 <https://wg21.link/LWG3494>`__","Allow ranges to be conditionally borrowed","February 2021","Superseded by `P2017R1 <https://wg21.link/P2017R1>`__","","|ranges|"
|
||||
"`3495 <https://wg21.link/LWG3495>`__","``constexpr launder`` makes pointers to inactive members of unions usable","February 2021","|Nothing To Do|",""
|
||||
"`3500 <https://wg21.link/LWG3500>`__","``join_view::iterator::operator->()`` is bogus","February 2021","|Complete|","14.0","|ranges|"
|
||||
"`3502 <https://wg21.link/LWG3502>`__","``elements_view`` should not be allowed to return dangling reference","February 2021","","","|ranges|"
|
||||
"`3502 <https://wg21.link/LWG3502>`__","``elements_view`` should not be allowed to return dangling reference","February 2021","|Complete|","16.0","|ranges|"
|
||||
"`3505 <https://wg21.link/LWG3505>`__","``split_view::outer-iterator::operator++`` misspecified","February 2021","","","|ranges|"
|
||||
"","","","",""
|
||||
"","","","","",""
|
||||
`2774 <https://wg21.link/LWG2774>`__,"``std::function`` construction vs assignment","June 2021","",""
|
||||
`2818 <https://wg21.link/LWG2818>`__,"``::std::`` everywhere rule needs tweaking","June 2021","|Nothing To Do|",""
|
||||
`2997 <https://wg21.link/LWG2997>`__,"LWG 491 and the specification of ``{forward_,}list::unique``","June 2021","",""
|
||||
@ -73,7 +73,7 @@
|
||||
`3519 <https://wg21.link/LWG3519>`__,"Incomplete synopses for ``<random>`` classes","June 2021","",""
|
||||
`3520 <https://wg21.link/LWG3520>`__,"``iter_move`` and ``iter_swap`` are inconsistent for ``transform_view::iterator``","June 2021","|Complete|","14.0","|ranges|"
|
||||
`3521 <https://wg21.link/LWG3521>`__,"Overly strict requirements on ``qsort`` and ``bsearch``","June 2021","|Nothing To Do|",""
|
||||
`3522 <https://wg21.link/LWG3522>`__,"Missing requirement on ``InputIterator`` template parameter for ``priority_queue`` constructors","June 2021","|Complete|","14.0","|ranges|"
|
||||
`3522 <https://wg21.link/LWG3522>`__,"Missing requirement on ``InputIterator`` template parameter for ``priority_queue`` constructors","June 2021","|Complete|","14.0"
|
||||
`3523 <https://wg21.link/LWG3523>`__,"``iota_view::sentinel`` is not always ``iota_view``'s sentinel","June 2021","","","|ranges|"
|
||||
`3526 <https://wg21.link/LWG3526>`__,"Return types of ``uses_allocator_construction_args`` unspecified","June 2021","",""
|
||||
`3527 <https://wg21.link/LWG3527>`__,"``uses_allocator_construction_args`` handles rvalue pairs of rvalue references incorrectly","June 2021","",""
|
||||
@ -83,7 +83,7 @@
|
||||
`3532 <https://wg21.link/LWG3532>`__,"``split_view<V, P>::inner-iterator<true>::operator++(int)`` should depend on ``Base``","June 2021","","","|ranges|"
|
||||
`3533 <https://wg21.link/LWG3533>`__,"Make ``base() const &`` consistent across iterator wrappers that supports ``input_iterators``","June 2021","|Complete|","14.0","|ranges|"
|
||||
`3536 <https://wg21.link/LWG3536>`__,"Should ``chrono::from_stream()`` assign zero to duration for failure?","June 2021","","","|chrono|"
|
||||
`3539 <https://wg21.link/LWG3539>`__,"``format_to`` must not copy models of ``output_iterator<const charT&>``","June 2021","","","|format|"
|
||||
`3539 <https://wg21.link/LWG3539>`__,"``format_to`` must not copy models of ``output_iterator<const charT&>``","June 2021","|Complete|","14.0","|format|"
|
||||
`3540 <https://wg21.link/LWG3540>`__,"§[format.arg] There should be no const in ``basic_format_arg(const T* p)``","June 2021","|Complete|","14.0","|format|"
|
||||
`3541 <https://wg21.link/LWG3541>`__,"``indirectly_readable_traits`` should be SFINAE-friendly for all types","June 2021","|Complete|","14.0","|ranges|"
|
||||
`3542 <https://wg21.link/LWG3542>`__,"``basic_format_arg`` mishandles ``basic_string_view`` with custom traits","June 2021","|Complete|","14.0","|format|"
|
||||
@ -96,7 +96,7 @@
|
||||
`3552 <https://wg21.link/LWG3552>`__,"Parallel specialized memory algorithms should require forward iterators","June 2021","",""
|
||||
`3553 <https://wg21.link/LWG3553>`__,"Useless constraint in ``split_view::outer-iterator::value_type::begin()``","June 2021","","","|ranges|"
|
||||
`3555 <https://wg21.link/LWG3555>`__,"``{transform,elements}_view::iterator::iterator_concept`` should consider const-qualification of the underlying range","June 2021","","","|ranges|"
|
||||
"","","","",""
|
||||
"","","","","",""
|
||||
`2191 <https://wg21.link/LWG2191>`__,"Incorrect specification of ``match_results(match_results&&)``","October 2021","|Nothing To Do|",""
|
||||
`2381 <https://wg21.link/LWG2381>`__,"Inconsistency in parsing floating point numbers","October 2021","",""
|
||||
`2762 <https://wg21.link/LWG2762>`__,"``unique_ptr operator*()`` should be ``noexcept``","October 2021","",""
|
||||
@ -104,7 +104,7 @@
|
||||
`3123 <https://wg21.link/LWG3123>`__,"``duration`` constructor from representation shouldn't be effectively non-throwing","October 2021","","","|chrono|"
|
||||
`3146 <https://wg21.link/LWG3146>`__,"Excessive unwrapping in ``std::ref/cref``","October 2021","|Complete|","14.0"
|
||||
`3152 <https://wg21.link/LWG3152>`__,"``common_type`` and ``common_reference`` have flaws in common","October 2021","",""
|
||||
`3293 <https://wg21.link/LWG3293>`__,"``move_iterator operator+()`` has incorrect constraints","October 2021","|Complete|","15.0","|ranges|"
|
||||
`3293 <https://wg21.link/LWG3293>`__,"``move_iterator operator+()`` has incorrect constraints","October 2021","|Complete|","15.0"
|
||||
`3361 <https://wg21.link/LWG3361>`__,"``safe_range<SomeRange&>`` case","October 2021","|Nothing To Do|","","|ranges|"
|
||||
`3392 <https://wg21.link/LWG3392>`__,"``ranges::distance()`` cannot be used on a move-only iterator with a sized sentinel","October 2021","|Complete|","14.0","|ranges|"
|
||||
`3407 <https://wg21.link/LWG3407>`__,"Some problems with the wording changes of P1739R4","October 2021","|Complete|","15.0","|ranges|"
|
||||
@ -120,8 +120,8 @@
|
||||
`3561 <https://wg21.link/LWG3561>`__,"Issue with internal counter in ``discard_block_engine``","October 2021","",""
|
||||
`3563 <https://wg21.link/LWG3563>`__,"``keys_view`` example is broken","October 2021","","","|ranges|"
|
||||
`3566 <https://wg21.link/LWG3566>`__,"Constraint recursion for ``operator<=>(optional<T>, U)``","October 2021","","","|spaceship|"
|
||||
`3567 <https://wg21.link/LWG3567>`__,"Formatting move-only iterators take two","October 2021","","","|format|"
|
||||
`3568 <https://wg21.link/LWG3568>`__,"``basic_istream_view`` needs to initialize ``value_``","October 2021","","","|ranges|"
|
||||
`3567 <https://wg21.link/LWG3567>`__,"Formatting move-only iterators take two","October 2021","|Complete|","16.0","|format| |ranges|"
|
||||
`3568 <https://wg21.link/LWG3568>`__,"``basic_istream_view`` needs to initialize ``value_``","October 2021","|Complete|","16.0","|ranges|"
|
||||
`3570 <https://wg21.link/LWG3570>`__,"``basic_osyncstream::emit`` should be an unformatted output function","October 2021","",""
|
||||
`3571 <https://wg21.link/LWG3571>`__,"``flush_emit`` should set ``badbit`` if the ``emit`` call fails","October 2021","",""
|
||||
`3572 <https://wg21.link/LWG3572>`__,"``copyable-box`` should be fully ``constexpr``","October 2021","|Complete|","14.0","|ranges|"
|
||||
@ -131,12 +131,12 @@
|
||||
`3581 <https://wg21.link/LWG3581>`__,"The range constructor makes ``basic_string_view`` not trivially move constructible","October 2021","|Complete|","14.0","|ranges|"
|
||||
`3585 <https://wg21.link/LWG3585>`__,"``variant`` converting assignment with immovable alternative","October 2021","",""
|
||||
`3589 <https://wg21.link/LWG3589>`__,"The ``const`` lvalue reference overload of ``get`` for ``subrange`` does not constrain ``I`` to be ``copyable`` when ``N == 0``","October 2021","|Complete|","14.0","|ranges|"
|
||||
`3590 <https://wg21.link/LWG3590>`__,"``split_view::base() const &`` is overconstrained","October 2021","","","|ranges|"
|
||||
`3590 <https://wg21.link/LWG3590>`__,"``split_view::base() const &`` is overconstrained","October 2021","|Complete|","16.0","|ranges|"
|
||||
`3591 <https://wg21.link/LWG3591>`__,"``lazy_split_view<input_view>::inner-iterator::base() &&`` invalidates outer iterators","October 2021","","","|ranges|"
|
||||
`3592 <https://wg21.link/LWG3592>`__,"``lazy_split_view`` needs to check the simpleness of Pattern","October 2021","","","|ranges|"
|
||||
`3593 <https://wg21.link/LWG3593>`__,"Several iterators' ``base() const &`` and ``lazy_split_view::outer-iterator::value_type::end()`` missing ``noexcept``","October 2021","","","|ranges|"
|
||||
`3595 <https://wg21.link/LWG3595>`__,"Exposition-only classes proxy and postfix-proxy for ``common_iterator`` should be fully ``constexpr``","October 2021","|Complete|","14.0","|ranges|"
|
||||
"","","","",""
|
||||
"","","","","",""
|
||||
"`3088 <https://wg21.link/LWG3088>`__","``forward_list::merge`` behaviour unclear when passed ``*this``","February 2022","",""
|
||||
"`3471 <https://wg21.link/LWG3471>`__","``polymorphic_allocator::allocate`` does not satisfy ``Cpp17Allocator`` requirements","February 2022","",""
|
||||
"`3525 <https://wg21.link/LWG3525>`__","``uses_allocator_construction_args`` fails to handle types convertible to ``pair``","February 2022","",""
|
||||
@ -150,15 +150,15 @@
|
||||
"`3619 <https://wg21.link/LWG3619>`__","Specification of ``vformat_to`` contains ill-formed ``formatted_size`` calls","February 2022","|Nothing to do|","","|format|"
|
||||
"`3621 <https://wg21.link/LWG3621>`__","Remove feature-test macro ``__cpp_lib_monadic_optional`` ","February 2022","|Complete|","15.0"
|
||||
"`3632 <https://wg21.link/LWG3632>`__","``unique_ptr`` ""Mandates: This constructor is not selected by class template argument deduction""","February 2022","|Nothing to do|",""
|
||||
"`3643 <https://wg21.link/LWG3643>`__","Missing ``constexpr`` in ``std::counted_iterator`` ","February 2022","",""
|
||||
"`3643 <https://wg21.link/LWG3643>`__","Missing ``constexpr`` in ``std::counted_iterator`` ","February 2022","","","|ranges|"
|
||||
"`3648 <https://wg21.link/LWG3648>`__","``format`` should not print ``bool`` with ``'c'`` ","February 2022","|Complete|","15.0","|format|"
|
||||
"`3649 <https://wg21.link/LWG3649>`__","[fund.ts.v2] Reinstate and bump ``__cpp_lib_experimental_memory_resource`` feature test macro","February 2022","",""
|
||||
"`3650 <https://wg21.link/LWG3650>`__","Are ``std::basic_string`` 's ``iterator`` and ``const_iterator`` constexpr iterators?","February 2022","|Nothing to do|",""
|
||||
"`3654 <https://wg21.link/LWG3654>`__","``basic_format_context::arg(size_t)`` should be ``noexcept`` ","February 2022","|Complete|","15.0","|format|"
|
||||
"`3657 <https://wg21.link/LWG3657>`__","``std::hash<std::filesystem::path>`` is not enabled","February 2022","",""
|
||||
"`3660 <https://wg21.link/LWG3660>`__","``iterator_traits<common_iterator>::pointer`` should conform to §[iterator.traits]","February 2022","|Complete|","14.0"
|
||||
"`3660 <https://wg21.link/LWG3660>`__","``iterator_traits<common_iterator>::pointer`` should conform to §[iterator.traits]","February 2022","|Complete|","14.0","|ranges|"
|
||||
"`3661 <https://wg21.link/LWG3661>`__","``constinit atomic<shared_ptr<T>> a(nullptr);`` should work","February 2022","",""
|
||||
"","","","",""
|
||||
"","","","","",""
|
||||
"`3564 <https://wg21.link/LWG3564>`__","``transform_view::iterator<true>::value_type`` and ``iterator_category`` should use ``const F&``","July 2022","","","|ranges|"
|
||||
"`3617 <https://wg21.link/LWG3617>`__","``function``/``packaged_task`` deduction guides and deducing ``this``","July 2022","",""
|
||||
"`3656 <https://wg21.link/LWG3656>`__","Inconsistent bit operations returning a count","July 2022","|Complete|","15.0",""
|
||||
@ -167,25 +167,84 @@
|
||||
"`3671 <https://wg21.link/LWG3671>`__","``atomic_fetch_xor`` missing from ``stdatomic.h``","July 2022","",""
|
||||
"`3672 <https://wg21.link/LWG3672>`__","``common_iterator::operator->()`` should return by value","July 2022","","","|ranges|"
|
||||
"`3683 <https://wg21.link/LWG3683>`__","``operator==`` for ``polymorphic_allocator`` cannot deduce template argument in common cases","July 2022","",""
|
||||
"`3687 <https://wg21.link/LWG3687>`__","``expected<cv void, E>`` move constructor should move","July 2022","",""
|
||||
"`3692 <https://wg21.link/LWG3692>`__","``zip_view::iterator``'s ``operator<=>`` is overconstrained","July 2022","","","|spaceship|"
|
||||
"`3687 <https://wg21.link/LWG3687>`__","``expected<cv void, E>`` move constructor should move","July 2022","|Complete|","16.0"
|
||||
"`3692 <https://wg21.link/LWG3692>`__","``zip_view::iterator``'s ``operator<=>`` is overconstrained","July 2022","","","|ranges| |spaceship|"
|
||||
"`3701 <https://wg21.link/LWG3701>`__","Make ``formatter<remove_cvref_t<const charT[N]>, charT>`` requirement explicit","July 2022","","","|format|"
|
||||
"`3702 <https://wg21.link/LWG3702>`__","Should ``zip_transform_view::iterator`` remove ``operator<``","July 2022","",""
|
||||
"`3703 <https://wg21.link/LWG3703>`__","Missing requirements for ``expected<T, E>`` requires ``is_void<T>``","July 2022","",""
|
||||
"`3702 <https://wg21.link/LWG3702>`__","Should ``zip_transform_view::iterator`` remove ``operator<``","July 2022","","","|ranges| |spaceship|"
|
||||
"`3703 <https://wg21.link/LWG3703>`__","Missing requirements for ``expected<T, E>`` requires ``is_void<T>``","July 2022","|Complete|","16.0"
|
||||
"`3704 <https://wg21.link/LWG3704>`__","LWG 2059 added overloads that might be ill-formed for sets","July 2022","",""
|
||||
"`3705 <https://wg21.link/LWG3705>`__","Hashability shouldn't depend on basic_string's allocator","July 2022","",""
|
||||
"`3705 <https://wg21.link/LWG3705>`__","Hashability shouldn't depend on basic_string's allocator","July 2022","|Complete|","16.0"
|
||||
"`3707 <https://wg21.link/LWG3707>`__","chunk_view::outer-iterator::value_type::size should return unsigned type","July 2022","","","|ranges|"
|
||||
"`3708 <https://wg21.link/LWG3708>`__","``take_while_view::sentinel``'s conversion constructor should move","July 2022","","","|ranges|"
|
||||
"`3708 <https://wg21.link/LWG3708>`__","``take_while_view::sentinel``'s conversion constructor should move","July 2022","|Complete|","16.0","|ranges|"
|
||||
"`3709 <https://wg21.link/LWG3709>`__","LWG-3703 was underly ambitious","July 2022","",""
|
||||
"`3710 <https://wg21.link/LWG3710>`__","The ``end`` of ``chunk_view`` for input ranges can be ``const``","July 2022","","","|ranges|"
|
||||
"`3711 <https://wg21.link/LWG3711>`__","Missing preconditions for slide_view constructor","July 2022","","","|ranges|"
|
||||
"`3712 <https://wg21.link/LWG3712>`__","``chunk_view`` and ``slide_view`` should not be ``default_initializable``","July 2022","","","|ranges|"
|
||||
"`3713 <https://wg21.link/LWG3713>`__","Sorted with respect to comparator (only)","July 2022","",""
|
||||
"`3715 <https://wg21.link/LWG3715>`__","``view_interface::empty`` is overconstrained","July 2022","",""
|
||||
"`3719 <https://wg21.link/LWG3719>`__","Directory iterators should be usable with default sentinel","July 2022","",""
|
||||
"`3721 <https://wg21.link/LWG3721>`__","Allow an ``arg-id`` with a value of zero for ``width`` in ``std-format-spec``","July 2022","","","|format|"
|
||||
"`3715 <https://wg21.link/LWG3715>`__","``view_interface::empty`` is overconstrained","July 2022","","","|ranges|"
|
||||
"`3719 <https://wg21.link/LWG3719>`__","Directory iterators should be usable with default sentinel","July 2022","","","|ranges|"
|
||||
"`3721 <https://wg21.link/LWG3721>`__","Allow an ``arg-id`` with a value of zero for ``width`` in ``std-format-spec``","July 2022","|Complete|","16.0","|format|"
|
||||
"`3724 <https://wg21.link/LWG3724>`__","``decay-copy`` should be constrained","July 2022","|Complete|","14.0"
|
||||
"","","","",""
|
||||
"`3645 <https://wg21.link/LWG3645>`__","``resize_and_overwrite`` is overspecified to call its callback with lvalues","Not voted in","|Complete|","14.0",""
|
||||
"","","","","",""
|
||||
"`3028 <https://wg21.link/LWG3028>`__","Container requirements tables should distinguish ``const`` and non-``const`` variables", "November 2022","","",""
|
||||
"`3118 <https://wg21.link/LWG3118>`__","``fpos`` equality comparison unspecified", "November 2022","","",""
|
||||
"`3177 <https://wg21.link/LWG3177>`__","Limit permission to specialize variable templates to program-defined types", "November 2022","|Nothing to do|","",""
|
||||
"`3515 <https://wg21.link/LWG3515>`__","§[stacktrace.basic.nonmem]: ``operator<<`` should be less templatized", "November 2022","","",""
|
||||
"`3545 <https://wg21.link/LWG3545>`__","``std::pointer_traits`` should be SFINAE-friendly", "November 2022","","",""
|
||||
"`3569 <https://wg21.link/LWG3569>`__","``join_view`` fails to support ranges of ranges with non-default_initializable iterators", "November 2022","","","|ranges|"
|
||||
"`3594 <https://wg21.link/LWG3594>`__","``inout_ptr`` — inconsistent ``release()`` in destructor", "November 2022","","",""
|
||||
"`3597 <https://wg21.link/LWG3597>`__","Unsigned integer types don't model advanceable", "November 2022","","","|ranges|"
|
||||
"`3600 <https://wg21.link/LWG3600>`__","Making ``istream_iterator`` copy constructor trivial is an ABI break", "November 2022","","",""
|
||||
"`3629 <https://wg21.link/LWG3629>`__","``make_error_code`` and ``make_error_condition`` are customization points","November 2022","|Complete|","16.0",""
|
||||
"`3636 <https://wg21.link/LWG3636>`__","``formatter<T>::format`` should be ``const``-qualified","November 2022","|Complete|","16.0","|format|"
|
||||
"`3646 <https://wg21.link/LWG3646>`__","``std::ranges::view_interface::size`` returns a signed type","November 2022","|Complete|","16.0","|ranges|"
|
||||
"`3677 <https://wg21.link/LWG3677>`__","Is a cv-qualified ``pair`` specially handled in uses-allocator construction?", "November 2022","","",""
|
||||
"`3717 <https://wg21.link/LWG3717>`__","``common_view::end`` should improve ``random_access_range`` case", "November 2022","","","|ranges|"
|
||||
"`3732 <https://wg21.link/LWG3732>`__","``prepend_range`` and ``append_range`` can't be amortized constant time", "November 2022","|Nothing to do|","","|ranges|"
|
||||
"`3736 <https://wg21.link/LWG3736>`__","``move_iterator`` missing ``disable_sized_sentinel_for`` specialization", "November 2022","","","|ranges|"
|
||||
"`3737 <https://wg21.link/LWG3737>`__","``take_view::sentinel`` should provide ``operator-``", "November 2022","","","|ranges|"
|
||||
"`3738 <https://wg21.link/LWG3738>`__","Missing preconditions for ``take_view`` constructor", "November 2022","|Complete|","16.0","|ranges|"
|
||||
"`3743 <https://wg21.link/LWG3743>`__","``ranges::to``'s reserve may be ill-formed", "November 2022","","","|ranges|"
|
||||
"`3745 <https://wg21.link/LWG3745>`__","``std::atomic_wait`` and its friends lack ``noexcept``", "November 2022","|Complete|","16.0",""
|
||||
"`3746 <https://wg21.link/LWG3746>`__","``optional``'s spaceship with ``U`` with a type derived from optional causes infinite constraint meta-recursion", "November 2022","","","|spaceship|"
|
||||
"`3747 <https://wg21.link/LWG3747>`__","``ranges::uninitialized_copy_n``, ``ranges::uninitialized_move_n``, and ``ranges::destroy_n`` should use ``std::move``", "November 2022","","","|ranges|"
|
||||
"`3750 <https://wg21.link/LWG3750>`__","Too many papers bump ``__cpp_lib_format``", "November 2022","","","|format|"
|
||||
"`3751 <https://wg21.link/LWG3751>`__","Missing feature macro for ``flat_set``", "November 2022","","","|flat_containers|"
|
||||
"`3753 <https://wg21.link/LWG3753>`__","Clarify entity vs. freestanding entity", "November 2022","","",""
|
||||
"`3754 <https://wg21.link/LWG3754>`__","Class template expected synopsis contains declarations that do not match the detailed description", "November 2022","","",""
|
||||
"`3755 <https://wg21.link/LWG3755>`__","``tuple-for-each`` can call ``user-defined`` ``operator,``", "November 2022","","",""
|
||||
"`3757 <https://wg21.link/LWG3757>`__","What's the effect of ``std::forward_like<void>(x)``?", "November 2022","","",""
|
||||
"`3759 <https://wg21.link/LWG3759>`__","``ranges::rotate_copy`` should use ``std::move``", "November 2022","","","|ranges|"
|
||||
"`3760 <https://wg21.link/LWG3760>`__","``cartesian_product_view::iterator``'s ``parent_`` is never valid", "November 2022","","","|ranges|"
|
||||
"`3761 <https://wg21.link/LWG3761>`__","``cartesian_product_view::iterator::operator-`` should pass by reference", "November 2022","","","|ranges|"
|
||||
"`3762 <https://wg21.link/LWG3762>`__","``generator::iterator::operator==`` should pass by reference", "November 2022","","",""
|
||||
"`3764 <https://wg21.link/LWG3764>`__","``reference_wrapper::operator()`` should propagate noexcept", "November 2022","","",""
|
||||
"`3765 <https://wg21.link/LWG3765>`__","``const_sentinel`` should be constrained", "November 2022","","","|ranges|"
|
||||
"`3766 <https://wg21.link/LWG3766>`__","``view_interface::cbegin`` is underconstrained", "November 2022","","","|ranges|"
|
||||
"`3770 <https://wg21.link/LWG3770>`__","``const_sentinel_t`` is missing", "November 2022","","","|ranges|"
|
||||
"`3773 <https://wg21.link/LWG3773>`__","``views::zip_transform`` still requires ``F`` to be ``copy_constructible`` when empty pack", "November 2022","","","|ranges|"
|
||||
"`3774 <https://wg21.link/LWG3774>`__","``<flat_set>`` should include ``<compare>``", "November 2022","","","|flat_containers|"
|
||||
"`3775 <https://wg21.link/LWG3775>`__","Broken dependencies in the ``Cpp17Allocator`` requirements", "November 2022","","",""
|
||||
"`3778 <https://wg21.link/LWG3778>`__","``vector<bool>`` missing exception specifications", "November 2022","","",""
|
||||
"`3781 <https://wg21.link/LWG3781>`__","The exposition-only alias templates ``cont-key-type`` and ``cont-mapped-type`` should be removed", "November 2022","","",""
|
||||
"`3782 <https://wg21.link/LWG3782>`__","Should ``<math.h>`` declare ``::lerp``?", "November 2022","","",""
|
||||
"`3784 <https://wg21.link/LWG3784>`__","std.compat should not provide ``::byte`` and its friends", "November 2022","","",""
|
||||
"`3785 <https://wg21.link/LWG3785>`__","``ranges::to`` is over-constrained on the destination type being a range", "November 2022","","","|ranges|"
|
||||
"`3788 <https://wg21.link/LWG3788>`__","``jthread::operator=(jthread&&)`` postconditions are unimplementable under self-assignment", "November 2022","","",""
|
||||
"`3792 <https://wg21.link/LWG3792>`__","``__cpp_lib_constexpr_algorithms`` should also be defined in ``<utility>``", "November 2022","|Complete|","16.0",""
|
||||
"`3795 <https://wg21.link/LWG3795>`__","Self-move-assignment of ``std::future`` and ``std::shared_future`` have unimplementable postconditions", "November 2022","","",""
|
||||
"`3796 <https://wg21.link/LWG3796>`__","``movable-box`` as member should use ``default-initialization`` instead of ``copy-initialization``", "November 2022","","","|ranges|"
|
||||
"`3798 <https://wg21.link/LWG3798>`__","Rvalue reference and ``iterator_category``", "November 2022","","",""
|
||||
"`3801 <https://wg21.link/LWG3801>`__","``cartesian_product_view::iterator::distance-from`` ignores the size of last underlying range", "November 2022","","","|ranges|"
|
||||
"`3814 <https://wg21.link/LWG3814>`__","Add freestanding items requested by NB comments", "November 2022","","",""
|
||||
"`3816 <https://wg21.link/LWG3816>`__","``flat_map`` and ``flat_multimap`` should impose sequence container requirements", "November 2022","","","|flat_containers|"
|
||||
"`3817 <https://wg21.link/LWG3817>`__","Missing preconditions on ``forward_list`` modifiers", "November 2022","","",""
|
||||
"`3818 <https://wg21.link/LWG3818>`__","Exposition-only concepts are not described in library intro", "November 2022","|Nothing to do|","",""
|
||||
"`3822 <https://wg21.link/LWG3822>`__","Avoiding normalization in ``filesystem::weakly_canonical``", "November 2022","","",""
|
||||
"`3823 <https://wg21.link/LWG3823>`__","Unnecessary precondition for ``is_aggregate``", "November 2022","","",""
|
||||
"`3824 <https://wg21.link/LWG3824>`__","Number of ``bind`` placeholders is underspecified", "November 2022","|Nothing to do|","",""
|
||||
"`3826 <https://wg21.link/LWG3826>`__","Redundant specification [for overload of yield_value]", "November 2022","","",""
|
||||
"","","","","",""
|
||||
"`3631 <https://wg21.link/LWG3631>`__","``basic_format_arg(T&&)`` should use ``remove_cvref_t<T>`` throughout","Not voted in","|Complete|","15.0",""
|
||||
"","","","",""
|
||||
"`3645 <https://wg21.link/LWG3645>`__","``resize_and_overwrite`` is overspecified to call its callback with lvalues","Not voted in","|Complete|","14.0",""
|
||||
"`3343 <https://wg21.link/LWG3343>`__","Ordering of calls to ``unlock()`` and ``notify_all()`` in Effects element of ``notify_all_at_thread_exit()`` should be reversed","Not Yet Adopted","|Complete|","16.0",""
|
||||
|
Can't render this file because it has a wrong number of fields in line 2.
|
@ -1,28 +1,28 @@
|
||||
"Paper #","Group","Paper Name","Meeting","Status","First released version"
|
||||
"Paper #","Group","Paper Name","Meeting","Status","First released version","Labels"
|
||||
"`P0881R7 <https://wg21.link/P0881R7>`__","LWG","A Proposal to add stacktrace library","Autumn 2020","",""
|
||||
"`P0943R6 <https://wg21.link/P0943R6>`__","LWG","Support C atomics in C++","Autumn 2020","|Complete|","15.0"
|
||||
"`P1048R1 <https://wg21.link/P1048R1>`__","LWG","A proposal for a type trait to detect scoped enumerations","Autumn 2020","|Complete|","12.0"
|
||||
"`P1679R3 <https://wg21.link/P1679R3>`__","LWG","string contains function","Autumn 2020","|Complete|","12.0"
|
||||
"","","","","",""
|
||||
"","","","","","",""
|
||||
"`P1682R3 <https://wg21.link/P1682R3>`__","LWG","std::to_underlying for enumerations","February 2021","|Complete|","13.0"
|
||||
"`P2017R1 <https://wg21.link/P2017R1>`__","LWG","Conditionally borrowed ranges","February 2021","",""
|
||||
"`P2017R1 <https://wg21.link/P2017R1>`__","LWG","Conditionally borrowed ranges","February 2021","","","|ranges|"
|
||||
"`P2160R1 <https://wg21.link/P2160R1>`__","LWG","Locks lock lockables","February 2021","",""
|
||||
"`P2162R2 <https://wg21.link/P2162R2>`__","LWG","Inheriting from std::variant","February 2021","|Complete|","13.0"
|
||||
"`P2212R2 <https://wg21.link/P2212R2>`__","LWG","Relax Requirements for time_point::clock","February 2021","",""
|
||||
"`P2259R1 <https://wg21.link/P2259R1>`__","LWG","Repairing input range adaptors and counted_iterator","February 2021","",""
|
||||
"","","","","",""
|
||||
"`P2259R1 <https://wg21.link/P2259R1>`__","LWG","Repairing input range adaptors and counted_iterator","February 2021","","","|ranges|"
|
||||
"","","","","","",""
|
||||
"`P0401R6 <https://wg21.link/P0401R6>`__","LWG","Providing size feedback in the Allocator interface","June 2021","|Complete|","15.0"
|
||||
"`P0448R4 <https://wg21.link/P0448R4>`__","LWG","A strstream replacement using span<charT> as buffer","June 2021","",""
|
||||
"`P1132R8 <https://wg21.link/P1132R8>`__","LWG","out_ptr - a scalable output pointer abstraction","June 2021","",""
|
||||
"`P1328R1 <https://wg21.link/P1328R1>`__","LWG","Making std::type_info::operator== constexpr","June 2021","",""
|
||||
"`P1425R4 <https://wg21.link/P1425R4>`__","LWG","Iterators pair constructors for stack and queue","June 2021","|Complete|","14.0"
|
||||
"`P1425R4 <https://wg21.link/P1425R4>`__","LWG","Iterators pair constructors for stack and queue","June 2021","|Complete|","14.0","|ranges|"
|
||||
"`P1518R2 <https://wg21.link/P1518R2>`__","LWG","Stop overconstraining allocators in container deduction guides","June 2021","|Complete|","13.0"
|
||||
"`P1659R3 <https://wg21.link/P1659R3>`__","LWG","starts_with and ends_with","June 2021","",""
|
||||
"`P1659R3 <https://wg21.link/P1659R3>`__","LWG","starts_with and ends_with","June 2021","","","|ranges|"
|
||||
"`P1951R1 <https://wg21.link/P1951R1>`__","LWG","Default Arguments for pair Forwarding Constructor","June 2021","|Complete|","14.0"
|
||||
"`P1989R2 <https://wg21.link/P1989R2>`__","LWG","Range constructor for std::string_view","June 2021","|Complete|","14.0"
|
||||
"`P1989R2 <https://wg21.link/P1989R2>`__","LWG","Range constructor for std::string_view","June 2021","|Complete|","14.0","|ranges|"
|
||||
"`P2136R3 <https://wg21.link/P2136R3>`__","LWG","invoke_r","June 2021","",""
|
||||
"`P2166R1 <https://wg21.link/P2166R1>`__","LWG","A Proposal to Prohibit std::basic_string and std::basic_string_view construction from nullptr","June 2021","|Complete|","13.0"
|
||||
"","","","","",""
|
||||
"","","","","","",""
|
||||
"`P0288R9 <https://wg21.link/P0288R9>`__","LWG","``any_invocable``","October 2021","",""
|
||||
"`P0798R8 <https://wg21.link/P0798R8>`__","LWG","Monadic operations for ``std::optional``","October 2021","|Complete|","14.0"
|
||||
"`P0849R8 <https://wg21.link/P0849R8>`__","LWG","``auto(x)``: ``DECAY_COPY`` in the language","October 2021","|Complete|","14.0"
|
||||
@ -33,65 +33,74 @@
|
||||
"`P2077R3 <https://wg21.link/P2077R3>`__","LWG","Heterogeneous erasure overloads for associative containers","October 2021","",""
|
||||
"`P2251R1 <https://wg21.link/P2251R1>`__","LWG","Require ``span`` & ``basic_string_view`` to be Trivially Copyable","October 2021","|Complete|","14.0"
|
||||
"`P2301R1 <https://wg21.link/P2301R1>`__","LWG","Add a ``pmr`` alias for ``std::stacktrace``","October 2021","",""
|
||||
"`P2321R2 <https://wg21.link/P2321R2>`__","LWG","``zip``","October 2021","|In Progress|",""
|
||||
"`P2321R2 <https://wg21.link/P2321R2>`__","LWG","``zip``","October 2021","|In Progress|","","|ranges|"
|
||||
"`P2340R1 <https://wg21.link/P2340R1>`__","LWG","Clarifying the status of the 'C headers'","October 2021","",""
|
||||
"`P2393R1 <https://wg21.link/P2393R1>`__","LWG","Cleaning up ``integer``-class types","October 2021","",""
|
||||
"`P2401R0 <https://wg21.link/P2401R0>`__","LWG","Add a conditional ``noexcept`` specification to ``std::exchange``","October 2021","|Complete|","14.0"
|
||||
"","","","","",""
|
||||
"`P0323R12 <https://wg21.link/P0323R12>`__","LWG","``std::expected``","February 2022","",""
|
||||
"`P0533R9 <https://wg21.link/P0533R9>`__","LWG","``constexpr`` for ``<cmath>`` and ``<cstdlib>``","February 2022","",""
|
||||
"","","","","","",""
|
||||
"`P0323R12 <https://wg21.link/P0323R12>`__","LWG","``std::expected``","February 2022","|Complete|","16.0"
|
||||
"`P0533R9 <https://wg21.link/P0533R9>`__","LWG","``constexpr`` for ``<cmath>`` and ``<cstdlib>``","February 2022","|In progress| [#note-P0533R9]_",""
|
||||
"`P0627R6 <https://wg21.link/P0627R6>`__","LWG","Function to mark unreachable code","February 2022","|Complete|","15.0"
|
||||
"`P1206R7 <https://wg21.link/P1206R7>`__","LWG","``ranges::to``: A function to convert any range to a container","February 2022","",""
|
||||
"`P1413R3 <https://wg21.link/P1413R3>`__","LWG","Deprecate ``std::aligned_storage`` and ``std::aligned_union``","February 2022","",""
|
||||
"`P2255R3 <https://wg21.link/P2255R3>`__","LWG","A type trait to detect reference binding to temporary","February 2022","",""
|
||||
"`P2273R3 <https://wg21.link/P2273R3>`__","LWG","Making ``std::unique_ptr`` constexpr","February 2022","",""
|
||||
"`P2387R3 <https://wg21.link/P2387R3>`__","LWG","Pipe support for user-defined range adaptors","February 2022","",""
|
||||
"`P2440R1 <https://wg21.link/P2440R1>`__","LWG","``ranges::iota``, ``ranges::shift_left`` and ``ranges::shift_right``","February 2022","",""
|
||||
"`P2441R2 <https://wg21.link/P2441R2>`__","LWG","``views::join_view``","February 2022","",""
|
||||
"`P2442R1 <https://wg21.link/P2442R1>`__","LWG","Windowing range adaptors: ``views::chunk`` and ``views::slide``","February 2022","",""
|
||||
"`P2443R1 <https://wg21.link/P2443R1>`__","LWG","``views::chunk_by``","February 2022","",""
|
||||
"","","","","",""
|
||||
"`P1206R7 <https://wg21.link/P1206R7>`__","LWG","``ranges::to``: A function to convert any range to a container","February 2022","","","|ranges|"
|
||||
"`P1413R3 <https://wg21.link/P1413R3>`__","LWG","Deprecate ``std::aligned_storage`` and ``std::aligned_union``","February 2022","|Complete| [#note-P1413R3]_",""
|
||||
"`P2255R2 <https://wg21.link/P2255R2>`__","LWG","A type trait to detect reference binding to temporary","February 2022","",""
|
||||
"`P2273R3 <https://wg21.link/P2273R3>`__","LWG","Making ``std::unique_ptr`` constexpr","February 2022","|Complete|","16.0"
|
||||
"`P2387R3 <https://wg21.link/P2387R3>`__","LWG","Pipe support for user-defined range adaptors","February 2022","","","|ranges|"
|
||||
"`P2440R1 <https://wg21.link/P2440R1>`__","LWG","``ranges::iota``, ``ranges::shift_left`` and ``ranges::shift_right``","February 2022","","","|ranges|"
|
||||
"`P2441R2 <https://wg21.link/P2441R2>`__","LWG","``views::join_with``","February 2022","","","|ranges|"
|
||||
"`P2442R1 <https://wg21.link/P2442R1>`__","LWG","Windowing range adaptors: ``views::chunk`` and ``views::slide``","February 2022","","","|ranges|"
|
||||
"`P2443R1 <https://wg21.link/P2443R1>`__","LWG","``views::chunk_by``","February 2022","","","|ranges|"
|
||||
"","","","","","",""
|
||||
"`P0009R18 <https://wg21.link/P0009R18>`__","LWG","mdspan: A Non-Owning Multidimensional Array Reference","July 2022","",""
|
||||
"`P0429R9 <https://wg21.link/P0429R9>`__","LWG","A Standard ``flat_map``","July 2022","",""
|
||||
"`P1169R4 <https://wg21.link/P1169R4>`__","LWG","``static operator()``","July 2022","",""
|
||||
"`P1169R4 <https://wg21.link/P1169R4>`__","LWG","``static operator()``","July 2022","|Complete|","16.0"
|
||||
"`P1222R4 <https://wg21.link/P1222R4>`__","LWG","A Standard ``flat_set``","July 2022","",""
|
||||
"`P1223R5 <https://wg21.link/P1223R5>`__","LWG","``ranges::find_last()``, ``ranges::find_last_if()``, and ``ranges::find_last_if_not()``","July 2022","",""
|
||||
"`P1223R5 <https://wg21.link/P1223R5>`__","LWG","``ranges::find_last()``, ``ranges::find_last_if()``, and ``ranges::find_last_if_not()``","July 2022","","","|ranges|"
|
||||
"`P1467R9 <https://wg21.link/P1467R9>`__","LWG","Extended ``floating-point`` types and standard names","July 2022","",""
|
||||
"`P1642R11 <https://wg21.link/P1642R11>`__","LWG","Freestanding ``[utilities]``, ``[ranges]``, and ``[iterators]``","July 2022","",""
|
||||
"`P1899R3 <https://wg21.link/P1899R3>`__","LWG","``stride_view``","July 2022","",""
|
||||
"`P1899R3 <https://wg21.link/P1899R3>`__","LWG","``stride_view``","July 2022","","","|ranges|"
|
||||
"`P2093R14 <https://wg21.link/P2093R14>`__","LWG","Formatted output","July 2022","",""
|
||||
"`P2165R4 <https://wg21.link/P2165R4>`__","LWG","Compatibility between ``tuple``, ``pair`` and ``tuple-like`` objects","July 2022","",""
|
||||
"`P2278R4 <https://wg21.link/P2278R4>`__","LWG","``cbegin`` should always return a constant iterator","July 2022","",""
|
||||
"`P2286R8 <https://wg21.link/P2286R8>`__","LWG","Formatting Ranges","July 2022","",""
|
||||
"`P2291R3 <https://wg21.link/P2291R3>`__","LWG","Add Constexpr Modifiers to Functions ``to_chars`` and ``from_chars`` for Integral Types in ``<charconv>`` Header","July 2022","",""
|
||||
"`P2302R4 <https://wg21.link/P2302R4>`__","LWG","``std::ranges::contains``","July 2022","",""
|
||||
"`P2322R6 <https://wg21.link/P2322R6>`__","LWG","``ranges::fold``","July 2022","",""
|
||||
"`P2374R4 <https://wg21.link/P2374R4>`__","LWG","``views::cartesian_product``","July 2022","",""
|
||||
"`P2278R4 <https://wg21.link/P2278R4>`__","LWG","``cbegin`` should always return a constant iterator","July 2022","","","|ranges|"
|
||||
"`P2286R8 <https://wg21.link/P2286R8>`__","LWG","Formatting Ranges","July 2022","|Complete|","16.0","|format| |ranges|"
|
||||
"`P2291R3 <https://wg21.link/P2291R3>`__","LWG","Add Constexpr Modifiers to Functions ``to_chars`` and ``from_chars`` for Integral Types in ``<charconv>`` Header","July 2022","|Complete|","16.0"
|
||||
"`P2302R4 <https://wg21.link/P2302R4>`__","LWG","``std::ranges::contains``","July 2022","","","|ranges|"
|
||||
"`P2322R6 <https://wg21.link/P2322R6>`__","LWG","``ranges::fold``","July 2022","","","|ranges|"
|
||||
"`P2374R4 <https://wg21.link/P2374R4>`__","LWG","``views::cartesian_product``","July 2022","","","|ranges|"
|
||||
"`P2404R3 <https://wg21.link/P2404R3>`__","LWG","Move-only types for ``equality_comparable_with``, ``totally_ordered_with``, and ``three_way_comparable_with``","July 2022","",""
|
||||
"`P2408R5 <https://wg21.link/P2408R5>`__","LWG","Ranges iterators as inputs to non-Ranges algorithms","July 2022","",""
|
||||
"`P2417R2 <https://wg21.link/P2417R2>`__","LWG","A more ``constexpr`` ``bitset``","July 2022","",""
|
||||
"`P2408R5 <https://wg21.link/P2408R5>`__","LWG","Ranges iterators as inputs to non-Ranges algorithms","July 2022","","","|ranges|"
|
||||
"`P2417R2 <https://wg21.link/P2417R2>`__","LWG","A more ``constexpr`` ``bitset``","July 2022","|Complete|","16.0"
|
||||
"`P2419R2 <https://wg21.link/P2419R2>`__","LWG","Clarify handling of encodings in localized formatting of chrono types","July 2022","",""
|
||||
"`P2438R2 <https://wg21.link/P2438R2>`__","LWG","``std::string::substr() &&``","July 2022","",""
|
||||
"`P2445R1 <https://wg21.link/P2445R1>`__","LWG","``forward_like``","July 2022","",""
|
||||
"`P2446R2 <https://wg21.link/P2446R2>`__","LWG","``views::as_rvalue``","July 2022","",""
|
||||
"`P2438R2 <https://wg21.link/P2438R2>`__","LWG","``std::string::substr() &&``","July 2022","|Complete|","16.0"
|
||||
"`P2445R1 <https://wg21.link/P2445R1>`__","LWG","``forward_like``","July 2022","|Complete|","16.0"
|
||||
"`P2446R2 <https://wg21.link/P2446R2>`__","LWG","``views::as_rvalue``","July 2022","|Complete|","16.0","|ranges|"
|
||||
"`P2460R2 <https://wg21.link/P2460R2>`__","LWG","Relax requirements on ``wchar_t`` to match existing practices","July 2022","",""
|
||||
"`P2465R3 <https://wg21.link/P2465R3>`__","LWG","Standard Library Modules ``std`` and ``std.compat``","July 2022","",""
|
||||
"`P2467R1 <https://wg21.link/P2467R1>`__","LWG","Support exclusive mode for ``fstreams``","July 2022","",""
|
||||
"`P2474R2 <https://wg21.link/P2474R2>`__","LWG","``views::repeat``","July 2022","",""
|
||||
"`P2494R2 <https://wg21.link/P2494R2>`__","LWG","Relaxing range adaptors to allow for move only types","July 2022","",""
|
||||
"`P2499R0 <https://wg21.link/P2499R0>`__","LWG","``string_view`` range constructor should be ``explicit``","July 2022","",""
|
||||
"`P2502R2 <https://wg21.link/P2502R2>`__","LWG","``std::generator``: Synchronous Coroutine Generator for Ranges","July 2022","",""
|
||||
"`P2508R1 <https://wg21.link/P2508R1>`__","LWG","Exposing ``std::basic-format-string``","July 2022","",""
|
||||
"`P2474R2 <https://wg21.link/P2474R2>`__","LWG","``views::repeat``","July 2022","","","|ranges|"
|
||||
"`P2494R2 <https://wg21.link/P2494R2>`__","LWG","Relaxing range adaptors to allow for move only types","July 2022","","","|ranges|"
|
||||
"`P2499R0 <https://wg21.link/P2499R0>`__","LWG","``string_view`` range constructor should be ``explicit``","July 2022","|Complete|","16.0","|ranges|"
|
||||
"`P2502R2 <https://wg21.link/P2502R2>`__","LWG","``std::generator``: Synchronous Coroutine Generator for Ranges","July 2022","","","|ranges|"
|
||||
"`P2508R1 <https://wg21.link/P2508R1>`__","LWG","Exposing ``std::basic-format-string``","July 2022","|Complete|","15.0"
|
||||
"`P2513R4 <https://wg21.link/P2513R4>`__","LWG","``char8_t`` Compatibility and Portability Fixes","July 2022","",""
|
||||
"`P2517R1 <https://wg21.link/P2517R1>`__","LWG","Add a conditional ``noexcept`` specification to ``std::apply``","July 2022","",""
|
||||
"`P2520R0 <https://wg21.link/P2520R0>`__","LWG","``move_iterator`` should be a random access iterator","July 2022","",""
|
||||
"`P2540R1 <https://wg21.link/P2540R1>`__","LWG","Empty Product for certain Views","July 2022","",""
|
||||
"`P2549R1 <https://wg21.link/P2549R1>`__","LWG","``std::unexpected`` should have ``error()`` as member accessor","July 2022","",""
|
||||
"`P2520R0 <https://wg21.link/P2520R0>`__","LWG","``move_iterator`` should be a random access iterator","July 2022","","","|ranges|"
|
||||
"`P2540R1 <https://wg21.link/P2540R1>`__","LWG","Empty Product for certain Views","July 2022","","","|ranges|"
|
||||
"`P2549R1 <https://wg21.link/P2549R1>`__","LWG","``std::unexpected`` should have ``error()`` as member accessor","July 2022","|Complete|","16.0"
|
||||
"`P2553R1 <https://wg21.link/P2553R1>`__","LWG","Make ``mdspan`` ``size_type`` controllable","July 2022","",""
|
||||
"`P2554R0 <https://wg21.link/P2554R0>`__","LWG","C-Array Interoperability of MDSpan","July 2022","",""
|
||||
"`P2585R0 <https://wg21.link/P2585R0>`__","LWG","Improving default container formatting","July 2022","",""
|
||||
"`P2585R0 <https://wg21.link/P2585R0>`__","LWG","Improving default container formatting","July 2022","|Partial|",""
|
||||
"`P2590R2 <https://wg21.link/P2590R2>`__","LWG","Explicit lifetime management","July 2022","",""
|
||||
"`P2599R2 <https://wg21.link/P2599R2>`__","LWG","``mdspan::size_type`` should be ``index_type``","July 2022","",""
|
||||
"`P2604R0 <https://wg21.link/P2604R0>`__","LWG","mdspan: rename pointer and contiguous","July 2022","",""
|
||||
"`P2613R1 <https://wg21.link/P2613R1>`__","LWG","Add the missing ``empty`` to ``mdspan``","July 2022","",""
|
||||
"","","","","",""
|
||||
"","","","","","",""
|
||||
"`P1202R5 <https://wg21.link/P1202R5>`__","LWG", "Asymmetric Fences", "November 2022","","","|concurrency TS|"
|
||||
"`P1264R2 <https://wg21.link/P1264R2>`__","LWG", "Revising the wording of ``stream`` input operations", "November 2022","|Complete|","9.0",""
|
||||
"`P1478R8 <https://wg21.link/P1478R8>`__","LWG", "``Byte-wise`` ``atomic`` ``memcpy``", "November 2022","","","|concurrency TS|"
|
||||
"`P2167R3 <https://wg21.link/P2167R3>`__","LWG", "Improved Proposed Wording for LWG 2114", "November 2022","","",""
|
||||
"`P2396R1 <https://wg21.link/P2396R1>`__","LWG", "Concurrency TS 2 fixes ", "November 2022","","","|concurrency TS|"
|
||||
"`P2505R5 <https://wg21.link/P2505R5>`__","LWG", "Monadic Functions for ``std::expected``", "November 2022","","",""
|
||||
"`P2539R4 <https://wg21.link/P2539R4>`__","LWG", "Should the output of ``std::print`` to a terminal be synchronized with the underlying stream?", "November 2022","","","|format|"
|
||||
"`P2602R2 <https://wg21.link/P2602R2>`__","LWG", "Poison Pills are Too Toxic", "November 2022","","","|ranges|"
|
||||
"`P2708R1 <https://wg21.link/P2708R1>`__","LWG", "No Further Fundamentals TSes", "November 2022","|Nothing to do|","",""
|
||||
|
Can't render this file because it has a wrong number of fields in line 2.
|
@ -13,7 +13,7 @@ libc++ Format Status
|
||||
Overview
|
||||
========
|
||||
|
||||
This document contains the status of the C++20 Format library in libc++. It is used to
|
||||
This document contains the status of the Format library in libc++. It is used to
|
||||
track both the status of the sub-projects of the Format library and who is assigned to
|
||||
these sub-projects. This is imperative to effective implementation so that work is not
|
||||
duplicated and implementors are not blocked by each other.
|
||||
|
@ -1,10 +1,17 @@
|
||||
Number,Name,Assignee,Patch,Status,First released version
|
||||
`P0645 <https://wg21.link/P0645>`_,"Text Formatting",Mark de Wever,,|Complete|,Clang 14
|
||||
`P1652 <https://wg21.link/P1652>`_,"Printf corner cases in std::format",Mark de Wever,"`D103433 <https://reviews.llvm.org/D103433>`__, `D114001 <https://reviews.llvm.org/D114001>`__",|Complete|,Clang 14
|
||||
`P1892 <https://wg21.link/P1892>`_,"Extended locale-specific presentation specifiers for std::format",Mark de Wever,`D103368 <https://reviews.llvm.org/D103368>`__,|Complete|,Clang 14
|
||||
`P1868 <https://wg21.link/P1868>`_,"width: clarifying units of width and precision in std::format (Implements the unicode support.)",Mark de Wever,"`D103413 <https://reviews.llvm.org/D103413>`__ `D103425 <https://reviews.llvm.org/D103425>`__ `D103670 <https://reviews.llvm.org/D103670>`__",|Complete|,Clang 14
|
||||
`P2216 <https://wg21.link/P2216>`_,"std::format improvements",Mark de Wever,,|Complete|,Clang 15
|
||||
`P2418 <https://wg21.link/P2418>`__,"Add support for ``std::generator``-like types to ``std::format``",Mark de Wever,`D127570 <https://reviews.llvm.org/D127570>`__,|Complete|, Clang 15
|
||||
Number,Name,Standard,Assignee,Status,First released version
|
||||
`P0645 <https://wg21.link/P0645>`_,"Text Formatting","C++20",Mark de Wever,|Complete|,Clang 14
|
||||
`P1652 <https://wg21.link/P1652>`_,"Printf corner cases in std::format","C++20",Mark de Wever,|Complete|,Clang 14
|
||||
`P1892 <https://wg21.link/P1892>`_,"Extended locale-specific presentation specifiers for std::format","C++20",Mark de Wever,|Complete|,Clang 14
|
||||
`P1868 <https://wg21.link/P1868>`_,"width: clarifying units of width and precision in std::format (Implements the unicode support.)","C++20",Mark de Wever,|Complete|,Clang 14
|
||||
`P2216 <https://wg21.link/P2216>`_,"std::format improvements","C++20",Mark de Wever,|Complete|,Clang 15
|
||||
`P2418 <https://wg21.link/P2418>`__,"Add support for ``std::generator``-like types to ``std::format``","C++20",Mark de Wever,|Complete|, Clang 15
|
||||
"`P2093R14 <https://wg21.link/P2093R14>`__","Formatted output","C++23"
|
||||
"`P2286R8 <https://wg21.link/P2286R8>`__","Formatting Ranges","C++23","Mark de Wever","|Complete|",Clang 16
|
||||
"`P2508R1 <https://wg21.link/P2508R1>`__","Exposing ``std::basic-format-string``","C++23","Mark de Wever","|Complete|", Clang 15
|
||||
"`P2585R0 <https://wg21.link/P2585R0>`__","Improving default container formatting","C++23","Mark de Wever","|In progress|"
|
||||
"`P2539R4 <https://wg21.link/P2539R4>`__","Should the output of ``std::print`` to a terminal be synchronized with the underlying stream?","C++23"
|
||||
|
||||
`P1361 <https://wg21.link/P1361>`_,"Integration of chrono with text formatting","C++20",Mark de Wever,|In Progress|,
|
||||
`P2372 <https://wg21.link/P2372>`__,"Fixing locale handling in chrono formatters","C++20",Mark de Wever,|In Progress|,
|
||||
"`P2419R2 <https://wg21.link/P2419R2>`__","Clarify handling of encodings in localized formatting of chrono types","C++23",
|
||||
|
||||
`P1361 <https://wg21.link/P1361>`_,"Integration of chrono with text formatting",Mark de Wever,,|In Progress|,
|
||||
`P2372 <https://wg21.link/P2372>`__,"Fixing locale handling in chrono formatters",Mark de Wever,,|In Progress|,
|
||||
|
Can't render this file because it has a wrong number of fields in line 8.
|
@ -1,33 +1,40 @@
|
||||
Section,Description,Dependencies,Assignee,Patch,Status,First released version
|
||||
`[format.functions] <https://wg21.link/format.functions>`_,"Format functions - Improve performance format_to_n",,Mark de Wever,`D110499 <https://llvm.org/D110499>`__,|Complete|,Clang 15
|
||||
`[format.functions] <https://wg21.link/format.functions>`_,"Format functions - Improve performance formatted size",,Mark de Wever,`D110498 <https://llvm.org/D110498>`__,|Complete|,Clang 15
|
||||
`[format.functions] <https://wg21.link/format.functions>`_,"`P2216 <https://wg21.link/P2216>`_ - Compile-time checks",,Mark de Wever,`D121530 <https://llvm.org/D121530>`__,|Complete|,Clang 15
|
||||
`[format.functions] <https://wg21.link/format.functions>`_,"`P2216 <https://wg21.link/P2216>`_ - Binary size",,Mark de Wever,`D110494 <https://llvm.org/D110494>`__,|Complete|,Clang 14
|
||||
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::duration<Rep, Period>``",,Mark de Wever,,|In Progress|,
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::sys_time<Duration>``",,Mark de Wever,,|In Progress|,
|
||||
Section,Description,Dependencies,Assignee,Status,First released version
|
||||
`P1361 <https://wg21.link/P1361>`__ `P2372 <https://wg21.link/P2372>`__,"Formatting chrono"
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::duration<Rep, Period>``",,Mark de Wever,|Complete|, Clang 16
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::sys_time<Duration>``",,Mark de Wever,|In Progress|,
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::utc_time<Duration>``",A ``<chrono>`` implementation,Not assigned,,,
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::tai_time<Duration>``",A ``<chrono>`` implementation,Not assigned,,,
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::gps_time<Duration>``",A ``<chrono>`` implementation,Not assigned,,,
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::file_time<Duration>``",,Not assigned,,,
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::local_time<Duration>``",,Not assigned,,,
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::local-time-format-t<Duration>``",A ``<chrono>`` implementation,Not assigned,,,
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::day``",,Mark de Wever,,|In Progress|,
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::month``",,Mark de Wever,,|In Progress|,
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::year``",,Mark de Wever,,|In Progress|,
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::weekday``",,Mark de Wever,,|In Progress|,
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::weekday_indexed``",,Mark de Wever,,|In Progress|,
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::weekday_last``",,Mark de Wever,,|In Progress|,
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::month_day``",,Mark de Wever,,|In Progress|,
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::month_day_last``",,Mark de Wever,,|In Progress|,
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::month_weekday``",,Mark de Wever,,|In Progress|,
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::month_weekday_last``",,Mark de Wever,,|In Progress|,
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::year_month``",,Mark de Wever,,|In Progress|,
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::year_month_day``",,Mark de Wever,,|In Progress|,
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::year_month_day_last``",,Mark de Wever,,|In Progress|,
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::year_month_weekday``",,Mark de Wever,,|In Progress|,
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::year_month_weekday_last``",,Mark de Wever,,|In Progress|,
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::hh_mm_ss<duration<Rep, Period>>``",,Mark de Wever,,|In Progress|,
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::sys_info``",A ``<chrono>`` implementation,Not assigned,,,
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::local_info``",A ``<chrono>`` implementation,Not assigned,,,
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::zoned_time<Duration, TimeZonePtr>``",A ``<chrono>`` implementation,Not assigned,,,
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::day``",,Mark de Wever,|Complete|, Clang 16
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::month``",,Mark de Wever,|Complete|, Clang 16
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::year``",,Mark de Wever,|Complete|, Clang 16
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::weekday``",,Mark de Wever,|Complete|, Clang 16
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::weekday_indexed``",,Mark de Wever,|Complete|, Clang 16
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::weekday_last``",,Mark de Wever,|Complete|, Clang 16
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::month_day``",,Mark de Wever,|Complete|, Clang 16
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::month_day_last``",,Mark de Wever,|Complete|, Clang 16
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::month_weekday``",,Mark de Wever,|Complete|, Clang 16
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::month_weekday_last``",,Mark de Wever,|Complete|, Clang 16
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::year_month``",,Mark de Wever,|Complete|, Clang 16
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::year_month_day``",,Mark de Wever,|Complete|, Clang 16
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::year_month_day_last``",,Mark de Wever,|Complete|, Clang 16
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::year_month_weekday``",,Mark de Wever,|Complete|, Clang 16
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::year_month_weekday_last``",,Mark de Wever,|Complete|, Clang 16
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::hh_mm_ss<duration<Rep, Period>>``",,Mark de Wever,|In Progress|,
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::sys_info``",A ``<chrono>`` implementation,Mark de Wever,,
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::local_info``",A ``<chrono>`` implementation,Mark de Wever,,
|
||||
`[time.syn] <https://wg21.link/time.syn>`_,"Formatter ``chrono::zoned_time<Duration, TimeZonePtr>``",A ``<chrono>`` implementation,Mark de Wever,,
|
||||
`P2286R8 <https://wg21.link/P2286R8>`__,"Formatting ranges"
|
||||
`[format.syn] <https://wg21.link/format.syn>`_,"Concept ``formattable``",,Mark de Wever,|Complete|, Clang 16
|
||||
`[format.string.std] <https://wg21.link/format.string.std>`_,"std-format-spec ``type`` debug",,Mark de Wever,|Complete|,Clang 16
|
||||
`[format.range] <https://wg21.link/format.range>`_,"Formatting for ranges: sequences",,Mark de Wever,|Complete|,Clang 16
|
||||
`[format.range.fmtmap] <https://wg21.link/format.range.fmtmap>`_,"Formatting for ranges: map",,Mark de Wever,|Complete|,Clang 16
|
||||
`[format.range.fmtset] <https://wg21.link/format.range.fmtset>`_,"Formatting for ranges: set",,Mark de Wever,|Complete|,Clang 16
|
||||
`[format.range] <https://wg21.link/format.range>`_,"Formatting for ranges: container adaptors",,Mark de Wever,|Complete|,Clang 16
|
||||
`[format.range] <https://wg21.link/format.range>`_,"Formatting for ranges: ``pair`` and ``tuple``",,Mark de Wever,|Complete|,Clang 16
|
||||
`[format.range] <https://wg21.link/format.range>`_,"Formatting for ranges: ``vector<bool>``",,Mark de Wever,|Complete|,Clang 16
|
||||
"`P2585R0 <https://wg21.link/P2585R0>`__","Improving default container formatting"
|
||||
`[format.range.fmtstr] <https://wg21.link/format.range.fmtstr>`_,"Formatting for ranges: strings",,Mark de Wever,|In Progress|,
|
||||
|
Can't render this file because it has a wrong number of fields in line 2.
|
@ -1,4 +1,4 @@
|
||||
.. ranges-status:
|
||||
a. ranges-status:
|
||||
|
||||
================================
|
||||
libc++ Ranges Status
|
||||
@ -13,44 +13,36 @@ libc++ Ranges Status
|
||||
Overview
|
||||
================================
|
||||
|
||||
This document contains the status of the C++20 Ranges library in libc++. It is used to
|
||||
track both the status of the sub-projects of the ranges library and who is assigned to
|
||||
these sub-projects. This is imperative to effective implementation so that work is not
|
||||
This document contains the status of the Ranges library in libc++. It is used to track
|
||||
both the status of the sub-projects of the ranges library and who is assigned to these
|
||||
sub-projects. This is imperative to effective implementation so that work is not
|
||||
duplicated and implementors are not blocked by each other.
|
||||
|
||||
If you are interested in contributing to the libc++ Ranges library, please send a message
|
||||
to the #libcxx channel in the LLVM discord. Please *do not* start working on any of the
|
||||
assigned items below.
|
||||
*assigned* items below.
|
||||
|
||||
|
||||
Sub-Projects in the One Ranges Proposal
|
||||
Major features
|
||||
=======================================
|
||||
|
||||
.. csv-table::
|
||||
:file: RangesPaper.csv
|
||||
:file: RangesMajorFeatures.csv
|
||||
:header-rows: 1
|
||||
:widths: auto
|
||||
|
||||
Views
|
||||
=======================================
|
||||
|
||||
.. csv-table::
|
||||
:file: RangesViews.csv
|
||||
:header-rows: 1
|
||||
:widths: auto
|
||||
|
||||
Algorithms
|
||||
=======================================
|
||||
|
||||
.. csv-table::
|
||||
:file: RangesAlgorithms.csv
|
||||
:header-rows: 1
|
||||
:widths: auto
|
||||
|
||||
|
||||
Misc. Items and TODOs
|
||||
====================================
|
||||
|
||||
(Note: files with required updates will contain the TODO at the beginning of the list item
|
||||
so they can be easily found via global search.)
|
||||
|
||||
* TODO(XX_SPACESHIP_CONCEPTS): when spaceship support is added to various STL types, we need to update some concept tests.
|
||||
|
||||
Paper and Issue Status
|
||||
====================================
|
||||
|
||||
(Note: stolen from MSVC `here <https://github.com/microsoft/STL/issues/39>`_.)
|
||||
|
||||
.. csv-table::
|
||||
:file: RangesIssues.csv
|
||||
:header-rows: 1
|
||||
:widths: auto
|
||||
|
@ -1,100 +1,12 @@
|
||||
Category,Algorithm,Assignee,CL,Complete
|
||||
Search,any_of,Nikolas Klauser,`D123016 <https://llvm.org/D123016>`_,✅
|
||||
Search,all_of,Nikolas Klauser,`D123016 <https://llvm.org/D123016>`_,✅
|
||||
Search,none_of,Nikolas Klauser,`D123016 <https://llvm.org/D123016>`_,✅
|
||||
Search,find,Nikolas Klauser,`D121248 <https://llvm.org/D121248>`_,✅
|
||||
Search,find_if,Nikolas Klauser,`D121248 <https://llvm.org/D121248>`_,✅
|
||||
Search,find_if_not,Nikolas Klauser,`D121248 <https://llvm.org/D121248>`_,✅
|
||||
Search,find_first_of,Nikolas Klauser,`D126529 <https://llvm.org/D126529>`_,✅
|
||||
Search,adjacent_find,Nikolas Klauser,`D126610 <https://llvm.org/D126610>`_,✅
|
||||
Search,mismatch,Nikolas Klauser,`D117817 <https://llvm.org/D117817>`_,✅
|
||||
Search,equal,Nikolas Klauser,`D123681 <https://llvm.org/D123681>`_,✅
|
||||
Search,lexicographical_compare,Nikolas Klauser,`D127130 <https://llvm.org/D127130>`_,✅
|
||||
Search,partition_point,Konstantin Varlamov,`D130070 <https://llvm.org/D130070>`_,✅
|
||||
Search,lower_bound,Nikolas Klauser,`D121964 <https://llvm.org/D121964>`_,✅
|
||||
Search,upper_bound,Nikolas Klauser,`D121964 <https://llvm.org/D121964>`_,✅
|
||||
Search,equal_range,Hui Xie,`D129796 <https://llvm.org/D129796>`_,✅
|
||||
Search,binary_search,Nikolas Klauser,`D121964 <https://llvm.org/D121964>`_,✅
|
||||
Search,min,Nikolas Klauser,`D119589 <https://llvm.org/D119589>`_,✅
|
||||
Search,max,Nikolas Klauser,`D122002 <https://llvm.org/D122002>`_,✅
|
||||
Search,minmax,Nikolas Klauser,`D120637 <https://llvm.org/D120637>`_,✅
|
||||
Search,min_element,Nikolas Klauser,`D117025 <https://llvm.org/D117025>`_,✅
|
||||
Search,max_element,Nikolas Klauser,`D117523 <https://llvm.org/D117523>`_,✅
|
||||
Search,minmax_element,Nikolas Klauser,`D120637 <https://llvm.org/D120637>`_,✅
|
||||
Search,count,Nikolas Klauser,`D121523 <https://llvm.org/D121523>`_,✅
|
||||
Search,count_if,Nikolas Klauser,`D121523 <https://llvm.org/D121523>`_,✅
|
||||
Search,search,Nikolas Klauser,`D124079 <https://llvm.org/D124079>`_,✅
|
||||
Search,search_n,Nikolas Klauser,`D124079 <https://llvm.org/D124079>`_,✅
|
||||
Search,find_end,Nikolas Klauser,`D124079 <https://llvm.org/D124079>`_,✅
|
||||
Read-only,is_partitioned,Nikolas Klauser,`D124440 <https://llvm.org/D124440>`_,✅
|
||||
Read-only,is_sorted,Nikolas Klauser,`D125608 <https://llvm.org/D125608>`_,✅
|
||||
Read-only,is_sorted_until,Nikolas Klauser,`D125608 <https://llvm.org/D125608>`_,✅
|
||||
Read-only,includes,Hui Xie,`D130116 <https://llvm.org/D130116>`_,✅
|
||||
Read-only,is_heap,Konstantin Varlamov,`D130547 <https://llvm.org/D130547>`_,✅
|
||||
Read-only,is_heap_until,Konstantin Varlamov,`D130547 <https://llvm.org/D130547>`_,✅
|
||||
Read-only,clamp,Nikolas Klauser,`D126193 <https://llvm.org/D126193>`_,✅
|
||||
Read-only,is_permutation,Nikolas Klauser,`D127194 <https://llvm.org/D127194>`_,✅
|
||||
Read-only,for_each,Nikolas Klauser,`D124332 <https://llvm.org/D124332>`_,✅
|
||||
Read-only,for_each_n,Nikolas Klauser,`D124332 <https://llvm.org/D124332>`_,✅
|
||||
Write,copy,Nikolas Klauser,`D122982 <https://llvm.org/D122982>`_,✅
|
||||
Write,copy_if,Nikolas Klauser,`D122982 <https://llvm.org/D122982>`_,✅
|
||||
Write,copy_n,Nikolas Klauser,`D122982 <https://llvm.org/D122982>`_,✅
|
||||
Write,copy_backward,Nikolas Klauser,`D122982 <https://llvm.org/D122982>`_,✅
|
||||
Write,move,Nikolas Klauser,`D126616 <https://llvm.org/D126616>`_,✅
|
||||
Write,move_backward,Nikolas Klauser,`D126616 <https://llvm.org/D126616>`_,✅
|
||||
Write,fill,Nikolas Klauser,`D123462 <https://llvm.org/D123462>`_,✅
|
||||
Write,fill_n,Nikolas Klauser,`D123462 <https://llvm.org/D123462>`_,✅
|
||||
Write,transform,Nikolas Klauser,`D122173 <https://llvm.org/D122173>`_,✅
|
||||
Write,generate,Konstantin Varlamov,`D130552 <https://llvm.org/D130552>`_,✅
|
||||
Write,generate_n,Konstantin Varlamov,`D130552 <https://llvm.org/D130552>`_,✅
|
||||
Write,remove_copy,Nikolas Klauser,`D130599 <https://llvm.org/D130599>`_,✅
|
||||
Write,remove_copy_if,Nikolas Klauser,`D130599 <https://llvm.org/D130599>`_,✅
|
||||
Write,replace,Nikolas Klauser,`D126283 <https://llvm.org/D126283>`_,✅
|
||||
Write,replace_if,Nikolas Klauser,`D126283 <https://llvm.org/D126283>`_,✅
|
||||
Write,replace_copy,Nikolas Klauser,`D129806 <https://llvm.org/D129806>`_,✅
|
||||
Write,replace_copy_if,Nikolas Klauser,`D129806 <https://llvm.org/D129806>`_,✅
|
||||
Write,swap_ranges,Nikolas Klauser,`D116303 <https://llvm.org/D116303>`_,✅
|
||||
Write,reverse_copy,Nikolas Klauser,`D127211 <https://llvm.org/D127211>`_,✅
|
||||
Write,rotate_copy,Nikolas Klauser,`D127211 <https://llvm.org/D127211>`_,✅
|
||||
Write,sample,Konstantin Varlamov,`D130865 <https://llvm.org/D130865>`_,✅
|
||||
Write,unique_copy,Hui Xie,`D130404 <https://llvm.org/D130404>`_,✅
|
||||
Write,partition_copy,Konstantin Varlamov,`D130070 <https://llvm.org/D130070>`_,✅
|
||||
Write,partial_sort_copy,Konstantin Varlamov,`D130532 <https://llvm.org/D130532>`_,✅
|
||||
Merge,merge,Hui Xie,`D128611 <https://llvm.org/D128611>`_,✅
|
||||
Merge,set_difference,Hui Xie,`D128983 <https://llvm.org/D128983>`_,✅
|
||||
Merge,set_intersection,Hui Xie,`D129233 <https://llvm.org/D129233>`_,✅
|
||||
Merge,set_symmetric_difference,Hui Xie,`D129520 <https://llvm.org/D129520>`_,✅
|
||||
Merge,set_union,Hui Xie,`D129657 <https://llvm.org/D129657>`_,✅
|
||||
Permutation,remove,Nikolas Klauser,`D128618 <https://llvm.org/D128618>`_,✅
|
||||
Permutation,remove_if,Nikolas Klauser,`D128618 <https://llvm.org/D128618>`_,✅
|
||||
Permutation,reverse,Nikolas Klauser,`D125752 <https://llvm.org/D125752>`_,✅
|
||||
Permutation,rotate,Konstantin Varlamov and Nikolas Klauser,`D130758 <https://llvm.org/D130758>`_,✅
|
||||
Permutation,shuffle,Konstantin Varlamov,`D130321 <https://llvm.org/D130321>`_,✅
|
||||
Permutation,unique,Hui Xie,`D130404 <https://llvm.org/D130404>`_,✅
|
||||
Permutation,partition,Konstantin Varlamov,`D129624 <https://llvm.org/D129624>`_,✅
|
||||
Permutation,stable_partition,Konstantin Varlamov,`D129624 <https://llvm.org/D129624>`_,✅
|
||||
Permutation,sort,Konstantin Varlamov,`D127557 <https://llvm.org/D127557>`_,✅
|
||||
Permutation,stable_sort,Konstantin Varlamov,`D127834 <https://llvm.org/D127834>`_,✅
|
||||
Permutation,nth_element,Konstantin Varlamov,`D128149 <https://llvm.org/D128149>`_,✅
|
||||
Permutation,partial_sort,Konstantin Varlamov,`D128744 <https://llvm.org/D128744>`_,✅
|
||||
Permutation,inplace_merge,Hui Xie,`D130627 <https://llvm.org/D130627>`_,✅
|
||||
Permutation,make_heap,Konstantin Varlamov,`D128115 <https://llvm.org/D128115>`_,✅
|
||||
Permutation,push_heap,Konstantin Varlamov,`D128115 <https://llvm.org/D128115>`_,✅
|
||||
Permutation,pop_heap,Konstantin Varlamov,`D128115 <https://llvm.org/D128115>`_,✅
|
||||
Permutation,sort_heap,Konstantin Varlamov,`D128115 <https://llvm.org/D128115>`_,✅
|
||||
Permutation,next_permutation,Nikolas Klauser,`D129859 <https://llvm.org/D129859>`_,✅
|
||||
Permutation,prev_permutation,Nikolas Klauser,`D129859 <https://llvm.org/D129859>`_,✅
|
||||
Uninitialised memory,uninitialized_copy,Konstantin Varlamov,`D116023 <https://llvm.org/D116023>`_,✅
|
||||
Uninitialised memory,uninitialized_copy_n,Konstantin Varlamov,`D116023 <https://llvm.org/D116023>`_,✅
|
||||
Uninitialised memory,uninitialized_fill,Konstantin Varlamov,`D115626 <https://llvm.org/D115626>`_,✅
|
||||
Uninitialised memory,uninitialized_fill_n,Konstantin Varlamov,`D115626 <https://llvm.org/D115626>`_,✅
|
||||
Uninitialised memory,uninitialized_move,Konstantin Varlamov,`D116023 <https://llvm.org/D116023>`_,✅
|
||||
Uninitialised memory,uninitialized_move_n,Konstantin Varlamov,`D116023 <https://llvm.org/D116023>`_,✅
|
||||
Uninitialised memory,uninitialized_default_construct,Konstantin Varlamov,`D115315 <https://llvm.org/D115315>`_,✅
|
||||
Uninitialised memory,uninitialized_default_construct_n,Konstantin Varlamov,`D115315 <https://llvm.org/D115315>`_,✅
|
||||
Uninitialised memory,uninitialized_value_construct,Konstantin Varlamov,`D115626 <https://llvm.org/D115626>`_,✅
|
||||
Uninitialised memory,uninitialized_value_construct_n,Konstantin Varlamov,`D115626 <https://llvm.org/D115626>`_,✅
|
||||
Uninitialised memory,destroy,Konstantin Varlamov,`D116078 <https://llvm.org/D116078>`_,✅
|
||||
Uninitialised memory,destroy_n,Konstantin Varlamov,`D116078 <https://llvm.org/D116078>`_,✅
|
||||
Uninitialised memory,destroy_at,Konstantin Varlamov,`D116078 <https://llvm.org/D116078>`_,✅
|
||||
Uninitialised memory,construct_at,Konstantin Varlamov,`D116078 <https://llvm.org/D116078>`_,✅
|
||||
Standard,Algorithm,Assignee,CL,Status
|
||||
C++20,all C++20 algorithms,N/A,N/A,✅
|
||||
C++23,`find_last <https://wg21.link/P1223R5>`_,Unassigned,No patch yet,Not started
|
||||
C++23,`find_last_if <https://wg21.link/P1223R5>`_,Unassigned,No patch yet,Not started
|
||||
C++23,`find_last_if_not <https://wg21.link/P1223R5>`_,Unassigned,No patch yet,Not started
|
||||
C++23,`starts_with <https://wg21.link/P1659R3>`_,Unassigned,No patch yet,Not started
|
||||
C++23,`ends_with <https://wg21.link/P1659R3>`_,Unassigned,No patch yet,Not started
|
||||
C++23,`shift_left <https://wg21.link/p2440r1>`_,Unassigned,No patch yet,Not started
|
||||
C++23,`shift_right <https://wg21.link/p2440r1>`_,Unassigned,No patch yet,Not started
|
||||
C++23,`iota (algorithm) <https://wg21.link/p2440r1>`_,Unassigned,No patch yet,Not started
|
||||
C++23,`fold <https://wg21.link/p2322r5>`_,Unassigned,No patch yet,Not started
|
||||
C++23,`contains <https://wg21.link/p2302r2>`_,Unassigned,No patch yet,Not started
|
||||
|
|
@ -1,33 +0,0 @@
|
||||
"Number","Name","Status","First released version"
|
||||
`P0896R4 <https://wg21.link/P0896R4>`__,<ranges>,|Complete|,15.0
|
||||
`P1035R7 <https://wg21.link/P1035R7>`__,Input Range Adaptors,,
|
||||
`P1207R4 <https://wg21.link/P1207R4>`__,Movability Of Single-Pass Iterators,|Complete|,15.0
|
||||
`P1243R4 <https://wg21.link/P1243R4>`__,Rangify New Algorithms,|Complete|,15.0
|
||||
`P1248R1 <https://wg21.link/P1248R1>`__,Fixing Relations,|Complete|,13.0
|
||||
`P1252R2 <https://wg21.link/P1252R2>`__,Ranges Design Cleanup,|Complete|,15.0
|
||||
`P1391R4 <https://wg21.link/P1391R4>`__,Range Constructor For string_view,|Complete|,14.0
|
||||
`P1456R1 <https://wg21.link/P1456R1>`__,Move-Only Views,|Complete|,15.0
|
||||
`P1474R1 <https://wg21.link/P1474R1>`__,Helpful Pointers For contiguous_iterator,|Complete|,15.0
|
||||
`P1522R1 <https://wg21.link/P1522R1>`__,Iterator Difference Type And Integer Overflow,|Complete|,15.0
|
||||
`P1523R1 <https://wg21.link/P1523R1>`__,Views And Size Types,|Complete|,15.0
|
||||
`P1638R1 <https://wg21.link/P1638R1>`__,basic_istream_view::iterator Should Not Be Copyable,,
|
||||
`P1716R3 <https://wg21.link/P1716R3>`__,Range Comparison Algorithms Are Over-Constrained,|Complete|,15.0
|
||||
`P1739R4 <https://wg21.link/P1739R4>`__,Avoiding Template Bloat For Ranges,|Complete|,15.0
|
||||
`P1862R1 <https://wg21.link/P1862R1>`__,Range Adaptors For Non-Copyable Iterators,,
|
||||
`P1870R1 <https://wg21.link/P1870R1>`__,forwarding-range<T> is too subtle,|Complete|,15.0
|
||||
`P1871R1 <https://wg21.link/P1871R1>`__,Concept traits should be named after concepts,|Complete|,14.0
|
||||
`P1878R1 <https://wg21.link/P1878R1>`__,Constraining Readable Types,|Complete|,15.0
|
||||
`P1970R2 <https://wg21.link/P1970R2>`__,Consistency for size() functions: Add ranges::ssize,|Complete|,15.0
|
||||
`P1983R0 <https://wg21.link/P1983R0>`__,"Wording for GB301, US296, US292, US291, and US283",|Complete|,15.0
|
||||
`P1994R1 <https://wg21.link/P1994R1>`__,elements_view Needs Its Own sentinel,,
|
||||
`P2091R0 <https://wg21.link/P2091R0>`__,Fixing Issues With Range Access CPOs,|Complete|,15.0
|
||||
`P2106R0 <https://wg21.link/P2106R0>`__,Alternative wording for GB315 and GB316,|Complete|,15.0
|
||||
|
||||
`P2325R3 <https://wg21.link/P2325R3>`__,Views should not be required to be default constructible ,,
|
||||
`P2328R1 <https://wg21.link/P2328R1>`__,join_view should join all views of ranges,|Complete|,14.0
|
||||
`P2210R2 <https://wg21.link/P2210R2>`__,Superior String Splitting,,
|
||||
`P2281R1 <https://wg21.link/P2281R1>`__,Clarifying range adaptor objects,|Complete|,14.0
|
||||
`P2367R0 <https://wg21.link/P2367R0>`__,Remove misuses of list-initialization from Clause 24,,
|
||||
|
||||
`P2415 <https://wg21.link/P2415>`__,"What is a ``view``",|Complete|,14.0
|
||||
`P2432 <https://wg21.link/P2432>`__,"Fix ``istream_view``",,
|
|
4
docs/Status/RangesMajorFeatures.csv
Normal file
4
docs/Status/RangesMajorFeatures.csv
Normal file
@ -0,0 +1,4 @@
|
||||
Standard,Name,Assignee,CL,Status
|
||||
C++23,`ranges::to <https://wg21.link/P1206R7>`_,Unassigned,No patch yet,Not started
|
||||
C++23,`Pipe support for user-defined range adaptors <https://wg21.link/P2387R3>`_,Unassigned,No patch yet,Not started
|
||||
C++23,`Formatting Ranges <https://wg21.link/P2286R8>`_,Mark de Wever,Various,Complete
|
|
@ -1,161 +0,0 @@
|
||||
Section,Description,Dependencies,Assignee,Complete
|
||||
`[tuple.helper] <https://wg21.link/tuple.helper>`_,`Update <tuple> includes. <https://llvm.org/D118686>`_,None,Konstantin Varlamov,✅
|
||||
`[range.cmp] <https://wg21.link/range.cmp>`_,"| `ranges::equal_to <https://llvm.org/D100429>`_
|
||||
| `ranges::not_equal_to <https://llvm.org/D100429>`_
|
||||
| `ranges::less <https://llvm.org/D100429>`_
|
||||
| `ranges::greater <https://llvm.org/D100429>`_
|
||||
| `ranges::less_equal <https://llvm.org/D100429>`_
|
||||
| `ranges::greater_equal <https://llvm.org/D100429>`_",None,Zoe Carver,✅
|
||||
`[readable.traits] <https://wg21.link/readable.traits>`_,"| `indirectly_readable_traits <https://llvm.org/D99461>`_
|
||||
| `iter_value_t <https://llvm.org/D99863>`_",None,Christopher Di Bella,✅
|
||||
`[incrementable.traits] <https://wg21.link/incrementable.traits>`_,"| `incrementable_traits <https://llvm.org/D99141>`_
|
||||
| `iter_difference_t <https://llvm.org/D99863>`_",,Christopher Di Bella,✅
|
||||
`[iterator.traits] <https://wg21.link/iterator.traits>`_,`Updates to iterator_traits <https://llvm.org/D99855>`_,"| indirectly_readable_traits
|
||||
| incrementable_traits",Christopher Di Bella,✅
|
||||
`[special.mem.concepts] <https://wg21.link/special.mem.concepts>`_,"| `nothrow-input-iterator <https://llvm.org/D114761>`_
|
||||
| `nothrow-sentinel-for <https://llvm.org/D114761>`_
|
||||
| `nothrow-input-range <https://llvm.org/D114761>`_
|
||||
| `nothrow-forward-iterator <https://llvm.org/D114761>`_
|
||||
| `nothrow-forward-range <https://llvm.org/D114761>`_","| [iterator.concepts]
|
||||
| [range.refinements]",Konstantin Varlamov,✅
|
||||
`[specialized.algorithms] <https://wg21.link/specialized.algorithms>`_,"| `ranges::uninitialized_default_construct <https://llvm.org/D115315>`_
|
||||
| `ranges::uninitialized_default_construct_n <https://llvm.org/D115315>`_
|
||||
| `ranges::uninitialized_value_construct <https://llvm.org/D115626>`_
|
||||
| `ranges::uninitialized_value_construct_n <https://llvm.org/D115626>`_
|
||||
| `ranges::uninitialized_copy <https://llvm.org/D116023>`_
|
||||
| `ranges::uninitialized_copy_n <https://llvm.org/D116023>`_
|
||||
| `ranges::uninitialized_move <https://llvm.org/D116023>`_
|
||||
| `ranges::uninitialized_move_n <https://llvm.org/D116023>`_
|
||||
| `ranges::uninitialized_fill <https://llvm.org/D115626>`_
|
||||
| `ranges::uninitialized_fill_n <https://llvm.org/D115626>`_
|
||||
| `ranges::construct_at <https://llvm.org/D116078>`_
|
||||
| `ranges::destroy <https://llvm.org/D116078>`_
|
||||
| `ranges::destroy_at <https://llvm.org/D116078>`_
|
||||
| `ranges::destroy_n <https://llvm.org/D116078>`_",[special.mem.concepts],Konstantin Varlamov,✅
|
||||
`[strings] <https://wg21.link/strings>`_,`Adds begin/end and updates const_iterator. <https://llvm.org/D118687>`_,[iterator.concepts],Konstantin Varlamov,✅
|
||||
`[views.span] <https://wg21.link/views.span>`_,`Same as [strings] <https://llvm.org/D118687>`_,[iterator.concepts],Konstantin Varlamov,✅
|
||||
`[iterator.cust.move] <https://wg21.link/iterator.cust.move>`_,`ranges::iter_move <https://llvm.org/D99873>`_,,Zoe Carver,✅
|
||||
`[iterator.cust.swap] <https://wg21.link/iterator.cust.swap>`_,`ranges::iter_swap <https://llvm.org/D102809>`_,iter_value_t,Zoe Carver,✅
|
||||
`[iterator.concepts] <https://wg21.link/iterator.concepts>`_,"| `indirectly_readable <https://llvm.org/D100073>`_
|
||||
| `indirectly_writable <https://llvm.org/D100073>`_
|
||||
| `weakly_incrementable <https://llvm.org/D100080>`_
|
||||
| `incrementable <https://llvm.org/D100080>`_
|
||||
| `input_or_output_iterator <https://llvm.org/D100160>`_
|
||||
| `sentinel_for <https://llvm.org/D100160>`_
|
||||
| `sized_sentinel_for <https://llvm.org/D101371>`_
|
||||
| `input_iterator <https://llvm.org/D100271>`_
|
||||
| `output_iterator <https://llvm.org/D106704>`_
|
||||
| `forward_iterator <https://llvm.org/D100275>`_
|
||||
| `bidirectional_iterator <https://llvm.org/D100278>`_
|
||||
| `random_access_iterator <https://llvm.org/D101316>`_
|
||||
| `contiguous_iterator <https://llvm.org/D101396>`_",,Various,✅
|
||||
`[indirectcallable.indirectinvocable] <https://wg21.link/indirectcallable.indirectinvocable>`_,"
|
||||
| `indirectly_unary_invocable <https://llvm.org/D101277>`_
|
||||
| `indirectly_regular_unary_invocable <https://llvm.org/D101277>`_
|
||||
| `indirectly_unary_predicate <https://llvm.org/D101277>`_
|
||||
| `indirectly_binary_predicate <https://llvm.org/D101277>`_
|
||||
| `indirectly_equivalence_relation <https://llvm.org/D101277>`_
|
||||
| `indirectly_strict_weak_order <https://llvm.org/D101277>`_",[readable.traits],Louis Dionne,✅
|
||||
`[projected] <https://wg21.link/projected>`_,`ranges::projected <https://llvm.org/D101277>`_,[iterator.concepts],Louis Dionne,✅
|
||||
`[alg.req] <https://wg21.link/alg.req>`_: pt. 1,"| `indirectly_movable <https://llvm.org/D102639>`_
|
||||
| `indirectly_movable_storable <https://llvm.org/D102639>`_
|
||||
| `indirectly_copyable <https://llvm.org/D118432>`_
|
||||
| `indirectly_copyable_storable <https://llvm.org/D118432>`_",[iterator.concepts],Zoe Carver and Konstantin Varlamov,✅
|
||||
`[alg.req] <https://wg21.link/alg.req>`_: pt. 2,`indirectly_swappable <https://llvm.org/D105304>`_,"| [iterator.concepts]
|
||||
| [iterator.cust.swap]",Zoe Carver,✅
|
||||
`[alg.req] <https://wg21.link/alg.req>`_: pt. 3,`indirectly_comparable <https://llvm.org/D116268>`_,[projected],Nikolas Klauser,✅
|
||||
`[alg.req] <https://wg21.link/alg.req>`_: pt. 4,"| `permutable <https://llvm.org/D119222>`_
|
||||
| `mergeable <https://llvm.org/D119489>`_
|
||||
| `sortable <https://llvm.org/D119619>`_",[iterator.concepts],Konstantin Varlamov,✅
|
||||
`[std.iterator.tags] <https://wg21.link/std.iterator.tags>`_,"| `contiguous_iterator_tag <https://llvm.org/rG45d048c20440989df2b4e1be1f9343225e7741ab>`_
|
||||
| `iterator_concept specialization for pointers <https://llvm.org/rG45d048c20440989df2b4e1be1f9343225e7741ab>`_
|
||||
",[iterator.traits],Eric Fiselier,✅
|
||||
`[range.iter.ops] <https://wg21.link/range.iter.ops>`_,"| `ranges::advance <https://llvm.org/D101922>`_
|
||||
| `ranges::distance <https://llvm.org/D102789>`_
|
||||
| `ranges::next <https://llvm.org/D102563>`_
|
||||
| `ranges::prev <https://llvm.org/D102564>`_",[iterator.concepts],Christopher Di Bella and Arthur O'Dwyer,✅
|
||||
`[predef.iterators] <https://wg21.link/predef.iterators>`_,"
|
||||
| `Updates to reverse_iterator <https://llvm.org/D120180>`_
|
||||
| `Updates to back_insert_iterator <https://llvm.org/D103273>`_
|
||||
| `Updates to front_insert_iterator <https://llvm.org/D103273>`_
|
||||
| `Updates to move_iterator <https://llvm.org/D117656>`_","| [iterator.concepts]
|
||||
| [iterator.cust.swap]
|
||||
| [iterator.cust.move]",Various,✅
|
||||
`[move.sentinel] <https://wg21.link/move.sentinel>`_,`move_sentinel <https://llvm.org/D117656>`_,[predef.iterators],Arthur O'Dwyer,✅
|
||||
`[common.iterator] <https://wg21.link/common.iterator>`_,`common_iterator <https://llvm.org/D103335>`_,"| [iterator.concepts]
|
||||
| [iterator.cust.swap]
|
||||
| [iterator.cust.move]",Zoe Carver,✅
|
||||
`[default.sentinel] <https://wg21.link/default.sentinel>`_,`std::default_sentinel_t <https://llvm.org/D103487>`_,No dependencies,Zoe Carver,✅
|
||||
`[counted.iterator] <https://wg21.link/counted.iterator>`_,`counted_iterator <https://llvm.org/D106205>`_,"| [iterator.concepts]
|
||||
| [iterator.cust.swap]
|
||||
| [iterator.cust.move]
|
||||
| [default.sentinels]",Zoe Carver,✅
|
||||
`[stream.iterators] <https://wg21.link/stream.iterators>`_,"
|
||||
| `Updates to istream_iterator <https://llvm.org/D119620>`_
|
||||
| `Updates to ostream_iterator <https://llvm.org/D103273>`_
|
||||
| `Updates to istreambuf_iterator <https://llvm.org/D119620>`_
|
||||
| `Updates to ostreambuf_iterator <https://llvm.org/D103273>`_
|
||||
",[default.sentinels],Various,✅
|
||||
`[range.access] <https://wg21.link/range.access>`_,"| `ranges::begin <https://llvm.org/D100255>`_
|
||||
| `ranges::end <https://llvm.org/D100255>`_
|
||||
| `range::cbegin <https://llvm.org/D100255>`_
|
||||
| `ranges::cend <https://llvm.org/D100255>`_
|
||||
| `ranges::rbegin <https://llvm.org/D119057>`_
|
||||
| `ranges::rend <https://llvm.org/D119057>`_
|
||||
| `ranges::crbegin <https://llvm.org/D119057>`_
|
||||
| `ranges::crend <https://llvm.org/D119057>`_
|
||||
| `ranges::size <https://llvm.org/D101079>`_
|
||||
| `ranges::ssize <https://llvm.org/D101189>`_
|
||||
| `ranges::empty <https://llvm.org/D101193>`_
|
||||
| `ranges::data <https://llvm.org/D101476>`_
|
||||
| `ranges::cdata <https://llvm.org/D117044>`_",[iterator.concepts],Various,✅
|
||||
`[range.range] <https://wg21.link/range.range>`_,"| `ranges::range <https://llvm.org/D100269>`_
|
||||
| `ranges::borrowed_range <https://llvm.org/D102426>`_
|
||||
| `ranges::enable_borrowed_range <https://llvm.org/D90999>`_
|
||||
| `ranges::iterator_t <https://llvm.org/D100255>`_
|
||||
| `ranges::sentinel_t <https://llvm.org/D100269>`_
|
||||
| `ranges::range_difference_t <https://llvm.org/D100269>`_
|
||||
| `ranges::range_size_t <https://llvm.org/D106708>`_
|
||||
| `ranges::range_value_t <https://llvm.org/D100269>`_
|
||||
| `ranges::range_reference_t <https://llvm.org/D100269>`_
|
||||
| `ranges::range_rvalue_reference_t <https://llvm.org/D100269>`_",[range.access],Christopher Di Bella,✅
|
||||
`[range.sized] <https://wg21.link/range.sized>`_,"| `ranges::sized_range <https://llvm.org/D102434>`_
|
||||
| `ranges::disable_sized_range <https://llvm.org/D102434>`_","| [range.primitives]
|
||||
| [range.range]",Christopher Di Bella,✅
|
||||
`[range.view] <https://wg21.link/range.view>`_,"| `ranges::enable_view <https://llvm.org/D101547>`_
|
||||
| `ranges::view_base <https://llvm.org/D101547>`_
|
||||
| `ranges::view <https://llvm.org/D101547>`_",[range.range],Louis Dionne,✅
|
||||
`[range.refinements] <https://wg21.link/range.refinements>`_,"| `ranges::output_range <https://llvm.org/D106704>`_
|
||||
| `ranges::input_range <https://llvm.org/D100271>`_
|
||||
| `ranges::forward_range <https://llvm.org/D100275>`_
|
||||
| `ranges::bidirectional_range <https://llvm.org/D100278>`_
|
||||
| `ranges::random_access_range <https://llvm.org/D101316>`_
|
||||
| `ranges::contiguous_range <https://llvm.org/D104262>`_
|
||||
| `ranges::common_range <https://llvm.org/D100269>`_",[range.range],Christopher Di Bella,✅
|
||||
`[range.refinements]`_,`ranges::viewable_range <https://llvm.org/D105816>`_,[range.range],Louis Dionne,✅
|
||||
`[range.utility.helpers] <https://wg21.link/range.utility.helpers>`_,"| `simple-view <https://llvm.org/D103493>`_
|
||||
| `has-arrow <https://llvm.org/D103493>`_
|
||||
| `not-same-as <https://llvm.org/D103493>`_","| [range.range]
|
||||
| [iterator.concept.input]",Zoe Carver,✅
|
||||
`[view.interface] <https://wg21.link/view.interface>`_,"`ranges::view_interface <https://llvm.org/D101737>`_","| [ranges.range]
|
||||
| [range.view]
|
||||
| [range.iterator.op.prev]
|
||||
| [range.refinements]",Zoe Carver,✅
|
||||
`[range.subrange] <https://wg21.link/range.subrange>`_,`ranges::subrange <https://llvm.org/D102006>`_,[view.interface],Zoe Carver,✅
|
||||
`[range.dangling] <https://wg21.link/range.dangling>`_,"| `ranges::dangling <https://llvm.org/D105205>`_
|
||||
| `ranges::borrowed_iterator_t <https://llvm.org/D105205>`_
|
||||
| `ranges::borrowed_subrange_t <https://llvm.org/D105205>`_","| [range.range]
|
||||
| [range.subrange]",Christopher Di Bella,✅
|
||||
`[range.empty] <https://wg21.link/range.empty>`_,`empty_view <https://llvm.org/D103208>`_,[view.interface],Zoe Carver,✅
|
||||
`[range.single] <https://wg21.link/range.single>`_,`single_view <https://llvm.org/D106840>`_,[view.interface],Zoe Carver,✅
|
||||
`[range.iota] <https://wg21.link/range.iota>`_,`iota_view <https://llvm.org/D107396>`_,[range.all],Zoe Carver,✅
|
||||
`[range.all] <https://wg21.link/range.all>`_,`view::all <https://llvm.org/D102028>`_,"[range.subrange], [range.view.ref]",Zoe Carver,✅
|
||||
`[range.ref.view] <https://wg21.link/range.ref.view>`_,`ref_view <https://llvm.org/D102020>`_,[view.interface],Zoe Carver,✅
|
||||
`[range.filter] <https://wg21.link/range.filter>`_,`filter_view <https://llvm.org/D109086>`_,[range.all],Louis Dionne,✅
|
||||
`[range.transform] <https://wg21.link/range.transform>`_,`transform_view <https://llvm.org/D103056>`_,[range.all],Zoe Carver,✅
|
||||
`[range.take] <https://wg21.link/range.take>`_,`take_view <https://llvm.org/D106507>`_,[range.all],Zoe Carver,✅
|
||||
`[range.join] <https://wg21.link/range.join>`_,`join_view <https://llvm.org/D107671>`_,[range.all],Zoe Carver,✅
|
||||
`[range.split] <https://wg21.link/range.split>`_,`split_view (renamed to lazy_split_view by P2210) <https://llvm.org/D107500>`_,[range.all],Zoe Carver and Konstantin Varlamov,✅
|
||||
`[range.counted] <https://wg21.link/range.counted>`_,`view::counted <https://llvm.org/D106923>`_,[range.subrange],Zoe Carver,✅
|
||||
`[range.common] <https://wg21.link/range.common>`_,`common_view <https://llvm.org/D105753>`_,[range.all],Zoe Carver,✅
|
||||
`[range.reverse] <https://wg21.link/range.reverse>`_,`reverse_view <https://llvm.org/D107096>`_,[range.all],Zoe Carver,✅
|
|
37
docs/Status/RangesViews.csv
Normal file
37
docs/Status/RangesViews.csv
Normal file
@ -0,0 +1,37 @@
|
||||
Standard,View,Assignee,CL,Status
|
||||
C++20,`empty <https://wg21.link/P0896R4>`_,Zoe Carver,`D103208 <https://llvm.org/D103208>`_,✅
|
||||
C++20,`single <https://wg21.link/P0896R4>`_,Zoe Carver,`D106840 <https://llvm.org/D106840>`_,✅
|
||||
C++20,`iota (view) <https://wg21.link/P0896R4>`_,Zoe Carver,`D107396 <https://llvm.org/D107396>`_,✅
|
||||
C++20,`all <https://wg21.link/P0896R4>`_,Zoe Carver,`D102028 <https://llvm.org/D102028>`_,✅
|
||||
C++20,`ref_view <https://wg21.link/P0896R4>`_,Zoe Carver,`D102020 <https://llvm.org/D102020>`_,✅
|
||||
C++20,`owning_view <https://wg21.link/P0896R4>`_,Arthur O'Dwyer,`D116894 <https://llvm.org/D116894>`_,✅
|
||||
C++20,`filter <https://wg21.link/P0896R4>`_,Louis Dionne,`D109086 <https://llvm.org/D109086>`_,✅
|
||||
C++20,`transform <https://wg21.link/P0896R4>`_,Zoe Carver,`D103056 <https://llvm.org/D103056>`_,✅
|
||||
C++20,`take <https://wg21.link/P0896R4>`_,Zoe Carver,`D106507 <https://llvm.org/D106507>`_,✅
|
||||
C++20,`take_while <https://wg21.link/P1035R7>`_,Hui Xie,`D134952 <https://llvm.org/D134952>`_,✅
|
||||
C++20,`drop <https://wg21.link/P1035R7>`_,Zoe Carver,`D102037 <https://llvm.org/D102037>`_,✅
|
||||
C++20,`drop_while <https://wg21.link/P1035R7>`_,Hui Xie,`D135460 <https://llvm.org/D135460>`_,✅
|
||||
C++20,`join <https://wg21.link/P0896R4>`_,Zoe Carver,`D107671 <https://llvm.org/D107671>`_,✅
|
||||
C++20,`split <https://wg21.link/P2210R2>`_,Unassigned,No patch yet,Not started
|
||||
C++20,`lazy_split <https://wg21.link/P0896R4>`_,Zoe Carver and Konstantin Varlamov,`D107500 <https://llvm.org/D107500>`_,✅
|
||||
C++20,`counted <https://wg21.link/P0896R4>`_,Zoe Carver,`D106923 <https://llvm.org/D106923>`_,✅
|
||||
C++20,`common <https://wg21.link/P0896R4>`_,Zoe Carver,`D105753 <https://llvm.org/D105753>`_,✅
|
||||
C++20,`reverse <https://wg21.link/P0896R4>`_,Zoe Carver,`D107096 <https://llvm.org/D107096>`_,✅
|
||||
C++20,`elements / keys / values <https://wg21.link/P1035R7>`_,Hui Xie,`D136268 <https://llvm.org/D136268>`_,✅
|
||||
C++20,`istream <https://wg21.link/P1035R7>`_,Hui Xie,`D133317 <https://llvm.org/D133317>`_,✅
|
||||
,,,,
|
||||
,,,,
|
||||
,,,,
|
||||
C++23,`repeat <https://wg21.link/P2474R2>`_,Unassigned,No patch yet,Not started
|
||||
C++23,`cartesian_product <https://wg21.link/P2374R4>`_,Unassigned,No patch yet,Not started
|
||||
C++23,`zip <https://wg21.link/P2321R2>`_,Hui Xie,`D122806 <https://llvm.org/D122806>`_,✅
|
||||
C++23,`zip_transform <https://wg21.link/P2321R2>`_,Hui Xie,No patch yet,Not started
|
||||
C++23,`adjacent <https://wg21.link/P2321R2>`_,Hui Xie,No patch yet,Not started
|
||||
C++23,`adjacent_transform <https://wg21.link/P2321R2>`_,Hui Xie,No patch yet,Not started
|
||||
C++23,`join_with <https://wg21.link/P2441R2>`_,Unassigned,No patch yet,Not started
|
||||
C++23,`slide <https://wg21.link/P2442R1>`_,Unassigned,No patch yet,Not started
|
||||
C++23,`chunk <https://wg21.link/P2442R1>`_,Unassigned,No patch yet,Not started
|
||||
C++23,`chunk_by <https://wg21.link/P2443R1>`_,Unassigned,No patch yet,Not started
|
||||
C++23,`as_const <https://wg21.link/P2278R4>`_,Unassigned,No patch yet,Not started
|
||||
C++23,`as_rvalue <https://wg21.link/P2446R2>`_,Nikolas Klauser,`D137637 <https://llvm.org/D137637>`_,Complete
|
||||
C++23,`stride <https://wg21.link/P1899R3>`_,Unassigned,No patch yet,Not started
|
|
@ -1,7 +1,6 @@
|
||||
"Number","Name","Status","First released version"
|
||||
`P1614R2 <https://wg21.link/P1614>`_,The Mothership has Landed,|In Progress|,
|
||||
`P2404R0 <https://wg21.link/P2404>`_,"Relaxing equality_comparable_with's, totally_ordered_with's, and three_way_comparable_with's common reference requirements to support move-only types",,
|
||||
`P2405R0 <https://wg21.link/P2405>`_,nullopt_t and nullptr_t should both have operator<=> and operator==,,
|
||||
`LWG3330 <https://wg21.link/LWG3330>`_,Include <compare> from most library headers,"|Complete|","13.0"
|
||||
`LWG3347 <https://wg21.link/LWG3347>`_,"std::pair<T, U> now requires T and U to be less-than-comparable",|Nothing To Do|,
|
||||
`LWG3350 <https://wg21.link/LWG3350>`_,Simplify return type of lexicographical_compare_three_way,|Nothing To Do|,
|
||||
|
|
@ -11,72 +11,71 @@ Section,Description,Dependencies,Assignee,Complete
|
||||
| `strong_order_fallback <https://reviews.llvm.org/D111514>`_
|
||||
| `weak_order_fallback <https://reviews.llvm.org/D111514>`_
|
||||
| `partial_order_fallback <https://reviews.llvm.org/D111514>`_",None,Arthur O'Dwyer,|Complete| [#note-strongorder]_
|
||||
| `[alg.three.way] <https://wg21.link/alg.three.way>`_,| `lexicographical_compare_three_way <https://reviews.llvm.org/D80902>`_,[comparisons.three.way],Christopher Di Bella,|In Progress|
|
||||
| `[alg.three.way] <https://wg21.link/alg.three.way>`_,| `lexicographical_compare_three_way <https://reviews.llvm.org/D131395>`_,[comparisons.three.way],Adrian Vogelsgesang,|In Progress|
|
||||
| `[type.info] <https://wg21.link/type.info>`_,| `typeinfo <https://reviews.llvm.org/D130853>`_,None,Adrian Vogelsgesang,|Complete|
|
||||
| `[coroutine.handle.compare] <https://wg21.link/coroutine.handle.compare>`_,| `coroutine_handle <https://reviews.llvm.org/D109433>`_,[comparisons.three.way],Chuanqi Xu,|Complete|
|
||||
| `[pairs.spec] <https://wg21.link/pairs.spec>`_,| `pair <https://reviews.llvm.org/D107721>`_,[expos.only.func],Kent Ross,|Complete|
|
||||
| `[syserr.errcat.nonvirtuals] <https://wg21.link/syserr.errcat.nonvirtuals>`_,| error_category,[comparisons.three.way],Unassigned,|Not Started|
|
||||
| `[syserr.compare] <https://wg21.link/syserr.compare>`_,"| error_code
|
||||
| error_condition",None,Unassigned,|Not Started|
|
||||
| `[syserr.errcat.nonvirtuals] <https://wg21.link/syserr.errcat.nonvirtuals>`_,| `error_category <https://reviews.llvm.org/D131363>`_,[comparisons.three.way],Adrian Vogelsgesang,|Complete|
|
||||
| `[syserr.compare] <https://wg21.link/syserr.compare>`_,"| `error_code <https://reviews.llvm.org/D131371>`_
|
||||
| `error_condition <https://reviews.llvm.org/D131371>`_",None,Adrian Vogelsgesang,|Complete|
|
||||
| `[tuple.rel] <https://wg21.link/tuple.rel>`_,| `tuple <https://reviews.llvm.org/D108250>`_,[expos.only.func],Kent Ross,|Complete|
|
||||
"| `[optional.relops] <https://wg21.link/optional.relops>`_
|
||||
| `[optional.nullops] <https://wg21.link/optional.nullops>`_
|
||||
| `[optional.comp.with.t] <https://wg21.link/optional.comp.with.t>`_","| optional
|
||||
| nullopt",None,Kent Ross,|In Progress|
|
||||
"| `[variant.relops] <https://wg21.link/variant.relops>`_
|
||||
| `[variant.monostate.relops] <https://wg21.link/variant.monostate.relops>`_","| monostate
|
||||
| variant",None,Kent Ross,|In Progress|
|
||||
| `[unique.ptr.special] <https://wg21.link/unique.ptr.special>`_,| unique_ptr,[comparisons.three.way],Unassigned,|Not Started|
|
||||
| `[util.smartptr.shared.cmp] <https://wg21.link/util.smartptr.shared.cmp>`_,| shared_ptr,[comparisons.three.way],Unassigned,|Not Started|
|
||||
| `[type.index.members] <https://wg21.link/type.index.members>`_,| type_index,None,Unassigned,|Not Started|
|
||||
| `[charconv.syn] <https://wg21.link/charconv.syn>`_,| to_chars_result,None,Mark de Wever,|Complete|
|
||||
| `[charconv.syn] <https://wg21.link/charconv.syn>`_,| from_chars_result,None,Mark de Wever,|Complete|
|
||||
| `[variant.monostate.relops] <https://wg21.link/variant.monostate.relops>`_","| `monostate <https://reviews.llvm.org/D131372>`_
|
||||
| `variant <https://reviews.llvm.org/D131372>`_",None,Kent Ross,|Complete|
|
||||
| `[unique.ptr.special] <https://wg21.link/unique.ptr.special>`_,| `unique_ptr <https://reviews.llvm.org/D130838>`_,[comparisons.three.way],Adrian Vogelsgesang,|Complete|
|
||||
| `[util.smartptr.shared.cmp] <https://wg21.link/util.smartptr.shared.cmp>`_,| `shared_ptr <https://reviews.llvm.org/D130852>`_,[comparisons.three.way],Adrian Vogelsgesang,|Complete|
|
||||
| `[type.index.members] <https://wg21.link/type.index.members>`_,| `type_index <https://reviews.llvm.org/D131357>`_,None,Adrian Vogelsgesang,|Complete|
|
||||
| `[charconv.syn] <https://wg21.link/charconv.syn>`_,| `to_chars_result <https://reviews.llvm.org/D112366>`_,None,Mark de Wever,|Complete|
|
||||
| `[charconv.syn] <https://wg21.link/charconv.syn>`_,| `from_chars_result <https://reviews.llvm.org/D112366>`_,None,Mark de Wever,|Complete|
|
||||
| `[stacktrace.entry.cmp] <https://wg21.link/stacktrace.entry.cmp>`_,| stacktrace_entry,None,Unassigned,|Not Started|
|
||||
| `[stacktrace.basic.cmp] <https://wg21.link/stacktrace.basic.cmp>`_,| basic_stacktrace,[alg.three.way],Unassigned,|Not Started|
|
||||
| `[string.cmp] <https://wg21.link/string.cmp>`_,| `basic_string <https://reviews.llvm.org/D80895>`_,None,Christopher Di Bella,|In Progress|
|
||||
| `[string.view.comparison] <https://wg21.link/string.view.comparison>`_,| `basic_string_view <https://reviews.llvm.org/D80891>`_,None,Christopher Di Bella,|In Progress|
|
||||
| `[array.syn] <https://wg21.link/array.syn>`_ (`general <https://wg21.link/container.requirements.general#14>`_),| array,[expos.only.func],Unassigned,|Not Started|
|
||||
| `[deque.syn] <https://wg21.link/deque.syn>`_ (`general <https://wg21.link/container.requirements.general#14>`_),| deque,[expos.only.func],Unassigned,|Not Started|
|
||||
| `[forward.list.syn] <https://wg21.link/forward.list.syn>`_ (`general <https://wg21.link/container.requirements.general#14>`_),| forward_list,[expos.only.func],Unassigned,|Not Started|
|
||||
| `[list.syn] <https://wg21.link/list.syn>`_ (`general <https://wg21.link/container.requirements.general#14>`_),| list,[expos.only.func],Unassigned,|Not Started|
|
||||
| `[vector.syn] <https://wg21.link/vector.syn>`_ (`general <https://wg21.link/container.requirements.general#14>`_),| vector,[expos.only.func],Unassigned,|Not Started|
|
||||
| `[associative.map.syn] <https://wg21.link/associative.map.syn>`_ (`general <https://wg21.link/container.requirements.general#14>`_),"| map
|
||||
| `[string.cmp] <https://wg21.link/string.cmp>`_,| `basic_string <https://reviews.llvm.org/D131421>`_,None,Mark de Wever,|Complete|
|
||||
| `[string.view.comparison] <https://wg21.link/string.view.comparison>`_,| `basic_string_view <https://reviews.llvm.org/D130295>`_,None,Mark de Wever,|Complete|
|
||||
| `[array.syn] <https://wg21.link/array.syn>`_ (`general <https://wg21.link/container.opt.reqmts>`_),| `array <https://reviews.llvm.org/D132265>`_,[expos.only.func],Adrian Vogelsgesang,|In Progress|
|
||||
| `[deque.syn] <https://wg21.link/deque.syn>`_ (`general <https://wg21.link/container.opt.reqmts>`_),| deque,[expos.only.func],Unassigned,|Not Started|
|
||||
| `[forward.list.syn] <https://wg21.link/forward.list.syn>`_ (`general <https://wg21.link/container.opt.reqmts>`_),| forward_list,[expos.only.func],Unassigned,|Not Started|
|
||||
| `[list.syn] <https://wg21.link/list.syn>`_ (`general <https://wg21.link/container.opt.reqmts>`_),| list,[expos.only.func],Unassigned,|Not Started|
|
||||
| `[vector.syn] <https://wg21.link/vector.syn>`_ (`general <https://wg21.link/container.opt.reqmts>`_),| `vector <https://reviews.llvm.org/D132268>`_,[expos.only.func],Adrian Vogelsgesang,|In Progress|
|
||||
| `[associative.map.syn] <https://wg21.link/associative.map.syn>`_ (`general <https://wg21.link/container.opt.reqmts>`_),"| map
|
||||
| multimap",[expos.only.func],Unassigned,|Not Started|
|
||||
| `[associative.set.syn] <https://wg21.link/associative.set.syn>`_ (`general <https://wg21.link/container.requirements.general#14>`_),"| multiset
|
||||
| `[associative.set.syn] <https://wg21.link/associative.set.syn>`_ (`general <https://wg21.link/container.opt.reqmts>`_),"| multiset
|
||||
| set",[expos.only.func],Unassigned,|Not Started|
|
||||
| `[queue.ops] <https://wg21.link/queue.ops>`_,| queue,None,Unassigned,|Not Started|
|
||||
| `[stack.ops] <https://wg21.link/stack.ops>`_,| stack,None,Unassigned,|Not Started|
|
||||
| `[reverse.iter.cmp] <https://wg21.link/reverse.iter.cmp>`_,| reverse_iterator,None,Mikhail Maltsev,|Complete|
|
||||
| `[reverse.iter.cmp] <https://wg21.link/reverse.iter.cmp>`_,| `reverse_iterator <https://reviews.llvm.org/D113695>`_,None,Mikhail Maltsev,|Complete|
|
||||
| `[move.iter.op.comp] <https://wg21.link/move.iter.op.comp>`_,| move_iterator,None,Unassigned,|Not Started|
|
||||
| `[counted.iter.cmp] <https://wg21.link/counted.iter.cmp>`_,| counted_iterator,None,Unassigned,|Not Started|
|
||||
| `[range.iota.iterator] <https://wg21.link/range.iota.iterator>`_,| ranges::iota_view::iterator,[concepts.cmp],Unassigned,|Not Started|
|
||||
| `[range.transform.iterator] <https://wg21.link/range.transform.iterator>`_,| ranges::transform_view::iterator,[concepts.cmp],Unassigned,|Not Started|
|
||||
| `[range.elements.iterator] <https://wg21.link/range.elements.iterator>`_,| ranges::elements_view::iterator,[concepts.cmp],Unassigned,|Not Started|
|
||||
"| `[time.duration.comparisons] <https://wg21.link/time.duration.comparisons>`_
|
||||
| `[time.point.comparisons] <https://wg21.link/time.point.comparisons>`_
|
||||
| `[time.cal.day.nonmembers] <https://wg21.link/time.cal.day.nonmembers>`_
|
||||
| `[range.iota.iterator] <https://wg21.link/range.iota.iterator>`_,| `ranges::iota_view::iterator <https://reviews.llvm.org/D110774>`_,[concepts.cmp],Arthur O'Dwyer,|Complete|
|
||||
| `[range.transform.iterator] <https://wg21.link/range.transform.iterator>`_,| `ranges::transform_view::iterator <https://reviews.llvm.org/D110774>`_,[concepts.cmp],Arthur O'Dwyer,|Complete|
|
||||
| `[range.elements.iterator] <https://wg21.link/range.elements.iterator>`_,| ranges::elements_view::iterator,[concepts.cmp],Hui Xie,|Complete|
|
||||
| `[time.duration.comparisons] <https://wg21.link/time.duration.comparisons>`_, "chrono::duration", None, Mark de Wever, |Not Started|
|
||||
| `[time.point.comparisons] <https://wg21.link/time.point.comparisons>`_, "chrono::time_point", None, Mark de Wever, |Not Started|
|
||||
"| `[time.cal.day.nonmembers] <https://wg21.link/time.cal.day.nonmembers>`_
|
||||
| `[time.cal.month.nonmembers] <https://wg21.link/time.cal.month.nonmembers>`_
|
||||
| `[time.cal.year.nonmembers] <https://wg21.link/time.cal.year.nonmembers>`_
|
||||
| `[time.cal.md.nonmembers] <https://wg21.link/time.cal.md.nonmembers>`_
|
||||
| `[time.cal.mdlast] <https://wg21.link/time.cal.mdlast>`_
|
||||
| `[time.cal.ym.nonmembers] <https://wg21.link/time.cal.ym.nonmembers>`_
|
||||
| `[time.cal.ymd.nonmembers] <https://wg21.link/time.cal.ymd.nonmembers>`_
|
||||
| `[time.cal.ymdlast.nonmembers] <https://wg21.link/time.cal.ymdlast.nonmembers>`_
|
||||
| `[time.zone.nonmembers] <https://wg21.link/time.zone.nonmembers>`_
|
||||
| `[time.cal.ymdlast.nonmembers] <https://wg21.link/time.cal.ymdlast.nonmembers>`_","| `chrono::day <https://reviews.llvm.org/D129887>`_
|
||||
| `chrono::month <https://reviews.llvm.org/D129887>`_
|
||||
| `chrono::year <https://reviews.llvm.org/D129887>`_
|
||||
| `chrono::month_day <https://reviews.llvm.org/D129887>`_
|
||||
| `chrono::month_day_last <https://reviews.llvm.org/D129887>`_
|
||||
| `chrono::year_month <https://reviews.llvm.org/D129887>`_
|
||||
| `chrono::year_month_day <https://reviews.llvm.org/D129887>`_
|
||||
| `chrono::year_month_day_last <https://reviews.llvm.org/D129887>`_",None,Mark de Wever,|Complete|
|
||||
"| `[time.zone.nonmembers] <https://wg21.link/time.zone.nonmembers>`_
|
||||
| `[time.zone.leap.nonmembers] <https://wg21.link/time.zone.leap.nonmembers>`_
|
||||
| `[time.zone.link.nonmembers] <https://wg21.link/time.zone.link.nonmembers>`_","| chrono::duration
|
||||
| chrono::time_point
|
||||
| chrono::day
|
||||
| chrono::month
|
||||
| chrono::year
|
||||
| chrono::month_day
|
||||
| chrono::month_day_last
|
||||
| chrono::year_month
|
||||
| chrono::year_month_day
|
||||
| chrono::year_month_day_last
|
||||
| chrono::time_zone
|
||||
| `[time.zone.link.nonmembers] <https://wg21.link/time.zone.link.nonmembers>`_","| chrono::time_zone
|
||||
| chrono::leap_second
|
||||
| chrono::time_zone_link",None,Unassigned,|Not Started|
|
||||
| `[fs.path.nonmember] <https://wg21.link/fs.path.nonmember>`_,| filesystem::path,None,Unassigned,|Not Started|
|
||||
| `[fs.dir.entry.obs] <https://wg21.link/fs.dir.entry.obs>`_,| filesystem::directory_entry,None,Unassigned,|Not Started|
|
||||
| `[re.submatch.op] <https://wg21.link/re.submatch.op>`_,| sub_match,None,Unassigned,|Not Started|
|
||||
| `[thread.thread.id] <https://wg21.link/thread.thread.id>`_,| thread::id,None,Unassigned,|Not Started|
|
||||
| chrono::time_zone_link",A ``<chrono>`` implementation,Unassigned,|Not Started|
|
||||
| `[fs.filesystem.syn] <https://wg21.link/fs.filesystem.syn>`_,| `filesystem::space_info <https://reviews.llvm.org/D130861>`_,None,Adrian Vogelsgesang,|Complete|
|
||||
| `[fs.path.nonmember] <https://wg21.link/fs.path.nonmember>`_,| `filesystem::path <https://reviews.llvm.org/D130859>`_,None,Adrian Vogelsgesang,|Complete|
|
||||
| `[fs.dir.entry.obs] <https://wg21.link/fs.dir.entry.obs>`_,| `filesystem::directory_entry <https://reviews.llvm.org/D130860>`_,None,Adrian Vogelsgesang,|Complete|
|
||||
| `[re.submatch.op] <https://wg21.link/re.submatch.op>`_,| sub_match,None,Mark de Wever,|In Progress|
|
||||
| `[thread.thread.id] <https://wg21.link/thread.thread.id>`_,| `thread::id <https://reviews.llvm.org/D131362>`_,None,Adrian Vogelsgesang,|Complete|
|
||||
|
|
@ -1,27 +1,27 @@
|
||||
Section,Description,Dependencies,Assignee,Complete
|
||||
| `[tuple.syn] <https://wg21.link/tuple.syn>`_, "`[tuple] basic_common_reference, common_type <https://reviews.llvm.org/D116538>`_", None, Nikolas Klauser, |Complete|
|
||||
| `[tuple.tuple] <https://wg21.link/tuple.tuple>`_, "`[tuple] constructor, assignment and swap overloads <https://reviews.llvm.org/D116621>`_", None, Nikolas Klauser, |In Progress|
|
||||
| `[tuple.tuple] <https://wg21.link/tuple.tuple>`_, "`[tuple] constructor, assignment and swap overloads <https://reviews.llvm.org/D116621>`_", None, Hui Xie, |Complete|
|
||||
| `[utility.syn] <https://wg21.link/utility.syn>`_, "[pair] basic_common_reference, common_type", None, Nikolas Klauser, |Complete|
|
||||
| `[pairs.pair] <https://wg21.link/pairs.pair>`_, "[pair] constructor, assignment and swap overloads", None, Nikolas Klauser, |Not Started|
|
||||
| `[pairs.pair] <https://wg21.link/pairs.pair>`_, "`[pair] constructor, assignment and swap overloads <https://reviews.llvm.org/D131495>`_", None, Hui Xie, |Complete|
|
||||
"| `[memory.syn] <https://wg21.link/memory.syn>`_
|
||||
| `[allocator.uses.construction] <https://wg21.link/allocator.uses.construction>`_", "[pair] uses_allocator_construction_args overloads", None, Unassigned, |Not Started|
|
||||
| `[vector.bool] <https://wg21.link/vector.bool>`_, "[vector<bool>::reference] add const operator= overload", None, Nikolas Klauser, |Not Started|
|
||||
| `[iterator.concept.winc] <https://wg21.link/iterator.concept.winc>`_, "Update weakly_comparable", None, Unassigned, |Not Started|
|
||||
| `[allocator.uses.construction] <https://wg21.link/allocator.uses.construction>`_", "[pair] uses_allocator_construction_args overloads", None, Nikolas Klauser, |Complete|
|
||||
| `[vector.bool] <https://wg21.link/vector.bool>`_, "[vector<bool>::reference] add const operator= overload", None, Hui Xie, |Not Started|
|
||||
| `[iterator.concept.winc] <https://wg21.link/iterator.concept.winc>`_, "Update weakly_comparable", None, Hui Xie, |Not Started|
|
||||
| `[range.zip] <https://wg21.link/ranges.syn>`_, "`zip_view <https://reviews.llvm.org/D122806>`_", "| `zip_view::iterator`
|
||||
| `zip_view::sentinel`", Hui Xie, |Complete|
|
||||
| `[range.zip.iterator] <https://wg21.link/range.zip.iterator>`_, "`zip_view::iterator <https://reviews.llvm.org/D122806>`_", None, Hui Xie, |Complete|
|
||||
| `[range.zip.sentinel] <https://wg21.link/range.zip.sentinel>`_, "`zip_view::sentinel <https://reviews.llvm.org/D122806>`_", None, Hui Xie, |Complete|
|
||||
| `[range.zip.transform.view] <https://wg21.link/range.zip.transform.view>`_, "zip_transform_view", "| `zip_transform_view::iterator`
|
||||
| `zip_transform_view::sentinel`", Unassigned, |Not Started|
|
||||
| `[range.zip.transform.iterator] <https://wg21.link/range.zip.transform.iterator>`_, "zip_transform_view::iterator", None, Unassigned, |Not Started|
|
||||
| `[range.zip.transform.sentinel] <https://wg21.link/range.zip.transform.sentinel>`_, "zip_transform_view::sentinel", None, Unassigned, |Not Started|
|
||||
| `zip_transform_view::sentinel`", Hui Xie, |Not Started|
|
||||
| `[range.zip.transform.iterator] <https://wg21.link/range.zip.transform.iterator>`_, "zip_transform_view::iterator", None, Hui Xie, |Not Started|
|
||||
| `[range.zip.transform.sentinel] <https://wg21.link/range.zip.transform.sentinel>`_, "zip_transform_view::sentinel", None, Hui Xie, |Not Started|
|
||||
| `[range.adjacent.view] <https://wg21.link/range.adjacent.view>`_, "adjacent_view", "| `adjacent_view::iterator`
|
||||
| `adjacent_view::sentinel`", Unassigned, |Not Started|
|
||||
| `[range.adjacent.iterator] <https://wg21.link/range.adjacent.iterator>`_, "adjacent_view::iterator", None, Unassigned, |Not Started|
|
||||
| `[range.adjacent.sentinel] <https://wg21.link/range.adjacent.sentinel>`_, "adjacent_view::sentinel", None, Unassigned, |Not Started|
|
||||
| `adjacent_view::sentinel`", Hui Xie, |Not Started|
|
||||
| `[range.adjacent.iterator] <https://wg21.link/range.adjacent.iterator>`_, "adjacent_view::iterator", None, unassigned, |Not Started|
|
||||
| `[range.adjacent.sentinel] <https://wg21.link/range.adjacent.sentinel>`_, "adjacent_view::sentinel", None, unassigned, |Not Started|
|
||||
| `[range.adjacent.transform.view] <https://wg21.link/range.adjacent.transform.view>`_, "adjacent_transform_view", "| `adjacent_transform_view::iterator`,
|
||||
| `adjacent_transform_view::sentinel`", Unassigned, |Not Started|
|
||||
| `[range.adjacent.transform.iterator] <https://wg21.link/range.adjacent.transform.iterator>`_, "adjacent_transform_view::iterator", None, Unassigned, |Not Started|
|
||||
| `[range.adjacent.transform.sentinel] <https://wg21.link/range.adjacent.transform.sentinel>`_, "adjacent_transform_view::sentinel", None, Unassigned, |Not Started|
|
||||
| `adjacent_transform_view::sentinel`", Hui Xie, |Not Started|
|
||||
| `[range.adjacent.transform.iterator] <https://wg21.link/range.adjacent.transform.iterator>`_, "adjacent_transform_view::iterator", None, Hui Xie, |Not Started|
|
||||
| `[range.adjacent.transform.sentinel] <https://wg21.link/range.adjacent.transform.sentinel>`_, "adjacent_transform_view::sentinel", None, Hui Xie, |Not Started|
|
||||
| `[ranges.syn] <https://wg21.link/ranges.syn>`_, "enable_borrowed_range zip_view and adjacent_view", "| `zip_view`
|
||||
| `adjacent_view`", Unassigned, |Not Started|
|
||||
| `adjacent_view`", Hui Xie, |Not Started|
|
||||
|
|
@ -92,6 +92,14 @@ configuration easier.
|
||||
$ make -C <build> cxx-test-depends
|
||||
$ <build>/bin/llvm-lit -sv libcxx/test # will use your custom config file
|
||||
|
||||
Additional tools
|
||||
----------------
|
||||
|
||||
The libc++ test suite uses a few optional tools to improve the code quality.
|
||||
|
||||
These tools are:
|
||||
- clang-tidy (you might need additional dev packages to compile libc++-specific clang-tidy checks)
|
||||
|
||||
Writing Tests
|
||||
-------------
|
||||
|
||||
|
@ -122,6 +122,21 @@ provide pretty-printers itself. Those can be used as:
|
||||
-ex "python register_libcxx_printer_loader()" \
|
||||
<args>
|
||||
|
||||
.. _include-what-you-use:
|
||||
|
||||
include-what-you-use (IWYU)
|
||||
===========================
|
||||
|
||||
libc++ provides an IWYU `mapping file <https://github.com/include-what-you-use/include-what-you-use/blob/master/docs/IWYUMappings.md>`,
|
||||
which drastically improves the accuracy of the tool when using libc++. To use the mapping file with
|
||||
IWYU, you should run the tool like so:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ include-what-you-use -Xiwyu /path/to/libcxx/include/libcxx.imp file.cpp
|
||||
|
||||
If you would prefer to not use that flag, then you can replace ``/path/to/include-what-you-use/share/libcxx.imp```
|
||||
file with the libc++-provided ``libcxx.imp`` file.
|
||||
|
||||
.. _assertions-mode:
|
||||
|
||||
@ -157,12 +172,19 @@ library provides a default function that prints an error message and calls ``std
|
||||
that this function is provided by the static or shared library, so it is only available when deploying
|
||||
to a platform where the compiled library is sufficiently recent. On older platforms, the program will
|
||||
terminate in an unspecified unsuccessful manner, but the quality of diagnostics won't be great.
|
||||
However, users can also override that function with their own, which can be useful to either provide
|
||||
custom behavior or when deploying to an older platform where the default function isn't available.
|
||||
However, users can also override that mechanism at two different levels. First, the mechanism can be
|
||||
overriden at compile-time by defining the ``_LIBCPP_VERBOSE_ABORT(format, args...)`` variadic macro.
|
||||
When that macro is defined, it will be called with a format string as the first argument, followed by
|
||||
a series of arguments to format using printf-style formatting. Compile-time customization may be
|
||||
interesting to get precise control over code generation, however it is also inconvenient to use in
|
||||
some cases. Indeed, compile-time customization of the verbose termination function requires that all
|
||||
translation units be compiled with a consistent definition for ``_LIBCPP_VERBOSE_ABORT`` to avoid ODR
|
||||
violations, which can add complexity in the build system of users.
|
||||
|
||||
Replacing the default verbose termination function is done by defining the
|
||||
``_LIBCPP_AVAILABILITY_CUSTOM_VERBOSE_ABORT_PROVIDED`` macro in all translation units of your program
|
||||
and defining the following function in exactly one translation unit:
|
||||
Otherwise, if compile-time customization is not necessary, link-time customization of the handler is also
|
||||
possible, similarly to how replacing ``operator new`` works. This mechanism trades off fine-grained control
|
||||
over the call site where the termination is initiated in exchange for more ergonomics. Link-time customization
|
||||
is done by simply defining the following function in exactly one translation unit of your program:
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
@ -248,19 +270,9 @@ thread safety annotations.
|
||||
replacement scenarios from working, e.g. replacing `operator new` and
|
||||
expecting a non-replaced `operator new[]` to call the replaced `operator new`.
|
||||
|
||||
**_LIBCPP_ENABLE_NODISCARD**:
|
||||
Allow the library to add ``[[nodiscard]]`` attributes to entities not specified
|
||||
as ``[[nodiscard]]`` by the current language dialect. This includes
|
||||
backporting applications of ``[[nodiscard]]`` from newer dialects and
|
||||
additional extended applications at the discretion of the library. All
|
||||
additional applications of ``[[nodiscard]]`` are disabled by default.
|
||||
See :ref:`Extended Applications of [[nodiscard]] <nodiscard extension>` for
|
||||
more information.
|
||||
|
||||
**_LIBCPP_DISABLE_NODISCARD_EXT**:
|
||||
This macro prevents the library from applying ``[[nodiscard]]`` to entities
|
||||
purely as an extension. See :ref:`Extended Applications of [[nodiscard]] <nodiscard extension>`
|
||||
for more information.
|
||||
This macro disables library-extensions of ``[[nodiscard]]``.
|
||||
See :ref:`Extended Applications of [[nodiscard]] <nodiscard extension>` for more information.
|
||||
|
||||
**_LIBCPP_DISABLE_DEPRECATION_WARNINGS**:
|
||||
This macro disables warnings when using deprecated components. For example,
|
||||
@ -350,8 +362,8 @@ Users who want help diagnosing misuses of STL functions may desire a more
|
||||
liberal application of ``[[nodiscard]]``.
|
||||
|
||||
For this reason libc++ provides an extension that does just that! The
|
||||
extension must be enabled by defining ``_LIBCPP_ENABLE_NODISCARD``. The extended
|
||||
applications of ``[[nodiscard]]`` takes two forms:
|
||||
extension is enabled by default and can be disabled by defining ``_LIBCPP_DISABLE_NODISCARD_EXT``.
|
||||
The extended applications of ``[[nodiscard]]`` takes two forms:
|
||||
|
||||
1. Backporting ``[[nodiscard]]`` to entities declared as such by the
|
||||
standard in newer dialects, but not in the present one.
|
||||
@ -359,17 +371,6 @@ applications of ``[[nodiscard]]`` takes two forms:
|
||||
2. Extended applications of ``[[nodiscard]]``, at the library's discretion,
|
||||
applied to entities never declared as such by the standard.
|
||||
|
||||
Users may also opt-out of additional applications ``[[nodiscard]]`` using
|
||||
additional macros.
|
||||
|
||||
Applications of the first form, which backport ``[[nodiscard]]`` from a newer
|
||||
dialect, may be disabled using macros specific to the dialect in which it was
|
||||
added. For example, ``_LIBCPP_DISABLE_NODISCARD_AFTER_CXX17``.
|
||||
|
||||
Applications of the second form, which are pure extensions, may be disabled
|
||||
by defining ``_LIBCPP_DISABLE_NODISCARD_EXT``.
|
||||
|
||||
|
||||
Entities declared with ``_LIBCPP_NODISCARD_EXT``
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
@ -414,6 +415,44 @@ which no dialect declares as such (See the second form described above).
|
||||
* ``search``
|
||||
* ``unique``
|
||||
* ``upper_bound``
|
||||
* ``ranges::adjacent_find``
|
||||
* ``ranges::all_of``
|
||||
* ``ranges::any_of``
|
||||
* ``ranges::binary_search``
|
||||
* ``ranges::clamp``
|
||||
* ``ranges::count_if``
|
||||
* ``ranges::count``
|
||||
* ``ranges::equal_range``
|
||||
* ``ranges::equal``
|
||||
* ``ranges::find_end``
|
||||
* ``ranges::find_first_of``
|
||||
* ``ranges::find_if_not``
|
||||
* ``ranges::find_if``
|
||||
* ``ranges::find``
|
||||
* ``ranges::get_temporary_buffer``
|
||||
* ``ranges::includes``
|
||||
* ``ranges::is_heap_until``
|
||||
* ``ranges::is_heap``
|
||||
* ``ranges::is_partitioned``
|
||||
* ``ranges::is_permutation``
|
||||
* ``ranges::is_sorted_until``
|
||||
* ``ranges::is_sorted``
|
||||
* ``ranges::lexicographical_compare``
|
||||
* ``ranges::lower_bound``
|
||||
* ``ranges::max_element``
|
||||
* ``ranges::max``
|
||||
* ``ranges::min_element``
|
||||
* ``ranges::min``
|
||||
* ``ranges::minmax_element``
|
||||
* ``ranges::minmax``
|
||||
* ``ranges::mismatch``
|
||||
* ``ranges::none_of``
|
||||
* ``ranges::remove_if``
|
||||
* ``ranges::remove``
|
||||
* ``ranges::search_n``
|
||||
* ``ranges::search``
|
||||
* ``ranges::unique``
|
||||
* ``ranges::upper_bound``
|
||||
* ``lock_guard``'s constructors
|
||||
* ``as_const``
|
||||
* ``bit_cast``
|
||||
@ -423,6 +462,44 @@ which no dialect declares as such (See the second form described above).
|
||||
* ``identity::operator()``
|
||||
* ``to_integer``
|
||||
* ``to_underlying``
|
||||
* ``signbit``
|
||||
* ``fpclassify``
|
||||
* ``isfinite``
|
||||
* ``isinf``
|
||||
* ``isnan``
|
||||
* ``isnormal``
|
||||
* ``isgreater``
|
||||
* ``isgreaterequal``
|
||||
* ``isless``
|
||||
* ``islessequal``
|
||||
* ``islessgreater``
|
||||
* ``isunordered``
|
||||
* ``ceil``
|
||||
* ``fabs``
|
||||
* ``floor``
|
||||
* ``cbrt``
|
||||
* ``copysign``
|
||||
* ``fmax``
|
||||
* ``fmin``
|
||||
* ``nearbyint``
|
||||
* ``rint``
|
||||
* ``round``
|
||||
* ``trunc``
|
||||
|
||||
Extended integral type support
|
||||
------------------------------
|
||||
|
||||
Several platforms support types that are not specified in the Standard, such as
|
||||
the 128-bit integral types ``__int128_t`` and ``__uint128_t``. As an extension,
|
||||
libc++ does a best-effort attempt to support these types like other integral
|
||||
types, by supporting them notably in:
|
||||
|
||||
* ``<bits>``
|
||||
* ``<charconv>``
|
||||
* ``<functional>``
|
||||
* ``<type_traits>``
|
||||
* ``<format>``
|
||||
* ``<random>``
|
||||
|
||||
Additional types supported in random distributions
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
@ -432,3 +509,11 @@ distributions with types other than ``short``, ``int``, ``long``, ``long long``,
|
||||
undefined. As an extension, libc++ supports instantiating ``binomial_distribution``, ``discrete_distribution``,
|
||||
``geometric_distribution``, ``negative_binomial_distribution``, ``poisson_distribution``, and ``uniform_int_distribution``
|
||||
with ``int8_t``, ``__int128_t`` and their unsigned versions.
|
||||
|
||||
Extensions to ``<format>``
|
||||
--------------------------
|
||||
|
||||
The exposition only type ``basic-format-string`` and its typedefs
|
||||
``format-string`` and ``wformat-string`` became ``basic_format_string``,
|
||||
``format_string``, and ``wformat_string`` in C++23. Libc++ makes these types
|
||||
available in C++20 as an extension.
|
||||
|
@ -48,9 +48,9 @@ copyright = u'2011-%d, LLVM Project' % date.today().year
|
||||
# built documents.
|
||||
#
|
||||
# The short X.Y version.
|
||||
version = '15.0'
|
||||
version = '17.0'
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = '15.0'
|
||||
release = '17.0'
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
|
@ -93,6 +93,7 @@ reasons, but some of the major ones are:
|
||||
Further, both projects are apparently abandoned: STLport 5.2.1 was
|
||||
released in Oct'08, and STDCXX 4.2.1 in May'08.
|
||||
|
||||
.. _SupportedPlatforms:
|
||||
|
||||
Platform and Compiler Support
|
||||
=============================
|
||||
@ -104,8 +105,8 @@ velocity, libc++ drops support for older compilers as newer ones are released.
|
||||
============ =============== ========================== =====================
|
||||
Compiler Versions Restrictions Support policy
|
||||
============ =============== ========================== =====================
|
||||
Clang 13, 14 latest two stable releases per `LLVM's release page <https://releases.llvm.org>`_
|
||||
AppleClang 13 latest stable release per `Xcode's release page <https://developer.apple.com/documentation/xcode-release-notes>`_
|
||||
Clang 14, 15, 16-git latest two stable releases per `LLVM's release page <https://releases.llvm.org>`_ and the development version
|
||||
AppleClang 14 latest stable release per `Xcode's release page <https://developer.apple.com/documentation/xcode-release-notes>`_
|
||||
Open XL 17.1 (AIX) latest stable release per `Open XL's documentation page <https://www.ibm.com/docs/en/openxl-c-and-cpp-aix>`_
|
||||
GCC 12 In C++11 or later only latest stable release per `GCC's release page <https://gcc.gnu.org/releases.html>`_
|
||||
============ =============== ========================== =====================
|
||||
@ -175,6 +176,7 @@ Design Documents
|
||||
DesignDocs/ExtendedCXX03Support
|
||||
DesignDocs/FeatureTestMacros
|
||||
DesignDocs/FileTimeType
|
||||
DesignDocs/HeaderRemovalPolicy
|
||||
DesignDocs/NoexceptPolicy
|
||||
DesignDocs/ThreadingSupportAPI
|
||||
DesignDocs/UniquePtrTrivialAbi
|
||||
@ -186,7 +188,7 @@ Build Bots and Test Coverage
|
||||
============================
|
||||
|
||||
* `Buildkite CI pipeline <https://buildkite.com/llvm-project/libcxx-ci>`_
|
||||
* `LLVM Buildbot Builders <http://lab.llvm.org:8011>`_
|
||||
* `LLVM Buildbot Builders <https://lab.llvm.org/buildbot>`_
|
||||
* :ref:`Adding New CI Jobs <AddingNewCIJobs>`
|
||||
|
||||
|
||||
|
@ -9,6 +9,7 @@ set(files
|
||||
__algorithm/copy.h
|
||||
__algorithm/copy_backward.h
|
||||
__algorithm/copy_if.h
|
||||
__algorithm/copy_move_common.h
|
||||
__algorithm/copy_n.h
|
||||
__algorithm/count.h
|
||||
__algorithm/count_if.h
|
||||
@ -192,9 +193,19 @@ set(files
|
||||
__assert
|
||||
__availability
|
||||
__bit/bit_cast.h
|
||||
__bit/bit_ceil.h
|
||||
__bit/bit_floor.h
|
||||
__bit/bit_log2.h
|
||||
__bit/bit_width.h
|
||||
__bit/blsr.h
|
||||
__bit/byteswap.h
|
||||
__bit/countl.h
|
||||
__bit/countr.h
|
||||
__bit/endian.h
|
||||
__bit/has_single_bit.h
|
||||
__bit/popcount.h
|
||||
__bit/rotate.h
|
||||
__bit_reference
|
||||
__bits
|
||||
__bsd_locale_defaults.h
|
||||
__bsd_locale_fallbacks.h
|
||||
__charconv/chars_format.h
|
||||
@ -204,15 +215,20 @@ set(files
|
||||
__charconv/to_chars_result.h
|
||||
__chrono/calendar.h
|
||||
__chrono/convert_to_timespec.h
|
||||
__chrono/convert_to_tm.h
|
||||
__chrono/day.h
|
||||
__chrono/duration.h
|
||||
__chrono/file_clock.h
|
||||
__chrono/formatter.h
|
||||
__chrono/hh_mm_ss.h
|
||||
__chrono/high_resolution_clock.h
|
||||
__chrono/literals.h
|
||||
__chrono/month.h
|
||||
__chrono/month_weekday.h
|
||||
__chrono/monthday.h
|
||||
__chrono/ostream.h
|
||||
__chrono/parser_std_format_spec.h
|
||||
__chrono/statically_widen.h
|
||||
__chrono/steady_clock.h
|
||||
__chrono/system_clock.h
|
||||
__chrono/time_point.h
|
||||
@ -264,6 +280,10 @@ set(files
|
||||
__debug
|
||||
__debug_utils/randomize_range.h
|
||||
__errc
|
||||
__expected/bad_expected_access.h
|
||||
__expected/expected.h
|
||||
__expected/unexpect.h
|
||||
__expected/unexpected.h
|
||||
__filesystem/copy_options.h
|
||||
__filesystem/directory_entry.h
|
||||
__filesystem/directory_iterator.h
|
||||
@ -282,13 +302,16 @@ set(files
|
||||
__filesystem/u8path.h
|
||||
__format/buffer.h
|
||||
__format/concepts.h
|
||||
__format/container_adaptor.h
|
||||
__format/enable_insertable.h
|
||||
__format/escaped_output_table.h
|
||||
__format/extended_grapheme_cluster_table.h
|
||||
__format/format_arg.h
|
||||
__format/format_arg_store.h
|
||||
__format/format_args.h
|
||||
__format/format_context.h
|
||||
__format/format_error.h
|
||||
__format/format_functions.h
|
||||
__format/format_fwd.h
|
||||
__format/format_parse_context.h
|
||||
__format/format_string.h
|
||||
@ -302,7 +325,10 @@ set(files
|
||||
__format/formatter_output.h
|
||||
__format/formatter_pointer.h
|
||||
__format/formatter_string.h
|
||||
__format/formatter_tuple.h
|
||||
__format/parser_std_format_spec.h
|
||||
__format/range_default_formatter.h
|
||||
__format/range_formatter.h
|
||||
__format/unicode.h
|
||||
__functional/binary_function.h
|
||||
__functional/binary_negate.h
|
||||
@ -332,8 +358,16 @@ set(files
|
||||
__functional/unary_negate.h
|
||||
__functional/unwrap_ref.h
|
||||
__functional/weak_result_type.h
|
||||
__fwd/array.h
|
||||
__fwd/get.h
|
||||
__fwd/hash.h
|
||||
__fwd/memory_resource.h
|
||||
__fwd/pair.h
|
||||
__fwd/span.h
|
||||
__fwd/string.h
|
||||
__fwd/string_view.h
|
||||
__fwd/subrange.h
|
||||
__fwd/tuple.h
|
||||
__hash_table
|
||||
__ios/fpos.h
|
||||
__iterator/access.h
|
||||
@ -358,6 +392,7 @@ set(files
|
||||
__iterator/iter_swap.h
|
||||
__iterator/iterator.h
|
||||
__iterator/iterator_traits.h
|
||||
__iterator/iterator_with_data.h
|
||||
__iterator/mergeable.h
|
||||
__iterator/move_iterator.h
|
||||
__iterator/move_sentinel.h
|
||||
@ -370,6 +405,7 @@ set(files
|
||||
__iterator/readable_traits.h
|
||||
__iterator/reverse_access.h
|
||||
__iterator/reverse_iterator.h
|
||||
__iterator/segmented_iterator.h
|
||||
__iterator/size.h
|
||||
__iterator/sortable.h
|
||||
__iterator/unreachable_sentinel.h
|
||||
@ -377,27 +413,39 @@ set(files
|
||||
__locale
|
||||
__mbstate_t.h
|
||||
__memory/addressof.h
|
||||
__memory/align.h
|
||||
__memory/allocate_at_least.h
|
||||
__memory/allocation_guard.h
|
||||
__memory/allocator.h
|
||||
__memory/allocator_arg_t.h
|
||||
__memory/allocator_destructor.h
|
||||
__memory/allocator_traits.h
|
||||
__memory/assume_aligned.h
|
||||
__memory/auto_ptr.h
|
||||
__memory/builtin_new_allocator.h
|
||||
__memory/compressed_pair.h
|
||||
__memory/concepts.h
|
||||
__memory/construct_at.h
|
||||
__memory/destruct_n.h
|
||||
__memory/pointer_traits.h
|
||||
__memory/ranges_construct_at.h
|
||||
__memory/ranges_uninitialized_algorithms.h
|
||||
__memory/raw_storage_iterator.h
|
||||
__memory/shared_ptr.h
|
||||
__memory/swap_allocator.h
|
||||
__memory/temp_value.h
|
||||
__memory/temporary_buffer.h
|
||||
__memory/uninitialized_algorithms.h
|
||||
__memory/unique_ptr.h
|
||||
__memory/uses_allocator.h
|
||||
__memory/uses_allocator_construction.h
|
||||
__memory/voidify.h
|
||||
__memory_resource/memory_resource.h
|
||||
__memory_resource/monotonic_buffer_resource.h
|
||||
__memory_resource/polymorphic_allocator.h
|
||||
__memory_resource/pool_options.h
|
||||
__memory_resource/synchronized_pool_resource.h
|
||||
__memory_resource/unsynchronized_pool_resource.h
|
||||
__mutex_base
|
||||
__node_handle
|
||||
__numeric/accumulate.h
|
||||
@ -452,6 +500,7 @@ set(files
|
||||
__random/weibull_distribution.h
|
||||
__ranges/access.h
|
||||
__ranges/all.h
|
||||
__ranges/as_rvalue_view.h
|
||||
__ranges/common_view.h
|
||||
__ranges/concepts.h
|
||||
__ranges/copyable_box.h
|
||||
@ -459,12 +508,15 @@ set(files
|
||||
__ranges/dangling.h
|
||||
__ranges/data.h
|
||||
__ranges/drop_view.h
|
||||
__ranges/drop_while_view.h
|
||||
__ranges/elements_view.h
|
||||
__ranges/empty.h
|
||||
__ranges/empty_view.h
|
||||
__ranges/enable_borrowed_range.h
|
||||
__ranges/enable_view.h
|
||||
__ranges/filter_view.h
|
||||
__ranges/iota_view.h
|
||||
__ranges/istream_view.h
|
||||
__ranges/join_view.h
|
||||
__ranges/lazy_split_view.h
|
||||
__ranges/non_propagating_cache.h
|
||||
@ -476,8 +528,10 @@ set(files
|
||||
__ranges/reverse_view.h
|
||||
__ranges/single_view.h
|
||||
__ranges/size.h
|
||||
__ranges/split_view.h
|
||||
__ranges/subrange.h
|
||||
__ranges/take_view.h
|
||||
__ranges/take_while_view.h
|
||||
__ranges/transform_view.h
|
||||
__ranges/view_interface.h
|
||||
__ranges/views.h
|
||||
@ -498,7 +552,6 @@ set(files
|
||||
__support/solaris/floatingpoint.h
|
||||
__support/solaris/wchar.h
|
||||
__support/solaris/xlocale.h
|
||||
__support/win32/limits_msvc_win32.h
|
||||
__support/win32/locale_win32.h
|
||||
__support/xlocale/__nop_locale_mgmt.h
|
||||
__support/xlocale/__posix_l_fallback.h
|
||||
@ -507,7 +560,16 @@ set(files
|
||||
__thread/timed_backoff_policy.h
|
||||
__threading_support
|
||||
__tree
|
||||
__tuple
|
||||
__tuple_dir/apply_cv.h
|
||||
__tuple_dir/make_tuple_types.h
|
||||
__tuple_dir/pair_like.h
|
||||
__tuple_dir/sfinae_helpers.h
|
||||
__tuple_dir/tuple_element.h
|
||||
__tuple_dir/tuple_indices.h
|
||||
__tuple_dir/tuple_like.h
|
||||
__tuple_dir/tuple_like_ext.h
|
||||
__tuple_dir/tuple_size.h
|
||||
__tuple_dir/tuple_types.h
|
||||
__type_traits/add_const.h
|
||||
__type_traits/add_cv.h
|
||||
__type_traits/add_lvalue_reference.h
|
||||
@ -518,6 +580,7 @@ set(files
|
||||
__type_traits/aligned_union.h
|
||||
__type_traits/alignment_of.h
|
||||
__type_traits/apply_cv.h
|
||||
__type_traits/can_extract_key.h
|
||||
__type_traits/common_reference.h
|
||||
__type_traits/common_type.h
|
||||
__type_traits/conditional.h
|
||||
@ -525,6 +588,7 @@ set(files
|
||||
__type_traits/copy_cv.h
|
||||
__type_traits/copy_cvref.h
|
||||
__type_traits/decay.h
|
||||
__type_traits/dependent_type.h
|
||||
__type_traits/disjunction.h
|
||||
__type_traits/enable_if.h
|
||||
__type_traits/extent.h
|
||||
@ -533,12 +597,15 @@ set(files
|
||||
__type_traits/integral_constant.h
|
||||
__type_traits/is_abstract.h
|
||||
__type_traits/is_aggregate.h
|
||||
__type_traits/is_allocator.h
|
||||
__type_traits/is_always_bitcastable.h
|
||||
__type_traits/is_arithmetic.h
|
||||
__type_traits/is_array.h
|
||||
__type_traits/is_assignable.h
|
||||
__type_traits/is_base_of.h
|
||||
__type_traits/is_bounded_array.h
|
||||
__type_traits/is_callable.h
|
||||
__type_traits/is_char_like_type.h
|
||||
__type_traits/is_class.h
|
||||
__type_traits/is_compound.h
|
||||
__type_traits/is_const.h
|
||||
@ -556,6 +623,7 @@ set(files
|
||||
__type_traits/is_floating_point.h
|
||||
__type_traits/is_function.h
|
||||
__type_traits/is_fundamental.h
|
||||
__type_traits/is_implicitly_default_constructible.h
|
||||
__type_traits/is_integral.h
|
||||
__type_traits/is_literal_type.h
|
||||
__type_traits/is_member_function_pointer.h
|
||||
@ -586,7 +654,9 @@ set(files
|
||||
__type_traits/is_scoped_enum.h
|
||||
__type_traits/is_signed.h
|
||||
__type_traits/is_signed_integer.h
|
||||
__type_traits/is_specialization.h
|
||||
__type_traits/is_standard_layout.h
|
||||
__type_traits/is_swappable.h
|
||||
__type_traits/is_trivial.h
|
||||
__type_traits/is_trivially_assignable.h
|
||||
__type_traits/is_trivially_constructible.h
|
||||
@ -606,20 +676,26 @@ set(files
|
||||
__type_traits/is_volatile.h
|
||||
__type_traits/lazy.h
|
||||
__type_traits/make_32_64_or_128_bit.h
|
||||
__type_traits/make_const_lvalue_ref.h
|
||||
__type_traits/make_signed.h
|
||||
__type_traits/make_unsigned.h
|
||||
__type_traits/maybe_const.h
|
||||
__type_traits/nat.h
|
||||
__type_traits/negation.h
|
||||
__type_traits/noexcept_move_assign_container.h
|
||||
__type_traits/promote.h
|
||||
__type_traits/rank.h
|
||||
__type_traits/remove_all_extents.h
|
||||
__type_traits/remove_const.h
|
||||
__type_traits/remove_const_ref.h
|
||||
__type_traits/remove_cv.h
|
||||
__type_traits/remove_cvref.h
|
||||
__type_traits/remove_extent.h
|
||||
__type_traits/remove_pointer.h
|
||||
__type_traits/remove_reference.h
|
||||
__type_traits/remove_volatile.h
|
||||
__type_traits/result_of.h
|
||||
__type_traits/strip_signature.h
|
||||
__type_traits/type_identity.h
|
||||
__type_traits/type_list.h
|
||||
__type_traits/underlying_type.h
|
||||
@ -628,9 +704,12 @@ set(files
|
||||
__utility/as_const.h
|
||||
__utility/auto_cast.h
|
||||
__utility/cmp.h
|
||||
__utility/convert_to_integral.h
|
||||
__utility/declval.h
|
||||
__utility/exception_guard.h
|
||||
__utility/exchange.h
|
||||
__utility/forward.h
|
||||
__utility/forward_like.h
|
||||
__utility/in_place.h
|
||||
__utility/integer_sequence.h
|
||||
__utility/move.h
|
||||
@ -640,7 +719,6 @@ set(files
|
||||
__utility/rel_ops.h
|
||||
__utility/swap.h
|
||||
__utility/to_underlying.h
|
||||
__utility/transaction.h
|
||||
__utility/unreachable.h
|
||||
__variant/monostate.h
|
||||
__verbose_abort
|
||||
@ -690,6 +768,7 @@ set(files
|
||||
errno.h
|
||||
exception
|
||||
execution
|
||||
expected
|
||||
experimental/__config
|
||||
experimental/__memory
|
||||
experimental/algorithm
|
||||
@ -731,6 +810,7 @@ set(files
|
||||
istream
|
||||
iterator
|
||||
latch
|
||||
libcxx.imp
|
||||
limits
|
||||
limits.h
|
||||
list
|
||||
@ -739,6 +819,7 @@ set(files
|
||||
map
|
||||
math.h
|
||||
memory
|
||||
memory_resource
|
||||
mutex
|
||||
new
|
||||
numbers
|
||||
@ -755,6 +836,7 @@ set(files
|
||||
set
|
||||
setjmp.h
|
||||
shared_mutex
|
||||
source_location
|
||||
span
|
||||
sstream
|
||||
stack
|
||||
@ -789,7 +871,7 @@ set(files
|
||||
wctype.h
|
||||
)
|
||||
|
||||
foreach(feature LIBCXX_ENABLE_FILESYSTEM LIBCXX_ENABLE_LOCALIZATION LIBCXX_ENABLE_THREADS LIBCXX_ENABLE_WIDE_CHARACTERS)
|
||||
foreach(feature LIBCXX_ENABLE_FILESYSTEM LIBCXX_ENABLE_LOCALIZATION LIBCXX_ENABLE_FSTREAM LIBCXX_ENABLE_THREADS LIBCXX_ENABLE_WIDE_CHARACTERS)
|
||||
if (NOT ${${feature}})
|
||||
set(requires_${feature} "requires LIBCXX_CONFIGURED_WITHOUT_SUPPORT_FOR_THIS_HEADER")
|
||||
endif()
|
||||
@ -828,13 +910,18 @@ if (LIBCXX_INSTALL_HEADERS)
|
||||
)
|
||||
endforeach()
|
||||
|
||||
# Install the generated __config_site and the generated modulemap file.
|
||||
# Install the generated __config_site file to the per-target include dir.
|
||||
install(FILES "${LIBCXX_GENERATED_INCLUDE_TARGET_DIR}/__config_site"
|
||||
"${LIBCXX_GENERATED_INCLUDE_DIR}/module.modulemap"
|
||||
DESTINATION "${LIBCXX_INSTALL_INCLUDE_TARGET_DIR}"
|
||||
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
|
||||
COMPONENT cxx-headers)
|
||||
|
||||
# Install the generated modulemap file to the generic include dir.
|
||||
install(FILES "${LIBCXX_GENERATED_INCLUDE_DIR}/module.modulemap"
|
||||
DESTINATION "${LIBCXX_INSTALL_INCLUDE_DIR}"
|
||||
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
|
||||
COMPONENT cxx-headers)
|
||||
|
||||
if (NOT CMAKE_CONFIGURATION_TYPES)
|
||||
add_custom_target(install-cxx-headers
|
||||
DEPENDS cxx-headers
|
||||
|
@ -23,7 +23,7 @@
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _Iter, class _Sent, class _BinaryPredicate>
|
||||
_LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 _Iter
|
||||
_LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _Iter
|
||||
__adjacent_find(_Iter __first, _Sent __last, _BinaryPredicate&& __pred) {
|
||||
if (__first == __last)
|
||||
return __first;
|
||||
@ -37,16 +37,15 @@ __adjacent_find(_Iter __first, _Sent __last, _BinaryPredicate&& __pred) {
|
||||
}
|
||||
|
||||
template <class _ForwardIterator, class _BinaryPredicate>
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator
|
||||
adjacent_find(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred) {
|
||||
return std::__adjacent_find(std::move(__first), std::move(__last), __pred);
|
||||
}
|
||||
|
||||
template <class _ForwardIterator>
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator
|
||||
adjacent_find(_ForwardIterator __first, _ForwardIterator __last) {
|
||||
typedef typename iterator_traits<_ForwardIterator>::value_type __v;
|
||||
return std::adjacent_find(std::move(__first), std::move(__last), __equal_to<__v>());
|
||||
return std::adjacent_find(std::move(__first), std::move(__last), __equal_to());
|
||||
}
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
@ -19,7 +19,7 @@
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _InputIterator, class _Predicate>
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 bool
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
|
||||
all_of(_InputIterator __first, _InputIterator __last, _Predicate __pred) {
|
||||
for (; __first != __last; ++__first)
|
||||
if (!__pred(*__first))
|
||||
|
@ -19,7 +19,7 @@
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _InputIterator, class _Predicate>
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 bool
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
|
||||
any_of(_InputIterator __first, _InputIterator __last, _Predicate __pred) {
|
||||
for (; __first != __last; ++__first)
|
||||
if (__pred(*__first))
|
||||
|
@ -23,18 +23,17 @@ _LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _ForwardIterator, class _Tp, class _Compare>
|
||||
_LIBCPP_NODISCARD_EXT inline
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
bool
|
||||
binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, _Compare __comp)
|
||||
{
|
||||
using _Comp_ref = typename __comp_ref_type<_Compare>::type;
|
||||
__first = std::lower_bound<_ForwardIterator, _Tp, _Comp_ref>(__first, __last, __value, __comp);
|
||||
__first = std::lower_bound<_ForwardIterator, _Tp, __comp_ref_type<_Compare> >(__first, __last, __value, __comp);
|
||||
return __first != __last && !__comp(__value, *__first);
|
||||
}
|
||||
|
||||
template <class _ForwardIterator, class _Tp>
|
||||
_LIBCPP_NODISCARD_EXT inline
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
bool
|
||||
binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value)
|
||||
{
|
||||
|
@ -17,73 +17,47 @@
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
// I'd like to replace these with _VSTD::equal_to<void>, but can't because:
|
||||
// * That only works with C++14 and later, and
|
||||
// * We haven't included <functional> here.
|
||||
template <class _T1, class _T2 = _T1>
|
||||
struct __equal_to
|
||||
{
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 bool operator()(const _T1& __x, const _T2& __y) const {return __x == __y;}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 bool operator()(const _T2& __x, const _T1& __y) const {return __x == __y;}
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 bool operator()(const _T2& __x, const _T2& __y) const {return __x == __y;}
|
||||
};
|
||||
|
||||
template <class _T1>
|
||||
struct __equal_to<_T1, _T1>
|
||||
{
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
|
||||
};
|
||||
|
||||
template <class _T1>
|
||||
struct __equal_to<const _T1, _T1>
|
||||
{
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
|
||||
};
|
||||
|
||||
template <class _T1>
|
||||
struct __equal_to<_T1, const _T1>
|
||||
{
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;}
|
||||
struct __equal_to {
|
||||
template <class _T1, class _T2>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 bool operator()(const _T1& __x, const _T2& __y) const {
|
||||
return __x == __y;
|
||||
}
|
||||
};
|
||||
|
||||
template <class _T1, class _T2 = _T1>
|
||||
struct __less
|
||||
{
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
|
||||
bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
|
||||
bool operator()(const _T1& __x, const _T2& __y) const {return __x < __y;}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
|
||||
bool operator()(const _T2& __x, const _T1& __y) const {return __x < __y;}
|
||||
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
|
||||
bool operator()(const _T2& __x, const _T2& __y) const {return __x < __y;}
|
||||
};
|
||||
|
||||
template <class _T1>
|
||||
struct __less<_T1, _T1>
|
||||
{
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
|
||||
bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
|
||||
};
|
||||
|
||||
template <class _T1>
|
||||
struct __less<const _T1, _T1>
|
||||
{
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
|
||||
bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
|
||||
};
|
||||
|
||||
template <class _T1>
|
||||
struct __less<_T1, const _T1>
|
||||
{
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
|
||||
bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;}
|
||||
};
|
||||
|
||||
|
@ -23,11 +23,11 @@ template <class _Compare>
|
||||
struct __debug_less
|
||||
{
|
||||
_Compare &__comp_;
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_LIBCPP_CONSTEXPR_SINCE_CXX14
|
||||
__debug_less(_Compare& __c) : __comp_(__c) {}
|
||||
|
||||
template <class _Tp, class _Up>
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_LIBCPP_CONSTEXPR_SINCE_CXX14
|
||||
bool operator()(const _Tp& __x, const _Up& __y)
|
||||
{
|
||||
bool __r = __comp_(__x, __y);
|
||||
@ -37,7 +37,7 @@ struct __debug_less
|
||||
}
|
||||
|
||||
template <class _Tp, class _Up>
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_LIBCPP_CONSTEXPR_SINCE_CXX14
|
||||
bool operator()(_Tp& __x, _Up& __y)
|
||||
{
|
||||
bool __r = __comp_(__x, __y);
|
||||
@ -47,10 +47,10 @@ struct __debug_less
|
||||
}
|
||||
|
||||
template <class _LHS, class _RHS>
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_LIBCPP_CONSTEXPR_SINCE_CXX14
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
decltype((void)declval<_Compare&>()(
|
||||
declval<_LHS &>(), declval<_RHS &>()))
|
||||
decltype((void)std::declval<_Compare&>()(
|
||||
std::declval<_LHS &>(), std::declval<_RHS &>()))
|
||||
__do_compare_assert(int, _LHS & __l, _RHS & __r) {
|
||||
_LIBCPP_DEBUG_ASSERT(!__comp_(__l, __r),
|
||||
"Comparator does not induce a strict weak ordering");
|
||||
@ -59,21 +59,20 @@ struct __debug_less
|
||||
}
|
||||
|
||||
template <class _LHS, class _RHS>
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_LIBCPP_CONSTEXPR_SINCE_CXX14
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
void __do_compare_assert(long, _LHS &, _RHS &) {}
|
||||
};
|
||||
|
||||
template <class _Comp>
|
||||
struct __comp_ref_type {
|
||||
// Pass the comparator by lvalue reference. Or in debug mode, using a
|
||||
// debugging wrapper that stores a reference.
|
||||
// Pass the comparator by lvalue reference. Or in debug mode, using a
|
||||
// debugging wrapper that stores a reference.
|
||||
#ifdef _LIBCPP_ENABLE_DEBUG_MODE
|
||||
typedef __debug_less<_Comp> type;
|
||||
template <class _Comp>
|
||||
using __comp_ref_type = __debug_less<_Comp>;
|
||||
#else
|
||||
typedef _Comp& type;
|
||||
template <class _Comp>
|
||||
using __comp_ref_type = _Comp&;
|
||||
#endif
|
||||
};
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
|
@ -9,100 +9,118 @@
|
||||
#ifndef _LIBCPP___ALGORITHM_COPY_H
|
||||
#define _LIBCPP___ALGORITHM_COPY_H
|
||||
|
||||
#include <__algorithm/unwrap_iter.h>
|
||||
#include <__algorithm/unwrap_range.h>
|
||||
#include <__algorithm/copy_move_common.h>
|
||||
#include <__algorithm/iterator_operations.h>
|
||||
#include <__algorithm/min.h>
|
||||
#include <__config>
|
||||
#include <__iterator/iterator_traits.h>
|
||||
#include <__iterator/reverse_iterator.h>
|
||||
#include <__iterator/segmented_iterator.h>
|
||||
#include <__type_traits/common_type.h>
|
||||
#include <__utility/move.h>
|
||||
#include <__utility/pair.h>
|
||||
#include <cstring>
|
||||
#include <type_traits>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_PUSH_MACROS
|
||||
#include <__undef_macros>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
// copy
|
||||
template <class, class _InIter, class _Sent, class _OutIter>
|
||||
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_InIter, _OutIter> __copy(_InIter, _Sent, _OutIter);
|
||||
|
||||
template <class _InIter, class _Sent, class _OutIter>
|
||||
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
pair<_InIter, _OutIter> __copy_impl(_InIter __first, _Sent __last, _OutIter __result) {
|
||||
while (__first != __last) {
|
||||
*__result = *__first;
|
||||
++__first;
|
||||
++__result;
|
||||
template <class _AlgPolicy>
|
||||
struct __copy_loop {
|
||||
template <class _InIter, class _Sent, class _OutIter>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_InIter, _OutIter>
|
||||
operator()(_InIter __first, _Sent __last, _OutIter __result) const {
|
||||
while (__first != __last) {
|
||||
*__result = *__first;
|
||||
++__first;
|
||||
++__result;
|
||||
}
|
||||
|
||||
return std::make_pair(std::move(__first), std::move(__result));
|
||||
}
|
||||
return pair<_InIter, _OutIter>(std::move(__first), std::move(__result));
|
||||
}
|
||||
|
||||
template <class _InValueT,
|
||||
class _OutValueT,
|
||||
class = __enable_if_t<is_same<typename remove_const<_InValueT>::type, _OutValueT>::value
|
||||
&& is_trivially_copy_assignable<_OutValueT>::value> >
|
||||
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
pair<_InValueT*, _OutValueT*> __copy_impl(_InValueT* __first, _InValueT* __last, _OutValueT* __result) {
|
||||
if (__libcpp_is_constant_evaluated()
|
||||
// TODO: Remove this once GCC supports __builtin_memmove during constant evaluation
|
||||
#ifndef _LIBCPP_COMPILER_GCC
|
||||
&& !is_trivially_copyable<_InValueT>::value
|
||||
#endif
|
||||
)
|
||||
return std::__copy_impl<_InValueT*, _InValueT*, _OutValueT*>(__first, __last, __result);
|
||||
const size_t __n = static_cast<size_t>(__last - __first);
|
||||
if (__n > 0)
|
||||
::__builtin_memmove(__result, __first, __n * sizeof(_OutValueT));
|
||||
return std::make_pair(__first + __n, __result + __n);
|
||||
}
|
||||
template <class _InIter, class _OutIter, __enable_if_t<__is_segmented_iterator<_InIter>::value, int> = 0>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_InIter, _OutIter>
|
||||
operator()(_InIter __first, _InIter __last, _OutIter __result) const {
|
||||
using _Traits = __segmented_iterator_traits<_InIter>;
|
||||
auto __sfirst = _Traits::__segment(__first);
|
||||
auto __slast = _Traits::__segment(__last);
|
||||
if (__sfirst == __slast) {
|
||||
auto __iters = std::__copy<_AlgPolicy>(_Traits::__local(__first), _Traits::__local(__last), std::move(__result));
|
||||
return std::make_pair(__last, std::move(__iters.second));
|
||||
}
|
||||
|
||||
template <class _InIter, class _OutIter,
|
||||
__enable_if_t<is_same<typename remove_const<__iter_value_type<_InIter> >::type, __iter_value_type<_OutIter> >::value
|
||||
&& __is_cpp17_contiguous_iterator<typename _InIter::iterator_type>::value
|
||||
&& __is_cpp17_contiguous_iterator<typename _OutIter::iterator_type>::value
|
||||
&& is_trivially_copy_assignable<__iter_value_type<_OutIter> >::value
|
||||
&& __is_reverse_iterator<_InIter>::value
|
||||
&& __is_reverse_iterator<_OutIter>::value, int> = 0>
|
||||
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
pair<_InIter, _OutIter>
|
||||
__copy_impl(_InIter __first, _InIter __last, _OutIter __result) {
|
||||
auto __first_base = std::__unwrap_iter(__first.base());
|
||||
auto __last_base = std::__unwrap_iter(__last.base());
|
||||
auto __result_base = std::__unwrap_iter(__result.base());
|
||||
auto __result_first = __result_base - (__first_base - __last_base);
|
||||
std::__copy_impl(__last_base, __first_base, __result_first);
|
||||
return std::make_pair(__last, _OutIter(std::__rewrap_iter(__result.base(), __result_first)));
|
||||
}
|
||||
__result = std::__copy<_AlgPolicy>(_Traits::__local(__first), _Traits::__end(__sfirst), std::move(__result)).second;
|
||||
++__sfirst;
|
||||
while (__sfirst != __slast) {
|
||||
__result =
|
||||
std::__copy<_AlgPolicy>(_Traits::__begin(__sfirst), _Traits::__end(__sfirst), std::move(__result)).second;
|
||||
++__sfirst;
|
||||
}
|
||||
__result =
|
||||
std::__copy<_AlgPolicy>(_Traits::__begin(__sfirst), _Traits::__local(__last), std::move(__result)).second;
|
||||
return std::make_pair(__last, std::move(__result));
|
||||
}
|
||||
|
||||
template <class _InIter, class _Sent, class _OutIter,
|
||||
__enable_if_t<!(is_copy_constructible<_InIter>::value
|
||||
&& is_copy_constructible<_Sent>::value
|
||||
&& is_copy_constructible<_OutIter>::value), int> = 0 >
|
||||
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
pair<_InIter, _OutIter> __copy(_InIter __first, _Sent __last, _OutIter __result) {
|
||||
return std::__copy_impl(std::move(__first), std::move(__last), std::move(__result));
|
||||
}
|
||||
template <class _InIter,
|
||||
class _OutIter,
|
||||
__enable_if_t<__is_cpp17_random_access_iterator<_InIter>::value &&
|
||||
!__is_segmented_iterator<_InIter>::value && __is_segmented_iterator<_OutIter>::value,
|
||||
int> = 0>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_InIter, _OutIter>
|
||||
operator()(_InIter __first, _InIter __last, _OutIter __result) {
|
||||
using _Traits = __segmented_iterator_traits<_OutIter>;
|
||||
using _DiffT = typename common_type<__iter_diff_t<_InIter>, __iter_diff_t<_OutIter> >::type;
|
||||
|
||||
template <class _InIter, class _Sent, class _OutIter,
|
||||
__enable_if_t<is_copy_constructible<_InIter>::value
|
||||
&& is_copy_constructible<_Sent>::value
|
||||
&& is_copy_constructible<_OutIter>::value, int> = 0>
|
||||
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
pair<_InIter, _OutIter> __copy(_InIter __first, _Sent __last, _OutIter __result) {
|
||||
auto __range = std::__unwrap_range(__first, __last);
|
||||
auto __ret = std::__copy_impl(std::move(__range.first), std::move(__range.second), std::__unwrap_iter(__result));
|
||||
return std::make_pair(
|
||||
std::__rewrap_range<_Sent>(__first, __ret.first), std::__rewrap_iter(__result, __ret.second));
|
||||
if (__first == __last)
|
||||
return std::make_pair(std::move(__first), std::move(__result));
|
||||
|
||||
auto __local_first = _Traits::__local(__result);
|
||||
auto __segment_iterator = _Traits::__segment(__result);
|
||||
while (true) {
|
||||
auto __local_last = _Traits::__end(__segment_iterator);
|
||||
auto __size = std::min<_DiffT>(__local_last - __local_first, __last - __first);
|
||||
auto __iters = std::__copy<_AlgPolicy>(__first, __first + __size, __local_first);
|
||||
__first = std::move(__iters.first);
|
||||
|
||||
if (__first == __last)
|
||||
return std::make_pair(std::move(__first), _Traits::__compose(__segment_iterator, std::move(__iters.second)));
|
||||
|
||||
__local_first = _Traits::__begin(++__segment_iterator);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
struct __copy_trivial {
|
||||
// At this point, the iterators have been unwrapped so any `contiguous_iterator` has been unwrapped to a pointer.
|
||||
template <class _In, class _Out,
|
||||
__enable_if_t<__can_lower_copy_assignment_to_memmove<_In, _Out>::value, int> = 0>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_In*, _Out*>
|
||||
operator()(_In* __first, _In* __last, _Out* __result) const {
|
||||
return std::__copy_trivial_impl(__first, __last, __result);
|
||||
}
|
||||
};
|
||||
|
||||
template <class _AlgPolicy, class _InIter, class _Sent, class _OutIter>
|
||||
pair<_InIter, _OutIter> inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14
|
||||
__copy(_InIter __first, _Sent __last, _OutIter __result) {
|
||||
return std::__dispatch_copy_or_move<_AlgPolicy, __copy_loop<_AlgPolicy>, __copy_trivial>(
|
||||
std::move(__first), std::move(__last), std::move(__result));
|
||||
}
|
||||
|
||||
template <class _InputIterator, class _OutputIterator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
_OutputIterator
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 _OutputIterator
|
||||
copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result) {
|
||||
return std::__copy(__first, __last, __result).second;
|
||||
return std::__copy<_ClassicAlgPolicy>(__first, __last, __result).second;
|
||||
}
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
_LIBCPP_POP_MACROS
|
||||
|
||||
#endif // _LIBCPP___ALGORITHM_COPY_H
|
||||
|
@ -9,53 +9,135 @@
|
||||
#ifndef _LIBCPP___ALGORITHM_COPY_BACKWARD_H
|
||||
#define _LIBCPP___ALGORITHM_COPY_BACKWARD_H
|
||||
|
||||
#include <__algorithm/copy.h>
|
||||
#include <__algorithm/copy_move_common.h>
|
||||
#include <__algorithm/iterator_operations.h>
|
||||
#include <__algorithm/ranges_copy.h>
|
||||
#include <__algorithm/unwrap_iter.h>
|
||||
#include <__concepts/same_as.h>
|
||||
#include <__algorithm/min.h>
|
||||
#include <__config>
|
||||
#include <__iterator/iterator_traits.h>
|
||||
#include <__iterator/reverse_iterator.h>
|
||||
#include <__ranges/subrange.h>
|
||||
#include <__iterator/segmented_iterator.h>
|
||||
#include <__type_traits/common_type.h>
|
||||
#include <__type_traits/is_copy_constructible.h>
|
||||
#include <__utility/move.h>
|
||||
#include <__utility/pair.h>
|
||||
#include <type_traits>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_PUSH_MACROS
|
||||
#include <__undef_macros>
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _AlgPolicy, class _InputIterator, class _OutputIterator,
|
||||
__enable_if_t<is_same<_AlgPolicy, _ClassicAlgPolicy>::value, int> = 0>
|
||||
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 pair<_InputIterator, _OutputIterator>
|
||||
__copy_backward(_InputIterator __first, _InputIterator __last, _OutputIterator __result) {
|
||||
auto __ret = std::__copy(
|
||||
__unconstrained_reverse_iterator<_InputIterator>(__last),
|
||||
__unconstrained_reverse_iterator<_InputIterator>(__first),
|
||||
__unconstrained_reverse_iterator<_OutputIterator>(__result));
|
||||
return pair<_InputIterator, _OutputIterator>(__ret.first.base(), __ret.second.base());
|
||||
}
|
||||
template <class _AlgPolicy, class _InIter, class _Sent, class _OutIter>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_InIter, _OutIter>
|
||||
__copy_backward(_InIter __first, _Sent __last, _OutIter __result);
|
||||
|
||||
#if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_INCOMPLETE_RANGES)
|
||||
template <class _AlgPolicy, class _Iter1, class _Sent1, class _Iter2,
|
||||
__enable_if_t<is_same<_AlgPolicy, _RangeAlgPolicy>::value, int> = 0>
|
||||
_LIBCPP_HIDE_FROM_ABI constexpr pair<_Iter1, _Iter2> __copy_backward(_Iter1 __first, _Sent1 __last, _Iter2 __result) {
|
||||
auto __last_iter = _IterOps<_AlgPolicy>::next(__first, std::move(__last));
|
||||
auto __reverse_range = std::__reverse_range(std::ranges::subrange(std::move(__first), __last_iter));
|
||||
auto __ret = ranges::copy(std::move(__reverse_range), std::make_reverse_iterator(__result));
|
||||
return std::make_pair(__last_iter, __ret.out.base());
|
||||
template <class _AlgPolicy>
|
||||
struct __copy_backward_loop {
|
||||
template <class _InIter, class _Sent, class _OutIter>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_InIter, _OutIter>
|
||||
operator()(_InIter __first, _Sent __last, _OutIter __result) const {
|
||||
auto __last_iter = _IterOps<_AlgPolicy>::next(__first, __last);
|
||||
auto __original_last_iter = __last_iter;
|
||||
|
||||
while (__first != __last_iter) {
|
||||
*--__result = *--__last_iter;
|
||||
}
|
||||
|
||||
return std::make_pair(std::move(__original_last_iter), std::move(__result));
|
||||
}
|
||||
|
||||
template <class _InIter, class _OutIter, __enable_if_t<__is_segmented_iterator<_InIter>::value, int> = 0>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_InIter, _OutIter>
|
||||
operator()(_InIter __first, _InIter __last, _OutIter __result) const {
|
||||
using _Traits = __segmented_iterator_traits<_InIter>;
|
||||
auto __sfirst = _Traits::__segment(__first);
|
||||
auto __slast = _Traits::__segment(__last);
|
||||
if (__sfirst == __slast) {
|
||||
auto __iters =
|
||||
std::__copy_backward<_AlgPolicy>(_Traits::__local(__first), _Traits::__local(__last), std::move(__result));
|
||||
return std::make_pair(__last, __iters.second);
|
||||
}
|
||||
|
||||
__result =
|
||||
std::__copy_backward<_AlgPolicy>(_Traits::__begin(__slast), _Traits::__local(__last), std::move(__result))
|
||||
.second;
|
||||
--__slast;
|
||||
while (__sfirst != __slast) {
|
||||
__result =
|
||||
std::__copy_backward<_AlgPolicy>(_Traits::__begin(__slast), _Traits::__end(__slast), std::move(__result))
|
||||
.second;
|
||||
--__slast;
|
||||
}
|
||||
__result = std::__copy_backward<_AlgPolicy>(_Traits::__local(__first), _Traits::__end(__slast), std::move(__result))
|
||||
.second;
|
||||
return std::make_pair(__last, std::move(__result));
|
||||
}
|
||||
|
||||
template <class _InIter,
|
||||
class _OutIter,
|
||||
__enable_if_t<__is_cpp17_random_access_iterator<_InIter>::value &&
|
||||
!__is_segmented_iterator<_InIter>::value && __is_segmented_iterator<_OutIter>::value,
|
||||
int> = 0>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_InIter, _OutIter>
|
||||
operator()(_InIter __first, _InIter __last, _OutIter __result) {
|
||||
using _Traits = __segmented_iterator_traits<_OutIter>;
|
||||
auto __orig_last = __last;
|
||||
auto __segment_iterator = _Traits::__segment(__result);
|
||||
|
||||
// When the range contains no elements, __result might not be a valid iterator
|
||||
if (__first == __last)
|
||||
return std::make_pair(__first, __result);
|
||||
|
||||
auto __local_last = _Traits::__local(__result);
|
||||
while (true) {
|
||||
using _DiffT = typename common_type<__iter_diff_t<_InIter>, __iter_diff_t<_OutIter> >::type;
|
||||
|
||||
auto __local_first = _Traits::__begin(__segment_iterator);
|
||||
auto __size = std::min<_DiffT>(__local_last - __local_first, __last - __first);
|
||||
auto __iter = std::__copy_backward<_AlgPolicy>(__last - __size, __last, __local_last).second;
|
||||
__last -= __size;
|
||||
|
||||
if (__first == __last)
|
||||
return std::make_pair(std::move(__orig_last), _Traits::__compose(__segment_iterator, std::move(__iter)));
|
||||
--__segment_iterator;
|
||||
__local_last = _Traits::__end(__segment_iterator);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
struct __copy_backward_trivial {
|
||||
// At this point, the iterators have been unwrapped so any `contiguous_iterator` has been unwrapped to a pointer.
|
||||
template <class _In, class _Out,
|
||||
__enable_if_t<__can_lower_copy_assignment_to_memmove<_In, _Out>::value, int> = 0>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_In*, _Out*>
|
||||
operator()(_In* __first, _In* __last, _Out* __result) const {
|
||||
return std::__copy_backward_trivial_impl(__first, __last, __result);
|
||||
}
|
||||
};
|
||||
|
||||
template <class _AlgPolicy, class _BidirectionalIterator1, class _Sentinel, class _BidirectionalIterator2>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_BidirectionalIterator1, _BidirectionalIterator2>
|
||||
__copy_backward(_BidirectionalIterator1 __first, _Sentinel __last, _BidirectionalIterator2 __result) {
|
||||
return std::__dispatch_copy_or_move<_AlgPolicy, __copy_backward_loop<_AlgPolicy>, __copy_backward_trivial>(
|
||||
std::move(__first), std::move(__last), std::move(__result));
|
||||
}
|
||||
#endif // _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_INCOMPLETE_RANGES)
|
||||
|
||||
template <class _BidirectionalIterator1, class _BidirectionalIterator2>
|
||||
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 _BidirectionalIterator2
|
||||
copy_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last, _BidirectionalIterator2 __result) {
|
||||
return std::__copy_backward<_ClassicAlgPolicy>(__first, __last, __result).second;
|
||||
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
_BidirectionalIterator2
|
||||
copy_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last,
|
||||
_BidirectionalIterator2 __result)
|
||||
{
|
||||
static_assert(std::is_copy_constructible<_BidirectionalIterator1>::value &&
|
||||
std::is_copy_constructible<_BidirectionalIterator1>::value, "Iterators must be copy constructible.");
|
||||
|
||||
return std::__copy_backward<_ClassicAlgPolicy>(
|
||||
std::move(__first), std::move(__last), std::move(__result)).second;
|
||||
}
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
_LIBCPP_POP_MACROS
|
||||
|
||||
#endif // _LIBCPP___ALGORITHM_COPY_BACKWARD_H
|
||||
|
@ -18,7 +18,7 @@
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template<class _InputIterator, class _OutputIterator, class _Predicate>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
_OutputIterator
|
||||
copy_if(_InputIterator __first, _InputIterator __last,
|
||||
_OutputIterator __result, _Predicate __pred)
|
||||
|
163
include/__algorithm/copy_move_common.h
Normal file
163
include/__algorithm/copy_move_common.h
Normal file
@ -0,0 +1,163 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef _LIBCPP___ALGORITHM_COPY_MOVE_COMMON_H
|
||||
#define _LIBCPP___ALGORITHM_COPY_MOVE_COMMON_H
|
||||
|
||||
#include <__algorithm/iterator_operations.h>
|
||||
#include <__algorithm/unwrap_iter.h>
|
||||
#include <__algorithm/unwrap_range.h>
|
||||
#include <__config>
|
||||
#include <__iterator/iterator_traits.h>
|
||||
#include <__memory/pointer_traits.h>
|
||||
#include <__type_traits/enable_if.h>
|
||||
#include <__type_traits/is_always_bitcastable.h>
|
||||
#include <__type_traits/is_constant_evaluated.h>
|
||||
#include <__type_traits/is_copy_constructible.h>
|
||||
#include <__type_traits/is_trivially_assignable.h>
|
||||
#include <__type_traits/is_trivially_copyable.h>
|
||||
#include <__type_traits/is_volatile.h>
|
||||
#include <__utility/move.h>
|
||||
#include <__utility/pair.h>
|
||||
#include <cstddef>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
// Type traits.
|
||||
|
||||
template <class _From, class _To>
|
||||
struct __can_lower_copy_assignment_to_memmove {
|
||||
static const bool value =
|
||||
// If the types are always bitcastable, it's valid to do a bitwise copy between them.
|
||||
__is_always_bitcastable<_From, _To>::value &&
|
||||
// Reject conversions that wouldn't be performed by the regular built-in assignment (e.g. between arrays).
|
||||
is_trivially_assignable<_To&, const _From&>::value &&
|
||||
// `memmove` doesn't accept `volatile` pointers, make sure the optimization SFINAEs away in that case.
|
||||
!is_volatile<_From>::value &&
|
||||
!is_volatile<_To>::value;
|
||||
};
|
||||
|
||||
template <class _From, class _To>
|
||||
struct __can_lower_move_assignment_to_memmove {
|
||||
static const bool value =
|
||||
__is_always_bitcastable<_From, _To>::value &&
|
||||
is_trivially_assignable<_To&, _From&&>::value &&
|
||||
!is_volatile<_From>::value &&
|
||||
!is_volatile<_To>::value;
|
||||
};
|
||||
|
||||
// `memmove` algorithms implementation.
|
||||
|
||||
template <class _In, class _Out>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_In*, _Out*>
|
||||
__copy_trivial_impl(_In* __first, _In* __last, _Out* __result) {
|
||||
const size_t __n = static_cast<size_t>(__last - __first);
|
||||
::__builtin_memmove(__result, __first, __n * sizeof(_Out));
|
||||
|
||||
return std::make_pair(__last, __result + __n);
|
||||
}
|
||||
|
||||
template <class _In, class _Out>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_In*, _Out*>
|
||||
__copy_backward_trivial_impl(_In* __first, _In* __last, _Out* __result) {
|
||||
const size_t __n = static_cast<size_t>(__last - __first);
|
||||
__result -= __n;
|
||||
|
||||
::__builtin_memmove(__result, __first, __n * sizeof(_Out));
|
||||
|
||||
return std::make_pair(__last, __result);
|
||||
}
|
||||
|
||||
// Iterator unwrapping and dispatching to the correct overload.
|
||||
|
||||
template <class _F1, class _F2>
|
||||
struct __overload : _F1, _F2 {
|
||||
using _F1::operator();
|
||||
using _F2::operator();
|
||||
};
|
||||
|
||||
template <class _InIter, class _Sent, class _OutIter, class = void>
|
||||
struct __can_rewrap : false_type {};
|
||||
|
||||
template <class _InIter, class _Sent, class _OutIter>
|
||||
struct __can_rewrap<_InIter,
|
||||
_Sent,
|
||||
_OutIter,
|
||||
// Note that sentinels are always copy-constructible.
|
||||
__enable_if_t< is_copy_constructible<_InIter>::value &&
|
||||
is_copy_constructible<_OutIter>::value > > : true_type {};
|
||||
|
||||
template <class _Algorithm,
|
||||
class _InIter,
|
||||
class _Sent,
|
||||
class _OutIter,
|
||||
__enable_if_t<__can_rewrap<_InIter, _Sent, _OutIter>::value, int> = 0>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 pair<_InIter, _OutIter>
|
||||
__unwrap_and_dispatch(_InIter __first, _Sent __last, _OutIter __out_first) {
|
||||
auto __range = std::__unwrap_range(__first, std::move(__last));
|
||||
auto __result = _Algorithm()(std::move(__range.first), std::move(__range.second), std::__unwrap_iter(__out_first));
|
||||
return std::make_pair(std::__rewrap_range<_Sent>(std::move(__first), std::move(__result.first)),
|
||||
std::__rewrap_iter(std::move(__out_first), std::move(__result.second)));
|
||||
}
|
||||
|
||||
template <class _Algorithm,
|
||||
class _InIter,
|
||||
class _Sent,
|
||||
class _OutIter,
|
||||
__enable_if_t<!__can_rewrap<_InIter, _Sent, _OutIter>::value, int> = 0>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 pair<_InIter, _OutIter>
|
||||
__unwrap_and_dispatch(_InIter __first, _Sent __last, _OutIter __out_first) {
|
||||
return _Algorithm()(std::move(__first), std::move(__last), std::move(__out_first));
|
||||
}
|
||||
|
||||
template <class _IterOps, class _InValue, class _OutIter, class = void>
|
||||
struct __can_copy_without_conversion : false_type {};
|
||||
|
||||
template <class _IterOps, class _InValue, class _OutIter>
|
||||
struct __can_copy_without_conversion<
|
||||
_IterOps,
|
||||
_InValue,
|
||||
_OutIter,
|
||||
__enable_if_t<is_same<_InValue, typename _IterOps::template __value_type<_OutIter> >::value> > : true_type {};
|
||||
|
||||
template <class _AlgPolicy,
|
||||
class _NaiveAlgorithm,
|
||||
class _OptimizedAlgorithm,
|
||||
class _InIter,
|
||||
class _Sent,
|
||||
class _OutIter>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 pair<_InIter, _OutIter>
|
||||
__dispatch_copy_or_move(_InIter __first, _Sent __last, _OutIter __out_first) {
|
||||
#ifdef _LIBCPP_COMPILER_GCC
|
||||
// GCC doesn't support `__builtin_memmove` during constant evaluation.
|
||||
if (__libcpp_is_constant_evaluated()) {
|
||||
return std::__unwrap_and_dispatch<_NaiveAlgorithm>(std::move(__first), std::move(__last), std::move(__out_first));
|
||||
}
|
||||
#else
|
||||
// In Clang, `__builtin_memmove` only supports fully trivially copyable types (just having trivial copy assignment is
|
||||
// insufficient). Also, conversions are not supported.
|
||||
if (__libcpp_is_constant_evaluated()) {
|
||||
using _InValue = typename _IterOps<_AlgPolicy>::template __value_type<_InIter>;
|
||||
if (!is_trivially_copyable<_InValue>::value ||
|
||||
!__can_copy_without_conversion<_IterOps<_AlgPolicy>, _InValue, _OutIter>::value) {
|
||||
return std::__unwrap_and_dispatch<_NaiveAlgorithm>(std::move(__first), std::move(__last), std::move(__out_first));
|
||||
}
|
||||
}
|
||||
#endif // _LIBCPP_COMPILER_GCC
|
||||
|
||||
using _Algorithm = __overload<_NaiveAlgorithm, _OptimizedAlgorithm>;
|
||||
return std::__unwrap_and_dispatch<_Algorithm>(std::move(__first), std::move(__last), std::move(__out_first));
|
||||
}
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP___ALGORITHM_COPY_MOVE_COMMON_H
|
@ -12,6 +12,7 @@
|
||||
#include <__algorithm/copy.h>
|
||||
#include <__config>
|
||||
#include <__iterator/iterator_traits.h>
|
||||
#include <__utility/convert_to_integral.h>
|
||||
#include <type_traits>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
@ -21,7 +22,7 @@
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template<class _InputIterator, class _Size, class _OutputIterator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
typename enable_if
|
||||
<
|
||||
__is_cpp17_input_iterator<_InputIterator>::value &&
|
||||
@ -47,7 +48,7 @@ copy_n(_InputIterator __first, _Size __orig_n, _OutputIterator __result)
|
||||
}
|
||||
|
||||
template<class _InputIterator, class _Size, class _OutputIterator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
typename enable_if
|
||||
<
|
||||
__is_cpp17_random_access_iterator<_InputIterator>::value,
|
||||
|
@ -20,7 +20,7 @@
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _InputIterator, class _Tp>
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
typename iterator_traits<_InputIterator>::difference_type
|
||||
count(_InputIterator __first, _InputIterator __last, const _Tp& __value) {
|
||||
typename iterator_traits<_InputIterator>::difference_type __r(0);
|
||||
|
@ -20,7 +20,7 @@
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _InputIterator, class _Predicate>
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
typename iterator_traits<_InputIterator>::difference_type
|
||||
count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred) {
|
||||
typename iterator_traits<_InputIterator>::difference_type __r(0);
|
||||
|
@ -22,7 +22,7 @@
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 bool
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
|
||||
equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _BinaryPredicate __pred) {
|
||||
for (; __first1 != __last1; ++__first1, (void)++__first2)
|
||||
if (!__pred(*__first1, *__first2))
|
||||
@ -31,16 +31,14 @@ equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first
|
||||
}
|
||||
|
||||
template <class _InputIterator1, class _InputIterator2>
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 bool
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
|
||||
equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2) {
|
||||
typedef typename iterator_traits<_InputIterator1>::value_type __v1;
|
||||
typedef typename iterator_traits<_InputIterator2>::value_type __v2;
|
||||
return _VSTD::equal(__first1, __last1, __first2, __equal_to<__v1, __v2>());
|
||||
return std::equal(__first1, __last1, __first2, __equal_to());
|
||||
}
|
||||
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
template <class _BinaryPredicate, class _InputIterator1, class _InputIterator2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 bool
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
|
||||
__equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2,
|
||||
_BinaryPredicate __pred, input_iterator_tag, input_iterator_tag) {
|
||||
for (; __first1 != __last1 && __first2 != __last2; ++__first1, (void)++__first2)
|
||||
@ -50,7 +48,7 @@ __equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __fir
|
||||
}
|
||||
|
||||
template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 bool
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
|
||||
__equal(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1, _RandomAccessIterator2 __first2,
|
||||
_RandomAccessIterator2 __last2, _BinaryPredicate __pred, random_access_iterator_tag,
|
||||
random_access_iterator_tag) {
|
||||
@ -61,7 +59,7 @@ __equal(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1, _Random
|
||||
}
|
||||
|
||||
template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate>
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 bool
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
|
||||
equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2,
|
||||
_BinaryPredicate __pred) {
|
||||
return _VSTD::__equal<_BinaryPredicate&>(
|
||||
@ -70,13 +68,16 @@ equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first
|
||||
}
|
||||
|
||||
template <class _InputIterator1, class _InputIterator2>
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 bool
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 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());
|
||||
return std::__equal(
|
||||
__first1,
|
||||
__last1,
|
||||
__first2,
|
||||
__last2,
|
||||
__equal_to(),
|
||||
typename iterator_traits<_InputIterator1>::iterator_category(),
|
||||
typename iterator_traits<_InputIterator2>::iterator_category());
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -34,7 +34,7 @@
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _AlgPolicy, class _Compare, class _Iter, class _Sent, class _Tp, class _Proj>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 pair<_Iter, _Iter>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_Iter, _Iter>
|
||||
__equal_range(_Iter __first, _Sent __last, const _Tp& __value, _Compare&& __comp, _Proj&& __proj) {
|
||||
auto __len = _IterOps<_AlgPolicy>::distance(__first, __last);
|
||||
_Iter __end = _IterOps<_AlgPolicy>::next(__first, __last);
|
||||
@ -58,19 +58,22 @@ __equal_range(_Iter __first, _Sent __last, const _Tp& __value, _Compare&& __comp
|
||||
}
|
||||
|
||||
template <class _ForwardIterator, class _Tp, class _Compare>
|
||||
_LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 pair<_ForwardIterator, _ForwardIterator>
|
||||
_LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_ForwardIterator, _ForwardIterator>
|
||||
equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, _Compare __comp) {
|
||||
static_assert(__is_callable<_Compare, decltype(*__first), const _Tp&>::value,
|
||||
"The comparator has to be callable");
|
||||
static_assert(is_copy_constructible<_ForwardIterator>::value,
|
||||
"Iterator has to be copy constructible");
|
||||
typedef typename __comp_ref_type<_Compare>::type _Comp_ref;
|
||||
return std::__equal_range<_ClassicAlgPolicy>(
|
||||
std::move(__first), std::move(__last), __value, static_cast<_Comp_ref>(__comp), std::__identity());
|
||||
std::move(__first),
|
||||
std::move(__last),
|
||||
__value,
|
||||
static_cast<__comp_ref_type<_Compare> >(__comp),
|
||||
std::__identity());
|
||||
}
|
||||
|
||||
template <class _ForwardIterator, class _Tp>
|
||||
_LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 pair<_ForwardIterator, _ForwardIterator>
|
||||
_LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_ForwardIterator, _ForwardIterator>
|
||||
equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) {
|
||||
return std::equal_range(
|
||||
std::move(__first),
|
||||
|
@ -23,7 +23,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD
|
||||
// fill isn't specialized for std::memset, because the compiler already optimizes the loop to a call to std::memset.
|
||||
|
||||
template <class _ForwardIterator, class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
void
|
||||
__fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, forward_iterator_tag)
|
||||
{
|
||||
@ -32,7 +32,7 @@ __fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, fo
|
||||
}
|
||||
|
||||
template <class _RandomAccessIterator, class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
void
|
||||
__fill(_RandomAccessIterator __first, _RandomAccessIterator __last, const _Tp& __value, random_access_iterator_tag)
|
||||
{
|
||||
@ -40,7 +40,7 @@ __fill(_RandomAccessIterator __first, _RandomAccessIterator __last, const _Tp& _
|
||||
}
|
||||
|
||||
template <class _ForwardIterator, class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
void
|
||||
fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value)
|
||||
{
|
||||
|
@ -11,6 +11,7 @@
|
||||
|
||||
#include <__config>
|
||||
#include <__iterator/iterator_traits.h>
|
||||
#include <__utility/convert_to_integral.h>
|
||||
#include <type_traits>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
@ -22,7 +23,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD
|
||||
// fill_n isn't specialized for std::memset, because the compiler already optimizes the loop to a call to std::memset.
|
||||
|
||||
template <class _OutputIterator, class _Size, class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
_OutputIterator
|
||||
__fill_n(_OutputIterator __first, _Size __n, const _Tp& __value)
|
||||
{
|
||||
@ -32,7 +33,7 @@ __fill_n(_OutputIterator __first, _Size __n, const _Tp& __value)
|
||||
}
|
||||
|
||||
template <class _OutputIterator, class _Size, class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
_OutputIterator
|
||||
fill_n(_OutputIterator __first, _Size __n, const _Tp& __value)
|
||||
{
|
||||
|
@ -19,7 +19,7 @@
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _InputIterator, class _Tp>
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 _InputIterator
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 _InputIterator
|
||||
find(_InputIterator __first, _InputIterator __last, const _Tp& __value) {
|
||||
for (; __first != __last; ++__first)
|
||||
if (*__first == __value)
|
||||
|
@ -37,7 +37,7 @@ template <
|
||||
class _Pred,
|
||||
class _Proj1,
|
||||
class _Proj2>
|
||||
_LIBCPP_HIDE_FROM_ABI inline _LIBCPP_CONSTEXPR_AFTER_CXX11 pair<_Iter1, _Iter1> __find_end_impl(
|
||||
_LIBCPP_HIDE_FROM_ABI inline _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_Iter1, _Iter1> __find_end_impl(
|
||||
_Iter1 __first1,
|
||||
_Sent1 __last1,
|
||||
_Iter2 __first2,
|
||||
@ -91,7 +91,7 @@ template <
|
||||
class _Sent2,
|
||||
class _Proj1,
|
||||
class _Proj2>
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX17 _Iter1 __find_end(
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _Iter1 __find_end(
|
||||
_Iter1 __first1,
|
||||
_Sent1 __sent1,
|
||||
_Iter2 __first2,
|
||||
@ -144,7 +144,7 @@ template <
|
||||
class _Sent2,
|
||||
class _Proj1,
|
||||
class _Proj2>
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11 _Iter1 __find_end(
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _Iter1 __find_end(
|
||||
_Iter1 __first1,
|
||||
_Sent1 __sent1,
|
||||
_Iter2 __first2,
|
||||
@ -189,7 +189,7 @@ _LIBCPP_CONSTEXPR_AFTER_CXX11 _Iter1 __find_end(
|
||||
}
|
||||
|
||||
template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
|
||||
_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14
|
||||
_ForwardIterator1 __find_end_classic(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
|
||||
_ForwardIterator2 __first2, _ForwardIterator2 __last2,
|
||||
_BinaryPredicate& __pred) {
|
||||
@ -208,7 +208,7 @@ _ForwardIterator1 __find_end_classic(_ForwardIterator1 __first1, _ForwardIterato
|
||||
}
|
||||
|
||||
template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
_ForwardIterator1 find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
|
||||
_ForwardIterator2 __first2, _ForwardIterator2 __last2,
|
||||
_BinaryPredicate __pred) {
|
||||
@ -216,12 +216,10 @@ _ForwardIterator1 find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1
|
||||
}
|
||||
|
||||
template <class _ForwardIterator1, class _ForwardIterator2>
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
_ForwardIterator1 find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1,
|
||||
_ForwardIterator2 __first2, _ForwardIterator2 __last2) {
|
||||
using __v1 = typename iterator_traits<_ForwardIterator1>::value_type;
|
||||
using __v2 = typename iterator_traits<_ForwardIterator2>::value_type;
|
||||
return std::find_end(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
|
||||
return std::find_end(__first1, __last1, __first2, __last2, __equal_to());
|
||||
}
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
@ -21,7 +21,8 @@
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11 _ForwardIterator1 __find_first_of_ce(_ForwardIterator1 __first1,
|
||||
_LIBCPP_HIDE_FROM_ABI
|
||||
_LIBCPP_CONSTEXPR_SINCE_CXX14 _ForwardIterator1 __find_first_of_ce(_ForwardIterator1 __first1,
|
||||
_ForwardIterator1 __last1,
|
||||
_ForwardIterator2 __first2,
|
||||
_ForwardIterator2 __last2,
|
||||
@ -34,18 +35,16 @@ _LIBCPP_CONSTEXPR_AFTER_CXX11 _ForwardIterator1 __find_first_of_ce(_ForwardItera
|
||||
}
|
||||
|
||||
template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator1
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator1
|
||||
find_first_of(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2,
|
||||
_ForwardIterator2 __last2, _BinaryPredicate __pred) {
|
||||
return _VSTD::__find_first_of_ce(__first1, __last1, __first2, __last2, __pred);
|
||||
}
|
||||
|
||||
template <class _ForwardIterator1, class _ForwardIterator2>
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator1 find_first_of(
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator1 find_first_of(
|
||||
_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::__find_first_of_ce(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>());
|
||||
return std::__find_first_of_ce(__first1, __last1, __first2, __last2, __equal_to());
|
||||
}
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
@ -19,7 +19,7 @@
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _InputIterator, class _Predicate>
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 _InputIterator
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 _InputIterator
|
||||
find_if(_InputIterator __first, _InputIterator __last, _Predicate __pred) {
|
||||
for (; __first != __last; ++__first)
|
||||
if (__pred(*__first))
|
||||
|
@ -19,7 +19,7 @@
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _InputIterator, class _Predicate>
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 _InputIterator
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 _InputIterator
|
||||
find_if_not(_InputIterator __first, _InputIterator __last, _Predicate __pred) {
|
||||
for (; __first != __last; ++__first)
|
||||
if (!__pred(*__first))
|
||||
|
@ -19,7 +19,7 @@
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _InputIterator, class _Function>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 _Function for_each(_InputIterator __first,
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 _Function for_each(_InputIterator __first,
|
||||
_InputIterator __last,
|
||||
_Function __f) {
|
||||
for (; __first != __last; ++__first)
|
||||
|
@ -11,6 +11,7 @@
|
||||
#define _LIBCPP___ALGORITHM_FOR_EACH_N_H
|
||||
|
||||
#include <__config>
|
||||
#include <__utility/convert_to_integral.h>
|
||||
#include <type_traits>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
@ -22,7 +23,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD
|
||||
#if _LIBCPP_STD_VER > 14
|
||||
|
||||
template <class _InputIterator, class _Size, class _Function>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 _InputIterator for_each_n(_InputIterator __first,
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 _InputIterator for_each_n(_InputIterator __first,
|
||||
_Size __orig_n,
|
||||
_Function __f) {
|
||||
typedef decltype(_VSTD::__convert_to_integral(__orig_n)) _IntegralSize;
|
||||
|
@ -18,7 +18,7 @@
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _ForwardIterator, class _Generator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
void
|
||||
generate(_ForwardIterator __first, _ForwardIterator __last, _Generator __gen)
|
||||
{
|
||||
|
@ -10,6 +10,7 @@
|
||||
#define _LIBCPP___ALGORITHM_GENERATE_N_H
|
||||
|
||||
#include <__config>
|
||||
#include <__utility/convert_to_integral.h>
|
||||
#include <type_traits>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
@ -19,7 +20,7 @@
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _OutputIterator, class _Size, class _Generator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
_OutputIterator
|
||||
generate_n(_OutputIterator __first, _Size __orig_n, _Generator __gen)
|
||||
{
|
||||
|
@ -29,7 +29,7 @@ typename enable_if
|
||||
>::type
|
||||
__half_positive(_Integral __value)
|
||||
{
|
||||
return static_cast<_Integral>(static_cast<typename make_unsigned<_Integral>::type>(__value) / 2);
|
||||
return static_cast<_Integral>(static_cast<__make_unsigned_t<_Integral> >(__value) / 2);
|
||||
}
|
||||
|
||||
template <typename _Tp>
|
||||
|
@ -18,7 +18,7 @@
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
#if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_INCOMPLETE_RANGES)
|
||||
#if _LIBCPP_STD_VER > 17
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
@ -44,6 +44,6 @@ struct in_found_result {
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_INCOMPLETE_RANGES)
|
||||
#endif // _LIBCPP_STD_VER > 17
|
||||
|
||||
#endif // _LIBCPP___ALGORITHM_IN_FOUND_RESULT_H
|
||||
|
@ -20,7 +20,7 @@
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
#if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_INCOMPLETE_RANGES)
|
||||
#if _LIBCPP_STD_VER > 17
|
||||
|
||||
namespace ranges {
|
||||
template <class _InIter1, class _Func1>
|
||||
@ -42,7 +42,7 @@ struct in_fun_result {
|
||||
};
|
||||
} // namespace ranges
|
||||
|
||||
#endif // _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_INCOMPLETE_RANGES)
|
||||
#endif // _LIBCPP_STD_VER > 17
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
|
@ -20,7 +20,7 @@
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
#if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_INCOMPLETE_RANGES)
|
||||
#if _LIBCPP_STD_VER > 17
|
||||
|
||||
namespace ranges {
|
||||
|
||||
@ -49,7 +49,7 @@ struct in_in_out_result {
|
||||
|
||||
} // namespace ranges
|
||||
|
||||
#endif // _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_INCOMPLETE_RANGES)
|
||||
#endif // _LIBCPP_STD_VER > 17
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
|
@ -20,7 +20,7 @@
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
#if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_INCOMPLETE_RANGES)
|
||||
#if _LIBCPP_STD_VER > 17
|
||||
|
||||
namespace ranges {
|
||||
|
||||
@ -46,7 +46,7 @@ struct in_in_result {
|
||||
|
||||
} // namespace ranges
|
||||
|
||||
#endif // _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_INCOMPLETE_RANGES)
|
||||
#endif // _LIBCPP_STD_VER > 17
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
|
@ -20,7 +20,7 @@
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
#if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_INCOMPLETE_RANGES)
|
||||
#if _LIBCPP_STD_VER > 17
|
||||
|
||||
namespace ranges {
|
||||
template <class _InIter1, class _OutIter1, class _OutIter2>
|
||||
@ -47,7 +47,7 @@ struct in_out_out_result {
|
||||
};
|
||||
} // namespace ranges
|
||||
|
||||
#endif // _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_INCOMPLETE_RANGES)
|
||||
#endif // _LIBCPP_STD_VER > 17
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
|
@ -20,7 +20,7 @@
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
#if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_INCOMPLETE_RANGES)
|
||||
#if _LIBCPP_STD_VER > 17
|
||||
|
||||
namespace ranges {
|
||||
|
||||
@ -46,7 +46,7 @@ struct in_out_result {
|
||||
|
||||
} // namespace ranges
|
||||
|
||||
#endif // _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_INCOMPLETE_RANGES)
|
||||
#endif // _LIBCPP_STD_VER > 17
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
|
@ -25,7 +25,7 @@
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _Iter1, class _Sent1, class _Iter2, class _Sent2, class _Comp, class _Proj1, class _Proj2>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 bool
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
|
||||
__includes(_Iter1 __first1, _Sent1 __last1, _Iter2 __first2, _Sent2 __last2,
|
||||
_Comp&& __comp, _Proj1&& __proj1, _Proj2&& __proj2) {
|
||||
for (; __first2 != __last2; ++__first1) {
|
||||
@ -39,7 +39,7 @@ __includes(_Iter1 __first1, _Sent1 __last1, _Iter2 __first2, _Sent2 __last2,
|
||||
}
|
||||
|
||||
template <class _InputIterator1, class _InputIterator2, class _Compare>
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 bool includes(
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool includes(
|
||||
_InputIterator1 __first1,
|
||||
_InputIterator1 __last1,
|
||||
_InputIterator2 __first2,
|
||||
@ -48,14 +48,18 @@ _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
static_assert(__is_callable<_Compare, decltype(*__first1), decltype(*__first2)>::value,
|
||||
"Comparator has to be callable");
|
||||
|
||||
typedef typename __comp_ref_type<_Compare>::type _Comp_ref;
|
||||
return std::__includes(
|
||||
std::move(__first1), std::move(__last1), std::move(__first2), std::move(__last2),
|
||||
static_cast<_Comp_ref>(__comp), __identity(), __identity());
|
||||
std::move(__first1),
|
||||
std::move(__last1),
|
||||
std::move(__first2),
|
||||
std::move(__last2),
|
||||
static_cast<__comp_ref_type<_Compare> >(__comp),
|
||||
__identity(),
|
||||
__identity());
|
||||
}
|
||||
|
||||
template <class _InputIterator1, class _InputIterator2>
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 bool
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
|
||||
includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2) {
|
||||
return std::includes(
|
||||
std::move(__first1),
|
||||
|
@ -23,7 +23,11 @@
|
||||
#include <__iterator/distance.h>
|
||||
#include <__iterator/iterator_traits.h>
|
||||
#include <__iterator/reverse_iterator.h>
|
||||
#include <memory>
|
||||
#include <__memory/destruct_n.h>
|
||||
#include <__memory/temporary_buffer.h>
|
||||
#include <__memory/unique_ptr.h>
|
||||
#include <__utility/pair.h>
|
||||
#include <new>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
@ -56,6 +60,7 @@ public:
|
||||
|
||||
template <class _AlgPolicy, class _Compare, class _InputIterator1, class _Sent1,
|
||||
class _InputIterator2, class _Sent2, class _OutputIterator>
|
||||
_LIBCPP_HIDE_FROM_ABI
|
||||
void __half_inplace_merge(_InputIterator1 __first1, _Sent1 __last1,
|
||||
_InputIterator2 __first2, _Sent2 __last2,
|
||||
_OutputIterator __result, _Compare&& __comp)
|
||||
@ -83,6 +88,7 @@ void __half_inplace_merge(_InputIterator1 __first1, _Sent1 __last1,
|
||||
}
|
||||
|
||||
template <class _AlgPolicy, class _Compare, class _BidirectionalIterator>
|
||||
_LIBCPP_HIDE_FROM_ABI
|
||||
void __buffered_inplace_merge(
|
||||
_BidirectionalIterator __first,
|
||||
_BidirectionalIterator __middle,
|
||||
@ -231,9 +237,8 @@ _LIBCPP_SUPPRESS_DEPRECATED_POP
|
||||
template <class _BidirectionalIterator, class _Compare>
|
||||
inline _LIBCPP_HIDE_FROM_ABI void inplace_merge(
|
||||
_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last, _Compare __comp) {
|
||||
typedef typename __comp_ref_type<_Compare>::type _Comp_ref;
|
||||
std::__inplace_merge<_ClassicAlgPolicy>(
|
||||
std::move(__first), std::move(__middle), std::move(__last), static_cast<_Comp_ref>(__comp));
|
||||
std::move(__first), std::move(__middle), std::move(__last), static_cast<__comp_ref_type<_Compare> >(__comp));
|
||||
}
|
||||
|
||||
template <class _BidirectionalIterator>
|
||||
|
@ -23,17 +23,16 @@ _LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _RandomAccessIterator, class _Compare>
|
||||
_LIBCPP_NODISCARD_EXT inline
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
bool
|
||||
is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
|
||||
{
|
||||
typedef typename __comp_ref_type<_Compare>::type _Comp_ref;
|
||||
return std::__is_heap_until(__first, __last, static_cast<_Comp_ref>(__comp)) == __last;
|
||||
return std::__is_heap_until(__first, __last, static_cast<__comp_ref_type<_Compare> >(__comp)) == __last;
|
||||
}
|
||||
|
||||
template<class _RandomAccessIterator>
|
||||
_LIBCPP_NODISCARD_EXT inline
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
bool
|
||||
is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
|
||||
{
|
||||
|
@ -21,7 +21,7 @@
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _Compare, class _RandomAccessIterator>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 _RandomAccessIterator
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _RandomAccessIterator
|
||||
__is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare&& __comp)
|
||||
{
|
||||
typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
|
||||
@ -48,15 +48,14 @@ __is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last, _Co
|
||||
}
|
||||
|
||||
template <class _RandomAccessIterator, class _Compare>
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 _RandomAccessIterator
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _RandomAccessIterator
|
||||
is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
|
||||
{
|
||||
typedef typename __comp_ref_type<_Compare>::type _Comp_ref;
|
||||
return std::__is_heap_until(__first, __last, static_cast<_Comp_ref>(__comp));
|
||||
return std::__is_heap_until(__first, __last, static_cast<__comp_ref_type<_Compare> >(__comp));
|
||||
}
|
||||
|
||||
template<class _RandomAccessIterator>
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 _RandomAccessIterator
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _RandomAccessIterator
|
||||
is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last)
|
||||
{
|
||||
return _VSTD::__is_heap_until(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
|
||||
|
@ -18,7 +18,7 @@
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _InputIterator, class _Predicate>
|
||||
_LIBCPP_NODISCARD_EXT _LIBCPP_CONSTEXPR_AFTER_CXX17 bool
|
||||
_LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
|
||||
is_partitioned(_InputIterator __first, _InputIterator __last, _Predicate __pred)
|
||||
{
|
||||
for (; __first != __last; ++__first)
|
||||
|
@ -55,7 +55,7 @@ struct _ConstTimeDistance<_Iter1, _Iter1, _Iter2, _Iter2, __enable_if_t<
|
||||
template <class _AlgPolicy,
|
||||
class _Iter1, class _Sent1, class _Iter2, class _Sent2,
|
||||
class _Proj1, class _Proj2, class _Pred>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 bool
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
|
||||
__is_permutation_impl(_Iter1 __first1, _Sent1 __last1, _Iter2 __first2, _Sent2 __last2,
|
||||
_Pred&& __pred, _Proj1&& __proj1, _Proj2&& __proj2) {
|
||||
using _D1 = __iter_diff_t<_Iter1>;
|
||||
@ -94,7 +94,7 @@ __is_permutation_impl(_Iter1 __first1, _Sent1 __last1, _Iter2 __first2, _Sent2 _
|
||||
|
||||
// 2+1 iterators, predicate. Not used by range algorithms.
|
||||
template <class _AlgPolicy, class _ForwardIterator1, class _Sentinel1, class _ForwardIterator2, class _BinaryPredicate>
|
||||
_LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 bool
|
||||
_LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
|
||||
__is_permutation(_ForwardIterator1 __first1, _Sentinel1 __last1, _ForwardIterator2 __first2,
|
||||
_BinaryPredicate&& __pred) {
|
||||
// Shorten sequences as much as possible by lopping of any equal prefix.
|
||||
@ -122,7 +122,7 @@ __is_permutation(_ForwardIterator1 __first1, _Sentinel1 __last1, _ForwardIterato
|
||||
template <class _AlgPolicy,
|
||||
class _Iter1, class _Sent1, class _Iter2, class _Sent2,
|
||||
class _Proj1, class _Proj2, class _Pred>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 bool
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
|
||||
__is_permutation(_Iter1 __first1, _Sent1 __last1, _Iter2 __first2, _Sent2 __last2,
|
||||
_Pred&& __pred, _Proj1&& __proj1, _Proj2&& __proj2,
|
||||
/*_ConstTimeDistance=*/false_type) {
|
||||
@ -156,7 +156,7 @@ __is_permutation(_Iter1 __first1, _Sent1 __last1, _Iter2 __first2, _Sent2 __last
|
||||
template <class _AlgPolicy,
|
||||
class _Iter1, class _Sent1, class _Iter2, class _Sent2,
|
||||
class _Proj1, class _Proj2, class _Pred>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 bool
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
|
||||
__is_permutation(_Iter1 __first1, _Sent1 __last1, _Iter2 __first2, _Sent2 __last2,
|
||||
_Pred&& __pred, _Proj1&& __proj1, _Proj2&& __proj2,
|
||||
/*_ConstTimeDistance=*/true_type) {
|
||||
@ -172,7 +172,7 @@ __is_permutation(_Iter1 __first1, _Sent1 __last1, _Iter2 __first2, _Sent2 __last
|
||||
template <class _AlgPolicy,
|
||||
class _Iter1, class _Sent1, class _Iter2, class _Sent2,
|
||||
class _Proj1, class _Proj2, class _Pred>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 bool
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
|
||||
__is_permutation(_Iter1 __first1, _Sent1 __last1, _Iter2 __first2, _Sent2 __last2,
|
||||
_Pred&& __pred, _Proj1&& __proj1, _Proj2&& __proj2) {
|
||||
return std::__is_permutation<_AlgPolicy>(
|
||||
@ -185,7 +185,7 @@ __is_permutation(_Iter1 __first1, _Sent1 __last1, _Iter2 __first2, _Sent2 __last
|
||||
|
||||
// 2+1 iterators, predicate
|
||||
template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
|
||||
_LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 bool
|
||||
_LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
|
||||
is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2,
|
||||
_BinaryPredicate __pred) {
|
||||
static_assert(__is_callable<_BinaryPredicate, decltype(*__first1), decltype(*__first2)>::value,
|
||||
@ -197,31 +197,30 @@ is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIt
|
||||
|
||||
// 2+1 iterators
|
||||
template <class _ForwardIterator1, class _ForwardIterator2>
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 bool
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
|
||||
is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2) {
|
||||
using __v1 = __iter_value_type<_ForwardIterator1>;
|
||||
using __v2 = __iter_value_type<_ForwardIterator2>;
|
||||
return std::is_permutation(__first1, __last1, __first2, __equal_to<__v1, __v2>());
|
||||
return std::is_permutation(__first1, __last1, __first2, __equal_to());
|
||||
}
|
||||
|
||||
#if _LIBCPP_STD_VER > 11
|
||||
|
||||
// 2+2 iterators
|
||||
template <class _ForwardIterator1, class _ForwardIterator2>
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 bool
|
||||
is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2,
|
||||
_ForwardIterator2 __last2) {
|
||||
using __v1 = __iter_value_type<_ForwardIterator1>;
|
||||
using __v2 = __iter_value_type<_ForwardIterator2>;
|
||||
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool is_permutation(
|
||||
_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2, _ForwardIterator2 __last2) {
|
||||
return std::__is_permutation<_ClassicAlgPolicy>(
|
||||
std::move(__first1), std::move(__last1), std::move(__first2), std::move(__last2),
|
||||
__equal_to<__v1, __v2>(), __identity(), __identity());
|
||||
std::move(__first1),
|
||||
std::move(__last1),
|
||||
std::move(__first2),
|
||||
std::move(__last2),
|
||||
__equal_to(),
|
||||
__identity(),
|
||||
__identity());
|
||||
}
|
||||
|
||||
// 2+2 iterators, predicate
|
||||
template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate>
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 bool
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
|
||||
is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2,
|
||||
_ForwardIterator2 __last2, _BinaryPredicate __pred) {
|
||||
static_assert(__is_callable<_BinaryPredicate, decltype(*__first1), decltype(*__first2)>::value,
|
||||
|
@ -23,17 +23,16 @@ _LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _ForwardIterator, class _Compare>
|
||||
_LIBCPP_NODISCARD_EXT inline
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
bool
|
||||
is_sorted(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
|
||||
{
|
||||
typedef typename __comp_ref_type<_Compare>::type _Comp_ref;
|
||||
return _VSTD::__is_sorted_until<_Comp_ref>(__first, __last, __comp) == __last;
|
||||
return _VSTD::__is_sorted_until<__comp_ref_type<_Compare> >(__first, __last, __comp) == __last;
|
||||
}
|
||||
|
||||
template<class _ForwardIterator>
|
||||
_LIBCPP_NODISCARD_EXT inline
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
bool
|
||||
is_sorted(_ForwardIterator __first, _ForwardIterator __last)
|
||||
{
|
||||
|
@ -21,7 +21,7 @@
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _Compare, class _ForwardIterator>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator
|
||||
__is_sorted_until(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
|
||||
{
|
||||
if (__first != __last)
|
||||
@ -38,15 +38,14 @@ __is_sorted_until(_ForwardIterator __first, _ForwardIterator __last, _Compare __
|
||||
}
|
||||
|
||||
template <class _ForwardIterator, class _Compare>
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator
|
||||
is_sorted_until(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
|
||||
{
|
||||
typedef typename __comp_ref_type<_Compare>::type _Comp_ref;
|
||||
return _VSTD::__is_sorted_until<_Comp_ref>(__first, __last, __comp);
|
||||
return _VSTD::__is_sorted_until<__comp_ref_type<_Compare> >(__first, __last, __comp);
|
||||
}
|
||||
|
||||
template<class _ForwardIterator>
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator
|
||||
is_sorted_until(_ForwardIterator __first, _ForwardIterator __last)
|
||||
{
|
||||
return _VSTD::is_sorted_until(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>());
|
||||
|
@ -20,10 +20,10 @@
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _ForwardIterator1, class _ForwardIterator2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 void iter_swap(_ForwardIterator1 __a,
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 void iter_swap(_ForwardIterator1 __a,
|
||||
_ForwardIterator2 __b)
|
||||
// _NOEXCEPT_(_NOEXCEPT_(swap(*__a, *__b)))
|
||||
_NOEXCEPT_(_NOEXCEPT_(swap(*declval<_ForwardIterator1>(), *declval<_ForwardIterator2>()))) {
|
||||
_NOEXCEPT_(_NOEXCEPT_(swap(*std::declval<_ForwardIterator1>(), *std::declval<_ForwardIterator2>()))) {
|
||||
swap(*__a, *__b);
|
||||
}
|
||||
|
||||
|
@ -21,10 +21,13 @@
|
||||
#include <__iterator/next.h>
|
||||
#include <__iterator/prev.h>
|
||||
#include <__iterator/readable_traits.h>
|
||||
#include <__type_traits/enable_if.h>
|
||||
#include <__type_traits/is_reference.h>
|
||||
#include <__type_traits/is_same.h>
|
||||
#include <__type_traits/remove_cvref.h>
|
||||
#include <__utility/declval.h>
|
||||
#include <__utility/forward.h>
|
||||
#include <__utility/move.h>
|
||||
#include <type_traits>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
@ -34,7 +37,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _AlgPolicy> struct _IterOps;
|
||||
|
||||
#if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_INCOMPLETE_RANGES)
|
||||
#if _LIBCPP_STD_VER > 17
|
||||
struct _RangeAlgPolicy {};
|
||||
|
||||
template <>
|
||||
@ -76,14 +79,14 @@ struct _IterOps<_ClassicAlgPolicy> {
|
||||
|
||||
// advance
|
||||
template <class _Iter, class _Distance>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14
|
||||
static void advance(_Iter& __iter, _Distance __count) {
|
||||
std::advance(__iter, __count);
|
||||
}
|
||||
|
||||
// distance
|
||||
template <class _Iter>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14
|
||||
static typename iterator_traits<_Iter>::difference_type distance(_Iter __first, _Iter __last) {
|
||||
return std::distance(__first, __last);
|
||||
}
|
||||
@ -95,9 +98,9 @@ struct _IterOps<_ClassicAlgPolicy> {
|
||||
using __move_t = decltype(std::move(*std::declval<_Iter&>()));
|
||||
|
||||
template <class _Iter>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14
|
||||
static void __validate_iter_reference() {
|
||||
static_assert(is_same<__deref_t<_Iter>, typename iterator_traits<__uncvref_t<_Iter> >::reference>::value,
|
||||
static_assert(is_same<__deref_t<_Iter>, typename iterator_traits<__remove_cvref_t<_Iter> >::reference>::value,
|
||||
"It looks like your iterator's `iterator_traits<It>::reference` does not match the return type of "
|
||||
"dereferencing the iterator, i.e., calling `*it`. This is undefined behavior according to [input.iterators] "
|
||||
"and can lead to dangling reference issues at runtime, so we are flagging this.");
|
||||
@ -105,7 +108,7 @@ struct _IterOps<_ClassicAlgPolicy> {
|
||||
|
||||
// iter_move
|
||||
template <class _Iter>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 static
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 static
|
||||
// If the result of dereferencing `_Iter` is a reference type, deduce the result of calling `std::move` on it. Note
|
||||
// that the C++03 mode doesn't support `decltype(auto)` as the return type.
|
||||
__enable_if_t<
|
||||
@ -118,7 +121,7 @@ struct _IterOps<_ClassicAlgPolicy> {
|
||||
}
|
||||
|
||||
template <class _Iter>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 static
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 static
|
||||
// If the result of dereferencing `_Iter` is a value type, deduce the return value of this function to also be a
|
||||
// value -- otherwise, after `operator*` returns a temporary, this function would return a dangling reference to that
|
||||
// temporary. Note that the C++03 mode doesn't support `auto` as the return type.
|
||||
@ -133,35 +136,35 @@ struct _IterOps<_ClassicAlgPolicy> {
|
||||
|
||||
// iter_swap
|
||||
template <class _Iter1, class _Iter2>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14
|
||||
static void iter_swap(_Iter1&& __a, _Iter2&& __b) {
|
||||
std::iter_swap(std::forward<_Iter1>(__a), std::forward<_Iter2>(__b));
|
||||
}
|
||||
|
||||
// next
|
||||
template <class _Iterator>
|
||||
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR_SINCE_CXX14
|
||||
_Iterator next(_Iterator, _Iterator __last) {
|
||||
return __last;
|
||||
}
|
||||
|
||||
template <class _Iter>
|
||||
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
__uncvref_t<_Iter> next(_Iter&& __it,
|
||||
typename iterator_traits<__uncvref_t<_Iter> >::difference_type __n = 1) {
|
||||
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR_SINCE_CXX14
|
||||
__remove_cvref_t<_Iter> next(_Iter&& __it,
|
||||
typename iterator_traits<__remove_cvref_t<_Iter> >::difference_type __n = 1) {
|
||||
return std::next(std::forward<_Iter>(__it), __n);
|
||||
}
|
||||
|
||||
// prev
|
||||
template <class _Iter>
|
||||
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
__uncvref_t<_Iter> prev(_Iter&& __iter,
|
||||
typename iterator_traits<__uncvref_t<_Iter> >::difference_type __n = 1) {
|
||||
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR_SINCE_CXX14
|
||||
__remove_cvref_t<_Iter> prev(_Iter&& __iter,
|
||||
typename iterator_traits<__remove_cvref_t<_Iter> >::difference_type __n = 1) {
|
||||
return std::prev(std::forward<_Iter>(__iter), __n);
|
||||
}
|
||||
|
||||
template <class _Iter>
|
||||
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR_SINCE_CXX14
|
||||
void __advance_to(_Iter& __first, _Iter __last) {
|
||||
__first = __last;
|
||||
}
|
||||
|
@ -21,7 +21,7 @@
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _Compare, class _InputIterator1, class _InputIterator2>
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool
|
||||
__lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||
_InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp)
|
||||
{
|
||||
@ -37,18 +37,17 @@ __lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||
|
||||
template <class _InputIterator1, class _InputIterator2, class _Compare>
|
||||
_LIBCPP_NODISCARD_EXT inline
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
bool
|
||||
lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||
_InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp)
|
||||
{
|
||||
typedef typename __comp_ref_type<_Compare>::type _Comp_ref;
|
||||
return _VSTD::__lexicographical_compare<_Comp_ref>(__first1, __last1, __first2, __last2, __comp);
|
||||
return _VSTD::__lexicographical_compare<__comp_ref_type<_Compare> >(__first1, __last1, __first2, __last2, __comp);
|
||||
}
|
||||
|
||||
template <class _InputIterator1, class _InputIterator2>
|
||||
_LIBCPP_NODISCARD_EXT inline
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
bool
|
||||
lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||
_InputIterator2 __first2, _InputIterator2 __last2)
|
||||
|
@ -29,7 +29,7 @@
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _AlgPolicy, class _Iter, class _Sent, class _Type, class _Proj, class _Comp>
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
_Iter __lower_bound_impl(_Iter __first, _Sent __last, const _Type& __value, _Comp& __comp, _Proj& __proj) {
|
||||
auto __len = _IterOps<_AlgPolicy>::distance(__first, __last);
|
||||
|
||||
@ -48,7 +48,7 @@ _Iter __lower_bound_impl(_Iter __first, _Sent __last, const _Type& __value, _Com
|
||||
}
|
||||
|
||||
template <class _ForwardIterator, class _Tp, class _Compare>
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
_ForwardIterator lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, _Compare __comp) {
|
||||
static_assert(__is_callable<_Compare, decltype(*__first), const _Tp&>::value,
|
||||
"The comparator has to be callable");
|
||||
@ -57,7 +57,7 @@ _ForwardIterator lower_bound(_ForwardIterator __first, _ForwardIterator __last,
|
||||
}
|
||||
|
||||
template <class _ForwardIterator, class _Tp>
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
_ForwardIterator lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) {
|
||||
return std::lower_bound(__first, __last, __value,
|
||||
__less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>());
|
||||
|
@ -24,10 +24,9 @@
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _AlgPolicy, class _Compare, class _RandomAccessIterator>
|
||||
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11
|
||||
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14
|
||||
void __make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare&& __comp) {
|
||||
using _CompRef = typename __comp_ref_type<_Compare>::type;
|
||||
_CompRef __comp_ref = __comp;
|
||||
__comp_ref_type<_Compare> __comp_ref = __comp;
|
||||
|
||||
using difference_type = typename iterator_traits<_RandomAccessIterator>::difference_type;
|
||||
difference_type __n = __last - __first;
|
||||
@ -40,13 +39,13 @@ void __make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _C
|
||||
}
|
||||
|
||||
template <class _RandomAccessIterator, class _Compare>
|
||||
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
void make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) {
|
||||
std::__make_heap<_ClassicAlgPolicy>(std::move(__first), std::move(__last), __comp);
|
||||
}
|
||||
|
||||
template <class _RandomAccessIterator>
|
||||
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20
|
||||
void make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last) {
|
||||
std::make_heap(std::move(__first), std::move(__last),
|
||||
__less<typename iterator_traits<_RandomAccessIterator>::value_type>());
|
||||
|
@ -93,7 +93,7 @@ __make_projected(_Pred& __pred, _Proj&) {
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_INCOMPLETE_RANGES)
|
||||
#if _LIBCPP_STD_VER > 17
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
@ -121,6 +121,6 @@ decltype(auto) __make_projected_comp(_Comp& __comp, _Proj1& __proj1, _Proj2& __p
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_INCOMPLETE_RANGES)
|
||||
#endif // _LIBCPP_STD_VER > 17
|
||||
|
||||
#endif // _LIBCPP___ALGORITHM_MAKE_PROJECTED_H
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user