From 700088b5c53f52875ed44bde86807a63f144d375 Mon Sep 17 00:00:00 2001 From: Michael Schimmel Date: Sun, 4 Jan 2026 15:21:46 +0100 Subject: [PATCH] Refactoring Keyword mapping, introducing tuples --- Src/AST/Myc.Ast.Evaluator.pas | 2 +- Src/AST/Myc.Ast.RTL.TypeRegistry.pas | 2 +- Src/Data/Myc.Data.Keyword.pas | 43 ++++++++++++---------------- 3 files changed, 20 insertions(+), 27 deletions(-) diff --git a/Src/AST/Myc.Ast.Evaluator.pas b/Src/AST/Myc.Ast.Evaluator.pas index d8e7be7..020fdc5 100644 --- a/Src/AST/Myc.Ast.Evaluator.pas +++ b/Src/AST/Myc.Ast.Evaluator.pas @@ -385,7 +385,7 @@ begin SetLength(fields, N.Fields.Count); for i := 0 to N.Fields.Count - 1 do fields[i] := TPair.Create(N.Fields[i].Key.Value, Visit(N.Fields[i].Value)); - Result := TDataValue.FromGenericRecord(TKeywordMapping.Create(fields)); + Result := TDataValue.FromGenericRecord(TGenericRecord.Create(fields)); end; end; diff --git a/Src/AST/Myc.Ast.RTL.TypeRegistry.pas b/Src/AST/Myc.Ast.RTL.TypeRegistry.pas index 48a8192..7f07da4 100644 --- a/Src/AST/Myc.Ast.RTL.TypeRegistry.pas +++ b/Src/AST/Myc.Ast.RTL.TypeRegistry.pas @@ -482,7 +482,7 @@ begin end; end; - Result := TDataValue.FromGenericRecord(TKeywordMapping.Create(recFields.ToArray)); + Result := TDataValue.FromGenericRecord(TGenericRecord.Create(recFields.ToArray)); finally recFields.Free; end; diff --git a/Src/Data/Myc.Data.Keyword.pas b/Src/Data/Myc.Data.Keyword.pas index d81faeb..fc58069 100644 --- a/Src/Data/Myc.Data.Keyword.pas +++ b/Src/Data/Myc.Data.Keyword.pas @@ -48,11 +48,9 @@ type end; // Defines a mapping from Keywords to a generic value T - IKeywordMapping = interface + IKeywordMapping = interface(ITuple) {$region 'private'} - function GetItems(Idx: Integer): T; function GetFields(const Key: IKeyword): T; - function GetCount: Integer; function GetKeywords(Idx: Integer): IKeyword; {$endregion} // Finds the 0-based index for a given keyword. Returns -1 if not found. @@ -60,17 +58,13 @@ type property Keywords[Idx: Integer]: IKeyword read GetKeywords; property Fields[const Key: IKeyword]: T read GetFields; - property Items[Idx: Integer]: T read GetItems; default; - - property Count: Integer read GetCount; end; // Factory for creating IKeywordMapping instances TKeywordMappingRegistry = record strict private - // Implementation class for IKeywordMapping type - TKeywordMapping = class(TInterfacedObject, IKeywordMapping) + TMapping = class(TInterfacedObject, IKeywordMapping) private FMap: TArray; FFields: TArray>; @@ -98,11 +92,10 @@ type class function Intern(const AFields: TArray>): IKeywordMapping; static; end; - TKeywordMapping = class(TInterfacedObject, IKeywordMapping) + TGenericRecord = class(TInterfacedObject, IKeywordMapping) private FFields: TArray>; - // IKeywordMapping implementation function GetItems(Idx: Integer): T; function GetKeywords(Idx: Integer): IKeyword; function GetFields(const Key: IKeyword): T; @@ -181,9 +174,9 @@ begin Result := ''; end; -{ TKeywordMappingRegistry.TKeywordMapping } +{ TKeywordMappingRegistry.TMapping } -constructor TKeywordMappingRegistry.TKeywordMapping.Create(const AFields: TArray>); +constructor TKeywordMappingRegistry.TMapping.Create(const AFields: TArray>); var i: Integer; keyIdx: Integer; @@ -222,19 +215,19 @@ begin end; end; -function TKeywordMappingRegistry.TKeywordMapping.GetCount: Integer; +function TKeywordMappingRegistry.TMapping.GetCount: Integer; begin Result := Length(FFields); end; // Interface method for Items property -function TKeywordMappingRegistry.TKeywordMapping.GetItems(Idx: Integer): T; +function TKeywordMappingRegistry.TMapping.GetItems(Idx: Integer): T; begin Result := FFields[Idx].Value; end; // Interface method for Fields property -function TKeywordMappingRegistry.TKeywordMapping.GetFields(const Key: IKeyword): T; +function TKeywordMappingRegistry.TMapping.GetFields(const Key: IKeyword): T; var idx: Integer; begin @@ -244,12 +237,12 @@ begin Result := FFields[idx].Value; end; -function TKeywordMappingRegistry.TKeywordMapping.GetKeywords(Idx: Integer): IKeyword; +function TKeywordMappingRegistry.TMapping.GetKeywords(Idx: Integer): IKeyword; begin Result := FFields[Idx].Key; end; -function TKeywordMappingRegistry.TKeywordMapping.IndexOf(const Key: IKeyword): Integer; +function TKeywordMappingRegistry.TMapping.IndexOf(const Key: IKeyword): Integer; var keyIdx, mapIdx: Integer; begin @@ -290,7 +283,7 @@ begin try if not FRegistry.TryGetValue(signature, Result) then begin - Result := TKeywordMapping.Create(AFields); + Result := TMapping.Create(AFields); FRegistry.Add(signature, Result); end; finally @@ -298,20 +291,20 @@ begin end; end; -{ TKeywordMapping } +{ TGenericRecord } -constructor TKeywordMapping.Create(const AFields: TArray>); +constructor TGenericRecord.Create(const AFields: TArray>); begin inherited Create; FFields := AFields; end; -function TKeywordMapping.GetCount: Integer; +function TGenericRecord.GetCount: Integer; begin Result := Length(FFields); end; -function TKeywordMapping.GetFields(const Key: IKeyword): T; +function TGenericRecord.GetFields(const Key: IKeyword): T; var idx: Integer; begin @@ -321,17 +314,17 @@ begin Result := FFields[idx].Value; end; -function TKeywordMapping.GetItems(Idx: Integer): T; +function TGenericRecord.GetItems(Idx: Integer): T; begin Result := FFields[Idx].Value; end; -function TKeywordMapping.GetKeywords(Idx: Integer): IKeyword; +function TGenericRecord.GetKeywords(Idx: Integer): IKeyword; begin Result := FFields[Idx].Key; end; -function TKeywordMapping.IndexOf(const Key: IKeyword): Integer; +function TGenericRecord.IndexOf(const Key: IKeyword): Integer; var i: Integer; begin