28 &generic_parameter_specialization_map,
33 if(!generic_parameter_specialization_map.empty())
37 pointer_type, generic_parameter_specialization_map, visited);
38 INVARIANT(visited.empty(),
"recursion stack must be empty here");
68 &generic_parameter_specialization_map,
79 if(visited_nodes.find(parameter_name) != visited_nodes.end())
82 parameter_name, generic_parameter_specialization_map);
83 return result.has_value() ? result.value() :
pointer_type;
86 if(generic_parameter_specialization_map.count(parameter_name) == 0)
95 generic_parameter_specialization_map.
find(parameter_name)->second.back();
102 visited_nodes.insert(parameter_name);
105 generic_parameter_specialization_map,
107 visited_nodes.erase(parameter_name);
108 return returned_type;
117 if(array_element_type.
id() == ID_pointer)
121 generic_parameter_specialization_map,
125 replacement_array_type.
subtype().
set(ID_C_element_type, new_array_type);
126 return replacement_array_type;
146 &generic_parameter_specialization_map)
const 149 const size_t max_depth =
150 generic_parameter_specialization_map.find(parameter_name)->second.size();
152 irep_idt current_parameter = parameter_name;
153 for(
size_t depth = 0; depth < max_depth; depth++)
156 current_parameter, generic_parameter_specialization_map, visited, depth);
157 if(retval.has_value())
165 generic_parameter_specialization_map.find(current_parameter)
188 &generic_parameter_specialization_map,
190 const size_t depth)
const 192 const auto &val = generic_parameter_specialization_map.find(parameter_name);
194 val != generic_parameter_specialization_map.end(),
195 "generic parameter must be a key in map");
197 const auto &replacements = val->second;
200 depth < replacements.size(),
"cannot access elements outside stack");
203 if(visited.find(parameter_name) != visited.end())
208 const size_t index = (replacements.size() - 1) - depth;
209 const auto &type = replacements[index];
216 visited.insert(parameter_name);
219 generic_parameter_specialization_map,
222 visited.erase(parameter_name);
The type of an expression.
std::set< irep_idt > generic_parameter_recursion_trackingt
optionalt< pointer_typet > get_recursively_instantiated_type(const irep_idt &, const generic_parameter_specialization_mapt &, generic_parameter_recursion_trackingt &, const size_t) const
See get_recursively instantiated_type, the additional parameters just track the recursion to prevent ...
pointer_typet pointer_type(const typet &subtype)
bool is_java_generic_parameter(const typet &type)
Checks whether the type is a java generic parameter/variable, e.g., T in List<T>. ...
const symbol_typet & to_symbol_type(const typet &type)
Cast a generic typet to a symbol_typet.
const java_generic_parametert & to_java_generic_parameter(const typet &type)
#define CHECK_RETURN(CONDITION)
reference_typet java_array_type(const char subtype)
bool is_java_array_tag(const irep_idt &tag)
See above.
std::unordered_map< irep_idt, std::vector< reference_typet > > generic_parameter_specialization_mapt
#define INVARIANT(CONDITION, REASON)
const irep_idt & id() const
A reference into the symbol table.
nonstd::optional< T > optionalt
pointer_typet specialize_generics(const pointer_typet &pointer_type, const generic_parameter_specialization_mapt &generic_parameter_specialization_map, generic_parameter_recursion_trackingt &visited) const
Specialize generic parameters in a pointer type based on the current map of parameters -> types...
Class to hold a Java generic type parameter (also called type variable), e.g., T in List<T>...
const irep_idt get_name() const
typet java_array_element_type(const symbol_typet &array_type)
Return the type of the elements of a given java array type.
const pointer_typet & to_pointer_type(const typet &type)
Cast a generic typet to a pointer_typet.
const typet & subtype() const
virtual pointer_typet convert_pointer_type(const pointer_typet &pointer_type, const generic_parameter_specialization_mapt &generic_parameter_specialization_map, const namespacet &ns) const
Select what type should be used for a given pointer type.
const irept & find(const irep_namet &name) const
Handle selection of correct pointer type (for example changing abstract classes to concrete versions)...
const irep_idt & get_identifier() const
void set(const irep_namet &name, const irep_idt &value)