func (sw *TWriter) structWriter(w *marshal.Writer, v reflect.Value) { w.IntUint32(sw.structCnt(v)) flds := sw.Writer.Flds n := len(flds) if sw.Tail != NoTail { n -= 1 } for i := 0; i < n; i++ { fs := &flds[i] fs.WithSize(w, v.Field(fs.I), (*marshal.Writer).Intvar) } switch sw.Tail { case NoTail: case Tail: fs := &flds[n] fv := v.Field(n) l := fv.Len() for i := 0; i < l; i++ { val := fv.Index(i) fs.WithSize(w, val, (*marshal.Writer).Intvar) } case TailSplit: fs := &flds[n] fv := v.Field(n) l := fv.Len() fss := fs.TWriter.Flds fl := len(fss) for i := 0; i < l; i++ { str := fv.Index(i) for j := 0; j < fl; j++ { fss[i].WithSize(w, str.Field(i), (*marshal.Writer).Intvar) } } } }
func (s SelectReq) IWrite(w *marshal.Writer) { w.Uint32(s.Space) w.Uint32(s.Index) w.Uint32(s.Offset) cnt := CountKeys(s.Keys) if s.Limit >= 0 { w.Int32(s.Limit) } else if s.Limit == SelectN { w.Int32(int32(cnt)) } else { w.Int32(1<<31 - 1) } w.IntUint32(cnt) WriteKeys(w, s.Keys) }
func WriteTuple(w *marshal.Writer, i interface{}) { switch o := i.(type) { case nil: return case uint8: w.Uint32(1) w.Uint8(1) w.Uint8(o) case int8: w.Uint32(1) w.Uint8(1) w.Int8(o) case uint16: w.Uint32(1) w.Uint8(2) w.Uint16(o) case int16: w.Uint32(1) w.Uint8(2) w.Int16(o) case uint32: w.Uint32(1) w.Uint8(4) w.Uint32(o) case int32: w.Uint32(1) w.Uint8(4) w.Int32(o) case uint64: w.Uint32(1) w.Uint8(8) w.Uint64(o) case int64: w.Uint32(1) w.Uint8(8) w.Int64(o) case float32: w.Uint32(1) w.Uint8(4) w.Float32(o) case float64: w.Uint32(1) w.Uint8(8) w.Float64(o) case string: w.Uint32(1) w.Intvar(len(o)) w.String(o) case []byte: w.Uint32(1) w.Intvar(len(o)) w.Bytes(o) case []interface{}: w.IntUint32(len(o)) for _, v := range o { w.WriteWithSize(v, (*marshal.Writer).Intvar) } default: val := reflect.ValueOf(i) rt := val.Type() wr := writer(rt) wr.Write(w, val) } return }