Implement pow
[fur] / templates / stack.c
1 struct _StackNode;
2 typedef struct _StackNode _StackNode;
3 struct _StackNode {
4   Object value;
5   _StackNode* next;
6 };
7
8 struct Stack;
9 typedef struct Stack Stack;
10 struct Stack {
11   _StackNode* top;
12 };
13
14 void Stack_initialize(Stack* self) {
15   self->top = NULL;
16 }
17
18 bool Stack_isEmpty(Stack* self) {
19   return self->top == NULL;
20 }
21
22 Object Stack_pop(Stack*);
23
24 void Stack_deinitialize(Stack* self) {
25   while(self->top != NULL) {
26     Object o = Stack_pop(self);
27     Object_deinitialize(&o);
28   }
29 }
30
31 void Stack_push(Stack* self, Object value) {
32   _StackNode* node = malloc(sizeof(_StackNode));
33   node->value = value;
34   node->next = self->top;
35   self->top = node;
36 }
37
38 Object Stack_pop(Stack* self) {
39   assert(self->top != NULL);
40
41   _StackNode* node = self->top;
42   self->top = node->next;
43
44   Object result = node->value;
45   free(node);
46   return result;
47 }