Can it be known in general whether or not placing a case within a for loop will result in bad assembly. I'm interested mainly in Delphi, but this is an interesting programming question, both in terms of style and performance.
Here are my codez!
case ResultList.CompareType of
TextCompareType:
begin
LastGoodIndex := -1;
for I := 1 to ResultList.Count -1 do
if (LastGoodIndex = -1) and (not ResultList[I].Indeterminate) then
LastGoodIndex := I
else if not ResultList[I].Indeterminate then
begin
if (StrComp(ResultList[LastGoodIndex].ResultAsText,
ResultList[I].ResultAsText) > 0)
and (Result FalseEval) then
Result := TrueEval
else
Result := FalseEval;
LastGoodIndex := I;
end;
end;
end;
NumericCompareType:
begin
//Same as above with a numeric comparison
end;
DateCompareType:
begin
//Same as above with a date comparison
end;
BooleanCompareType:
begin
//Same as above with a boolean comparison
end;
alternatively I could write
begin
LastGoodIndex := -1;
for I := 1 to ResultList.Count -1 do
if (LastGoodIndex = -1) and (not ResultList[I].Indeterminate) then
LastGoodIndex := I
else if not ResultList[I].Indeterminate then
begin
case ResultList.CompareType of
TextCompareType:
begin
if (StrComp(ResultList[LastGoodIndex].ResultAsText,
ResultList[I].ResultAsText) > 0)
and (Result FalseEval) then
Result := TrueEval
else
Result := FalseEval;
LastGoodIndex := I;
end;
NumericCompareType:
begin
//Same as above with a numeric comparison
end;
DateCompareType:
begin
//Same as above with a date comparison
end;
BooleanCompareType:
begin
//Same as above with a boolean comparison
end;
end;
end;
end;
I don't like the second way because I'm asking a question I know the answer to in a for loop and I don't like the first way because I'm repeating the code I use to figure out which of my objects contain valid information.
Perhaps there is a design pattern someone could suggest that would circumvent this all together.