1 //Written in the D programming language
2 /*
3  * Simple queue.
4  *
5  * Copyright 2009-2016 Jaypha
6  *
7  * Distributed under the Boost Software License, Version 1.0.
8  * (See http://www.boost.org/LICENSE_1_0.txt)
9  *
10  * Authors: Jason den Dulk
11  */
12 
13 module jaypha.container.queue;
14 
15 import std.array;
16 
17 //----------------------------------------------------------------------------
18 struct Queue(E)
19 //----------------------------------------------------------------------------
20 {
21   alias Queue!E Q;
22 
23   private:
24 
25     E[] theQueue;
26 
27   public:
28 
29     void put(E e)
30     {
31       theQueue ~= e;
32     }
33 
34     Q opOpAssign(string op)(E e) if (op == "~")
35     {
36       theQueue ~= e;
37       return this;
38     }
39 
40     Q opOpAssign(string op)(E[] e) if (op == "~")
41     {
42       theQueue ~= e;
43       return this;
44     }
45 
46     Q opOpAssign(string op)(Q q) if (op == "~")
47     {
48       theQueue ~= q.theQueue;
49       return this;
50     }
51 
52     @property bool empty() { return theQueue.empty; }
53     @property ref E front() { return theQueue.front; }
54     void popFront() { theQueue.popFront(); }
55 }
56 
57 //----------------------------------------------------------------------------
58 
59 unittest
60 {
61   Queue!long queue;
62 
63   assert(queue.empty);
64 
65   queue.put(4);
66 
67   assert(!queue.empty);
68   assert(queue.front == 4);
69 
70   queue.put(12);
71 
72   assert(queue.front == 4);
73 
74   queue.put(8);
75 
76   assert(queue.front == 4);
77 
78   queue.popFront();
79 
80   assert(queue.front == 12);
81 
82   queue.put(1);
83 
84   assert(queue.front == 12);
85 
86   queue.popFront();
87 
88   assert(queue.front == 8);
89 
90   queue.popFront();
91 
92   assert(queue.front == 1);
93 
94   queue.popFront();
95 
96   assert(queue.empty);
97 
98   queue.put(3);
99   assert(queue.theQueue == [3]);
100   queue ~= 4;
101   assert(queue.theQueue == [3,4]);
102   queue ~= [8,7];
103   assert(queue.theQueue == [3,4,8,7]);
104 
105   Queue!long queue2;
106   queue2 ~= [10,12];
107   queue ~= queue2;  
108   assert(queue.theQueue == [3,4,8,7,10,12]);
109 }
110 
111 //----------------------------------------------------------------------------