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:
parent
28e347effe
commit
ee4637e3a2
3 changed files with 14 additions and 22 deletions
8
third_party/nix/src/libexpr/attr-set.cc
vendored
8
third_party/nix/src/libexpr/attr-set.cc
vendored
|
@ -37,6 +37,14 @@ Bindings::iterator Bindings::find(const Symbol& name) {
|
|||
Bindings::iterator Bindings::begin() { return &(attributes_.begin()->second); }
|
||||
|
||||
Bindings::iterator Bindings::end() { return &(attributes_.end()->second); }
|
||||
void Bindings::merge(Bindings* other) {
|
||||
// We want the values from the other attribute set to take
|
||||
// precedence, but .merge() works the other way around.
|
||||
//
|
||||
// To work around that, we merge and then swap.
|
||||
other->attributes_.merge(attributes_);
|
||||
attributes_.swap(other->attributes_);
|
||||
}
|
||||
|
||||
// /* Allocate a new array of attributes for an attribute set with a specific
|
||||
// capacity. The space is implicitly reserved after the Bindings structure.
|
||||
|
|
3
third_party/nix/src/libexpr/attr-set.hh
vendored
3
third_party/nix/src/libexpr/attr-set.hh
vendored
|
@ -50,6 +50,9 @@ class Bindings {
|
|||
iterator begin();
|
||||
iterator end();
|
||||
|
||||
// Merge values from other into the current attribute
|
||||
void merge(Bindings* other);
|
||||
|
||||
// ???
|
||||
[[deprecated]] void sort();
|
||||
|
||||
|
|
25
third_party/nix/src/libexpr/eval.cc
vendored
25
third_party/nix/src/libexpr/eval.cc
vendored
|
@ -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();
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue