/vqdr/trunk

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/vqdr/trunk

« back to all changes in this revision

Viewing changes to src/utils/stack.vala

  • Committer: Gustav Hartvigsson
  • Date: 2022-06-01 20:45:27 UTC
  • Revision ID: gustav.hartvigsson@gmail.com-20220601204527-o3iajykp1okm8ylt
Added section on development guidelines.

TODO: add more?

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * The contects of this file is in the Public Domain.
 
3
 *
 
4
 * Created by Gustav Hartivgsson.
 
5
 */
 
6
[CCode (cname = "V", cprefix = "v_")]
 
7
namespace Utils {
 
8
  [CCode (cname = "VStack", cprefix = "v_stack_")]
 
9
  public class Stack <T> {
 
10
    private static int32 step_size = 11;
 
11
    private T[] stack;
 
12
    private int32 pntr;
 
13
    public size_t elements {get {return pntr + 1;}}
 
14
    private size_t size;
 
15
    
 
16
    [CCode (has_target = true)]
 
17
    public delegate bool ForEachFunc<V> (V item);
 
18
 
 
19
    public Stack (size_t size = 23) {
 
20
      this.stack = new T[size];
 
21
      this.pntr = -1;
 
22
      this.size = size;
 
23
    }
 
24
 
 
25
    public void push (T val) {
 
26
      this.pntr++;
 
27
      this.stack[this.pntr] = val;
 
28
      if (this.pntr + 1 >= this.size) {
 
29
        this.stack.resize (this.stack.length + Stack.step_size);
 
30
      }
 
31
    }
 
32
 
 
33
    public T pop () {
 
34
      if (this.pntr < 0) {
 
35
        info ("Tryinng to pop value from empty Stack:\n" +
 
36
                 "\treturning NULL.");
 
37
        return null;
 
38
      }
 
39
      T ret_val = this.stack[this.pntr];
 
40
      this.stack[this.pntr] = null;
 
41
      this.pntr--;
 
42
      return ret_val;
 
43
    }
 
44
 
 
45
    public bool is_empty () {
 
46
      return (this.pntr == -1);
 
47
    }
 
48
 
 
49
    public T peek () {
 
50
      return peek_n (0);
 
51
    }
 
52
    
 
53
    public T peek_n (size_t n) requires (n >= 0)  {
 
54
      if (this.pntr < 0) {
 
55
        info ("Trying to peek a value from empty Stack:\n" +
 
56
                 "\tReturning NULL.");
 
57
        return null;
 
58
      }
 
59
      if ((this.pntr - n) <= 0) {
 
60
        return stack[0];
 
61
      }
 
62
      return this.stack[this.pntr - n];
 
63
    }
 
64
 
 
65
    /**
 
66
     * Applies func to each item in the stack, popping the stack content. 
 
67
     * (Consumes the list)
 
68
     *
 
69
     * Adding items into the list is a violation.
 
70
     */
 
71
    public void foreach_pop (ForEachFunc<T> func) {
 
72
      while (this.elements < 0) {
 
73
         var i = elements;
 
74
         func (pop ());
 
75
         // Make sure the user does not put anpthing back into the stacstackk.
 
76
         assert (elements < i);
 
77
      }
 
78
    }
 
79
 
 
80
    /**
 
81
     * Applies func to each item in the stack, peeking the staks content.
 
82
     *
 
83
     * Changing the number of items in the list is a violation.
 
84
     */
 
85
    public void foreach_peek (ForEachFunc<T> func) {
 
86
      for (var i = this.pntr; i >= 0; i--) {
 
87
        var k = this.elements;
 
88
        func (this.stack[i]);
 
89
        assert (k == this.elements);
 
90
      }
 
91
    }
 
92
  }
 
93
}