Extracted TDynamicRecord
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -36,7 +36,8 @@ uses
|
||||
Myc.Fmx.AstEditor.Handlers.Lists in '..\Src\AST\Myc.Fmx.AstEditor.Handlers.Lists.pas',
|
||||
Myc.Fmx.AstEditor.Handlers.Primitives in '..\Src\AST\Myc.Fmx.AstEditor.Handlers.Primitives.pas',
|
||||
Myc.Fmx.AstEditor.Handlers.Control in '..\Src\AST\Myc.Fmx.AstEditor.Handlers.Control.pas',
|
||||
Myc.Fmx.AstEditor.Handlers.Data in '..\Src\AST\Myc.Fmx.AstEditor.Handlers.Data.pas';
|
||||
Myc.Fmx.AstEditor.Handlers.Data in '..\Src\AST\Myc.Fmx.AstEditor.Handlers.Data.pas',
|
||||
Myc.Data.Records in '..\Src\Data\Myc.Data.Records.pas';
|
||||
|
||||
{$R *.res}
|
||||
|
||||
|
||||
@@ -167,6 +167,7 @@
|
||||
<DCCReference Include="..\Src\AST\Myc.Fmx.AstEditor.Handlers.Primitives.pas"/>
|
||||
<DCCReference Include="..\Src\AST\Myc.Fmx.AstEditor.Handlers.Control.pas"/>
|
||||
<DCCReference Include="..\Src\AST\Myc.Fmx.AstEditor.Handlers.Data.pas"/>
|
||||
<DCCReference Include="..\Src\Data\Myc.Data.Records.pas"/>
|
||||
<BuildConfiguration Include="Base">
|
||||
<Key>Base</Key>
|
||||
</BuildConfiguration>
|
||||
|
||||
@@ -78,7 +78,8 @@ uses
|
||||
Myc.Data.Decimal,
|
||||
Myc.Data.Series,
|
||||
Myc.Data.Scalar.JSON,
|
||||
Myc.Ast.Types;
|
||||
Myc.Ast.Types,
|
||||
Myc.Data.Records;
|
||||
|
||||
// Helper type for TCO via trampolining.
|
||||
type
|
||||
@@ -96,41 +97,6 @@ begin
|
||||
Recur := ARecur;
|
||||
end;
|
||||
|
||||
{ TDynamicRecord }
|
||||
|
||||
type
|
||||
// Runtime implementation for generic records using linear search
|
||||
TDynamicRecord = class(TInterfacedObject, IKeywordMapping<TDataValue>)
|
||||
private
|
||||
FFields: TArray<TPair<IKeyword, TDataValue>>;
|
||||
function GetFields: TArray<TPair<IKeyword, TDataValue>>;
|
||||
public
|
||||
constructor Create(const AFields: TArray<TPair<IKeyword, TDataValue>>);
|
||||
function IndexOf(const Key: IKeyword): Integer;
|
||||
end;
|
||||
|
||||
constructor TDynamicRecord.Create(const AFields: TArray<TPair<IKeyword, TDataValue>>);
|
||||
begin
|
||||
inherited Create;
|
||||
FFields := AFields;
|
||||
end;
|
||||
|
||||
function TDynamicRecord.GetFields: TArray<TPair<IKeyword, TDataValue>>;
|
||||
begin
|
||||
Result := FFields;
|
||||
end;
|
||||
|
||||
function TDynamicRecord.IndexOf(const Key: IKeyword): Integer;
|
||||
begin
|
||||
// Linear search (O(n)) as requested
|
||||
for Result := 0 to High(FFields) do
|
||||
begin
|
||||
if FFields[Result].Key.Idx = Key.Idx then
|
||||
exit;
|
||||
end;
|
||||
Result := -1;
|
||||
end;
|
||||
|
||||
{ TEvaluatorVisitor }
|
||||
|
||||
constructor TEvaluatorVisitor.Create(const AScope: IExecutionScope);
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
unit Myc.Data.Records;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
system.generics.collections,
|
||||
Myc.Data.Keyword,
|
||||
Myc.Data.Value;
|
||||
|
||||
type
|
||||
// Runtime implementation for generic records using linear search (optimized for small record sizes)
|
||||
TDynamicRecord = class(TInterfacedObject, IKeywordMapping<TDataValue>)
|
||||
private
|
||||
FFields: TArray<TPair<IKeyword, TDataValue>>;
|
||||
function GetFields: TArray<TPair<IKeyword, TDataValue>>;
|
||||
public
|
||||
constructor Create(const AFields: TArray<TPair<IKeyword, TDataValue>>);
|
||||
function IndexOf(const Key: IKeyword): Integer;
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
||||
{ TDynamicRecord }
|
||||
|
||||
constructor TDynamicRecord.Create(const AFields: TArray<TPair<IKeyword, TDataValue>>);
|
||||
begin
|
||||
inherited Create;
|
||||
FFields := AFields;
|
||||
end;
|
||||
|
||||
function TDynamicRecord.GetFields: TArray<TPair<IKeyword, TDataValue>>;
|
||||
begin
|
||||
Result := FFields;
|
||||
end;
|
||||
|
||||
function TDynamicRecord.IndexOf(const Key: IKeyword): Integer;
|
||||
begin
|
||||
// Linear search (O(n)). Fast enough for typical records.
|
||||
// Keyword comparison is integer-based (Idx), so this is efficient.
|
||||
for Result := 0 to High(FFields) do
|
||||
begin
|
||||
if FFields[Result].Key.Idx = Key.Idx then
|
||||
exit;
|
||||
end;
|
||||
Result := -1;
|
||||
end;
|
||||
|
||||
end.
|
||||
Reference in New Issue
Block a user