refactor(3p/nix/libexpr): Use absl::btree_map::merge for '//'

Instead of doing some sort of inline merge-sort of the two attribute
sets, use the attribute sets merge function.

This commit alone does not build and is not supposed to.
This commit is contained in:
Vincent Ambo 2020-05-22 01:52:03 +01:00
parent 28e347effe
commit ee4637e3a2
3 changed files with 14 additions and 22 deletions

View file

@ -1301,31 +1301,12 @@ void ExprOpUpdate::eval(EvalState& state, Env& env, Value& v) {
return;
}
state.mkAttrs(v, v1.attrs->size() + v2.attrs->size());
state.mkAttrs(v, /* capacity = */ 0);
/* Merge the sets, preferring values from the second set. Make
sure to keep the resulting vector in sorted order. */
Bindings::iterator i = v1.attrs->begin();
Bindings::iterator j = v2.attrs->begin();
while (i != v1.attrs->end() && j != v2.attrs->end()) {
if (i->name == j->name) {
v.attrs->push_back(*j);
++i;
++j;
} else if (i->name < j->name) {
v.attrs->push_back(*i++);
} else {
v.attrs->push_back(*j++);
}
}
while (i != v1.attrs->end()) {
v.attrs->push_back(*i++);
}
while (j != v2.attrs->end()) {
v.attrs->push_back(*j++);
}
v.attrs->merge(v1.attrs);
v.attrs->merge(v2.attrs);
state.nrOpUpdateValuesCopied += v.attrs->size();
}