Am 2013-10-15 11:00, schrieb leledumbo: > I := TagArray[ord(TagSet)]; > I := TagArray[ord([tag1,tag5])]; > It's unclear what you expect from such statements. I think you better > explain the high level problem, I smell a misdesign in the solution.
Yes, there is always the danger of overcomplicating things. But I think in this case it makes sense. I have a file manager that logs whole directory branches. Files can have attributes like "Tagged" or "matching filter mask". There can be even more attributes like multiple tag sets or whatever: type FlagType = (Tagged,FileMaskMatch); FlagSetType = set of FlagTyp; I now want to store the number of files and the bytes for each directory branch. All possible set combination need to be considered because I may show all files that: are tagged = [Tagged] match a filter mask = [FileMaskMatch] are tagged AND match a filter mask = [Tagged,FileMaskMatch] all files = [] This makes 4 possible combinations but for a 3rd attribute I already have 8 and yet another doubles it to 16. For each of these possible sets I want to store: FileSumtype = record Number : Cardinal; Bytes : QWord; end; // of record with type BranchSumType = array[0..(1 shl (ord(High(FlagSetTyp))+1))-1] of FileSumType; // 0..2^n-1 I can now use a set variable var FlagSet : FlagSetType; to store what I want to display and use this variable for indexing the array var BranchSum : BranchSumType; when storing file information I can store them for all set combinations: BranchSum[byte([ ])].Number := ...; BranchSum[byte([ ])].Byte := ...; BranchSum[byte([ FileMaskMatch])].Number := ...; BranchSum[byte([ FileMaskMatch])].Byte := ...; BranchSum[byte([Tagged ])].Number := ...; BranchSum[byte([Tagged ])].Byte := ...; BranchSum[byte([Tagged,FileMaskMatch])].Number := ...; BranchSum[byte([Tagged,FileMaskMatch])].Byte := ...; This is convenient as I need to use procedures to propagate these numbers up in the tree, but not always all of them (because not all of them change when I only change the filter mask). So I can use a FileSet variable as parameter for a procedure and index the array with it: procedure PropagateUp(const F : FileSetType; const Values : FileSumType); begin .. BranchSum[byte(F)] := Values[byte(F)]; .. end; So far this works fine and is quite fast. _______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal