func (o Op) IWrite(w *marshal.Writer) { w.Write(o.Field) if o.Op <= 7 { w.Write(o.Op) } else { w.Write(opmap[o.Op]) } switch v := o.Val.(type) { case uint32: w.Int8(4) w.Uint32(v) case uint64: w.Int8(8) w.Uint64(v) case int32: w.Int8(4) w.Int32(v) case int64: w.Int8(8) w.Int64(v) case []byte: w.Intvar(len(v)) w.Bytes(v) case string: w.Intvar(len(v)) w.String(v) default: val := reflect.ValueOf(v) wr := marshal.WriterFor(val.Type()) wr.WithSize(w, val, (*marshal.Writer).Intvar) } }
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 }