AbstractValueKind join_like_operation()

in include/HashedAbstractEnvironment.h [341:365]


  AbstractValueKind join_like_operation(
      const MapValue& other,
      std::function<void(Domain*, const Domain&)> operation) {
    for (auto it = m_map.begin(); it != m_map.end();) {
      auto other_binding = other.m_map.find(it->first);
      if (other_binding == other.m_map.end()) {
        // The other value is Top, we just erase the binding. We need to use a
        // different iterator, because all iterators to an erased binding are
        // invalidated.
        auto to_erase = it++;
        m_map.erase(to_erase);
      } else {
        // We compute the join-like combination of the values.
        operation(&it->second, other_binding->second);
        if (it->second.is_top()) {
          // If the result is Top, we erase the binding.
          auto to_erase = it++;
          m_map.erase(to_erase);
        } else {
          ++it;
        }
      }
    }
    return kind();
  }