Should we add `a * b` for vectors?
Dukc
ajieskola at gmail.com
Thu Oct 5 08:27:16 UTC 2017
On Wednesday, 4 October 2017 at 17:56:16 UTC, Walter Bright wrote:
> Please present an example.
Let's say you're importing a C library which defines random
function generators. They may be more random than Phobos rngs,
they might be crytpo secure or whatever so you want to use them.
It could be like:
module crng;
extern(c) struct Crng
{ int seedA;
int seedB;
ubyte[] restOfTheData;
}
extern(c) int current(Crng*);
extern(c) void toNextValue(Crng*);
extern(c) Crng initByTime(int unixTime);
//...
But you also want a phobos-style range interface for them. You
have to wrap the c struct into a new struct type:
struct Crng
{ crng.Crng _impl;
alias _impl this;
auto front(){return current(*_impl);}
void popFront(){toNextValue(*_impl);}
//...
}
and you have to rewrite many wrappers for Crng functions despite
the alias this because they either require return Crng or gequire
a pointer to one. This needs to be defined manually for example:
Crng initByTime(int time){return Crng(crng.initByTime(time))};
With ADL it would be enough to extend the original struct with
range primitives:
auto front(Crng range){return current(*range);}
void popFront(ref Crng range){toNextValue(*range);}
//...
With current semantics the latter example will work only with
locally defined range function templates. Not with Phobos ones,
because they cannot see the extension functions.
Note, I do not have a D compiler in where I posted these from so
they're not checked for compilation errors.
More information about the Digitalmars-d
mailing list