void encode (Encoder encoder, T value, int offset, int depth)
override
@override void encode(Encoder encoder, T value, int offset, int depth) { final unknownDataMap = value.$unknownData; // Determining max index int maxIndex = -1; for (int i = 0; i < members.length; i++) { final field = value.$field(i); if (field != null) { maxIndex = i; } } if (unknownDataMap != null) { // Update the max index based on the table's unknown fields. The unknown // data map is keyed by ordinal, not index, so subtract by one. maxIndex = max(maxIndex, unknownDataMap.keys.fold(0, max) - 1); } int maxOrdinal = maxIndex + 1; // Header. encoder ..encodeUint64(maxOrdinal, offset) ..encodeUint64(kAllocPresent, offset + 8); // Sizing int envelopeOffset = encoder.alloc(maxOrdinal * envelopeSize(encoder.wireFormat), depth); // Envelopes, and fields. for (int i = 0; i <= maxIndex; i++) { var field = value.$field(i); FidlType? fieldType; if (i < members.length) { fieldType = members[i]; } if (fieldType == null && unknownDataMap != null) { // .$field is accessed by index, whereas the unknown data map is // accessed by ordinal final unknownData = unknownDataMap[i + 1]; if (unknownData != null) { _maybeThrowOnUnknownHandles(resource, unknownData); field = unknownData; fieldType = UnknownRawDataType( numBytes: unknownData.data.length, numHandles: unknownData.handles.length); } } if (field != null && fieldType != null) { _encodeEnvelopePresent( encoder, envelopeOffset, depth + 1, field, fieldType); } else { _encodeEnvelopeAbsent(encoder, envelopeOffset); } envelopeOffset += envelopeSize(encoder.wireFormat); } }