Templates, D way
Void-995 via Digitalmars-d
digitalmars-d at puremagic.com
Tue Sep 5 05:54:20 PDT 2017
On Tuesday, 5 September 2017 at 12:20:14 UTC, crimaniak wrote:
> On Tuesday, 5 September 2017 at 11:08:57 UTC, Void-995 wrote:
>> @property mixin(DataList!("firstSublist",
>> MyBinarySubStructAForA, firstSublistMembersCount,
>> firstSublistMembersOffset));
> I don't think string mixins are required here. It seems just
> template is more simple.
>
> T[] getBytesAs(T, alias length, alias offset)()
> {
> return (cast(T *)(cast(byte *)(&this) + offset))[0 ..
> length];
> }
>
> struct MyBinaryStructA
> {
> ...
> alias firstList = getBytesAs!(MyBinarySubStructAForA,
> firstSublistMembersCount, firstSublistMembersOffset);
> alias secondList = getBytesAs!(MyBinarySubStructBForA,
> secondSublistMembersCount, secondSublistMembersOffset);
> }
>
> unittest
> {
> ...
> MyBinaryStructA *binaryData = cast(MyBinaryStructA
> *)fileData.ptr;
>
> auto a = binaryData.firstList;
> }
Thanks, that definitely working and doesn't require mixin with
strings. But while waiting for response I've tried another thing,
and I doubt I would able do to that without string now:
template MyBinaryStructGenericDataList(string listName, alias
Type)
{
import std.string;
const char[] MyBinaryStructGenericDataList = format(q{
int %sCount;
int %sOffset;
@property %s[] %s() const
{
return (cast(%s *)(cast(ubyte *)(&this) + %sOffset))[0 ..
%sCount];
}
}, listName, listName, Type.stringof, listName, Type.stringof,
listName, listName);
}
struct MyBinarySubStructAForA
{
int someIntegerFieldA;
float someFloatFieldA;
}
struct MyBinarySubStructBForA
{
int someIntegerFieldB;
float someFloatFieldB;
}
struct MyBinaryStructA
{
mixin(MyBinaryStructGenericDataList!("firstSublist",
MyBinarySubStructAForA));
mixin(MyBinaryStructGenericDataList!("secondSublist",
MyBinarySubStructBForA));
}
...
MyBinaryStructA *binaryData = cast(MyBinaryStructA *)fileData.ptr;
...
More information about the Digitalmars-d
mailing list