diff --git a/std/algorithm/searching.d b/std/algorithm/searching.d index e88d3a020..316abe85b 100644 --- a/std/algorithm/searching.d +++ b/std/algorithm/searching.d @@ -3789,7 +3789,7 @@ irreflexive (`pred(a, a)` is `false`). Params: pred = The ordering predicate to use to determine the extremum (minimum or maximum) element. - range = The $(REF_ALTTEXT input range, isInputRange, std,range,primitives) to search. + range = The $(REF_ALTTEXT forward range, isForwardRange, std,range,primitives) to search. Returns: The position of the minimum (respectively maximum) element of forward range `range`, i.e. a subrange of `range` starting at the position of its @@ -3909,7 +3909,7 @@ See_Also: $(LREF maxIndex), $(REF min, std,algorithm,comparison), $(LREF minCount), $(LREF minElement), $(LREF minPos) */ sizediff_t minIndex(alias pred = "a < b", Range)(Range range) -if (isForwardRange!Range && !isInfinite!Range && +if (isInputRange!Range && !isInfinite!Range && is(typeof(binaryFun!pred(range.front, range.front)))) { if (range.empty) return -1; @@ -4009,6 +4009,40 @@ if (isForwardRange!Range && !isInfinite!Range && assert(arr2d.minIndex!"a[1] < b[1]" == 2); } +@safe nothrow pure unittest +{ + // InputRange test + + static struct InRange + { + @property int front() + { + return arr[index]; + } + + bool empty() const + { + return arr.length == index; + } + + void popFront() + { + index++; + } + + int[] arr; + size_t index = 0; + } + + static assert(isInputRange!InRange); + + auto arr1 = InRange([5, 2, 3, 4, 5, 3, 6]); + auto arr2 = InRange([7, 3, 8, 2, 1, 4]); + + assert(arr1.minIndex == 1); + assert(arr2.minIndex == 4); +} + /** Computes the index of the first occurrence of `range`'s maximum element.