Add algorithm.mutation.swap

This commit is contained in:
Eugen Wissner 2017-11-01 13:03:48 +01:00
parent 392cdcf192
commit 12fb9ff9f6
7 changed files with 41 additions and 10 deletions

View File

@ -204,3 +204,30 @@ T move(T)(ref T source)
move(x, x);
assert(x == 5);
}
/**
* Exchanges the values of $(D_PARAM a) and $(D_PARAM b).
*
* $(D_PSYMBOL swap) moves the contents of $(D_PARAM a) and $(D_PARAM b)
* without calling its postblits or destructors.
*
* Params:
* a = The first object.
* a = The second object.
*/
void swap(T)(ref T a, ref T b) @trusted
{
T tmp = void;
moveEmplace(a, tmp);
moveEmplace(b, a);
moveEmplace(tmp, b);
}
///
@nogc nothrow pure @safe unittest
{
int a = 3, b = 5;
swap(a, b);
assert(a == 5);
assert(b == 3);
}

View File

@ -20,9 +20,6 @@ import std.algorithm.mutation : bringToFront,
copy,
fill,
initializeAll,
moveEmplaceAll,
moveAll,
swap,
uninitializedFill;
import std.meta;
import tanya.algorithm.mutation;
@ -272,7 +269,10 @@ struct Array(T)
{
// Move each element.
reserve(init.length_);
moveEmplaceAll(init.data[0 .. init.length_], this.data[0 .. init.length_]);
foreach (ref target; this.data[0 .. init.length_])
{
moveEmplace(*init.data++, target);
}
this.length_ = init.length_;
// Destructor of init should destroy it here.
}
@ -661,7 +661,12 @@ struct Array(T)
body
{
auto end = this.data + this.length;
moveAll(Range(this, r.end, end), Range(this, r.begin, end));
auto source = Range(this, r.end, end);
auto target = Range(this, r.begin, end);
for (; !source.empty; source.popFront(), target.popFront())
{
move(source.front, target.front);
}
length = length - r.length;
return Range(this, r.begin, this.data + length);
}

View File

@ -15,7 +15,6 @@
module tanya.container.list;
import std.algorithm.comparison;
import std.algorithm.mutation : swap;
import std.algorithm.searching;
import tanya.algorithm.mutation;
import tanya.container.entry;

View File

@ -15,7 +15,6 @@
*/
module tanya.container.set;
import std.algorithm.mutation : swap;
import tanya.algorithm.mutation;
import tanya.container;
import tanya.container.entry;

View File

@ -27,7 +27,7 @@
module tanya.container.string;
import std.algorithm.comparison;
import std.algorithm.mutation : bringToFront, copy, swap;
import std.algorithm.mutation : bringToFront, copy;
import std.algorithm.searching;
static import std.range;
import tanya.algorithm.mutation;

View File

@ -15,8 +15,9 @@
module tanya.math.mp;
import std.algorithm.comparison;
import std.algorithm.mutation;
import std.algorithm.mutation : fill, copy, reverse;
import std.range;
import tanya.algorithm.mutation;
import tanya.container.array;
import tanya.encoding.ascii;
import tanya.memory;

View File

@ -24,7 +24,7 @@
module tanya.memory.smartref;
import std.algorithm.comparison;
import std.algorithm.mutation;
import tanya.algorithm.mutation;
import tanya.conv;
import tanya.exception;
import tanya.memory;