std.data.json formal review

deadalnix via Digitalmars-d digitalmars-d at puremagic.com
Mon Aug 17 11:51:53 PDT 2015


On Monday, 17 August 2015 at 18:12:02 UTC, Andrei Alexandrescu 
wrote:
> On 8/14/15 7:40 AM, Andrei Alexandrescu wrote:
>> On 8/12/15 5:43 AM, Sönke Ludwig wrote:
>>>> Anyway, I've just started to work on a generic variant of an 
>>>> enum based
>>>> algebraic type that exploits as much static type information 
>>>> as
>>>> possible. If that works out (compiler bugs?), it would be a 
>>>> great thing
>>>> to have in Phobos, so maybe it's worth to delay the JSON 
>>>> module for that
>>>> if necessary.
>>>>
>>>
>>> First proof of concept:
>>> https://gist.github.com/s-ludwig/7a8a60150f510239f071#file-taggedalgebraic-d-L148
>>>
>>>
>>>
>>> It probably still has issues with const/immutable and ref in 
>>> some
>>> places, but the basics seem to work as expected.
>>
>> struct TaggedAlgebraic(U) if (is(U == union)) { ... }
>>
>> Interesting. I think it would be best to rename it to 
>> TaggedUnion
>> (instantly recognizable; also TaggedAlgebraic is an oxymoron 
>> as there's
>> no untagged algebraic type). A good place for it is straight in
>> std.variant.
>>
>> What are the relative advantages of using an integral over a 
>> pointer to
>> function? In other words, what's a side by side comparison of
>> TaggedAlgebraic!U and Algebraic!(types inside U)?
>>
>> Thanks,
>>
>> Andrei
>
> Ping on this. My working hypothesis:
>
> - If there's a way to make a tag smaller than one word, e.g. by 
> using various packing tricks, then the integral tag has an 
> advantage over the pointer tag.
>
> - If there's some ordering among types (e.g. all types below 16 
> have some property etc), then the integral tag again has an 
> advantage over the pointer tag.
>
> - Other than that the pointer tag is superior to the integral 
> tag at everything. Where it really wins is there is one unique 
> tag for each type, present or future, so the universe of types 
> representable is the total set. The pointer may be used for 
> dispatching but also as a simple integral tag, so the pointer 
> tag is a superset of the integral tag.
>
> I've noticed many people are surprised by std.variant's use of 
> a pointer instead of an integral for tagging. I'd like to 
> either figure whether there's an advantage to integral tags, or 
> if not settle for good a misconception.
>
>
> Andrei

 From the compiler perspective, the tag is much nicer. Compiler 
can use jump table for instance.

It is not a good solution for Variant (which needs to be able to 
represent arbitrary types) but if the amount of types is finite, 
tag is almost always a win.

In the case of JSON, using a tag and packing trick, it is 
possible to pack everything in a 2 pointers sized struct without 
much trouble.


More information about the Digitalmars-d mailing list