/vqdr/trunk

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/vqdr/trunk
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
namespace Utils {
  [CCode (cname = "VStack", cprefix = "v_stack_")]
  public class Stack <T> {
    private static int step_size = 11;
    private T[] stack;
    private int pntr;
    public size_t elements {get {return pntr + 1;}}
    private size_t size;
    
    [CCode (has_target = true)]
    public delegate bool ForEachFunc<V> (V item);

    public Stack (size_t size = 23) {
      this.stack = new T[size];
      this.pntr = -1;
      this.size = size;
    }

    public void push (T val) {
      this.pntr++;
      this.stack[this.pntr] = val;
      if (this.pntr + 1 >= this.size) {
        this.stack.resize (this.stack.length + Stack.step_size);
      }
    }

    public T pop () {
      if (this.pntr < 0) {
        info ("Tryinng to pop value from empty Stack:\n" +
                 "\treturning NULL.");
        return null;
      }
      T ret_val = this.stack[this.pntr];
      this.stack[this.pntr] = null;
      this.pntr--;
      return ret_val;
    }

    public bool is_empty () {
      return (this.pntr == -1);
    }

    public T peek () {
      return peek_n (0);
    }
    
    public T peek_n (size_t n) requires (n >= 0)  {
      if (this.pntr < 0) {
        info ("Trying to peek a value from empty Stack:\n" +
                 "\tReturning NULL.");
        return null;
      }
      if ((this.pntr - n) <= 0) {
        return stack[0];
      }
      return this.stack[this.pntr - n];
    }

    /**
     * Applies func to each item in the stack, popping the stack content. 
     * (Consumes the list)
     *
     * Adding items into the list is a violation.
     */
    public void foreach_pop (ForEachFunc<T> func) {
      while (this.elements < 0) {
         var i = elements;
         func (pop ());
         // Make sure the user does not put anpthing back into the stacstackk.
         assert (elements < i);
      }
    }

    /**
     * Applies func to each item in the stack, peeking the staks content.
     *
     * Changing the number of items in the list is a violation.
     */
    public void foreach_peek (ForEachFunc<T> func) {
      for (var i = this.pntr; i >= 0; i--) {
        var k = this.elements;
        func (this.stack[i]);
        assert (k == this.elements);
      }
    }
  }
}