|
Registriert seit: 11. Okt 2003 Ort: Elbflorenz 44.326 Beiträge Delphi 12 Athens |
#1
So, ich hab mir heute mal ein WideChar-Set zusammengebastelt,
da ja die normalen Sets nicht mit Unicode arbeiten. Ja, ich kenn IWidecharSet von Peter Below ( ![]() allerdings hab ich damit ein kleines Problem. Hauptsächlich, daß dieses immer mehr als 8 KB pro Set belegt und ich für ein Projekt mehrere/viele Sets benötige. Also ist ein "Set" mit dynamischer Speicherverwaltung entstanden. Dieses belegt pro "Set" jeweils etwa 8 Byte bis 8,02 KB, zuzüglich einem Standardencoding für's Ansi, wenn man eines angibt und dank der Referenzzählung bei dynamischen Arrays und Interfaces wird beim Kopieren sowieso nochmal Speicher eingespart. Zusätzlich wurde es als Operator-Record ausgelegt, anstatt als Objekt/Interface: Welche den Vorteil hat, daß es grundsätzlich fast wie ein "normales" (Ansi)CharSet verwendbar ist. > Leider stellen die Operatoren keinen IN-Operator zur Verfügung. ![]() Aber abgesehn von IN und den Functionen Include und Exclude (welche sich aber leicht zusammenstellen lassen) wird alles Mögliche unterstützt. Die Operatoren + - und *, sowie die Vergleichsoperatoren < <= = >= > <> und zusätzlich noch OR, AND, XOR und NOT. Nja, und dann gibt es noch einige weitere Befehle und Typumwandlungen... Inzwischen wurde auch ein Enumerator verbaut, so daß For-In-Schleifen genutzt werden können.
Delphi-Quellcode:
Var C: Char;
For C in HexNumerals do S := S + C; // S = '0123456789ABCDEFabcdef' // da HexNumerals = ['0'..'9', 'A'..'F', 'a'..'f']
Delphi-Quellcode:
Das Ganze setzt natürlich mindenstens Delphi 2009 voraus,
// Achtung: dieser Code wurde einen wesentlichen/wichtigen Anteil reduziert
TSetRelation = (srEqual, srIsSubset, srIsSuperset, srOverlap, srDisjunct); TDynamicCharSet = Record Private _Map: TDCSDynMap; _Encoding: TEncoding; Public Property DefaultEncoding: TEncoding; Procedure Fill(CharSet: TSysCharSet; Encoding: TEncoding); Procedure Fill(CharSet: TDynamicCharSet); Procedure Fill(CharSet: TDCSMap); Procedure Fill(Char: AnsiChar; Encoding: TEncoding); Procedure Fill(Char: WideChar); Procedure Fill(First, Last: AnsiChar; Encoding: TEncoding); Procedure Fill(First, Last: WideChar); Procedure Fill(S: RawByteString; Encoding: TEncoding; AllowCharGroups: Boolean); Procedure Fill(S: UTF8String; AllowCharGroups: Boolean); Procedure Fill(S: UnicodeString; AllowCharGroups: Boolean); Procedure FillAll; Procedure Invert; Procedure Clear; Function IsEmpty: Boolean; Function IsFull: Boolean; Function LowChar: WideChar; Function HighChar: WideChar; Function CountChars: Integer; Function GetAsSysCharSet(Encoding: TEncoding): TSysCharSet; Function GetAsMap: TDCSMap; Function GetAsAnsiString(Encoding: TEncoding): RawByteString; Function GetAsUTF8String: UTF8String; Function GetAsString: UnicodeString; Function GetAllChars: UnicodeString; Function ContainsAnyChar (S: RawByteString; Encoding: TEncoding): Boolean; Function ContainsAnyChar (S: UTF8String): Boolean; Function ContainsAnyChar (S: UnicodeString): Boolean; Function ContainsAllChars (S: RawByteString; Encoding: TEncoding): Boolean; Function ContainsAllChars (S: UTF8String): Boolean; Function ContainsAllChars (S: UnicodeString): Boolean; Function ContainsOnlyThisChars(S: RawByteString; Encoding: TEncoding): Boolean; Function ContainsOnlyThisChars(S: UTF8String): Boolean; Function ContainsOnlyThisChars(S: UnicodeString): Boolean; Function Compare (CharSet: TSysCharSet; Encoding: TEncoding): TSetRelation; Function Compare (CharSet: TDynamicCharSet): TSetRelation; Function Contains(Char: AnsiChar; Encoding: TEncoding): Boolean; Function Contains(Char: WideChar): Boolean; Function Compare (First, Last: AnsiChar; Encoding: TEncoding): TSetRelation; Function Compare (First, Last: WideChar): TSetRelation; Function Compare (S: RawByteString; Encoding: TEncoding): TSetRelation; Function Compare (S: UTF8String): TSetRelation; Function Compare (S: UnicodeString): TSetRelation; Procedure Include (CharSet: TSysCharSet; Encoding: TEncoding); Procedure Include (CharSet: TDynamicCharSet); Procedure Include (Char: AnsiChar; Encoding: TEncoding); Procedure Include (Char: WideChar); Procedure Include (First, Last: AnsiChar; Encoding: TEncoding); Procedure Include (First, Last: WideChar); Procedure Include (S: RawByteString; Encoding: TEncoding); Procedure Include (S: UTF8String); Procedure Include (S: UnicodeString); Procedure Exclude (CharSet: TSysCharSet; Encoding: TEncoding); ... Procedure Exclude (S: UnicodeString); Procedure Intersect (CharSet: TSysCharSet; Encoding: TEncoding); ... Procedure Intersect (S: UnicodeString); Procedure ExclusiveOr(CharSet: TSysCharSet; Encoding: TEncoding); ... Procedure ExclusiveOr(S: UnicodeString); Function GetEnumerator: TDCSEnumerator; Public Class Operator Implicit(CharSet: TSysCharSet): TDynamicCharSet; Class Operator Implicit(CharSet: TDCSMap): TDynamicCharSet; Class Operator Implicit(S: RawByteString): TDynamicCharSet; Class Operator Implicit(S: UTF8String): TDynamicCharSet; Class Operator Implicit(S: UnicodeString): TDynamicCharSet; Class Operator Explicit(CharSet: TSysCharSet): TDynamicCharSet; Class Operator Explicit(CharSet: TDCSMap): TDynamicCharSet; Class Operator Explicit(S: RawByteString): TDynamicCharSet; Class Operator Explicit(S: UTF8String): TDynamicCharSet; Class Operator Explicit(S: WideString): TDynamicCharSet; Class Operator Explicit(S: UnicodeString): TDynamicCharSet; Class Operator Explicit(CharSet: TDynamicCharSet): TSysCharSet; Class Operator Explicit(CharSet: TDynamicCharSet): TDCSMap; Class Operator Explicit(CharSet: TDynamicCharSet): RawByteString; Class Operator Explicit(CharSet: TDynamicCharSet): UTF8String; Class Operator Explicit(CharSet: TDynamicCharSet): WideString; Class Operator Explicit(CharSet: TDynamicCharSet): UnicodeString; Class Operator Equal (Oper1, Oper2: TDynamicCharSet): Boolean; Class Operator NotEqual (Oper1, Oper2: TDynamicCharSet): Boolean; Class Operator LessThan (Oper1, Oper2: TDynamicCharSet): Boolean; Class Operator LessThanOrEqual (Oper1, Oper2: TDynamicCharSet): Boolean; Class Operator GreaterThan (Oper1, Oper2: TDynamicCharSet): Boolean; Class Operator GreaterThanOrEqual(Oper1, Oper2: TDynamicCharSet): Boolean; Class Operator Add (Oper1, Oper2: TDynamicCharSet): TDynamicCharSet; Class Operator Subtract (Oper1, Oper2: TDynamicCharSet): TDynamicCharSet; Class Operator Multiply (Oper1, Oper2: TDynamicCharSet): TDynamicCharSet; Class Operator BitwiseAnd(Oper1, Oper2: TDynamicCharSet): TDynamicCharSet; Class Operator BitwiseOr (Oper1, Oper2: TDynamicCharSet): TDynamicCharSet; Class Operator BitwiseXor(Oper1, Oper2: TDynamicCharSet): TDynamicCharSet; Class Operator LogicalNot(CharSet: TDynamicCharSet): TDynamicCharSet; End; Const Signs: TDynamicCharSet = (); // ['-', '+'] DecimalDigits: TDynamicCharSet = (); // ['0'..'9'] Numbers: TDynamicCharSet = (); // Signs + DecimalDigits FloatChars: TDynamicCharSet = (); // Numbers + [DecimalSeparator] SciFloatChars: TDynamicCharSet = (); // FloatChars + ['e', 'E'] OctalNumerals: TDynamicCharSet = (); // ['0'..'7'] HexNumerals: TDynamicCharSet = (); // ['0'..'9', 'A'..'F', 'a'..'f'] FirstIdentifierChars: TDynamicCharSet = (); // ['A'..'Z', 'a'..'z', '_'] IdentifierChars: TDynamicCharSet = (); // ['A'..'Z', 'a'..'z', '0'..'9', '_'] EditOperations: TDynamicCharSet = (); // [^C, ^V, ^X, Backspace] AsciiControlChars: TDynamicCharSet = (); // [#0..#31, #127] AsciiChars: TDynamicCharSet = (); // [#0..#127] AsciiTextChars: TDynamicCharSet = (); // [Tab, LF, CR, Space..#127] // The following constants are dependent on the existing unicode system of the OS. ControlChars: TDynamicCharSet = (); // [#1..#$1F, #$7F..#$9F, #$70F and other] BlankChars: TDynamicCharSet = (); // [#9, ' ', #160, #$3000, #$FEFF] SpaceChars: TDynamicCharSet = (); // [#9..#$D, ' ', #$85 and other] Digits: TDynamicCharSet = (); // '0123456789¹²³' and other digit chars HexDigits: TDynamicCharSet = (); // HexNumerals + Bold:HexNumerals Numeric: TDynamicCharSet = (); // copy of "Digits" Letters: TDynamicCharSet = (); // LowerCaseLetters + UpperCaseLetters LowerCaseLetters: TDynamicCharSet = (); // all lowercase characters UpperCaseLetters: TDynamicCharSet = (); // all uppercase characters Alpha: TDynamicCharSet = (); // any linguistic character AlphaNum: TDynamicCharSet = (); // Alpha + Digits NonAlphaNum: TDynamicCharSet = (); // AllChars - AlphaNum Punctuation: TDynamicCharSet = (); // '!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~' and other Printable: TDynamicCharSet = (); // graphic characters and blanks AllChars: TDynamicCharSet = (); // Printable + ControlChars aber notfalls könnte man es auch unter Delphi 2006, 2007, sowie Turbo Delphi zu laufen bekommen. PS: nicht über meine Konstanten wundern ... nach außen Konstante und nach innen nicht, da es doch typisierte Konstanten sind, welche in Delphi ja eh keine "echten" Konstanten sind. ![]() Und wenn falls es wer mal braucht, dann ließe sich bestimmt auch noch ein "Set of Integer" erstellen, mit einer zusätzlichen dynamischen Untergrenze, allerdings sollten dann die Werte nicht all zu "weit" auseinander liegen, wobei es auch dafür eine Lösung gäbe ... also mehrere Wertebereiche/Sets in Einem. Jetzt aber noch ein Problem Und zwar scheint es irgendwo einen Bufferoverrun oder Dergleichen zu geben. ![]() Schon bei der Initialisierung der Konstanten kommt es offiziell zu einem OutOfMemory (in D2009+), welches allerdings davon stammt, daß der Speichermanager (FastMM) defekte Verwaltungsdaten so anzeigt. (hab über 'ne Strunde nach dem Speicherleck gesucht und mich gleichzeitig gewundert, warum der Taskmanager meint es wäre noch genügend frei) Es wäre also schön, wenn da noch mit jemand reingucken könnte und mir eventuell einen Tipp gibt. Bin den Code jetzt schon mehrmals nochmal komplett durchgegangen und konnte keinen noch Fehler finden, welcher dafür verantwortlich sein könnte. ![]() [edit] Grad gemerkt, daß hier die Bereichsprüfung nicht aktiv war (dabei hatte ich es doch in den Optionen aktiviert ![]() na mal sehn, was sich jetzt findet. [edit 10.12.2009 v1.1] Was so ein kleines -1 alles ausrichten kann, ![]() aber nun gibt es schonmal keine Exceptions mehr. ![]() Jetzt kann ich endlich gucken, ob es auch wirklich so arbeitet, wie geplant. [edit 13.01.2010 v1.2] das Problem mit dem nichtinitialisiertem Standardencoding ( Beitrag #3 bis #6 ) wurde behoben [add 10.02.2010 v1.3] kleinere Erweiterungen und Änderungen an den Konstanten ... siehe Beitrag #7 sowie Fehlerbereinigung und hinzugefügter Enumerator ... siehe Beitrag #8 [edit 11.02.2010 v1.4] Eingangspost überarbeitet und kleine Neuerungen hinzugefügt ... siehe letzes Edit in Beitrag #8 [edit 12.02.2010 v1.5] schonwieder was Neues > siehe Beitrag #9 [edit 13.02.2010 v1.6] 'nen kleinen Fehler ausgebesserst, welcher bei einem Fill das DefaultEncoding nicht richtig übernahm und so zu einer Exception führte. Auserdem wurde .FullClear und .ReadOnly eingefügt. Leider wird der ReadOnly-Status mitkopiert, wenn man ein SET per := kopiert. [edit 13.02.2010 v1.7] Fehlerbeseitigung (siehe #15) [edit 08.04.2010 v1.8] restliche Fehler beseitigt ... alle neuen Prüfungen meinen jetzt es sei alles OK [edit 33.04.2010 v2.2] Ups, hab grade gemerkt, daß ich die Fehlerbeseitigung dieses saublöden Compilerfehlers ![]() ![]() noch nicht hochgeladen hatte. ![]()
Ein Therapeut entspricht 1024 Gigapeut.
|
![]() |
Ansicht |
![]() |
![]() |
![]() |
ForumregelnEs 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
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
![]() |
![]() |