Questions about opAssign alternate and template quality

nobody nobody at mailinator.com
Thu Aug 10 02:53:46 PDT 2006


I wanted to try out D's template system so I decided to define data structures 
that represent all the permutations of RGB, HLS, RGBA and HLSA. I decided to 
convert between the various types by overriding opAssign under the mistaken 
impression that D supported it. Impressive when you do the math:

     3! + 3! + 4! + 4! = 60 types
    (3! + 3! + 4! + 4!)^2 = 3600 opAssigns

So my first question is whether anyone has an elegant alternative to using opAssign?

My second question is mostly an open invitation to make suggestions for 
improving my template writing style. In particular I am suspicious that there is 
a way to take better advantage of templates and not write out all 60 permutations.

So here is the actual code. I only included the RGB permutations to keep it as 
short as possible.


union PixArray
{
   PixBGR[] bgr;
   PixBRG[] brg;
   PixGBR[] gbr;
   PixGRB[] grb;
   PixRBG[] rbg;
   PixRGB[] rgb;
}


template PixBGR_Perms_opAssignBGR(T,U)
{

   T opAssign(U that)
   {
     ubyte tempB = that.b;
     ubyte tempG = that.g;
     ubyte tempR = that.r;
     this.b = tempB;
     this.g = tempG;
     this.r = tempR;
     return *this;
   }

}


template PixBGR_Perms(T)
{
   alias b blue;
   alias g green;
   alias r red;

   // opAssign defined for all perms
   mixin PixBGR_Perms_opAssignBGR!(T,PixBGR);
   mixin PixBGR_Perms_opAssignBGR!(T,PixBRG);
   mixin PixBGR_Perms_opAssignBGR!(T,PixGBR);
   mixin PixBGR_Perms_opAssignBGR!(T,PixGRB);
   mixin PixBGR_Perms_opAssignBGR!(T,PixRBG);
   mixin PixBGR_Perms_opAssignBGR!(T,PixRGB);
}


align(1)
{
   struct PixBGR { ubyte b; ubyte g; ubyte r; mixin PixBGR_Perms!(PixBGR); }
   struct PixBRG { ubyte b; ubyte r; ubyte g; mixin PixBGR_Perms!(PixBRG); }
   struct PixGBR { ubyte g; ubyte b; ubyte r; mixin PixBGR_Perms!(PixGBR); }
   struct PixGRB { ubyte g; ubyte r; ubyte b; mixin PixBGR_Perms!(PixGRB); }
   struct PixRBG { ubyte r; ubyte b; ubyte g; mixin PixBGR_Perms!(PixRBG); }
   struct PixRGB { ubyte r; ubyte g; ubyte b; mixin PixBGR_Perms!(PixRGB); }
}



More information about the Digitalmars-d-learn mailing list