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

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