void join_like_operation()

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());
      }
    }
  }