On Tuesday, 8 February 2022 at 21:08:47 UTC, tastyminerals wrote:
>https://forum.dlang.org/post/mailman.1072.1581112984.31109.digitalmars-d-learn@puremagic.com
On Friday, 7 February 2020 at 22:03:00 UTC, H. S. Teoh wrote:
>On Fri, Feb 07, 2020 at 07:37:08PM +0000, mark via Digitalmars-d-learn wrote:
>[...]
bool[E] works just fine.
The bool does take up 1 byte, though, so if you're really want to optimize that away, you could do this:
alias Unit = void[0];
enum unit = Unit.init;
// Look, ma! A bona fide set!
Unit[E] mySet;
mySet[...] = unit;
mySet.remove(...);
... // etc.
[...]
>Can you please explain what does bool[E]
mean? And how does the code with aliasing void[0] and then using enum even work?
bool[E]
means an associative array with keys of type E
and values of type bool
. Since a bool
value takes up 1 byte in memory, using a bool[E]
associative array to store a set of E
values means that for every value in your set, you will have to allocate an extra 1 byte for the bool
in addition to the bytes required for the E
itself.
In most cases, 1 extra byte is not going to matter very much, so that's not a big deal. But if you really, really want to avoid allocating any extra bytes, you can use void[0]
in place of bool
, since a void[0]
takes up 0 bytes in memory. (The void
part has no special significance here--you could also use int[0]
or char[0]
, for example.)
The alias
and the enum
just make the code a little nicer to read by letting you write Unit
instead of void[0]
and unit
instead of void[0].init
. You could get rid of them and the code would work exactly the same way; it'd just be a little bit uglier:
void[0][E] mySet;
mySet[...] = void[0].init;
mySet.remove(...);
// etc.
The name "unit" comes from the concept of a unit type in theoretical computer science.