For example, consider the following code, that implements a generic "memcpy"-style procedure using a static advanced-record method:
program Example; {$mode Delphi} type TMem<T> = record public type PT = ^T; public class procedure Copy(Dest: PT; Src: PT; Len: PtrUInt); static; inline; end; class procedure TMem<T>.Copy(Dest: PT; Src: PT; Len: PtrUInt); begin while Len > 0 do begin Dest^ := Src^; Inc(Dest); Inc(Src); Dec(Len); end; end; type String4 = String[4]; var X: TArray<String4> = ['AAAA', 'BBBB', 'CCCC', 'DDDD', 'EEEE']; Y: TArray<String4> = ['', '', '', '', '']; S: String4; begin TMem<String4>.Copy(@Y[0], @X[0], 5); for S in Y do WriteLn(S); end. The only reason the record is necessary at all is to be able to declare "PT" as a pointer type alias to the record's overall "T". Personally, I'd much rather simply write the following, if it was possible: procedure MemCopy<T>(Dest: ^T; Src: ^T; Len: PtrUInt); begin while Len > 0 do begin Dest^ := Src^; Inc(Dest); Inc(Src); Dec(Len); end; end; Of course, currently that's not valid code. This kind of thing is useful for more than just generics, also: it would be just as applicable to non-generic records, primitive types, e.t.c. Surely I can't be the only one who has ever wanted to use a "typed pointer" without first having to declare a named alias. So I guess my questions are: A) How feasible is this to implement? B) Is there a specific reason is has *not* been implemented previously? (Seems unlikely)
_______________________________________________ fpc-devel maillist - fpc-devel@lists.freepascal.org http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel