stream_int.go raw

   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  }
 191