std.uuid: Update 4
Johannes Pfau
nospam at example.com
Sun Jun 17 01:22:36 PDT 2012
Am Sun, 17 Jun 2012 12:15:00 +0400
schrieb Dmitry Olshansky <dmitry.olsh at gmail.com>:
> On 17.06.2012 12:04, Johannes Pfau wrote:
> > Am Sat, 16 Jun 2012 21:11:51 +0400
> > schrieb Dmitry Olshansky<dmitry.olsh at gmail.com>:
> >>
> >> Ah and another way to go about it is:
> >> union {
> >> ubyte[16] uuid;
> >> size_t[16/size_t.sizeof] by_word;
> >> }
> >>
> >
> > Isn't that an optimization which should really be done by the
> > compiler? It already knows that it's supposed to compare two
> > ubyte[16]...
>
> It knows that you compare two ubyte[16] that it.
> It easily might miss the fact that one of them is always 0 in all 16
> cells.
>
> >
> > Also how could the union solution be used without having to copy the
> > data?
>
> There is no copy it union, aka overlapped storage. In other words as
> these 16 bytes represented as (on 32bit) 4 size_t. They share memory
> location. It doesn't play nice with CTFE though, as it thinks unions
> to be plain struct last time I checked.
>
Yes, I thought about using the union nested in the empty function, so a
copy would have been needed:
bool empty()
{
union
{
ubyte[16] uuid;
....
}
uuid = data; //copy
}
I didn't know that it's possible to make members of a union private
though, so I could use this in the UUID struct:
union
{
ubyte[16] data;
private size_t[16/size_t.sizeof] by_word;
}
which indeed wouldn't require copying. However, with this code added
std.uuid fails some unrelated ctfe UUID comparison unittests...
More information about the Digitalmars-d
mailing list