I’d like to know if there is a solution to the problem of indexing into records 
using [] properties.

In the example below I have an array of records (a dynamic array for the 
example) and I’d like to use the [] property to index into the values. The 
problem is because the array holds records I need to return a pointer to the 
record so I can access the fields. In the end the only problem is I need to 
dereference the pointer using ^.

Are there any solutions we could propose to this? Some ideas:

1) I looks like we could have a “var” modifier for function results but that 
concept has only ever existed in function params (like & in C++).

        function GetValue(i: integer): TVec2; var;

2) Maybe a modifier added to GetValue which tells the compiler to call the 
function (and result) like a pointer when the indexer is used?

====================================

type
        TVec2 = record
                x, y: integer;
        end;
        TVec2Ptr = ^TVec2;
        TVec2Array = array of TVec2;

type
        TVecArray = class
                values: TVec2Array;
                function GetValue(i: integer): TVec2Ptr;
                procedure Resize(newLength: integer);
                property Indexer[i: integer]: TVec2Ptr read GetValue; default;
        end;


function TVecArray.GetValue(i: integer): TVec2Ptr;
begin
        result := @values[i];
end;

procedure TVecArray.Resize(newLength: integer);
begin
        SetLength(values, newLength);
end;

var
        arr: TVecArray;
begin
        arr := TVecArray.Create;
        arr.Resize(1);
        arr[0]^.x := 100;
        arr[0]^.y := 100;
end.

Regards,
        Ryan Joseph

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to