encode.go 16 KB

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