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