void DefineOwnership::derivedFrom()

in glean/rts/ownership/derived.cpp [19:58]


void DefineOwnership::derivedFrom(Id id, const std::set<UsetId>& deps) {
  if (deps.size() == 0) {
    LOG(ERROR) << "DefineOwnership::derivedFrom: empty deps";
    return;
  }

  SetU32 set = SetU32::from(deps);

  UsetId usetid;
  if (set.size() == 1) {
    usetid = *deps.begin();
  } else {
    auto uset = std::make_unique<Uset>(set, And, 0);
    size_t size = set.size();
    usetid = ownership_->lookupSet(uset.get());
    if (usetid == INVALID_USET) {
      auto q = uset.get();
      auto p = usets_.add(std::move(uset));
      if (p == q) {
        usets_.promote(p);
        usetid = p->id;
        newSets_.push_back(p);
        VLOG(2) << "new set: " << usetid << ", size = " << size;
      } else {
        usetid = p->id;
        VLOG(2) << "existing set in batch: " << usetid;
      }
    } else {
      VLOG(2) << "existing set in DB: " << usetid;
    }
  }

  if (id >= first_id_) {
    new_ids_.push_back(id);
    new_owners_.push_back(usetid);
  } else {
    ids_.push_back(id);
    owners_.push_back(usetid);
  }
}