diff options
author | Nicolas B. Pierron <nicolas.b.pierron@gmail.com> | 2015-07-14 19:18:56 +0200 |
---|---|---|
committer | Nicolas B. Pierron <nicolas.b.pierron@gmail.com> | 2015-07-14 19:23:17 +0200 |
commit | db21cfa68820ed06f176aaf54e0ee5ce023951f7 (patch) | |
tree | dc40261fb7891ac807497086b2c3f75868875344 /src/libexpr/attr-set.cc | |
parent | 467977f20326f704b259157652ee9b7ba2efaa78 (diff) |
Move attribute set data structures into their own header file.
This modification moves Attr and Bindings structures into their own header
file which is dedicated to the attribute set representation. The goal of to
isolate pieces of code which are related to the attribute set
representation. Thus future modifications of the attribute set
representation will only have to modify these files, and not every other
file across the evaluator.
Diffstat (limited to 'src/libexpr/attr-set.cc')
-rw-r--r-- | src/libexpr/attr-set.cc | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/libexpr/attr-set.cc b/src/libexpr/attr-set.cc new file mode 100644 index 000000000..9ac5e6031 --- /dev/null +++ b/src/libexpr/attr-set.cc @@ -0,0 +1,59 @@ +#include "attr-set.hh" +#include "eval.hh" + +#include <algorithm> + + +namespace nix { + + +static void * allocBytes(size_t n) +{ + void * p; +#if HAVE_BOEHMGC + p = GC_malloc(n); +#else + p = malloc(n); +#endif + if (!p) throw std::bad_alloc(); + return p; +} + + +/* Allocate a new array of attributes for an attribute set with a specific + capacity. The space is implicitly reserved after the Bindings + structure. */ +Bindings * EvalState::allocBindings(Bindings::size_t capacity) +{ + return new (allocBytes(sizeof(Bindings) + sizeof(Attr) * capacity)) Bindings(capacity); +} + + +void EvalState::mkAttrs(Value & v, unsigned int expected) +{ + clearValue(v); + v.type = tAttrs; + v.attrs = allocBindings(expected); + nrAttrsets++; + nrAttrsInAttrsets += expected; +} + + +/* Create a new attribute named 'name' on an existing attribute set stored + in 'vAttrs' and return the newly allocated Value which is associated with + this attribute. */ +Value * EvalState::allocAttr(Value & vAttrs, const Symbol & name) +{ + Value * v = allocValue(); + vAttrs.attrs->push_back(Attr(name, v)); + return v; +} + + +void Bindings::sort() +{ + std::sort(begin(), end()); +} + + +} |