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
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to