Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-pascal / 2017-04

Can class function used in specialized class use intristic functions Low, High with generic type ?

5 messages · 3 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

LacaK

Hi *,

I have some generic class:

generic T2DNumericArray<T> = object(specialize T2DArray<T>)
     public
       class function Truncate(Value: double): T; inline;
       ...

In class function Truncate I want check if supplied Value is in range of T. T will be always ordinal type (byte, integer) ... (I know this, but compiler does not of course)

Can I use in :

class function T2DNumericArray.Truncate(Value: double): T;
begin
   if Value > High(T) then
     Result := High(T)
   else if Value < Low(T) then
     Result := Low(T)
   else
     Result := Value;
end;

I understand, that from compiler POV T can be any type, so High() and Low() can be invalid, but I wonder if there is any way how to solve this.

Thanks

-Laco.

Sven Barth
to LacaK
"LacaK" wrote 11 lines
Hi *, I have some generic class: generic T2DNumericArray<T> = object(specialize T2DArray<T>) public class function Truncate(Value: double): T; inline; ... In class function Truncate I want check if supplied Value is in range of

T.

T will be always ordinal type (byte, integer) ... (I know this, but

compiler does not of course)

Show quoted text 14 lines
Can I use in : class function T2DNumericArray.Truncate(Value: double): T; begin if Value > High(T) then Result := High(T) else if Value < Low(T) then Result := Low(T) else Result := Value; end; I understand, that from compiler POV T can be any type, so High() and

Low() can be invalid, but I wonder if there is any way how to solve this.

The compiler will use dummy values while parsing the generic, but during specialization it will use the correct ones. Though it might be that you'd need 3.1.1 for it (dont know right now when I had fixed that).

Regards,
Sven

Cyrax
to Sven Barth
Sven Barth wrote 44 lines
Am 20.04.2017 13:02 schrieb "LacaK" : > > Hi *, > > I have some generic class: > > generic T2DNumericArray<T> = object(specialize T2DArray<T>) > public > class function Truncate(Value: double): T; inline; > ... > > In class function Truncate I want check if supplied Value is in range of T. > T will be always ordinal type (byte, integer) ... (I know this, but compiler does not of course) > > Can I use in : > > class function T2DNumericArray.Truncate(Value: double): T; > begin > if Value > High(T) then > Result := High(T) > else if Value < Low(T) then > Result := Low(T) > else > Result := Value; > end; > > I understand, that from compiler POV T can be any type, so High() and Low() can be invalid, but I wonder if there is any way how to solve this. The compiler will use dummy values while parsing the generic, but during specialization it will use the correct ones. Though it might be that you'd need 3.1.1 for it (dont know right now when I had fixed that). Regards, Sven _______________________________________________ fpc-pascal maillist - http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

I think that this was the bug report and which you did fix back then : <url:http://bugs.freepascal.org/view.php?id=28832>

LacaK
to Sven Barth: T. compiler does not of course) Low() can be invalid, but I wonder if there is any way…
Show quoted text 33 lines
> > I have some generic class: > > generic T2DNumericArray<T> = object(specialize T2DArray<T>) > public > class function Truncate(Value: double): T; inline; > ... > > In class function Truncate I want check if supplied Value is in range of T. > T will be always ordinal type (byte, integer) ... (I know this, but compiler does not of course) > > Can I use in : > > class function T2DNumericArray.Truncate(Value: double): T; > begin > if Value > High(T) then > Result := High(T) > else if Value < Low(T) then > Result := Low(T) > else > Result := Value; > end; > > I understand, that from compiler POV T can be any type, so High() and Low() can be invalid, but I wonder if there is any way how to solve this. The compiler will use dummy values while parsing the generic, but during specialization it will use the correct ones. Though it might be that you'd need 3.1.1 for it (dont know right now when I had fixed that).

Yes, I can confirm, that in 3.1.1 it works, in 3.0.2 does not. Thank you Sven

-Laco.