{$APPTYPE CONSOLE}
{$IFDEF FPC}{$MODE OBJFPC}{$MODESWITCH TYPEHELPERS}{$ENDIF}
uses SysUtils;
type
TWordBitHelper = {$IFDEF FPC}type{$ELSE}record{$ENDIF} helper for Word
strict private
type
TWordBytes = 0..SizeOf(Word) - 1;
TWordOverlay = packed record
case Integer of
1: (AsByte: array[TWordBytes] of Byte);
2: (AsWord: Word);
end;
function GetByte(const AIndex: TWordBytes): Byte;
procedure SetByte(const AIndex: TWordBytes; const NewValue: Byte);
public
property Byte[const AIndex: TWordBytes]: Byte read GetByte write SetByte;
end;
TLongwordBitHelper = {$IFDEF FPC}type{$ELSE}record{$ENDIF} helper for LongWord
strict private
type
TStrictWord = {type }Word;
TLongwordBytes = 0..SizeOf(LongWord) - 1;
TLongwordWords = 0..SizeOf(LongWord) div SizeOf(Word) - 1;
TLongwordOverlay = packed record
case Integer of
1: (AsByte: array[TLongwordBytes] of Byte);
2: (AsWord: array[TLongwordWords] of Word);
3: (AsLongword: LongWord);
end;
function GetByte(const AIndex: TLongwordBytes): Byte;
function GetWord(const AIndex: TLongwordWords): TStrictWord;
procedure SetByte(const AIndex: TLongwordBytes; const NewValue: Byte);
procedure SetWord(const AIndex: TLongwordWords; const NewValue: TStrictWord);
public
property Byte[const AIndex: TLongwordBytes]: Byte read GetByte write SetByte;
property Word[const AIndex: TLongwordWords]: TStrictWord read GetWord write SetWord;
end;
{ TWordBitHelper }
function TWordBitHelper.GetByte(const AIndex: TWordBytes): Byte;
begin
Result := TWordOverlay(Self).AsByte[AIndex];
end;
procedure TWordBitHelper.SetByte(const AIndex: TWordBytes; const NewValue: Byte);
begin
TWordOverlay(Self).AsByte[AIndex] := NewValue;
end;
{ TLongwordBitHelper }
function TLongwordBitHelper.GetByte(const AIndex: TLongwordBytes): Byte;
begin
Result := TLongwordOverlay(Self).AsByte[AIndex];
end;
function TLongwordBitHelper.GetWord(const AIndex: TLongwordWords): TStrictWord;
begin
Result := TLongwordOverlay(Self).AsWord[AIndex]
end;
procedure TLongwordBitHelper.SetByte(const AIndex: TLongwordBytes;
const NewValue: Byte);
begin
TLongwordOverlay(Self).AsByte[AIndex] := NewValue;
end;
procedure TLongwordBitHelper.SetWord(const AIndex: TLongwordWords;
const NewValue: TStrictWord);
begin
TLongwordOverlay(Self).AsWord[AIndex] := NewValue;
end;
var
MyLongword: LongWord = 0;
begin
MyLongword.Word[0] := 250;
Writeln(MyLongword, ', expected 250');
MyLongword.Word[1].Byte[0] := 100;
Writeln(MyLongword, ', expected 100 shl 16 or 250 = 6553850');
MyLongword.Byte[1] := 4;
Writeln(MyLongword, ', expected 250 + 4 shl 8 = 1274');
Readln;
end.