Add algorithm.mutation.swap
This commit is contained in:
parent
392cdcf192
commit
12fb9ff9f6
@ -204,3 +204,30 @@ T move(T)(ref T source)
|
|||||||
move(x, x);
|
move(x, x);
|
||||||
assert(x == 5);
|
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);
|
||||||
|
}
|
||||||
|
@ -20,9 +20,6 @@ import std.algorithm.mutation : bringToFront,
|
|||||||
copy,
|
copy,
|
||||||
fill,
|
fill,
|
||||||
initializeAll,
|
initializeAll,
|
||||||
moveEmplaceAll,
|
|
||||||
moveAll,
|
|
||||||
swap,
|
|
||||||
uninitializedFill;
|
uninitializedFill;
|
||||||
import std.meta;
|
import std.meta;
|
||||||
import tanya.algorithm.mutation;
|
import tanya.algorithm.mutation;
|
||||||
@ -272,7 +269,10 @@ struct Array(T)
|
|||||||
{
|
{
|
||||||
// Move each element.
|
// Move each element.
|
||||||
reserve(init.length_);
|
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_;
|
this.length_ = init.length_;
|
||||||
// Destructor of init should destroy it here.
|
// Destructor of init should destroy it here.
|
||||||
}
|
}
|
||||||
@ -661,7 +661,12 @@ struct Array(T)
|
|||||||
body
|
body
|
||||||
{
|
{
|
||||||
auto end = this.data + this.length;
|
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;
|
length = length - r.length;
|
||||||
return Range(this, r.begin, this.data + length);
|
return Range(this, r.begin, this.data + length);
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,6 @@
|
|||||||
module tanya.container.list;
|
module tanya.container.list;
|
||||||
|
|
||||||
import std.algorithm.comparison;
|
import std.algorithm.comparison;
|
||||||
import std.algorithm.mutation : swap;
|
|
||||||
import std.algorithm.searching;
|
import std.algorithm.searching;
|
||||||
import tanya.algorithm.mutation;
|
import tanya.algorithm.mutation;
|
||||||
import tanya.container.entry;
|
import tanya.container.entry;
|
||||||
|
@ -15,7 +15,6 @@
|
|||||||
*/
|
*/
|
||||||
module tanya.container.set;
|
module tanya.container.set;
|
||||||
|
|
||||||
import std.algorithm.mutation : swap;
|
|
||||||
import tanya.algorithm.mutation;
|
import tanya.algorithm.mutation;
|
||||||
import tanya.container;
|
import tanya.container;
|
||||||
import tanya.container.entry;
|
import tanya.container.entry;
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
module tanya.container.string;
|
module tanya.container.string;
|
||||||
|
|
||||||
import std.algorithm.comparison;
|
import std.algorithm.comparison;
|
||||||
import std.algorithm.mutation : bringToFront, copy, swap;
|
import std.algorithm.mutation : bringToFront, copy;
|
||||||
import std.algorithm.searching;
|
import std.algorithm.searching;
|
||||||
static import std.range;
|
static import std.range;
|
||||||
import tanya.algorithm.mutation;
|
import tanya.algorithm.mutation;
|
||||||
|
@ -15,8 +15,9 @@
|
|||||||
module tanya.math.mp;
|
module tanya.math.mp;
|
||||||
|
|
||||||
import std.algorithm.comparison;
|
import std.algorithm.comparison;
|
||||||
import std.algorithm.mutation;
|
import std.algorithm.mutation : fill, copy, reverse;
|
||||||
import std.range;
|
import std.range;
|
||||||
|
import tanya.algorithm.mutation;
|
||||||
import tanya.container.array;
|
import tanya.container.array;
|
||||||
import tanya.encoding.ascii;
|
import tanya.encoding.ascii;
|
||||||
import tanya.memory;
|
import tanya.memory;
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
module tanya.memory.smartref;
|
module tanya.memory.smartref;
|
||||||
|
|
||||||
import std.algorithm.comparison;
|
import std.algorithm.comparison;
|
||||||
import std.algorithm.mutation;
|
import tanya.algorithm.mutation;
|
||||||
import tanya.conv;
|
import tanya.conv;
|
||||||
import tanya.exception;
|
import tanya.exception;
|
||||||
import tanya.memory;
|
import tanya.memory;
|
||||||
|
Loading…
Reference in New Issue
Block a user