This reverts parts of the CLs splitting the backing implementation for Bindings and moves back to only the BTreeMap-backed implementation. Our evaluation has indicated that the Vector-backed implementation does not match the performance of the plain array used upstream, and in my view the complexity introduced by it is not worth the relatively small (single-digit percentage) performance increase with a pivot-point close to the number of attributes yielded by stdenv.mkDerivation. Going forward we will trial implementations of attribute sets backed by HAMTs, and investigate other mechanisms of speeding up the language. Some changes from the previous CLs are retained, for example the removal of insert_or_assign and the passing of capacity. Change-Id: I6eb4b075b453949583360755055c21a29d7ff642 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1172 Reviewed-by: glittershark <grfn@gws.fyi> Tested-by: BuildkiteCI
68 lines
1.6 KiB
C++
68 lines
1.6 KiB
C++
// This file implements the underlying structure of Nix attribute sets.
|
|
#pragma once
|
|
|
|
#include <absl/container/btree_map.h>
|
|
#include <gc/gc_allocator.h>
|
|
|
|
#include "libexpr/nixexpr.hh"
|
|
#include "libexpr/symbol-table.hh"
|
|
#include "libutil/types.hh"
|
|
|
|
namespace nix { // TODO(tazjin): ::expr
|
|
|
|
class EvalState;
|
|
struct Value;
|
|
|
|
/* Map one attribute name to its value. */
|
|
struct Attr {
|
|
Symbol name;
|
|
Value* value; // TODO(tazjin): Who owns this?
|
|
Pos* pos; // TODO(tazjin): Who owns this?
|
|
Attr(Symbol name, Value* value, Pos* pos = &noPos)
|
|
: name(name), value(value), pos(pos){};
|
|
};
|
|
|
|
// Convenience alias for the backing map, with the garbage-collecting
|
|
// allocator explicitly specified.
|
|
using AttributeMap =
|
|
absl::btree_map<Symbol, Attr, std::less<Symbol>,
|
|
gc_allocator<std::pair<const Symbol, Attr>>>;
|
|
|
|
class Bindings {
|
|
public:
|
|
typedef AttributeMap::iterator iterator;
|
|
|
|
// Allocate a new attribute set that is visible to the garbage
|
|
// collector.
|
|
static Bindings* NewGC(size_t capacity = 0);
|
|
|
|
// Return the number of contained elements.
|
|
size_t size();
|
|
|
|
// Is this attribute set empty?
|
|
bool empty();
|
|
|
|
// Insert, but do not replace, values in the attribute set.
|
|
void push_back(const Attr& attr);
|
|
|
|
// Look up a specific element of the attribute set.
|
|
iterator find(const Symbol& name);
|
|
|
|
// TODO
|
|
iterator begin();
|
|
iterator end();
|
|
|
|
// Merge values from other into this attribute set.
|
|
void merge(const Bindings& other);
|
|
|
|
// TODO: can callers just iterate?
|
|
[[deprecated]] std::vector<const Attr*> lexicographicOrder();
|
|
|
|
// oh no
|
|
friend class EvalState;
|
|
|
|
private:
|
|
AttributeMap attributes_;
|
|
};
|
|
|
|
} // namespace nix
|