| 393 | } |
| 394 | |
| 395 | func (e *stringEncoder) encode(v reflect.Value, shape []int64) error { |
| 396 | if v.Kind() == reflect.String { |
| 397 | if err := binary.Write(e.offsets, nativeEndian, e.offset); err != nil { |
| 398 | return err |
| 399 | } |
| 400 | var ( |
| 401 | s = v.Interface().(string) |
| 402 | src = C.CString(s) |
| 403 | srcLen = C.size_t(len(s)) |
| 404 | dst = (*C.char)(unsafe.Pointer(&e.data[e.offset])) |
| 405 | dstLen = C.size_t(uint64(len(e.data)) - e.offset) |
| 406 | ) |
| 407 | e.offset += uint64(C.TF_StringEncode(src, srcLen, dst, dstLen, e.status.c)) |
| 408 | C.free(unsafe.Pointer(src)) |
| 409 | return e.status.Err() |
| 410 | } |
| 411 | |
| 412 | if v.Kind() == reflect.Slice { |
| 413 | expected := int(shape[0]) |
| 414 | if v.Len() != expected { |
| 415 | return fmt.Errorf("mismatched slice lengths: %d and %d", v.Len(), expected) |
| 416 | } |
| 417 | } |
| 418 | |
| 419 | subShape := shape[1:] |
| 420 | for i := 0; i < v.Len(); i++ { |
| 421 | if err := e.encode(v.Index(i), subShape); err != nil { |
| 422 | return err |
| 423 | } |
| 424 | } |
| 425 | return nil |
| 426 | } |
| 427 | |
| 428 | type stringDecoder struct { |
| 429 | offsets io.Reader |