69 { NULL, NULL, NULL }, |
70 { NULL, NULL, NULL }, |
70 }; |
71 }; |
71 |
72 |
72 |
73 |
73 const struct widen_entry widen_SUB_table[] = { |
74 const struct widen_entry widen_SUB_table[] = { |
74 { &search_constant_type_c::time_type_name, &search_constant_type_c::time_type_name, &search_constant_type_c::time_type_name }, |
75 { &search_constant_type_c::time_type_name, &search_constant_type_c::time_type_name, &search_constant_type_c::time_type_name }, |
75 { &search_constant_type_c::tod_type_name, &search_constant_type_c::tod_type_name, &search_constant_type_c::tod_type_name }, |
76 { &search_constant_type_c::tod_type_name, &search_constant_type_c::tod_type_name, &search_constant_type_c::tod_type_name }, |
76 { &search_constant_type_c::dt_type_name, &search_constant_type_c::dt_type_name, &search_constant_type_c::dt_type_name }, |
77 { &search_constant_type_c::dt_type_name, &search_constant_type_c::dt_type_name, &search_constant_type_c::dt_type_name }, |
77 { &search_constant_type_c::safetime_type_name, &search_constant_type_c::safetime_type_name, &search_constant_type_c::safetime_type_name }, |
78 { &search_constant_type_c::safetime_type_name, &search_constant_type_c::safetime_type_name, &search_constant_type_c::safetime_type_name }, |
78 { &search_constant_type_c::safetod_type_name, &search_constant_type_c::safetod_type_name, &search_constant_type_c::safetod_type_name }, |
79 { &search_constant_type_c::safetod_type_name, &search_constant_type_c::safetod_type_name, &search_constant_type_c::safetod_type_name }, |
79 { &search_constant_type_c::safedt_type_name, &search_constant_type_c::safedt_type_name, &search_constant_type_c::safedt_type_name }, |
80 { &search_constant_type_c::safedt_type_name, &search_constant_type_c::safedt_type_name, &search_constant_type_c::safedt_type_name }, |
80 |
81 |
81 { &search_constant_type_c::tod_type_name, &search_constant_type_c::time_type_name, &search_constant_type_c::tod_type_name }, |
82 { &search_constant_type_c::tod_type_name, &search_constant_type_c::time_type_name, &search_constant_type_c::tod_type_name }, |
82 { &search_constant_type_c::safetod_type_name, &search_constant_type_c::time_type_name, &search_constant_type_c::tod_type_name }, |
83 { &search_constant_type_c::safetod_type_name, &search_constant_type_c::time_type_name, &search_constant_type_c::tod_type_name }, |
83 { &search_constant_type_c::tod_type_name, &search_constant_type_c::safetime_type_name, &search_constant_type_c::tod_type_name }, |
84 { &search_constant_type_c::tod_type_name, &search_constant_type_c::safetime_type_name, &search_constant_type_c::tod_type_name }, |
84 { &search_constant_type_c::safetod_type_name, &search_constant_type_c::safetime_type_name, &search_constant_type_c::safetod_type_name }, |
85 { &search_constant_type_c::safetod_type_name, &search_constant_type_c::safetime_type_name, &search_constant_type_c::safetod_type_name }, |
85 { &search_constant_type_c::dt_type_name, &search_constant_type_c::time_type_name, &search_constant_type_c::dt_type_name }, |
86 { &search_constant_type_c::dt_type_name, &search_constant_type_c::time_type_name, &search_constant_type_c::dt_type_name }, |
86 { &search_constant_type_c::safedt_type_name, &search_constant_type_c::time_type_name, &search_constant_type_c::dt_type_name }, |
87 { &search_constant_type_c::safedt_type_name, &search_constant_type_c::time_type_name, &search_constant_type_c::dt_type_name }, |
134 |
135 |
135 { NULL, NULL, NULL }, |
136 { NULL, NULL, NULL }, |
136 }; |
137 }; |
137 |
138 |
138 const struct widen_entry widen_DIV_table[] = { |
139 const struct widen_entry widen_DIV_table[] = { |
139 { &search_constant_type_c::time_type_name, &search_constant_type_c::lreal_type_name, &search_constant_type_c::time_type_name }, |
140 { &search_constant_type_c::time_type_name, &search_constant_type_c::lreal_type_name, &search_constant_type_c::time_type_name }, |
140 { &search_constant_type_c::time_type_name, &search_constant_type_c::real_type_name, &search_constant_type_c::time_type_name }, |
141 { &search_constant_type_c::time_type_name, &search_constant_type_c::real_type_name, &search_constant_type_c::time_type_name }, |
141 { &search_constant_type_c::time_type_name, &search_constant_type_c::dint_type_name, &search_constant_type_c::time_type_name }, |
142 { &search_constant_type_c::time_type_name, &search_constant_type_c::dint_type_name, &search_constant_type_c::time_type_name }, |
142 { &search_constant_type_c::time_type_name, &search_constant_type_c::int_type_name, &search_constant_type_c::time_type_name }, |
143 { &search_constant_type_c::time_type_name, &search_constant_type_c::int_type_name, &search_constant_type_c::time_type_name }, |
143 { &search_constant_type_c::time_type_name, &search_constant_type_c::sint_type_name, &search_constant_type_c::time_type_name }, |
144 { &search_constant_type_c::time_type_name, &search_constant_type_c::sint_type_name, &search_constant_type_c::time_type_name }, |
144 { &search_constant_type_c::time_type_name, &search_constant_type_c::ulint_type_name, &search_constant_type_c::time_type_name }, |
145 { &search_constant_type_c::time_type_name, &search_constant_type_c::ulint_type_name, &search_constant_type_c::time_type_name }, |
199 // std::copy(from->candidate_datatypes.begin(), from->candidate_datatypes.end(), to->candidate_datatypes.begin()); |
200 // std::copy(from->candidate_datatypes.begin(), from->candidate_datatypes.end(), to->candidate_datatypes.begin()); |
200 } |
201 } |
201 |
202 |
202 |
203 |
203 |
204 |
|
205 /* Intersect two candidate_datatype_lists. |
|
206 * Remove from list1 (origin, dest.) all elements that are not found in list2 (with). |
|
207 * In essence, list1 will contain the result of the intersection of list1 with list2. |
|
208 * In other words, modify list1 so it only contains the elelements that are simultaneously in list1 and list2! |
|
209 */ |
|
210 void intersect_candidate_datatype_list(symbol_c *list1 /*origin, dest.*/, symbol_c *list2 /*with*/) { |
|
211 if ((NULL == list1) || (NULL == list2)) |
|
212 /* In principle, we should never call it with NULL values. Best to abort the compiler just in case! */ |
|
213 return; |
|
214 |
|
215 for(std::vector<symbol_c *>::iterator i = list1->candidate_datatypes.begin(); i < list1->candidate_datatypes.end(); ) { |
|
216 /* Note that we do _not_ increment i in the for() loop! |
|
217 * When we erase an element from position i, a new element will take it's place, that must also be tested! |
|
218 */ |
|
219 if (search_in_candidate_datatype_list(*i, list2->candidate_datatypes) < 0) |
|
220 /* remove this element! This will change the value of candidate_datatypes.size() */ |
|
221 list1->candidate_datatypes.erase(i); |
|
222 else i++; |
|
223 } |
|
224 } |
|
225 |
204 |
226 |
205 |
227 |
206 /* A helper function... */ |
228 /* A helper function... */ |
207 bool is_ANY_ELEMENTARY_type(symbol_c *type_symbol) { |
229 bool is_ANY_ELEMENTARY_type(symbol_c *type_symbol) { |
208 if (type_symbol == NULL) {return false;} |
230 if (type_symbol == NULL) {return false;} |