https://issues.dlang.org/show_bug.cgi?id=16269
--- Comment #4 from Ketmar Dark <[email protected]> --- another try. this time it adds `ensureAllocated()` method, which can be used like this: ====================================== void test (string[int] aa) { aa[42] = "42"; } void main () { // inline { string[int] aa; test(aa.ensureAllocated); assert(aa[42] == "42"); // check that AA is not cleared aa.ensureAllocated(); assert(aa[42] == "42"); } // function { string[int] bb; bb.ensureAllocated; test(bb); assert(bb[42] == "42"); // check that AA is not cleared bb.ensureAllocated(); assert(bb[42] == "42"); } } ====================================== diff --git a/src/object.d b/src/object.d index 40e2391..0d82f07 100644 --- a/src/object.d +++ b/src/object.d @@ -1876,6 +1876,7 @@ extern (C) inout(void)[] _aaKeys(inout void* p, in size_t keysize, const TypeInfo tiKeyArray) pure nothrow; void* _aaRehash(void** pp, in TypeInfo keyti) pure nothrow; void _aaClear(void* p) pure nothrow; + void _aaEnsureAllocated(void* p, const TypeInfo_AssociativeArray ti); // alias _dg_t = extern(D) int delegate(void*); // int _aaApply(void* aa, size_t keysize, _dg_t dg); @@ -1919,6 +1920,18 @@ void clear(T : Value[Key], Value, Key)(T* aa) _aaClear(*cast(void **) aa); } +T ensureAllocated(T : Value[Key], Value, Key)(ref T aa) +{ + _aaEnsureAllocated(cast(void*)&aa, typeid(T)); + return aa; +} + +T ensureAllocated(T : Value[Key], Value, Key)(T* aa) +{ + _aaEnsureAllocated(cast(void*)aa, typeid(T)); + return *aa; +} + T rehash(T : Value[Key], Value, Key)(T aa) { _aaRehash(cast(void**)&aa, typeid(Value[Key])); diff --git a/src/rt/aaA.d b/src/rt/aaA.d index cf8943e..b16b6d8 100644 --- a/src/rt/aaA.d +++ b/src/rt/aaA.d @@ -443,6 +443,16 @@ extern (C) void _aaClear(AA aa) pure nothrow } } +/// Remove all elements from AA, allocate new AA if it isn't allocated yet. +extern (C) void _aaEnsureAllocated(AA* paa, const TypeInfo_AssociativeArray ti) +{ + if (paa !is null && paa.impl is null) + { + // alloc implementation + paa.impl = new Impl(ti); + } +} + /// Rehash AA extern (C) void* _aaRehash(AA* paa, in TypeInfo keyti) pure nothrow { -- 2.9.0 --
