diff options
author | Kane York <kanepyork@gmail.com> | 2020-08-13T23·40-0700 |
---|---|---|
committer | kanepyork <rikingcoding@gmail.com> | 2020-08-17T02·23+0000 |
commit | 1fc9ba4885f5a16e263bcc5e58bef68e3aa32cea (patch) | |
tree | 8c53707e223b9516002e3bf80f0e731f8c0f3212 /third_party/nix/src/libexpr/attr-set.hh | |
parent | 38f2ea34f466d8264f7a060627eece5b3cbc40ba (diff) |
refactor(tvix): always pass Bindings by ptr, use shared/unique_ptr r/1658
Value now carries a shared_ptr<Bindings>, and all Bindings constructors return a unique_ptr<Bindings>. The test that wanted to compare two Bindings by putting them into Values has been modified to use the new Equal() method on Bindings (extracted from EvalState). Change-Id: I8dfb60e65fdabb717e3b3e5d56d5b3fc82f70883 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1744 Tested-by: BuildkiteCI Reviewed-by: glittershark <grfn@gws.fyi> Reviewed-by: tazjin <mail@tazj.in>
Diffstat (limited to 'third_party/nix/src/libexpr/attr-set.hh')
-rw-r--r-- | third_party/nix/src/libexpr/attr-set.hh | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/third_party/nix/src/libexpr/attr-set.hh b/third_party/nix/src/libexpr/attr-set.hh index 6397008517d2..c02f3930fda5 100644 --- a/third_party/nix/src/libexpr/attr-set.hh +++ b/third_party/nix/src/libexpr/attr-set.hh @@ -25,15 +25,17 @@ using AttributeMap = absl::btree_map<Symbol, Attr>; class Bindings { public: - typedef AttributeMap::iterator iterator; + using iterator = AttributeMap::iterator; + using const_iterator = AttributeMap::const_iterator; // Allocate a new attribute set that is visible to the garbage // collector. - static Bindings* NewGC(size_t capacity = 0); + static std::unique_ptr<Bindings> New(size_t capacity = 0); // Create a new attribute set by merging two others. This is used to // implement the `//` operator in Nix. - static Bindings* Merge(const Bindings& lhs, const Bindings& rhs); + static std::unique_ptr<Bindings> Merge(const Bindings& lhs, + const Bindings& rhs); // Return the number of contained elements. size_t size() const; @@ -44,11 +46,18 @@ class Bindings { // Insert, but do not replace, values in the attribute set. void push_back(const Attr& attr); + // Are these two attribute sets deeply equal? + // Note: Does not special-case derivations. Use state.eqValues() to check + // attrsets that may be derivations. + bool Equal(const Bindings* other, EvalState& state) const; + // Look up a specific element of the attribute set. iterator find(const Symbol& name); iterator begin(); + const_iterator cbegin() const; iterator end(); + const_iterator cend() const; // Returns the elements of the attribute set as a vector, sorted // lexicographically by keys. |