Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
varnishapi
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
uplex-varnish
varnishapi
Commits
72621e58
Commit
72621e58
authored
Sep 05, 2018
by
Geoff Simmons
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add parseInt64() for byte slices (with no allocations).
parent
ee9c9637
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
510 additions
and
8 deletions
+510
-8
bytesconv.go
pkg/log/bytesconv.go
+133
-6
bytesconv_test.go
pkg/log/bytesconv_test.go
+377
-2
No files found.
pkg/log/bytesconv.go
View file @
72621e58
...
...
@@ -29,11 +29,28 @@
package
log
const
(
cutoff
=
^
uint32
(
0
)
/
10
rest
=
byte
(
^
uint32
(
0
)
-
cutoff
*
10
)
+
byte
(
'0'
)
cutoffU32
=
^
uint32
(
0
)
/
10
restU32
=
byte
(
^
uint32
(
0
)
-
cutoffU32
*
10
)
+
byte
(
'0'
)
maxSigned64
=
int64
(
^
uint64
(
1
<<
63
))
cutoffDec64
=
int64
(
maxSigned64
/
10
)
cutoffOct64
=
int64
(
1
<<
60
)
cutoffHex64
=
int64
(
1
<<
59
)
restPosDec64
=
byte
(
maxSigned64
-
cutoffDec64
*
10
)
+
byte
(
'0'
)
restNegDec64
=
byte
(
restPosDec64
+
1
)
ill
=
uint8
(
255
)
)
var
wsTable
=
wsTbl
()
var
(
wsTable
=
wsTbl
()
hxTbl
=
[
55
]
uint8
{
0
,
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
ill
,
ill
,
ill
,
ill
,
ill
,
ill
,
ill
,
10
,
11
,
12
,
13
,
14
,
15
,
ill
,
ill
,
ill
,
ill
,
ill
,
ill
,
ill
,
ill
,
ill
,
ill
,
ill
,
ill
,
ill
,
ill
,
ill
,
ill
,
ill
,
ill
,
ill
,
ill
,
ill
,
ill
,
ill
,
ill
,
ill
,
ill
,
10
,
11
,
12
,
13
,
14
,
15
,
}
)
func
wsTbl
()
[
256
]
bool
{
var
tbl
[
256
]
bool
...
...
@@ -52,11 +69,11 @@ func atoUint32(bytes []byte) (uint32, bool) {
}
val
:=
uint32
(
0
)
for
_
,
b
:=
range
bytes
{
if
val
>=
cutoff
{
if
val
>
cutoff
{
if
val
>=
cutoff
U32
{
if
val
>
cutoff
U32
{
return
0
,
false
}
if
b
>
rest
{
if
b
>
rest
U32
{
return
0
,
false
}
}
...
...
@@ -68,6 +85,116 @@ func atoUint32(bytes []byte) (uint32, bool) {
return
val
,
true
}
func
parseOct
(
bytes
[]
byte
,
pos
bool
)
(
int64
,
bool
)
{
val
:=
int64
(
0
)
for
_
,
b
:=
range
bytes
{
if
val
>=
cutoffOct64
{
if
pos
||
val
!=
cutoffOct64
||
b
!=
byte
(
'0'
)
{
return
0
,
false
}
}
if
b
<
byte
(
'0'
)
||
b
>
byte
(
'7'
)
{
if
wsTable
[
b
]
{
break
}
return
0
,
false
}
val
<<=
3
val
|=
int64
(
b
-
byte
(
'0'
))
}
if
pos
{
return
val
,
true
}
return
0
-
val
,
true
}
func
parseHex
(
bytes
[]
byte
,
pos
bool
)
(
int64
,
bool
)
{
val
:=
int64
(
0
)
for
_
,
b
:=
range
bytes
{
if
val
>=
cutoffHex64
{
if
pos
||
val
!=
cutoffHex64
||
b
!=
byte
(
'0'
)
{
return
0
,
false
}
}
if
b
<
byte
(
'0'
)
||
b
>
byte
(
'f'
)
||
hxTbl
[
b
-
byte
(
'0'
)]
==
ill
{
if
wsTable
[
b
]
{
break
}
return
0
,
false
}
val
<<=
4
val
|=
int64
(
hxTbl
[
b
-
byte
(
'0'
)])
}
if
pos
{
return
val
,
true
}
return
0
-
val
,
true
}
func
parseDec
(
bytes
[]
byte
,
pos
bool
)
(
int64
,
bool
)
{
rest
:=
restPosDec64
if
!
pos
{
rest
=
restNegDec64
}
val
:=
int64
(
0
)
for
_
,
b
:=
range
bytes
{
if
val
>=
cutoffDec64
{
if
val
>
cutoffDec64
{
return
0
,
false
}
if
b
>
rest
{
return
0
,
false
}
}
if
b
<
byte
(
'0'
)
||
b
>
byte
(
'9'
)
{
if
wsTable
[
b
]
{
break
}
return
0
,
false
}
val
=
val
*
10
+
int64
(
b
-
byte
(
'0'
))
}
if
pos
{
return
val
,
true
}
return
0
-
val
,
true
}
// ParseInt(b, 0, 64), or strtoll(b, &p, 0), for byte slices.
// Only whitespace after the digits is permitted.
func
parseInt64
(
bytes
[]
byte
)
(
int64
,
bool
)
{
l
:=
len
(
bytes
)
if
l
==
0
{
return
0
,
false
}
pos
:=
true
i
:=
0
for
;
i
<
l
&&
wsTable
[
bytes
[
i
]];
i
++
{
}
if
i
==
l
{
return
0
,
false
}
if
bytes
[
i
]
==
byte
(
'+'
)
||
bytes
[
i
]
==
byte
(
'-'
)
{
if
bytes
[
i
]
==
byte
(
'-'
)
{
pos
=
false
}
i
++
if
i
==
l
{
return
0
,
false
}
}
if
bytes
[
i
]
==
byte
(
'0'
)
{
if
i
==
l
{
return
0
,
true
}
if
i
+
1
<
l
&&
bytes
[
i
+
1
]
==
byte
(
'x'
)
{
return
parseHex
(
bytes
[
i
+
2
:
],
pos
)
}
return
parseOct
(
bytes
[
i
+
1
:
],
pos
)
}
return
parseDec
(
bytes
[
i
:
],
pos
)
}
// Return the byte slice delimiters of the Nth whitespace-separated
// field in the given byte slice, counting fields from 0 and ignoring
// leading and trailing whitespace:
...
...
pkg/log/bytesconv_test.go
View file @
72621e58
...
...
@@ -96,7 +96,7 @@ func BenchmarkStrconvAtoi(b *testing.B) {
}
}
var
delimVec
=
map
[
string
][]
struct
{
var
delimVec
=
map
[
string
][]
struct
{
fld
int
ok
bool
exp
string
...
...
@@ -200,3 +200,378 @@ func BenchmarkBytesFields(b *testing.B) {
_
=
bytes
.
Fields
(
s
)
}
}
type
parseInt64Exp
struct
{
val
int64
ok
bool
}
func
TestParseInt64
(
t
*
testing
.
T
)
{
expMap
:=
map
[
string
]
parseInt64Exp
{
""
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"0"
:
parseInt64Exp
{
val
:
0
,
ok
:
true
},
"1"
:
parseInt64Exp
{
val
:
1
,
ok
:
true
},
"9"
:
parseInt64Exp
{
val
:
9
,
ok
:
true
},
"10"
:
parseInt64Exp
{
val
:
10
,
ok
:
true
},
"101"
:
parseInt64Exp
{
val
:
101
,
ok
:
true
},
"1009"
:
parseInt64Exp
{
val
:
1009
,
ok
:
true
},
"foo"
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
" foo "
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"foo "
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
" foo"
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"4294967290"
:
parseInt64Exp
{
val
:
4294967290
,
ok
:
true
},
"4294967291"
:
parseInt64Exp
{
val
:
4294967291
,
ok
:
true
},
"4294967292"
:
parseInt64Exp
{
val
:
4294967292
,
ok
:
true
},
"4294967293"
:
parseInt64Exp
{
val
:
4294967293
,
ok
:
true
},
"4294967294"
:
parseInt64Exp
{
val
:
4294967294
,
ok
:
true
},
"4294967295"
:
parseInt64Exp
{
val
:
4294967295
,
ok
:
true
},
"4294967296"
:
parseInt64Exp
{
val
:
4294967296
,
ok
:
true
},
"4294967297"
:
parseInt64Exp
{
val
:
4294967297
,
ok
:
true
},
"4294967298"
:
parseInt64Exp
{
val
:
4294967298
,
ok
:
true
},
"4294967299"
:
parseInt64Exp
{
val
:
4294967299
,
ok
:
true
},
"+0"
:
parseInt64Exp
{
val
:
0
,
ok
:
true
},
"+1"
:
parseInt64Exp
{
val
:
1
,
ok
:
true
},
"+9"
:
parseInt64Exp
{
val
:
9
,
ok
:
true
},
"+10"
:
parseInt64Exp
{
val
:
10
,
ok
:
true
},
"+101"
:
parseInt64Exp
{
val
:
101
,
ok
:
true
},
"+1009"
:
parseInt64Exp
{
val
:
1009
,
ok
:
true
},
"+4294967299"
:
parseInt64Exp
{
val
:
4294967299
,
ok
:
true
},
"-0"
:
parseInt64Exp
{
val
:
0
,
ok
:
true
},
"-1"
:
parseInt64Exp
{
val
:
-
1
,
ok
:
true
},
"-9"
:
parseInt64Exp
{
val
:
-
9
,
ok
:
true
},
"-10"
:
parseInt64Exp
{
val
:
-
10
,
ok
:
true
},
"-101"
:
parseInt64Exp
{
val
:
-
101
,
ok
:
true
},
"-1009"
:
parseInt64Exp
{
val
:
-
1009
,
ok
:
true
},
"-4294967299"
:
parseInt64Exp
{
val
:
-
4294967299
,
ok
:
true
},
" +1"
:
parseInt64Exp
{
val
:
1
,
ok
:
true
},
" -1"
:
parseInt64Exp
{
val
:
-
1
,
ok
:
true
},
"00"
:
parseInt64Exp
{
val
:
0
,
ok
:
true
},
"01"
:
parseInt64Exp
{
val
:
1
,
ok
:
true
},
"02"
:
parseInt64Exp
{
val
:
2
,
ok
:
true
},
"03"
:
parseInt64Exp
{
val
:
3
,
ok
:
true
},
"04"
:
parseInt64Exp
{
val
:
4
,
ok
:
true
},
"05"
:
parseInt64Exp
{
val
:
5
,
ok
:
true
},
"06"
:
parseInt64Exp
{
val
:
6
,
ok
:
true
},
"07"
:
parseInt64Exp
{
val
:
7
,
ok
:
true
},
"08"
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"09"
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"010"
:
parseInt64Exp
{
val
:
8
,
ok
:
true
},
"011"
:
parseInt64Exp
{
val
:
9
,
ok
:
true
},
"012"
:
parseInt64Exp
{
val
:
10
,
ok
:
true
},
"013"
:
parseInt64Exp
{
val
:
11
,
ok
:
true
},
"014"
:
parseInt64Exp
{
val
:
12
,
ok
:
true
},
"015"
:
parseInt64Exp
{
val
:
13
,
ok
:
true
},
"016"
:
parseInt64Exp
{
val
:
14
,
ok
:
true
},
"017"
:
parseInt64Exp
{
val
:
15
,
ok
:
true
},
"0100"
:
parseInt64Exp
{
val
:
64
,
ok
:
true
},
"0177"
:
parseInt64Exp
{
val
:
127
,
ok
:
true
},
"01000"
:
parseInt64Exp
{
val
:
512
,
ok
:
true
},
"01777"
:
parseInt64Exp
{
val
:
1023
,
ok
:
true
},
"0187"
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"+00"
:
parseInt64Exp
{
val
:
0
,
ok
:
true
},
"+01"
:
parseInt64Exp
{
val
:
1
,
ok
:
true
},
"+02"
:
parseInt64Exp
{
val
:
2
,
ok
:
true
},
"+03"
:
parseInt64Exp
{
val
:
3
,
ok
:
true
},
"+04"
:
parseInt64Exp
{
val
:
4
,
ok
:
true
},
"+05"
:
parseInt64Exp
{
val
:
5
,
ok
:
true
},
"+06"
:
parseInt64Exp
{
val
:
6
,
ok
:
true
},
"+07"
:
parseInt64Exp
{
val
:
7
,
ok
:
true
},
"+08"
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"+09"
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"+010"
:
parseInt64Exp
{
val
:
8
,
ok
:
true
},
"+011"
:
parseInt64Exp
{
val
:
9
,
ok
:
true
},
"+012"
:
parseInt64Exp
{
val
:
10
,
ok
:
true
},
"+013"
:
parseInt64Exp
{
val
:
11
,
ok
:
true
},
"+014"
:
parseInt64Exp
{
val
:
12
,
ok
:
true
},
"+015"
:
parseInt64Exp
{
val
:
13
,
ok
:
true
},
"+016"
:
parseInt64Exp
{
val
:
14
,
ok
:
true
},
"+017"
:
parseInt64Exp
{
val
:
15
,
ok
:
true
},
"+0100"
:
parseInt64Exp
{
val
:
64
,
ok
:
true
},
"+0177"
:
parseInt64Exp
{
val
:
127
,
ok
:
true
},
"+01000"
:
parseInt64Exp
{
val
:
512
,
ok
:
true
},
"+01777"
:
parseInt64Exp
{
val
:
1023
,
ok
:
true
},
"-00"
:
parseInt64Exp
{
val
:
0
,
ok
:
true
},
"-01"
:
parseInt64Exp
{
val
:
-
1
,
ok
:
true
},
"-02"
:
parseInt64Exp
{
val
:
-
2
,
ok
:
true
},
"-03"
:
parseInt64Exp
{
val
:
-
3
,
ok
:
true
},
"-04"
:
parseInt64Exp
{
val
:
-
4
,
ok
:
true
},
"-05"
:
parseInt64Exp
{
val
:
-
5
,
ok
:
true
},
"-06"
:
parseInt64Exp
{
val
:
-
6
,
ok
:
true
},
"-07"
:
parseInt64Exp
{
val
:
-
7
,
ok
:
true
},
"-08"
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"-09"
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"-010"
:
parseInt64Exp
{
val
:
-
8
,
ok
:
true
},
"-011"
:
parseInt64Exp
{
val
:
-
9
,
ok
:
true
},
"-012"
:
parseInt64Exp
{
val
:
-
10
,
ok
:
true
},
"-013"
:
parseInt64Exp
{
val
:
-
11
,
ok
:
true
},
"-014"
:
parseInt64Exp
{
val
:
-
12
,
ok
:
true
},
"-015"
:
parseInt64Exp
{
val
:
-
13
,
ok
:
true
},
"-016"
:
parseInt64Exp
{
val
:
-
14
,
ok
:
true
},
"-017"
:
parseInt64Exp
{
val
:
-
15
,
ok
:
true
},
"-0100"
:
parseInt64Exp
{
val
:
-
64
,
ok
:
true
},
"-0177"
:
parseInt64Exp
{
val
:
-
127
,
ok
:
true
},
"-01000"
:
parseInt64Exp
{
val
:
-
512
,
ok
:
true
},
"-01777"
:
parseInt64Exp
{
val
:
-
1023
,
ok
:
true
},
" 01777 "
:
parseInt64Exp
{
val
:
1023
,
ok
:
true
},
" +01777 "
:
parseInt64Exp
{
val
:
1023
,
ok
:
true
},
" -01777 "
:
parseInt64Exp
{
val
:
-
1023
,
ok
:
true
},
"0x0"
:
parseInt64Exp
{
val
:
0
,
ok
:
true
},
"0x1"
:
parseInt64Exp
{
val
:
1
,
ok
:
true
},
"0x2"
:
parseInt64Exp
{
val
:
2
,
ok
:
true
},
"0x3"
:
parseInt64Exp
{
val
:
3
,
ok
:
true
},
"0x4"
:
parseInt64Exp
{
val
:
4
,
ok
:
true
},
"0x5"
:
parseInt64Exp
{
val
:
5
,
ok
:
true
},
"0x6"
:
parseInt64Exp
{
val
:
6
,
ok
:
true
},
"0x7"
:
parseInt64Exp
{
val
:
7
,
ok
:
true
},
"0x8"
:
parseInt64Exp
{
val
:
8
,
ok
:
true
},
"0x9"
:
parseInt64Exp
{
val
:
9
,
ok
:
true
},
"0xa"
:
parseInt64Exp
{
val
:
10
,
ok
:
true
},
"0xb"
:
parseInt64Exp
{
val
:
11
,
ok
:
true
},
"0xc"
:
parseInt64Exp
{
val
:
12
,
ok
:
true
},
"0xd"
:
parseInt64Exp
{
val
:
13
,
ok
:
true
},
"0xe"
:
parseInt64Exp
{
val
:
14
,
ok
:
true
},
"0xf"
:
parseInt64Exp
{
val
:
15
,
ok
:
true
},
"0xA"
:
parseInt64Exp
{
val
:
10
,
ok
:
true
},
"0xB"
:
parseInt64Exp
{
val
:
11
,
ok
:
true
},
"0xC"
:
parseInt64Exp
{
val
:
12
,
ok
:
true
},
"0xD"
:
parseInt64Exp
{
val
:
13
,
ok
:
true
},
"0xE"
:
parseInt64Exp
{
val
:
14
,
ok
:
true
},
"0xF"
:
parseInt64Exp
{
val
:
15
,
ok
:
true
},
"0xg"
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"0xG"
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"0x10"
:
parseInt64Exp
{
val
:
16
,
ok
:
true
},
"0x11"
:
parseInt64Exp
{
val
:
17
,
ok
:
true
},
"0x12"
:
parseInt64Exp
{
val
:
18
,
ok
:
true
},
"0x100"
:
parseInt64Exp
{
val
:
256
,
ok
:
true
},
"0x1fF"
:
parseInt64Exp
{
val
:
511
,
ok
:
true
},
"0xdeadbeef"
:
parseInt64Exp
{
val
:
3735928559
,
ok
:
true
},
"0xDeAdBeEf"
:
parseInt64Exp
{
val
:
3735928559
,
ok
:
true
},
"0x1gF"
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"0x1=F"
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"+0x0"
:
parseInt64Exp
{
val
:
0
,
ok
:
true
},
"+0x1"
:
parseInt64Exp
{
val
:
1
,
ok
:
true
},
"+0x2"
:
parseInt64Exp
{
val
:
2
,
ok
:
true
},
"+0x3"
:
parseInt64Exp
{
val
:
3
,
ok
:
true
},
"+0x4"
:
parseInt64Exp
{
val
:
4
,
ok
:
true
},
"+0x5"
:
parseInt64Exp
{
val
:
5
,
ok
:
true
},
"+0x6"
:
parseInt64Exp
{
val
:
6
,
ok
:
true
},
"+0x7"
:
parseInt64Exp
{
val
:
7
,
ok
:
true
},
"+0x8"
:
parseInt64Exp
{
val
:
8
,
ok
:
true
},
"+0x9"
:
parseInt64Exp
{
val
:
9
,
ok
:
true
},
"+0xa"
:
parseInt64Exp
{
val
:
10
,
ok
:
true
},
"+0xb"
:
parseInt64Exp
{
val
:
11
,
ok
:
true
},
"+0xc"
:
parseInt64Exp
{
val
:
12
,
ok
:
true
},
"+0xd"
:
parseInt64Exp
{
val
:
13
,
ok
:
true
},
"+0xe"
:
parseInt64Exp
{
val
:
14
,
ok
:
true
},
"+0xf"
:
parseInt64Exp
{
val
:
15
,
ok
:
true
},
"+0xA"
:
parseInt64Exp
{
val
:
10
,
ok
:
true
},
"+0xB"
:
parseInt64Exp
{
val
:
11
,
ok
:
true
},
"+0xC"
:
parseInt64Exp
{
val
:
12
,
ok
:
true
},
"+0xD"
:
parseInt64Exp
{
val
:
13
,
ok
:
true
},
"+0xE"
:
parseInt64Exp
{
val
:
14
,
ok
:
true
},
"+0xF"
:
parseInt64Exp
{
val
:
15
,
ok
:
true
},
"+0x10"
:
parseInt64Exp
{
val
:
16
,
ok
:
true
},
"+0x11"
:
parseInt64Exp
{
val
:
17
,
ok
:
true
},
"+0x12"
:
parseInt64Exp
{
val
:
18
,
ok
:
true
},
"+0x100"
:
parseInt64Exp
{
val
:
256
,
ok
:
true
},
"+0x1fF"
:
parseInt64Exp
{
val
:
511
,
ok
:
true
},
"+0xdeadbeef"
:
parseInt64Exp
{
val
:
3735928559
,
ok
:
true
},
"+0xDeAdBeEf"
:
parseInt64Exp
{
val
:
3735928559
,
ok
:
true
},
"-0x0"
:
parseInt64Exp
{
val
:
0
,
ok
:
true
},
"-0x1"
:
parseInt64Exp
{
val
:
-
1
,
ok
:
true
},
"-0x2"
:
parseInt64Exp
{
val
:
-
2
,
ok
:
true
},
"-0x3"
:
parseInt64Exp
{
val
:
-
3
,
ok
:
true
},
"-0x4"
:
parseInt64Exp
{
val
:
-
4
,
ok
:
true
},
"-0x5"
:
parseInt64Exp
{
val
:
-
5
,
ok
:
true
},
"-0x6"
:
parseInt64Exp
{
val
:
-
6
,
ok
:
true
},
"-0x7"
:
parseInt64Exp
{
val
:
-
7
,
ok
:
true
},
"-0x8"
:
parseInt64Exp
{
val
:
-
8
,
ok
:
true
},
"-0x9"
:
parseInt64Exp
{
val
:
-
9
,
ok
:
true
},
"-0xa"
:
parseInt64Exp
{
val
:
-
10
,
ok
:
true
},
"-0xb"
:
parseInt64Exp
{
val
:
-
11
,
ok
:
true
},
"-0xc"
:
parseInt64Exp
{
val
:
-
12
,
ok
:
true
},
"-0xd"
:
parseInt64Exp
{
val
:
-
13
,
ok
:
true
},
"-0xe"
:
parseInt64Exp
{
val
:
-
14
,
ok
:
true
},
"-0xf"
:
parseInt64Exp
{
val
:
-
15
,
ok
:
true
},
"-0xA"
:
parseInt64Exp
{
val
:
-
10
,
ok
:
true
},
"-0xB"
:
parseInt64Exp
{
val
:
-
11
,
ok
:
true
},
"-0xC"
:
parseInt64Exp
{
val
:
-
12
,
ok
:
true
},
"-0xD"
:
parseInt64Exp
{
val
:
-
13
,
ok
:
true
},
"-0xE"
:
parseInt64Exp
{
val
:
-
14
,
ok
:
true
},
"-0xF"
:
parseInt64Exp
{
val
:
-
15
,
ok
:
true
},
"-0x10"
:
parseInt64Exp
{
val
:
-
16
,
ok
:
true
},
"-0x11"
:
parseInt64Exp
{
val
:
-
17
,
ok
:
true
},
"-0x12"
:
parseInt64Exp
{
val
:
-
18
,
ok
:
true
},
"-0x100"
:
parseInt64Exp
{
val
:
-
256
,
ok
:
true
},
"-0x1fF"
:
parseInt64Exp
{
val
:
-
511
,
ok
:
true
},
"-0xdeadbeef"
:
parseInt64Exp
{
val
:
-
3735928559
,
ok
:
true
},
"-0xDeAdBeEf"
:
parseInt64Exp
{
val
:
-
3735928559
,
ok
:
true
},
" +0x1 "
:
parseInt64Exp
{
val
:
1
,
ok
:
true
},
" -0x1 "
:
parseInt64Exp
{
val
:
-
1
,
ok
:
true
},
"0x1 "
:
parseInt64Exp
{
val
:
1
,
ok
:
true
},
" 0x1"
:
parseInt64Exp
{
val
:
1
,
ok
:
true
},
" 1 2 "
:
parseInt64Exp
{
val
:
1
,
ok
:
true
},
" 1 foo "
:
parseInt64Exp
{
val
:
1
,
ok
:
true
},
" 1foo "
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"9223372036854775800"
:
parseInt64Exp
{
val
:
9223372036854775800
,
ok
:
true
},
"9223372036854775801"
:
parseInt64Exp
{
val
:
9223372036854775801
,
ok
:
true
},
"9223372036854775802"
:
parseInt64Exp
{
val
:
9223372036854775802
,
ok
:
true
},
"9223372036854775803"
:
parseInt64Exp
{
val
:
9223372036854775803
,
ok
:
true
},
"9223372036854775804"
:
parseInt64Exp
{
val
:
9223372036854775804
,
ok
:
true
},
"9223372036854775805"
:
parseInt64Exp
{
val
:
9223372036854775805
,
ok
:
true
},
"9223372036854775806"
:
parseInt64Exp
{
val
:
9223372036854775806
,
ok
:
true
},
"9223372036854775807"
:
parseInt64Exp
{
val
:
9223372036854775807
,
ok
:
true
},
"9223372036854775808"
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"9223372036854775809"
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"9223372036854775810"
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"9223372036854775811"
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"+9223372036854775800"
:
parseInt64Exp
{
val
:
9223372036854775800
,
ok
:
true
},
"+9223372036854775801"
:
parseInt64Exp
{
val
:
9223372036854775801
,
ok
:
true
},
"+9223372036854775802"
:
parseInt64Exp
{
val
:
9223372036854775802
,
ok
:
true
},
"+9223372036854775803"
:
parseInt64Exp
{
val
:
9223372036854775803
,
ok
:
true
},
"+9223372036854775804"
:
parseInt64Exp
{
val
:
9223372036854775804
,
ok
:
true
},
"+9223372036854775805"
:
parseInt64Exp
{
val
:
9223372036854775805
,
ok
:
true
},
"+9223372036854775806"
:
parseInt64Exp
{
val
:
9223372036854775806
,
ok
:
true
},
"+9223372036854775807"
:
parseInt64Exp
{
val
:
9223372036854775807
,
ok
:
true
},
"+9223372036854775808"
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"+9223372036854775809"
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"+9223372036854775810"
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"+9223372036854775811"
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"-9223372036854775800"
:
parseInt64Exp
{
val
:
-
9223372036854775800
,
ok
:
true
},
"-9223372036854775801"
:
parseInt64Exp
{
val
:
-
9223372036854775801
,
ok
:
true
},
"-9223372036854775802"
:
parseInt64Exp
{
val
:
-
9223372036854775802
,
ok
:
true
},
"-9223372036854775803"
:
parseInt64Exp
{
val
:
-
9223372036854775803
,
ok
:
true
},
"-9223372036854775804"
:
parseInt64Exp
{
val
:
-
9223372036854775804
,
ok
:
true
},
"-9223372036854775805"
:
parseInt64Exp
{
val
:
-
9223372036854775805
,
ok
:
true
},
"-9223372036854775806"
:
parseInt64Exp
{
val
:
-
9223372036854775806
,
ok
:
true
},
"-9223372036854775807"
:
parseInt64Exp
{
val
:
-
9223372036854775807
,
ok
:
true
},
"-9223372036854775808"
:
parseInt64Exp
{
val
:
-
9223372036854775808
,
ok
:
true
},
"-9223372036854775809"
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"-9223372036854775810"
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"-9223372036854775820"
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"0777777777777777777770"
:
parseInt64Exp
{
val
:
9223372036854775800
,
ok
:
true
},
"0777777777777777777771"
:
parseInt64Exp
{
val
:
9223372036854775801
,
ok
:
true
},
"0777777777777777777772"
:
parseInt64Exp
{
val
:
9223372036854775802
,
ok
:
true
},
"0777777777777777777773"
:
parseInt64Exp
{
val
:
9223372036854775803
,
ok
:
true
},
"0777777777777777777774"
:
parseInt64Exp
{
val
:
9223372036854775804
,
ok
:
true
},
"0777777777777777777775"
:
parseInt64Exp
{
val
:
9223372036854775805
,
ok
:
true
},
"0777777777777777777776"
:
parseInt64Exp
{
val
:
9223372036854775806
,
ok
:
true
},
"0777777777777777777777"
:
parseInt64Exp
{
val
:
9223372036854775807
,
ok
:
true
},
"01000000000000000000000"
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"01000000000000000000001"
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"01000000000000000000002"
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"-0777777777777777777777"
:
parseInt64Exp
{
val
:
-
9223372036854775807
,
ok
:
true
},
"-01000000000000000000000"
:
parseInt64Exp
{
val
:
-
9223372036854775808
,
ok
:
true
},
"-01000000000000000000001"
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"-01000000000000000000002"
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"-01000000000000000000003"
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"0x7FFFFFFFFFFFFFF0"
:
parseInt64Exp
{
val
:
9223372036854775792
,
ok
:
true
},
"0x7FFFFFFFFFFFFFF1"
:
parseInt64Exp
{
val
:
9223372036854775793
,
ok
:
true
},
"0x7FFFFFFFFFFFFFF2"
:
parseInt64Exp
{
val
:
9223372036854775794
,
ok
:
true
},
"0x7FFFFFFFFFFFFFF3"
:
parseInt64Exp
{
val
:
9223372036854775795
,
ok
:
true
},
"0x7FFFFFFFFFFFFFF4"
:
parseInt64Exp
{
val
:
9223372036854775796
,
ok
:
true
},
"0x7FFFFFFFFFFFFFF5"
:
parseInt64Exp
{
val
:
9223372036854775797
,
ok
:
true
},
"0x7FFFFFFFFFFFFFF6"
:
parseInt64Exp
{
val
:
9223372036854775798
,
ok
:
true
},
"0x7FFFFFFFFFFFFFF7"
:
parseInt64Exp
{
val
:
9223372036854775799
,
ok
:
true
},
"0x7FFFFFFFFFFFFFF8"
:
parseInt64Exp
{
val
:
9223372036854775800
,
ok
:
true
},
"0x7FFFFFFFFFFFFFF9"
:
parseInt64Exp
{
val
:
9223372036854775801
,
ok
:
true
},
"0x7FFFFFFFFFFFFFFA"
:
parseInt64Exp
{
val
:
9223372036854775802
,
ok
:
true
},
"0x7FFFFFFFFFFFFFFB"
:
parseInt64Exp
{
val
:
9223372036854775803
,
ok
:
true
},
"0x7FFFFFFFFFFFFFFC"
:
parseInt64Exp
{
val
:
9223372036854775804
,
ok
:
true
},
"0x7FFFFFFFFFFFFFFD"
:
parseInt64Exp
{
val
:
9223372036854775805
,
ok
:
true
},
"0x7FFFFFFFFFFFFFFE"
:
parseInt64Exp
{
val
:
9223372036854775806
,
ok
:
true
},
"0x7FFFFFFFFFFFFFFF"
:
parseInt64Exp
{
val
:
9223372036854775807
,
ok
:
true
},
"0x8000000000000000"
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"0x8000000000000001"
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"0x8000000000000002"
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"-0x7FFFFFFFFFFFFFFE"
:
parseInt64Exp
{
val
:
-
9223372036854775806
,
ok
:
true
},
"-0x7FFFFFFFFFFFFFFF"
:
parseInt64Exp
{
val
:
-
9223372036854775807
,
ok
:
true
},
"-0x8000000000000000"
:
parseInt64Exp
{
val
:
-
9223372036854775808
,
ok
:
true
},
"-0x8000000000000001"
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
"-0x8000000000000002"
:
parseInt64Exp
{
val
:
0
,
ok
:
false
},
}
for
str
,
exp
:=
range
expMap
{
val
,
ok
:=
parseInt64
([]
byte
(
str
))
if
val
!=
exp
.
val
||
ok
!=
exp
.
ok
{
t
.
Errorf
(
"parseInt64(%s) want=%v got=%v"
,
str
,
exp
,
parseInt64Exp
{
val
:
val
,
ok
:
ok
})
}
}
}
func
BenchmarkParseInt64
(
b
*
testing
.
B
)
{
s
:=
[]
byte
(
"9223372036854775807"
)
b
.
ReportAllocs
()
b
.
ResetTimer
()
for
i
:=
0
;
i
<
b
.
N
;
i
++
{
_
,
ok
:=
parseInt64
(
s
)
if
!
ok
{
b
.
Fatal
(
"parseInt64() failed to parse"
)
return
}
}
}
func
BenchmarkStrconvParseInt
(
b
*
testing
.
B
)
{
s
:=
[]
byte
(
"9223372036854775807"
)
b
.
ReportAllocs
()
b
.
ResetTimer
()
for
i
:=
0
;
i
<
b
.
N
;
i
++
{
_
,
_
=
strconv
.
ParseInt
(
string
(
s
),
0
,
64
)
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment