-
Notifications
You must be signed in to change notification settings - Fork 290
Expand file tree
/
Copy pathgeneric_parameter_specialization_map.cpp
More file actions
67 lines (63 loc) · 2.27 KB
/
generic_parameter_specialization_map.cpp
File metadata and controls
67 lines (63 loc) · 2.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/// Author: Diffblue Ltd.
#include "generic_parameter_specialization_map.h"
std::size_t generic_parameter_specialization_mapt::insert(
const std::vector<java_generic_parametert> ¶meters,
std::vector<reference_typet> types)
{
PRECONDITION(!parameters.empty());
const auto first_param_it =
param_to_container.find(parameters.front().get_name());
std::size_t container_index;
if(first_param_it == param_to_container.end())
{
container_index = container_to_specializations.size();
container_to_specializations.emplace_back();
std::size_t param_index = 0;
for(const java_generic_parametert ¶meter : parameters)
{
const auto result = param_to_container.emplace(
parameter.get_name(), container_paramt{container_index, param_index++});
INVARIANT(
result.second, "Some type parameters are already mapped but not all");
}
}
else
{
container_index = first_param_it->second.container_index;
std::size_t param_index = 0;
for(const java_generic_parametert ¶meter : parameters)
{
const auto param_it = param_to_container.find(parameter.get_name());
INVARIANT(
param_it != param_to_container.end(),
"Some type parameters are already mapped but not all");
INVARIANT(
param_it->second.container_index == container_index,
"Not all type parameters are assigned to same container");
INVARIANT(
param_it->second.param_index == param_index,
"Type parameters have been encountered in two different orders");
++param_index;
}
}
container_to_specializations[container_index].push(std::move(types));
return container_index;
}
void generic_parameter_specialization_mapt::pop(std::size_t container_index)
{
container_to_specializations.at(container_index).pop();
}
std::optional<reference_typet>
generic_parameter_specialization_mapt::pop(irep_idt parameter_name)
{
const auto types_it = param_to_container.find(parameter_name);
if(types_it == param_to_container.end())
return {};
std::stack<std::vector<reference_typet>> &stack =
container_to_specializations.at(types_it->second.container_index);
if(stack.empty())
return {};
reference_typet result = stack.top().at(types_it->second.param_index);
stack.pop();
return result;
}