Skip to content

Commit 17bbb22

Browse files
committed
[libc++][ranges] Implement the changes to vector from P1206 (ranges::to):
- add the `from_range_t` constructors and the related deduction guides; - add the `insert_range`/`assign_range`/etc. member functions. (Note: this patch is split from https://reviews.llvm.org/D142335) Differential Revision: https://reviews.llvm.org/D149826
1 parent c60461e commit 17bbb22

25 files changed

+2347
-196
lines changed

libcxx/docs/Status/Cxx2bPapers.csv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
"`P0323R12 <https://wg21.link/P0323R12>`__","LWG","``std::expected``","February 2022","|Complete|","16.0"
4242
"`P0533R9 <https://wg21.link/P0533R9>`__","LWG","``constexpr`` for ``<cmath>`` and ``<cstdlib>``","February 2022","|In progress| [#note-P0533R9]_",""
4343
"`P0627R6 <https://wg21.link/P0627R6>`__","LWG","Function to mark unreachable code","February 2022","|Complete|","15.0"
44-
"`P1206R7 <https://wg21.link/P1206R7>`__","LWG","``ranges::to``: A function to convert any range to a container","February 2022","","","|ranges|"
44+
"`P1206R7 <https://wg21.link/P1206R7>`__","LWG","``ranges::to``: A function to convert any range to a container","February 2022","|In Progress|","","|ranges|"
4545
"`P1413R3 <https://wg21.link/P1413R3>`__","LWG","Deprecate ``std::aligned_storage`` and ``std::aligned_union``","February 2022","|Complete| [#note-P1413R3]_",""
4646
"`P2255R2 <https://wg21.link/P2255R2>`__","LWG","A type trait to detect reference binding to temporary","February 2022","",""
4747
"`P2273R3 <https://wg21.link/P2273R3>`__","LWG","Making ``std::unique_ptr`` constexpr","February 2022","|Complete|","16.0"

libcxx/include/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -581,6 +581,7 @@ set(files
581581
__ranges/as_rvalue_view.h
582582
__ranges/common_view.h
583583
__ranges/concepts.h
584+
__ranges/container_compatible_range.h
584585
__ranges/copyable_box.h
585586
__ranges/counted.h
586587
__ranges/dangling.h
@@ -593,6 +594,7 @@ set(files
593594
__ranges/enable_borrowed_range.h
594595
__ranges/enable_view.h
595596
__ranges/filter_view.h
597+
__ranges/from_range.h
596598
__ranges/iota_view.h
597599
__ranges/istream_view.h
598600
__ranges/join_view.h
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// -*- C++ -*-
2+
//===----------------------------------------------------------------------===//
3+
//
4+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5+
// See https://llvm.org/LICENSE.txt for license information.
6+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7+
//
8+
//===----------------------------------------------------------------------===//
9+
10+
#ifndef _LIBCPP___RANGES_CONTAINER_COMPATIBLE_RANGE_H
11+
#define _LIBCPP___RANGES_CONTAINER_COMPATIBLE_RANGE_H
12+
13+
#include <__concepts/convertible_to.h>
14+
#include <__config>
15+
#include <__ranges/concepts.h>
16+
17+
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
18+
# pragma GCC system_header
19+
#endif
20+
21+
_LIBCPP_BEGIN_NAMESPACE_STD
22+
23+
#if _LIBCPP_STD_VER >= 23
24+
25+
template <class _Range, class _Tp>
26+
concept _ContainerCompatibleRange =
27+
ranges::input_range<_Range> && convertible_to<ranges::range_reference_t<_Range>, _Tp>;
28+
29+
#endif // _LIBCPP_STD_VER >= 23
30+
31+
_LIBCPP_END_NAMESPACE_STD
32+
33+
#endif // _LIBCPP___RANGES_CONTAINER_COMPATIBLE_RANGE_H

libcxx/include/__ranges/from_range.h

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// -*- C++ -*-
2+
//===----------------------------------------------------------------------===//
3+
//
4+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5+
// See https://llvm.org/LICENSE.txt for license information.
6+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7+
//
8+
//===----------------------------------------------------------------------===//
9+
10+
#ifndef _LIBCPP___RANGES_FROM_RANGE_H
11+
#define _LIBCPP___RANGES_FROM_RANGE_H
12+
13+
#include <__config>
14+
15+
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
16+
# pragma GCC system_header
17+
#endif
18+
19+
_LIBCPP_BEGIN_NAMESPACE_STD
20+
21+
#if _LIBCPP_STD_VER >= 23
22+
23+
struct from_range_t {
24+
explicit from_range_t() = default;
25+
};
26+
27+
inline constexpr from_range_t from_range{};
28+
29+
#endif // _LIBCPP_STD_VER >= 23
30+
31+
_LIBCPP_END_NAMESPACE_STD
32+
33+
#endif // _LIBCPP___RANGES_FROM_RANGE_H

libcxx/include/__split_buffer

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,14 @@ public:
170170
__enable_if_t<__is_cpp17_forward_iterator<_ForwardIterator>::value>
171171
__construct_at_end(_ForwardIterator __first, _ForwardIterator __last);
172172

173+
template <class _Iterator, class _Sentinel>
174+
_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI
175+
void __construct_at_end_with_sentinel(_Iterator __first, _Sentinel __last);
176+
177+
template <class _Iterator>
178+
_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI
179+
void __construct_at_end_with_size(_Iterator __first, size_type __n);
180+
173181
_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __destruct_at_begin(pointer __new_begin) {
174182
__destruct_at_begin(__new_begin, is_trivially_destructible<value_type>());
175183
}
@@ -279,6 +287,13 @@ template <class _InputIter>
279287
_LIBCPP_CONSTEXPR_SINCE_CXX20 __enable_if_t<__is_exactly_cpp17_input_iterator<_InputIter>::value>
280288
__split_buffer<_Tp, _Allocator>::__construct_at_end(_InputIter __first, _InputIter __last)
281289
{
290+
__construct_at_end_with_sentinel(__first, __last);
291+
}
292+
293+
template <class _Tp, class _Allocator>
294+
template <class _Iterator, class _Sentinel>
295+
_LIBCPP_CONSTEXPR_SINCE_CXX20
296+
void __split_buffer<_Tp, _Allocator>::__construct_at_end_with_sentinel(_Iterator __first, _Sentinel __last) {
282297
__alloc_rr& __a = this->__alloc();
283298
for (; __first != __last; ++__first)
284299
{
@@ -296,13 +311,19 @@ __split_buffer<_Tp, _Allocator>::__construct_at_end(_InputIter __first, _InputIt
296311
++this->__end_;
297312
}
298313
}
299-
300314
template <class _Tp, class _Allocator>
301315
template <class _ForwardIterator>
302316
_LIBCPP_CONSTEXPR_SINCE_CXX20 __enable_if_t<__is_cpp17_forward_iterator<_ForwardIterator>::value>
303317
__split_buffer<_Tp, _Allocator>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last)
304318
{
305-
_ConstructTransaction __tx(&this->__end_, _VSTD::distance(__first, __last));
319+
__construct_at_end_with_size(__first, std::distance(__first, __last));
320+
}
321+
322+
template <class _Tp, class _Allocator>
323+
template <class _ForwardIterator>
324+
_LIBCPP_CONSTEXPR_SINCE_CXX20
325+
void __split_buffer<_Tp, _Allocator>::__construct_at_end_with_size(_ForwardIterator __first, size_type __n) {
326+
_ConstructTransaction __tx(&this->__end_, __n);
306327
for (; __tx.__pos_ != __tx.__end_; ++__tx.__pos_, (void) ++__first) {
307328
__alloc_traits::construct(this->__alloc(),
308329
_VSTD::__to_address(__tx.__pos_), *__first);

libcxx/include/module.modulemap.in

Lines changed: 41 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1309,62 +1309,64 @@ module std [system] {
13091309
export *
13101310

13111311
module __ranges {
1312-
module access { private header "__ranges/access.h" }
1313-
module all {
1312+
module access { private header "__ranges/access.h" }
1313+
module all {
13141314
private header "__ranges/all.h"
13151315
export functional.__functional.compose
13161316
export functional.__functional.perfect_forward
13171317
}
1318-
module as_rvalue_view { private header "__ranges/as_rvalue_view.h" }
1319-
module common_view { private header "__ranges/common_view.h" }
1320-
module concepts { private header "__ranges/concepts.h" }
1321-
module copyable_box { private header "__ranges/copyable_box.h" }
1322-
module counted {
1318+
module as_rvalue_view { private header "__ranges/as_rvalue_view.h" }
1319+
module common_view { private header "__ranges/common_view.h" }
1320+
module concepts { private header "__ranges/concepts.h" }
1321+
module container_compatible_range { private header "__ranges/container_compatible_range.h" }
1322+
module copyable_box { private header "__ranges/copyable_box.h" }
1323+
module counted {
13231324
private header "__ranges/counted.h"
13241325
export span
13251326
}
1326-
module dangling { private header "__ranges/dangling.h" }
1327-
module data { private header "__ranges/data.h" }
1328-
module drop_view { private header "__ranges/drop_view.h" }
1329-
module drop_while_view { private header "__ranges/drop_while_view.h" }
1330-
module elements_view { private header "__ranges/elements_view.h" }
1331-
module empty { private header "__ranges/empty.h" }
1332-
module empty_view { private header "__ranges/empty_view.h" }
1333-
module enable_borrowed_range { private header "__ranges/enable_borrowed_range.h" }
1334-
module enable_view { private header "__ranges/enable_view.h" }
1335-
module filter_view { private header "__ranges/filter_view.h" }
1336-
module iota_view { private header "__ranges/iota_view.h" }
1337-
module istream_view {
1327+
module dangling { private header "__ranges/dangling.h" }
1328+
module data { private header "__ranges/data.h" }
1329+
module drop_view { private header "__ranges/drop_view.h" }
1330+
module drop_while_view { private header "__ranges/drop_while_view.h" }
1331+
module elements_view { private header "__ranges/elements_view.h" }
1332+
module empty { private header "__ranges/empty.h" }
1333+
module empty_view { private header "__ranges/empty_view.h" }
1334+
module enable_borrowed_range { private header "__ranges/enable_borrowed_range.h" }
1335+
module enable_view { private header "__ranges/enable_view.h" }
1336+
module filter_view { private header "__ranges/filter_view.h" }
1337+
module from_range { private header "__ranges/from_range.h" }
1338+
module iota_view { private header "__ranges/iota_view.h" }
1339+
module istream_view {
13381340
@requires_LIBCXX_ENABLE_LOCALIZATION@
13391341
private header "__ranges/istream_view.h"
13401342
}
1341-
module join_view { private header "__ranges/join_view.h" }
1342-
module lazy_split_view { private header "__ranges/lazy_split_view.h" }
1343-
module non_propagating_cache { private header "__ranges/non_propagating_cache.h" }
1344-
module owning_view { private header "__ranges/owning_view.h" }
1345-
module range_adaptor { private header "__ranges/range_adaptor.h" }
1346-
module rbegin { private header "__ranges/rbegin.h" }
1347-
module ref_view { private header "__ranges/ref_view.h" }
1348-
module rend { private header "__ranges/rend.h" }
1349-
module reverse_view { private header "__ranges/reverse_view.h" }
1350-
module single_view { private header "__ranges/single_view.h" }
1351-
module size { private header "__ranges/size.h" }
1352-
module split_view { private header "__ranges/split_view.h" }
1353-
module subrange {
1343+
module join_view { private header "__ranges/join_view.h" }
1344+
module lazy_split_view { private header "__ranges/lazy_split_view.h" }
1345+
module non_propagating_cache { private header "__ranges/non_propagating_cache.h" }
1346+
module owning_view { private header "__ranges/owning_view.h" }
1347+
module range_adaptor { private header "__ranges/range_adaptor.h" }
1348+
module rbegin { private header "__ranges/rbegin.h" }
1349+
module ref_view { private header "__ranges/ref_view.h" }
1350+
module rend { private header "__ranges/rend.h" }
1351+
module reverse_view { private header "__ranges/reverse_view.h" }
1352+
module single_view { private header "__ranges/single_view.h" }
1353+
module size { private header "__ranges/size.h" }
1354+
module split_view { private header "__ranges/split_view.h" }
1355+
module subrange {
13541356
private header "__ranges/subrange.h"
13551357
export subrange_fwd
13561358
}
1357-
module subrange_fwd { private header "__fwd/subrange.h" }
1358-
module take_view { private header "__ranges/take_view.h" }
1359-
module take_while_view { private header "__ranges/take_while_view.h" }
1360-
module transform_view {
1359+
module subrange_fwd { private header "__fwd/subrange.h" }
1360+
module take_view { private header "__ranges/take_view.h" }
1361+
module take_while_view { private header "__ranges/take_while_view.h" }
1362+
module transform_view {
13611363
private header "__ranges/transform_view.h"
13621364
export functional.__functional.bind_back
13631365
export functional.__functional.perfect_forward
13641366
}
1365-
module view_interface { private header "__ranges/view_interface.h" }
1366-
module views { private header "__ranges/views.h" }
1367-
module zip_view { private header "__ranges/zip_view.h" }
1367+
module view_interface { private header "__ranges/view_interface.h" }
1368+
module views { private header "__ranges/views.h" }
1369+
module zip_view { private header "__ranges/zip_view.h" }
13681370
}
13691371
}
13701372
module ratio {

libcxx/include/ranges

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,9 @@ namespace std {
339339
struct tuple_element<1, const ranges::subrange<I, S, K>> {
340340
using type = S;
341341
};
342+
343+
struct from_range_t { explicit from_range_t() = default; }; // Since C++23
344+
inline constexpr from_range_t from_range{}; // Since C++23
342345
}
343346
*/
344347

@@ -360,6 +363,7 @@ namespace std {
360363
#include <__ranges/enable_borrowed_range.h>
361364
#include <__ranges/enable_view.h>
362365
#include <__ranges/filter_view.h>
366+
#include <__ranges/from_range.h>
363367
#include <__ranges/iota_view.h>
364368
#include <__ranges/join_view.h>
365369
#include <__ranges/lazy_split_view.h>

0 commit comments

Comments
 (0)