/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/libvqdr/token.vala

  • Committer: Gustav Hartvigsson
  • Date: 2021-11-10 20:42:21 UTC
  • Revision ID: gustav.hartvigsson@gmail.com-20211110204221-15t3jiam2oh4cc36
Changed over the Variabel class to use FastNumers

Show diffs side-by-side

added added

removed removed

Lines of Context:
4
4
namespace VQDR.Expression {
5
5
  
6
6
  public abstract class Token : GLib.Object {
7
 
    /** Precision used to perform evaluation */
8
 
    public const int VALUES_PRECISION_DIGITS = 3;
9
 
    /** Precision factor used to convert raw values to actual ones */
10
 
    public const int VALUES_PRECISION_FACTOR = 1000;
11
 
    //public static int VALUES_PRECISION_FACTOR = (int)Math.pow(10, VALUES_PRECISION_DIGITS);
12
7
    
13
 
    /** Precision used to output values */
14
 
    public const int VALUES_OUTPUT_PRECISION_DIGITS = 2;
15
 
    /** Precision factor used to evaluate output */
16
 
    public const int VALUES_OUTPUT_PRECISION_FACTOR = 100;
17
8
    //public static int VALUES_OUTPUT_PRECISION_FACTOR = (int)Math.pow(10, VALUES_OUTPUT_PRECISION_DIGITS);
18
9
    
19
10
    
26
17
    public const int MAX_TOKEN_ITERATIONS = 500;
27
18
    /** Max iteration number for the expression */
28
19
    public const int MAX_TOTAL_ITERATIONS = 5000;
29
 
 
30
 
    /* ************************************* */
31
 
    /* Operator precedence and associativity */
32
 
    /* ************************************* */
33
 
    /** Priority for assignment "=" operator */
34
 
    public const int PRIO_ASSIGNMENT = 0;
35
 
    /** Priority for conditional OR "||" operator */
36
 
    public const int PRIO_CONDITIONAL_OR = 2;
37
 
    /** Priority for conditional AND "&&" operator */
38
 
    public const int PRIO_CONDITIONAL_AND = 3;
39
 
    /** Priority for equality "==" and "!=" operators */
40
 
    public const int PRIO_EQUALITY = 4;
41
 
    /** Priority for comparison ">", "<", ">=", etc operators */
42
 
    public const int PRIO_COMPARISON = 5;
43
 
    /** Priority for addictive "+" and "-" operators */
44
 
    public const int PRIO_ADDICTIVE = 6;
45
 
    /** Priority for multiplicative "*" and "/" operators */
46
 
    public const int PRIO_MULTIPLICATIVE = 7;
47
 
    /** Priority for unary "+" and "-" and "!" operators */
48
 
    public const int PRIO_UNARY = 8;
49
 
    /** Priority for label assignment ":" operator */
50
 
    public const int PRIO_LABEL = 9;
51
 
    /** Priority for dice "d" operator */
52
 
    public const int PRIO_DICE = 10;
53
 
    /** Priority for functions */
54
 
    public const int PRIO_FUNCTION = 11;
55
 
    /** Priority for values */
56
 
    public const int PRIO_VALUE = 12;
57
 
 
58
 
    /** Generation to use to get the root with {@link #getParent} */
 
20
    
 
21
    
 
22
    /**
 
23
     * Operator precedence and associativity
 
24
     * 
 
25
     * higher number is higher priority, and is to be done befroe those
 
26
     * with lower number.
 
27
     */
 
28
    public enum Prio {
 
29
      /** Priority for assignment "=" operator */
 
30
      ASSIGNMENT = 0,
 
31
      /** Priority for conditional OR "||" operator */
 
32
      CONDITIONAL_OR,
 
33
      /** Priority for conditional AND "&&" operator */
 
34
      CONDITIONAL_AND,
 
35
      /** Priority for equality "==" and "!=" operators */
 
36
      EQUALITY,
 
37
      /** Priority for comparison ">", "<", ">=", etc operators */
 
38
      COMPARISON,
 
39
      /** Priority for addictive "+" and "-" operators */
 
40
      ADDICTIVE,
 
41
      /** Priority for multiplicative "*" and "/" operators */
 
42
      MULTIPLICATIVE,
 
43
      /** Priority for unary "+" and "-" and "!" operators */
 
44
      UNARY,
 
45
      /** Priority for label assignment ":" operator */
 
46
      LABEL,
 
47
      /** Priority for dice "d" operator */
 
48
      DICE,
 
49
      /** Priority for functions */
 
50
      FUNCTION,
 
51
      /** Priority for values */
 
52
      VALUE;
 
53
      
 
54
      /** get the name of the priority */
 
55
      public string to_string () {
 
56
        switch (this) {
 
57
          case ASSIGNMENT:
 
58
            return "prio: assigment";
 
59
          case CONDITIONAL_OR:
 
60
            return "prio: conditonal OR";
 
61
          case CONDITIONAL_AND:
 
62
            return "prio: conidonal AND";
 
63
          case EQUALITY:
 
64
            return "prio: equality";
 
65
          case MULTIPLICATIVE:
 
66
            return "prio: multiplicative";
 
67
          case UNARY:
 
68
            return "prio: unary";
 
69
          case LABEL:
 
70
            return "prio: label";
 
71
          case DICE:
 
72
            return "prio: dice";
 
73
          case FUNCTION:
 
74
            return "prio: function";
 
75
          case VALUE:
 
76
            return "prio: value";
 
77
          default:
 
78
            assert_not_reached ();
 
79
        }
 
80
      }
 
81
    }
 
82
 
 
83
    /** Generation to use to get the root with @link parent */
59
84
    protected const int ROOT_GENERATION = int.MAX;
60
85
    
61
86
    /* ********************************************************************** */
62
87
    
63
88
    /**
64
 
     * tells weather the token is right associative or not.
 
89
     * tells whether the token is right associative or not.
65
90
     */
66
91
    public bool right_assosiative {get;set; default = false;}
67
92
    
68
 
    
69
 
    private int real_priority;
70
 
    
71
93
    /** The parent token of this token*/
72
94
    protected unowned Token? parent {protected get; protected set;}
73
95
    
74
 
    public virtual int priority {public get {
75
 
      return __get_priority ();
76
 
     } protected construct set {
77
 
       __set_priority (value);
78
 
     }}
 
96
    public virtual int priority {public get; protected construct set;}
79
97
    
80
98
    /** Starting position of the token in the expression */
81
99
    protected int position;
108
126
    /** all children of this token */
109
127
    private (unowned Token?)[] children;
110
128
    
111
 
    
112
 
    public long result_value {public get; protected set; default = 0;}
113
 
    public long result_max_value {public get; protected set; default = 0;}
114
 
    public long result_min_value {public get; protected set; default = 0;}
 
129
    /*
 
130
     * These values should have a protected setter, but I could not get it to
 
131
     * work. So we will have to live with this.
 
132
     */
 
133
    public FastNumber result_value;
 
134
    public FastNumber result_max_value;
 
135
    public FastNumber result_min_value;
115
136
    public string result_string {public get; protected set; default = "";}
116
137
    
117
138
    construct {
118
 
      // Valgrind says there is a memory leak here... But it's actually
119
 
      // GObject's constructor that is leaking.
120
139
      children = new Token[max_num_child];
121
140
      next_child = 0;
 
141
      
 
142
      result_value = FastNumber ();
 
143
      result_max_value = FastNumber ();
 
144
      result_min_value = FastNumber ();
122
145
    }
123
146
    
124
147
    
126
149
      this.position = position;
127
150
    }
128
151
    
 
152
    
129
153
    /**
130
154
     * Reorders result_min_value and result_max_value, so that
131
 
     * result_max varue is the bigger of the two, and
 
155
     * result_max_value is the bigger of the two, and
132
156
     * result_min_value is the smaller.
133
157
     */
134
158
    protected void reorder_max_min_values () {
135
 
      if (result_max_value < result_min_value) {
136
 
        long tmp = result_max_value;
 
159
      if (result_max_value.compare (result_min_value) <= 0) {
 
160
        FastNumber tmp = result_max_value;
137
161
        result_max_value = result_min_value;
138
162
        result_min_value = tmp;
139
163
      }
216
240
     * @throws GLib.Error an error if an error has orrured in the evaluation of the tree.
217
241
     */
218
242
    protected abstract void evaluate_self (Context instance) throws GLib.Error;
219
 
    
220
 
    /* *********** IGNORE THE MESS I HAVE CREATED FRO MY SELF *************** */
221
 
    /** IGNORE ME */
222
 
    protected void __set_priority (int prio) {
223
 
      real_priority = prio;
224
 
    }
225
 
    
226
 
    /** IGNORE ME*/
227
 
    protected int __get_priority () {
228
 
      return real_priority;
229
 
    }
230
 
    
231
 
    
232
243
  }
233
244
  
234
245
}