From d5505fcff9dc9ad76b4cb822cc642fdd0e238553 Mon Sep 17 00:00:00 2001 From: Griffin Smith Date: Sun, 12 Jul 2020 16:51:00 -0400 Subject: feat(3p/nix): Add vector-backed impl for Bindings Add an alternative impl of the now-abstract Bindings base class that is backed by a std::vector, somewhat similar but stylistically a little superior to the array-backed implementation in upstream nix. The underlying iterator type in BindingsIterator is now backed by a std::variant that we std::visit an overload over in order to implement the various bits of the iterator interface. Paired-With: Luke Granger-Brown Paired-With: Vincent Ambo Paired-With: Perry Lorier Change-Id: I7fbd1f4d5c449e2f9b82102a701b0bacd5e80672 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1123 Tested-by: BuildkiteCI Reviewed-by: tazjin --- third_party/nix/src/libexpr/attr-set.hh | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) (limited to 'third_party/nix/src/libexpr/attr-set.hh') diff --git a/third_party/nix/src/libexpr/attr-set.hh b/third_party/nix/src/libexpr/attr-set.hh index 06ae8f4b0723..3834eac419e1 100644 --- a/third_party/nix/src/libexpr/attr-set.hh +++ b/third_party/nix/src/libexpr/attr-set.hh @@ -26,14 +26,17 @@ struct Attr { // Convenience alias for the backing map, with the garbage-collecting // allocator explicitly specified. -using AttributeMap = - absl::btree_map, - gc_allocator>>; +using AttributeMap = absl::btree_map, + gc_allocator>>; + +using AttributeVector = + std::vector, gc_allocator>>; class BindingsIterator : public std::iterator> { friend class Bindings; friend class BTreeBindings; + friend class VectorBindings; public: BindingsIterator() : _iterator(){}; @@ -43,6 +46,7 @@ class BindingsIterator : public std::iterator() const { return &operator*(); } + BindingsIterator& operator=(const BindingsIterator& other) { _iterator = other._iterator; return *this; @@ -52,8 +56,11 @@ class BindingsIterator : public std::iterator _iterator; }; class Bindings { @@ -78,7 +85,7 @@ class Bindings { virtual void push_back(const Attr& attr) = 0; // Insert a value, or replace an existing one. - virtual void insert_or_assign(const Attr& attr) = 0; + virtual void insert_or_assign(Attr& attr) = 0; // Look up a specific element of the attribute set. virtual iterator find(const Symbol& name) = 0; @@ -95,9 +102,6 @@ class Bindings { // oh no friend class EvalState; - - private: - AttributeMap attributes_; }; } // namespace nix -- cgit 1.4.1