Less Code Bloat from Templates
Jonathan Marler via Digitalmars-d
digitalmars-d at puremagic.com
Thu Oct 30 07:08:20 PDT 2014
On Thursday, 30 October 2014 at 13:44:46 UTC, Marc Schütz wrote:
> On Thursday, 30 October 2014 at 12:51:50 UTC, Jonathan Marler
> wrote:
>> I'm not sure what the status is on this, I remember Walter
>> saying in a conference (DConf 2014 I think) that he had an
>> idea to remove duplicate template instantiations by comparing
>> their generated code but I had another idea I thought I'd
>> share.
>>
>> I'm calling the idea "CombinationTypes". Sort of a
>> "compile-time" concept that allows code to use multiple types
>> that would produce the same binary code but retains type
>> information. The first combination type I would introduce is
>> the "any*" or "any[]" types. For example, you could write the
>> following function:
>>
>> any* limitPtr(any[] array) {
>> return any.ptr + any.length;
>> }
>
> This is basically type erasure. It works well reasonably well
> as long as only references are allowed. But it seems you want
> to allow value types, too.
>
Ya, like I said I haven't thought of too many types (value types)
that would be useful so I thought I'd throw the idea out there
and see if anyone came up with anything. I think the "anybyte"
type could be pretty useful.
>>
>> The advantage of using a combination type like "any" over say
>> "void" is the compiler knows what you are trying to do and
>> won't require you to perform any awkward casting. The
>> following code should work fine:
>>
>> char[] mychars;
>> string mystring;
>>
>> auto mycharsLimit = mychars.limitPtr; // mycharsLimit is a
>> char*
>> auto mystringLimit = mystring.limitPtr; // mystringLimit is a
>> immutable(char)*
>>
>> The generated code for this function will be identical no
>> matter what the element type is.
>
> Unfortunately not, only if it's an array of byte-sized
> elements. If you pass a `wchar[]`, the calculation needs to be
> <pointer + 2*length> instead of <pointer + length>.
>
> It gets more involved if you want to allow copying and
> assigning, because the types can have non-default `this()`,
> `this(this)`, `~this()`, `opAssign()`, and so on.
>
Oh woops you are right. I guess this function would have to be
implemented like this:
any* limitPtr(any[] array, size_t elementLength = any.sizeof) {
return any.ptr + (elementLength * any.length);
}
That actually might be kind of confusing, the '+' operator on an
unknown pointer defaulting to size 1 isn't really intuitive.
Hmmm...I would have to think on this more.
One more thought that just came to me is maybe it would be useful
to add an array/pointer type to the language that held it's
element size at runtime. You could implement that currently
using casts and such, but having it as a first class type in the
language would make it easy to use. I don't know how helpful it
would be though, maybe not enough benefit for the amount of work
it would take to support it. I might call it something like
"dynamic*/dynamic[]" which would be the same as a regular
pointer/array except they have an extra size_t field called
elementSize. Just a thought...
More information about the Digitalmars-d
mailing list