mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-05-31 21:22:46 +02:00

------------------------------------------------------------------------ r47460 | florian | 2020-11-19 21:37:23 +0000 (Thu, 19 Nov 2020) | 1 line * remove readln ------------------------------------------------------------------------ --- Merging r47460 into '.': U tests/webtbs/tw38058.pp --- Recording mergeinfo for merge of r47460 into '.': U . git-svn-id: branches/fixes_3_2@48135 -
71 lines
1.8 KiB
ObjectPascal
71 lines
1.8 KiB
ObjectPascal
{$mode objfpc}
|
|
program Project1;
|
|
type
|
|
|
|
TElem=(a,b,c,d,e,f);
|
|
TmyElem=(my_a,my_c,my_e);
|
|
TElems=set of TElem;//Output set, need convert my_a->a, my_c->c, my_e->e остальное скипаем
|
|
TmyElems=set of TmyElem;//Input set
|
|
|
|
|
|
generic TSetConverter<TGEnumIn,TGSetIn,TGEnumOut,TGSetOut,TGEnumConverter>=class
|
|
class function Convert(value:TGSetIn):TGSetOut;
|
|
end;
|
|
|
|
TmyElem2TElem_Converter=class
|
|
class function Convert(valueIn:TmyElem;out valueOut:TElem):boolean;
|
|
end;
|
|
|
|
TConverter=specialize TSetConverter<TmyElem,TmyElems,TElem,TElems,TmyElem2TElem_Converter>;
|
|
|
|
class function TmyElem2TElem_Converter.Convert(valueIn:TmyElem;out valueOut:TElem):boolean;
|
|
begin
|
|
result:=true;
|
|
case valueIn of
|
|
my_a:valueOut:=a;
|
|
my_c:valueOut:=c;
|
|
my_e:valueOut:=e;
|
|
else result:=false;
|
|
end;
|
|
end;
|
|
|
|
{//Variant 1
|
|
class function TSetConverter.Convert(value:TGSetIn):TGSetOut;
|
|
var
|
|
CurrentEnumIn:TGEnumIn;
|
|
CurrentEnumOut:TGEnumOut;
|
|
tvalue:TGSetIn;
|
|
begin
|
|
result:=[];
|
|
for CurrentEnumIn:=low(TGEnumIn) to high(TGEnumIn) do begin
|
|
tvalue:=value-[CurrentEnumIn];
|
|
if tvalue<>value then begin
|
|
if TGEnumConverter.convert(CurrentEnumIn,CurrentEnumOut) then
|
|
result:=result+[CurrentEnumOut];
|
|
if tvalue=[] then exit;
|
|
value:=tvalue;
|
|
end;
|
|
end;
|
|
end;
|
|
}
|
|
//Variant 2
|
|
class function TSetConverter.Convert(value:TGSetIn):TGSetOut;
|
|
var
|
|
CurrentEnumIn:TGEnumIn;
|
|
CurrentEnumOut:TGEnumOut;
|
|
begin
|
|
result:=[];
|
|
for CurrentEnumIn in value do
|
|
if TGEnumConverter.convert(CurrentEnumIn,CurrentEnumOut) then
|
|
result:=result+[CurrentEnumOut];
|
|
end;
|
|
|
|
var
|
|
Elems:TElems;
|
|
Elem:TElem;
|
|
begin
|
|
Elems:=TConverter.Convert([my_a,my_c,my_e]);
|
|
for Elem in Elems do
|
|
write(Elem);
|
|
end.
|