Skip to content

Commit

Permalink
Merge pull request #40 from shoo/enh_bindat
Browse files Browse the repository at this point in the history
Enhancement of bindat for Endata of no-data member
  • Loading branch information
shoo committed Nov 30, 2023
2 parents 5a0c382 + 9818c3c commit d2f457f
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 20 deletions.
41 changes: 27 additions & 14 deletions voile/bindat.d
Original file line number Diff line number Diff line change
Expand Up @@ -790,25 +790,32 @@ if (isInputBinary!InputRange && is(T == struct))
// データ内容の記録
switch (tmptag)
{
static foreach (tag; memberTags!T)
static foreach (tag; allTags!T)
{
case tag:
import std.conv;
static if (isBasicType!(TypeFromTag!(T, tag)))
static if (isAvailableTag!(T, tag))
{
enum tagName = tag.to!string;
enum endian = getEndian!(__traits(getMember, Tag, tagName));
alias Type = TypeFromTag!(T, tag);
Type tmpdat;
tmpdat.deserializeFromBinDat!endian(r);
dst.initialize!tag(tmpdat);
import std.conv;
static if (isBasicType!(TypeFromTag!(T, tag)))
{
enum tagName = tag.to!string;
enum endian = getEndian!(__traits(getMember, Tag, tagName));
alias Type = TypeFromTag!(T, tag);
Type tmpdat;
tmpdat.deserializeFromBinDat!endian(r);
dst.initialize!tag(tmpdat);
}
else
{
alias Type = TypeFromTag!(T, tag);
Type tmpdat;
tmpdat.deserializeFromBinDat(r);
dst.initialize!tag(tmpdat);
}
}
else
{
alias Type = TypeFromTag!(T, tag);
Type tmpdat;
tmpdat.deserializeFromBinDat(r);
dst.initialize!tag(tmpdat);
dst.initialize!tag();
}
return;
}
Expand Down Expand Up @@ -963,7 +970,8 @@ if (isInputBinary!InputRange)
@littleEndian enum A: short
{
@bigEndian @data!int a,
@littleEndian @data!short b
@littleEndian @data!short b,
c
}
Endata!A a;
a.deserializeFromBinDat(bin!(0x00, 0x00, 0x00, 0x00, 0x00, 0x0a));
Expand All @@ -974,6 +982,11 @@ if (isInputBinary!InputRange)
a.deserializeFromBinDat(bin!(0x01, 0x00, 0x0b, 0x00));
tmp.b = 11;
assert(a == tmp);

a.deserializeFromBinDat(bin!(0x02, 0x00));
tmp.initialize!(A.c);
assert(a == tmp);
assert(tmp.serializeToBinDat() == bin!(0x02, 0x00));
}

/// Proxy
Expand Down
21 changes: 15 additions & 6 deletions voile/munion.d
Original file line number Diff line number Diff line change
Expand Up @@ -731,13 +731,19 @@ if (is(E == enum))
{
switch (__traits(getMember, this, uniqueMemberName!E)._impl._tag)
{
static foreach (i; 0..__traits(getMember, this, uniqueMemberName!E)._impl.MemberTypes.length)
static foreach (e; EnumMembers!(EndataImpl!E.TagType))
{
case __traits(getMember, this, uniqueMemberName!E)._impl.getTag!i:
return __traits(getMember, this, uniqueMemberName!E)._impl.getTag!i
== __traits(getMember, rhs, uniqueMemberName!E)._impl._tag
&& __traits(getMember, this, uniqueMemberName!E)._impl._inst.tupleof[i]
== __traits(getMember, rhs, uniqueMemberName!E)._impl._inst.tupleof[i];
case e:
static if (EndataImpl!E._impl.getIndex!e != cast(EndataImpl!E._impl.IndexType)EndataImpl!E._impl.notfoundTag)
{
return e == __traits(getMember, rhs, uniqueMemberName!E)._impl._tag
&& __traits(getMember, this, uniqueMemberName!E)._impl._inst.tupleof[EndataImpl!E._impl.getIndex!e]
== __traits(getMember, rhs, uniqueMemberName!E)._impl._inst.tupleof[EndataImpl!E._impl.getIndex!e];
}
else
{
return e == __traits(getMember, rhs, uniqueMemberName!E)._impl._tag;
}
}
default:
return false;
Expand Down Expand Up @@ -1082,6 +1088,9 @@ if (isManagedUnion!MU)
}();
}

/// ditto
enum allTags(MU) = EnumMembers!(ImplOf!MU.TagType);

/// ditto
template EnumMemberTags(MU)
if (isManagedUnion!MU)
Expand Down

0 comments on commit d2f457f

Please sign in to comment.