encode.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730
  1. // Copyright (c) 2012, 2013 Ugorji Nwoke. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license found in the LICENSE file.
  3. package codec
  4. import (
  5. //"bufio"
  6. "io"
  7. "reflect"
  8. //"fmt"
  9. )
  10. //var _ = fmt.Printf
  11. const (
  12. // Some tagging information for error messages.
  13. msgTagEnc = "codec.encoder"
  14. defEncByteBufSize = 1 << 6 // 4:16, 6:64, 8:256, 10:1024
  15. // maxTimeSecs32 = math.MaxInt32 / 60 / 24 / 366
  16. )
  17. // encWriter abstracting writing to a byte array or to an io.Writer.
  18. type encWriter interface {
  19. writeUint16(uint16)
  20. writeUint32(uint32)
  21. writeUint64(uint64)
  22. writeb([]byte)
  23. writestr(string)
  24. writen1(byte)
  25. writen2(byte, byte)
  26. atEndOfEncode()
  27. }
  28. // encDriver abstracts the actual codec (binc vs msgpack, etc)
  29. type encDriver interface {
  30. isBuiltinType(rt uintptr) bool
  31. encodeBuiltinType(rt uintptr, rv reflect.Value)
  32. encodeNil()
  33. encodeInt(i int64)
  34. encodeUint(i uint64)
  35. encodeBool(b bool)
  36. encodeFloat32(f float32)
  37. encodeFloat64(f float64)
  38. encodeExtPreamble(xtag byte, length int)
  39. encodeArrayPreamble(length int)
  40. encodeMapPreamble(length int)
  41. encodeString(c charEncoding, v string)
  42. encodeSymbol(v string)
  43. encodeStringBytes(c charEncoding, v []byte)
  44. //TODO
  45. //encBignum(f *big.Int)
  46. //encStringRunes(c charEncoding, v []rune)
  47. }
  48. // encodeHandleI is the interface that the encode functions need.
  49. type encodeHandleI interface {
  50. getEncodeExt(rt uintptr) (tag byte, fn func(reflect.Value) ([]byte, error))
  51. writeExt() bool
  52. structToArray() bool
  53. }
  54. type encFnInfo struct {
  55. sis *typeInfo
  56. e *Encoder
  57. ee encDriver
  58. rt reflect.Type
  59. rtid uintptr
  60. xfFn func(reflect.Value) ([]byte, error)
  61. xfTag byte
  62. }
  63. // encFn encapsulates the captured variables and the encode function.
  64. // This way, we only do some calculations one times, and pass to the
  65. // code block that should be called (encapsulated in a function)
  66. // instead of executing the checks every time.
  67. type encFn struct {
  68. i *encFnInfo
  69. f func(*encFnInfo, reflect.Value)
  70. }
  71. // An Encoder writes an object to an output stream in the codec format.
  72. type Encoder struct {
  73. w encWriter
  74. e encDriver
  75. h encodeHandleI
  76. f map[uintptr]encFn
  77. x []uintptr
  78. s []encFn
  79. }
  80. type ioEncWriterWriter interface {
  81. WriteByte(c byte) error
  82. WriteString(s string) (n int, err error)
  83. Write(p []byte) (n int, err error)
  84. }
  85. type ioEncStringWriter interface {
  86. WriteString(s string) (n int, err error)
  87. }
  88. type simpleIoEncWriterWriter struct {
  89. w io.Writer
  90. bw io.ByteWriter
  91. sw ioEncStringWriter
  92. }
  93. // ioEncWriter implements encWriter and can write to an io.Writer implementation
  94. type ioEncWriter struct {
  95. w ioEncWriterWriter
  96. x [8]byte // temp byte array re-used internally for efficiency
  97. }
  98. // bytesEncWriter implements encWriter and can write to an byte slice.
  99. // It is used by Marshal function.
  100. type bytesEncWriter struct {
  101. b []byte
  102. c int // cursor
  103. out *[]byte // write out on atEndOfEncode
  104. }
  105. type EncodeOptions struct {
  106. // Encode a struct as an array, and not as a map.
  107. StructToArray bool
  108. }
  109. func (o *simpleIoEncWriterWriter) WriteByte(c byte) (err error) {
  110. if o.bw != nil {
  111. return o.bw.WriteByte(c)
  112. }
  113. _, err = o.w.Write([]byte{c})
  114. return
  115. }
  116. func (o *simpleIoEncWriterWriter) WriteString(s string) (n int, err error) {
  117. if o.sw != nil {
  118. return o.sw.WriteString(s)
  119. }
  120. return o.w.Write([]byte(s))
  121. }
  122. func (o *simpleIoEncWriterWriter) Write(p []byte) (n int, err error) {
  123. return o.w.Write(p)
  124. }
  125. func (o *EncodeOptions) structToArray() bool {
  126. return o.StructToArray
  127. }
  128. func (f *encFnInfo) builtin(rv reflect.Value) {
  129. for j, k := int8(0), f.sis.baseIndir; j < k; j++ {
  130. rv = rv.Elem()
  131. }
  132. f.ee.encodeBuiltinType(f.sis.baseId, rv)
  133. }
  134. func (f *encFnInfo) rawExt(rv reflect.Value) {
  135. for j, k := int8(0), f.sis.baseIndir; j < k; j++ {
  136. rv = rv.Elem()
  137. }
  138. re := rv.Interface().(RawExt)
  139. if re.Data == nil {
  140. f.ee.encodeNil()
  141. return
  142. }
  143. if f.e.h.writeExt() {
  144. f.ee.encodeExtPreamble(re.Tag, len(re.Data))
  145. f.e.w.writeb(re.Data)
  146. } else {
  147. f.ee.encodeStringBytes(c_RAW, re.Data)
  148. }
  149. }
  150. func (f *encFnInfo) ext(rv reflect.Value) {
  151. for j, k := int8(0), f.sis.baseIndir; j < k; j++ {
  152. rv = rv.Elem()
  153. }
  154. bs, fnerr := f.xfFn(rv)
  155. if fnerr != nil {
  156. panic(fnerr)
  157. }
  158. if bs == nil {
  159. f.ee.encodeNil()
  160. return
  161. }
  162. if f.e.h.writeExt() {
  163. f.ee.encodeExtPreamble(f.xfTag, len(bs))
  164. f.e.w.writeb(bs)
  165. } else {
  166. f.ee.encodeStringBytes(c_RAW, bs)
  167. }
  168. }
  169. func (f *encFnInfo) binaryMarshal(rv reflect.Value) {
  170. var bm binaryMarshaler
  171. if f.sis.mIndir == 0 {
  172. bm = rv.Interface().(binaryMarshaler)
  173. } else if f.sis.mIndir == -1 {
  174. bm = rv.Addr().Interface().(binaryMarshaler)
  175. } else {
  176. for j, k := int8(0), f.sis.mIndir; j < k; j++ {
  177. rv = rv.Elem()
  178. }
  179. bm = rv.Interface().(binaryMarshaler)
  180. }
  181. // debugf(">>>> binaryMarshaler: %T", rv.Interface())
  182. bs, fnerr := bm.MarshalBinary()
  183. if fnerr != nil {
  184. panic(fnerr)
  185. }
  186. if bs == nil {
  187. f.ee.encodeNil()
  188. } else {
  189. f.ee.encodeStringBytes(c_RAW, bs)
  190. }
  191. }
  192. func (f *encFnInfo) kBool(rv reflect.Value) {
  193. f.ee.encodeBool(rv.Bool())
  194. }
  195. func (f *encFnInfo) kString(rv reflect.Value) {
  196. f.ee.encodeString(c_UTF8, rv.String())
  197. }
  198. func (f *encFnInfo) kFloat64(rv reflect.Value) {
  199. f.ee.encodeFloat64(rv.Float())
  200. }
  201. func (f *encFnInfo) kFloat32(rv reflect.Value) {
  202. f.ee.encodeFloat32(float32(rv.Float()))
  203. }
  204. func (f *encFnInfo) kInt(rv reflect.Value) {
  205. f.ee.encodeInt(rv.Int())
  206. }
  207. func (f *encFnInfo) kUint(rv reflect.Value) {
  208. f.ee.encodeUint(rv.Uint())
  209. }
  210. func (f *encFnInfo) kInvalid(rv reflect.Value) {
  211. f.ee.encodeNil()
  212. }
  213. func (f *encFnInfo) kErr(rv reflect.Value) {
  214. encErr("Unsupported kind: %s, for: %#v", rv.Kind(), rv)
  215. }
  216. func (f *encFnInfo) kSlice(rv reflect.Value) {
  217. if rv.IsNil() {
  218. f.ee.encodeNil()
  219. return
  220. }
  221. if f.rtid == byteSliceTypId {
  222. f.ee.encodeStringBytes(c_RAW, rv.Bytes())
  223. return
  224. }
  225. l := rv.Len()
  226. f.ee.encodeArrayPreamble(l)
  227. if l == 0 {
  228. return
  229. }
  230. for j := 0; j < l; j++ {
  231. f.e.encodeValue(rv.Index(j))
  232. }
  233. }
  234. func (f *encFnInfo) kArray(rv reflect.Value) {
  235. f.e.encodeValue(rv.Slice(0, rv.Len()))
  236. }
  237. func (f *encFnInfo) kStruct(rv reflect.Value) {
  238. newlen := len(f.sis.sis)
  239. rvals := make([]reflect.Value, newlen)
  240. var encnames []string
  241. e := f.e
  242. sissis := f.sis.sisp
  243. toMap := !(f.sis.toArray || e.h.structToArray())
  244. // if toMap, use the sorted array. If toArray, use unsorted array (to match sequence in struct)
  245. if toMap {
  246. sissis = f.sis.sis
  247. encnames = make([]string, newlen)
  248. }
  249. newlen = 0
  250. for _, si := range sissis {
  251. if si.i != -1 {
  252. rvals[newlen] = rv.Field(int(si.i))
  253. } else {
  254. rvals[newlen] = rv.FieldByIndex(si.is)
  255. }
  256. if toMap {
  257. if si.omitEmpty && isEmptyValue(rvals[newlen]) {
  258. continue
  259. }
  260. encnames[newlen] = si.encName
  261. } else {
  262. if si.omitEmpty && isEmptyValue(rvals[newlen]) {
  263. rvals[newlen] = reflect.Value{} //encode as nil
  264. }
  265. }
  266. newlen++
  267. }
  268. if toMap {
  269. ee := f.ee //don't dereference everytime
  270. ee.encodeMapPreamble(newlen)
  271. for j := 0; j < newlen; j++ {
  272. ee.encodeSymbol(encnames[j])
  273. e.encodeValue(rvals[j])
  274. }
  275. } else {
  276. f.ee.encodeArrayPreamble(newlen)
  277. for j := 0; j < newlen; j++ {
  278. e.encodeValue(rvals[j])
  279. }
  280. }
  281. }
  282. func (f *encFnInfo) kPtr(rv reflect.Value) {
  283. if rv.IsNil() {
  284. f.ee.encodeNil()
  285. return
  286. }
  287. f.e.encodeValue(rv.Elem())
  288. }
  289. func (f *encFnInfo) kInterface(rv reflect.Value) {
  290. if rv.IsNil() {
  291. f.ee.encodeNil()
  292. return
  293. }
  294. f.e.encodeValue(rv.Elem())
  295. }
  296. func (f *encFnInfo) kMap(rv reflect.Value) {
  297. if rv.IsNil() {
  298. f.ee.encodeNil()
  299. return
  300. }
  301. l := rv.Len()
  302. f.ee.encodeMapPreamble(l)
  303. if l == 0 {
  304. return
  305. }
  306. keyTypeIsString := f.rt.Key().Kind() == reflect.String
  307. mks := rv.MapKeys()
  308. // for j, lmks := 0, len(mks); j < lmks; j++ {
  309. for j := range mks {
  310. if keyTypeIsString {
  311. f.ee.encodeSymbol(mks[j].String())
  312. } else {
  313. f.e.encodeValue(mks[j])
  314. }
  315. f.e.encodeValue(rv.MapIndex(mks[j]))
  316. }
  317. }
  318. // NewEncoder returns an Encoder for encoding into an io.Writer.
  319. //
  320. // For efficiency, Users are encouraged to pass in a memory buffered writer
  321. // (eg bufio.Writer, bytes.Buffer).
  322. func NewEncoder(w io.Writer, h Handle) *Encoder {
  323. ww, ok := w.(ioEncWriterWriter)
  324. if !ok {
  325. sww := simpleIoEncWriterWriter{w: w}
  326. sww.bw, _ = w.(io.ByteWriter)
  327. sww.sw, _ = w.(ioEncStringWriter)
  328. ww = &sww
  329. //ww = bufio.NewWriterSize(w, defEncByteBufSize)
  330. }
  331. z := ioEncWriter{
  332. w: ww,
  333. }
  334. return &Encoder{w: &z, h: h, e: h.newEncDriver(&z) }
  335. }
  336. // NewEncoderBytes returns an encoder for encoding directly and efficiently
  337. // into a byte slice, using zero-copying to temporary slices.
  338. //
  339. // It will potentially replace the output byte slice pointed to.
  340. // After encoding, the out parameter contains the encoded contents.
  341. func NewEncoderBytes(out *[]byte, h Handle) *Encoder {
  342. in := *out
  343. if in == nil {
  344. in = make([]byte, defEncByteBufSize)
  345. }
  346. z := bytesEncWriter{
  347. b: in,
  348. out: out,
  349. }
  350. return &Encoder{w: &z, h: h, e: h.newEncDriver(&z) }
  351. }
  352. // Encode writes an object into a stream in the codec format.
  353. //
  354. // Encoding can be configured via the "codec" struct tag for the fields.
  355. //
  356. // The "codec" key in struct field's tag value is the key name,
  357. // followed by an optional comma and options.
  358. //
  359. // To set an option on all fields (e.g. omitempty on all fields), you
  360. // can create a field called _struct, and set flags on it.
  361. //
  362. // Struct values "usually" encode as maps. Each exported struct field is encoded unless:
  363. // - the field's codec tag is "-", OR
  364. // - the field is empty and its codec tag specifies the "omitempty" option.
  365. //
  366. // When encoding as a map, the first string in the tag (before the comma)
  367. // is the map key string to use when encoding.
  368. //
  369. // However, struct values may encode as arrays. This happens when:
  370. // - StructToArray Encode option is set, OR
  371. // - the codec tag on the _struct field sets the "toarray" option
  372. //
  373. // The empty values (for omitempty option) are false, 0, any nil pointer
  374. // or interface value, and any array, slice, map, or string of length zero.
  375. //
  376. // Anonymous fields are encoded inline if no struct tag is present.
  377. // Else they are encoded as regular fields.
  378. //
  379. // Examples:
  380. //
  381. // type MyStruct struct {
  382. // _struct bool `codec:",omitempty"` //set omitempty for every field
  383. // Field1 string `codec:"-"` //skip this field
  384. // Field2 int `codec:"myName"` //Use key "myName" in encode stream
  385. // Field3 int32 `codec:",omitempty"` //use key "Field3". Omit if empty.
  386. // Field4 bool `codec:"f4,omitempty"` //use key "f4". Omit if empty.
  387. // ...
  388. // }
  389. //
  390. // type MyStruct struct {
  391. // _struct bool `codec:",omitempty,toarray"` //set omitempty for every field
  392. // //and encode struct as an array
  393. // }
  394. //
  395. // The mode of encoding is based on the type of the value. When a value is seen:
  396. // - If an extension is registered for it, call that extension function
  397. // - If it implements BinaryMarshaler, call its MarshalBinary() (data []byte, err error)
  398. // - Else encode it based on its reflect.Kind
  399. //
  400. // Note that struct field names and keys in map[string]XXX will be treated as symbols.
  401. // Some formats support symbols (e.g. binc) and will properly encode the string
  402. // only once in the stream, and use a tag to refer to it thereafter.
  403. func (e *Encoder) Encode(v interface{}) (err error) {
  404. defer panicToErr(&err)
  405. e.encode(v)
  406. e.w.atEndOfEncode()
  407. return
  408. }
  409. func (e *Encoder) encode(iv interface{}) {
  410. switch v := iv.(type) {
  411. case nil:
  412. e.e.encodeNil()
  413. case reflect.Value:
  414. e.encodeValue(v)
  415. case string:
  416. e.e.encodeString(c_UTF8, v)
  417. case bool:
  418. e.e.encodeBool(v)
  419. case int:
  420. e.e.encodeInt(int64(v))
  421. case int8:
  422. e.e.encodeInt(int64(v))
  423. case int16:
  424. e.e.encodeInt(int64(v))
  425. case int32:
  426. e.e.encodeInt(int64(v))
  427. case int64:
  428. e.e.encodeInt(v)
  429. case uint:
  430. e.e.encodeUint(uint64(v))
  431. case uint8:
  432. e.e.encodeUint(uint64(v))
  433. case uint16:
  434. e.e.encodeUint(uint64(v))
  435. case uint32:
  436. e.e.encodeUint(uint64(v))
  437. case uint64:
  438. e.e.encodeUint(v)
  439. case float32:
  440. e.e.encodeFloat32(v)
  441. case float64:
  442. e.e.encodeFloat64(v)
  443. case *string:
  444. e.e.encodeString(c_UTF8, *v)
  445. case *bool:
  446. e.e.encodeBool(*v)
  447. case *int:
  448. e.e.encodeInt(int64(*v))
  449. case *int8:
  450. e.e.encodeInt(int64(*v))
  451. case *int16:
  452. e.e.encodeInt(int64(*v))
  453. case *int32:
  454. e.e.encodeInt(int64(*v))
  455. case *int64:
  456. e.e.encodeInt(*v)
  457. case *uint:
  458. e.e.encodeUint(uint64(*v))
  459. case *uint8:
  460. e.e.encodeUint(uint64(*v))
  461. case *uint16:
  462. e.e.encodeUint(uint64(*v))
  463. case *uint32:
  464. e.e.encodeUint(uint64(*v))
  465. case *uint64:
  466. e.e.encodeUint(*v)
  467. case *float32:
  468. e.e.encodeFloat32(*v)
  469. case *float64:
  470. e.e.encodeFloat64(*v)
  471. default:
  472. e.encodeValue(reflect.ValueOf(iv))
  473. }
  474. }
  475. func (e *Encoder) encodeValue(rv reflect.Value) {
  476. rt := rv.Type()
  477. rtid := reflect.ValueOf(rt).Pointer()
  478. // if e.f == nil && e.s == nil {
  479. // debugf("---->Creating new enc f map for type: %v\n", rt)
  480. // }
  481. var fn encFn
  482. var ok bool
  483. if useMapForCodecCache {
  484. fn, ok = e.f[rtid]
  485. } else {
  486. for i, v := range e.x {
  487. if v == rtid {
  488. fn, ok = e.s[i], true
  489. break
  490. }
  491. }
  492. }
  493. if !ok {
  494. // debugf("\tCreating new enc fn for type: %v\n", rt)
  495. fi := encFnInfo { sis:getTypeInfo(rtid, rt), e:e, ee:e.e, rt:rt, rtid:rtid }
  496. if fi.sis.baseId == rawExtTypId {
  497. fn = encFn{ &fi, (*encFnInfo).rawExt }
  498. } else if e.e.isBuiltinType(fi.sis.baseId) {
  499. fn = encFn{ &fi, (*encFnInfo).builtin }
  500. } else if xfTag, xfFn := e.h.getEncodeExt(fi.sis.baseId); xfFn != nil {
  501. fi.xfTag, fi.xfFn = xfTag, xfFn
  502. fn = encFn{ &fi, (*encFnInfo).ext }
  503. } else if supportBinaryMarshal && fi.sis.m {
  504. fn = encFn{ &fi, (*encFnInfo).binaryMarshal }
  505. } else {
  506. switch rk := rt.Kind(); rk {
  507. case reflect.Bool:
  508. fn = encFn{ &fi, (*encFnInfo).kBool }
  509. case reflect.String:
  510. fn = encFn{ &fi, (*encFnInfo).kString }
  511. case reflect.Float64:
  512. fn = encFn{ &fi, (*encFnInfo).kFloat64 }
  513. case reflect.Float32:
  514. fn = encFn{ &fi, (*encFnInfo).kFloat32 }
  515. case reflect.Int, reflect.Int8, reflect.Int64, reflect.Int32, reflect.Int16:
  516. fn = encFn{ &fi, (*encFnInfo).kInt }
  517. case reflect.Uint8, reflect.Uint64, reflect.Uint, reflect.Uint32, reflect.Uint16:
  518. fn = encFn{ &fi, (*encFnInfo).kUint }
  519. case reflect.Invalid:
  520. fn = encFn{ &fi, (*encFnInfo).kInvalid }
  521. case reflect.Slice:
  522. fn = encFn{ &fi, (*encFnInfo).kSlice }
  523. case reflect.Array:
  524. fn = encFn{ &fi, (*encFnInfo).kArray }
  525. case reflect.Struct:
  526. fn = encFn{ &fi, (*encFnInfo).kStruct }
  527. case reflect.Ptr:
  528. fn = encFn{ &fi, (*encFnInfo).kPtr }
  529. case reflect.Interface:
  530. fn = encFn{ &fi, (*encFnInfo).kInterface }
  531. case reflect.Map:
  532. fn = encFn{ &fi, (*encFnInfo).kMap }
  533. default:
  534. fn = encFn{ &fi, (*encFnInfo).kErr }
  535. }
  536. }
  537. if useMapForCodecCache {
  538. if e.f == nil {
  539. e.f = make(map[uintptr]encFn, 16)
  540. }
  541. e.f[rtid] = fn
  542. } else {
  543. e.s = append(e.s, fn )
  544. e.x = append(e.x, rtid)
  545. }
  546. }
  547. fn.f(fn.i, rv)
  548. }
  549. // ----------------------------------------
  550. func (z *ioEncWriter) writeUint16(v uint16) {
  551. bigen.PutUint16(z.x[:2], v)
  552. z.writeb(z.x[:2])
  553. }
  554. func (z *ioEncWriter) writeUint32(v uint32) {
  555. bigen.PutUint32(z.x[:4], v)
  556. z.writeb(z.x[:4])
  557. }
  558. func (z *ioEncWriter) writeUint64(v uint64) {
  559. bigen.PutUint64(z.x[:8], v)
  560. z.writeb(z.x[:8])
  561. }
  562. func (z *ioEncWriter) writeb(bs []byte) {
  563. n, err := z.w.Write(bs)
  564. if err != nil {
  565. panic(err)
  566. }
  567. if n != len(bs) {
  568. encErr("write: Incorrect num bytes written. Expecting: %v, Wrote: %v", len(bs), n)
  569. }
  570. }
  571. func (z *ioEncWriter) writestr(s string) {
  572. n, err := z.w.WriteString(s)
  573. if err != nil {
  574. panic(err)
  575. }
  576. if n != len(s) {
  577. encErr("write: Incorrect num bytes written. Expecting: %v, Wrote: %v", len(s), n)
  578. }
  579. }
  580. func (z *ioEncWriter) writen1(b byte) {
  581. if err := z.w.WriteByte(b); err != nil {
  582. panic(err)
  583. }
  584. }
  585. func (z *ioEncWriter) writen2(b1 byte, b2 byte) {
  586. z.writen1(b1)
  587. z.writen1(b2)
  588. }
  589. func (z *ioEncWriter) atEndOfEncode() { }
  590. // ----------------------------------------
  591. func (z *bytesEncWriter) writeUint16(v uint16) {
  592. c := z.grow(2)
  593. z.b[c] = byte(v >> 8)
  594. z.b[c+1] = byte(v)
  595. }
  596. func (z *bytesEncWriter) writeUint32(v uint32) {
  597. c := z.grow(4)
  598. z.b[c] = byte(v >> 24)
  599. z.b[c+1] = byte(v >> 16)
  600. z.b[c+2] = byte(v >> 8)
  601. z.b[c+3] = byte(v)
  602. }
  603. func (z *bytesEncWriter) writeUint64(v uint64) {
  604. c := z.grow(8)
  605. z.b[c] = byte(v >> 56)
  606. z.b[c+1] = byte(v >> 48)
  607. z.b[c+2] = byte(v >> 40)
  608. z.b[c+3] = byte(v >> 32)
  609. z.b[c+4] = byte(v >> 24)
  610. z.b[c+5] = byte(v >> 16)
  611. z.b[c+6] = byte(v >> 8)
  612. z.b[c+7] = byte(v)
  613. }
  614. func (z *bytesEncWriter) writeb(s []byte) {
  615. c := z.grow(len(s))
  616. copy(z.b[c:], s)
  617. }
  618. func (z *bytesEncWriter) writestr(s string) {
  619. c := z.grow(len(s))
  620. copy(z.b[c:], s)
  621. }
  622. func (z *bytesEncWriter) writen1(b1 byte) {
  623. c := z.grow(1)
  624. z.b[c] = b1
  625. }
  626. func (z *bytesEncWriter) writen2(b1 byte, b2 byte) {
  627. c := z.grow(2)
  628. z.b[c] = b1
  629. z.b[c+1] = b2
  630. }
  631. func (z *bytesEncWriter) atEndOfEncode() {
  632. *(z.out) = z.b[:z.c]
  633. }
  634. func (z *bytesEncWriter) grow(n int) (oldcursor int) {
  635. oldcursor = z.c
  636. z.c = oldcursor + n
  637. if z.c > cap(z.b) {
  638. // It tried using appendslice logic: (if cap < 1024, *2, else *1.25).
  639. // However, it was too expensive, causing too many iterations of copy.
  640. // Using bytes.Buffer model was much better (2*cap + n)
  641. bs := make([]byte, 2*cap(z.b)+n)
  642. copy(bs, z.b[:oldcursor])
  643. z.b = bs
  644. } else if z.c > len(z.b) {
  645. z.b = z.b[:cap(z.b)]
  646. }
  647. return
  648. }
  649. // ----------------------------------------
  650. func encErr(format string, params ...interface{}) {
  651. doPanic(msgTagEnc, format, params...)
  652. }