AGB  ·  Datenschutz  ·  Impressum  







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

Generic Graph class

Ein Thema von bernhard_LA · begonnen am 30. Jan 2015 · letzter Beitrag vom 8. Feb 2015
Antwort Antwort
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#1

Generic Graph class

  Alt 30. Jan 2015, 21:55
die aktuelle Verion meiner Graphen Klasse incl. Generic#s sieht wie folgt aus

Delphi-Quellcode:
  TNetGraph<T> = Class

  public

    fList : TNetList;
    G: TGraph<T>;

    constructor create(g_type: TGraphEdgeMode = normal_directed);
    destructor destroy; override;

    function GetNetitem(aData: T): TNetItem;


function TNetGraph<T>.GetNetitem(aData: T): TNetElement;
begin

  if (T(adata) is integer) then
       result := fList.Items[integer(T(aData))] /// geht so nicht :-(
  end;
 
end;
...
 End;

ich scheitere an einer Abfrage um welchen Datentypen es sich bei aData handelt und dem entsprechende auf den ZUgriff in meine Liste fList zu reagieren.
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.538 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Generic Graph class

  Alt 31. Jan 2015, 00:28
Erst mal fällt mir auf, dass in Deiner Klassendefinition die Fuktion "GetNetItem" als Result "TNetItem" hat, in der Implementation aber "TNetElement".

Den Typ für aData, bzw. "T" kannst Du so abfragen:

Delphi-Quellcode:
if (GetTypeName (Typeinfo (T)) = 'Integer') then begin
  ...
end;
Den Integerwert selbst kannst Du so ermitteln:

  result := fList[PInteger (@adata)^];
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Generic Graph class

  Alt 31. Jan 2015, 10:55
T kann als Datentyp alles mögliche sein , wenn ich als "integer type" definiere kann ich mit


flist.Items[data] direkt zugreifen.


Mir wäre ein Vergleich auf den Datentyp selbst am liebsten . Udn nochbesser ein case Statement in diesem Form



Delphi-Quellcode:
    case data as Datatype of
    integer:
    TMyCustomDataType_1 :
        begin
        ...
        end;
     TMyCustomDataType_2 :
     TMyCustomDataType_3 :
    else
     end;

geht soetwas mit Delphi ?



Alternative Ziel Option mit if Statement


Delphi-Quellcode:
  if data is integer then
      begin

      end;
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#4

AW: Generic Graph class

  Alt 31. Jan 2015, 11:17
Da ein case-Statement eigentlich immer ein Zeichen für suboptimales Klassendesign ist...erkläre doch mal, was in den anderen Fällen erfolgen soll, wenn also T kein Integer ist.

Bei einem TNetGraph<Integer> soll GetItems(3) also das 3. Element der Liste liefern.
Was soll bei einem TNetGraph<String> denn ein Aufruf von GetItems('Foo') liefern?
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.538 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Generic Graph class

  Alt 31. Jan 2015, 17:27
Wenn es denn sein muss, geht es auch mit case:

Delphi-Quellcode:
  case PTypeInfo(TypeInfo (T)).kind of
    tkInteger: ShowMessage ('Integer hier');
    tkFloat: ShowMessage ('Float hier');
    tkWString: ShowMessage ('String hier');
  end;
Wenn Du auf eingene Klassen oder Interfaces prüfen willst, musst Du eben auf tkClass oder tkInterface prüfen und dann noch mal näher unterscheiden, worum es sich genau handelt.

Die Info, was unter "kind" alles fällt, ist im TTypeKind in der Unit "System.TypInfo" beschrieben.

Geändert von Harry Stahl (31. Jan 2015 um 18:14 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

AW: Generic Graph class

  Alt 1. Feb 2015, 18:36
Ab XE7 empfehle ich, GetTypeKind(T) zu nutzen. Das evaluiert der Compiler direkt und entfernt somit nicht ausgeführte Codepfade.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.538 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Generic Graph class

  Alt 2. Feb 2015, 21:53
Ab XE7 empfehle ich, GetTypeKind(T) zu nutzen. Das evaluiert der Compiler direkt und entfernt somit nicht ausgeführte Codepfade.
In der Tat. Ich habe mir das mal im CPU-Fenster angesehen: Je nachdem, mit welchem Datentyp die Klasse TNetGraph instantiiert wird, hat der Compiler im Aufruf von "GetNetitem" bei GetTypeKind nur noch das Benötigte belassen und alles Überflüssige raus gemschmissen.

Anlage 1 zeigt den Source-Code und Anlage 2 die CPU zur Laufzeit bei Instantiierung der Klasse per "Integer". Der direkte Vergleich der 2 Abfragevarianten (Grün=GetTypeKind / Gelb=PTypeInfo) zeigt, dass man mit GetTypeKind erheblich Speicher einsparen kann.

Immerhin ein kleiner Trost für die Tatsache, dass die Verwendung von Generics im Allgemeinen zu Dopplungen des Speicherbedarfes führt (bei Instantiierung der Klasse mit unterschiedlichen Datentypen). Wobei natürlich auch weitere Vorteile von Generics "trösten", z.B. Fehler schon bei der Entwicklung auszumerzen und in gewissem Umfang auch Geschwindigkeitsoptimierungen erzielen zu können.

Guter Tipp!
Miniaturansicht angehängter Grafiken
source_view.jpg   cpu_view.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

AW: Generic Graph class

  Alt 8. Feb 2015, 04:11
Ab XE7 empfehle ich, GetTypeKind(T) zu nutzen. Das evaluiert der Compiler direkt und entfernt somit nicht ausgeführte Codepfade.
Genial, aber warum wissen weger OH noch DokWiki etwas davon?
Dort gibt es noch nichtmal die obligatorischen "Das ist Funktion Xyz in Unit Abc. Emba verfügt über keine Infos."-Einträge.

[add]
Noch genialer ist aber, was ich bisher aber noch nirgendwo in Google finden konnte, daß man Dieses sogar in den Conditional Expressions verwenden kann.
Delphi-Quellcode:
{$IF GetTypeKind(TForm) in [tkClass, tkInterface]}
  ShowMessage('TForm ist eine Klasse/Interface');
{$ELSE}
  ShowMessage('TForm ist KEINE Klasse/Interface');
{$ENDIF}

{$IF GetTypeKind(Integer) in [tkClass, tkInterface]}
  ShowMessage('Integer ist eine Klasse/Interface');
{$ELSE}
  ShowMessage('Integer ist KEINE Klasse/Interface');
{$ENDIF}
Jetzt nur noch schauen, ob man das auch innerhalb der Generics nutzen kann, aber ich glaub nicht.
$2B or not $2B

Geändert von himitsu ( 8. Feb 2015 um 04:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

AW: Generic Graph class

  Alt 8. Feb 2015, 12:30
Jetzt nur noch schauen, ob man das auch innerhalb der Generics nutzen kann, aber ich glaub nicht.
Nö, kannste nicht, weil der Code innerhalb des Generics ist und dort T nicht bekannt ist. Und die Condition wird nicht jedesmal ausgewertet, also ist das leider wertlos.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

AW: Generic Graph class

  Alt 8. Feb 2015, 14:10
War schon fast klar, aber vielleich hätte man dort ja auch heimlich was verbessert haben können. (die Hoffnung stirbt zuletzt, aber sie stirbt ... oder wie man das immer so schön sagt)

Der Witz ist auch, daß im Interface das problemlos kompiliert und nicht gemeckert wird, daß man T noch nicht kennen würde, wobei das Ergebnis einfach nur False ist,
aber in der Implementation knallt die selbe Condition dann, von wegen "Konstante erwartet".
$2B or not $2B
  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 06:23 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