Re: [AD] a fix struct for dallegro

[ Thread Index | Date Index | More lists.liballeg.org/allegro-developers Archives ]


On 2007-04-16, torhus@xxxxxxxxxx <torhus@xxxxxxxxxx> wrote:
> Peter Wang wrote:
> > On 2007-04-15, torhus@xxxxxxxxxx <torhus@xxxxxxxxxx> wrote:
> >> 
> >> Since fixed is just an alias for int, there's still the danger of mixing 
> >> fixed and int values.  So this solution isn't perfect.  I tried making 
> >> fixed a D typedef, which would make it a completely distinct type from 
> >> int.  But that requires a lot of casting when using it.
> > 
> > In what cases?  I would think that most uses of fixed would require
> > itofix, ftofix, fixtoi or fixtof calls anyway.
> 
> 
> I was thinking about things like the implemention of itofix, etc.  Of 
> course, it would only require adapting these functions.  They are 
> implemented in D to allow them to be inlined.  This example illustrates 
> the problem, keep in mind that typedefs in D are 'strong', as opposed to 
> aliases that behave like C typedefs:
> 
> ---
> typedef int fixed;
> 
> void main()
> {
>     int i = 5;
> 
>     fixed f1 = 5 << 16;  // the compiler accept this, since no int vars 
> are involved
>     fixed f2 = i << 16;  // doesn't compile, no implicit conversion to 
> int here
>     fixed f3 = cast(fixed)(i << 16);  // explicit cast to fixed works
> }
> --
> 
> The type of the expression 'i << 16' above is int.  There is no such 
> thing as user-defined implicit conversions in D, so one way or the 
> other, it will have to be explicit.  So the fixed type wouldn't behave 
> like in C-allegro anymore.

Good.  The (x<<16) idiom should be written as itofix(x) anyway, so I see
no problem with it.  You already provided fix(x) which is just as short.

> >>    fix sqrt()          { fix t;  t.value = fixsqrt(value);    return t; }
> >>    fix cos()           { fix t;  t.value = fixcos(value);     return t; }
> >>    fix sin()           { fix t;  t.value = fixsin(value);     return t; }
> >>    fix tan()           { fix t;  t.value = fixtan(value);     return t; }
> >>    fix acos()          { fix t;  t.value = fixacos(value);    return t; }
> >>    fix asin()          { fix t;  t.value = fixasin(value);    return t; }
> >>    fix atan()          { fix t;  t.value = fixatan(value);    return t; }
> >>    fix atan2(fix x)    { fix t;  t.value = fixatan2(value, x.value);  return t; }
> > 
> > Are these necessary?
> 
> Would you prefer to have only the free functions?  I added both because 
> I wasn't sure which one would make the most sense.  Or should I remove 
> them altogether?

Speaking for myself, I would only ever use the free functions.

Peter





Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/