conv/int.go (153 lines of code) (raw):
package conv
// Int8ToBytes is the fastest way to convert int8 into byte slice
func Int8ToBytes(n int8, buf *[4]byte) []byte {
if 0 == n {
return digits1[0]
}
return i8Dig(n, buf)
}
// Int16ToBytes is the fastest way to convert int16 into byte slice
func Int16ToBytes(n int16, buf *[6]byte) []byte {
if 0 == n {
return digits1[0]
}
return i16Dig(n, buf)
}
// Int32ToBytes is the fastest way to convert int32 into byte slice
func Int32ToBytes(n int32, buf *[11]byte) []byte {
if 0 == n {
return digits1[0]
}
return i32Dig(n, buf)
}
// Int64ToBytes is the fastest way to convert int64 into byte slice
func Int64ToBytes(n int64, buf *[20]byte) []byte {
if 0 == n {
return digits1[0]
}
return i64Dig(n, buf)
}
func i8Dig(n int8, buf *[4]byte) []byte {
if 0 < n {
if n < 10 {
return digits1[n]
} else if n < 100 {
return digits2[n]
} else {
n = n - 100
buf[1], buf[2], buf[3] = '1', digits2[n][0], digits2[n][1]
return buf[1:]
}
}
if n > -10 {
buf[2], buf[3] = '-', digits[-n]
return buf[2:]
} else if n > -100 {
buf[1], buf[2], buf[3] = '-', digits2[-n][0], digits2[-n][1]
return buf[1:]
}
n = -100 - n
buf[0], buf[1], buf[2], buf[3] = '-', '1', digits2[n][0], digits2[n][1]
return buf[:]
}
func i16Dig(n int16, buf *[6]byte) []byte {
var neg bool
var u uint16
if n > 0 {
if n < 10 {
return digits1[n]
} else if n < 100 {
return digits2[n]
}
u = uint16(n)
} else {
neg = true
u = uint16(n)
u = -u
}
pos := 6
for u >= 100 {
pos -= 2
is := u % 100
u /= 100
buf[pos+1], buf[pos] = digits2[is][1], digits2[is][0]
}
if u < 10 {
pos--
buf[pos] = digits[u]
} else {
pos -= 2
buf[pos+1], buf[pos] = digits2[u][1], digits2[u][0]
}
if neg {
pos--
buf[pos] = '-'
}
return buf[pos:]
}
func i32Dig(n int32, buf *[11]byte) []byte {
var neg bool
var u uint32
if n > 0 {
if n < 10 {
return digits1[n]
} else if n < 100 {
return digits2[n]
}
u = uint32(n)
} else {
neg = true
u = uint32(n)
u = -u
}
pos := 11
for u >= 100 {
pos -= 2
is := u % 100
u /= 100
buf[pos+1], buf[pos] = digits2[is][1], digits2[is][0]
}
if u < 10 {
pos--
buf[pos] = digits[u]
} else {
pos -= 2
buf[pos+1], buf[pos] = digits2[u][1], digits2[u][0]
}
if neg {
pos--
buf[pos] = '-'
}
return buf[pos:]
}
func i64Dig(n int64, buf *[20]byte) []byte {
var neg bool
var u uint64
if n > 0 {
if n < 10 {
return digits1[n]
} else if n < 100 {
return digits2[n]
}
u = uint64(n)
} else {
neg = true
u = uint64(n)
u = -u
}
pos := 20
for u >= 100 {
pos -= 2
is := u % 100
u /= 100
buf[pos+1], buf[pos] = digits2[is][1], digits2[is][0]
}
if u < 10 {
pos--
buf[pos] = digits[u]
} else {
pos -= 2
buf[pos+1], buf[pos] = digits2[u][1], digits2[u][0]
}
if neg {
pos--
buf[pos] = '-'
}
return buf[pos:]
}