bzr branch
http://gegoxaren.bato24.eu/bzr/vqdr/trunk
|
32
by Gustav Hartvigsson
Added RollAndKeepFunctionToken. |
1 |
using VQDR.Expression; |
|
64
by Gustav Hartvigsson
[General] Major refactoring. Utils -> Vee nenaming. |
2 |
using Vee; |
|
32
by Gustav Hartvigsson
Added RollAndKeepFunctionToken. |
3 |
|
|
35
by Gustav Hartvigsson
a few things: FastNumbers, simplifications and AbstractPoolToken. |
4 |
public class VQDR.Expression.RollAndKeepFunctionToken : FunctionToken { |
|
52.1.3
by Gustav Hartvigsson
int -> int32 |
5 |
private const int32 INDEX_ROLL = 1; |
6 |
private const int32 INDEX_POOL = 1; |
|
7 |
private const int32 INDEX_KEEP = 2; |
|
|
32
by Gustav Hartvigsson
Added RollAndKeepFunctionToken. |
8 |
|
|
52.1.3
by Gustav Hartvigsson
int -> int32 |
9 |
private const int32 MAX_POOL_SIZE = 50; |
|
32
by Gustav Hartvigsson
Added RollAndKeepFunctionToken. |
10 |
|
|
52.1.1
by Gustav Hartvigsson
Use int64 instead of long. |
11 |
private int64[] roll_values = null; // = new long[MAX_POOL_SIZE]; |
|
32
by Gustav Hartvigsson
Added RollAndKeepFunctionToken. |
12 |
private bool[] valid_values = null; // = new bool[MAX_POOL_SIZE]; |
13 |
||
14 |
construct { |
|
15 |
mandatory_num_child = 2; |
|
16 |
optional_num_child = 1; |
|
17 |
} |
|
18 |
||
19 |
protected override void evaluate_self (VQDR.Expression.Context instance) throws GLib.Error { |
|
20 |
Token? roll; |
|
|
52.1.1
by Gustav Hartvigsson
Use int64 instead of long. |
21 |
int64 pool_size; |
22 |
int64 keep_size; |
|
|
32
by Gustav Hartvigsson
Added RollAndKeepFunctionToken. |
23 |
|
24 |
roll = get_child (INDEX_ROLL); |
|
25 |
try { |
|
26 |
get_child (INDEX_POOL).evaluate (instance); |
|
27 |
} catch (Error e) { |
|
28 |
stderr.printf ("Error: %s, Error Domain: %s\n", |
|
29 |
e.message, e.domain.to_string ()); |
|
30 |
GLib.assert_not_reached (); |
|
31 |
} |
|
32 |
pool_size = get_child (INDEX_POOL).result_value.to_int (); |
|
33 |
||
34 |
if (pool_size > MAX_POOL_SIZE) { |
|
|
35
by Gustav Hartvigsson
a few things: FastNumbers, simplifications and AbstractPoolToken. |
35 |
throw new ParamError.OUT_OF_BOUNDS |
36 |
(@"($(get_function_name (this.get_type ()))) Max value $MAX_POOL_SIZE, got $pool_size"); |
|
|
32
by Gustav Hartvigsson
Added RollAndKeepFunctionToken. |
37 |
} |
38 |
||
39 |
if (pool_size < 0) { |
|
40 |
pool_size = 0; |
|
41 |
} |
|
42 |
||
43 |
{ |
|
44 |
Token? keep_child = get_child (INDEX_KEEP); |
|
45 |
if (keep_child != null) { |
|
46 |
keep_child.evaluate (instance); |
|
47 |
keep_size = keep_child.result_value.to_int (); |
|
48 |
} else { |
|
49 |
keep_size = pool_size; |
|
50 |
} |
|
51 |
} |
|
52 |
||
53 |
if (keep_size > pool_size) { |
|
54 |
keep_size = pool_size; |
|
55 |
} |
|
56 |
||
57 |
/* */ |
|
58 |
||
|
52.1.1
by Gustav Hartvigsson
Use int64 instead of long. |
59 |
int64 roll_result; |
|
52.1.3
by Gustav Hartvigsson
int -> int32 |
60 |
int64 min_keep = int64.MAX; |
61 |
int32 min_keep_index = 0; |
|
|
32
by Gustav Hartvigsson
Added RollAndKeepFunctionToken. |
62 |
|
63 |
if (roll_values == null || roll_values.length < pool_size) { |
|
|
52.1.1
by Gustav Hartvigsson
Use int64 instead of long. |
64 |
roll_values = new int64[pool_size]; |
|
32
by Gustav Hartvigsson
Added RollAndKeepFunctionToken. |
65 |
valid_values = new bool[pool_size]; |
66 |
} |
|
67 |
||
|
52.1.3
by Gustav Hartvigsson
int -> int32 |
68 |
for (int32 i = 0; i < pool_size; i++) { |
|
32
by Gustav Hartvigsson
Added RollAndKeepFunctionToken. |
69 |
roll.evaluate (instance); |
70 |
roll_result = roll.result_value.raw_number; |
|
71 |
|
|
72 |
roll_values[i] = roll_result; |
|
73 |
valid_values[i] = true; |
|
74 |
||
75 |
if (i < keep_size) { |
|
76 |
// simply keep and detect the minium kept value |
|
77 |
if (min_keep > roll_result) { |
|
78 |
min_keep = roll_result; |
|
79 |
min_keep_index = i; |
|
80 |
} |
|
81 |
} else { |
|
82 |
// Chose what to do. |
|
83 |
if (roll_result >= min_keep) { |
|
84 |
// Discard the Minimum value |
|
85 |
valid_values[min_keep_index] = false; |
|
86 |
||
87 |
// Search for new Minimum value |
|
|
52.1.1
by Gustav Hartvigsson
Use int64 instead of long. |
88 |
min_keep = int64.MAX; |
|
32
by Gustav Hartvigsson
Added RollAndKeepFunctionToken. |
89 |
min_keep_index = 0; |
90 |
||
|
52.1.3
by Gustav Hartvigsson
int -> int32 |
91 |
for (int32 j = 0; j <= i; j++) { |
|
32
by Gustav Hartvigsson
Added RollAndKeepFunctionToken. |
92 |
if (valid_values[j]) { |
93 |
if (min_keep > roll_values[j]) { |
|
94 |
min_keep = roll_values[j]; |
|
95 |
min_keep_index = j; |
|
96 |
} |
|
97 |
} |
|
98 |
} |
|
99 |
} else { |
|
100 |
valid_values[i] = false; |
|
101 |
} |
|
102 |
} |
|
103 |
} // end for loop |
|
104 |
||
105 |
StringBuilder strbldr = new StringBuilder (); |
|
106 |
strbldr.append (SYM_BEGIN); |
|
107 |
|
|
108 |
FastNumber tmp_fstnmbr; |
|
109 |
||
|
52.1.3
by Gustav Hartvigsson
int -> int32 |
110 |
for (int32 i = 0; i < pool_size; i++) { |
|
32
by Gustav Hartvigsson
Added RollAndKeepFunctionToken. |
111 |
if (strbldr.len < MAX_TOKEN_STRING_LENGTH) { |
112 |
//we don't start with a seperator mark. |
|
113 |
if (i > 0) { |
|
114 |
strbldr.append (SYM_SEP); |
|
115 |
} |
|
116 |
// We don't want to deal with the conertion directly. |
|
117 |
// FIXME: Convert everything to FastNumbers instead of using "raw" values? |
|
118 |
tmp_fstnmbr = FastNumber.raw (roll_values[i]); |
|
119 |
strbldr.append (tmp_fstnmbr.to_string ()); |
|
120 |
|
|
121 |
if (valid_values[i] && keep_size != pool_size) { |
|
122 |
strbldr.append (SYM_SELECTED); |
|
123 |
} |
|
124 |
} |
|
125 |
if (valid_values[i]) { |
|
126 |
tmp_fstnmbr = FastNumber.raw (roll_values[i]); |
|
127 |
result_value.add (tmp_fstnmbr); |
|
128 |
} |
|
129 |
} |
|
130 |
|
|
131 |
result_max_value = roll.result_max_value.multiply (FastNumber(keep_size)); |
|
132 |
result_min_value = roll.result_min_value.multiply (FastNumber(keep_size)); |
|
133 |
||
134 |
if (strbldr.len < MAX_TOKEN_STRING_LENGTH) { |
|
135 |
strbldr.append (SYM_END); |
|
136 |
result_string = strbldr.str; |
|
137 |
} else { |
|
138 |
result_string = SYM_TRUNK_BEGIN + result_value.to_string () + SYM_TRUNK_END; |
|
139 |
} |
|
140 |
} |
|
141 |
|
|
142 |
}
|
|
|
33
by Gustav Hartvigsson
Added sudfolders to the tests folder for future use. |
143 |
/* vim: set tabstop=2:softtabstop=2:shiftwidth=2:expandtab */ |