79 lines
1.7 KiB
D
79 lines
1.7 KiB
D
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
/**
|
|
* Searching algorithms.
|
|
*
|
|
* Copyright: Eugene Wissner 2018.
|
|
* License: $(LINK2 https://www.mozilla.org/en-US/MPL/2.0/,
|
|
* Mozilla Public License, v. 2.0).
|
|
* Authors: $(LINK2 mailto:info@caraus.de, Eugene Wissner)
|
|
* Source: $(LINK2 https://github.com/caraus-ecms/tanya/blob/master/source/tanya/algorithm/searching.d,
|
|
* tanya/algorithm/searching.d)
|
|
*/
|
|
module tanya.algorithm.searching;
|
|
|
|
import tanya.range;
|
|
|
|
/**
|
|
* Counts the elements in an input range.
|
|
*
|
|
* If $(D_PARAM R) has length, $(D_PSYMBOL count) returns it, otherwise it
|
|
* iterates over the range and counts the elements.
|
|
*
|
|
* Params:
|
|
* R = Input range type.
|
|
* range = Input range.
|
|
*
|
|
* Returns: $(D_PARAM range) length.
|
|
*/
|
|
size_t count(R)(R range)
|
|
if (isInputRange!R)
|
|
{
|
|
static if (hasLength!R)
|
|
{
|
|
return range.length;
|
|
}
|
|
else
|
|
{
|
|
size_t counter;
|
|
for (; !range.empty; range.popFront(), ++counter)
|
|
{
|
|
}
|
|
return counter;
|
|
}
|
|
}
|
|
|
|
///
|
|
@nogc nothrow pure @safe unittest
|
|
{
|
|
int[3] array;
|
|
assert(count(array) == 3);
|
|
}
|
|
|
|
@nogc nothrow pure @safe unittest
|
|
{
|
|
static struct Range
|
|
{
|
|
private int counter = 3;
|
|
|
|
int front() const @nogc nothrow pure @safe
|
|
{
|
|
return this.counter;
|
|
}
|
|
|
|
void popFront() @nogc nothrow pure @safe
|
|
{
|
|
--this.counter;
|
|
}
|
|
|
|
bool empty() const @nogc nothrow pure @safe
|
|
{
|
|
return this.counter == 0;
|
|
}
|
|
}
|
|
Range range;
|
|
assert(count(range) == 3);
|
|
}
|