How to remove all items in an associative array?
Bill Baxter
dnewsgroup at billbaxter.com
Thu Oct 18 04:15:20 PDT 2007
Oskar Linde wrote:
> Bill Baxter wrote:
>> Yang Bo wrote:
>>> http://www.digitalmars.com/d/statement.html said:
>>>
>>> The aggregate must be loop invariant, meaning that elements to the
>>> aggregate cannot be added or removed from it in the
>>> NoScopeNonEmptyStatement.
>>>
>>> So, how can I remove them?
>> I don't understand the body, but the answer to the question in the
>> subject line is AA = null; or AA = AA.init;
>
> Since quite a while ago, the D associative arrays have become pure
> reference types. While the above has the apparent effect of clearing the
> array, it does in fact just reassign the current reference. If you have
> several references to the same associative array, the above will not
> clear the actual array referred to.
>
> To clear the actual array, you need to resort to hackery. Something
> like this should definitely be included in the compiler/runtime.
>
> private struct BB { void*[]b; size_t nodes; }
>
> private union ToPtr(T) {T x; void * ptr; }
>
> void clear(T,E)(T[E] aa) {
> ToPtr!(typeof(aa)) toptr;
> toptr.x = aa;
> BB* b = cast(BB*) toptr.ptr;
> if (b) {
> b.b = null;
> b.nodes = 0;
> }
> }
>
>> http://www.prowiki.org/wiki4d/wiki.cgi?DocComments/Arrays
>
> I rewrote that section in a way that hopefully explains the semantics
> better.
>
> This question comes up frequently enough to merit an addition to the
> official documentation and a clear/deleteAll implementation (like the
> one above) should definitely be added to the language and
> phobos/internal/aaA.d.
Interesting tidbit. Thanks for the info and for updating that page.
--bb
More information about the Digitalmars-d
mailing list