From 267aef65d81dd6e93b87598964235efb6749165f Mon Sep 17 00:00:00 2001 From: Michael Schimmel Date: Tue, 26 Aug 2025 13:55:10 +0200 Subject: [PATCH] New type system - Decimals --- Src/Data/Myc.Data.Types.pas | 81 +++++++++++++++++++++++++++++++++ Src/Myc.Trade.Indicators_v2.pas | 2 +- 2 files changed, 82 insertions(+), 1 deletion(-) diff --git a/Src/Data/Myc.Data.Types.pas b/Src/Data/Myc.Data.Types.pas index 0bdde0e..6a207bd 100644 --- a/Src/Data/Myc.Data.Types.pas +++ b/Src/Data/Myc.Data.Types.pas @@ -422,6 +422,17 @@ type class function RecordOf(const Fields: array of TRecordField): TDataType.TRecord; overload; static; class function EnumOf(const AName: string; const AIdentifiers: array of string): TDataType.TEnum; static; + function AsOrdinal: TDataType.TOrdinal; inline; + function AsFloat: TDataType.TFloat; inline; + function AsText: TDataType.TText; inline; + function AsTimestamp: TDataType.TTimestamp; inline; + function AsDecimal: TDataType.TDecimal; inline; + function AsRecord: TDataType.TRecord; inline; + function AsTuple: TDataType.TTuple; inline; + function AsArray: TDataType.TArray; inline; + function AsEnum: TDataType.TEnum; inline; + function AsMethod: TDataType.TMethod; inline; + property DataType: IDataType read FDataType; property Name: String read GetName; property Kind: TDataKind read GetKind; @@ -1172,4 +1183,74 @@ begin Result.FDataValue := A; end; +function TDataType.AsArray: TDataType.TArray; +begin + if (FDataType.Kind <> dkArray) then + raise EInvalidCast.Create('Array expected'); + Result.Create(IDataArrayType(FDataType)); +end; + +function TDataType.AsDecimal: TDataType.TDecimal; +begin + if (FDataType.Kind <> dkDecimal) then + raise EInvalidCast.Create('Decimal expected'); + Result.Create(IDataDecimalType(FDataType)); +end; + +function TDataType.AsEnum: TDataType.TEnum; +begin + if (FDataType.Kind <> dkEnum) then + raise EInvalidCast.Create('Enum expected'); + Result.Create(IDataEnumType(FDataType)); +end; + +function TDataType.AsFloat: TDataType.TFloat; +begin + if (FDataType.Kind <> dkFloat) then + raise EInvalidCast.Create('Float expected'); + Result.Create(IDataFloatType(FDataType)); +end; + +function TDataType.AsMethod: TDataType.TMethod; +begin + if (FDataType.Kind <> dkMethod) then + raise EInvalidCast.Create('Method expected'); + Result.Create(IDataMethodType(FDataType)); +end; + +function TDataType.AsOrdinal: TDataType.TOrdinal; +begin + if (FDataType.Kind <> dkOrdinal) then + raise EInvalidCast.Create('Ordinal expected'); + Result.Create(IDataOrdinalType(FDataType)); +end; + +function TDataType.AsRecord: TDataType.TRecord; +begin + if (FDataType.Kind <> dkRecord) then + raise EInvalidCast.Create('Record expected'); + Result.Create(IDataRecordType(FDataType)); +end; + +function TDataType.AsText: TDataType.TText; +begin + if (FDataType.Kind <> dkText) then + raise EInvalidCast.Create('Text expected'); + Result.Create(IDataTextType(FDataType)); +end; + +function TDataType.AsTimestamp: TDataType.TTimestamp; +begin + if (FDataType.Kind <> dkTimestamp) then + raise EInvalidCast.Create('Timestamp expected'); + Result.Create(IDataTimestampType(FDataType)); +end; + +function TDataType.AsTuple: TDataType.TTuple; +begin + if (FDataType.Kind <> dkTuple) then + raise EInvalidCast.Create('Tuple expected'); + Result.Create(IDataTupleType(FDataType)); +end; + end. diff --git a/Src/Myc.Trade.Indicators_v2.pas b/Src/Myc.Trade.Indicators_v2.pas index 0f7a875..dbe0fe4 100644 --- a/Src/Myc.Trade.Indicators_v2.pas +++ b/Src/Myc.Trade.Indicators_v2.pas @@ -180,7 +180,7 @@ function DataTypeFromRttiType(const Ctx: TRttiContext; rttiType: TRttiType): TDa begin if not Assigned(rttiType) then begin - Result := TDataType.Create(nil); + Result := TDataType.Void; exit; end;