Vector: allow insert multiple items in insertBack
This commit is contained in:
parent
b3f4ea572e
commit
48e355b87f
@ -16,7 +16,7 @@ version (unittest)
|
|||||||
{
|
{
|
||||||
package struct ConstEqualsStruct
|
package struct ConstEqualsStruct
|
||||||
{
|
{
|
||||||
int opEquals(typeof(this) that) const
|
int opEquals(typeof(this) that) const @nogc
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -24,7 +24,7 @@ version (unittest)
|
|||||||
|
|
||||||
package struct MutableEqualsStruct
|
package struct MutableEqualsStruct
|
||||||
{
|
{
|
||||||
int opEquals(typeof(this) that)
|
int opEquals(typeof(this) that) @nogc
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -21,25 +21,13 @@ import tanya.memory;
|
|||||||
|
|
||||||
version (unittest)
|
version (unittest)
|
||||||
{
|
{
|
||||||
|
import tanya.container.entry;
|
||||||
struct SWithDtor
|
struct SWithDtor
|
||||||
{
|
{
|
||||||
bool opEquals(ref SWithDtor that)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
~this() @nogc
|
~this() @nogc
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct SConstEquals
|
|
||||||
{
|
|
||||||
bool opEquals(in ref SConstEquals that) const
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Defines the container's primary range.
|
// Defines the container's primary range.
|
||||||
@ -324,12 +312,6 @@ struct Vector(T)
|
|||||||
insertBack(init);
|
insertBack(init);
|
||||||
}
|
}
|
||||||
|
|
||||||
private unittest
|
|
||||||
{
|
|
||||||
// Implicitly convertible works.
|
|
||||||
auto v = Vector!int(IL(cast(short) 1, cast(short) 2));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new $(D_PSYMBOL Vector).
|
* Creates a new $(D_PSYMBOL Vector).
|
||||||
*
|
*
|
||||||
@ -415,11 +397,6 @@ struct Vector(T)
|
|||||||
capacity_ = length_ = 0;
|
capacity_ = length_ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
private unittest
|
|
||||||
{
|
|
||||||
auto v = Vector!SWithDtor(); // Destructor can destroy empty vectors.
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Copies the vector.
|
* Copies the vector.
|
||||||
*/
|
*/
|
||||||
@ -638,22 +615,25 @@ struct Vector(T)
|
|||||||
* Inserts the $(D_PARAM el) into the vector.
|
* Inserts the $(D_PARAM el) into the vector.
|
||||||
*
|
*
|
||||||
* Params:
|
* Params:
|
||||||
* R = Parameter type (single value or range).
|
* R = Parameter type (single values or a range).
|
||||||
* el = Value should be inserted.
|
* el = Values should be inserted.
|
||||||
*
|
*
|
||||||
* Returns: The number of elements inserted.
|
* Returns: The number of elements inserted.
|
||||||
*/
|
*/
|
||||||
size_t insertBack(R)(auto ref R el) @trusted
|
size_t insertBack(R...)(auto ref R el) @trusted
|
||||||
if (isImplicitlyConvertible!(R, T))
|
if (isImplicitlyConvertible!(R[0], T))
|
||||||
{
|
{
|
||||||
reserve(length_ + 1);
|
reserve(length_ + el.length);
|
||||||
if (capacity_ <= length_)
|
if (capacity_ <= length_)
|
||||||
{
|
{
|
||||||
onOutOfMemoryError();
|
onOutOfMemoryError();
|
||||||
}
|
}
|
||||||
emplace(vector + length_, el);
|
foreach (i; el)
|
||||||
++length_;
|
{
|
||||||
return 1;
|
emplace(vector + length_, i);
|
||||||
|
++length_;
|
||||||
|
}
|
||||||
|
return el.length;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Ditto.
|
/// Ditto.
|
||||||
@ -883,21 +863,6 @@ struct Vector(T)
|
|||||||
assert(v1 == v2);
|
assert(v1 == v2);
|
||||||
}
|
}
|
||||||
|
|
||||||
private unittest
|
|
||||||
{
|
|
||||||
auto v1 = Vector!SConstEquals();
|
|
||||||
auto v2 = Vector!SConstEquals();
|
|
||||||
assert(v1 == v2);
|
|
||||||
|
|
||||||
auto v3 = const Vector!SConstEquals();
|
|
||||||
auto v4 = const Vector!SConstEquals();
|
|
||||||
assert(v3 == v4);
|
|
||||||
|
|
||||||
auto v7 = Vector!SWithDtor();
|
|
||||||
auto v8 = Vector!SWithDtor();
|
|
||||||
assert(v7 == v8);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* $(D_KEYWORD foreach) iteration.
|
* $(D_KEYWORD foreach) iteration.
|
||||||
*
|
*
|
||||||
@ -1237,16 +1202,7 @@ unittest
|
|||||||
assert(r.front == v.front);
|
assert(r.front == v.front);
|
||||||
}
|
}
|
||||||
|
|
||||||
private @nogc unittest
|
@nogc unittest
|
||||||
{
|
|
||||||
// Test the destructor can be called at the end of the scope.
|
|
||||||
auto a = Vector!A();
|
|
||||||
|
|
||||||
// Test that structs can be members of the vector.
|
|
||||||
static assert(is(typeof(Vector!SWithDtor())));
|
|
||||||
}
|
|
||||||
|
|
||||||
private @nogc unittest
|
|
||||||
{
|
{
|
||||||
const v1 = Vector!int();
|
const v1 = Vector!int();
|
||||||
const Vector!int v2;
|
const Vector!int v2;
|
||||||
@ -1254,7 +1210,7 @@ private @nogc unittest
|
|||||||
static assert(is(PointerTarget!(typeof(v3.vector)) == const(int)));
|
static assert(is(PointerTarget!(typeof(v3.vector)) == const(int)));
|
||||||
}
|
}
|
||||||
|
|
||||||
private @nogc unittest
|
@nogc unittest
|
||||||
{
|
{
|
||||||
// Test that const vectors return usable ranges.
|
// Test that const vectors return usable ranges.
|
||||||
auto v = const Vector!int(IL(1, 2, 4));
|
auto v = const Vector!int(IL(1, 2, 4));
|
||||||
@ -1275,7 +1231,7 @@ private @nogc unittest
|
|||||||
static assert(is(typeof(r2[])));
|
static assert(is(typeof(r2[])));
|
||||||
}
|
}
|
||||||
|
|
||||||
private @nogc unittest
|
@nogc unittest
|
||||||
{
|
{
|
||||||
Vector!int v1;
|
Vector!int v1;
|
||||||
const Vector!int v2;
|
const Vector!int v2;
|
||||||
@ -1286,4 +1242,32 @@ private @nogc unittest
|
|||||||
assert(r1.length == 0);
|
assert(r1.length == 0);
|
||||||
assert(r2.empty);
|
assert(r2.empty);
|
||||||
assert(r1 == r2);
|
assert(r1 == r2);
|
||||||
|
|
||||||
|
v1.insertBack(1, 2, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
@nogc unittest
|
||||||
|
{
|
||||||
|
auto v1 = Vector!ConstEqualsStruct();
|
||||||
|
auto v2 = Vector!ConstEqualsStruct();
|
||||||
|
assert(v1 == v2);
|
||||||
|
|
||||||
|
auto v3 = const Vector!ConstEqualsStruct();
|
||||||
|
auto v4 = const Vector!ConstEqualsStruct();
|
||||||
|
assert(v3 == v4);
|
||||||
|
|
||||||
|
auto v7 = Vector!MutableEqualsStruct();
|
||||||
|
auto v8 = Vector!MutableEqualsStruct();
|
||||||
|
assert(v7 == v8);
|
||||||
|
}
|
||||||
|
|
||||||
|
@nogc unittest
|
||||||
|
{
|
||||||
|
// Implicitly convertible works.
|
||||||
|
auto v = Vector!int(IL(cast(short) 1, cast(short) 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
@nogc unittest
|
||||||
|
{
|
||||||
|
auto v = Vector!SWithDtor(); // Destructor can destroy empty vectors.
|
||||||
}
|
}
|
||||||
|
@ -303,7 +303,7 @@ unittest
|
|||||||
|
|
||||||
version (unittest)
|
version (unittest)
|
||||||
{
|
{
|
||||||
class A
|
private class A
|
||||||
{
|
{
|
||||||
uint *destroyed;
|
uint *destroyed;
|
||||||
|
|
||||||
@ -318,7 +318,7 @@ version (unittest)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct B
|
private struct B
|
||||||
{
|
{
|
||||||
int prop;
|
int prop;
|
||||||
@disable this();
|
@disable this();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user