comparison doodle/containers/stack.d @ 40:1f97022e5c6d

Checkpoint. Development continues...
author daveb
date Mon, 12 Apr 2010 14:01:54 +0930
parents
children
comparison
equal deleted inserted replaced
39:b6c34f1fc7f3 40:1f97022e5c6d
1 module doodle.containers.stack;
2
3 class Stack(T) {
4 this() {
5 _data.length = 1;
6 }
7
8 bool isEmpty() {
9 return _depth == 0;
10 }
11
12 void push(T t) {
13 if (_depth == _data.length) {
14 // Need it to grow
15 _data.length = 2 * _data.length;
16 }
17
18 _data[_depth] = t;
19 ++_depth;
20 }
21
22 T pop() {
23 assert(!isEmpty());
24 --_depth;
25 auto t = _data[_depth];
26 _data[_depth] = T.init;
27 return t;
28 }
29
30 T top() {
31 assert(!isEmpty());
32 return _data[_depth - 1];
33 }
34
35 void top(T t) {
36 assert(!isEmpty());
37 _data[_depth - 1] = t;
38 }
39
40 void clear() {
41 while (_depth > 0) {
42 --_depth;
43 _data[_depth] = T.init;
44 }
45 }
46
47 void shrink() {
48 size_t new_l = _data.length;
49 do new_l /= 2; while (new_l > _depth * 2);
50 _data.length = new_l;
51 }
52
53 void capacity(size_t l) {
54 if (l > _data.length) {
55 size_t new_l = _data.length;
56 do new_l *= 2; while (new_l < l);
57 _data.length = new_l;
58 }
59 }
60
61 private {
62 size_t capacity() {
63 return _data.length;
64 }
65
66 size_t depth() {
67 return _depth;
68 }
69
70 T[] _data; // capacity
71 size_t _depth;
72 }
73 }
74 unittest {
75 auto s = new Stack!(int);
76
77 assert(s.capacity() == 1);
78
79 assert(s.depth() == 0);
80 s.push(15);
81 assert(s.depth() == 1);
82 assert(s.top() == 15);
83 assert(s.pop() == 15);
84 assert(s.depth() == 0);
85 assert(s.isEmpty());
86
87 assert(s.capacity() == 1);
88 s.push(12);
89 assert(s.capacity() == 1);
90 s.push(13);
91 assert(s.capacity() == 2);
92 s.push(14);
93 assert(s.depth() == 3);
94 assert(s.capacity() == 4);
95 s.push(s.pop());
96 assert(s.capacity() == 4);
97 }