Add algorithm.mutation.copy
This commit is contained in:
		@@ -14,8 +14,9 @@
 | 
			
		||||
 */
 | 
			
		||||
module tanya.algorithm.mutation;
 | 
			
		||||
 | 
			
		||||
import tanya.memory.op;
 | 
			
		||||
static import tanya.memory.op;
 | 
			
		||||
import tanya.meta.trait;
 | 
			
		||||
import tanya.range;
 | 
			
		||||
 | 
			
		||||
private void deinitialize(bool zero, T)(ref T value)
 | 
			
		||||
{
 | 
			
		||||
@@ -39,11 +40,12 @@ private void deinitialize(bool zero, T)(ref T value)
 | 
			
		||||
        }
 | 
			
		||||
        static if (zero)
 | 
			
		||||
        {
 | 
			
		||||
            fill!0((cast(void*) &value)[0 .. size]);
 | 
			
		||||
            tanya.memory.op.fill!0((cast(void*) &value)[0 .. size]);
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            copy(typeid(T).initializer()[0 .. size], (&value)[0 .. 1]);
 | 
			
		||||
            tanya.memory.op.copy(typeid(T).initializer()[0 .. size],
 | 
			
		||||
                                 (&value)[0 .. 1]);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -81,7 +83,7 @@ do
 | 
			
		||||
{
 | 
			
		||||
    static if (is(T == struct) || isStaticArray!T)
 | 
			
		||||
    {
 | 
			
		||||
        copy((&source)[0 .. 1], (&target)[0 .. 1]);
 | 
			
		||||
        tanya.memory.op.copy((&source)[0 .. 1], (&target)[0 .. 1]);
 | 
			
		||||
 | 
			
		||||
        static if (hasElaborateCopyConstructor!T || hasElaborateDestructor!T)
 | 
			
		||||
        {
 | 
			
		||||
@@ -273,3 +275,53 @@ void swap(T)(ref T a, ref T b) @trusted
 | 
			
		||||
    assert(a == 5);
 | 
			
		||||
    assert(b == 3);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Copies the $(D_PARAM source) range into the $(D_PARAM target) range.
 | 
			
		||||
 *
 | 
			
		||||
 * Params:
 | 
			
		||||
 *  Source = Input range type.
 | 
			
		||||
 *  Target = Output range type.
 | 
			
		||||
 *  source = Source input range.
 | 
			
		||||
 *  target = Target output range.
 | 
			
		||||
 *
 | 
			
		||||
 * Precondition: $(D_PARAM target) should be large enough to accept all
 | 
			
		||||
 *               $(D_PARAM source) elements.
 | 
			
		||||
 */
 | 
			
		||||
void copy(Source, Target)(Source source, Target target)
 | 
			
		||||
if (isInputRange!Source && isOutputRange!(Target, Source))
 | 
			
		||||
in
 | 
			
		||||
{
 | 
			
		||||
    static if (hasLength!Source && hasLength!Target)
 | 
			
		||||
    {
 | 
			
		||||
        assert(target.length >= source.length);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
do
 | 
			
		||||
{
 | 
			
		||||
    alias E = ElementType!Source;
 | 
			
		||||
    static if (isDynamicArray!Source
 | 
			
		||||
            && is(Source == Target)
 | 
			
		||||
            && !hasElaborateCopyConstructor!E
 | 
			
		||||
            && !hasElaborateAssign!E)
 | 
			
		||||
    {
 | 
			
		||||
        tanya.memory.op.copy(source, target);
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        for (; !source.empty; source.popFront())
 | 
			
		||||
        {
 | 
			
		||||
            put(target, source.front);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
///
 | 
			
		||||
@nogc nothrow pure @safe unittest
 | 
			
		||||
{
 | 
			
		||||
    int[2] actual;
 | 
			
		||||
    int[2] expected = [2, 3];
 | 
			
		||||
 | 
			
		||||
    copy(actual[], expected[]);
 | 
			
		||||
    assert(actual == expected);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -27,7 +27,7 @@
 | 
			
		||||
module tanya.container.string;
 | 
			
		||||
 | 
			
		||||
import std.algorithm.comparison : cmp;
 | 
			
		||||
import std.algorithm.mutation : bringToFront, copy;
 | 
			
		||||
import std.algorithm.mutation : bringToFront;
 | 
			
		||||
import std.algorithm.searching;
 | 
			
		||||
import tanya.algorithm.comparison;
 | 
			
		||||
import tanya.algorithm.mutation;
 | 
			
		||||
 
 | 
			
		||||
@@ -15,14 +15,13 @@
 | 
			
		||||
module tanya.math.mp;
 | 
			
		||||
 | 
			
		||||
import std.algorithm.comparison : cmp;
 | 
			
		||||
import std.algorithm.mutation : copy, fill, reverse;
 | 
			
		||||
import std.algorithm.mutation : fill, reverse;
 | 
			
		||||
import std.range;
 | 
			
		||||
import tanya.algorithm.comparison;
 | 
			
		||||
import tanya.algorithm.mutation;
 | 
			
		||||
import tanya.container.array;
 | 
			
		||||
import tanya.encoding.ascii;
 | 
			
		||||
import tanya.memory;
 | 
			
		||||
static import tanya.memory.op;
 | 
			
		||||
import tanya.meta.trait;
 | 
			
		||||
import tanya.meta.transform;
 | 
			
		||||
 | 
			
		||||
@@ -211,7 +210,7 @@ struct Integer
 | 
			
		||||
    this(this) @nogc nothrow pure @safe
 | 
			
		||||
    {
 | 
			
		||||
        auto tmp = allocator.resize!digit(null, this.size);
 | 
			
		||||
        tanya.memory.op.copy(this.rep[0 .. this.size], tmp);
 | 
			
		||||
        copy(this.rep[0 .. this.size], tmp);
 | 
			
		||||
        this.rep = tmp;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -344,8 +343,7 @@ struct Integer
 | 
			
		||||
    if (is(Unqual!T == Integer))
 | 
			
		||||
    {
 | 
			
		||||
        this.rep = allocator.resize(this.rep, value.size);
 | 
			
		||||
        tanya.memory.op.copy(value.rep[0 .. value.size],
 | 
			
		||||
                             this.rep[0 .. value.size]);
 | 
			
		||||
        copy(value.rep[0 .. value.size], this.rep[0 .. value.size]);
 | 
			
		||||
        this.size = value.size;
 | 
			
		||||
        this.sign = value.sign;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,7 @@
 | 
			
		||||
 */
 | 
			
		||||
module tanya.memory;
 | 
			
		||||
 | 
			
		||||
import std.algorithm.mutation;
 | 
			
		||||
import std.algorithm.mutation : uninitializedFill;
 | 
			
		||||
import tanya.conv;
 | 
			
		||||
import tanya.exception;
 | 
			
		||||
public import tanya.memory.allocator;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user