D - More alternate-syntax template tomfoolery
- Burton Radons (49/49) Feb 11 2003 My suggestion to change cast would make it expressible in my template
My suggestion to change cast would make it expressible in my template
syntax, if unimplementable:
$to cast ($to, $from value) { ... }
But if cast were made into a normal template function for the purposes
int i = 4;
object o = i; // Create an object instance representing i.
int j = o; // Check that "o" can be casted to int and do so.
The problem is that because the boxed object results in a different
instance of the value object, this pseudo-code:
struct Foo { int x = 10; }
Foo p = new Foo ();
object box = p;
p.x = 20;
Console.Write(((Foo)box).x);
Behaves differently depending upon whether Foo is a struct or a class;
it tries to bring their syntaxes too close together, IMO. Anyway, I'm
just justifying the fact that my boxing/unboxing takes more effort to
use. Here's the partial implementation:
struct generic
{
TypeInfo type;
void *data;
}
generic cast ($to (generic), $from value)
{
generic result;
result.type = $from;
result.data = ((ubyte *) &value) [0 .. $from.size].dup;
return result;
}
$to cast ($to (int, float, double, ...), $from (generic) value)
{
TypeInfo type = value.type;
if (cast (IntType) type)
return *(int *) value.data;
if (cast (FloatType) type)
return *(float *) value.data;
if (cast (DoubleType) type)
return *(double *) value.data;
...
throw new CastError (type, $to);
}
/* Other implementations needed for struct and class. */
And some usage:
int i = 4;
generic o = cast (generic, i);
int j = cast (int, o);
Feb 11 2003








Burton Radons <loth users.sourceforge.net>