[fpc-pascal] FPC Advanced Records

Sven Barth pascaldragon at googlemail.com
Sat Mar 10 09:31:34 CET 2012


Am 09.03.2012 23:26, schrieb Mark Morgan Lloyd:
> Martin wrote:
>> On 09/03/2012 21:26, Mark Morgan Lloyd wrote:
>>>
>>> but is there any way to define something like an
>>> endianness-correcting type, i.e.:
>>>
>>> Type TAWSHeader=Record
>>> ThisSize: WordLE;
>>> ..
>>>
>>> where by the time ThisSize is accessed any disparity has been corrected?
>>>
>>
>> Not sure if this will be of any use.
>>
>> but you can always define an assignment incompatible type
>> WordLE = record data: Word; end;
>>
>> and define all required overloaded operators
>
> I think that could be of a lot of use, but I'll need to tinker :-)
>
> Noted your example, but apart from that is there any concise way to
> define a type such as WordLE with the explicit restriction that it
> requires an explicit definition of assignment operators (i.e. is never
> subject to implicit casts or type conversions)? Can this be done such
> that WordLE has a predefined size even if the assignment has to go via
> code?
>

You could play around with a construct like the following:

type
   generic TMyLEType<T> = record
     Data: T;
     class operator := (aRight: TMyLEType): TMyLEType;
     class operator := (aRight: TMyLEType): T;
   end;

   TWordLE = specialize TMyLEType<Word>;
   TLongWordLE = specialize TMyLEType<LongWord>;
   // ...

class operator TMyLEType.:= (aRight: TMyLEType): TMyLEType;
begin
   Result.Data := aRight.Data
end;

class operator TMyLEType.:= (aRight: TMyLEType): T;
begin
   // convert the value to the correct endianess here
   // you might want to use SizeOf(T) for a determination of the
   // correct size of T, so you can swap correctly
end;

Regards,
Sven



More information about the fpc-pascal mailing list