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 }