in include/HashedAbstractPartition.h [208:232]
void join_like_operation(
const HashedAbstractPartition& other,
std::function<void(Domain*, const Domain&)> operation) {
if (is_top()) {
return;
}
if (other.is_top()) {
set_to_top();
return;
}
for (const auto& other_binding : other.m_map) {
auto binding = m_map.find(other_binding.first);
if (binding == m_map.end()) {
// The value is Bottom, we just insert the other value (Bottom is the
// identity for join-like operations).
m_map[other_binding.first] = other_binding.second;
} else {
// We compute the join-like combination of the values.
operation(&binding->second, other_binding.second);
// By construction, it's impossible to have Bottom in both operands,
// hence the result can never be Bottom.
RUNTIME_CHECK(!binding->second.is_bottom(), internal_error());
}
}
}