2
2
3
3
#include " generic_parameter_specialization_map_keys.h"
4
4
5
- #include < iterator >
5
+ #include < util/range.h >
6
6
7
7
// / \param type: Source type
8
8
// / \return The vector of implicitly generic and (explicitly) generic type
@@ -44,26 +44,12 @@ void generic_parameter_specialization_map_keyst::insert_pairs(
44
44
const std::vector<reference_typet> &types)
45
45
{
46
46
INVARIANT (erase_keys.empty (), " insert_pairs should only be called once" );
47
- PRECONDITION (parameters.size () == types.size ());
48
47
49
- // Pair up the parameters and types for easier manipulation later
50
- std::vector<std::pair<java_generic_parametert, reference_typet>> pairs;
51
- pairs.reserve (parameters.size ());
52
- std::transform (
53
- parameters.begin (),
54
- parameters.end (),
55
- types.begin (),
56
- std::back_inserter (pairs),
57
- [&](java_generic_parametert param, reference_typet type)
58
- {
59
- return std::make_pair (param, type);
60
- });
61
-
62
- for (const auto &pair : pairs)
48
+ for (const auto &pair : make_range (parameters).zip (types))
63
49
{
64
50
// Only add the pair if the type is not the parameter itself, e.g.,
65
51
// pair.first = pair.second = java::A::T. This can happen for example
66
- // when initiating a pointer to an implicitly java generic class type
52
+ // when initializing a pointer to an implicitly generic Java class type
67
53
// in gen_nondet_init and would result in a loop when the map is used
68
54
// to look up the type of the parameter.
69
55
if (
@@ -72,13 +58,13 @@ void generic_parameter_specialization_map_keyst::insert_pairs(
72
58
pair.first .get_name ()))
73
59
{
74
60
const irep_idt &key = pair.first .get_name ();
75
- if (generic_parameter_specialization_map.count (key) == 0 )
76
- generic_parameter_specialization_map.emplace (
77
- key, std::vector<reference_typet>());
78
- (*generic_parameter_specialization_map.find (key))
79
- .second .push_back (pair.second );
61
+ const auto map_it = generic_parameter_specialization_map
62
+ .emplace (key, std::vector<reference_typet>{})
63
+ .first ;
64
+ map_it->second .push_back (pair.second );
80
65
81
- // We added something, so pop it when this is destroyed:
66
+ // We added something; pop it when this
67
+ // generic_parameter_specialization_map_keyst is destroyed
82
68
erase_keys.push_back (key);
83
69
}
84
70
}
@@ -94,40 +80,42 @@ void generic_parameter_specialization_map_keyst::insert_pairs_for_pointer(
94
80
const pointer_typet &pointer_type,
95
81
const typet &pointer_subtype_struct)
96
82
{
97
- if (is_java_generic_type (pointer_type))
83
+ if (!is_java_generic_type (pointer_type))
84
+ return ;
85
+ // The supplied type must be the full type of the pointer's subtype
86
+ PRECONDITION (
87
+ pointer_type.subtype ().get (ID_identifier) ==
88
+ pointer_subtype_struct.get (ID_name));
89
+
90
+ // If the pointer points to:
91
+ // - an incomplete class or
92
+ // - a class that is neither generic nor implicitly generic (this
93
+ // may be due to unsupported class signature)
94
+ // then ignore the generic types in the pointer and do not add any pairs.
95
+ // TODO TG-1996 should decide how mocking and generics should work
96
+ // together. Currently an incomplete class is never marked as generic. If
97
+ // this changes in TG-1996 then the condition below should be updated.
98
+ if (to_java_class_type (pointer_subtype_struct).get_is_stub ())
99
+ return ;
100
+ if (
101
+ !is_java_generic_class_type (pointer_subtype_struct) &&
102
+ !is_java_implicitly_generic_class_type (pointer_subtype_struct))
98
103
{
99
- // The supplied type must be the full type of the pointer's subtype
100
- PRECONDITION (
101
- pointer_type.subtype ().get (ID_identifier) ==
102
- pointer_subtype_struct.get (ID_name));
104
+ return ;
105
+ }
103
106
104
- // If the pointer points to:
105
- // - an incomplete class or
106
- // - a class that is neither generic nor implicitly generic (this
107
- // may be due to unsupported class signature)
108
- // then ignore the generic types in the pointer and do not add any pairs.
109
- // TODO TG-1996 should decide how mocking and generics should work
110
- // together. Currently an incomplete class is never marked as generic. If
111
- // this changes in TG-1996 then the condition below should be updated.
112
- if (
113
- !to_java_class_type (pointer_subtype_struct).get_is_stub () &&
114
- (is_java_generic_class_type (pointer_subtype_struct) ||
115
- is_java_implicitly_generic_class_type (pointer_subtype_struct)))
116
- {
117
- const java_generic_typet &generic_pointer =
118
- to_java_generic_type (pointer_type);
119
- const std::vector<java_generic_parametert> &generic_parameters =
120
- get_all_generic_parameters (pointer_subtype_struct);
107
+ const java_generic_typet &generic_pointer =
108
+ to_java_generic_type (pointer_type);
121
109
122
- INVARIANT (
123
- generic_pointer.generic_type_arguments ().size () ==
124
- generic_parameters.size (),
125
- " All generic parameters of the pointer type need to be specified" );
110
+ const std::vector<java_generic_parametert> &generic_parameters =
111
+ get_all_generic_parameters (pointer_subtype_struct);
112
+ const java_generic_typet::generic_type_argumentst &type_args =
113
+ generic_pointer.generic_type_arguments ();
114
+ INVARIANT (
115
+ type_args.size () == generic_parameters.size (),
116
+ " All generic parameters of the pointer type need to be specified" );
126
117
127
- insert_pairs (
128
- generic_parameters, generic_pointer.generic_type_arguments ());
129
- }
130
- }
118
+ insert_pairs (generic_parameters, type_args);
131
119
}
132
120
133
121
// / Add a pair of a parameter and its types for each generic parameter of the
@@ -151,24 +139,29 @@ void generic_parameter_specialization_map_keyst::insert_pairs_for_symbol(
151
139
// then ignore the generic types in the struct_tag_type and do not add any
152
140
// pairs.
153
141
// TODO TG-1996 should decide how mocking and generics should work
154
- // together. Currently an incomplete class is never marked as generic. If
155
- // this changes in TG-1996 then the condition below should be updated.
142
+ // together. Currently an incomplete class is never marked as generic. If
143
+ // this changes in TG-1996 then the condition below should be updated.
144
+ if (!is_java_generic_struct_tag_type (struct_tag_type))
145
+ return ;
146
+ if (to_java_class_type (symbol_struct).get_is_stub ())
147
+ return ;
156
148
if (
157
- is_java_generic_struct_tag_type (struct_tag_type) &&
158
- !to_java_class_type (symbol_struct).get_is_stub () &&
159
- (is_java_generic_class_type (symbol_struct) ||
160
- is_java_implicitly_generic_class_type (symbol_struct)))
149
+ !is_java_generic_class_type (symbol_struct) &&
150
+ !is_java_implicitly_generic_class_type (symbol_struct))
161
151
{
162
- const java_generic_struct_tag_typet &generic_symbol =
163
- to_java_generic_struct_tag_type (struct_tag_type);
152
+ return ;
153
+ }
154
+ const java_generic_struct_tag_typet &generic_symbol =
155
+ to_java_generic_struct_tag_type (struct_tag_type);
164
156
165
- const std::vector<java_generic_parametert> &generic_parameters =
166
- get_all_generic_parameters (symbol_struct);
157
+ const std::vector<java_generic_parametert> &generic_parameters =
158
+ get_all_generic_parameters (symbol_struct);
159
+ const java_generic_typet::generic_type_argumentst &type_args =
160
+ generic_symbol.generic_types ();
167
161
168
- INVARIANT (
169
- generic_symbol. generic_types () .size () == generic_parameters.size (),
170
- " All generic parameters of the superclass need to be concretized" );
162
+ INVARIANT (
163
+ type_args .size () == generic_parameters.size (),
164
+ " All generic parameters of the superclass need to be concretized" );
171
165
172
- insert_pairs (generic_parameters, generic_symbol.generic_types ());
173
- }
166
+ insert_pairs (generic_parameters, type_args);
174
167
}
0 commit comments