AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Generische Bitfield Klasse

Ein Thema von pustekuchen · begonnen am 25. Aug 2023 · letzter Beitrag vom 4. Sep 2023
Antwort Antwort
Benutzerbild von pustekuchen
pustekuchen

Registriert seit: 27. Aug 2010
265 Beiträge
 
Delphi 11 Alexandria
 
#1

Generische Bitfield Klasse

  Alt 25. Aug 2023, 08:31
Delphi-Version: 11 Alexandria
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?
Delphi programming is awesome.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Generische Bitfield Klasse

  Alt 25. Aug 2023, 08:37
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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
679 Beiträge
 
Delphi 12 Athens
 
#3

AW: Generische Bitfield Klasse

  Alt 25. Aug 2023, 09:37
erinnert mich stark an https://docwiki.embarcadero.com/RADS...ading_(Delphi)
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
704 Beiträge
 
Delphi 12 Athens
 
#4

AW: Generische Bitfield Klasse

  Alt 25. Aug 2023, 11:40
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.
Angehängte Dateien
Dateityp: zip HugeSets.zip (9,7 KB, 26x aufgerufen)
Peter Below
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
488 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Generische Bitfield Klasse

  Alt 4. Sep 2023, 20:49
Passend dazu, meine CustomSets-Unit.
Dennis
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:56 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