authorgravatar for tgschultz@gmail.comtgschultz <tgschultz@gmail.com> 2018-12-09 20:52:16-06:00
committergravatar for tgschultz@gmail.comtgschultz <tgschultz@gmail.com> 2018-12-09 20:52:16-06:00
log1188da926ff4cddd5818d85d45b087f6207dfef9
tree839e4ef303dd468f29ae7dda5a386cd46b0c971d
parent8423bd423b7a8cf32246f9d27a400a2cf14ce770

Minor change to custom (de)serializer to allow them to be defined outside of the struct and aliased inside it. This will enable alternate generic serializers (i.e. one that follows pointers) on a struct-by-struct basis.


2 files changed, 10 insertions(+), 6 deletions(-)

std/io.zig+3-3
......@@ -1146,7 +1146,7 @@ pub fn Deserializer(endian: builtin.Endian, is_packed: bool, comptime Error: typ
11461146 const child_type_id = @typeId(C);
11471147
11481148 //custom deserializer: fn(self: *Self, deserializer: var) !void
1149 if (comptime trait.hasFn("deserialize")(C)) return ptr.deserialize(self);
1149 if (comptime trait.hasFn("deserialize")(C)) return C.deserialize(ptr, self);
11501150
11511151 if (comptime trait.isPacked(C) and !is_packed) {
11521152 var packed_deserializer = Deserializer(endian, true, Error).init(self.in_stream);
......@@ -1308,8 +1308,8 @@ pub fn Serializer(endian: builtin.Endian, is_packed: bool, comptime Error: type)
13081308 return;
13091309 }
13101310
1311 //custom serializer: fn(self: *const Self, serializer: var) !void
1312 if (comptime trait.hasFn("serialize")(T)) return value.serialize(self);
1311 //custom serializer: fn(self: Self, serializer: var) !void
1312 if (comptime trait.hasFn("serialize")(T)) return T.serialize(value, self);
13131313
13141314 if (comptime trait.isPacked(T) and !is_packed) {
13151315 var packed_serializer = Serializer(endian, true, Error).init(self.out_stream);
std/io_test.zig+7-3
......@@ -416,6 +416,10 @@ test "Serializer/Deserializer Int: Inf/NaN" {
416416 try testIntSerializerDeserializerInfNaN(builtin.Endian.Little, true);
417417}
418418
419fn testAlternateSerializer(self: var, serializer: var) !void {
420 try serializer.serialize(self.f_f16);
421}
422
419423fn testSerializerDeserializer(comptime endian: builtin.Endian, comptime is_packed: bool) !void {
420424 const ColorType = enum(u4) {
421425 RGB8 = 1,
......@@ -448,6 +452,8 @@ fn testSerializerDeserializer(comptime endian: builtin.Endian, comptime is_packe
448452 f_u2: u2,
449453 };
450454
455
456
451457 //to test custom serialization
452458 const Custom = struct {
453459 f_f16: f16,
......@@ -458,9 +464,7 @@ fn testSerializerDeserializer(comptime endian: builtin.Endian, comptime is_packe
458464 self.f_unused_u32 = 47;
459465 }
460466
461 pub fn serialize(self: *const @This(), serializer: var) !void {
462 try serializer.serialize(self.f_f16);
463 }
467 pub const serialize = testAlternateSerializer;
464468 };
465469
466470 const MyStruct = struct {