Thema: Delphi The Generics Stack

Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

Re: The Generics Stack

  Alt 1. Nov 2009, 23:53
Der Code wurde noch etwas erweitert ... jetzt kann man auch mal in den Stack/Queue reingucken, ohne das Item erst rausholen zu müssen,
aber zur Sicherheit muß dafür der Stack gesperrt werden.
Ich hoffe mal dieses funktioniert auch so, wie es geplant ist.


Zitat von NamenLozer:
Habe leider kein Delphi 2007, aber interessant finde ich, dass du die Klasse von TCriticalSection abgeleitet hast. Das habe ich so bisher noch nicht gesehen.
Ist auch mein erstes Mal, daß ich überhaupt direkt TCriticalSection verwende.
Hab sonst immer direkt mit der WinAPI gearbeitet.

Im Prinzip hätte ich auch ein Feld in meiner Klasse anlegen können und dann im Konstuktor/Destruktor die TCriticalSektion selber erstellen/freigeben können.
Aber da es eh keinen Vorfahren gibt, konnte ich von der CS ableiten, hab auch gleich ihre Funktionen geerbt und kann nun ihre Funktionen auch direkt verwenden (siehe Enter und Leave).

Ich geb's zu ... ich, bzw. meine Klasse ist stinkend faul,
aber es ist schon praktisch, wenn man sich z.B. so etwas Arbeit und Code spart.
Macht das Ganze gleich viel übersichtlicher.

Als reinen einfachen und dennoch threadsicheren Stack kommt man so mit nur 2 winzigkleinen Funktionen aus ...
den Rest übernimmt Delphi für einen.
Delphi-Quellcode:
Unit GenStack;

Interface
  Uses SyncObjs;

  Type TGenStack<Typ> = Class(TCriticalSection)
    Private
      _List: Array of Typ;
    Public
      Procedure Push (Const X: Typ);
      Function Pop (Var X: Typ): Boolean;
    End;

Implementation
  Procedure TGenStack<Typ>.Push(Const X: Typ);
    Begin
      Enter;
      Try
        SetLength(_List, Length(_List) + 1);
        _List[High(_List)] := X;
      Finally
        Leave;
      End;
    End;

  Function TGenStack<Typ>.Pop(Var X: Typ): Boolean;
    Begin
      Enter;
      Try
        Result := Length(_List) > 0;
        If Result Then Begin
          X := _List[High(_List)];
          SetLength(_List, Length(_List) - 1);
        End;
      Finally
        Leave;
      End;
    End;

End.


Joar, ist schon schade mit dem TD ... dabei sind die Generics 'ne ganz feine Sache

Hier z.B. ein Assiziatives Array, wie man es z.B. aus'm PHP kennt.
http://www.delphipraxis.net/internal...t.php?t=156343
Klar, man könnte es auch über eine Klasse lösen, aber so ist es genauso nutzbar, wie ein stinknormales dynamisches Array und man muß sich nicht um die Speicherverwaltung kümmern (.Create und .Free).
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat