Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Generische Bitfield Klasse (https://www.delphipraxis.net/213605-generische-bitfield-klasse.html)

pustekuchen 25. Aug 2023 07:31

Delphi-Version: 11 Alexandria

Generische Bitfield Klasse
 
Hallo zusammen,

ich habe vor eine generische Bitfield Klasse zu schreiben, um die Standardfunktionen GetBits und SetBits nicht mit jedem Bitfeld neu implementieren zu müssen und unterschiedliche Integrale Datentypen zu verwenden (bzw. die Bitfield Größe anhand des Generischen Typs zu bestimmen).

Meine Idee war wie folgt:
Delphi-Quellcode:
  IBitwiseOperations = interface
    ['{820D0E60-9815-4D14-8282-99ACCC5D80E2}']
    function Shr(const Amount: Integer): IBitwiseOperations;
    function And(const Other: IBitwiseOperations): IBitwiseOperations;
  end;

  TBitfield<TFieldType : IBitwiseOperations> = class
    private
      function GetBits(const aIndex: Integer): TFieldType;
      procedure SetBits(const aIndex: Integer; const aValue: TFieldType);
    public
      Flags: TFieldType;
  end;

TMyBitfield = class (TBitfield<Word>)
public
    property BitfieldA: Word index $0002 read GetBits write SetBits;
    property BitfieldB: Word index $0202 read GetBits write SetBits;
end;

implementation
{ TBitfield<TFieldType> }

function TBitfield<TFieldType>.GetBits(const aIndex: Integer): TFieldType;
var
  Offset: Integer;
  NrBits: Integer;
  Mask: Integer;
begin
  NrBits := aIndex and $FF;
  Offset := aIndex shr 8;

  Mask := ((1 shl NrBits) - 1);

  Result := (Flags shr Offset) and Mask;
end;

procedure TBitfield<TFieldType>.SetBits(const aIndex: Integer; const aValue: TFieldType);
var
  Offset: Integer;
  NrBits: Integer;
  Mask: Integer;
begin
  NrBits := aIndex and $FF;
  Offset := aIndex shr 8;

  Mask := ((1 shl NrBits) - 1);
  Assert(aValue <= Mask);

  Flags := (Flags and (not(Mask shl Offset))) or (aValue shl Offset);
end.
Jedoch erhalte ich die Meldung E2029, Bezeichner erwartet aber Shr gefunden und
F2084 Interner Fehler: AV662429BF(661D0000)-R00000000-0

Das IBitwiseOperations wollte ich verwenden, um dem generischen Datentypen ein Constraint hinzuzufügen, damit der Compiler weiß, dass dieser Typ die Bitoperationen implementiert haben muss.

Mask sollte wohl dann auch besser TFieldType sein.


Hättet ihr Ideen, wie man das lösen könnte?

jaenicke 25. Aug 2023 07:37

AW: Generische Bitfield Klasse
 
Nenne deine Funktionen im Interface nicht wie reservierte Bezeichner (shl, shr). Ich vermute, dass der Fehler schon dort kommt. Außerdem musst du diese Funktionen dann auch nutzen.

joachimd 25. Aug 2023 08:37

AW: Generische Bitfield Klasse
 
erinnert mich stark an https://docwiki.embarcadero.com/RADS...ading_(Delphi)

peterbelow 25. Aug 2023 10:40

AW: Generische Bitfield Klasse
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von pustekuchen (Beitrag 1526091)
Hallo zusammen,

ich habe vor eine generische Bitfield Klasse zu schreiben, um die Standardfunktionen GetBits und SetBits nicht mit jedem Bitfeld neu implementieren zu müssen und unterschiedliche Integrale Datentypen zu verwenden (bzw. die Bitfield Größe anhand des Generischen Typs zu bestimmen).

Vielleicht nützt Dir die Unit im angehängten Zip-File bei diesem Projekt.

Dennis07 4. Sep 2023 19:49

AW: Generische Bitfield Klasse
 
Passend dazu, meine CustomSets-Unit.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz