Skip to content

Commit

Permalink
rework concept checking to be more in line with Concepts Lite, fixes #63
Browse files Browse the repository at this point in the history
  • Loading branch information
Eric Niebler committed Nov 3, 2014
1 parent a9a4b20 commit e1db4ec
Show file tree
Hide file tree
Showing 79 changed files with 353 additions and 248 deletions.
7 changes: 7 additions & 0 deletions TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,10 @@
- Make `inplace_merge` work with forward iterators
- Make the sorting algorithms work with forward iterators
- Study the impact of allowing ForwardIterator to return proxies

* Maybe iterators are not necessarily countable. Is there a relation between
the ability to be able to subtract two iterators to find the distance, and
with the existence of a DistanceType associated type? Think of:
- counted iterators (subtractable regarless of traversal category)
- repeat_view iterators (*not* subtractable but could be random access otherwise)
- infinite ranges (only countable with an infinite precision integer which we lack)
2 changes: 1 addition & 1 deletion include/range/v3/algorithm/adjacent_find.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ namespace ranges
typename I = range_iterator_t<Rng>,
typename V = iterator_value_t<I>,
CONCEPT_REQUIRES_(
ForwardIterable<Rng>() &&
ForwardIterable<Rng &>() &&
Invokable<P, V>() &&
InvokableRelation<C, concepts::Invokable::result_t<P, V>>()
)>
Expand Down
2 changes: 1 addition & 1 deletion include/range/v3/algorithm/copy.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ namespace ranges
template<typename Rng, typename O, typename P = ident,
typename I = range_iterator_t<Rng>,
CONCEPT_REQUIRES_(
InputIterable<Rng>() &&
InputIterable<Rng &>() &&
WeaklyIncrementable<O>() &&
IndirectlyProjectedCopyable<I, P, O>()
)>
Expand Down
2 changes: 1 addition & 1 deletion include/range/v3/algorithm/copy_backward.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ namespace ranges
template<typename Rng, typename O, typename P = ident,
typename I = range_iterator_t<Rng>,
CONCEPT_REQUIRES_(
BidirectionalIterable<Rng>() &&
BidirectionalIterable<Rng &>() &&
BidirectionalIterator<O>() &&
IndirectlyProjectedCopyable<I, P, O>()
)>
Expand Down
2 changes: 1 addition & 1 deletion include/range/v3/algorithm/copy_if.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ namespace ranges
typename V = iterator_value_t<I>,
typename X = concepts::Invokable::result_t<P, V>,
CONCEPT_REQUIRES_(
InputIterable<Rng>() &&
InputIterable<Rng &>() &&
WeaklyIncrementable<O>() &&
InvokablePredicate<F, X>() &&
IndirectlyProjectedCopyable<I, P, O>()
Expand Down
2 changes: 1 addition & 1 deletion include/range/v3/algorithm/equal.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ namespace ranges
template<typename Rng0, typename I1Ref,
typename C = equal_to, typename P0 = ident, typename P1 = ident,
typename I0 = range_iterator_t<Rng0>,
typename I1 = detail::uncvref_t<I1Ref>,
typename I1 = uncvref_t<I1Ref>,
CONCEPT_REQUIRES_(
Iterable<Rng0>() &&
WeaklyComparable<I0, I1, C, P0, P1>()
Expand Down
2 changes: 1 addition & 1 deletion include/range/v3/algorithm/equal_range.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ namespace ranges

template<typename Rng, typename V, typename C = ordered_less, typename P = ident,
typename I = range_iterator_t<Rng>,
CONCEPT_REQUIRES_(Iterable<Rng>() && BinarySearchable<I, V, C, P>())>
CONCEPT_REQUIRES_(Iterable<Rng &>() && BinarySearchable<I, V, C, P>())>
range<I>
operator()(Rng & rng, V const & val, C pred = C{}, P proj = P{}) const
{
Expand Down
2 changes: 1 addition & 1 deletion include/range/v3/algorithm/fill.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ namespace ranges

template<typename Rng, typename V,
typename O = range_iterator_t<Rng>,
CONCEPT_REQUIRES_(OutputIterable<Rng, V>())>
CONCEPT_REQUIRES_(OutputIterable<Rng &, V>())>
O operator()(Rng & rng, V const & val) const
{
return (*this)(begin(rng), end(rng), val);
Expand Down
2 changes: 1 addition & 1 deletion include/range/v3/algorithm/find.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ namespace ranges
typename V0 = iterator_value_t<I>,
typename X = concepts::Invokable::result_t<P, V0>,
CONCEPT_REQUIRES_(
InputIterable<Rng>() &&
InputIterable<Rng &>() &&
Invokable<P, V0>() &&
EqualityComparable<X, V1>()
)>
Expand Down
2 changes: 1 addition & 1 deletion include/range/v3/algorithm/find_if.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ namespace ranges
typename V = iterator_value_t<I>,
typename X = concepts::Invokable::result_t<P, V>,
CONCEPT_REQUIRES_(
InputIterable<Rng>() &&
InputIterable<Rng &>() &&
Invokable<P, V>() &&
InvokablePredicate<F, X>()
)>
Expand Down
2 changes: 1 addition & 1 deletion include/range/v3/algorithm/find_if_not.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ namespace ranges
typename V = iterator_value_t<I>,
typename X = concepts::Invokable::result_t<P, V>,
CONCEPT_REQUIRES_(
InputIterable<Rng>() &&
InputIterable<Rng &>() &&
Invokable<P, V>() &&
InvokablePredicate<F, X>()
)>
Expand Down
2 changes: 1 addition & 1 deletion include/range/v3/algorithm/for_each.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ namespace ranges
typename I = range_iterator_t<Rng>,
typename V = iterator_value_t<I>,
typename X = concepts::Invokable::result_t<P, V>,
CONCEPT_REQUIRES_(InputIterable<Rng>() && Invokable<P, V>() && Invokable<F, X>())>
CONCEPT_REQUIRES_(InputIterable<Rng &>() && Invokable<P, V>() && Invokable<F, X>())>
I operator()(Rng &rng, F fun, P proj = P{}) const
{
return (*this)(begin(rng), end(rng), std::move(fun), std::move(proj));
Expand Down
2 changes: 1 addition & 1 deletion include/range/v3/algorithm/generate.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ namespace ranges
template<typename Rng, typename F,
typename O = range_iterator_t<Rng>,
CONCEPT_REQUIRES_(Function<F>() &&
OutputIterable<Rng, concepts::Function::result_t<F>>())>
OutputIterable<Rng &, concepts::Function::result_t<F>>())>
std::pair<O, F> operator()(Rng & rng, F fun) const
{
return (*this)(begin(rng), end(rng), std::move(fun));
Expand Down
10 changes: 5 additions & 5 deletions include/range/v3/algorithm/heap_algorithm.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ namespace ranges

template<typename Rng, typename C = ordered_less, typename P = ident,
typename I = range_iterator_t<Rng>,
CONCEPT_REQUIRES_(IsHeapable<I, C, P>() && Iterable<Rng>())>
CONCEPT_REQUIRES_(IsHeapable<I, C, P>() && Iterable<Rng &>())>
I operator()(Rng &rng, C pred = C{}, P proj = P{}) const
{
return detail::is_heap_until_n(begin(rng), distance(rng), std::move(pred), std::move(proj));
Expand Down Expand Up @@ -239,7 +239,7 @@ namespace ranges

template<typename Rng, typename C = ordered_less, typename P = ident,
typename I = range_iterator_t<Rng>,
CONCEPT_REQUIRES_(RandomAccessIterable<Rng>() && Sortable<I, C, P>())>
CONCEPT_REQUIRES_(RandomAccessIterable<Rng &>() && Sortable<I, C, P>())>
I operator()(Rng & rng, C pred = C{}, P proj = P{}) const
{
I begin = ranges::begin(rng);
Expand Down Expand Up @@ -284,7 +284,7 @@ namespace ranges

template<typename Rng, typename C = ordered_less, typename P = ident,
typename I = range_iterator_t<Rng>,
CONCEPT_REQUIRES_(RandomAccessIterable<Rng>() && Sortable<I, C, P>())>
CONCEPT_REQUIRES_(RandomAccessIterable<Rng &>() && Sortable<I, C, P>())>
I operator()(Rng & rng, C pred = C{}, P proj = P{}) const
{
I begin = ranges::begin(rng);
Expand Down Expand Up @@ -314,7 +314,7 @@ namespace ranges

template<typename Rng, typename C = ordered_less, typename P = ident,
typename I = range_iterator_t<Rng>,
CONCEPT_REQUIRES_(RandomAccessIterable<Rng>() && Sortable<I, C, P>())>
CONCEPT_REQUIRES_(RandomAccessIterable<Rng &>() && Sortable<I, C, P>())>
I operator()(Rng & rng, C pred_ = C{}, P proj_ = P{}) const
{
auto &&pred = invokable(pred_);
Expand Down Expand Up @@ -347,7 +347,7 @@ namespace ranges

template<typename Rng, typename C = ordered_less, typename P = ident,
typename I = range_iterator_t<Rng>,
CONCEPT_REQUIRES_(RandomAccessIterable<Rng>() && Sortable<I, C, P>())>
CONCEPT_REQUIRES_(RandomAccessIterable<Rng &>() && Sortable<I, C, P>())>
I operator()(Rng & rng, C pred_ = C{}, P proj_ = P{}) const
{
auto &&pred = invokable(pred_);
Expand Down
2 changes: 1 addition & 1 deletion include/range/v3/algorithm/inplace_merge.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ namespace ranges

template<typename Rng, typename C = ordered_less, typename P = ident,
typename I = range_iterator_t<Rng>,
CONCEPT_REQUIRES_(BidirectionalIterable<Rng>() && Sortable<I, C, P>())>
CONCEPT_REQUIRES_(BidirectionalIterable<Rng &>() && Sortable<I, C, P>())>
I operator()(Rng &rng, I middle, C pred = C{}, P proj = P{}) const
{
return (*this)(begin(rng), std::move(middle), end(rng), std::move(pred), std::move(proj));
Expand Down
2 changes: 1 addition & 1 deletion include/range/v3/algorithm/is_sorted_until.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ namespace ranges
typename I = range_iterator_t<Rng>,
typename V = iterator_value_t<I>,
CONCEPT_REQUIRES_(
ForwardIterable<Rng>() && Invokable<P, V>() &&
ForwardIterable<Rng &>() && Invokable<P, V>() &&
InvokableRelation<R, concepts::Invokable::result_t<P, V>>())>
I operator()(Rng &rng, R rel = R{}, P proj = P{}) const
{
Expand Down
2 changes: 1 addition & 1 deletion include/range/v3/algorithm/lower_bound.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ namespace ranges

template<typename Rng, typename V, typename C = ordered_less, typename P = ident,
typename I = range_iterator_t<Rng>,
CONCEPT_REQUIRES_(Iterable<Rng>() && BinarySearchable<I, V, C, P>())>
CONCEPT_REQUIRES_(Iterable<Rng &>() && BinarySearchable<I, V, C, P>())>
I operator()(Rng &rng, V const &val, C pred = C{}, P proj = P{}) const
{
static_assert(!is_infinite<Rng>::value, "Trying to binary search an infinite range");
Expand Down
2 changes: 1 addition & 1 deletion include/range/v3/algorithm/max_element.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ namespace ranges
typename I = range_iterator_t<Rng>,
typename V = iterator_value_t<I>,
typename X = concepts::Invokable::result_t<P, V>,
CONCEPT_REQUIRES_(ForwardIterable<Rng>() && Invokable<P, V>() &&
CONCEPT_REQUIRES_(ForwardIterable<Rng &>() && Invokable<P, V>() &&
InvokableRelation<C, X>())>
I operator()(Rng &rng, C pred = C{}, P proj = P{}) const
{
Expand Down
4 changes: 2 additions & 2 deletions include/range/v3/algorithm/merge.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,8 @@ namespace ranges
typename I0 = range_iterator_t<Rng0>,
typename I1 = range_iterator_t<Rng1>,
CONCEPT_REQUIRES_(
Iterable<Rng0>() &&
Iterable<Rng1>() &&
Iterable<Rng0 &>() &&
Iterable<Rng1 &>() &&
Mergeable<I0, I1, O, C, P0, P1>()
)>
std::tuple<I0, I1, O>
Expand Down
2 changes: 1 addition & 1 deletion include/range/v3/algorithm/min_element.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ namespace ranges
typename I = range_iterator_t<Rng>,
typename V = iterator_value_t<I>,
typename X = concepts::Invokable::result_t<P, V>,
CONCEPT_REQUIRES_(ForwardIterable<Rng>() && Invokable<P, V>() &&
CONCEPT_REQUIRES_(ForwardIterable<Rng &>() && Invokable<P, V>() &&
InvokableRelation<C, X>())>
I operator()(Rng &rng, C pred = C{}, P proj = P{}) const
{
Expand Down
2 changes: 1 addition & 1 deletion include/range/v3/algorithm/minmax_element.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ namespace ranges
typename I = range_iterator_t<Rng>,
typename V = iterator_value_t<I>,
typename X = concepts::Invokable::result_t<P, V>,
CONCEPT_REQUIRES_(ForwardIterable<Rng>() && Invokable<P, V>() &&
CONCEPT_REQUIRES_(ForwardIterable<Rng &>() && Invokable<P, V>() &&
InvokableRelation<C, X>())>
std::pair<I, I> operator()(Rng &rng, C pred = C{}, P proj = P{}) const
{
Expand Down
4 changes: 2 additions & 2 deletions include/range/v3/algorithm/mismatch.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ namespace ranges
template<typename Rng1, typename I2Ref, typename C = equal_to, typename P1 = ident, typename P2 = ident,
typename I1 = range_iterator_t<Rng1>,
typename I2 = detail::decay_t<I2Ref>, // [*] See below
CONCEPT_REQUIRES_(InputIterable<Rng1>() && Mismatchable1<I1, I2, C, P1, P2>())>
CONCEPT_REQUIRES_(InputIterable<Rng1 &>() && Mismatchable1<I1, I2, C, P1, P2>())>
std::pair<I1, I2> operator()(Rng1 & rng1, I2Ref &&begin2,
C pred = C{}, P1 proj1 = P1{}, P2 proj2 = P2{}) const
{
Expand All @@ -102,7 +102,7 @@ namespace ranges
template<typename Rng1, typename Rng2, typename C = equal_to, typename P1 = ident, typename P2 = ident,
typename I1 = range_iterator_t<Rng1>,
typename I2 = range_iterator_t<Rng2>,
CONCEPT_REQUIRES_(InputIterable<Rng1>() && InputIterable<Rng2>() &&
CONCEPT_REQUIRES_(InputIterable<Rng1 &>() && InputIterable<Rng2 &>() &&
Mismatchable2<I1, I2, C, P1, P2>())>
std::pair<I1, I2> operator()(Rng1 &rng1, Rng2 &rng2,
C pred = C{}, P1 proj1 = P1{}, P2 proj2 = P2{}) const
Expand Down
2 changes: 1 addition & 1 deletion include/range/v3/algorithm/move.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ namespace ranges

template<typename Rng, typename O, typename P = ident,
typename I = range_iterator_t<Rng>,
CONCEPT_REQUIRES_(InputIterable<Rng>() && WeaklyIncrementable<O>() &&
CONCEPT_REQUIRES_(InputIterable<Rng &>() && WeaklyIncrementable<O>() &&
IndirectlyProjectedMovable<I, P, O>())>
std::pair<I, O> operator()(Rng &rng, O out, P proj = P{}) const
{
Expand Down
2 changes: 1 addition & 1 deletion include/range/v3/algorithm/move_backward.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ namespace ranges

template<typename Rng, typename O, typename P = ident,
typename I = range_iterator_t<Rng>,
CONCEPT_REQUIRES_(BidirectionalIterable<Rng>() && BidirectionalIterator<O>() &&
CONCEPT_REQUIRES_(BidirectionalIterable<Rng &>() && BidirectionalIterator<O>() &&
IndirectlyProjectedMovable<I, P, O>())>
std::pair<I, O> operator()(Rng &rng, O out, P proj = P{}) const
{
Expand Down
2 changes: 1 addition & 1 deletion include/range/v3/algorithm/partial_sort.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ namespace ranges

template<typename Rng, typename C = ordered_less, typename P = ident,
typename I = range_iterator_t<Rng>,
CONCEPT_REQUIRES_(Sortable<I, C, P>() && RandomAccessIterable<Rng>())>
CONCEPT_REQUIRES_(Sortable<I, C, P>() && RandomAccessIterable<Rng &>())>
I operator()(Rng & rng, I middle, C pred = C{}, P proj = P{}) const
{
return (*this)(begin(rng), std::move(middle), end(rng), std::move(pred), std::move(proj));
Expand Down
2 changes: 1 addition & 1 deletion include/range/v3/algorithm/partial_sort_copy.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ namespace ranges
typename I = range_iterator_t<InRng>,
typename O = range_iterator_t<OutRng>,
CONCEPT_REQUIRES_(PartialSortCopyConcept<I, O, C, PI, PO>() &&
Iterable<InRng>() && Iterable<OutRng>())>
Iterable<InRng>() && Iterable<OutRng &>())>
O operator()(InRng && in_rng, OutRng & out_rng, C pred = C{}, PI in_proj = PI{},
PO out_proj = PO{}) const
{
Expand Down
2 changes: 1 addition & 1 deletion include/range/v3/algorithm/partition.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ namespace ranges

template<typename Rng, typename C, typename P = ident,
typename I = range_iterator_t<Rng>,
CONCEPT_REQUIRES_(Partitionable<I, C, P>() && Iterable<Rng>())>
CONCEPT_REQUIRES_(Partitionable<I, C, P>() && Iterable<Rng &>())>
I operator()(Rng &rng, C pred, P proj = P{}) const
{
return partition_fn::impl(begin(rng), end(rng), std::move(pred),
Expand Down
2 changes: 1 addition & 1 deletion include/range/v3/algorithm/partition_copy.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ namespace ranges

template<typename Rng, typename O0, typename O1, typename C, typename P = ident,
typename I = range_iterator_t<Rng>,
CONCEPT_REQUIRES_(PartitionCopyable<I, O0, O1, C, P>() && Iterable<Rng>())>
CONCEPT_REQUIRES_(PartitionCopyable<I, O0, O1, C, P>() && Iterable<Rng &>())>
std::tuple<I, O0, O1> operator()(Rng &rng, O0 o0, O1 o1, C pred, P proj = P{}) const
{
return (*this)(begin(rng), end(rng), std::move(o0), std::move(o1), std::move(pred),
Expand Down
2 changes: 1 addition & 1 deletion include/range/v3/algorithm/partition_point.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ namespace ranges

template<typename Rng, typename C, typename P = ident,
typename I = range_iterator_t<Rng>,
CONCEPT_REQUIRES_(PartitionPointable<I, C, P>() && Iterable<Rng>())>
CONCEPT_REQUIRES_(PartitionPointable<I, C, P>() && Iterable<Rng &>())>
I operator()(Rng &rng, C pred, P proj = P{}) const
{
return (*this)(begin(rng), end(rng), std::move(pred), std::move(proj));
Expand Down
6 changes: 3 additions & 3 deletions include/range/v3/algorithm/permutation.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ namespace ranges

template<typename Rng1, typename I2Ref, typename C = equal_to, typename P1 = ident,
typename P2 = ident, typename I1 = range_iterator_t<Rng1>,
typename I2 = detail::uncvref_t<I2Ref>,
typename I2 = uncvref_t<I2Ref>,
CONCEPT_REQUIRES_(ForwardIterable<Rng1>() && IsPermutationable<I1, I2, C, P1, P2>())>
bool operator()(Rng1 &&rng1, I2Ref &&begin2,
C pred = C{}, P1 proj1 = P1{}, P2 proj2 = P2{}) const
Expand Down Expand Up @@ -227,7 +227,7 @@ namespace ranges

template<typename Rng, typename C = ordered_less, typename P = ident,
typename I = range_iterator_t<Rng>,
CONCEPT_REQUIRES_(BidirectionalIterable<Rng>() && Sortable<I, C, P>())>
CONCEPT_REQUIRES_(BidirectionalIterable<Rng &>() && Sortable<I, C, P>())>
bool operator()(Rng &rng, C pred = C{}, P proj = P{}) const
{
return (*this)(begin(rng), end(rng), std::move(pred), std::move(proj));
Expand Down Expand Up @@ -271,7 +271,7 @@ namespace ranges

template<typename Rng, typename C = ordered_less, typename P = ident,
typename I = range_iterator_t<Rng>,
CONCEPT_REQUIRES_(BidirectionalIterable<Rng>() && Sortable<I, C, P>())>
CONCEPT_REQUIRES_(BidirectionalIterable<Rng &>() && Sortable<I, C, P>())>
bool operator()(Rng &rng, C pred = C{}, P proj = P{}) const
{
return (*this)(begin(rng), end(rng), std::move(pred), std::move(proj));
Expand Down
10 changes: 5 additions & 5 deletions include/range/v3/algorithm/random_shuffle.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,10 @@ namespace ranges
struct RandomNumberGenerator
{
template<typename Gen, typename D>
auto requires_(Gen && rand, D d) -> decltype(
auto requires_(Gen rand, D d) -> decltype(
concepts::valid_expr(
concepts::model_of<Integral>(d),
concepts::convertible_to<D>(((Gen &&) rand)(d))
concepts::model_of<Integral, D>(),
concepts::convertible_to<D>(val<Gen>()(d))
));
};
}
Expand Down Expand Up @@ -87,15 +87,15 @@ namespace ranges
}

template<typename Rng, typename I = range_iterator_t<Rng>,
CONCEPT_REQUIRES_(RandomAccessIterable<Rng>() &&
CONCEPT_REQUIRES_(RandomAccessIterable<Rng &>() &&
Permutable<I>())>
I operator()(Rng & rng) const
{
return (*this)(begin(rng), end(rng));
}

template<typename Rng, typename Gen, typename I = range_iterator_t<Rng>,
CONCEPT_REQUIRES_(RandomAccessIterable<Rng>() &&
CONCEPT_REQUIRES_(RandomAccessIterable<Rng &>() &&
Permutable<I>() &&
RandomNumberGenerator<Gen, iterator_difference_t<I>>())>
I operator()(Rng & rng, Gen && rand) const
Expand Down

0 comments on commit e1db4ec

Please sign in to comment.