{$APPTYPE CONSOLE}
{$TYPEDADDRESS ON}
{$LONGSTRINGS OFF}
{ --------------------------------------------------------------------------- }
{$DEFINE ENABLE_BIT_FIELDS}
{$DEFINE PROBLEMATIC_DEFINITION}
program _TRTL_BALANCED_NODE;
{ program to verify the size of the TRTL_BALANCED_NODE structure }
type
{ bit types for bitfields }
_1bit = 0 .. $1;
_2bits = 0 .. $3;
_3bits = 0 .. $7;
_4bits = 0 .. $F;
_5bits = 0 .. $1F;
_6bits = 0 .. $3F;
_7bits = 0 .. $7F;
_8bits = 0 .. $FF; { byte }
_9bits = 0 .. $1FF;
_10bits = 0 .. $3FF;
_11bits = 0 .. $7FF;
_12bits = 0 .. $FFF;
_13bits = 0 .. $1FFF;
_14bits = 0 .. $3FFF;
_15bits = 0 .. $7FFF;
_16bits = 0 .. $FFFF; { word }
_17bits = 0 .. $1FFFF;
_18bits = 0 .. $3FFFF;
_19bits = 0 .. $7FFFF;
_20bits = 0 .. $FFFFF;
_21bits = 0 .. $1FFFFF;
_22bits = 0 .. $3FFFFF;
_23bits = 0 .. $7FFFFF;
_24bits = 0 .. $FFFFFF;
_25bits = 0 .. $1FFFFFF;
_26bits = 0 .. $3FFFFFF;
_27bits = 0 .. $7FFFFFF;
_28bits = 0 .. $FFFFFFF;
_29bits = 0 .. $1FFFFFFF;
_30bits = 0 .. $3FFFFFFF;
_31bits = 0 .. $7FFFFFFF;
_32bits = 0 .. $FFFFFFFF; { DWORD }
_33bits = 0 .. $1FFFFFFFF;
_34bits = 0 .. $3FFFFFFFF;
_35bits = 0 .. $7FFFFFFFF;
_36bits = 0 .. $FFFFFFFFF;
_37bits = 0 .. $1FFFFFFFFF;
_38bits = 0 .. $3FFFFFFFFF;
_39bits = 0 .. $7FFFFFFFFF;
_40bits = 0 .. $FFFFFFFFFF;
_41bits = 0 .. $1FFFFFFFFFF;
_42bits = 0 .. $3FFFFFFFFFF;
_43bits = 0 .. $7FFFFFFFFFF;
_44bits = 0 .. $FFFFFFFFFFF;
_45bits = 0 .. $1FFFFFFFFFFF;
_46bits = 0 .. $3FFFFFFFFFFF;
_47bits = 0 .. $7FFFFFFFFFFF;
_48bits = 0 .. $FFFFFFFFFFFF;
_49bits = 0 .. $1FFFFFFFFFFFF;
_50bits = 0 .. $3FFFFFFFFFFFF;
_51bits = 0 .. $7FFFFFFFFFFFF;
_52bits = 0 .. $FFFFFFFFFFFFF;
_53bits = 0 .. $1FFFFFFFFFFFFF;
_54bits = 0 .. $3FFFFFFFFFFFFF;
_55bits = 0 .. $7FFFFFFFFFFFFF;
_56bits = 0 .. $FFFFFFFFFFFFFF;
_57bits = 0 .. $1FFFFFFFFFFFFFF;
_58bits = 0 .. $3FFFFFFFFFFFFFF;
_59bits = 0 .. $7FFFFFFFFFFFFFF;
_60bits = 0 .. $FFFFFFFFFFFFFFF;
_61bits = 0 .. $1FFFFFFFFFFFFFFF;
_62bits = 0 .. $3FFFFFFFFFFFFFFF;
_63bits = 0 .. $7FFFFFFFFFFFFFFF;
type
PRTL_BALANCED_NODE = ^TRTL_BALANCED_NODE;
TRTL_BALANCED_NODE = packed record
Node : record
case integer of
1 : (
Children : array[0..1] of PRTL_BALANCED_NODE;
);
2 : (
Left : PRTL_BALANCED_NODE;
Right : PRTL_BALANCED_NODE;
);
end;
Value : {$ifdef FPC} bitpacked {$endif} record
case integer of
1 : (
ParentValue : ptruint;
);
{ ------------------------------------------------------------------- }
{ something in these bit fields is not right }
{$ifdef ENABLE_BIT_FIELDS}
{$ifdef PROBLEMATIC_DEFINITION}
{$ifdef FPC}
2 : (
Red : _1bit;
{$ifdef WIN32} { no problem in 32bits }
FillerRed : _31bits;
{$endif}
{$ifdef WIN64} { PROBLEM: causes one extra byte }
FillerRed : _63bits;
{$endif}
);
{$endif}
{$endif}
{$ifdef FPC}
3 : (
Balance : _2bits;
{$ifdef WIN32} { no problem here }
FillerBalance : _30bits;
{$endif}
{$ifdef WIN64} { no problem here either }
FillerBalance : _62bits;
{$endif}
);
{$endif}
{$endif}
end;
end;
var
V1 : record
F1 : TRTL_BALANCED_NODE;
F2 : TRTL_BALANCED_NODE;
end;
begin
writeln;
writeln;
writeln(' sizeof(TRTL_BALANCED_NODE) : ', sizeof(TRTL_BALANCED_NODE));
writeln(' sizeof(V1) : ', sizeof(V1));
writeln;
writeln;
writeln('press ENTER/RETURN to end this program');
readln;
end.