stream_int.go (4580B)
1 package jsoniter 2 3 var digits []uint32 4 5 func init() { 6 digits = make([]uint32, 1000) 7 for i := uint32(0); i < 1000; i++ { 8 digits[i] = (((i / 100) + '0') << 16) + ((((i / 10) % 10) + '0') << 8) + i%10 + '0' 9 if i < 10 { 10 digits[i] += 2 << 24 11 } else if i < 100 { 12 digits[i] += 1 << 24 13 } 14 } 15 } 16 17 func writeFirstBuf(space []byte, v uint32) []byte { 18 start := v >> 24 19 if start == 0 { 20 space = append(space, byte(v>>16), byte(v>>8)) 21 } else if start == 1 { 22 space = append(space, byte(v>>8)) 23 } 24 space = append(space, byte(v)) 25 return space 26 } 27 28 func writeBuf(buf []byte, v uint32) []byte { 29 return append(buf, byte(v>>16), byte(v>>8), byte(v)) 30 } 31 32 // WriteUint8 write uint8 to stream 33 func (stream *Stream) WriteUint8(val uint8) { 34 stream.buf = writeFirstBuf(stream.buf, digits[val]) 35 } 36 37 // WriteInt8 write int8 to stream 38 func (stream *Stream) WriteInt8(nval int8) { 39 var val uint8 40 if nval < 0 { 41 val = uint8(-nval) 42 stream.buf = append(stream.buf, '-') 43 } else { 44 val = uint8(nval) 45 } 46 stream.buf = writeFirstBuf(stream.buf, digits[val]) 47 } 48 49 // WriteUint16 write uint16 to stream 50 func (stream *Stream) WriteUint16(val uint16) { 51 q1 := val / 1000 52 if q1 == 0 { 53 stream.buf = writeFirstBuf(stream.buf, digits[val]) 54 return 55 } 56 r1 := val - q1*1000 57 stream.buf = writeFirstBuf(stream.buf, digits[q1]) 58 stream.buf = writeBuf(stream.buf, digits[r1]) 59 return 60 } 61 62 // WriteInt16 write int16 to stream 63 func (stream *Stream) WriteInt16(nval int16) { 64 var val uint16 65 if nval < 0 { 66 val = uint16(-nval) 67 stream.buf = append(stream.buf, '-') 68 } else { 69 val = uint16(nval) 70 } 71 stream.WriteUint16(val) 72 } 73 74 // WriteUint32 write uint32 to stream 75 func (stream *Stream) WriteUint32(val uint32) { 76 q1 := val / 1000 77 if q1 == 0 { 78 stream.buf = writeFirstBuf(stream.buf, digits[val]) 79 return 80 } 81 r1 := val - q1*1000 82 q2 := q1 / 1000 83 if q2 == 0 { 84 stream.buf = writeFirstBuf(stream.buf, digits[q1]) 85 stream.buf = writeBuf(stream.buf, digits[r1]) 86 return 87 } 88 r2 := q1 - q2*1000 89 q3 := q2 / 1000 90 if q3 == 0 { 91 stream.buf = writeFirstBuf(stream.buf, digits[q2]) 92 } else { 93 r3 := q2 - q3*1000 94 stream.buf = append(stream.buf, byte(q3+'0')) 95 stream.buf = writeBuf(stream.buf, digits[r3]) 96 } 97 stream.buf = writeBuf(stream.buf, digits[r2]) 98 stream.buf = writeBuf(stream.buf, digits[r1]) 99 } 100 101 // WriteInt32 write int32 to stream 102 func (stream *Stream) WriteInt32(nval int32) { 103 var val uint32 104 if nval < 0 { 105 val = uint32(-nval) 106 stream.buf = append(stream.buf, '-') 107 } else { 108 val = uint32(nval) 109 } 110 stream.WriteUint32(val) 111 } 112 113 // WriteUint64 write uint64 to stream 114 func (stream *Stream) WriteUint64(val uint64) { 115 q1 := val / 1000 116 if q1 == 0 { 117 stream.buf = writeFirstBuf(stream.buf, digits[val]) 118 return 119 } 120 r1 := val - q1*1000 121 q2 := q1 / 1000 122 if q2 == 0 { 123 stream.buf = writeFirstBuf(stream.buf, digits[q1]) 124 stream.buf = writeBuf(stream.buf, digits[r1]) 125 return 126 } 127 r2 := q1 - q2*1000 128 q3 := q2 / 1000 129 if q3 == 0 { 130 stream.buf = writeFirstBuf(stream.buf, digits[q2]) 131 stream.buf = writeBuf(stream.buf, digits[r2]) 132 stream.buf = writeBuf(stream.buf, digits[r1]) 133 return 134 } 135 r3 := q2 - q3*1000 136 q4 := q3 / 1000 137 if q4 == 0 { 138 stream.buf = writeFirstBuf(stream.buf, digits[q3]) 139 stream.buf = writeBuf(stream.buf, digits[r3]) 140 stream.buf = writeBuf(stream.buf, digits[r2]) 141 stream.buf = writeBuf(stream.buf, digits[r1]) 142 return 143 } 144 r4 := q3 - q4*1000 145 q5 := q4 / 1000 146 if q5 == 0 { 147 stream.buf = writeFirstBuf(stream.buf, digits[q4]) 148 stream.buf = writeBuf(stream.buf, digits[r4]) 149 stream.buf = writeBuf(stream.buf, digits[r3]) 150 stream.buf = writeBuf(stream.buf, digits[r2]) 151 stream.buf = writeBuf(stream.buf, digits[r1]) 152 return 153 } 154 r5 := q4 - q5*1000 155 q6 := q5 / 1000 156 if q6 == 0 { 157 stream.buf = writeFirstBuf(stream.buf, digits[q5]) 158 } else { 159 stream.buf = writeFirstBuf(stream.buf, digits[q6]) 160 r6 := q5 - q6*1000 161 stream.buf = writeBuf(stream.buf, digits[r6]) 162 } 163 stream.buf = writeBuf(stream.buf, digits[r5]) 164 stream.buf = writeBuf(stream.buf, digits[r4]) 165 stream.buf = writeBuf(stream.buf, digits[r3]) 166 stream.buf = writeBuf(stream.buf, digits[r2]) 167 stream.buf = writeBuf(stream.buf, digits[r1]) 168 } 169 170 // WriteInt64 write int64 to stream 171 func (stream *Stream) WriteInt64(nval int64) { 172 var val uint64 173 if nval < 0 { 174 val = uint64(-nval) 175 stream.buf = append(stream.buf, '-') 176 } else { 177 val = uint64(nval) 178 } 179 stream.WriteUint64(val) 180 } 181 182 // WriteInt write int to stream 183 func (stream *Stream) WriteInt(val int) { 184 stream.WriteInt64(int64(val)) 185 } 186 187 // WriteUint write uint to stream 188 func (stream *Stream) WriteUint(val uint) { 189 stream.WriteUint64(uint64(val)) 190 }