From 8ee1d647ce31748f12e3e57d2c21a1bcbd7e1fa9 Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Mon, 29 May 2017 11:26:39 +0200 Subject: [PATCH] Close issue 212 Introduce Range and constRange aliases for containers. --- source/tanya/container/array.d | 54 +++++++++++++++++++--------------- source/tanya/container/list.d | 32 +++++++++++++------- source/tanya/container/set.d | 8 ++++- 3 files changed, 59 insertions(+), 35 deletions(-) diff --git a/source/tanya/container/array.d b/source/tanya/container/array.d index 647d510..9a2fdd5 100644 --- a/source/tanya/container/array.d +++ b/source/tanya/container/array.d @@ -174,6 +174,12 @@ struct Range(E) */ struct Array(T) { + /// The range types for $(D_PSYMBOL Array). + alias Range = .Range!T; + + /// Ditto. + alias ConstRange = .Range!(const T); + private size_t length_; private T* data; private size_t capacity_; @@ -638,7 +644,7 @@ struct Array(T) * * Precondition: $(D_PARAM r) refers to a region of $(D_KEYWORD this). */ - Range!T remove(Range!T r) @trusted + Range remove(Range r) @trusted in { assert(r.container is &this); @@ -648,9 +654,9 @@ struct Array(T) body { auto end = this.data + this.length; - moveAll(Range!T(this, r.end, end), Range!T(this, r.begin, end)); + moveAll(.Range!T(this, r.end, end), .Range!T(this, r.begin, end)); length = length - r.length; - return Range!T(this, r.begin, this.data + length); + return .Range!T(this, r.begin, this.data + length); } /// @@ -788,7 +794,7 @@ struct Array(T) * * Precondition: $(D_PARAM r) refers to a region of $(D_KEYWORD this). */ - size_t insertAfter(R)(Range!T r, R el) + size_t insertAfter(R)(Range r, R el) if (!isInfinite!R && isInputRange!R && isImplicitlyConvertible!(ElementType!R, T)) @@ -808,7 +814,7 @@ struct Array(T) } /// Ditto. - size_t insertAfter(size_t R)(Range!T r, T[R] el) + size_t insertAfter(size_t R)(Range r, T[R] el) in { assert(r.container is &this); @@ -821,7 +827,7 @@ struct Array(T) } /// Ditto. - size_t insertAfter(R)(Range!T r, auto ref R el) + size_t insertAfter(R)(Range r, auto ref R el) if (isImplicitlyConvertible!(R, T)) in { @@ -848,7 +854,7 @@ struct Array(T) } /// Ditto. - size_t insertBefore(R)(Range!T r, R el) + size_t insertBefore(R)(Range r, R el) if (!isInfinite!R && isInputRange!R && isImplicitlyConvertible!(ElementType!R, T)) @@ -860,11 +866,11 @@ struct Array(T) } body { - return insertAfter(Range!T(this, this.data, r.begin), el); + return insertAfter(.Range!T(this, this.data, r.begin), el); } /// Ditto. - size_t insertBefore(size_t R)(Range!T r, T[R] el) + size_t insertBefore(size_t R)(Range r, T[R] el) in { assert(r.container is &this); @@ -877,7 +883,7 @@ struct Array(T) } /// Ditto. - size_t insertBefore(R)(Range!T r, auto ref R el) + size_t insertBefore(R)(Range r, auto ref R el) if (isImplicitlyConvertible!(R, T)) in { @@ -993,7 +999,7 @@ struct Array(T) } /// Ditto. - Range!T opIndexAssign(E : T)(auto ref E value) + Range opIndexAssign(E : T)(auto ref E value) { return opSliceAssign(value, 0, length); } @@ -1017,13 +1023,13 @@ struct Array(T) * * Precondition: $(D_INLINECODE length == value.length). */ - Range!T opIndexAssign(size_t R)(T[R] value) + Range opIndexAssign(size_t R)(T[R] value) { return opSliceAssign!R(value, 0, length); } /// Ditto. - Range!T opIndexAssign(Range!T value) + Range opIndexAssign(Range value) { return opSliceAssign(value, 0, length); } @@ -1066,13 +1072,13 @@ struct Array(T) * Returns: Random access range that iterates over elements of the array, * in forward order. */ - Range!T opIndex() @trusted + Range opIndex() @trusted { return typeof(return)(this, this.data, this.data + length); } /// Ditto. - Range!(const T) opIndex() const @trusted + ConstRange opIndex() const @trusted { return typeof(return)(this, this.data, this.data + length); } @@ -1105,13 +1111,13 @@ struct Array(T) } /// Ditto. - bool opEquals()(const auto ref typeof(this) that) const @trusted + bool opEquals()(auto ref const typeof(this) that) const @trusted { return equal(this.data[0 .. length], that.data[0 .. that.length]); } /// Ditto. - bool opEquals(Range!T that) + bool opEquals(Range that) { return equal(opIndex(), that); } @@ -1126,8 +1132,8 @@ struct Array(T) * Returns: $(D_KEYWORD true) if the array and the range are equal, * $(D_KEYWORD false) otherwise. */ - bool opEquals(R)(Range!R that) const - if (is(Unqual!R == T)) + bool opEquals(R)(R that) const + if (is(R == Range) || is(R == ConstRange)) { return equal(opIndex(), that); } @@ -1216,7 +1222,7 @@ struct Array(T) * * Precondition: $(D_INLINECODE i <= j && j <= length). */ - Range!T opSlice(const size_t i, const size_t j) @trusted + Range opSlice(const size_t i, const size_t j) @trusted in { assert(i <= j); @@ -1228,7 +1234,7 @@ struct Array(T) } /// Ditto. - Range!(const T) opSlice(const size_t i, const size_t j) const @trusted + ConstRange opSlice(const size_t i, const size_t j) const @trusted in { assert(i <= j); @@ -1298,7 +1304,7 @@ struct Array(T) * Precondition: $(D_INLINECODE i <= j && j <= length * && value.length == j - i) */ - Range!T opSliceAssign(size_t R)(T[R] value, const size_t i, const size_t j) + Range opSliceAssign(size_t R)(T[R] value, const size_t i, const size_t j) @trusted in { @@ -1312,7 +1318,7 @@ struct Array(T) } /// Ditto. - Range!T opSliceAssign(R : T)(auto ref R value, const size_t i, const size_t j) + Range opSliceAssign(R : T)(auto ref R value, const size_t i, const size_t j) @trusted in { @@ -1326,7 +1332,7 @@ struct Array(T) } /// Ditto. - Range!T opSliceAssign(Range!T value, const size_t i, const size_t j) @trusted + Range opSliceAssign(Range value, const size_t i, const size_t j) @trusted in { assert(i <= j); diff --git a/source/tanya/container/list.d b/source/tanya/container/list.d index 1e6cd7a..1d5085d 100644 --- a/source/tanya/container/list.d +++ b/source/tanya/container/list.d @@ -93,6 +93,12 @@ struct SRange(E) */ struct SList(T) { + /// The range types for $(D_PSYMBOL SList). + alias Range = SRange!T; + + /// Ditto. + alias ConstRange = SRange!(const T); + private alias Entry = SEntry!T; // 0th element of the list. @@ -497,7 +503,7 @@ struct SList(T) } /// Ditto. - size_t insertBefore(SRange!T r, ref T el) @trusted + size_t insertBefore(Range r, ref T el) @trusted in { assert(checkRangeBelonging(r)); @@ -530,7 +536,7 @@ struct SList(T) * * Precondition: $(D_PARAM r) is extracted from this list. */ - size_t insertBefore(size_t R)(SRange!T r, T[R] el) + size_t insertBefore(size_t R)(Range r, T[R] el) { return insertFront!(T[])(el[]); } @@ -685,7 +691,7 @@ struct SList(T) * * Precondition: $(D_PARAM r) is extracted from this list. */ - SRange!T remove(SRange!T r) + Range remove(Range r) in { assert(checkRangeBelonging(r)); @@ -716,13 +722,13 @@ struct SList(T) * Returns: Range that iterates over all elements of the container, in * forward order. */ - SRange!T opIndex() + Range opIndex() { return typeof(return)(this.head); } /// Ditto. - SRange!(const T) opIndex() const + ConstRange opIndex() const { return typeof(return)(this.head); } @@ -966,6 +972,12 @@ struct DRange(E) */ struct DList(T) { + /// The range types for $(D_PSYMBOL DList). + alias Range = DRange!T; + + /// Ditto. + alias ConstRange = DRange!(const T); + private alias Entry = DEntry!T; // 0th and the last elements of the list. @@ -1536,7 +1548,7 @@ struct DList(T) } /// Ditto. - size_t insertBefore(DRange!T r, ref T el) @trusted + size_t insertBefore(Range r, ref T el) @trusted in { assert(checkRangeBelonging(r)); @@ -1569,7 +1581,7 @@ struct DList(T) * * Precondition: $(D_PARAM r) is extracted from this list. */ - size_t insertBefore(size_t R)(DRange!T r, T[R] el) + size_t insertBefore(size_t R)(Range r, T[R] el) { return insertFront!(T[])(el[]); } @@ -1728,7 +1740,7 @@ struct DList(T) * * Precondition: $(D_PARAM r) is extracted from this list. */ - DRange!T remove(DRange!T r) + Range remove(Range r) in { assert(checkRangeBelonging(r)); @@ -1768,13 +1780,13 @@ struct DList(T) * Returns: Range that iterates over all elements of the container, in * forward order. */ - DRange!T opIndex() + Range opIndex() { return typeof(return)(this.head, this.tail); } /// Ditto. - DRange!(const T) opIndex() const + ConstRange opIndex() const { return typeof(return)(this.head, this.tail); } diff --git a/source/tanya/container/set.d b/source/tanya/container/set.d index 62c8585..fc18992 100644 --- a/source/tanya/container/set.d +++ b/source/tanya/container/set.d @@ -3,7 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /** - * This module implements a $(D_PSymbol Set) container that stores unique + * This module implements a $(D_PSYMBOL Set) container that stores unique * values without any particular order. * * Copyright: Eugene Wissner 2017. @@ -47,6 +47,12 @@ struct Range(E) */ struct Set(T) { + /// The range types for $(D_PSYMBOL Set). + alias Range = .Range!T; + + /// Ditto. + alias ConstRange = .Range!(const T); + invariant { assert(this.lengthIndex < primes.length);