github.com/urso/go-structform@v0.0.2/ubjson/visitor.go (about)

     1  package ubjson
     2  
     3  import (
     4  	"encoding/binary"
     5  	"io"
     6  	"math"
     7  	"strconv"
     8  
     9  	structform "github.com/urso/go-structform"
    10  )
    11  
    12  type Visitor struct {
    13  	w       writer
    14  	scratch [16]byte
    15  
    16  	length lengthStack
    17  }
    18  
    19  type writer struct {
    20  	out io.Writer
    21  }
    22  
    23  var _ structform.ExtVisitor = &Visitor{}
    24  
    25  const (
    26  	maxUint  = ^uint(0)
    27  	maxInt   = int(maxUint >> 1)
    28  	isUint64 = maxUint > math.MaxUint32
    29  	isInt64  = maxInt > math.MaxInt32
    30  )
    31  
    32  func (w writer) write(b []byte) error {
    33  	_, err := w.out.Write(b)
    34  	return err
    35  }
    36  
    37  func NewVisitor(out io.Writer) *Visitor {
    38  	v := &Visitor{w: writer{out}}
    39  	v.length.stack = v.length.stack0[:0]
    40  	return v
    41  }
    42  
    43  func (vs *Visitor) writeByte(b byte) error {
    44  	vs.scratch[0] = b
    45  	return vs.w.write(vs.scratch[:1])
    46  }
    47  
    48  func (vs *Visitor) optionalCount(l int) error {
    49  	vs.length.push(int64(l))
    50  
    51  	if l <= 0 {
    52  		// don't add size if array is empty or size is unknown
    53  		return nil
    54  	}
    55  
    56  	if err := vs.writeByte(countMarker); err != nil {
    57  		return err
    58  	}
    59  	return vs.writeLen(l)
    60  }
    61  
    62  func (vs *Visitor) OnObjectStart(l int, _ structform.BaseType) error {
    63  	// TODO: add typed object support in case of values being passed one by one
    64  
    65  	// if number of elements is known, add size
    66  	if err := vs.writeByte(objStartMarker); err != nil {
    67  		return err
    68  	}
    69  
    70  	return vs.optionalCount(l)
    71  }
    72  
    73  func (vs *Visitor) OnObjectFinished() error {
    74  	if vs.length.pop() <= 0 {
    75  		return vs.writeByte(objEndMarker)
    76  	}
    77  	return nil
    78  }
    79  
    80  func (vs *Visitor) OnKey(s string) error {
    81  	return vs.string(str2Bytes(s), false)
    82  }
    83  
    84  func (vs *Visitor) OnKeyRef(s []byte) error {
    85  	return vs.string(s, false)
    86  }
    87  
    88  func (vs *Visitor) OnArrayStart(l int, t structform.BaseType) error {
    89  	// TODO: optimize array by computing type tag
    90  
    91  	if err := vs.writeByte(arrStartMarker); err != nil {
    92  		return err
    93  	}
    94  
    95  	// if array size is known, add at least size
    96  	return vs.optionalCount(l)
    97  }
    98  
    99  func (vs *Visitor) OnArrayFinished() error {
   100  	if vs.length.pop() <= 0 {
   101  		return vs.writeByte(arrEndMarker)
   102  	}
   103  	return nil
   104  }
   105  
   106  func (vs *Visitor) writeLen(l int) error {
   107  	return vs.onInt(l, true)
   108  }
   109  
   110  func (vs *Visitor) OnStringRef(s []byte) error {
   111  	if len(s) == 0 {
   112  		return vs.string(nil, true)
   113  	}
   114  	return vs.string(s, true)
   115  }
   116  
   117  func (vs *Visitor) OnString(s string) error {
   118  	if len(s) == 0 {
   119  		return vs.string(nil, true)
   120  	}
   121  	return vs.string(str2Bytes(s), true)
   122  }
   123  
   124  func (vs *Visitor) string(s []byte, marker bool) error {
   125  	if marker {
   126  		if err := vs.writeByte(stringMarker); err != nil {
   127  			return err
   128  		}
   129  	}
   130  
   131  	L := len(s)
   132  	if err := vs.writeLen(L); err != nil {
   133  		return err
   134  	}
   135  	if L == 0 {
   136  		return nil
   137  	}
   138  	return vs.w.write(s)
   139  }
   140  
   141  func (vs *Visitor) OnBool(b bool) error {
   142  	if b {
   143  		return vs.writeByte(trueMarker)
   144  	}
   145  	return vs.writeByte(falseMarker)
   146  }
   147  
   148  func (vs *Visitor) OnNil() error {
   149  	return vs.writeByte(nullMarker)
   150  }
   151  
   152  // int
   153  
   154  func (vs *Visitor) OnInt8(i int8) error {
   155  	return vs.int8(i, true)
   156  }
   157  
   158  func (vs *Visitor) int8(i int8, marker bool) error {
   159  	if marker {
   160  		if err := vs.writeByte(int8Marker); err != nil {
   161  			return err
   162  		}
   163  	}
   164  	return vs.writeByte(byte(i))
   165  }
   166  
   167  func (vs *Visitor) OnInt16(i int16) error {
   168  	if math.MinInt8 <= i && i <= math.MaxInt8 {
   169  		return vs.int8(int8(i), true)
   170  	}
   171  	return vs.int16(i, true)
   172  }
   173  
   174  func (vs *Visitor) int16(i int16, marker bool) error {
   175  	if marker {
   176  		if err := vs.writeByte(int16Marker); err != nil {
   177  			return err
   178  		}
   179  	}
   180  	binary.BigEndian.PutUint16(vs.scratch[:2], uint16(i))
   181  	return vs.w.write(vs.scratch[:2])
   182  }
   183  
   184  func (vs *Visitor) OnInt32(i int32) error {
   185  	if math.MinInt16 <= i && i <= math.MaxInt16 {
   186  		return vs.OnInt16(int16(i))
   187  	}
   188  	return vs.int32(i, true)
   189  }
   190  
   191  func (vs *Visitor) int32(i int32, marker bool) error {
   192  	if marker {
   193  		if err := vs.writeByte(int32Marker); err != nil {
   194  			return err
   195  		}
   196  	}
   197  	binary.BigEndian.PutUint32(vs.scratch[:4], uint32(i))
   198  	return vs.w.write(vs.scratch[:4])
   199  }
   200  
   201  func (vs *Visitor) OnInt64(i int64) error {
   202  	if math.MinInt32 <= i && i <= math.MaxInt32 {
   203  		return vs.OnInt32(int32(i))
   204  	}
   205  	return vs.int64(i, true)
   206  }
   207  
   208  func (vs *Visitor) int64(i int64, marker bool) error {
   209  	if marker {
   210  		if err := vs.writeByte(int64Marker); err != nil {
   211  			return err
   212  		}
   213  	}
   214  	binary.BigEndian.PutUint64(vs.scratch[:8], uint64(i))
   215  	return vs.w.write(vs.scratch[:8])
   216  }
   217  
   218  func (vs *Visitor) OnInt(i int) error {
   219  	return vs.onInt(i, true)
   220  }
   221  
   222  func (vs *Visitor) onInt(i int, marker bool) error {
   223  	switch {
   224  	case math.MinInt8 <= i && i <= math.MaxInt8:
   225  		return vs.int8(int8(i), marker)
   226  	case 0 <= i && i <= math.MaxUint8:
   227  		return vs.uint8(uint8(i), marker)
   228  	case math.MinInt16 <= i && i <= math.MaxInt16:
   229  		return vs.int16(int16(i), marker)
   230  	case math.MinInt32 <= i && i <= math.MaxInt32:
   231  		return vs.int32(int32(i), marker)
   232  	default:
   233  		return vs.int64(int64(i), marker)
   234  	}
   235  }
   236  
   237  func (vs *Visitor) OnByte(b byte) error {
   238  	vs.scratch[0] = charMarker
   239  	vs.scratch[1] = b
   240  	return vs.w.write(vs.scratch[:2])
   241  }
   242  
   243  // uint
   244  
   245  func (vs *Visitor) OnUint8(u uint8) error {
   246  	return vs.uint8(u, true)
   247  }
   248  
   249  func (vs *Visitor) uint8(u uint8, marker bool) error {
   250  	if marker {
   251  		vs.scratch[0], vs.scratch[1] = uint8Marker, u
   252  		return vs.w.write(vs.scratch[:2])
   253  	}
   254  	return vs.writeByte(u)
   255  }
   256  
   257  func (vs *Visitor) OnUint16(u uint16) error {
   258  	return vs.OnUint64(uint64(u))
   259  }
   260  
   261  func (vs *Visitor) OnUint32(u uint32) error {
   262  	return vs.OnUint64(uint64(u))
   263  }
   264  
   265  func (vs *Visitor) OnUint64(u uint64) error {
   266  	return vs.uint64(u, uintType(u), true)
   267  }
   268  
   269  func (vs *Visitor) uint64(u uint64, t byte, marker bool) error {
   270  	switch t {
   271  	case int8Marker:
   272  		return vs.int8(int8(u), marker)
   273  	case uint8Marker:
   274  		return vs.uint8(uint8(u), marker)
   275  	case int16Marker:
   276  		return vs.int16(int16(u), marker)
   277  	case int32Marker:
   278  		return vs.int32(int32(u), marker)
   279  	case int64Marker:
   280  		return vs.int64(int64(u), marker)
   281  	default:
   282  		return vs.uint64HighPrec(u, marker)
   283  	}
   284  }
   285  
   286  func (vs *Visitor) uint64HighPrec(u uint64, marker bool) error {
   287  	if marker {
   288  		if err := vs.writeByte(highPrecMarker); err != nil {
   289  			return err
   290  		}
   291  	}
   292  
   293  	b := strconv.AppendUint(vs.scratch[:0], u, 10)
   294  	if err := vs.writeLen(len(b)); err != nil {
   295  		return err
   296  	}
   297  	return vs.w.write(b)
   298  }
   299  
   300  func (vs *Visitor) OnUint(u uint) error {
   301  	return vs.OnUint64(uint64(u))
   302  }
   303  
   304  // float
   305  
   306  func (vs *Visitor) OnFloat32(f float32) error {
   307  	return vs.float32(f, true)
   308  }
   309  
   310  func (vs *Visitor) float32(f float32, marker bool) error {
   311  	if marker {
   312  		if err := vs.writeByte(float32Marker); err != nil {
   313  			return err
   314  		}
   315  	}
   316  
   317  	bits := math.Float32bits(f)
   318  	binary.BigEndian.PutUint32(vs.scratch[:4], bits)
   319  	return vs.w.write(vs.scratch[:4])
   320  }
   321  
   322  func (vs *Visitor) OnFloat64(f float64) error {
   323  	return vs.float64(f, true)
   324  }
   325  
   326  func (vs *Visitor) float64(f float64, marker bool) error {
   327  	if marker {
   328  		if err := vs.writeByte(float64Marker); err != nil {
   329  			return err
   330  		}
   331  	}
   332  
   333  	bits := math.Float64bits(f)
   334  	binary.BigEndian.PutUint64(vs.scratch[:8], bits)
   335  	return vs.w.write(vs.scratch[:8])
   336  }
   337  
   338  // specialize array encoders
   339  
   340  func (vs *Visitor) onTypedStruct(s, t byte, count int) error {
   341  	vs.scratch[0] = s
   342  	vs.scratch[1] = typeMarker
   343  	vs.scratch[2] = t
   344  	vs.scratch[3] = countMarker
   345  
   346  	if err := vs.w.write(vs.scratch[:4]); err != nil {
   347  		return err
   348  	}
   349  	return vs.writeLen(count)
   350  
   351  }
   352  
   353  func (vs *Visitor) onArray(t byte, count int) error {
   354  	return vs.onTypedStruct(arrStartMarker, t, count)
   355  }
   356  
   357  func (vs *Visitor) OnStringArray(a []string) error {
   358  	if done, err := vs.onEmptyArray(len(a)); done {
   359  		return err
   360  	}
   361  
   362  	if err := vs.onArray(stringMarker, len(a)); err != nil {
   363  		return err
   364  	}
   365  	for _, v := range a {
   366  		if err := vs.string(str2Bytes(v), false); err != nil {
   367  			return err
   368  		}
   369  	}
   370  	return nil
   371  }
   372  
   373  func (vs *Visitor) OnBoolArray(a []bool) error {
   374  	// no special encoding for boolean arrays => fall back to per element encoding
   375  
   376  	if err := vs.OnArrayStart(len(a), structform.AnyType); err != nil {
   377  		return err
   378  	}
   379  	for _, b := range a {
   380  		if err := vs.OnBool(b); err != nil {
   381  			return err
   382  		}
   383  	}
   384  	return nil
   385  }
   386  
   387  func (vs *Visitor) OnInt8Array(a []int8) error {
   388  	if done, err := vs.onEmptyArray(len(a)); done {
   389  		return err
   390  	}
   391  
   392  	if err := vs.onArray(int8Marker, len(a)); err != nil {
   393  		return err
   394  	}
   395  	for _, v := range a {
   396  		if err := vs.int8(v, false); err != nil {
   397  			return err
   398  		}
   399  	}
   400  	return nil
   401  }
   402  
   403  func (vs *Visitor) OnInt16Array(a []int16) error {
   404  	if done, err := vs.onEmptyArray(len(a)); done {
   405  		return err
   406  	}
   407  
   408  	if err := vs.onArray(int16Marker, len(a)); err != nil {
   409  		return err
   410  	}
   411  	for _, v := range a {
   412  		if err := vs.int16(v, false); err != nil {
   413  			return err
   414  		}
   415  	}
   416  	return nil
   417  }
   418  
   419  func (vs *Visitor) OnInt32Array(a []int32) error {
   420  	if done, err := vs.onEmptyArray(len(a)); done {
   421  		return err
   422  	}
   423  
   424  	if err := vs.onArray(int32Marker, len(a)); err != nil {
   425  		return err
   426  	}
   427  	for _, v := range a {
   428  		if err := vs.int32(v, false); err != nil {
   429  			return err
   430  		}
   431  	}
   432  	return nil
   433  }
   434  
   435  func (vs *Visitor) OnInt64Array(a []int64) error {
   436  	if done, err := vs.onEmptyArray(len(a)); done {
   437  		return err
   438  	}
   439  
   440  	if err := vs.onArray(int64Marker, len(a)); err != nil {
   441  		return err
   442  	}
   443  	for _, v := range a {
   444  		if err := vs.int64(v, false); err != nil {
   445  			return err
   446  		}
   447  	}
   448  	return nil
   449  }
   450  
   451  func (vs *Visitor) OnIntArray(a []int) error {
   452  	if done, err := vs.onEmptyArray(len(a)); done {
   453  		return err
   454  	}
   455  
   456  	marker := int32Marker
   457  	if isInt64 {
   458  		marker = int64Marker
   459  	}
   460  
   461  	if err := vs.onArray(marker, len(a)); err != nil {
   462  		return err
   463  	}
   464  	for _, v := range a {
   465  		var err error
   466  
   467  		if isInt64 {
   468  			err = vs.int64(int64(v), false)
   469  		} else {
   470  			err = vs.int32(int32(v), false)
   471  		}
   472  
   473  		if err != nil {
   474  			return err
   475  		}
   476  	}
   477  
   478  	return nil
   479  }
   480  
   481  func (vs *Visitor) OnBytes(a []byte) error {
   482  	if done, err := vs.onEmptyArray(len(a)); done {
   483  		return err
   484  	}
   485  
   486  	if err := vs.onArray(uint8Marker, len(a)); err != nil {
   487  		return err
   488  	}
   489  
   490  	for _, v := range a {
   491  		if err := vs.uint8(v, false); err != nil {
   492  			return err
   493  		}
   494  	}
   495  	return nil
   496  
   497  }
   498  
   499  func (vs *Visitor) OnUint8Array(a []uint8) error {
   500  	if done, err := vs.onEmptyArray(len(a)); done {
   501  		return err
   502  	}
   503  
   504  	if err := vs.onArray(uint8Marker, len(a)); err != nil {
   505  		return err
   506  	}
   507  	for _, v := range a {
   508  		if err := vs.uint8(v, false); err != nil {
   509  			return err
   510  		}
   511  	}
   512  	return nil
   513  }
   514  
   515  func (vs *Visitor) OnUint16Array(a []uint16) error {
   516  	if done, err := vs.onEmptyArray(len(a)); done {
   517  		return err
   518  	}
   519  
   520  	// find type:
   521  	minT := int8Marker
   522  	for _, v := range a {
   523  		minT = maxNumType(minT, uintType(uint64(v)))
   524  	}
   525  
   526  	// serialize array
   527  	if err := vs.onArray(minT, len(a)); err != nil {
   528  		return err
   529  	}
   530  	for _, v := range a {
   531  		if err := vs.uint64(uint64(v), minT, false); err != nil {
   532  			return err
   533  		}
   534  	}
   535  	return nil
   536  }
   537  
   538  func (vs *Visitor) OnUint32Array(a []uint32) error {
   539  	if done, err := vs.onEmptyArray(len(a)); done {
   540  		return err
   541  	}
   542  
   543  	// find type:
   544  	minT := int8Marker
   545  	for _, v := range a {
   546  		minT = maxNumType(minT, uintType(uint64(v)))
   547  	}
   548  
   549  	// serialize array
   550  	if err := vs.onArray(minT, len(a)); err != nil {
   551  		return err
   552  	}
   553  	for _, v := range a {
   554  		if err := vs.uint64(uint64(v), minT, false); err != nil {
   555  			return err
   556  		}
   557  	}
   558  	return nil
   559  }
   560  
   561  func (vs *Visitor) OnUint64Array(a []uint64) error {
   562  	if done, err := vs.onEmptyArray(len(a)); done {
   563  		return err
   564  	}
   565  
   566  	// find type:
   567  	minT := int8Marker
   568  	for _, v := range a {
   569  		minT = maxNumType(minT, uintType(v))
   570  	}
   571  
   572  	// serialize array
   573  	if err := vs.onArray(minT, len(a)); err != nil {
   574  		return err
   575  	}
   576  	for _, v := range a {
   577  		if err := vs.uint64(v, minT, false); err != nil {
   578  			return err
   579  		}
   580  	}
   581  	return nil
   582  }
   583  
   584  func (vs *Visitor) OnUintArray(a []uint) error {
   585  	if done, err := vs.onEmptyArray(len(a)); done {
   586  		return err
   587  	}
   588  
   589  	// find type:
   590  	minT := int8Marker
   591  	for _, v := range a {
   592  		minT = maxNumType(minT, uintType(uint64(v)))
   593  	}
   594  
   595  	// serialize array
   596  	if err := vs.onArray(minT, len(a)); err != nil {
   597  		return err
   598  	}
   599  	for _, v := range a {
   600  		if err := vs.uint64(uint64(v), minT, false); err != nil {
   601  			return err
   602  		}
   603  	}
   604  	return nil
   605  }
   606  
   607  func (vs *Visitor) OnFloat32Array(a []float32) error {
   608  	if done, err := vs.onEmptyArray(len(a)); done {
   609  		return err
   610  	}
   611  
   612  	if err := vs.onArray(float32Marker, len(a)); err != nil {
   613  		return err
   614  	}
   615  	for _, v := range a {
   616  		if err := vs.float32(v, false); err != nil {
   617  			return err
   618  		}
   619  	}
   620  	return nil
   621  }
   622  
   623  func (vs *Visitor) OnFloat64Array(a []float64) error {
   624  	if done, err := vs.onEmptyArray(len(a)); done {
   625  		return err
   626  	}
   627  
   628  	if err := vs.onArray(float64Marker, len(a)); err != nil {
   629  		return err
   630  	}
   631  	for _, v := range a {
   632  		if err := vs.float64(v, false); err != nil {
   633  			return err
   634  		}
   635  	}
   636  	return nil
   637  }
   638  
   639  func (vs *Visitor) OnStringObject(m map[string]string) error {
   640  	if done, err := vs.onEmptyObject(len(m)); done {
   641  		return err
   642  	}
   643  	if err := vs.onObject(stringMarker, len(m)); err != nil {
   644  		return err
   645  	}
   646  	for k, v := range m {
   647  		if err := vs.string(str2Bytes(k), false); err != nil {
   648  			return err
   649  		}
   650  		if err := vs.string(str2Bytes(v), false); err != nil {
   651  			return err
   652  		}
   653  	}
   654  
   655  	return nil
   656  }
   657  
   658  func (vs *Visitor) OnBoolObject(m map[string]bool) error {
   659  	if done, err := vs.onEmptyObject(len(m)); done {
   660  		return err
   661  	}
   662  	if err := vs.optionalCount(len(m)); err != nil {
   663  		return err
   664  	}
   665  
   666  	for k, v := range m {
   667  		if err := vs.string(str2Bytes(k), false); err != nil {
   668  			return err
   669  		}
   670  		if err := vs.OnBool(v); err != nil {
   671  			return err
   672  		}
   673  	}
   674  
   675  	return nil
   676  }
   677  
   678  func (vs *Visitor) OnInt8Object(m map[string]int8) error {
   679  	if done, err := vs.onEmptyObject(len(m)); done {
   680  		return err
   681  	}
   682  	if err := vs.onObject(int8Marker, len(m)); err != nil {
   683  		return err
   684  	}
   685  	for k, v := range m {
   686  		if err := vs.string(str2Bytes(k), false); err != nil {
   687  			return err
   688  		}
   689  		if err := vs.int8(v, false); err != nil {
   690  			return err
   691  		}
   692  	}
   693  
   694  	return nil
   695  }
   696  
   697  func (vs *Visitor) OnInt16Object(m map[string]int16) error {
   698  	if done, err := vs.onEmptyObject(len(m)); done {
   699  		return err
   700  	}
   701  	if err := vs.onObject(int16Marker, len(m)); err != nil {
   702  		return err
   703  	}
   704  	for k, v := range m {
   705  		if err := vs.string(str2Bytes(k), false); err != nil {
   706  			return err
   707  		}
   708  		if err := vs.int16(v, false); err != nil {
   709  			return err
   710  		}
   711  	}
   712  
   713  	return nil
   714  }
   715  
   716  func (vs *Visitor) OnInt32Object(m map[string]int32) error {
   717  	if done, err := vs.onEmptyObject(len(m)); done {
   718  		return err
   719  	}
   720  	if err := vs.onObject(int32Marker, len(m)); err != nil {
   721  		return err
   722  	}
   723  	for k, v := range m {
   724  		if err := vs.string(str2Bytes(k), false); err != nil {
   725  			return err
   726  		}
   727  		if err := vs.int32(v, false); err != nil {
   728  			return err
   729  		}
   730  	}
   731  
   732  	return nil
   733  }
   734  
   735  func (vs *Visitor) OnInt64Object(m map[string]int64) error {
   736  	if done, err := vs.onEmptyObject(len(m)); done {
   737  		return err
   738  	}
   739  
   740  	if err := vs.onObject(int64Marker, len(m)); err != nil {
   741  		return err
   742  	}
   743  	for k, v := range m {
   744  		if err := vs.string(str2Bytes(k), false); err != nil {
   745  			return err
   746  		}
   747  		if err := vs.int64(v, false); err != nil {
   748  			return err
   749  		}
   750  	}
   751  
   752  	return nil
   753  }
   754  
   755  func (vs *Visitor) OnIntObject(m map[string]int) error {
   756  	if done, err := vs.onEmptyObject(len(m)); done {
   757  		return err
   758  	}
   759  
   760  	marker := int32Marker
   761  	if isInt64 {
   762  		marker = int64Marker
   763  	}
   764  
   765  	if err := vs.onObject(marker, len(m)); err != nil {
   766  		return err
   767  	}
   768  	for k, v := range m {
   769  		var err error
   770  		if err = vs.string(str2Bytes(k), false); err != nil {
   771  			return err
   772  		}
   773  		if isInt64 {
   774  			err = vs.int64(int64(v), false)
   775  		} else {
   776  			err = vs.int32(int32(v), false)
   777  		}
   778  		if err != nil {
   779  			return err
   780  		}
   781  	}
   782  
   783  	return nil
   784  }
   785  
   786  func (vs *Visitor) OnUint8Object(m map[string]uint8) error {
   787  	if done, err := vs.onEmptyObject(len(m)); done {
   788  		return err
   789  	}
   790  
   791  	if err := vs.onObject(uint8Marker, len(m)); err != nil {
   792  		return err
   793  	}
   794  	for k, v := range m {
   795  		if err := vs.string(str2Bytes(k), false); err != nil {
   796  			return err
   797  		}
   798  		if err := vs.uint8(v, false); err != nil {
   799  			return err
   800  		}
   801  	}
   802  
   803  	return nil
   804  }
   805  
   806  func (vs *Visitor) OnUint16Object(m map[string]uint16) error {
   807  	if done, err := vs.onEmptyObject(len(m)); done {
   808  		return err
   809  	}
   810  
   811  	// find type:
   812  	minT := int8Marker
   813  	for _, v := range m {
   814  		minT = maxNumType(minT, uintType(uint64(v)))
   815  	}
   816  
   817  	//serialize object
   818  	if err := vs.onObject(minT, len(m)); err != nil {
   819  		return err
   820  	}
   821  	for k, v := range m {
   822  		if err := vs.string(str2Bytes(k), false); err != nil {
   823  			return err
   824  		}
   825  		if err := vs.uint64(uint64(v), minT, false); err != nil {
   826  			return err
   827  		}
   828  	}
   829  
   830  	return nil
   831  }
   832  
   833  func (vs *Visitor) OnUint32Object(m map[string]uint32) error {
   834  	if done, err := vs.onEmptyObject(len(m)); done {
   835  		return err
   836  	}
   837  
   838  	// find type:
   839  	minT := int8Marker
   840  	for _, v := range m {
   841  		minT = maxNumType(minT, uintType(uint64(v)))
   842  	}
   843  
   844  	//serialize object
   845  	if err := vs.onObject(minT, len(m)); err != nil {
   846  		return err
   847  	}
   848  	for k, v := range m {
   849  		if err := vs.string(str2Bytes(k), false); err != nil {
   850  			return err
   851  		}
   852  		if err := vs.uint64(uint64(v), minT, false); err != nil {
   853  			return err
   854  		}
   855  	}
   856  
   857  	return nil
   858  }
   859  
   860  func (vs *Visitor) OnUint64Object(m map[string]uint64) error {
   861  	if done, err := vs.onEmptyObject(len(m)); done {
   862  		return err
   863  	}
   864  
   865  	// find type:
   866  	minT := int8Marker
   867  	for _, v := range m {
   868  		minT = maxNumType(minT, uintType(uint64(v)))
   869  	}
   870  
   871  	//serialize object
   872  	if err := vs.onObject(minT, len(m)); err != nil {
   873  		return err
   874  	}
   875  	for k, v := range m {
   876  		if err := vs.string(str2Bytes(k), false); err != nil {
   877  			return err
   878  		}
   879  		if err := vs.uint64(uint64(v), minT, false); err != nil {
   880  			return err
   881  		}
   882  	}
   883  
   884  	return nil
   885  }
   886  
   887  func (vs *Visitor) OnUintObject(m map[string]uint) error {
   888  	if done, err := vs.onEmptyObject(len(m)); done {
   889  		return err
   890  	}
   891  
   892  	// find type:
   893  	minT := int8Marker
   894  	for _, v := range m {
   895  		minT = maxNumType(minT, uintType(uint64(v)))
   896  	}
   897  
   898  	//serialize object
   899  	if err := vs.onObject(minT, len(m)); err != nil {
   900  		return err
   901  	}
   902  	for k, v := range m {
   903  		if err := vs.string(str2Bytes(k), false); err != nil {
   904  			return err
   905  		}
   906  		if err := vs.uint64(uint64(v), minT, false); err != nil {
   907  			return err
   908  		}
   909  	}
   910  
   911  	return nil
   912  }
   913  
   914  func (vs *Visitor) OnFloat32Object(m map[string]float32) error {
   915  	if done, err := vs.onEmptyObject(len(m)); done {
   916  		return err
   917  	}
   918  	if err := vs.onObject(float32Marker, len(m)); err != nil {
   919  		return err
   920  	}
   921  	for k, v := range m {
   922  		if err := vs.string(str2Bytes(k), false); err != nil {
   923  			return err
   924  		}
   925  		if err := vs.float32(v, false); err != nil {
   926  			return err
   927  		}
   928  	}
   929  
   930  	return nil
   931  }
   932  
   933  func (vs *Visitor) OnFloat64Object(m map[string]float64) error {
   934  	if done, err := vs.onEmptyObject(len(m)); done {
   935  		return err
   936  	}
   937  
   938  	if err := vs.onObject(float64Marker, len(m)); err != nil {
   939  		return err
   940  	}
   941  	for k, v := range m {
   942  		if err := vs.string(str2Bytes(k), false); err != nil {
   943  			return err
   944  		}
   945  		if err := vs.float64(v, false); err != nil {
   946  			return err
   947  		}
   948  	}
   949  
   950  	return nil
   951  }
   952  
   953  func (vs *Visitor) onEmptyArray(l int) (bool, error) {
   954  	if l > 0 {
   955  		return false, nil
   956  	}
   957  
   958  	vs.scratch[0], vs.scratch[1] = arrStartMarker, arrEndMarker
   959  	return true, vs.w.write(vs.scratch[:2])
   960  }
   961  
   962  func (vs *Visitor) onEmptyObject(l int) (bool, error) {
   963  	if l > 0 {
   964  		return false, nil
   965  	}
   966  
   967  	vs.scratch[0], vs.scratch[1] = objStartMarker, objEndMarker
   968  	return true, vs.w.write(vs.scratch[:2])
   969  }
   970  
   971  func (vs *Visitor) onObject(marker byte, count int) error {
   972  	return vs.onTypedStruct(objStartMarker, marker, count)
   973  }
   974  
   975  func maxNumType(a, b byte) byte {
   976  	switch {
   977  	case a == highPrecMarker || b == highPrecMarker:
   978  		return highPrecMarker
   979  	case a == int64Marker || b == int64Marker:
   980  		return int64Marker
   981  	case a == int32Marker || b == int32Marker:
   982  		return int32Marker
   983  	case a == int16Marker || b == int16Marker:
   984  		return int16Marker
   985  	case a == uint8Marker || b == uint8Marker:
   986  		return uint8Marker
   987  	default:
   988  		return int8Marker
   989  	}
   990  }
   991  
   992  func uintType(u uint64) byte {
   993  	switch {
   994  	case u <= math.MaxInt8:
   995  		return int8Marker
   996  	case u <= math.MaxUint8:
   997  		return uint8Marker
   998  	case u <= math.MaxInt16:
   999  		return int16Marker
  1000  	case u <= math.MaxInt32:
  1001  		return int32Marker
  1002  	case u <= math.MaxInt64:
  1003  		return int64Marker
  1004  	default:
  1005  		return highPrecMarker
  1006  	}
  1007  }