diff --git a/src/libexpr/nixexpr.cc b/src/libexpr/nixexpr.cc index 2c49ecd051..5c67b74ca6 100644 --- a/src/libexpr/nixexpr.cc +++ b/src/libexpr/nixexpr.cc @@ -7,6 +7,7 @@ ATermMap::ATermMap(unsigned int initialSize, unsigned int maxLoadPct) + : table(0) { this->maxLoadPct = maxLoadPct; table = ATtableCreate(initialSize, maxLoadPct); @@ -16,6 +17,36 @@ ATermMap::ATermMap(unsigned int initialSize, unsigned int maxLoadPct) ATermMap::ATermMap(const ATermMap & map) : table(0) +{ + copy(map); +} + + +ATermMap::~ATermMap() +{ + free(); +} + + +ATermMap & ATermMap::operator = (const ATermMap & map) +{ + if (this == &map) return *this; + free(); + copy(map); + return *this; +} + + +void ATermMap::free() +{ + if (table) { + ATtableDestroy(table); + table = 0; + } +} + + +void ATermMap::copy(const ATermMap & map) { ATermList keys = map.keys(); @@ -28,12 +59,6 @@ ATermMap::ATermMap(const ATermMap & map) } -ATermMap::~ATermMap() -{ - if (table) ATtableDestroy(table); -} - - void ATermMap::set(ATerm key, ATerm value) { return ATtablePut(table, key, value); diff --git a/src/libexpr/nixexpr.hh b/src/libexpr/nixexpr.hh index b7decaa3d9..fa3815216f 100644 --- a/src/libexpr/nixexpr.hh +++ b/src/libexpr/nixexpr.hh @@ -29,6 +29,8 @@ public: ATermMap(const ATermMap & map); ~ATermMap(); + ATermMap & ATermMap::operator = (const ATermMap & map); + void set(ATerm key, ATerm value); void set(const string & key, ATerm value); @@ -46,6 +48,9 @@ public: private: void add(const ATermMap & map, ATermList & keys); + + void free(); + void copy(const ATermMap & map); };