1 module nxt.appender_stack;
2 
3 /** Stack using `std.array.Appender`.
4  *
5  * See_Also: http://forum.dlang.org/thread/wswbtzakdvpgaebuhbom@forum.dlang.org
6  */
7 struct Stack(T)
8 {
9     import std.array: Appender;
10 
11     @property ref inout(T) top() inout
12     {
13         return _app.data[$ - 1];
14     }
15 
16     @property bool empty() const
17     {
18         return _app.data.length == 0;
19     }
20 
21     /// Pop back value.
22     void pop()
23     {
24         _app.shrinkTo(_app.data.length - 1);
25     }
26 
27     /// Pop back value and return it.
28     T backPop()
29     {
30         T value = top;
31         _app.shrinkTo(_app.data.length - 1);
32         return value;
33     }
34 
35     void push(T t)
36     {
37         _app.put(t);
38     }
39 
40     private Appender!(T[]) _app;
41 }
42 
43 @safe pure unittest
44 {
45     alias T = uint;
46 
47     Stack!T s;
48     assert(s.empty);
49 
50     // pushBack:
51 
52     s.push(13);
53     assert(!s.empty);
54     assert(s.top == 13);
55 
56     s.push(14);
57     assert(!s.empty);
58     assert(s.top == 14);
59 
60     s.push(15);
61     assert(!s.empty);
62     assert(s.top == 15);
63 
64     // pop:
65 
66     s.pop();
67     assert(!s.empty);
68     assert(s.top == 14);
69 
70     s.pop();
71     assert(!s.empty);
72     assert(s.top == 13);
73 
74     s.pop();
75     assert(s.empty);
76 
77     // push:
78 
79     s.push(13);
80     s.push(14);
81     s.push(15);
82     assert(!s.empty);
83     assert(s.top == 15);
84 
85     // backPop:
86 
87     assert(s.backPop() == 15);
88     assert(s.backPop() == 14);
89     assert(s.backPop() == 13);
90 
91     assert(s.empty);
92 }