MCPcopy Create free account
hub / github.com/apache/fory / writeDataWithGenerics

Method writeDataWithGenerics

go/fory/slice.go:158–275  ·  view source on GitHub ↗
(ctx *WriteContext, value reflect.Value, hasGenerics bool)

Source from the content-addressed store, hash-verified

156}
157
158func (s *sliceSerializer) writeDataWithGenerics(ctx *WriteContext, value reflect.Value, hasGenerics bool) {
159 length := value.Len()
160 buf := ctx.Buffer()
161
162 // WriteData length
163 buf.WriteVarUint32(uint32(length))
164 if length == 0 {
165 return
166 }
167
168 elemType := s.type_.Elem()
169 elemTypeInfo, _ := ctx.TypeResolver().getTypeInfo(reflect.New(elemType).Elem(), false)
170 elemDeclared := hasGenerics
171 if elemDeclared && elemTypeInfo != nil && needsElemTypeInfo(TypeId(elemTypeInfo.TypeID)) {
172 elemDeclared = false
173 }
174
175 // Determine collection flags. User/ext elements still write TypeInfo so
176 // nested compatible struct readers can classify the element schema.
177 collectFlag := CollectionIsSameType
178 if elemDeclared {
179 collectFlag |= CollectionIsDeclElementType
180 }
181 hasNull := false
182 isPointerElem := elemType.Kind() == reflect.Ptr
183
184 // Check for null values first (only applicable for pointer element types)
185 if isPointerElem {
186 for i := 0; i < length; i++ {
187 elem := value.Index(i)
188 if elem.IsNil() {
189 hasNull = true
190 break
191 }
192 }
193 }
194
195 if hasNull {
196 collectFlag |= CollectionHasNull
197 }
198 trackRefs := ctx.TrackRef() && s.referencable
199 if trackRefs {
200 collectFlag |= CollectionTrackingRef
201 }
202 buf.WriteInt8(int8(collectFlag))
203
204 // Write element type info unless the element schema fully declares it.
205 if !elemDeclared {
206 ctx.TypeResolver().WriteTypeInfo(buf, elemTypeInfo, ctx.Err())
207 }
208
209 // WriteData elements
210 trackRefs = (collectFlag & CollectionTrackingRef) != 0
211 elemRefMode := RefModeNone
212 if trackRefs {
213 elemRefMode = RefModeTracking
214 }
215

Callers 2

WriteDataMethod · 0.95
WriteMethod · 0.95

Calls 15

needsElemTypeInfoFunction · 0.85
LenMethod · 0.80
KindMethod · 0.80
WriteMethod · 0.65
WriteDataMethod · 0.65
uint32Function · 0.50
TypeIdEnum · 0.50
int8Function · 0.50
BufferMethod · 0.45
WriteVarUint32Method · 0.45
getTypeInfoMethod · 0.45

Tested by

no test coverage detected