* TBits.ORBits and TBits.XORBits: properly handle case when other TBits object has smaller Size. Mantis #25289.

git-svn-id: trunk@26121 -
This commit is contained in:
sergei 2013-11-23 19:12:57 +00:00
parent 494d79bd7e
commit 43c96cd898
3 changed files with 115 additions and 6 deletions

1
.gitattributes vendored
View File

@ -13712,6 +13712,7 @@ tests/webtbs/tw25198.pp svneol=native#text/plain
tests/webtbs/tw25210.pp svneol=native#text/pascal
tests/webtbs/tw2525.pp svneol=native#text/plain
tests/webtbs/tw25269.pp svneol=native#text/pascal
tests/webtbs/tw25289.pp svneol=native#text/plain
tests/webtbs/tw25318.pp svneol=native#text/pascal
tests/webtbs/tw25349.pp svneol=native#text/plain
tests/webtbs/tw2536.pp svneol=native#text/plain

View File

@ -212,10 +212,9 @@ procedure TBits.orbits(bitset : TBits);
var
loop : longint;
begin
if FBSize < bitset.Size then
grow(bitset.Size);
grow(bitset.Size);
for loop := 0 to FSize-1 do
for loop := 0 to bitset.getFSize-1 do
FBits^[loop] := FBits^[loop] or bitset.FBits^[loop];
end;
@ -223,10 +222,9 @@ procedure TBits.xorbits(bitset : TBits);
var
loop : longint;
begin
if FBSize < bitset.Size then
grow(bitset.Size);
grow(bitset.Size);
for loop := 0 to FSize-1 do
for loop := 0 to bitset.getFSize-1 do
FBits^[loop] := FBits^[loop] xor bitset.FBits^[loop];
end;

110
tests/webtbs/tw25289.pp Normal file
View File

@ -0,0 +1,110 @@
{$mode objfpc}{$H+}
uses
Classes, SysUtils;
var
code: integer;
function bitstostring(b: TBits): string;
var
i: integer;
bs: string;
begin
bs:= '';
for i:= 0 to b.Size - 1 do
if b[i] then
bs:= bs + '1'
else
bs:= bs + '0';
Result:= bs;
end;
procedure Test;
var
i, bsize1, bsize2: integer;
b1, b2, b3: TBits;
begin
code := 0;
// OR
bsize1:= 16;
bsize2:= 164;
b1:= TBits.Create;
b2:= TBits.Create(bsize2);
b3:= TBits.Create(bsize2);
for i:= 0 to bsize1 - 1 do
b1[i]:= True;
b2.OrBits(b1);
b3.OrBits(b1);
for i:= b1.Size to bsize2 - 1 do
b3[i]:= False;
if not b2.Equals(b3) then
begin
WriteLn('OR');
writeln(bitstostring(b1));
writeln(bitstostring(b2));
writeln(bitstostring(b3));
code := code or 1;
end;
b1.Free;
b2.Free;
b3.Free;
// XOR
bsize1:= 16;
bsize2:= 164;
b1:= TBits.Create;
b2:= TBits.Create(bsize2);
b3:= TBits.Create(bsize2);
for i:= 0 to bsize1 - 1 do
b1[i]:= True;
b2.XOrBits(b1);
b3.XOrBits(b1);
for i:= b1.Size to bsize2 - 1 do
b3[i]:= False;
if not b2.Equals(b3) then
begin
WriteLn('XOR');
writeln(bitstostring(b1));
writeln(bitstostring(b2));
writeln(bitstostring(b3));
code := code or 2;
end;
b1.Free;
b2.Free;
b3.Free;
// AND
bsize1:= 16;
bsize2:= 164;
b1:= TBits.Create;
b2:= TBits.Create(bsize2);
b3:= TBits.Create(bsize2);
for i:= 0 to bsize1 - 1 do
b1[i]:= True;
b2.AndBits(b1);
b3.AndBits(b1);
for i:= b1.Size to bsize2 - 1 do
b3[i]:= False;
if not b2.Equals(b3) then
begin
WriteLn('AND');
writeln(bitstostring(b1));
writeln(bitstostring(b2));
writeln(bitstostring(b3));
code := code or 4;
end;
b1.Free;
b2.Free;
b3.Free;
end;
begin
test;
halt(code);
end.