Add algorithm.mutation.swap
This commit is contained in:
		| @@ -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; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user