unit Myc.Data.Types; interface uses System.SysUtils; type TDataKind = (dkVoid, dkOrdinal, dkFloat, dkText, dkTimestamp, dkDecimal, dkRecord, dkTuple, dkArray, dkVector, dkEnum, dkMethod); IDataType = interface {$region 'private'} function GetName: String; function GetKind: TDataKind; {$endregion} property Name: String read GetName; property Kind: TDataKind read GetKind; end; IDataValue = interface {$region 'private'} function GetDataType: IDataType; function GetAsString: string; {$endregion} property DataType: IDataType read GetDataType; property AsString: string read GetAsString; end; IDataVoidValue = interface(IDataValue) end; IDataVoidType = interface(IDataType) function GetValue: IDataVoidValue; property Value: IDataVoidValue read GetValue; end; IDataOrdinalValue = interface(IDataValue) {$region 'private'} function GetValue: Int64; {$endregion} property Value: Int64 read GetValue; end; IDataOrdinalType = interface(IDataType) function CreateValue(Init: Int64): IDataOrdinalValue; end; IDataFloatValue = interface(IDataValue) {$region 'private'} function GetValue: Double; {$endregion} property Value: Double read GetValue; end; IDataFloatType = interface(IDataType) function CreateValue(Init: Double): IDataFloatValue; end; IDataTextValue = interface(IDataValue) {$region 'private'} function GetValue: string; {$endregion} property Value: string read GetValue; end; IDataTextType = interface(IDataType) function CreateValue(const AValue: string): IDataTextValue; end; IDataTimestampValue = interface(IDataValue) {$region 'private'} function GetValue: TDateTime; {$endregion} property Value: TDateTime read GetValue; end; IDataTimestampType = interface(IDataType) function CreateValue(const AValue: TDateTime): IDataTimestampValue; end; // Represents a fixed-point decimal data value. IDataDecimalValue = interface(IDataValue) {$region 'private'} function GetValue: Int64; {$endregion} property Value: Int64 read GetValue; end; // Represents the type of a fixed-point decimal data value. IDataDecimalType = interface(IDataType) {$region 'private'} function GetScale: Integer; {$endregion} function CreateValue(const AValue: Int64): IDataDecimalValue; property Scale: Integer read GetScale; end; IDataEnumValue = interface(IDataValue) {$region 'private'} function GetValue: Integer; {$endregion} property Value: Integer read GetValue; end; IDataEnumType = interface(IDataType) {$region 'private'} function GetIdentifier(Idx: Integer): string; function GetIdentifierCount: Integer; {$endregion} function IndexOf(const AIdentifier: string): Integer; function CreateValue(const AValue: Integer): IDataEnumValue; property IdentifierCount: Integer read GetIdentifierCount; property Identifiers[Idx: Integer]: string read GetIdentifier; default; end; // A method that transforms one data value into another. TDataMethodProc = reference to function(const AValue: IDataValue): IDataValue; // Represents an executable method data value. IDataMethodValue = interface(IDataValue) {$region 'private'} function GetValue: TDataMethodProc; {$endregion} property Value: TDataMethodProc read GetValue; end; // Represents the type of a method data value, including its signature. IDataMethodType = interface(IDataType) {$region 'private'} function GetArgType: IDataType; function GetResultType: IDataType; {$endregion} property ArgType: IDataType read GetArgType; property ResultType: IDataType read GetResultType; function CreateValue(const AValue: TDataMethodProc): IDataMethodValue; end; IDataRecordValue = interface(IDataValue) {$region 'private'} function GetItem(Idx: Integer): IDataValue; {$endregion} property Items[Idx: Integer]: IDataValue read GetItem; default; end; TDataRecordField = record DataType: IDataType; Name: string; constructor Create(const AName: string; const ADataType: IDataType); end; IDataRecordType = interface(IDataType) {$region 'private'} function GetFieldCount: Integer; function GetField(Idx: Integer): TDataRecordField; {$endregion} function IndexOf(const AName: string): Integer; function CreateValue(const AItems: array of IDataValue): IDataRecordValue; property FieldCount: Integer read GetFieldCount; property Fields[Idx: Integer]: TDataRecordField read GetField; default; end; IDataTupleValue = interface(IDataValue) {$region 'private'} function GetItemCount: Integer; function GetItem(Idx: Integer): IDataValue; {$endregion} property ItemCount: Integer read GetItemCount; property Items[Idx: Integer]: IDataValue read GetItem; default; end; IDataTupleType = interface(IDataType) {$region 'private'} function GetItemCount: Integer; function GetItemType(Idx: Integer): IDataType; {$endregion} function CreateValue(const AItems: array of IDataValue): IDataTupleValue; property ItemCount: Integer read GetItemCount; property ItemType[Idx: Integer]: IDataType read GetItemType; end; IDataArrayValue = interface(IDataValue) {$region 'private'} function GetElementCount: Integer; function GetItem(Idx: Integer): IDataValue; {$endregion} property ElementCount: Integer read GetElementCount; property Items[Idx: Integer]: IDataValue read GetItem; default; end; IDataArrayType = interface(IDataType) {$region 'private'} function GetElementType: IDataType; {$endregion} function CreateValue(const AItems: array of IDataValue): IDataArrayValue; property ElementType: IDataType read GetElementType; end; // Represents a fixed-size vector of data values. IDataVectorValue = interface(IDataValue) {$region 'private'} function GetElementCount: Integer; function GetItem(Idx: Integer): IDataValue; {$endregion} property ElementCount: Integer read GetElementCount; property Items[Idx: Integer]: IDataValue read GetItem; default; end; // Represents the type of a fixed-size vector. IDataVectorType = interface(IDataType) {$region 'private'} function GetElementType: IDataType; function GetElementCount: Integer; {$endregion} function CreateValue(const AItems: array of IDataValue): IDataVectorValue; property ElementType: IDataType read GetElementType; property ElementCount: Integer read GetElementCount; end; TDataType = record type TValue = record private FDataValue: IDataValue; function GetDataType: IDataType; inline; public constructor Create(const ADataValue: IDataValue); class operator Implicit(const A: IDataValue): TDataType.TValue; overload; inline; class operator Implicit(const A: TDataType.TValue): IDataValue; overload; inline; property DataValue: IDataValue read FDataValue; property DataType: IDataType read GetDataType; end; TVoid = record type TValue = record private FVoidValue: IDataVoidValue; function GetDataType: TDataType.TVoid; public constructor Create(const AVoidValue: IDataVoidValue); class operator Implicit(const A: IDataVoidValue): TDataType.TVoid.TValue; overload; inline; class operator Implicit(const A: TDataType.TVoid.TValue): IDataVoidValue; overload; inline; class operator Implicit(const A: TDataType.TVoid.TValue): TDataType.TValue; overload; inline; property DataType: TDataType.TVoid read GetDataType; end; private FVoidType: IDataVoidType; function GetValue: TDataType.TVoid.TValue; inline; public constructor Create(const AVoidType: IDataVoidType); class operator Implicit(const A: IDataVoidType): TDataType.TVoid; overload; inline; class operator Implicit(const A: TDataType.TVoid): IDataVoidType; overload; inline; property Value: TDataType.TVoid.TValue read GetValue; end; TOrdinal = record type TValue = record private FOrdinalValue: IDataOrdinalValue; function GetDataType: TDataType.TOrdinal; function GetValue: Int64; inline; public constructor Create(const AOrdinalValue: IDataOrdinalValue); class operator Implicit(const A: IDataOrdinalValue): TDataType.TOrdinal.TValue; overload; inline; class operator Implicit(const A: TDataType.TOrdinal.TValue): IDataOrdinalValue; overload; inline; class operator Implicit(const A: TDataType.TOrdinal.TValue): TDataType.TValue; overload; inline; property Value: Int64 read GetValue; property DataType: TDataType.TOrdinal read GetDataType; end; private FOrdinalType: IDataOrdinalType; public constructor Create(const AOrdinalType: IDataOrdinalType); class operator Implicit(const A: IDataOrdinalType): TDataType.TOrdinal; overload; inline; class operator Implicit(const A: TDataType.TOrdinal): IDataOrdinalType; overload; inline; function CreateValue(Init: Int64): TDataType.TOrdinal.TValue; inline; end; TFloat = record type TValue = record private FFloatValue: IDataFloatValue; function GetDataType: TDataType.TFloat; function GetValue: Double; inline; public constructor Create(const AFloatValue: IDataFloatValue); class operator Implicit(const A: IDataFloatValue): TDataType.TFloat.TValue; overload; inline; class operator Implicit(const A: TDataType.TFloat.TValue): IDataFloatValue; overload; inline; class operator Implicit(const A: TDataType.TFloat.TValue): TDataType.TValue; overload; inline; property Value: Double read GetValue; property DataType: TDataType.TFloat read GetDataType; end; private FFloatType: IDataFloatType; public constructor Create(const AFloatType: IDataFloatType); class operator Implicit(const A: IDataFloatType): TDataType.TFloat; overload; inline; class operator Implicit(const A: TDataType.TFloat): IDataFloatType; overload; inline; function CreateValue(Init: Double): TDataType.TFloat.TValue; inline; end; TText = record type TValue = record private FTextValue: IDataTextValue; function GetDataType: TDataType.TText; function GetValue: string; inline; public constructor Create(const ATextValue: IDataTextValue); class operator Implicit(const A: IDataTextValue): TDataType.TText.TValue; overload; inline; class operator Implicit(const A: TDataType.TText.TValue): IDataTextValue; overload; inline; class operator Implicit(const A: TDataType.TText.TValue): TDataType.TValue; overload; inline; property Value: string read GetValue; property DataType: TDataType.TText read GetDataType; end; private FTextType: IDataTextType; public constructor Create(const ATextType: IDataTextType); class operator Implicit(const A: IDataTextType): TDataType.TText; overload; inline; class operator Implicit(const A: TDataType.TText): IDataTextType; overload; inline; function CreateValue(const AValue: string): TDataType.TText.TValue; inline; end; TTimestamp = record type TValue = record private FTimestampValue: IDataTimestampValue; function GetDataType: TDataType.TTimestamp; function GetValue: TDateTime; inline; public constructor Create(const ATimestampValue: IDataTimestampValue); class operator Implicit(const A: IDataTimestampValue): TDataType.TTimestamp.TValue; overload; inline; class operator Implicit(const A: TDataType.TTimestamp.TValue): IDataTimestampValue; overload; inline; class operator Implicit(const A: TDataType.TTimestamp.TValue): TDataType.TValue; overload; inline; property Value: TDateTime read GetValue; property DataType: TDataType.TTimestamp read GetDataType; end; private FTimestampType: IDataTimestampType; public constructor Create(const ATimestampType: IDataTimestampType); class operator Implicit(const A: IDataTimestampType): TDataType.TTimestamp; overload; inline; class operator Implicit(const A: TDataType.TTimestamp): IDataTimestampType; overload; inline; function CreateValue(const AValue: TDateTime): TDataType.TTimestamp.TValue; inline; end; TDecimal = record type TValue = record private FDecimalValue: IDataDecimalValue; function GetDataType: TDataType.TDecimal; function GetScale: Integer; inline; function GetValue: Int64; inline; public constructor Create(const ADecimalValue: IDataDecimalValue); class operator Implicit(const A: IDataDecimalValue): TDataType.TDecimal.TValue; overload; inline; class operator Implicit(const A: TDataType.TDecimal.TValue): IDataDecimalValue; overload; inline; class operator Implicit(const A: TDataType.TDecimal.TValue): TDataType.TValue; overload; inline; function ToDouble: Double; property Value: Int64 read GetValue; property Scale: Integer read GetScale; property DataType: TDataType.TDecimal read GetDataType; end; private FDecimalType: IDataDecimalType; function GetScale: Integer; inline; public constructor Create(const ADecimalType: IDataDecimalType); class operator Implicit(const A: IDataDecimalType): TDataType.TDecimal; overload; inline; class operator Implicit(const A: TDataType.TDecimal): IDataDecimalType; overload; inline; function CreateValue(const AValue: Int64): TDataType.TDecimal.TValue; inline; property Scale: Integer read GetScale; end; TEnum = record type TValue = record private FEnumValue: IDataEnumValue; function GetDataType: TDataType.TEnum; function GetValue: Integer; inline; public constructor Create(const AEnumValue: IDataEnumValue); class operator Implicit(const A: IDataEnumValue): TDataType.TEnum.TValue; overload; inline; class operator Implicit(const A: TDataType.TEnum.TValue): IDataEnumValue; overload; inline; class operator Implicit(const A: TDataType.TEnum.TValue): TDataType.TValue; overload; inline; property Value: Integer read GetValue; property DataType: TDataType.TEnum read GetDataType; end; private FEnumType: IDataEnumType; function GetIdentifier(Idx: Integer): string; inline; function GetIdentifierCount: Integer; inline; public constructor Create(const AEnumType: IDataEnumType); class operator Implicit(const A: IDataEnumType): TDataType.TEnum; overload; inline; class operator Implicit(const A: TDataType.TEnum): IDataEnumType; overload; inline; function IndexOf(const AIdentifier: string): Integer; inline; function CreateValue(const AValue: Integer): TDataType.TEnum.TValue; overload; inline; function CreateValue(const AIdentifier: string): TDataType.TEnum.TValue; overload; inline; property IdentifierCount: Integer read GetIdentifierCount; property Identifiers[Idx: Integer]: string read GetIdentifier; default; end; TRecord = record type TValue = record private FRecordValue: IDataRecordValue; function GetDataType: TDataType.TRecord; function GetItems(Idx: Integer): TDataType.TValue; inline; public constructor Create(const ARecordValue: IDataRecordValue); class operator Implicit(const A: IDataRecordValue): TDataType.TRecord.TValue; overload; inline; class operator Implicit(const A: TDataType.TRecord.TValue): IDataRecordValue; overload; inline; class operator Implicit(const A: TDataType.TRecord.TValue): TDataType.TValue; overload; inline; property Items[Idx: Integer]: TDataType.TValue read GetItems; default; property DataType: TDataType.TRecord read GetDataType; end; private FRecordType: IDataRecordType; function GetFieldCount: Integer; inline; function GetField(Idx: Integer): TDataRecordField; inline; public constructor Create(const ARecordType: IDataRecordType); class operator Implicit(const A: IDataRecordType): TDataType.TRecord; overload; inline; class operator Implicit(const A: TDataType.TRecord): IDataRecordType; overload; inline; function IndexOf(const AName: string): Integer; inline; function CreateValue(const AItems: array of IDataValue): TDataType.TRecord.TValue; property FieldCount: Integer read GetFieldCount; property Fields[Idx: Integer]: TDataRecordField read GetField; default; end; TTuple = record type TValue = record private FTupleValue: IDataTupleValue; function GetDataType: TDataType.TTuple; function GetItems(Idx: Integer): TDataType.TValue; inline; function GetItemCount: Integer; inline; public constructor Create(const ATupleValue: IDataTupleValue); class operator Implicit(const A: IDataTupleValue): TDataType.TTuple.TValue; overload; inline; class operator Implicit(const A: TDataType.TTuple.TValue): IDataTupleValue; overload; inline; class operator Implicit(const A: TDataType.TTuple.TValue): TDataType.TValue; overload; inline; property ItemCount: Integer read GetItemCount; property Items[Idx: Integer]: TDataType.TValue read GetItems; default; property DataType: TDataType.TTuple read GetDataType; end; private FTupleType: IDataTupleType; function GetItemCount: Integer; inline; function GetItemType(Idx: Integer): IDataType; inline; public constructor Create(const ATupleType: IDataTupleType); class operator Implicit(const A: IDataTupleType): TDataType.TTuple; overload; inline; class operator Implicit(const A: TDataType.TTuple): IDataTupleType; overload; inline; function CreateValue(const AItems: array of IDataValue): TDataType.TTuple.TValue; property ItemCount: Integer read GetItemCount; property ItemType[Idx: Integer]: IDataType read GetItemType; end; TArray = record type TValue = record private FArrayValue: IDataArrayValue; function GetDataType: TDataType.TArray; function GetItems(Idx: Integer): TDataType.TValue; inline; function GetElementCount: Integer; inline; public constructor Create(const AArrayValue: IDataArrayValue); class operator Implicit(const A: IDataArrayValue): TDataType.TArray.TValue; overload; inline; class operator Implicit(const A: TDataType.TArray.TValue): IDataArrayValue; overload; inline; class operator Implicit(const A: TDataType.TArray.TValue): TDataType.TValue; overload; inline; property ElementCount: Integer read GetElementCount; property Items[Idx: Integer]: TDataType.TValue read GetItems; default; property DataType: TDataType.TArray read GetDataType; end; private FArrayType: IDataArrayType; function GetElementType: IDataType; inline; public constructor Create(const AArrayType: IDataArrayType); class operator Implicit(const A: IDataArrayType): TDataType.TArray; overload; inline; class operator Implicit(const A: TDataType.TArray): IDataArrayType; overload; inline; function CreateValue(const AItems: array of IDataValue): TDataType.TArray.TValue; property ElementType: IDataType read GetElementType; end; TVector = record type TValue = record private FVectorValue: IDataVectorValue; function GetDataType: TDataType.TVector; function GetItems(Idx: Integer): TDataType.TValue; inline; function GetElementCount: Integer; inline; public constructor Create(const AVectorValue: IDataVectorValue); class operator Implicit(const A: IDataVectorValue): TDataType.TVector.TValue; overload; inline; class operator Implicit(const A: TDataType.TVector.TValue): IDataVectorValue; overload; inline; class operator Implicit(const A: TDataType.TVector.TValue): TDataType.TValue; overload; inline; property ElementCount: Integer read GetElementCount; property Items[Idx: Integer]: TDataType.TValue read GetItems; default; property DataType: TDataType.TVector read GetDataType; end; private FVectorType: IDataVectorType; function GetElementType: IDataType; inline; function GetElementCount: Integer; inline; public constructor Create(const AVectorType: IDataVectorType); class operator Implicit(const A: IDataVectorType): TDataType.TVector; overload; inline; class operator Implicit(const A: TDataType.TVector): IDataVectorType; overload; inline; function CreateValue(const AItems: array of IDataValue): TDataType.TVector.TValue; property ElementType: IDataType read GetElementType; property ElementCount: Integer read GetElementCount; end; TMethod = record type TProc = reference to function(const AValue: TDataType.TValue): TDataType.TValue; TValue = record private FMethodValue: IDataMethodValue; function GetDataType: TDataType.TMethod; function GetValue: TDataMethodProc; inline; public constructor Create(const AMethodValue: IDataMethodValue); class operator Implicit(const A: IDataMethodValue): TDataType.TMethod.TValue; overload; inline; class operator Implicit(const A: TDataType.TMethod.TValue): IDataMethodValue; overload; inline; class operator Implicit(const A: TDataType.TMethod.TValue): TDataType.TValue; overload; inline; property Value: TDataMethodProc read GetValue; property DataType: TDataType.TMethod read GetDataType; end; private FMethodType: IDataMethodType; function GetArgType: IDataType; inline; function GetResultType: IDataType; inline; public constructor Create(const AMethodType: IDataMethodType); class operator Implicit(const A: IDataMethodType): TDataType.TMethod; overload; inline; class operator Implicit(const A: TDataType.TMethod): IDataMethodType; overload; inline; property ArgType: IDataType read GetArgType; property ResultType: IDataType read GetResultType; function CreateValue(const Proc: TProc): TDataType.TMethod.TValue; end; // Helper to cast a generic TValue to a specific value helper. TValueHelper = record helper for TValue public function AsVoid: TVoid.TValue; inline; function AsOrdinal: TOrdinal.TValue; inline; function AsFloat: TFloat.TValue; inline; function AsText: TText.TValue; inline; function AsTimestamp: TTimestamp.TValue; inline; function AsDecimal: TDecimal.TValue; inline; function AsRecord: TRecord.TValue; inline; function AsTuple: TTuple.TValue; inline; function AsArray: TArray.TValue; inline; function AsVector: TVector.TValue; inline; function AsEnum: TEnum.TValue; inline; function AsMethod: TMethod.TValue; inline; end; strict private FDataType: IDataType; function GetName: String; inline; function GetKind: TDataKind; inline; class constructor CreateClass; class destructor DestroyClass; public constructor Create(const ADataType: IDataType); class operator Implicit(const A: IDataType): TDataType; overload; inline; class operator Implicit(const A: TDataType): IDataType; overload; inline; class operator Implicit(const A: TDataType.TVoid): TDataType; overload; inline; class operator Implicit(const A: TDataType.TOrdinal): TDataType; overload; inline; class operator Implicit(const A: TDataType.TFloat): TDataType; overload; inline; class operator Implicit(const A: TDataType.TText): TDataType; overload; inline; class operator Implicit(const A: TDataType.TTimestamp): TDataType; overload; inline; class operator Implicit(const A: TDataType.TDecimal): TDataType; overload; inline; class operator Implicit(const A: TDataType.TEnum): TDataType; overload; inline; class operator Implicit(const A: TDataType.TMethod): TDataType; overload; inline; class operator Implicit(const A: TDataType.TRecord): TDataType; overload; inline; class operator Implicit(const A: TDataType.TTuple): TDataType; overload; inline; class operator Implicit(const A: TDataType.TArray): TDataType; overload; inline; class operator Implicit(const A: TDataType.TVector): TDataType; overload; inline; // Type factories class function Void: TDataType.TVoid; static; class function Ordinal: TDataType.TOrdinal; static; class function Float: TDataType.TFloat; static; class function Text: TDataType.TText; static; class function Timestamp: TDataType.TTimestamp; static; class function DecimalOf(const AScale: Integer): TDataType.TDecimal; static; class function TupleOf(const AItemTypes: array of IDataType): TDataType.TTuple; overload; static; class function TupleOf(const AItemValues: array of IDataValue): TDataType.TTuple.TValue; overload; static; class function MethodOf(const AArgType, AResultType: IDataType): TDataType.TMethod; static; class function ArrayOf(const AElementType: IDataType): TDataType.TArray; static; class function VectorOf(const AElementType: IDataType; const AElementCount: Integer): TDataType.TVector; static; class function RecordOf(const Fields: array of TDataRecordField): TDataType.TRecord; overload; static; class function RecordOf: 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 AsVector: TDataType.TVector; 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; end; implementation uses System.Math, // Added for Power function Myc.Data.Types.Void, Myc.Data.Types.Ordinal, Myc.Data.Types.Float, Myc.Data.Types.Text, Myc.Data.Types.Timestamp, Myc.Data.Types.Decimal, Myc.Data.Types.Arrays, Myc.Data.Types.Vector, Myc.Data.Types.Records, Myc.Data.Types.Tuple, Myc.Data.Types.Enum, Myc.Data.Types.Method; { TDataRecordField } constructor TDataRecordField.Create(const AName: string; const ADataType: IDataType); begin Name := AName; DataType := ADataType; end; { TDataType.TDecimal.TValue } constructor TDataType.TDecimal.TValue.Create(const ADecimalValue: IDataDecimalValue); begin FDecimalValue := ADecimalValue; end; function TDataType.TDecimal.TValue.GetDataType: TDataType.TDecimal; begin Result := IDataDecimalType(FDecimalValue.DataType); end; function TDataType.TDecimal.TValue.GetScale: Integer; begin Result := GetDataType.Scale; end; function TDataType.TDecimal.TValue.GetValue: Int64; begin Result := FDecimalValue.Value; end; function TDataType.TDecimal.TValue.ToDouble: Double; var scaleValue: Integer; begin scaleValue := GetDataType.Scale; if (scaleValue > 0) then Result := FDecimalValue.Value / Power(10, scaleValue) else Result := FDecimalValue.Value; end; class operator TDataType.TDecimal.TValue.Implicit(const A: IDataDecimalValue): TDataType.TDecimal.TValue; begin Result.FDecimalValue := A; end; class operator TDataType.TDecimal.TValue.Implicit(const A: TDataType.TDecimal.TValue): IDataDecimalValue; begin Result := A.FDecimalValue; end; class operator TDataType.TDecimal.TValue.Implicit(const A: TDataType.TDecimal.TValue): TDataType.TValue; begin Result.Create(A.FDecimalValue); end; { TDataType.TDecimal } constructor TDataType.TDecimal.Create(const ADecimalType: IDataDecimalType); begin FDecimalType := ADecimalType; end; function TDataType.TDecimal.CreateValue(const AValue: Int64): TDataType.TDecimal.TValue; begin Result.Create(FDecimalType.CreateValue(AValue)); end; function TDataType.TDecimal.GetScale: Integer; begin Result := FDecimalType.Scale; end; class operator TDataType.TDecimal.Implicit(const A: IDataDecimalType): TDataType.TDecimal; begin Result.FDecimalType := A; end; class operator TDataType.TDecimal.Implicit(const A: TDataType.TDecimal): IDataDecimalType; begin Result := A.FDecimalType; end; { TDataType.TVoid.TValue } constructor TDataType.TVoid.TValue.Create(const AVoidValue: IDataVoidValue); begin FVoidValue := AVoidValue; end; function TDataType.TVoid.TValue.GetDataType: TDataType.TVoid; begin Result := IDataVoidType(FVoidValue.DataType); end; class operator TDataType.TVoid.TValue.Implicit(const A: IDataVoidValue): TDataType.TVoid.TValue; begin Result.FVoidValue := A; end; class operator TDataType.TVoid.TValue.Implicit(const A: TDataType.TVoid.TValue): IDataVoidValue; begin Result := A.FVoidValue; end; class operator TDataType.TVoid.TValue.Implicit(const A: TDataType.TVoid.TValue): TDataType.TValue; begin Result.Create(A.FVoidValue); end; { TDataType.TVoid } constructor TDataType.TVoid.Create(const AVoidType: IDataVoidType); begin FVoidType := AVoidType; end; function TDataType.TVoid.GetValue: TDataType.TVoid.TValue; begin Result.Create(FVoidType.Value); end; class operator TDataType.TVoid.Implicit(const A: IDataVoidType): TDataType.TVoid; begin Result.FVoidType := A; end; class operator TDataType.TVoid.Implicit(const A: TDataType.TVoid): IDataVoidType; begin Result := A.FVoidType; end; { TDataType.TOrdinal.TValue } constructor TDataType.TOrdinal.TValue.Create(const AOrdinalValue: IDataOrdinalValue); begin FOrdinalValue := AOrdinalValue; end; function TDataType.TOrdinal.TValue.GetDataType: TDataType.TOrdinal; begin Result := IDataOrdinalType(FOrdinalValue.DataType); end; function TDataType.TOrdinal.TValue.GetValue: Int64; begin Result := FOrdinalValue.Value; end; class operator TDataType.TOrdinal.TValue.Implicit(const A: IDataOrdinalValue): TDataType.TOrdinal.TValue; begin Result.FOrdinalValue := A; end; class operator TDataType.TOrdinal.TValue.Implicit(const A: TDataType.TOrdinal.TValue): IDataOrdinalValue; begin Result := A.FOrdinalValue; end; class operator TDataType.TOrdinal.TValue.Implicit(const A: TDataType.TOrdinal.TValue): TDataType.TValue; begin Result.Create(A.FOrdinalValue); end; { TDataType.TOrdinal } constructor TDataType.TOrdinal.Create(const AOrdinalType: IDataOrdinalType); begin FOrdinalType := AOrdinalType; end; function TDataType.TOrdinal.CreateValue(Init: Int64): TDataType.TOrdinal.TValue; begin Result.Create(FOrdinalType.CreateValue(Init)); end; class operator TDataType.TOrdinal.Implicit(const A: TDataType.TOrdinal): IDataOrdinalType; begin Result := A.FOrdinalType; end; class operator TDataType.TOrdinal.Implicit(const A: IDataOrdinalType): TDataType.TOrdinal; begin Result.FOrdinalType := A; end; { TDataType.TFloat.TValue } constructor TDataType.TFloat.TValue.Create(const AFloatValue: IDataFloatValue); begin FFloatValue := AFloatValue; end; function TDataType.TFloat.TValue.GetDataType: TDataType.TFloat; begin Result := IDataFloatType(FFloatValue.DataType); end; function TDataType.TFloat.TValue.GetValue: Double; begin Result := FFloatValue.Value; end; class operator TDataType.TFloat.TValue.Implicit(const A: IDataFloatValue): TDataType.TFloat.TValue; begin Result.FFloatValue := A; end; class operator TDataType.TFloat.TValue.Implicit(const A: TDataType.TFloat.TValue): IDataFloatValue; begin Result := A.FFloatValue; end; class operator TDataType.TFloat.TValue.Implicit(const A: TDataType.TFloat.TValue): TDataType.TValue; begin Result.Create(A.FFloatValue); end; { TDataType.TFloat } constructor TDataType.TFloat.Create(const AFloatType: IDataFloatType); begin FFloatType := AFloatType; end; function TDataType.TFloat.CreateValue(Init: Double): TDataType.TFloat.TValue; begin Result.Create(FFloatType.CreateValue(Init)); end; class operator TDataType.TFloat.Implicit(const A: IDataFloatType): TDataType.TFloat; begin Result.FFloatType := A; end; class operator TDataType.TFloat.Implicit(const A: TDataType.TFloat): IDataFloatType; begin Result := A.FFloatType; end; { TDataType.TText.TValue } constructor TDataType.TText.TValue.Create(const ATextValue: IDataTextValue); begin FTextValue := ATextValue; end; function TDataType.TText.TValue.GetDataType: TDataType.TText; begin Result := IDataTextType(FTextValue.DataType); end; function TDataType.TText.TValue.GetValue: string; begin Result := FTextValue.Value; end; class operator TDataType.TText.TValue.Implicit(const A: IDataTextValue): TDataType.TText.TValue; begin Result.FTextValue := A; end; class operator TDataType.TText.TValue.Implicit(const A: TDataType.TText.TValue): IDataTextValue; begin Result := A.FTextValue; end; class operator TDataType.TText.TValue.Implicit(const A: TDataType.TText.TValue): TDataType.TValue; begin Result.Create(A.FTextValue); end; { TDataType.TText } constructor TDataType.TText.Create(const ATextType: IDataTextType); begin FTextType := ATextType; end; function TDataType.TText.CreateValue(const AValue: string): TDataType.TText.TValue; begin Result.Create(FTextType.CreateValue(AValue)); end; class operator TDataType.TText.Implicit(const A: IDataTextType): TDataType.TText; begin Result.FTextType := A; end; class operator TDataType.TText.Implicit(const A: TDataType.TText): IDataTextType; begin Result := A.FTextType; end; { TDataType.TTimestamp.TValue } constructor TDataType.TTimestamp.TValue.Create(const ATimestampValue: IDataTimestampValue); begin FTimestampValue := ATimestampValue; end; function TDataType.TTimestamp.TValue.GetDataType: TDataType.TTimestamp; begin Result := IDataTimestampType(FTimestampValue.DataType); end; function TDataType.TTimestamp.TValue.GetValue: TDateTime; begin Result := FTimestampValue.Value; end; class operator TDataType.TTimestamp.TValue.Implicit(const A: IDataTimestampValue): TDataType.TTimestamp.TValue; begin Result.FTimestampValue := A; end; class operator TDataType.TTimestamp.TValue.Implicit(const A: TDataType.TTimestamp.TValue): IDataTimestampValue; begin Result := A.FTimestampValue; end; class operator TDataType.TTimestamp.TValue.Implicit(const A: TDataType.TTimestamp.TValue): TDataType.TValue; begin Result.Create(A.FTimestampValue); end; { TDataType.TTimestamp } constructor TDataType.TTimestamp.Create(const ATimestampType: IDataTimestampType); begin FTimestampType := ATimestampType; end; function TDataType.TTimestamp.CreateValue(const AValue: TDateTime): TDataType.TTimestamp.TValue; begin Result.Create(FTimestampType.CreateValue(AValue)); end; class operator TDataType.TTimestamp.Implicit(const A: IDataTimestampType): TDataType.TTimestamp; begin Result.FTimestampType := A; end; class operator TDataType.TTimestamp.Implicit(const A: TDataType.TTimestamp): IDataTimestampType; begin Result := A.FTimestampType; end; { TDataType.TEnum.TValue } constructor TDataType.TEnum.TValue.Create(const AEnumValue: IDataEnumValue); begin FEnumValue := AEnumValue; end; function TDataType.TEnum.TValue.GetDataType: TDataType.TEnum; begin Result := IDataEnumType(FEnumValue.DataType); end; function TDataType.TEnum.TValue.GetValue: Integer; begin Result := FEnumValue.Value; end; class operator TDataType.TEnum.TValue.Implicit(const A: IDataEnumValue): TDataType.TEnum.TValue; begin Result.FEnumValue := A; end; class operator TDataType.TEnum.TValue.Implicit(const A: TDataType.TEnum.TValue): IDataEnumValue; begin Result := A.FEnumValue; end; class operator TDataType.TEnum.TValue.Implicit(const A: TDataType.TEnum.TValue): TDataType.TValue; begin Result.Create(A.FEnumValue); end; { TDataType.TEnum } constructor TDataType.TEnum.Create(const AEnumType: IDataEnumType); begin FEnumType := AEnumType; end; function TDataType.TEnum.CreateValue(const AValue: Integer): TDataType.TEnum.TValue; begin Result.Create(FEnumType.CreateValue(AValue)); end; function TDataType.TEnum.CreateValue(const AIdentifier: string): TDataType.TEnum.TValue; var idx: Integer; begin idx := IndexOf(AIdentifier); if (idx < 0) then raise EArgumentException.CreateFmt('Unknown identifier: %s', [AIdentifier]); Result := CreateValue(idx); end; function TDataType.TEnum.GetIdentifier(Idx: Integer): string; begin Result := FEnumType.GetIdentifier(Idx); end; function TDataType.TEnum.GetIdentifierCount: Integer; begin Result := FEnumType.IdentifierCount; end; function TDataType.TEnum.IndexOf(const AIdentifier: string): Integer; begin Result := FEnumType.IndexOf(AIdentifier); end; class operator TDataType.TEnum.Implicit(const A: IDataEnumType): TDataType.TEnum; begin Result.FEnumType := A; end; class operator TDataType.TEnum.Implicit(const A: TDataType.TEnum): IDataEnumType; begin Result := A.FEnumType; end; { TDataType.TMethod.TValue } constructor TDataType.TMethod.TValue.Create(const AMethodValue: IDataMethodValue); begin FMethodValue := AMethodValue; end; function TDataType.TMethod.TValue.GetDataType: TDataType.TMethod; begin Result := IDataMethodType(FMethodValue.DataType); end; function TDataType.TMethod.TValue.GetValue: TDataMethodProc; begin Result := FMethodValue.Value; end; class operator TDataType.TMethod.TValue.Implicit(const A: IDataMethodValue): TDataType.TMethod.TValue; begin Result.FMethodValue := A; end; class operator TDataType.TMethod.TValue.Implicit(const A: TDataType.TMethod.TValue): IDataMethodValue; begin Result := A.FMethodValue; end; class operator TDataType.TMethod.TValue.Implicit(const A: TDataType.TMethod.TValue): TDataType.TValue; begin Result.Create(A.FMethodValue); end; { TDataType.TMethod } constructor TDataType.TMethod.Create(const AMethodType: IDataMethodType); begin FMethodType := AMethodType; end; function TDataType.TMethod.CreateValue(const Proc: TProc): TDataType.TMethod.TValue; begin if not Assigned(Proc) then raise EArgumentException.Create('Proc'); var cProc: TProc := Proc; Result.Create(FMethodType.CreateValue(function(const Value: IDataValue): IDataValue begin Result := cProc(Value); end)); end; function TDataType.TMethod.GetArgType: IDataType; begin Result := FMethodType.ArgType; end; function TDataType.TMethod.GetResultType: IDataType; begin Result := FMethodType.ResultType; end; class operator TDataType.TMethod.Implicit(const A: IDataMethodType): TDataType.TMethod; begin Result.FMethodType := A; end; class operator TDataType.TMethod.Implicit(const A: TDataType.TMethod): IDataMethodType; begin Result := A.FMethodType; end; { TDataType.TRecord.TValue } constructor TDataType.TRecord.TValue.Create(const ARecordValue: IDataRecordValue); begin FRecordValue := ARecordValue; end; function TDataType.TRecord.TValue.GetDataType: TDataType.TRecord; begin Result := IDataRecordType(FRecordValue.DataType); end; function TDataType.TRecord.TValue.GetItems(Idx: Integer): TDataType.TValue; begin Result.Create(FRecordValue.Items[Idx]); end; class operator TDataType.TRecord.TValue.Implicit(const A: IDataRecordValue): TDataType.TRecord.TValue; begin Result.FRecordValue := A; end; class operator TDataType.TRecord.TValue.Implicit(const A: TDataType.TRecord.TValue): IDataRecordValue; begin Result := A.FRecordValue; end; class operator TDataType.TRecord.TValue.Implicit(const A: TDataType.TRecord.TValue): TDataType.TValue; begin Result.Create(A.FRecordValue); end; { TDataType.TRecord } constructor TDataType.TRecord.Create(const ARecordType: IDataRecordType); begin FRecordType := ARecordType; end; function TDataType.TRecord.CreateValue(const AItems: array of IDataValue): TDataType.TRecord.TValue; begin Result.Create(FRecordType.CreateValue(AItems)); end; function TDataType.TRecord.GetField(Idx: Integer): TDataRecordField; begin Result := FRecordType.GetField(Idx); end; function TDataType.TRecord.GetFieldCount: Integer; begin Result := FRecordType.FieldCount; end; function TDataType.TRecord.IndexOf(const AName: string): Integer; begin Result := FRecordType.IndexOf(AName); end; class operator TDataType.TRecord.Implicit(const A: IDataRecordType): TDataType.TRecord; begin Result.FRecordType := A; end; class operator TDataType.TRecord.Implicit(const A: TDataType.TRecord): IDataRecordType; begin Result := A.FRecordType; end; { TDataType.TTuple.TValue } constructor TDataType.TTuple.TValue.Create(const ATupleValue: IDataTupleValue); begin FTupleValue := ATupleValue; end; function TDataType.TTuple.TValue.GetDataType: TDataType.TTuple; begin Result := IDataTupleType(FTupleValue.DataType); end; function TDataType.TTuple.TValue.GetItems(Idx: Integer): TDataType.TValue; begin Result.Create(FTupleValue.Items[Idx]); end; function TDataType.TTuple.TValue.GetItemCount: Integer; begin Result := FTupleValue.ItemCount; end; class operator TDataType.TTuple.TValue.Implicit(const A: IDataTupleValue): TDataType.TTuple.TValue; begin Result.FTupleValue := A; end; class operator TDataType.TTuple.TValue.Implicit(const A: TDataType.TTuple.TValue): IDataTupleValue; begin Result := A.FTupleValue; end; class operator TDataType.TTuple.TValue.Implicit(const A: TDataType.TTuple.TValue): TDataType.TValue; begin Result.Create(A.FTupleValue); end; { TDataType.TTuple } constructor TDataType.TTuple.Create(const ATupleType: IDataTupleType); begin FTupleType := ATupleType; end; function TDataType.TTuple.CreateValue(const AItems: array of IDataValue): TDataType.TTuple.TValue; begin Result.Create(FTupleType.CreateValue(AItems)); end; function TDataType.TTuple.GetItemCount: Integer; begin Result := FTupleType.ItemCount; end; function TDataType.TTuple.GetItemType(Idx: Integer): IDataType; begin Result := FTupleType.ItemType[Idx]; end; class operator TDataType.TTuple.Implicit(const A: IDataTupleType): TDataType.TTuple; begin Result.FTupleType := A; end; class operator TDataType.TTuple.Implicit(const A: TDataType.TTuple): IDataTupleType; begin Result := A.FTupleType; end; { TDataType.TArray.TValue } constructor TDataType.TArray.TValue.Create(const AArrayValue: IDataArrayValue); begin FArrayValue := AArrayValue; end; function TDataType.TArray.TValue.GetDataType: TDataType.TArray; begin Result := IDataArrayType(FArrayValue.DataType); end; function TDataType.TArray.TValue.GetElementCount: Integer; begin Result := FArrayValue.ElementCount; end; function TDataType.TArray.TValue.GetItems(Idx: Integer): TDataType.TValue; begin Result.Create(FArrayValue.Items[Idx]); end; class operator TDataType.TArray.TValue.Implicit(const A: IDataArrayValue): TDataType.TArray.TValue; begin Result.FArrayValue := A; end; class operator TDataType.TArray.TValue.Implicit(const A: TDataType.TArray.TValue): IDataArrayValue; begin Result := A.FArrayValue; end; class operator TDataType.TArray.TValue.Implicit(const A: TDataType.TArray.TValue): TDataType.TValue; begin Result.Create(A.FArrayValue); end; { TDataType.TArray } constructor TDataType.TArray.Create(const AArrayType: IDataArrayType); begin FArrayType := AArrayType; end; function TDataType.TArray.CreateValue(const AItems: array of IDataValue): TDataType.TArray.TValue; begin Result.Create(FArrayType.CreateValue(AItems)); end; function TDataType.TArray.GetElementType: IDataType; begin Result := FArrayType.ElementType; end; class operator TDataType.TArray.Implicit(const A: IDataArrayType): TDataType.TArray; begin Result.FArrayType := A; end; class operator TDataType.TArray.Implicit(const A: TDataType.TArray): IDataArrayType; begin Result := A.FArrayType; end; { TDataType.TVector.TValue } constructor TDataType.TVector.TValue.Create(const AVectorValue: IDataVectorValue); begin FVectorValue := AVectorValue; end; function TDataType.TVector.TValue.GetDataType: TDataType.TVector; begin Result := IDataVectorType(FVectorValue.DataType); end; function TDataType.TVector.TValue.GetElementCount: Integer; begin Result := FVectorValue.ElementCount; end; function TDataType.TVector.TValue.GetItems(Idx: Integer): TDataType.TValue; begin Result.Create(FVectorValue.Items[Idx]); end; class operator TDataType.TVector.TValue.Implicit(const A: IDataVectorValue): TDataType.TVector.TValue; begin Result.FVectorValue := A; end; class operator TDataType.TVector.TValue.Implicit(const A: TDataType.TVector.TValue): IDataVectorValue; begin Result := A.FVectorValue; end; class operator TDataType.TVector.TValue.Implicit(const A: TDataType.TVector.TValue): TDataType.TValue; begin Result.Create(A.FVectorValue); end; { TDataType.TVector } constructor TDataType.TVector.Create(const AVectorType: IDataVectorType); begin FVectorType := AVectorType; end; function TDataType.TVector.CreateValue(const AItems: array of IDataValue): TDataType.TVector.TValue; begin Result.Create(FVectorType.CreateValue(AItems)); end; function TDataType.TVector.GetElementCount: Integer; begin Result := FVectorType.ElementCount; end; function TDataType.TVector.GetElementType: IDataType; begin Result := FVectorType.ElementType; end; class operator TDataType.TVector.Implicit(const A: IDataVectorType): TDataType.TVector; begin Result.FVectorType := A; end; class operator TDataType.TVector.Implicit(const A: TDataType.TVector): IDataVectorType; begin Result := A.FVectorType; end; { TDataType } constructor TDataType.Create(const ADataType: IDataType); begin Assert(Assigned(ADataType)); FDataType := ADataType; end; class constructor TDataType.CreateClass; begin // Registries are now managed by their respective implementation units. end; class destructor TDataType.DestroyClass; begin // Registries are now managed by their respective implementation units. end; class function TDataType.ArrayOf(const AElementType: IDataType): TDataType.TArray; begin // The TImplDataArrayType now manages its own instances. Result.Create(TImplDataArrayType.GetInstance(AElementType)); end; class function TDataType.DecimalOf(const AScale: Integer): TDataType.TDecimal; begin // The TImplDataDecimalType now manages its own instances. Result.Create(TImplDataDecimalType.GetInstance(AScale)); end; class function TDataType.EnumOf(const AName: string; const AIdentifiers: array of string): TDataType.TEnum; begin Result.Create(TImplDataEnumType.Create(AName, AIdentifiers)); end; class function TDataType.Float: TDataType.TFloat; begin Result.Create(TImplDataFloatType.Singleton); end; function TDataType.GetKind: TDataKind; begin Result := FDataType.Kind; end; function TDataType.GetName: String; begin if Assigned(FDataType) then Result := FDataType.Name else Result := ''; end; class function TDataType.MethodOf(const AArgType, AResultType: IDataType): TDataType.TMethod; begin // The TImplDataMethodType now manages its own instances. Result.Create(TImplDataMethodType.GetInstance(AArgType, AResultType)); end; class function TDataType.Ordinal: TDataType.TOrdinal; begin Result.Create(TImplDataOrdinalType.Singleton); end; class function TDataType.RecordOf(const Fields: array of TDataRecordField): TDataType.TRecord; begin Result.Create(TImplDataRecordType.GetInstance(Fields)); end; class function TDataType.RecordOf: TDataType.TRecord; begin Result.Create(TImplDataRecordType.GetInstance); end; class function TDataType.Text: TDataType.TText; begin Result.Create(TImplDataTextType.Singleton); end; class function TDataType.Timestamp: TDataType.TTimestamp; begin Result.Create(TImplDataTimestampType.Singleton); end; class function TDataType.TupleOf(const AItemTypes: array of IDataType): TDataType.TTuple; var tItems: TArray; i: Integer; begin SetLength(tItems, Length(AItemTypes)); for i := 0 to High(AItemTypes) do tItems[i] := AItemTypes[i]; // Use the instance manager to get a tuple type for the given element types. Result.Create(TImplDataTupleType.GetInstance(tItems)); end; class function TDataType.TupleOf(const AItemValues: array of IDataValue): TDataType.TTuple.TValue; var tItems: TArray; i: Integer; begin SetLength(tItems, Length(AItemValues)); for i := 0 to High(AItemValues) do tItems[i] := AItemValues[i].DataType; var tTuple := TImplDataTupleType.GetInstance(tItems); Result := tTuple.CreateValue(AItemValues); end; class function TDataType.VectorOf(const AElementType: IDataType; const AElementCount: Integer): TDataType.TVector; begin // The TImplDataVectorType now manages its own instances. Result.Create(TImplDataVectorType.GetInstance(AElementType, AElementCount)); end; class function TDataType.Void: TDataType.TVoid; begin Result.Create(TImplDataVoidType.Singleton); end; class operator TDataType.Implicit(const A: TDataType): IDataType; begin Result := A.FDataType; end; class operator TDataType.Implicit(const A: IDataType): TDataType; begin Result.FDataType := A; end; class operator TDataType.Implicit(const A: TDataType.TArray): TDataType; begin Result.FDataType := A.FArrayType; end; class operator TDataType.Implicit(const A: TDataType.TVector): TDataType; begin Result.FDataType := A.FVectorType; end; class operator TDataType.Implicit(const A: TDataType.TDecimal): TDataType; begin Result.FDataType := A.FDecimalType; end; class operator TDataType.Implicit(const A: TDataType.TEnum): TDataType; begin Result.FDataType := A.FEnumType; end; class operator TDataType.Implicit(const A: TDataType.TFloat): TDataType; begin Result.FDataType := A.FFloatType; end; class operator TDataType.Implicit(const A: TDataType.TMethod): TDataType; begin Result.FDataType := A.FMethodType; end; class operator TDataType.Implicit(const A: TDataType.TOrdinal): TDataType; begin Result.FDataType := A.FOrdinalType; end; class operator TDataType.Implicit(const A: TDataType.TRecord): TDataType; begin Result.FDataType := A.FRecordType; end; class operator TDataType.Implicit(const A: TDataType.TText): TDataType; begin Result.FDataType := A.FTextType; end; class operator TDataType.Implicit(const A: TDataType.TTimestamp): TDataType; begin Result.FDataType := A.FTimestampType; end; class operator TDataType.Implicit(const A: TDataType.TTuple): TDataType; begin Result.FDataType := A.FTupleType; end; class operator TDataType.Implicit(const A: TDataType.TVoid): TDataType; begin Result.FDataType := A.FVoidType; end; { TDataType.TValue } constructor TDataType.TValue.Create(const ADataValue: IDataValue); begin Assert(Assigned(ADataValue)); FDataValue := ADataValue; end; function TDataType.TValue.GetDataType: IDataType; begin if Assigned(FDataValue) then Result := FDataValue.DataType else Result := nil; end; class operator TDataType.TValue.Implicit(const A: TDataType.TValue): IDataValue; begin Result := A.FDataValue; end; class operator TDataType.TValue.Implicit(const A: IDataValue): TDataType.TValue; 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; function TDataType.AsVector: TDataType.TVector; begin if (FDataType.Kind <> dkVector) then raise EInvalidCast.Create('Vector expected'); Result.Create(IDataVectorType(FDataType)); end; { TDataType.TValueHelper } function TDataType.TValueHelper.AsArray: TDataType.TArray.TValue; begin if (FDataValue.DataType.Kind <> dkArray) then raise EInvalidCast.Create('Array expected'); Result.Create(IDataArrayValue(FDataValue)); end; function TDataType.TValueHelper.AsDecimal: TDecimal.TValue; begin if (FDataValue.DataType.Kind <> dkDecimal) then raise EInvalidCast.Create('Decimal expected'); Result.Create(IDataDecimalValue(FDataValue)); end; function TDataType.TValueHelper.AsEnum: TDataType.TEnum.TValue; begin if (FDataValue.DataType.Kind <> dkEnum) then raise EInvalidCast.Create('Enum expected'); Result.Create(IDataEnumValue(FDataValue)); end; function TDataType.TValueHelper.AsFloat: TDataType.TFloat.TValue; begin if (FDataValue.DataType.Kind <> dkFloat) then raise EInvalidCast.Create('Float expected'); Result.Create(IDataFloatValue(FDataValue)); end; function TDataType.TValueHelper.AsMethod: TDataType.TMethod.TValue; begin if (FDataValue.DataType.Kind <> dkMethod) then raise EInvalidCast.Create('Method expected'); Result.Create(IDataMethodValue(FDataValue)); end; function TDataType.TValueHelper.AsOrdinal: TDataType.TOrdinal.TValue; begin if (FDataValue.DataType.Kind <> dkOrdinal) then raise EInvalidCast.Create('Ordinal expected'); Result.Create(IDataOrdinalValue(FDataValue)); end; function TDataType.TValueHelper.AsRecord: TDataType.TRecord.TValue; begin if (FDataValue.DataType.Kind <> dkRecord) then raise EInvalidCast.Create('Record expected'); Result.Create(IDataRecordValue(FDataValue)); end; function TDataType.TValueHelper.AsText: TDataType.TText.TValue; begin if (FDataValue.DataType.Kind <> dkText) then raise EInvalidCast.Create('Text expected'); Result.Create(IDataTextValue(FDataValue)); end; function TDataType.TValueHelper.AsTimestamp: TDataType.TTimestamp.TValue; begin if (FDataValue.DataType.Kind <> dkTimestamp) then raise EInvalidCast.Create('Timestamp expected'); Result.Create(IDataTimestampValue(FDataValue)); end; function TDataType.TValueHelper.AsTuple: TDataType.TTuple.TValue; begin if (FDataValue.DataType.Kind <> dkTuple) then raise EInvalidCast.Create('Tuple expected'); Result.Create(IDataTupleValue(FDataValue)); end; function TDataType.TValueHelper.AsVector: TDataType.TVector.TValue; begin if (FDataValue.DataType.Kind <> dkVector) then raise EInvalidCast.Create('Vector expected'); Result.Create(IDataVectorValue(FDataValue)); end; function TDataType.TValueHelper.AsVoid: TDataType.TVoid.TValue; begin if (FDataValue.DataType.Kind <> dkVoid) then raise EInvalidCast.Create('Void expected'); Result.Create(IDataVoidValue(FDataValue)); end; end.