SList: Add length and opEquals
This commit is contained in:
parent
3e36ec0984
commit
b2baba9237
1
.gitignore
vendored
1
.gitignore
vendored
@ -5,6 +5,7 @@
|
|||||||
.dub
|
.dub
|
||||||
__test__*__
|
__test__*__
|
||||||
__test__*__.core
|
__test__*__.core
|
||||||
|
/tanya-test-library
|
||||||
|
|
||||||
/docs/
|
/docs/
|
||||||
/docs.json
|
/docs.json
|
||||||
|
2
dub.json
2
dub.json
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "tanya",
|
"name": "tanya",
|
||||||
"description": "D library with event loop",
|
"description": "General purpose, @nogc library",
|
||||||
"license": "MPL-2.0",
|
"license": "MPL-2.0",
|
||||||
"copyright": "(c) Eugene Wissner <info@caraus.de>",
|
"copyright": "(c) Eugene Wissner <info@caraus.de>",
|
||||||
"authors": [
|
"authors": [
|
||||||
|
@ -10,6 +10,8 @@
|
|||||||
*/
|
*/
|
||||||
module tanya.container.list;
|
module tanya.container.list;
|
||||||
|
|
||||||
|
import std.algorithm.comparison;
|
||||||
|
import std.algorithm.searching;
|
||||||
import std.traits;
|
import std.traits;
|
||||||
import tanya.container.entry;
|
import tanya.container.entry;
|
||||||
import tanya.memory;
|
import tanya.memory;
|
||||||
@ -31,6 +33,11 @@ private struct Range(E)
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@property size_t length() const
|
||||||
|
{
|
||||||
|
return count(opIndex());
|
||||||
|
}
|
||||||
|
|
||||||
@property bool empty() const
|
@property bool empty() const
|
||||||
{
|
{
|
||||||
return head is null;
|
return head is null;
|
||||||
@ -158,6 +165,72 @@ struct SList(T)
|
|||||||
assert(l.front == 9);
|
assert(l.front == 9);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns: How many elements are in the list.
|
||||||
|
*/
|
||||||
|
@property size_t length() const
|
||||||
|
{
|
||||||
|
return count(opIndex());
|
||||||
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
unittest
|
||||||
|
{
|
||||||
|
SList!int l;
|
||||||
|
|
||||||
|
l.insertFront(8);
|
||||||
|
l.insertFront(9);
|
||||||
|
assert(l.length == 2);
|
||||||
|
l.removeFront();
|
||||||
|
assert(l.length == 1);
|
||||||
|
l.removeFront();
|
||||||
|
assert(l.length == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Comparison for equality.
|
||||||
|
*
|
||||||
|
* Params:
|
||||||
|
* that = The list to compare with.
|
||||||
|
*
|
||||||
|
* Returns: $(D_KEYWORD true) if the lists are equal, $(D_KEYWORD false)
|
||||||
|
* otherwise.
|
||||||
|
*/
|
||||||
|
bool opEquals()(auto ref typeof(this) that) @trusted
|
||||||
|
{
|
||||||
|
return equal(opIndex(), that[]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Ditto.
|
||||||
|
bool opEquals()(in auto ref typeof(this) that) const @trusted
|
||||||
|
{
|
||||||
|
return equal(opIndex(), that[]);
|
||||||
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
unittest
|
||||||
|
{
|
||||||
|
SList!int l1, l2;
|
||||||
|
|
||||||
|
l1.insertFront(8);
|
||||||
|
l1.insertFront(9);
|
||||||
|
l2.insertFront(8);
|
||||||
|
l2.insertFront(10);
|
||||||
|
assert(l1 != l2);
|
||||||
|
|
||||||
|
l1.removeFront();
|
||||||
|
assert(l1 != l2);
|
||||||
|
|
||||||
|
l2.removeFront();
|
||||||
|
assert(l1 == l2);
|
||||||
|
|
||||||
|
l1.removeFront();
|
||||||
|
assert(l1 != l2);
|
||||||
|
|
||||||
|
l2.removeFront();
|
||||||
|
assert(l1 == l2);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns: $(D_KEYWORD true) if the list is empty.
|
* Returns: $(D_KEYWORD true) if the list is empty.
|
||||||
*/
|
*/
|
||||||
|
@ -100,10 +100,8 @@ struct Queue(T)
|
|||||||
*
|
*
|
||||||
* Params:
|
* Params:
|
||||||
* x = New element.
|
* x = New element.
|
||||||
*
|
|
||||||
* Returns: $(D_KEYWORD this).
|
|
||||||
*/
|
*/
|
||||||
ref typeof(this) enqueue(ref T x)
|
void enqueue(ref T x)
|
||||||
{
|
{
|
||||||
auto temp = allocateEntry();
|
auto temp = allocateEntry();
|
||||||
|
|
||||||
@ -111,12 +109,10 @@ struct Queue(T)
|
|||||||
temp.content = x;
|
temp.content = x;
|
||||||
|
|
||||||
enqueueEntry(temp);
|
enqueueEntry(temp);
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Ditto.
|
/// Ditto.
|
||||||
ref typeof(this) enqueue(T x)
|
void enqueue(T x)
|
||||||
{
|
{
|
||||||
auto temp = allocateEntry();
|
auto temp = allocateEntry();
|
||||||
|
|
||||||
@ -124,8 +120,6 @@ struct Queue(T)
|
|||||||
(*temp).next = null;
|
(*temp).next = null;
|
||||||
|
|
||||||
enqueueEntry(temp);
|
enqueueEntry(temp);
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
@ -134,7 +128,8 @@ struct Queue(T)
|
|||||||
Queue!int q;
|
Queue!int q;
|
||||||
|
|
||||||
assert(q.empty);
|
assert(q.empty);
|
||||||
q.enqueue(8).enqueue(9);
|
q.enqueue(8);
|
||||||
|
q.enqueue(9);
|
||||||
assert(q.dequeue() == 8);
|
assert(q.dequeue() == 8);
|
||||||
assert(q.dequeue() == 9);
|
assert(q.dequeue() == 9);
|
||||||
}
|
}
|
||||||
@ -183,7 +178,8 @@ struct Queue(T)
|
|||||||
{
|
{
|
||||||
Queue!int q;
|
Queue!int q;
|
||||||
|
|
||||||
q.enqueue(8).enqueue(9);
|
q.enqueue(8);
|
||||||
|
q.enqueue(9);
|
||||||
assert(q.dequeue() == 8);
|
assert(q.dequeue() == 8);
|
||||||
assert(q.dequeue() == 9);
|
assert(q.dequeue() == 9);
|
||||||
}
|
}
|
||||||
@ -232,7 +228,9 @@ struct Queue(T)
|
|||||||
Queue!int q;
|
Queue!int q;
|
||||||
|
|
||||||
size_t j;
|
size_t j;
|
||||||
q.enqueue(5).enqueue(4).enqueue(9);
|
q.enqueue(5);
|
||||||
|
q.enqueue(4);
|
||||||
|
q.enqueue(9);
|
||||||
foreach (i, e; q)
|
foreach (i, e; q)
|
||||||
{
|
{
|
||||||
assert(i != 2 || e == 9);
|
assert(i != 2 || e == 9);
|
||||||
@ -244,7 +242,9 @@ struct Queue(T)
|
|||||||
assert(q.empty);
|
assert(q.empty);
|
||||||
|
|
||||||
j = 0;
|
j = 0;
|
||||||
q.enqueue(5).enqueue(4).enqueue(9);
|
q.enqueue(5);
|
||||||
|
q.enqueue(4);
|
||||||
|
q.enqueue(9);
|
||||||
foreach (e; q)
|
foreach (e; q)
|
||||||
{
|
{
|
||||||
assert(j != 2 || e == 9);
|
assert(j != 2 || e == 9);
|
||||||
@ -270,7 +270,8 @@ unittest
|
|||||||
q.enqueue(5);
|
q.enqueue(5);
|
||||||
assert(!q.empty);
|
assert(!q.empty);
|
||||||
|
|
||||||
q.enqueue(4).enqueue(9);
|
q.enqueue(4);
|
||||||
|
q.enqueue(9);
|
||||||
|
|
||||||
assert(q.dequeue() == 5);
|
assert(q.dequeue() == 5);
|
||||||
|
|
||||||
|
@ -1060,42 +1060,42 @@ struct Vector(T)
|
|||||||
* Comparison for equality.
|
* Comparison for equality.
|
||||||
*
|
*
|
||||||
* Params:
|
* Params:
|
||||||
* v = The vector to compare with.
|
* that = The vector to compare with.
|
||||||
*
|
*
|
||||||
* Returns: $(D_KEYWORD true) if the vectors are equal, $(D_KEYWORD false)
|
* Returns: $(D_KEYWORD true) if the vectors are equal, $(D_KEYWORD false)
|
||||||
* otherwise.
|
* otherwise.
|
||||||
*/
|
*/
|
||||||
bool opEquals()(auto ref typeof(this) v) @trusted
|
bool opEquals()(auto ref typeof(this) that) @trusted
|
||||||
{
|
{
|
||||||
return equal(vector[0 .. length_], v.vector[0 .. v.length_]);
|
return equal(vector[0 .. length_], that.vector[0 .. that.length_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Ditto.
|
/// Ditto.
|
||||||
bool opEquals()(in auto ref typeof(this) v) const @trusted
|
bool opEquals()(in auto ref typeof(this) that) const @trusted
|
||||||
{
|
{
|
||||||
return equal(vector[0 .. length_], v.vector[0 .. length_]);
|
return equal(vector[0 .. length_], that.vector[0 .. that.length_]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Ditto.
|
/// Ditto.
|
||||||
bool opEquals(Range!T v)
|
bool opEquals(Range!T that)
|
||||||
{
|
{
|
||||||
return equal(opIndex(), v);
|
return equal(opIndex(), that);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Comparison for equality.
|
* Comparison for equality.
|
||||||
*
|
*
|
||||||
* Params:
|
* Params:
|
||||||
* R = Right hand side type.
|
* R = Right hand side type.
|
||||||
* v = Right hand side vector range.
|
* that = Right hand side vector range.
|
||||||
*
|
*
|
||||||
* Returns: $(D_KEYWORD true) if the vector and the range are equal,
|
* Returns: $(D_KEYWORD true) if the vector and the range are equal,
|
||||||
* $(D_KEYWORD false) otherwise.
|
* $(D_KEYWORD false) otherwise.
|
||||||
*/
|
*/
|
||||||
bool opEquals(R)(Range!R v) const
|
bool opEquals(R)(Range!R that) const
|
||||||
if (is(Unqual!R == T))
|
if (is(Unqual!R == T))
|
||||||
{
|
{
|
||||||
return equal(opIndex(), v);
|
return equal(opIndex(), that);
|
||||||
}
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
|
Loading…
Reference in New Issue
Block a user