8sa1-gcc/libstdc++-v3/include/std
Patrick Palka a25321ca06 libstdc++: Reimplement range adaptors [PR99433]
This rewrites our range adaptor implementation for more comprehensible
error messages, improved SFINAE behavior and conformance to P2281.

The diagnostic improvements mostly come from using appropriately named
functors instead of lambdas in the generic implementation of partial
application and composition of range adaptors, and in the definition of
each of the standard range adaptors.  This makes their pretty printed
types much shorter and more self-descriptive.

The improved SFINAE behavior comes from constraining the range adaptors'
member functions appropriately.  This improvement fixes PR99433, and is
also necessary in order to implement the wording changes of P2281.

Finally, P2281 clarified that partial application and composition of
range adaptors behaves like a perfect forwarding call wrapper.  This
patch implements this, except that we don't bother adding overloads for
forwarding captured state entities as non-const lvalues, since it seems
sufficient to handle the const lvalue and non-const rvalue cases for now,
given the current set of standard range adaptors.  But such overloads
can be easily added if they turn out to be needed.

libstdc++-v3/ChangeLog:

	PR libstdc++/99433
	* include/std/ranges (__adaptor::__maybe_refwrap): Remove.
	(__adaptor::__adaptor_invocable): New concept.
	(__adaptor::__adaptor_partial_app_viable): New concept.
	(__adaptor::_RangeAdaptorClosure): Rewrite, turning it into a
	non-template base class.
	(__adaptor::_RangeAdaptor): Rewrite, turning it into a CRTP base
	class template.
	(__adaptor::_Partial): New class template that represents
	partial application of a range adaptor non-closure.
	(__adaptor::__pipe_invocable): New concept.
	(__adaptor::_Pipe): New class template.
	(__detail::__can_ref_view): New concept.
	(__detail::__can_subrange): New concept.
	(all): Replace the lambda here with ...
	(_All): ... this functor.  Add appropriate constraints.
	(__detail::__can_filter_view): New concept.
	(filter, _Filter): As in all/_All.
	(__detail::__can_transform): New concept.
	(transform, _Transform): As in all/_All.
	(__detail::__can_take_view): New concept.
	(take, _Take): As in all/_All.
	(__detail::__can_take_while_view): New concept.
	(take_while, _TakeWhile): As in all/_All.
	(__detail::__can_drop_view): New concept.
	(drop, _Drop): As in all/_All.
	(__detail::__can_drop_while_view): New concept.
	(drop_while, _DropWhile): As in all/_All.
	(__detail::__can_join_view): New concept.
	(join, _Join): As in all/_All.
	(__detail::__can_split_view): New concept.
	(split, _Split): As in all/_All.  Rename template parameter
	_Fp to _Pattern.
	(__detail::__already_common): New concept.
	(__detail::__can_common_view): New concept.
	(common, _Common): As in all/_All.
	(__detail::__can_reverse_view): New concept.
	(reverse, _Reverse): As in all/_All.
	(__detail::__can_elements_view): New concept.
	(elements, _Elements): As in all/_All.
	(keys, values): Adjust.
	* testsuite/std/ranges/adaptors/99433.cc: New test.
	* testsuite/std/ranges/adaptors/all.cc: No longer expect that
	adding empty range adaptor closure objects to a pipeline doesn't
	increase the size of the pipeline.
	(test05): New test.
	* testsuite/std/ranges/adaptors/common.cc (test03): New test.
	* testsuite/std/ranges/adaptors/drop.cc (test09): New test.
	* testsuite/std/ranges/adaptors/drop_while.cc (test04): New test.
	* testsuite/std/ranges/adaptors/elements.cc (test04): New test.
	* testsuite/std/ranges/adaptors/filter.cc (test06): New test.
	* testsuite/std/ranges/adaptors/join.cc (test09): New test.
	* testsuite/std/ranges/adaptors/p2281.cc: New test.
	* testsuite/std/ranges/adaptors/reverse.cc (test07): New test.
	* testsuite/std/ranges/adaptors/split.cc (test01, test04):
	Adjust.
	(test09): New test.
	* testsuite/std/ranges/adaptors/split_neg.cc (test01): Adjust
	expected error message.
	(test02): Likewise.  Extend test.
	* testsuite/std/ranges/adaptors/take.cc (test06): New test.
	* testsuite/std/ranges/adaptors/take_while.cc (test05): New test.
	* testsuite/std/ranges/adaptors/transform.cc (test07, test08):
	New test.
2021-04-08 10:40:19 -04:00
..
algorithm Update copyright years. 2021-01-04 10:26:59 +01:00
any libstdc++: Fix doxygen markup for group close commands 2021-04-06 16:43:24 +01:00
array Update copyright years. 2021-01-04 10:26:59 +01:00
atomic libstdc++: Fix doxygen markup for group close commands 2021-04-06 16:43:24 +01:00
barrier libstdc++: Make barrier::arrival_token a move-only class type 2021-03-11 17:52:57 +00:00
bit libstdc++: Add nodiscard attribute to cast-like functions 2021-04-06 16:43:25 +01:00
bitset libstdc++: Fix doxygen markup for group close commands 2021-04-06 16:43:24 +01:00
charconv Update copyright years. 2021-01-04 10:26:59 +01:00
chrono libstdc++: Fix doxygen markup for group close commands 2021-04-06 16:43:24 +01:00
codecvt Update copyright years. 2021-01-04 10:26:59 +01:00
complex libstdc++: Fix doxygen markup for group close commands 2021-04-06 16:43:24 +01:00
concepts Update copyright years. 2021-01-04 10:26:59 +01:00
condition_variable libstdc++: Fix doxygen markup for group close commands 2021-04-06 16:43:24 +01:00
coroutine libstdc++: Make coroutine_handle<_Promise>::from_address() noexcept [PR 99021] 2021-02-09 12:31:52 +00:00
deque Update copyright years. 2021-01-04 10:26:59 +01:00
execution Update copyright years. 2021-01-04 10:26:59 +01:00
filesystem Update copyright years. 2021-01-04 10:26:59 +01:00
forward_list Update copyright years. 2021-01-04 10:26:59 +01:00
fstream libstdc++: Fix doxygen markup for group close commands 2021-04-06 16:43:24 +01:00
functional Update copyright years. 2021-01-04 10:26:59 +01:00
future libstdc++: Fix doxygen markup for group close commands 2021-04-06 16:43:24 +01:00
iomanip Update copyright years. 2021-01-04 10:26:59 +01:00
ios Update copyright years. 2021-01-04 10:26:59 +01:00
iosfwd Update copyright years. 2021-01-04 10:26:59 +01:00
iostream libstdc++: Fix doxygen markup for group close commands 2021-04-06 16:43:24 +01:00
istream libstdc++: Fix doxygen markup for group close commands 2021-04-06 16:43:24 +01:00
iterator Update copyright years. 2021-01-04 10:26:59 +01:00
latch Update copyright years. 2021-01-04 10:26:59 +01:00
limits Update copyright years. 2021-01-04 10:26:59 +01:00
list Update copyright years. 2021-01-04 10:26:59 +01:00
locale Update copyright years. 2021-01-04 10:26:59 +01:00
map Update copyright years. 2021-01-04 10:26:59 +01:00
memory Update copyright years. 2021-01-04 10:26:59 +01:00
memory_resource Update copyright years. 2021-01-04 10:26:59 +01:00
mutex libstdc++: Fix doxygen markup for group close commands 2021-04-06 16:43:24 +01:00
numbers Update copyright years. 2021-01-04 10:26:59 +01:00
numeric libstdc++: Fix doxygen markup for group close commands 2021-04-06 16:43:24 +01:00
optional Update copyright years. 2021-01-04 10:26:59 +01:00
ostream libstdc++: Fix doxygen markup for group close commands 2021-04-06 16:43:24 +01:00
queue Update copyright years. 2021-01-04 10:26:59 +01:00
random Update copyright years. 2021-01-04 10:26:59 +01:00
ranges libstdc++: Reimplement range adaptors [PR99433] 2021-04-08 10:40:19 -04:00
ratio libstdc++: Fix doxygen markup for group close commands 2021-04-06 16:43:24 +01:00
regex Update copyright years. 2021-01-04 10:26:59 +01:00
scoped_allocator Update copyright years. 2021-01-04 10:26:59 +01:00
semaphore Update copyright years. 2021-01-04 10:26:59 +01:00
set Update copyright years. 2021-01-04 10:26:59 +01:00
shared_mutex libstdc++: Fix doxygen markup for group close commands 2021-04-06 16:43:24 +01:00
source_location Update copyright years. 2021-01-04 10:26:59 +01:00
span Update copyright years. 2021-01-04 10:26:59 +01:00
sstream Update copyright years. 2021-01-04 10:26:59 +01:00
stack Update copyright years. 2021-01-04 10:26:59 +01:00
stdexcept libstdc++: Fix doxygen markup for group close commands 2021-04-06 16:43:24 +01:00
stop_token libstdc++: Use acq_rel memory ordering [PR 99537] 2021-03-11 17:52:56 +00:00
streambuf libstdc++: Fix doxygen markup for group close commands 2021-04-06 16:43:24 +01:00
string Update copyright years. 2021-01-04 10:26:59 +01:00
string_view libstdc++: Fix Doxygen warning about ambiguous file name 2021-04-08 14:51:03 +01:00
syncstream Update copyright years. 2021-01-04 10:26:59 +01:00
system_error libstdc++: Fix doxygen markup for group close commands 2021-04-06 16:43:24 +01:00
thread libstdc++: Fix doxygen markup for group close commands 2021-04-06 16:43:24 +01:00
tuple Update copyright years. 2021-01-04 10:26:59 +01:00
type_traits libstdc++: Make std::is_scoped_enum work with incomplete types 2021-04-08 11:56:59 +01:00
typeindex Update copyright years. 2021-01-04 10:26:59 +01:00
unordered_map Update copyright years. 2021-01-04 10:26:59 +01:00
unordered_set Update copyright years. 2021-01-04 10:26:59 +01:00
utility libstdc++: Add nodiscard attribute to cast-like functions 2021-04-06 16:43:25 +01:00
valarray libstdc++: Fix doxygen markup for group close commands 2021-04-06 16:43:24 +01:00
variant libstdc++: Fix doxygen markup for group close commands 2021-04-06 16:43:24 +01:00
vector Update copyright years. 2021-01-04 10:26:59 +01:00
version libstdc++: Add std::is_scoped_enum for C++23 2021-03-19 20:10:56 +00:00