Jump to content

Eugine Savin

Members
  • Content Count

    19
  • Joined

  • Last visited

Everything posted by Eugine Savin

  1. You can do it without TValue if TypeInfo(T) = TypeInfo(Integer) then PInteger(@Result)^ := 10 else if TypeInfo(T) = TypeInfo(string) then PString(@Result)^ := 'Hello'
  2. Eugine Savin

    Create a new instance of a generic class

    Ha, delphi 10.4 has a bug here. type iSomeInterface<T> = interface end; Type tSomeclass<T:iInterface>=CLass (tInterfacedObject, iSomeInterface<T>) Constructor Create(s: string); Function CreateNewInstance:iSomeInterface<T>; end; Function tSomeclass<T>.CreateNewInstance:iSomeInterface<T>; type TSelfClass = tSomeclass<T>; TSomeClassType = class of TSelfClass; // !!!!!!!!!!!! [dcc32 Error] Unit9.pas(36): E2021 Class type required begin result:=TSomeClassType(Self.Classtype).Create('s'); //Does not compile end;
  3. Eugine Savin

    constant records

    cCircleZero: TCircle = (C: (x: 0; y: 0); Radius: 0.0);
  4. Eugine Savin

    Is it bug? (type inference)

    Current output is 'ne', I think, it's a bug. If I explicitly set type of variable B to Currency - output will be 'eq' as expected. I use Delphi 10.4 (also please check this code in Delphi 11) program Project3; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; function GetCurrency: Currency; begin Result := 8.52; end; var A: Currency; begin A := GetCurrency; //var B: Currency := GetCurrency(); // 1 var B := GetCurrency(); // 2 if A = B then WriteLn('eq') else WriteLn('ne'); ReadLn; end.
  5. if I pass set type into MyGenericMethod<T: record> - I get compile type error [dcc32 Error] Project2.dpr(28): E2512 Type parameter 'T' must be a non-nullable value type Is it OK or compiler bug ?? program Project2; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; type TMyEnum = (en1); TMySet = set of TMyEnum; type TTestClass = class class procedure MyGenericMethod<T: record>; end; class procedure TTestClass.MyGenericMethod<T>; begin // end; begin try { TODO -oUser -cConsole Main : Insert code here } TTestClass.MyGenericMethod<TMySet>(); except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end.
  6. Eugine Savin

    Is set a nullable type? (record constraint)

    Oh, sorry, my fault, I believe that I have similar code but it does not have generic constraints. Perhaps I ran into this issue earlier, but forgot about it
  7. Eugine Savin

    Is set a nullable type? (record constraint)

    As least Delphi Tokio compiles this code successfully
  8. Eugine Savin

    Generic Drawing Engine

    class function TNumbers.FromInteger<T>(AValue: Integer): T; type PSingle = ^Single; begin if TypeInfo(T) = TypeInfo(Single) then PSingle(@Result)^ := AValue else if TypeInfo(T) = TypeInfo(Integer) then PInteger(@Result)^ := AValue else raise Exception.Create('Error Message'); end;
  9. Eugine Savin

    Generic Drawing Engine

    type TNumbers = class public class function One<T>: T; end; { TNumbers } const OneSingle: Single = 1; OneInteger: Integer = 1; class function TNumbers.One<T>: T; type PT = ^T; begin if TypeInfo(T) = TypeInfo(Single) then Result := PT(@OneSingle)^ else if TypeInfo(T) = TypeInfo(Integer) then Result := PT(@OneInteger)^ else raise Exception.Create('Error Message'); end; ... FPen.Width := TNumbers.One<T>;
  10. https://bitbucket.org/sglienke/spring4d/src/ffee3360a2e8cb9ae5311621a745bb9ed809870f/Source/Base/Spring.pas#lines-956 ?
  11. Eugine Savin

    Generic class

    This shouldn't work. Make method Test virtual and override it in Test2
  12. Simple question, why "Multiply" operator works, and "Equal" does not. compiler give error "[dcc32 Error] Project1.dpr(33): E2015 Operator not applicable to this operand type" program Project1; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; type TMyRecord2 = record public class operator Equal(const a: TMyRecord2; const b: array of Integer): boolean; class operator Multiply(const a: TMyRecord2; const b: array of Integer): TMyRecord2; end; class operator TMyRecord2.Equal(const a: TMyRecord2; const b: array of Integer): boolean; begin Result := True; end; class operator TMyRecord2.Multiply(const a: TMyRecord2; const b: array of Integer): TMyRecord2; begin Result := a; end; var b: boolean; r: TMyRecord2; begin try r := r * [10]; // this line is compiled b := r = [10]; // this line is not compiled except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end.
  13. Eugine Savin

    operator overloding Equal vs Multiply

    In C++ there is not differences between functions and overloaded operators. struct MyArray { public: template <std::size_t N> bool operator==(int (&rhs)[N]) { std::cout << N << '\n'; return true; } }; int main() { // your code goes here int arr1 [1] = {0}; int arr2 [2] = {0, 0}; MyArray myArr; if (myArr == arr1 && myArr == arr2) {} return 0; } Can you explain why you allow operators with dyn arrays, and do not allow ones with open arrays ?
  14. Eugine Savin

    operator overloding Equal vs Multiply

    TMyArray = record .. end; const Arr1: array[0..1] of Integer = (..) const Arr2: array[0..2] of Integer = (..) var MyArray: TMyArray .. I wanna have ability to compare if (MyArray == Arr1) or (MyArray = Arr2).. How can I get it without open arrays as operator parameters ?
  15. Eugine Savin

    operator overloding Equal vs Multiply

    What's problems with open arrays ? Anyway if I replace "array of Integer" by "TArray<Double>" r * [10.0] - compiled, but r = [10.0] is not ( E2001 Ordinal type required) // qc link https://quality.embarcadero.com/browse/RSP-23498
  16. Eugine Savin

    operator overloding Equal vs Multiply

    And main question, why r := r * [10] // here [10] is array and b := r = [10] // here [10] is set what's difference ??
  17. Eugine Savin

    operator overloding Equal vs Multiply

    Well, where is not "set of Integer", but code var i: Integer; begin i := 10; b := r = [i]; end is not compiled
×