diff --git a/voile/bindat.d b/voile/bindat.d index c4f2925..935b744 100644 --- a/voile/bindat.d +++ b/voile/bindat.d @@ -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; } @@ -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)); @@ -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 diff --git a/voile/munion.d b/voile/munion.d index 57fe167..f570f71 100644 --- a/voile/munion.d +++ b/voile/munion.d @@ -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; @@ -1082,6 +1088,9 @@ if (isManagedUnion!MU) }(); } +/// ditto +enum allTags(MU) = EnumMembers!(ImplOf!MU.TagType); + /// ditto template EnumMemberTags(MU) if (isManagedUnion!MU)