1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
| unit TCharSet;
interface
uses
SysUtils, Classes;
type
{
Operator Operation Operand Types Result Type Example
-------- --------- ------------- ----------- -------
+ union set set Set1 + Set2
- difference set set S - T
* intersection set set S * T
<= subset set Boolean Q <= MySet
>= superset set Boolean S1 >= S2
= equality set Boolean S2 = MySet
<> inequality set Boolean MySet <> S1
in membership ordinal, set Boolean A in Set1
}
TSetOfChar = class(TComponent)
private
fSet: set of char;
public
constructor CreateNew(AOwner: TComponent); //override;
destructor Destroy; override;
published
procedure Clear(); // empty the set
procedure AppendAllCharacters(aString: string); // append each character of a string as new element
procedure DoUnion(aSet: TSetOfChar); // current set := current set + aSet
procedure DoDifference(aSet: TSetOfChar); // current set := current set - aSet
procedure DoIntersection(aSet: TSetOfChar); // current set := current set * aSet
function IsSubset(aSet: TSetOfChar): boolean; // checks if aSet is subset of current set
function IsSuperset(aSet: TSetOfChar): boolean; // checks if aSet is superset of current set
function IsEqual(aSet: TSetOfChar): boolean; // checks if aSet is equal tp current set
function IsInequal(aSet: TSetOfChar): boolean; // checks if aSet is different from current set
function IsMember(aChar: Char): boolean; // checks if aSet is element is in current set
function Count(): integer; // get element count
function GetIndexOfChar(aChar: Char): integer; // get index of a specific element
function GetElementOfIndex(aIndex: integer): Char; // get an element by its index
end;
implementation
{ ************* methods and properties fot TSetOfChar }
constructor TSetOfChar.CreateNew(AOwner: TComponent);
begin
fSet := [];
end;
destructor TSetOfChar.Destroy();
begin
fSet := [];
end;
procedure TSetOfChar.Clear();
begin
fSet := [];
end;
procedure TSetOfChar.AppendAllCharacters(aString: string);
var
i: integer;
begin
for i:=1 to length(aString) do include(fSet,aString[i]);
end;
procedure TSetOfChar.DoUnion(aSet: TSetOfChar);
begin
fSet := fSet + aSet.fSet;
end;
procedure TSetOfChar.DoDifference(aSet: TSetOfChar);
begin
fSet := fSet - aSet.fSet;
end;
procedure TSetOfChar.DoIntersection(aSet: TSetOfChar);
begin
fSet := fSet * aSet.fSet;
end;
function TSetOfChar.IsSubset(aSet: TSetOfChar): boolean;
begin
result := fSet <= aSet.fSet;
end;
function TSetOfChar.IsSuperset(aSet: TSetOfChar): boolean;
begin
result := fSet >= aSet.fSet;
end;
function TSetOfChar.IsEqual(aSet: TSetOfChar): boolean;
begin
result := fSet = aSet.fSet;
end;
function TSetOfChar.IsInequal(aSet: TSetOfChar): boolean;
begin
result := fSet <> aSet.fSet;
end;
function TSetOfChar.IsMember(aChar: Char): boolean;
begin
result := aChar in fSet;
end;
function TSetOfChar.Count(): integer;
function Cardinality(const PSet: PByteArray; const SizeOfSet(*in bytes*): Integer): Integer;
const
Masks: array[0..7] of Byte = (1, 2, 4, 8, 16, 32, 64, 128);
var
I, J: Integer;
begin
Result := 0;
for I := 0 to SizeOfSet - 1 do
for J := 0 to 7 do
if (PSet^[I] and Masks[J]) > 0 then
Inc(Result);
end;
begin
result := Cardinality(@fSet,SizeOf(fSet));
end;
function TSetOfChar.GetIndexOfChar(aChar: Char):integer;
function IndexOf(const PSet: PByteArray; const SizeOfSet(*in bytes*): integer; const aValue: Byte): Integer;
const
Masks: array[0..7] of Byte = (1, 2, 4, 8, 16, 32, 64, 128);
var
I, J, I1, J1, ind: Integer;
begin
Result := -1;
ind := 0;
I1 := (aValue shr 3);
J1 := (aValue and 7);
for I := 0 to SizeOfSet - 1 do begin
for J := 0 to 7 do begin
if (PSet^[I] and Masks[J]) > 0 then begin
Inc(ind);
if (I=I1) and (J=J1) then begin
result := ind;
exit;
end;
end;
end;
end;
end;
begin
result := IndexOf(@fSet,SizeOf(fSet),byte(aChar));
end;
function TSetOfChar.GetElementOfIndex(aIndex: integer): Char;
function ElementOf(const PSet: PByteArray; const SizeOfSet(*in bytes*): integer; const aIndex: integer): byte;
const
Masks: array[0..7] of Byte = (1, 2, 4, 8, 16, 32, 64, 128);
var
I, J, ind: Integer;
begin
Result := 0;
ind := 0;
for I := 0 to SizeOfSet - 1 do begin
for J := 0 to 7 do begin
if (PSet^[I] and Masks[J]) > 0 then begin
Inc(ind);
if ind=aIndex then begin
result := I*8+J;
exit;
end;
end;
end;
end;
end;
begin
result := chr(ElementOf(@fSet,SizeOf(fSet),aIndex))
end;
end. |
Partager