Add algorithm.mutation.uninitializedFill
This commit is contained in:
parent
a04a04bb96
commit
3b5709821a
@ -14,6 +14,7 @@
|
||||
*/
|
||||
module tanya.algorithm.mutation;
|
||||
|
||||
import tanya.conv;
|
||||
static import tanya.memory.op;
|
||||
import tanya.meta.trait;
|
||||
import tanya.meta.transform;
|
||||
@ -398,7 +399,7 @@ do
|
||||
* range = Input range.
|
||||
* value = Filler.
|
||||
*/
|
||||
void fill(Range, Value)(Range range, Value value)
|
||||
void fill(Range, Value)(Range range, auto ref Value value)
|
||||
if (isInputRange!Range && isAssignable!(ElementType!Range, Value))
|
||||
{
|
||||
static if (!isDynamicArray!Range && is(typeof(range[] = value)))
|
||||
@ -461,3 +462,43 @@ if (isInputRange!Range && isAssignable!(ElementType!Range, Value))
|
||||
fill(range, 0);
|
||||
assert(slicingCalled);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fills $(D_PARAM range) with $(D_PARAM value) assuming the elements of the
|
||||
* $(D_PARAM range) aren't initialized.
|
||||
*
|
||||
* Params:
|
||||
* Range = Input range type.
|
||||
* Value = Initializer type.
|
||||
* range = Input range.
|
||||
* value = Initializer.
|
||||
*/
|
||||
void uninitializedFill(Range, Value)(Range range, auto ref Value value)
|
||||
if (isInputRange!Range && hasLvalueElements!Range
|
||||
&& isAssignable!(ElementType!Range, Value))
|
||||
{
|
||||
static if (hasElaborateDestructor!(ElementType!Range))
|
||||
{
|
||||
for (; !range.empty; range.popFront())
|
||||
{
|
||||
ElementType!Range* p = &range.front;
|
||||
emplace!(ElementType!Range)(cast(void[]) (p[0 .. 1]), value);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
fill(range, value);
|
||||
}
|
||||
}
|
||||
|
||||
///
|
||||
@nogc nothrow pure @safe unittest
|
||||
{
|
||||
import tanya.algorithm.comparison : equal;
|
||||
|
||||
int[6] actual = void;
|
||||
const int[6] expected = [1, 1, 1, 1, 1, 1];
|
||||
|
||||
uninitializedFill(actual[], 1);
|
||||
assert(equal(actual[], expected[]));
|
||||
}
|
||||
|
@ -15,9 +15,7 @@
|
||||
module tanya.container.array;
|
||||
|
||||
import core.checkedint;
|
||||
import std.algorithm.mutation : bringToFront,
|
||||
initializeAll,
|
||||
uninitializedFill;
|
||||
import std.algorithm.mutation : bringToFront, initializeAll;
|
||||
import tanya.algorithm.comparison;
|
||||
import tanya.algorithm.mutation;
|
||||
import tanya.exception;
|
||||
|
@ -14,7 +14,7 @@
|
||||
*/
|
||||
module tanya.memory;
|
||||
|
||||
import std.algorithm.mutation : uninitializedFill;
|
||||
import tanya.algorithm.mutation;
|
||||
import tanya.conv;
|
||||
import tanya.exception;
|
||||
public import tanya.memory.allocator;
|
||||
|
Loading…
Reference in New Issue
Block a user