diff options
Diffstat (limited to 'third_party/nix/src/libexpr/attr-set.hh')
-rw-r--r-- | third_party/nix/src/libexpr/attr-set.hh | 20 |
1 files changed, 12 insertions, 8 deletions
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<Symbol, Attr, std::less<Symbol>, - gc_allocator<std::pair<const Symbol, Attr>>>; +using AttributeMap = absl::btree_map<Symbol, Attr, std::less<Symbol>, + gc_allocator<std::pair<Symbol, Attr>>>; + +using AttributeVector = + std::vector<std::pair<Symbol, Attr>, gc_allocator<std::pair<Symbol, Attr>>>; class BindingsIterator : public std::iterator<std::forward_iterator_tag, std::pair<const Symbol, Attr>> { friend class Bindings; friend class BTreeBindings; + friend class VectorBindings; public: BindingsIterator() : _iterator(){}; @@ -43,6 +46,7 @@ class BindingsIterator : public std::iterator<std::forward_iterator_tag, bool operator!=(const BindingsIterator& other) const; reference operator*() const; pointer operator->() const { return &operator*(); } + BindingsIterator& operator=(const BindingsIterator& other) { _iterator = other._iterator; return *this; @@ -52,8 +56,11 @@ class BindingsIterator : public std::iterator<std::forward_iterator_tag, explicit BindingsIterator(AttributeMap::iterator&& iterator) : _iterator(iterator){}; + explicit BindingsIterator(AttributeVector::iterator&& iterator) + : _iterator(iterator){}; + private: - AttributeMap::iterator _iterator; + std::variant<AttributeMap::iterator, AttributeVector::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 |