Am 2014-01-27 17:41, schrieb waldo kitty:
> well, i can't set any option more than once, anyway... not unless i make a 
code error and set or clear the wrong bit but that will be noticed very quickly 
during testing ;)  for readability, i find setting the bits and then running down 
a simple CASE statement much easier to follow... especially since i wrote my code 
generator tool that creates the CASE statement and all of its valid selections ;)


I recently had a similar problem and solved it this way:
With

-----------------------------------
type FlagType  = (FlagA,
                  FlagB,
                  FlagC,
                  FlagD,
                  FlagE,
                  FlagF);
     FlagSetType = set of FlagType;
var  FlagSet : FlagSetType;
-----------------------------------

I get a compact bit array (a set) where I can give each bit an individual name.
Then these sets

-----------------------------------
[FlagA,FlagB,FlagC,FlagD,FlagE,FlagF]
[FlagA,      FlagC,FlagD,FlagE,FlagF]
[FlagA,FlagB,FlagC,FlagD,FlagE,FlagF]
[FlagA,            FlagD,FlagE,FlagF]
[FlagA,FlagB,            FlagE,FlagF]
[FlagA,FlagB,FlagC,FlagD,FlagE      ]
-----------------------------------

select one "number" (which it internaly is) and

-----------------------------------
byte([FlagA,FlagB,FlagC,FlagD,FlagE,FlagF])
byte([FlagA,      FlagC,FlagD,FlagE,FlagF])
byte([FlagA,FlagB,FlagC,FlagD,FlagE,FlagF])
byte([FlagA,            FlagD,FlagE,FlagF])
byte([FlagA,FlagB,            FlagE,FlagF])
byte([FlagA,FlagB,FlagC,FlagD,FlagE      ])
-----------------------------------

can be used to convert them to real (integer) numbers in a case statement:

-----------------------------------
case byte(FlagSet) of
   byte([FlagA,FlagB,FlagC,FlagD,FlagE,FlagF]) : begin .. end;
   byte([FlagA,      FlagC,FlagD,FlagE,FlagF]) : begin .. end;
   byte([FlagA,FlagB,FlagC,FlagD,FlagE,FlagF]) : begin .. end;
   byte([FlagA,            FlagD,FlagE,FlagF]) : begin .. end;
   byte([FlagA,FlagB,            FlagE,FlagF]) : begin .. end;
   byte([FlagA,FlagB,FlagC,FlagD,FlagE      ]) : begin .. end;
   end; // of case
-----------------------------------

and still I can use the set as a usual set:

-----------------------------------
include(FlagSet,FlagD);
...
if FlagA in Flagset then..
...
etc.
-----------------------------------

I even use an array which is indexed with the set variable:

-----------------------------------
type FlagSetArrayType = array[0..(1 shl (ord(High(FlagSetType))+1))-1] of 
any_other_type; // 0..2^n-1
-----------------------------------

which holds information for all 2^n possible flag combination in the set.
Then I can use the set variable to index the array like this:

-----------------------------------
var FlagSetArray = FlagSetArrayType;
...

any_other_type_variable := FlagSetArray[ 
byte([FlagA,FlagB,FlagC,FlagD,FlagE,FlagF])   ];
-----------------------------------

(I hope there is no typo in the above code)
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to