stage3/datatype_functions.cc
changeset 457 67d8b07bac22
parent 447 aad0f3e5df33
child 458 587884880be6
equal deleted inserted replaced
456:ca8d98289ff9 457:67d8b07bac22
    22  * used in safety-critical situations without a full and competent review.
    22  * used in safety-critical situations without a full and competent review.
    23  */
    23  */
    24 
    24 
    25 #include "datatype_functions.hh"
    25 #include "datatype_functions.hh"
    26 #include "../absyntax_utils/absyntax_utils.hh"
    26 #include "../absyntax_utils/absyntax_utils.hh"
    27 #include <algorithm>
    27 #include <vector>
       
    28 // #include <algorithm>
    28 
    29 
    29 
    30 
    30 
    31 
    31 
    32 
    32 
    33 
    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;}