On Thu, 6 Feb 2020, Jonathan Wakely wrote:
> On 03/02/20 21:07 -0500, Patrick Palka wrote:
> > +#ifndef _RANGES_ALGO_H
> > +#define _RANGES_ALGO_H 1
> > +
> > +#if __cplusplus > 201703L
> > +
> > +#include <compare>
> > +#include <cmath>
> > +#include <iterator>
> > +// #include <bits/range_concepts.h>
>
> This line could be removed, or leave it as a reminder to me to
> refactor <ranges> so that the small utility pieces are in a small
> utility header (like <bits/ranges_concepts.h> that can be included
> instead of the whole of <ranges>.
I guess I'll leave it in then.
>
> > +#include <ranges>
> > +#include <bits/invoke.h>
> > +#include <bits/cpp_type_traits.h> // __is_byte
> > +#include <bits/random.h> // concept uniform_random_bit_generator
>
> I wonder if we want to move that concept to <bits/uniform_rand_dist.h>
> instead, which already exists to allow <algorithm> to avoid including
> the whole of <random>. If we do that, it would make sense to rename
> <bits/uniform_rand_dist.h> to <bits/random_fwd.h> or something like
> that.
That makes sense -- I can try to do that in a followup patch.
>
> > +
> > +#if __cpp_lib_concepts
> > +namespace std _GLIBCXX_VISIBILITY(default)
> > +{
> > +_GLIBCXX_BEGIN_NAMESPACE_VERSION
> > +namespace ranges
> > +{
> > + namespace __detail
> > + {
> > + template<typename _Tp>
> > + constexpr inline bool __is_normal_iterator = false;
>
> All these templates in the __detail namespace should be indented by
> two spaces after the template-head i.e.
>
> template<typename _Tp>
> constexpr inline bool __is_normal_iterator = false;
>
> (That indentation scheme has been in the libstdc++ style guide for
> longer than I've been contributing to the project, but it doesn't seem
> very popular with new contributors, and it wastes a level of
> indentation for templates, which means most of the library. Maybe we
> should revisit that convention.)
Fixed
>
>
> > + template<typename _Iter, typename _Out>
> > + using unary_transform_result = copy_result<_Iter, _Out>;
> > +
> > + template<input_iterator _Iter, sentinel_for<_Iter> _Sent,
> > + weakly_incrementable _Out,
> > + copy_constructible _Fp, typename _Proj = identity>
> > + requires writable<_Out, indirect_result_t<_Fp&, projected<_Iter,
> > _Proj>>>
>
> I have a pending patch to implement P1878R1, which renames writable
> (and a few other concepts). I'll wait until your patch is in, and
> change these places using it.
Sounds good.
>
> > + partial_sort_copy(_Iter1 __first, _Sent1 __last,
> > + _Iter2 __result_first, _Sent2 __result_last,
> > + _Comp __comp = {},
> > + _Proj1 __proj1 = {}, _Proj2 __proj2 = {})
> > + {
> > + if (__result_first == __result_last)
> > + {
> > + // TODO: Eliminating the variable __lasti triggers an ICE.
> > + auto __lasti = ranges::next(std::move(__first),
> > + std::move(__last));
> > + return {std::move(__lasti), std::move(__result_first)};
>
> Please try to reduce that and report it to bugzilla at some point,
> thanks.
Will do! Interestingly, it was an ICE in the middle-end. I wasn't able
to reproduce it anymore, but I'll try more carefully tomorrow.
>
> > +++ b/libstdc++-v3/testsuite/25_algorithms/all_of/constrained.cc
> > @@ -0,0 +1,90 @@
> > +// Copyright (C) 2019 Free Software Foundation, Inc.
>
> This should be 2020. That's the only change necessary though, please
> adjust that and commit to master. Great work, thank you!
Fixed. Thank you for the review! Patch committed, hopefully without
any fallout.