From 48e355b87f672914a35c15ef83026a3ef26cee4c Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Mon, 2 Jan 2017 12:47:41 +0100 Subject: Vector: allow insert multiple items in insertBack --- source/tanya/container/entry.d | 4 +- source/tanya/container/vector.d | 102 +++++++++++++++++----------------------- source/tanya/memory/types.d | 4 +- 3 files changed, 47 insertions(+), 63 deletions(-) (limited to 'source') diff --git a/source/tanya/container/entry.d b/source/tanya/container/entry.d index ce267a0..0515c54 100644 --- a/source/tanya/container/entry.d +++ b/source/tanya/container/entry.d @@ -16,7 +16,7 @@ version (unittest) { package struct ConstEqualsStruct { - int opEquals(typeof(this) that) const + int opEquals(typeof(this) that) const @nogc { return true; } @@ -24,7 +24,7 @@ version (unittest) package struct MutableEqualsStruct { - int opEquals(typeof(this) that) + int opEquals(typeof(this) that) @nogc { return true; } diff --git a/source/tanya/container/vector.d b/source/tanya/container/vector.d index 7fc9e84..a51a77a 100644 --- a/source/tanya/container/vector.d +++ b/source/tanya/container/vector.d @@ -21,25 +21,13 @@ import tanya.memory; version (unittest) { + import tanya.container.entry; struct SWithDtor { - bool opEquals(ref SWithDtor that) - { - return true; - } - ~this() @nogc { } } - - struct SConstEquals - { - bool opEquals(in ref SConstEquals that) const - { - return true; - } - } } // Defines the container's primary range. @@ -324,12 +312,6 @@ struct Vector(T) insertBack(init); } - private unittest - { - // Implicitly convertible works. - auto v = Vector!int(IL(cast(short) 1, cast(short) 2)); - } - /** * Creates a new $(D_PSYMBOL Vector). * @@ -415,11 +397,6 @@ struct Vector(T) capacity_ = length_ = 0; } - private unittest - { - auto v = Vector!SWithDtor(); // Destructor can destroy empty vectors. - } - /** * Copies the vector. */ @@ -638,22 +615,25 @@ struct Vector(T) * Inserts the $(D_PARAM el) into the vector. * * Params: - * R = Parameter type (single value or range). - * el = Value should be inserted. + * R = Parameter type (single values or a range). + * el = Values should be inserted. * * Returns: The number of elements inserted. */ - size_t insertBack(R)(auto ref R el) @trusted - if (isImplicitlyConvertible!(R, T)) + size_t insertBack(R...)(auto ref R el) @trusted + if (isImplicitlyConvertible!(R[0], T)) { - reserve(length_ + 1); + reserve(length_ + el.length); if (capacity_ <= length_) { onOutOfMemoryError(); } - emplace(vector + length_, el); - ++length_; - return 1; + foreach (i; el) + { + emplace(vector + length_, i); + ++length_; + } + return el.length; } /// Ditto. @@ -883,21 +863,6 @@ struct Vector(T) 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. * @@ -1237,16 +1202,7 @@ unittest assert(r.front == v.front); } -private @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 +@nogc unittest { const v1 = Vector!int(); const Vector!int v2; @@ -1254,7 +1210,7 @@ private @nogc unittest static assert(is(PointerTarget!(typeof(v3.vector)) == const(int))); } -private @nogc unittest +@nogc unittest { // Test that const vectors return usable ranges. auto v = const Vector!int(IL(1, 2, 4)); @@ -1275,7 +1231,7 @@ private @nogc unittest static assert(is(typeof(r2[]))); } -private @nogc unittest +@nogc unittest { Vector!int v1; const Vector!int v2; @@ -1286,4 +1242,32 @@ private @nogc unittest assert(r1.length == 0); assert(r2.empty); 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. } diff --git a/source/tanya/memory/types.d b/source/tanya/memory/types.d index 4e3eb36..5e2f974 100644 --- a/source/tanya/memory/types.d +++ b/source/tanya/memory/types.d @@ -303,7 +303,7 @@ unittest version (unittest) { - class A + private class A { uint *destroyed; @@ -318,7 +318,7 @@ version (unittest) } } - struct B + private struct B { int prop; @disable this(); -- cgit v1.2.3