msgpack-go

Message Pack Encoder/Decoder for Golang
git clone git://git.lair.cx/msgpack-go
Log | Files | Refs | LICENSE

encode_value.go (4210B)


      1 package msgpack
      2 
      3 import "math"
      4 
      5 func (e *Encoder) Nil() {
      6 	e.grow(1)
      7 	e.buf = append(e.buf, 0xc0)
      8 }
      9 
     10 func (e *Encoder) Bool(v bool) {
     11 	e.grow(1)
     12 	if v {
     13 		e.buf = append(e.buf, 0xc2)
     14 	} else {
     15 		e.buf = append(e.buf, 0xc3)
     16 	}
     17 }
     18 
     19 func (e *Encoder) Int(v int) {
     20 	switch {
     21 	case v > 0xffffffff:
     22 		e.Uint64(uint64(v))
     23 	case v > 0xffff:
     24 		e.Uint32(uint32(v))
     25 	case v > 0xff:
     26 		e.Uint16(uint16(v))
     27 	case v > 0x7f:
     28 		e.Uint8(uint8(v))
     29 	case v < -0x80000000:
     30 		e.Int64(int64(v))
     31 	case v < -0x8000:
     32 		e.Int32(int32(v))
     33 	case v < -0x80:
     34 		e.Int16(int16(v))
     35 	case v < -32:
     36 		e.Int8(int8(v))
     37 	default:
     38 		e.grow(1)
     39 		e.buf = append(e.buf, byte(v))
     40 	}
     41 }
     42 
     43 func (e *Encoder) Int8(v int8) {
     44 	e.grow(2)
     45 	e.buf = append(e.buf, 0xd0, byte(v))
     46 }
     47 
     48 func (e *Encoder) Int16(v int16) {
     49 	e.grow(3)
     50 	e.buf = append(e.buf, 0xd1)
     51 	e.serialize16(uint16(v))
     52 }
     53 
     54 func (e *Encoder) Int32(v int32) {
     55 	e.grow(5)
     56 	e.buf = append(e.buf, 0xd2)
     57 	e.serialize32(uint32(v))
     58 }
     59 
     60 func (e *Encoder) Int64(v int64) {
     61 	e.grow(9)
     62 	e.buf = append(e.buf, 0xd3)
     63 	e.serialize64(uint64(v))
     64 }
     65 
     66 func (e *Encoder) Uint(v uint) {
     67 	switch {
     68 	case v > 0xffffffff:
     69 		e.Uint64(uint64(v))
     70 	case v > 0xffff:
     71 		e.Uint32(uint32(v))
     72 	case v > 0xff:
     73 		e.Uint16(uint16(v))
     74 	case v > 0x7f:
     75 		e.Uint8(uint8(v))
     76 	default:
     77 		e.grow(1)
     78 		e.buf = append(e.buf, byte(v))
     79 	}
     80 }
     81 
     82 func (e *Encoder) Uint8(v uint8) {
     83 	e.grow(2)
     84 	e.buf = append(e.buf, 0xcc, byte(v))
     85 }
     86 
     87 func (e *Encoder) Uint16(v uint16) {
     88 	e.grow(3)
     89 	e.buf = append(e.buf, 0xcd)
     90 	e.serialize16(v)
     91 }
     92 
     93 func (e *Encoder) Uint32(v uint32) {
     94 	e.grow(5)
     95 	e.buf = append(e.buf, 0xce)
     96 	e.serialize32(v)
     97 }
     98 
     99 func (e *Encoder) Uint64(v uint64) {
    100 	e.grow(9)
    101 	e.buf = append(e.buf, 0xcf)
    102 	e.serialize64(v)
    103 }
    104 
    105 func (e *Encoder) Float32(v float32) {
    106 	b := math.Float32bits(v)
    107 	e.grow(5)
    108 	e.buf = append(e.buf, 0xca)
    109 	e.serialize32(b)
    110 }
    111 
    112 func (e *Encoder) Float64(v float64) {
    113 	b := math.Float64bits(v)
    114 	e.grow(9)
    115 	e.buf = append(e.buf, 0xcb)
    116 	e.serialize64(b)
    117 }
    118 
    119 func (e *Encoder) String(s string) {
    120 	switch {
    121 	case len(s) > 0xFFFF:
    122 		e.grow(len(s) + 5)
    123 		e.buf = append(e.buf, 0xdb)
    124 		e.serialize32(uint32(len(s)))
    125 	case len(s) > 0xFF:
    126 		e.grow(len(s) + 3)
    127 		e.buf = append(e.buf, 0xda)
    128 		e.serialize16(uint16(len(s)))
    129 	case len(s) > 31:
    130 		e.grow(len(s) + 2)
    131 		e.buf = append(e.buf, 0xd9, byte(len(s)))
    132 	default:
    133 		e.grow(len(s) + 1)
    134 		e.buf = append(e.buf, byte(0xa0|len(s)))
    135 	}
    136 	e.buf = append(e.buf, s...)
    137 }
    138 
    139 func (e *Encoder) Binary(s []byte) {
    140 	switch {
    141 	case len(s) > 0xFFFF:
    142 		e.grow(len(s) + 5)
    143 		e.buf = append(e.buf, 0xc6)
    144 		e.serialize32(uint32(len(s)))
    145 	case len(s) > 0xFF:
    146 		e.grow(len(s) + 3)
    147 		e.buf = append(e.buf, 0xc5)
    148 		e.serialize16(uint16(len(s)))
    149 	default:
    150 		e.grow(len(s) + 2)
    151 		e.buf = append(e.buf, 0xc4, byte(len(s)))
    152 	}
    153 	e.buf = append(e.buf, s...)
    154 }
    155 
    156 func (e *Encoder) Array(v Array) {
    157 	n := v.Len()
    158 	switch {
    159 	case n > 0xFFFF:
    160 		e.grow(5)
    161 		e.buf = append(e.buf, 0xdd)
    162 		e.serialize32(uint32(n))
    163 	case n > 15:
    164 		e.grow(3)
    165 		e.buf = append(e.buf, 0xdc)
    166 		e.serialize16(uint16(n))
    167 	default:
    168 		e.grow(1)
    169 		e.buf = append(e.buf, byte(0x90|n))
    170 	}
    171 
    172 	v.EncodeMsgpackArray(e)
    173 }
    174 
    175 func (e *Encoder) Map(v Map) {
    176 	n := v.Size()
    177 	switch {
    178 	case n > 0xFFFF:
    179 		e.grow(5)
    180 		e.buf = append(e.buf, 0xdf)
    181 		e.serialize32(uint32(n))
    182 	case n > 15:
    183 		e.grow(3)
    184 		e.buf = append(e.buf, 0xde)
    185 		e.serialize16(uint16(n))
    186 	default:
    187 		e.grow(1)
    188 		e.buf = append(e.buf, byte(0x80|n))
    189 	}
    190 
    191 	v.EncodeMsgpackMap(e)
    192 }
    193 
    194 func (e *Encoder) Ext(v Extension) {
    195 	var (
    196 		typ = byte(v.Type())
    197 		n   = v.Size()
    198 	)
    199 	switch {
    200 	case n == 1:
    201 		e.grow(3)
    202 		e.buf = append(e.buf, 0xd4, typ)
    203 	case n == 2:
    204 		e.grow(4)
    205 		e.buf = append(e.buf, 0xd5, typ)
    206 	case n == 4:
    207 		e.grow(6)
    208 		e.buf = append(e.buf, 0xd6, typ)
    209 	case n == 8:
    210 		e.grow(10)
    211 		e.buf = append(e.buf, 0xd7, typ)
    212 	case n == 16:
    213 		e.grow(18)
    214 		e.buf = append(e.buf, 0xd8, typ)
    215 	case n > 0xFFFF:
    216 		e.grow(6 + n)
    217 		e.buf = append(e.buf, 0xc9)
    218 		e.serialize32(uint32(n))
    219 		e.buf = append(e.buf, typ)
    220 	case n > 0xFF:
    221 		e.grow(4 + n)
    222 		e.buf = append(e.buf, 0xc8)
    223 		e.serialize16(uint16(n))
    224 		e.buf = append(e.buf, typ)
    225 	default:
    226 		e.grow(3 + n)
    227 		e.buf = append(e.buf, 0xc7, byte(n), typ)
    228 	}
    229 	v.EncodeMsgpackExt(e)
    230 }
    231 
    232 func (e *Encoder) Raw(p []byte) {
    233 	e.grow(len(p))
    234 	e.buf = append(e.buf, p...)
    235 }