1package strconv
  2
  3import (
  4	"math"
  5)
  6
  7// ParseInt parses a byte-slice and returns the integer it represents.
  8// If an invalid character is encountered, it will stop there.
  9func ParseInt(b []byte) (int64, int) {
 10	i := 0
 11	neg := false
 12	if len(b) > 0 && (b[0] == '+' || b[0] == '-') {
 13		neg = b[0] == '-'
 14		i++
 15	}
 16	start := i
 17	n := uint64(0)
 18	for i < len(b) {
 19		c := b[i]
 20		if n > math.MaxUint64/10 {
 21			return 0, 0
 22		} else if c >= '0' && c <= '9' {
 23			n *= 10
 24			n += uint64(c - '0')
 25		} else {
 26			break
 27		}
 28		i++
 29	}
 30	if i == start {
 31		return 0, 0
 32	}
 33	if !neg && n > uint64(math.MaxInt64) || n > uint64(math.MaxInt64)+1 {
 34		return 0, 0
 35	} else if neg {
 36		return -int64(n), i
 37	}
 38	return int64(n), i
 39}
 40
 41// ParseUint parses a byte-slice and returns the integer it represents.
 42// If an invalid character is encountered, it will stop there.
 43func ParseUint(b []byte) (uint64, int) {
 44	i := 0
 45	n := uint64(0)
 46	for i < len(b) {
 47		c := b[i]
 48		if n > math.MaxUint64/10 {
 49			return 0, 0
 50		} else if c >= '0' && c <= '9' {
 51			n *= 10
 52			n += uint64(c - '0')
 53		} else {
 54			break
 55		}
 56		i++
 57	}
 58	return n, i
 59}
 60
 61// LenInt returns the written length of an integer.
 62func LenInt(i int64) int {
 63	if i < 0 {
 64		if i == -9223372036854775808 {
 65			return 19
 66		}
 67		i = -i
 68	}
 69	switch {
 70	case i < 10:
 71		return 1
 72	case i < 100:
 73		return 2
 74	case i < 1000:
 75		return 3
 76	case i < 10000:
 77		return 4
 78	case i < 100000:
 79		return 5
 80	case i < 1000000:
 81		return 6
 82	case i < 10000000:
 83		return 7
 84	case i < 100000000:
 85		return 8
 86	case i < 1000000000:
 87		return 9
 88	case i < 10000000000:
 89		return 10
 90	case i < 100000000000:
 91		return 11
 92	case i < 1000000000000:
 93		return 12
 94	case i < 10000000000000:
 95		return 13
 96	case i < 100000000000000:
 97		return 14
 98	case i < 1000000000000000:
 99		return 15
100	case i < 10000000000000000:
101		return 16
102	case i < 100000000000000000:
103		return 17
104	case i < 1000000000000000000:
105		return 18
106	}
107	return 19
108}