Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
7
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Open sidebar
ale
liber
Commits
bde98244
Commit
bde98244
authored
Jan 22, 2018
by
ale
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Update vendor deps
parent
cb57aefa
Pipeline
#829
passed with stages
in 1 minute and 22 seconds
Changes
29
Pipelines
1
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
29 changed files
with
842 additions
and
6708 deletions
+842
-6708
vendor/github.com/blevesearch/segment/maketesttables.go
vendor/github.com/blevesearch/segment/maketesttables.go
+0
-219
vendor/github.com/syndtr/goleveldb/leveldb/db.go
vendor/github.com/syndtr/goleveldb/leveldb/db.go
+12
-5
vendor/github.com/syndtr/goleveldb/leveldb/db_write.go
vendor/github.com/syndtr/goleveldb/leveldb/db_write.go
+3
-0
vendor/github.com/syndtr/goleveldb/leveldb/iterator/iter.go
vendor/github.com/syndtr/goleveldb/leveldb/iterator/iter.go
+1
-1
vendor/github.com/syndtr/goleveldb/leveldb/memdb/memdb.go
vendor/github.com/syndtr/goleveldb/leveldb/memdb/memdb.go
+1
-1
vendor/github.com/syndtr/goleveldb/leveldb/util/util.go
vendor/github.com/syndtr/goleveldb/leveldb/util/util.go
+1
-1
vendor/golang.org/x/net/context/context.go
vendor/golang.org/x/net/context/context.go
+2
-0
vendor/golang.org/x/net/html/atom/gen.go
vendor/golang.org/x/net/html/atom/gen.go
+0
-648
vendor/golang.org/x/net/html/atom/table.go
vendor/golang.org/x/net/html/atom/table.go
+766
-702
vendor/golang.org/x/net/html/const.go
vendor/golang.org/x/net/html/const.go
+3
-1
vendor/golang.org/x/net/html/doc.go
vendor/golang.org/x/net/html/doc.go
+4
-4
vendor/golang.org/x/sys/unix/mkpost.go
vendor/golang.org/x/sys/unix/mkpost.go
+0
-88
vendor/golang.org/x/sys/unix/types_darwin.go
vendor/golang.org/x/sys/unix/types_darwin.go
+0
-254
vendor/golang.org/x/sys/unix/types_dragonfly.go
vendor/golang.org/x/sys/unix/types_dragonfly.go
+0
-249
vendor/golang.org/x/sys/unix/types_freebsd.go
vendor/golang.org/x/sys/unix/types_freebsd.go
+0
-372
vendor/golang.org/x/sys/unix/types_netbsd.go
vendor/golang.org/x/sys/unix/types_netbsd.go
+0
-239
vendor/golang.org/x/sys/unix/types_openbsd.go
vendor/golang.org/x/sys/unix/types_openbsd.go
+0
-251
vendor/golang.org/x/sys/unix/types_solaris.go
vendor/golang.org/x/sys/unix/types_solaris.go
+0
-265
vendor/golang.org/x/text/encoding/charmap/maketables.go
vendor/golang.org/x/text/encoding/charmap/maketables.go
+0
-556
vendor/golang.org/x/text/encoding/htmlindex/gen.go
vendor/golang.org/x/text/encoding/htmlindex/gen.go
+0
-173
vendor/golang.org/x/text/encoding/internal/identifier/gen.go
vendor/golang.org/x/text/encoding/internal/identifier/gen.go
+0
-137
vendor/golang.org/x/text/encoding/japanese/maketables.go
vendor/golang.org/x/text/encoding/japanese/maketables.go
+0
-161
vendor/golang.org/x/text/encoding/korean/maketables.go
vendor/golang.org/x/text/encoding/korean/maketables.go
+0
-143
vendor/golang.org/x/text/encoding/simplifiedchinese/maketables.go
...olang.org/x/text/encoding/simplifiedchinese/maketables.go
+0
-161
vendor/golang.org/x/text/encoding/traditionalchinese/maketables.go
...lang.org/x/text/encoding/traditionalchinese/maketables.go
+0
-140
vendor/golang.org/x/text/language/gen.go
vendor/golang.org/x/text/language/gen.go
+0
-1706
vendor/golang.org/x/text/language/gen_common.go
vendor/golang.org/x/text/language/gen_common.go
+0
-20
vendor/golang.org/x/text/language/gen_index.go
vendor/golang.org/x/text/language/gen_index.go
+0
-162
vendor/vendor.json
vendor/vendor.json
+49
-49
No files found.
vendor/github.com/blevesearch/segment/maketesttables.go
deleted
100644 → 0
View file @
cb57aefa
// Copyright (c) 2015 Couchbase, Inc.
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
// except in compliance with the License. You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing, software distributed under the
// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
// either express or implied. See the License for the specific language governing permissions
// and limitations under the License.
// +build ignore
package
main
import
(
"bufio"
"bytes"
"flag"
"fmt"
"io"
"log"
"net/http"
"os"
"os/exec"
"strconv"
"strings"
"unicode"
)
var
url
=
flag
.
String
(
"url"
,
"http://www.unicode.org/Public/"
+
unicode
.
Version
+
"/ucd/auxiliary/"
,
"URL of Unicode database directory"
)
var
verbose
=
flag
.
Bool
(
"verbose"
,
false
,
"write data to stdout as it is parsed"
)
var
localFiles
=
flag
.
Bool
(
"local"
,
false
,
"data files have been copied to the current directory; for debugging only"
)
var
outputFile
=
flag
.
String
(
"output"
,
""
,
"output file for generated tables; default stdout"
)
var
output
*
bufio
.
Writer
func
main
()
{
flag
.
Parse
()
setupOutput
()
graphemeTests
:=
make
([]
test
,
0
)
graphemeComments
:=
make
([]
string
,
0
)
graphemeTests
,
graphemeComments
=
loadUnicodeData
(
"GraphemeBreakTest.txt"
,
graphemeTests
,
graphemeComments
)
wordTests
:=
make
([]
test
,
0
)
wordComments
:=
make
([]
string
,
0
)
wordTests
,
wordComments
=
loadUnicodeData
(
"WordBreakTest.txt"
,
wordTests
,
wordComments
)
sentenceTests
:=
make
([]
test
,
0
)
sentenceComments
:=
make
([]
string
,
0
)
sentenceTests
,
sentenceComments
=
loadUnicodeData
(
"SentenceBreakTest.txt"
,
sentenceTests
,
sentenceComments
)
fmt
.
Fprintf
(
output
,
fileHeader
,
*
url
)
generateTestTables
(
"Grapheme"
,
graphemeTests
,
graphemeComments
)
generateTestTables
(
"Word"
,
wordTests
,
wordComments
)
generateTestTables
(
"Sentence"
,
sentenceTests
,
sentenceComments
)
flushOutput
()
}
// WordBreakProperty.txt has the form:
// 05F0..05F2 ; Hebrew_Letter # Lo [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD
// FB1D ; Hebrew_Letter # Lo HEBREW LETTER YOD WITH HIRIQ
func
openReader
(
file
string
)
(
input
io
.
ReadCloser
)
{
if
*
localFiles
{
f
,
err
:=
os
.
Open
(
file
)
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
input
=
f
}
else
{
path
:=
*
url
+
file
resp
,
err
:=
http
.
Get
(
path
)
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
if
resp
.
StatusCode
!=
200
{
log
.
Fatal
(
"bad GET status for "
+
file
,
resp
.
Status
)
}
input
=
resp
.
Body
}
return
}
func
loadUnicodeData
(
filename
string
,
tests
[]
test
,
comments
[]
string
)
([]
test
,
[]
string
)
{
f
:=
openReader
(
filename
)
defer
f
.
Close
()
bufioReader
:=
bufio
.
NewReader
(
f
)
line
,
err
:=
bufioReader
.
ReadString
(
'\n'
)
for
err
==
nil
{
tests
,
comments
=
parseLine
(
line
,
tests
,
comments
)
line
,
err
=
bufioReader
.
ReadString
(
'\n'
)
}
// if the err was EOF still need to process last value
if
err
==
io
.
EOF
{
tests
,
comments
=
parseLine
(
line
,
tests
,
comments
)
}
return
tests
,
comments
}
const
comment
=
"#"
const
brk
=
"÷"
const
nbrk
=
"×"
type
test
[][]
byte
func
parseLine
(
line
string
,
tests
[]
test
,
comments
[]
string
)
([]
test
,
[]
string
)
{
if
strings
.
HasPrefix
(
line
,
comment
)
{
return
tests
,
comments
}
line
=
strings
.
TrimSpace
(
line
)
if
len
(
line
)
==
0
{
return
tests
,
comments
}
commentStart
:=
strings
.
Index
(
line
,
comment
)
comment
:=
strings
.
TrimSpace
(
line
[
commentStart
+
1
:
])
if
commentStart
>
0
{
line
=
line
[
0
:
commentStart
]
}
pieces
:=
strings
.
Split
(
line
,
brk
)
t
:=
make
(
test
,
0
)
for
_
,
piece
:=
range
pieces
{
piece
=
strings
.
TrimSpace
(
piece
)
if
len
(
piece
)
>
0
{
codePoints
:=
strings
.
Split
(
piece
,
nbrk
)
word
:=
""
for
_
,
codePoint
:=
range
codePoints
{
codePoint
=
strings
.
TrimSpace
(
codePoint
)
r
,
err
:=
strconv
.
ParseInt
(
codePoint
,
16
,
64
)
if
err
!=
nil
{
log
.
Printf
(
"err: %v for '%s'"
,
err
,
string
(
r
))
return
tests
,
comments
}
word
+=
string
(
r
)
}
t
=
append
(
t
,
[]
byte
(
word
))
}
}
tests
=
append
(
tests
,
t
)
comments
=
append
(
comments
,
comment
)
return
tests
,
comments
}
func
generateTestTables
(
prefix
string
,
tests
[]
test
,
comments
[]
string
)
{
fmt
.
Fprintf
(
output
,
testHeader
,
prefix
)
for
i
,
t
:=
range
tests
{
fmt
.
Fprintf
(
output
,
"
\t\t
{
\n
"
)
fmt
.
Fprintf
(
output
,
"
\t\t\t
input: %#v,
\n
"
,
bytes
.
Join
(
t
,
[]
byte
{}))
fmt
.
Fprintf
(
output
,
"
\t\t\t
output: %s,
\n
"
,
generateTest
(
t
))
fmt
.
Fprintf
(
output
,
"
\t\t\t
comment: `%s`,
\n
"
,
comments
[
i
])
fmt
.
Fprintf
(
output
,
"
\t\t
},
\n
"
)
}
fmt
.
Fprintf
(
output
,
"}
\n
"
)
}
func
generateTest
(
t
test
)
string
{
rv
:=
"[][]byte{"
for
_
,
te
:=
range
t
{
rv
+=
fmt
.
Sprintf
(
"%#v,"
,
te
)
}
rv
+=
"}"
return
rv
}
const
fileHeader
=
`// Generated by running
// maketesttables --url=%s
// DO NOT EDIT
package segment
`
const
testHeader
=
`var unicode%sTests = []struct {
input []byte
output [][]byte
comment string
}{
`
func
setupOutput
()
{
output
=
bufio
.
NewWriter
(
startGofmt
())
}
// startGofmt connects output to a gofmt process if -output is set.
func
startGofmt
()
io
.
Writer
{
if
*
outputFile
==
""
{
return
os
.
Stdout
}
stdout
,
err
:=
os
.
Create
(
*
outputFile
)
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
// Pipe output to gofmt.
gofmt
:=
exec
.
Command
(
"gofmt"
)
fd
,
err
:=
gofmt
.
StdinPipe
()
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
gofmt
.
Stdout
=
stdout
gofmt
.
Stderr
=
os
.
Stderr
err
=
gofmt
.
Start
()
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
return
fd
}
func
flushOutput
()
{
err
:=
output
.
Flush
()
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
}
vendor/github.com/syndtr/goleveldb/leveldb/db.go
View file @
bde98244
...
...
@@ -32,6 +32,11 @@ type DB struct {
// Need 64-bit alignment.
seq
uint64
// Stats. Need 64-bit alignment.
cWriteDelay
int64
// The cumulative duration of write delays
cWriteDelayN
int32
// The cumulative number of write delays
aliveSnaps
,
aliveIters
int32
// Session.
s
*
session
...
...
@@ -49,9 +54,6 @@ type DB struct {
snapsMu
sync
.
Mutex
snapsList
*
list
.
List
// Stats.
aliveSnaps
,
aliveIters
int32
// Write.
batchPool
sync
.
Pool
writeMergeC
chan
writeMerge
...
...
@@ -321,7 +323,7 @@ func recoverTable(s *session, o *opt.Options) error {
}
}
err
=
iter
.
Error
()
if
err
!=
nil
{
if
err
!=
nil
&&
!
errors
.
IsCorrupted
(
err
)
{
return
}
err
=
tw
.
Close
()
...
...
@@ -392,7 +394,7 @@ func recoverTable(s *session, o *opt.Options) error {
}
imax
=
append
(
imax
[
:
0
],
key
...
)
}
if
err
:=
iter
.
Error
();
err
!=
nil
{
if
err
:=
iter
.
Error
();
err
!=
nil
&&
!
errors
.
IsCorrupted
(
err
)
{
iter
.
Release
()
return
err
}
...
...
@@ -904,6 +906,8 @@ func (db *DB) GetSnapshot() (*Snapshot, error) {
// Returns the number of files at level 'n'.
// leveldb.stats
// Returns statistics of the underlying DB.
// leveldb.writedelay
// Returns cumulative write delay caused by compaction.
// leveldb.sstables
// Returns sstables list for each level.
// leveldb.blockpool
...
...
@@ -955,6 +959,9 @@ func (db *DB) GetProperty(name string) (value string, err error) {
level
,
len
(
tables
),
float64
(
tables
.
size
())
/
1048576.0
,
duration
.
Seconds
(),
float64
(
read
)
/
1048576.0
,
float64
(
write
)
/
1048576.0
)
}
case
p
==
"writedelay"
:
writeDelayN
,
writeDelay
:=
atomic
.
LoadInt32
(
&
db
.
cWriteDelayN
),
time
.
Duration
(
atomic
.
LoadInt64
(
&
db
.
cWriteDelay
))
value
=
fmt
.
Sprintf
(
"DelayN:%d Delay:%s"
,
writeDelayN
,
writeDelay
)
case
p
==
"sstables"
:
for
level
,
tables
:=
range
v
.
levels
{
value
+=
fmt
.
Sprintf
(
"--- level %d ---
\n
"
,
level
)
...
...
vendor/github.com/syndtr/goleveldb/leveldb/db_write.go
View file @
bde98244
...
...
@@ -7,6 +7,7 @@
package
leveldb
import
(
"sync/atomic"
"time"
"github.com/syndtr/goleveldb/leveldb/memdb"
...
...
@@ -117,6 +118,8 @@ func (db *DB) flush(n int) (mdb *memDB, mdbFree int, err error) {
db
.
writeDelayN
++
}
else
if
db
.
writeDelayN
>
0
{
db
.
logf
(
"db@write was delayed N·%d T·%v"
,
db
.
writeDelayN
,
db
.
writeDelay
)
atomic
.
AddInt32
(
&
db
.
cWriteDelayN
,
int32
(
db
.
writeDelayN
))
atomic
.
AddInt64
(
&
db
.
cWriteDelay
,
int64
(
db
.
writeDelay
))
db
.
writeDelay
=
0
db
.
writeDelayN
=
0
}
...
...
vendor/github.com/syndtr/goleveldb/leveldb/iterator/iter.go
View file @
bde98244
...
...
@@ -88,7 +88,7 @@ type Iterator interface {
// its contents may change on the next call to any 'seeks method'.
Key
()
[]
byte
// Value returns the
key
of the current key/value pair, or nil if done.
// Value returns the
value
of the current key/value pair, or nil if done.
// The caller should not modify the contents of the returned slice, and
// its contents may change on the next call to any 'seeks method'.
Value
()
[]
byte
...
...
vendor/github.com/syndtr/goleveldb/leveldb/memdb/memdb.go
View file @
bde98244
...
...
@@ -329,7 +329,7 @@ func (p *DB) Delete(key []byte) error {
h
:=
p
.
nodeData
[
node
+
nHeight
]
for
i
,
n
:=
range
p
.
prevNode
[
:
h
]
{
m
:=
n
+
4
+
i
m
:=
n
+
nNext
+
i
p
.
nodeData
[
m
]
=
p
.
nodeData
[
p
.
nodeData
[
m
]
+
nNext
+
i
]
}
...
...
vendor/github.com/syndtr/goleveldb/leveldb/util/util.go
View file @
bde98244
...
...
@@ -19,7 +19,7 @@ var (
// Releaser is the interface that wraps the basic Release method.
type
Releaser
interface
{
// Release releases associated resources. Release should always success
// and can be called multipe times without causing error.
// and can be called multip
l
e times without causing error.
Release
()
}
...
...
vendor/golang.org/x/net/context/context.go
View file @
bde98244
...
...
@@ -5,6 +5,8 @@
// Package context defines the Context type, which carries deadlines,
// cancelation signals, and other request-scoped values across API boundaries
// and between processes.
// As of Go 1.7 this package is available in the standard library under the
// name context. https://golang.org/pkg/context.
//
// Incoming requests to a server should create a Context, and outgoing calls to
// servers should accept a Context. The chain of function calls between must
...
...
vendor/golang.org/x/net/html/atom/gen.go
deleted
100644 → 0
View file @
cb57aefa
// Copyright 2012 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build ignore
package
main
// This program generates table.go and table_test.go.
// Invoke as
//
// go run gen.go |gofmt >table.go
// go run gen.go -test |gofmt >table_test.go
import
(
"flag"
"fmt"
"math/rand"
"os"
"sort"
"strings"
)
// identifier converts s to a Go exported identifier.
// It converts "div" to "Div" and "accept-charset" to "AcceptCharset".
func
identifier
(
s
string
)
string
{
b
:=
make
([]
byte
,
0
,
len
(
s
))
cap
:=
true
for
_
,
c
:=
range
s
{
if
c
==
'-'
{
cap
=
true
continue
}
if
cap
&&
'a'
<=
c
&&
c
<=
'z'
{
c
-=
'a'
-
'A'
}
cap
=
false
b
=
append
(
b
,
byte
(
c
))
}
return
string
(
b
)
}
var
test
=
flag
.
Bool
(
"test"
,
false
,
"generate table_test.go"
)
func
main
()
{
flag
.
Parse
()
var
all
[]
string
all
=
append
(
all
,
elements
...
)
all
=
append
(
all
,
attributes
...
)
all
=
append
(
all
,
eventHandlers
...
)
all
=
append
(
all
,
extra
...
)
sort
.
Strings
(
all
)
if
*
test
{
fmt
.
Printf
(
"// generated by go run gen.go -test; DO NOT EDIT
\n\n
"
)
fmt
.
Printf
(
"package atom
\n\n
"
)
fmt
.
Printf
(
"var testAtomList = []string{
\n
"
)
for
_
,
s
:=
range
all
{
fmt
.
Printf
(
"
\t
%q,
\n
"
,
s
)
}
fmt
.
Printf
(
"}
\n
"
)
return
}
// uniq - lists have dups
// compute max len too
maxLen
:=
0
w
:=
0
for
_
,
s
:=
range
all
{
if
w
==
0
||
all
[
w
-
1
]
!=
s
{
if
maxLen
<
len
(
s
)
{
maxLen
=
len
(
s
)
}
all
[
w
]
=
s
w
++
}
}
all
=
all
[
:
w
]
// Find hash that minimizes table size.
var
best
*
table
for
i
:=
0
;
i
<
1000000
;
i
++
{
if
best
!=
nil
&&
1
<<
(
best
.
k
-
1
)
<
len
(
all
)
{
break
}
h
:=
rand
.
Uint32
()
for
k
:=
uint
(
0
);
k
<=
16
;
k
++
{
if
best
!=
nil
&&
k
>=
best
.
k
{
break
}
var
t
table
if
t
.
init
(
h
,
k
,
all
)
{
best
=
&
t
break
}
}
}
if
best
==
nil
{
fmt
.
Fprintf
(
os
.
Stderr
,
"failed to construct string table
\n
"
)
os
.
Exit
(
1
)
}
// Lay out strings, using overlaps when possible.
layout
:=
append
([]
string
{},
all
...
)
// Remove strings that are substrings of other strings
for
changed
:=
true
;
changed
;
{
changed
=
false
for
i
,
s
:=
range
layout
{
if
s
==
""
{
continue
}
for
j
,
t
:=
range
layout
{
if
i
!=
j
&&
t
!=
""
&&
strings
.
Contains
(
s
,
t
)
{
changed
=
true
layout
[
j
]
=
""
}
}
}
}
// Join strings where one suffix matches another prefix.
for
{
// Find best i, j, k such that layout[i][len-k:] == layout[j][:k],
// maximizing overlap length k.
besti
:=
-
1
bestj
:=
-
1
bestk
:=
0
for
i
,
s
:=
range
layout
{
if
s
==
""
{
continue
}
for
j
,
t
:=
range
layout
{
if
i
==
j
{
continue
}
for
k
:=
bestk
+
1
;
k
<=
len
(
s
)
&&
k
<=
len
(
t
);
k
++
{
if
s
[
len
(
s
)
-
k
:
]
==
t
[
:
k
]
{
besti
=
i
bestj
=
j
bestk
=
k
}
}
}
}
if
bestk
>
0
{
layout
[
besti
]
+=
layout
[
bestj
][
bestk
:
]
layout
[
bestj
]
=
""
continue
}
break
}
text
:=
strings
.
Join
(
layout
,
""
)
atom
:=
map
[
string
]
uint32
{}
for
_
,
s
:=
range
all
{
off
:=
strings
.
Index
(
text
,
s
)
if
off
<
0
{
panic
(
"lost string "
+
s
)
}
atom
[
s
]
=
uint32
(
off
<<
8
|
len
(
s
))
}
// Generate the Go code.
fmt
.
Printf
(
"// generated by go run gen.go; DO NOT EDIT
\n\n
"
)
fmt
.
Printf
(
"package atom
\n\n
const (
\n
"
)
for
_
,
s
:=
range
all
{
fmt
.
Printf
(
"
\t
%s Atom = %#x
\n
"
,
identifier
(
s
),
atom
[
s
])
}
fmt
.
Printf
(
")
\n\n
"
)
fmt
.
Printf
(
"const hash0 = %#x
\n\n
"
,
best
.
h0
)
fmt
.
Printf
(
"const maxAtomLen = %d
\n\n
"
,
maxLen
)
fmt
.
Printf
(
"var table = [1<<%d]Atom{
\n
"
,
best
.
k
)
for
i
,
s
:=
range
best
.
tab
{
if
s
==
""
{
continue
}
fmt
.
Printf
(
"
\t
%#x: %#x, // %s
\n
"
,
i
,
atom
[
s
],
s
)
}
fmt
.
Printf
(
"}
\n
"
)
datasize
:=
(
1
<<
best
.
k
)
*
4
fmt
.
Printf
(
"const atomText =
\n
"
)
textsize
:=
len
(
text
)
for
len
(
text
)
>
60
{
fmt
.
Printf
(
"
\t
%q +
\n
"
,
text
[
:
60
])
text
=
text
[
60
:
]
}
fmt
.
Printf
(
"
\t
%q
\n\n
"
,
text
)
fmt
.
Fprintf
(
os
.
Stderr
,
"%d atoms; %d string bytes + %d tables = %d total data
\n
"
,
len
(
all
),
textsize
,
datasize
,
textsize
+
datasize
)
}
type
byLen
[]
string
func
(
x
byLen
)
Less
(
i
,
j
int
)
bool
{
return
len
(
x
[
i
])
>
len
(
x
[
j
])
}
func
(
x
byLen
)
Swap
(
i
,
j
int
)
{
x
[
i
],
x
[
j
]
=
x
[
j
],
x
[
i
]
}
func
(
x
byLen
)
Len
()
int
{
return
len
(
x
)
}
// fnv computes the FNV hash with an arbitrary starting value h.
func
fnv
(
h
uint32
,
s
string
)
uint32
{
for
i
:=
0
;
i
<
len
(
s
);
i
++
{
h
^=
uint32
(
s
[
i
])
h
*=
16777619
}
return
h
}
// A table represents an attempt at constructing the lookup table.
// The lookup table uses cuckoo hashing, meaning that each string
// can be found in one of two positions.
type
table
struct
{
h0
uint32
k
uint
mask
uint32
tab
[]
string
}
// hash returns the two hashes for s.
func
(
t
*
table
)
hash
(
s
string
)
(
h1
,
h2
uint32
)
{
h
:=
fnv
(
t
.
h0
,
s
)
h1
=
h
&
t
.
mask
h2
=
(
h
>>
16
)
&
t
.
mask
return
}
// init initializes the table with the given parameters.
// h0 is the initial hash value,
// k is the number of bits of hash value to use, and
// x is the list of strings to store in the table.
// init returns false if the table cannot be constructed.
func
(
t
*
table
)
init
(
h0
uint32
,
k
uint
,
x
[]
string
)
bool
{
t
.
h0
=
h0
t
.
k
=
k
t
.
tab
=
make
([]
string
,
1
<<
k
)
t
.
mask
=
1
<<
k
-
1
for
_
,
s
:=
range
x
{
if
!
t
.
insert
(
s
)
{
return
false
}
}
return
true
}
// insert inserts s in the table.
func
(
t
*
table
)
insert
(
s
string
)
bool
{
h1
,
h2
:=
t
.
hash
(
s
)
if
t
.
tab
[
h1
]
==
""
{
t
.
tab
[
h1
]
=
s
return
true
}
if
t
.
tab
[
h2
]
==
""
{