Make passed length parameter const

This commit is contained in:
Eugen Wissner 2017-01-16 10:56:45 +01:00
parent 20c8b659d1
commit c7eb233fc7

View File

@ -20,30 +20,6 @@ import std.meta;
import std.traits; import std.traits;
import tanya.memory; import tanya.memory;
version (unittest)
{
struct SWithDtor
{
~this() @nogc
{
}
}
struct ConstEqualsStruct
{
int opEquals(typeof(this) that) const @nogc
{
return true;
}
}
struct MutableEqualsStruct
{
int opEquals(typeof(this) that) @nogc
{
return true;
}
}
}
// Defines the container's primary range. // Defines the container's primary range.
private struct Range(E) private struct Range(E)
{ {
@ -77,7 +53,7 @@ private struct Range(E)
alias opDollar = length; alias opDollar = length;
@property ref inout(E) front() inout @trusted @property ref inout(E) front() inout
in in
{ {
assert(!empty); assert(!empty);
@ -282,7 +258,7 @@ struct Vector(T)
* len = Initial length of the vector. * len = Initial length of the vector.
* allocator = Allocator. * allocator = Allocator.
*/ */
this(size_t len, shared Allocator allocator = defaultAllocator) this(in size_t len, shared Allocator allocator = defaultAllocator)
{ {
this(allocator); this(allocator);
length = len; length = len;
@ -296,15 +272,9 @@ struct Vector(T)
* init = Initial value to fill the vector with. * init = Initial value to fill the vector with.
* allocator = Allocator. * allocator = Allocator.
*/ */
this(size_t len, T init, shared Allocator allocator = defaultAllocator) @trusted this(in size_t len, T init, shared Allocator allocator = defaultAllocator) @trusted
{ {
this(allocator); this(allocator);
vector = cast(T*) allocator.allocate(len * T.sizeof);
if (len == 0)
{
return;
}
reserve(len); reserve(len);
uninitializedFill(vector[0 .. len], init); uninitializedFill(vector[0 .. len], init);
length_ = len; length_ = len;
@ -745,13 +715,15 @@ struct Vector(T)
* Precondition: $(D_INLINECODE length > pos) * Precondition: $(D_INLINECODE length > pos)
*/ */
ref T opIndexAssign(ref T value, in size_t pos) ref T opIndexAssign(ref T value, in size_t pos)
in
{ {
assert(length > pos); return opIndex(pos) = value;
} }
body
@safe unittest
{ {
return *(vector + pos) = value; Vector!int a = Vector!int(1);
a[0] = 5;
assert(a[0] == 5);
} }
/// Ditto. /// Ditto.
@ -858,56 +830,19 @@ struct Vector(T)
*/ */
bool opEquals()(auto ref typeof(this) v) bool opEquals()(auto ref typeof(this) v)
{ {
if (length != v.length) return equal(opIndex(), v[]);
{
return false;
}
const T* end = vector + length_;
for (T* v1 = vector, v2 = v.vector; v1 != end; ++v1, ++v2)
{
if (*v1 != *v2)
{
return false;
}
}
return true;
} }
/// Ditto. /// Ditto.
bool opEquals()(in auto ref typeof(this) v) const bool opEquals()(in auto ref typeof(this) v) const
{ {
if (length != v.length) return equal(opIndex(), v[]);
{
return false;
}
const T* end = vector + length_;
for (const(T)* v1 = vector, v2 = v.vector; v1 != end; ++v1, ++v2)
{
if (*v1 != *v2)
{
return false;
}
}
return true;
} }
/// Ditto. /// Ditto.
bool opEquals(Range!T v) bool opEquals(Range!T v)
{ {
if (length != v.length) return equal(opIndex(), v);
{
return false;
}
const T* end = vector + length_;
for (T* v1 = vector; v1 != end; ++v1)
{
if (*v1 != v.front)
{
return false;
}
v.popFront();
}
return true;
} }
/** /**
@ -915,28 +850,15 @@ struct Vector(T)
* *
* Params: * Params:
* R = Right hand side type. * R = Right hand side type.
* v = The vector to compare with. * v = Right hand side vector range.
* *
* Returns: $(D_KEYWORD true) if the vectors are equal, $(D_KEYWORD false) * Returns: $(D_KEYWORD true) if the vector and the range are equal,
* otherwise. * $(D_KEYWORD false) otherwise.
*/ */
bool opEquals(R)(Range!R v) const bool opEquals(R)(Range!R v) const
if (is(Unqual!R == T)) if (is(Unqual!R == T))
{ {
if (length != v.length) return equal(opIndex(), v);
{
return false;
}
const T* end = vector + length_;
for (const(T)* v1 = vector; v1 != end; ++v1)
{
if (*v1 != v.front)
{
return false;
}
v.popFront();
}
return true;
} }
/// ///
@ -1076,7 +998,7 @@ struct Vector(T)
* *
* Precondition: $(D_INLINECODE length > 0) * Precondition: $(D_INLINECODE length > 0)
*/ */
@property ref inout(T) front() inout @trusted @property ref inout(T) front() inout
in in
{ {
assert(!empty); assert(!empty);
@ -1087,7 +1009,7 @@ struct Vector(T)
} }
/// ///
unittest @safe unittest
{ {
auto v = Vector!int([5]); auto v = Vector!int([5]);
@ -1212,8 +1134,8 @@ struct Vector(T)
* *
* Returns: Slice with the assigned part of the vector. * Returns: Slice with the assigned part of the vector.
* *
* Precondition: $(D_INLINECODE i <= j && j <= length); * Precondition: $(D_INLINECODE i <= j && j <= length
* The lenghts of the range and slice match. * && value.length == j - i)
*/ */
Range!T opSliceAssign(ref T value, in size_t i, in size_t j) Range!T opSliceAssign(ref T value, in size_t i, in size_t j)
in in
@ -1364,35 +1286,56 @@ unittest
assert(v2[] == v2); assert(v2[] == v2);
assert(v2[] != v1); assert(v2[] != v1);
assert(v1[] != v2); assert(v1[] != v2);
assert(v1[] == v1[]); assert(v1[].equal(v1[]));
assert(v2[] == v2[]); assert(v2[].equal(v2[]));
assert(!v1[].equal(v2[]));
} }
@nogc unittest @nogc unittest
{ {
struct MutableEqualsStruct
{
int opEquals(typeof(this) that) @nogc
{
return true;
}
}
struct ConstEqualsStruct
{
int opEquals(in typeof(this) that) const @nogc
{
return true;
}
}
auto v1 = Vector!ConstEqualsStruct(); auto v1 = Vector!ConstEqualsStruct();
auto v2 = Vector!ConstEqualsStruct(); auto v2 = Vector!ConstEqualsStruct();
assert(v1 == v2); assert(v1 == v2);
assert(v1[] == v2); assert(v1[] == v2);
assert(v1 == v2[]); assert(v1 == v2[]);
assert(v1[] == v2[]); assert(v1[].equal(v2[]));
auto v3 = const Vector!ConstEqualsStruct(); auto v3 = const Vector!ConstEqualsStruct();
auto v4 = const Vector!ConstEqualsStruct(); auto v4 = const Vector!ConstEqualsStruct();
assert(v3 == v4); assert(v3 == v4);
assert(v3[] == v4); assert(v3[] == v4);
assert(v3 == v4[]); assert(v3 == v4[]);
assert(v3[] == v4[]); assert(v3[].equal(v4[]));
auto v7 = Vector!MutableEqualsStruct(1, MutableEqualsStruct()); auto v7 = Vector!MutableEqualsStruct(1, MutableEqualsStruct());
auto v8 = Vector!MutableEqualsStruct(1, MutableEqualsStruct()); auto v8 = Vector!MutableEqualsStruct(1, MutableEqualsStruct());
assert(v7 == v8); assert(v7 == v8);
assert(v7[] == v8); assert(v7[] == v8);
assert(v7 == v8[]); assert(v7 == v8[]);
assert(equal(v7[], v8[])); assert(v7[].equal(v8[]));
} }
@nogc unittest @nogc unittest
{ {
struct SWithDtor
{
~this() @nogc
{
}
}
auto v = Vector!SWithDtor(); // Destructor can destroy empty vectors. auto v = Vector!SWithDtor(); // Destructor can destroy empty vectors.
} }