29 &generic_parameter_specialization_map,
34 if(!generic_parameter_specialization_map.empty())
38 pointer_type, generic_parameter_specialization_map, visited);
39 INVARIANT(visited.empty(),
"recursion stack must be empty here");
69 &generic_parameter_specialization_map,
80 if(visited_nodes.find(parameter_name) != visited_nodes.end())
83 parameter_name, generic_parameter_specialization_map);
84 return result.has_value() ? result.value() :
pointer_type;
87 if(generic_parameter_specialization_map.count(parameter_name) == 0)
96 generic_parameter_specialization_map.
find(parameter_name)->second.back();
103 visited_nodes.insert(parameter_name);
106 generic_parameter_specialization_map,
108 visited_nodes.erase(parameter_name);
109 return returned_type;
118 if(array_element_type.
id() == ID_pointer)
122 generic_parameter_specialization_map,
126 replacement_array_type.
subtype().
set(ID_element_type, new_array_type);
127 return replacement_array_type;
147 &generic_parameter_specialization_map)
const 150 const size_t max_depth =
151 generic_parameter_specialization_map.find(parameter_name)->second.size();
153 irep_idt current_parameter = parameter_name;
154 for(
size_t depth = 0; depth < max_depth; depth++)
157 current_parameter, generic_parameter_specialization_map, visited, depth);
158 if(retval.has_value())
166 generic_parameter_specialization_map.find(current_parameter)
189 &generic_parameter_specialization_map,
191 const size_t depth)
const 193 const auto &val = generic_parameter_specialization_map.find(parameter_name);
195 val != generic_parameter_specialization_map.end(),
196 "generic parameter must be a key in map");
198 const auto &replacements = val->second;
201 depth < replacements.size(),
"cannot access elements outside stack");
204 if(visited.find(parameter_name) != visited.end())
209 const size_t index = (replacements.size() - 1) - depth;
210 const auto &type = replacements[index];
217 visited.insert(parameter_name);
220 generic_parameter_specialization_map,
223 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 typet & java_array_element_type(const symbol_typet &array_symbol)
Return a const reference to the element type of a given java array type.
const java_generic_parametert & to_java_generic_parameter(const typet &type)
#define CHECK_RETURN(CONDITION)
reference_typet java_array_type(const char subtype)
Construct an array pointer type.
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
dstringt has one field, an unsigned integer no which is an index into a static table of strings...
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
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)