For checking if it's a managed type you should use the IsManagedType
intrinsic.
You could also use it to implement the System.Move() for non-managed types.
The compiler only generates the appropriate code:

If IsManagedType(T) then
  // for loop
else
  // move

Best Regards
Nico

Bart via fpc-pascal <fpc-pascal@lists.freepascal.org> schrieb am Sa., 9.
Jan. 2021, 22:55:

> On Sat, Jan 9, 2021 at 8:14 PM Yuriy Sydorov via fpc-pascal
> <fpc-pascal@lists.freepascal.org> wrote:
>
> > > So, I'll use a for loop to copy the data.
> > >
> > > I assume that doing Arr[Index] := Default(T) will also finalize the
> > > element if that element ismanaged?
> >
> > For class object instances call Arr[Index].Free, for other managed types
> or records containing managed types
> > Finalize(Arr[Index]) should work.
>
> In the base class, is there a way to check wether Arr[Index] is an
> object instance or a managed type or a datatype containing a managed
> type?
> Now the for loop (I abandoned the use of Move) does something like this:
>   Arr[NewIndex] := Arr[OldIndex];  //do I have to finalize/free
> Arr[NewIndex] also in this case?
>   Arr[OldIndex] := Default(T);  //I understand this is not enough in those
> cases
>
> I could of course add an (empty) method FinalizeOrFreeElement(Elem:
> T); to the base class and call that inside the loop, but that feels a
> bit sloppy.
>
> --
> Bart
> _______________________________________________
> fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
> https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
>
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to