]> git.ipfire.org Git - thirdparty/gcc.git/commit
libstdc++: Implement C++20 range adaptors
authorPatrick Palka <ppalka@redhat.com>
Thu, 30 Jan 2020 22:37:07 +0000 (17:37 -0500)
committerPatrick Palka <ppalka@redhat.com>
Fri, 7 Feb 2020 14:24:43 +0000 (09:24 -0500)
commitcba9ef069e58eac00f30489d3ef21390caee6e45
tree894b68bbe8f13d3479116d1d7150f1b64d664a38
parent0d57370c9cc3c1fb68be96b8cc15b92496c4dd21
libstdc++: Implement C++20 range adaptors

This patch implements [range.adaptors].  It also includes the changes from P3280
and P3278 and P3323, without which many standard examples won't work.

The implementation is mostly dictated by the spec and there was not much room
for implementation discretion.  The most interesting part that was not specified
by the spec is the design of the range adaptors and range adaptor closures,
which I tried to design in a way that minimizes boilerplate and statefulness (so
that e.g. the composition of two stateless closures is stateless).

What is left unimplemented is caching of calls to begin() in filter_view,
drop_view and reverse_view, which is required to guarantee that begin() has
amortized constant time complexity.  I can implement this in a subsequent patch.

"Interesting" parts of the patch are marked with XXX comments.

libstdc++-v3/ChangeLog:

Implement C++20 range adaptors
* include/std/ranges: Include <bits/refwrap.h> and <tuple>.
(subrange::_S_store_size): Mark as const instead of constexpr to
avoid what seems to be a bug in GCC.
(__detail::__box): Give it defaulted copy and move constructors.
(views::_Single::operator()): Mark constexpr.
(views::_Iota::operator()): Mark constexpr.
(__detail::Empty): Define.
(views::_RangeAdaptor, views::_RangeAdaptorClosure, ref_view, all_view,
views::all, filter_view, views::filter, transform_view,
views::transform, take_view, views::take, take_while_view,
views::take_while, drop_view, views::drop, join_view, views::join,
__detail::require_constant, __detail::tiny_range, split_view,
views::split, views::_Counted, views::counted, common_view,
views::common, reverse_view, views::reverse,
views::__detail::__is_reversible_subrange,
views::__detail::__is_reverse_view, reverse_view, views::reverse,
__detail::__has_tuple_element, elements_view, views::elements,
views::keys, views::values): Define.
* testsuite/std/ranges/adaptors/all.cc: New test.
* testsuite/std/ranges/adaptors/common.cc: Likewise.
* testsuite/std/ranges/adaptors/counted.cc: Likewise.
* testsuite/std/ranges/adaptors/drop.cc: Likewise.
* testsuite/std/ranges/adaptors/drop_while.cc: Likewise.
* testsuite/std/ranges/adaptors/elements.cc: Likewise.
* testsuite/std/ranges/adaptors/filter.cc: Likewise.
* testsuite/std/ranges/adaptors/join.cc: Likewise.
* testsuite/std/ranges/adaptors/reverse.cc: Likewise.
* testsuite/std/ranges/adaptors/split.cc: Likewise.
* testsuite/std/ranges/adaptors/take.cc: Likewise.
* testsuite/std/ranges/adaptors/take_while.cc: Likewise.
* testsuite/std/ranges/adaptors/transform.cc: Likewise.
15 files changed:
libstdc++-v3/ChangeLog
libstdc++-v3/include/std/ranges
libstdc++-v3/testsuite/std/ranges/adaptors/all.cc [new file with mode: 0644]
libstdc++-v3/testsuite/std/ranges/adaptors/common.cc [new file with mode: 0644]
libstdc++-v3/testsuite/std/ranges/adaptors/counted.cc [new file with mode: 0644]
libstdc++-v3/testsuite/std/ranges/adaptors/drop.cc [new file with mode: 0644]
libstdc++-v3/testsuite/std/ranges/adaptors/drop_while.cc [new file with mode: 0644]
libstdc++-v3/testsuite/std/ranges/adaptors/elements.cc [new file with mode: 0644]
libstdc++-v3/testsuite/std/ranges/adaptors/filter.cc [new file with mode: 0644]
libstdc++-v3/testsuite/std/ranges/adaptors/join.cc [new file with mode: 0644]
libstdc++-v3/testsuite/std/ranges/adaptors/reverse.cc [new file with mode: 0644]
libstdc++-v3/testsuite/std/ranges/adaptors/split.cc [new file with mode: 0644]
libstdc++-v3/testsuite/std/ranges/adaptors/take.cc [new file with mode: 0644]
libstdc++-v3/testsuite/std/ranges/adaptors/take_while.cc [new file with mode: 0644]
libstdc++-v3/testsuite/std/ranges/adaptors/transform.cc [new file with mode: 0644]