unit trileans;
{$mode objfpc}{$modeswitch advancedrecords}{$H+}
interface
uses SysUtils;
const
no : byte = 0;
yes : byte = 1;
other : byte = 2;
maybe : byte = 2;
unknown : byte = 2;
type
Trilean = record
private
val : byte;
end;
operator := (b:byte) : trilean;
operator := (b:boolean) : trilean;
operator := (t:trilean) : boolean;
operator := (t:trilean) : string;
operator = (t:trilean; b:byte) : boolean;
operator = (t:trilean; b:boolean) : boolean;
operator + (t:trilean; s:string) : string;
operator + (s:string; t:trilean) : string;
operator not (t:trilean) : trilean;
operator and (t1,t2:trilean) : trilean;
operator or (t1,t2:trilean) : trilean;
operator xor (t1,t2:trilean) : trilean;
operator inc (t:trilean) : trilean;
operator dec (t:trilean) : trilean;
function TrilToStr(T:Trilean; UseTrilStrs:Boolean=false):string;
function TrilToStr(T:Trilean; const TrueS,FalseS,OtherS:string):string;
{------------------------------------------------------------------------}
implementation
operator := (b:byte) : trilean;
begin
if (b=YES) or (b=NO) or (b=OTHER) then result.val:=b;
end;
operator := (b:boolean) : trilean;
begin
if b then result.val:=YES else result.val:=NO;
end;
operator := (t:trilean) : boolean;
begin
if t.val=YES then result:=true else result:=false;
end;
operator := (t:trilean) : string;
begin
if t.val=YES then result:='TRUE' else
if t.val=NO then result:='FALSE' else
result:='OTHER';
end;
operator = (t:trilean; b:byte) : boolean;
begin
if t.val=b then result:=true else result:=false;
end;
operator = (t:trilean; b:boolean) : boolean;
begin
if b and (t.val=YES) then result:=true else
if not b and (t.val=NO) then result:=true else
result:=false;
end;
operator + (t:trilean; s:string) : string;
begin
if t.val=YES then result:='TRUE'+s else
if t.val=NO then result:='FALSE'+s else
result:='OTHER'+s;
end;
operator + (s:string; t:trilean) : string;
begin
if t.val=YES then result:=s+'TRUE' else
if t.val=NO then result:=s+'FALSE' else
result:=s+'OTHER';
end;
operator not (t:trilean) : trilean;
begin
if T.val=YES then result.val:=NO else
if T.val=NO then result.val:=YES else
result.val:=OTHER;
end;
operator and (t1,t2:trilean) : trilean;
begin
if (t1.val=NO) or (t2.val=NO) then result.val:=NO else
if (t1.val=YES) and (t2.val=YES) then result.val:=YES else
result.val:=OTHER;
end;
operator or (t1,t2:trilean) : trilean;
begin
if (t1.val=YES) or (t2.val=YES) then result.val:=YES else
if (t1.val=NO) and (t2.val=NO) then result.val:=NO else
result.val:=OTHER;
end;
operator xor (t1,t2:trilean) : trilean;
begin
if (t1.val=YES) and (t2.val=NO) then result.val:=YES else
if (t1.val=NO) and (t2.val=YES) then result.val:=YES else
if (t1.val=YES) and (t2.val=YES) then result.val:=NO else
if (t1.val=NO) and (t2.val=NO) then result.val:=NO else
result.val:=OTHER;
end;
operator inc (t:trilean) : trilean;
begin
if t.val=NO then result.val:=OTHER else
if t.val=OTHER then result.val:=YES else
result.val:=t.val;
end;
operator dec (t:trilean) : trilean;
begin
if t.val=YES then result.val:=OTHER else
if t.val=OTHER then result.val:=NO else
result.val:=t.val;
end;
function TrilToStr(T:Trilean; UseTrilStrs:Boolean=false):string;
begin
if UseTrilStrs then begin
if T.val=YES then result:='True' else
if T.val=NO then result:='False' else
result:='Other';
end else begin
result:=inttostr(T.val);
end;
end;
function TrilToStr(T:Trilean; const TrueS,FalseS,OtherS:string):string;
begin
if T.val=YES then result:=TrueS else
if T.val=NO then result:=FalseS else
result:=OtherS;
end;
end.