vendor: remove vendored golang.org/x/tools, as it's not needed
Akihiro Suda authored on 2020/12/08 00:55:121 | 1 |
deleted file mode 100644 |
... | ... |
@@ -1,27 +0,0 @@ |
1 |
-Copyright (c) 2009 The Go Authors. All rights reserved. |
|
2 |
- |
|
3 |
-Redistribution and use in source and binary forms, with or without |
|
4 |
-modification, are permitted provided that the following conditions are |
|
5 |
-met: |
|
6 |
- |
|
7 |
- * Redistributions of source code must retain the above copyright |
|
8 |
-notice, this list of conditions and the following disclaimer. |
|
9 |
- * Redistributions in binary form must reproduce the above |
|
10 |
-copyright notice, this list of conditions and the following disclaimer |
|
11 |
-in the documentation and/or other materials provided with the |
|
12 |
-distribution. |
|
13 |
- * Neither the name of Google Inc. nor the names of its |
|
14 |
-contributors may be used to endorse or promote products derived from |
|
15 |
-this software without specific prior written permission. |
|
16 |
- |
|
17 |
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
18 |
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|
19 |
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
|
20 |
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
|
21 |
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|
22 |
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
|
23 |
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|
24 |
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
|
25 |
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|
26 |
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
|
27 |
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
28 | 1 |
deleted file mode 100644 |
... | ... |
@@ -1,22 +0,0 @@ |
1 |
-Additional IP Rights Grant (Patents) |
|
2 |
- |
|
3 |
-"This implementation" means the copyrightable works distributed by |
|
4 |
-Google as part of the Go project. |
|
5 |
- |
|
6 |
-Google hereby grants to You a perpetual, worldwide, non-exclusive, |
|
7 |
-no-charge, royalty-free, irrevocable (except as stated in this section) |
|
8 |
-patent license to make, have made, use, offer to sell, sell, import, |
|
9 |
-transfer and otherwise run, modify and propagate the contents of this |
|
10 |
-implementation of Go, where such license applies only to those patent |
|
11 |
-claims, both currently owned or controlled by Google and acquired in |
|
12 |
-the future, licensable by Google that are necessarily infringed by this |
|
13 |
-implementation of Go. This grant does not include claims that would be |
|
14 |
-infringed only as a consequence of further modification of this |
|
15 |
-implementation. If you or your agent or exclusive licensee institute or |
|
16 |
-order or agree to the institution of patent litigation against any |
|
17 |
-entity (including a cross-claim or counterclaim in a lawsuit) alleging |
|
18 |
-that this implementation of Go or any code incorporated within this |
|
19 |
-implementation of Go constitutes direct or contributory patent |
|
20 |
-infringement, or inducement of patent infringement, then any patent |
|
21 |
-rights granted to you under this License for this implementation of Go |
|
22 |
-shall terminate as of the date such litigation is filed. |
23 | 1 |
deleted file mode 100644 |
... | ... |
@@ -1,27 +0,0 @@ |
1 |
-# Go Tools |
|
2 |
- |
|
3 |
-This subrepository holds the source for various packages and tools that support |
|
4 |
-the Go programming language. |
|
5 |
- |
|
6 |
-Some of the tools, `godoc` and `vet` for example, are included in binary Go |
|
7 |
-distributions. |
|
8 |
- |
|
9 |
-Others, including the Go `guru` and the test coverage tool, can be fetched with |
|
10 |
-`go get`. |
|
11 |
- |
|
12 |
-Packages include a type-checker for Go and an implementation of the |
|
13 |
-Static Single Assignment form (SSA) representation for Go programs. |
|
14 |
- |
|
15 |
-## Download/Install |
|
16 |
- |
|
17 |
-The easiest way to install is to run `go get -u golang.org/x/tools/...`. You can |
|
18 |
-also manually git clone the repository to `$GOPATH/src/golang.org/x/tools`. |
|
19 |
- |
|
20 |
-## Report Issues / Send Patches |
|
21 |
- |
|
22 |
-This repository uses Gerrit for code changes. To learn how to submit changes to |
|
23 |
-this repository, see https://golang.org/doc/contribute.html. |
|
24 |
- |
|
25 |
-The main issue tracker for the tools repository is located at |
|
26 |
-https://github.com/golang/go/issues. Prefix your issue with "x/tools/(your |
|
27 |
-subdir):" in the subject line, so it is easy to find. |
28 | 1 |
deleted file mode 100644 |
... | ... |
@@ -1,20 +0,0 @@ |
1 |
-// Copyright 2015 The Go Authors. All rights reserved. |
|
2 |
-// Use of this source code is governed by a BSD-style |
|
3 |
-// license that can be found in the LICENSE file. |
|
4 |
- |
|
5 |
-// +build amd64,!appengine,!gccgo |
|
6 |
- |
|
7 |
-package intsets |
|
8 |
- |
|
9 |
-func popcnt(x word) int |
|
10 |
-func havePOPCNT() bool |
|
11 |
- |
|
12 |
-var hasPOPCNT = havePOPCNT() |
|
13 |
- |
|
14 |
-// popcount returns the population count (number of set bits) of x. |
|
15 |
-func popcount(x word) int { |
|
16 |
- if hasPOPCNT { |
|
17 |
- return popcnt(x) |
|
18 |
- } |
|
19 |
- return popcountTable(x) // faster than Hacker's Delight |
|
20 |
-} |
21 | 1 |
deleted file mode 100644 |
... | ... |
@@ -1,30 +0,0 @@ |
1 |
-// Copyright 2015 The Go Authors. All rights reserved. |
|
2 |
-// Use of this source code is governed by a BSD-style |
|
3 |
-// license that can be found in the LICENSE file. |
|
4 |
- |
|
5 |
-// +build amd64,!appengine,!gccgo |
|
6 |
- |
|
7 |
-#include "textflag.h" |
|
8 |
- |
|
9 |
-// func havePOPCNT() bool |
|
10 |
-TEXT ·havePOPCNT(SB),4,$0 |
|
11 |
- MOVQ $1, AX |
|
12 |
- CPUID |
|
13 |
- SHRQ $23, CX |
|
14 |
- ANDQ $1, CX |
|
15 |
- MOVB CX, ret+0(FP) |
|
16 |
- RET |
|
17 |
- |
|
18 |
-// func popcnt(word) int |
|
19 |
-TEXT ·popcnt(SB),NOSPLIT,$0-8 |
|
20 |
- XORQ AX, AX |
|
21 |
- MOVQ x+0(FP), SI |
|
22 |
- // POPCNT (SI), AX is not recognized by Go assembler, |
|
23 |
- // so we assemble it ourselves. |
|
24 |
- BYTE $0xf3 |
|
25 |
- BYTE $0x48 |
|
26 |
- BYTE $0x0f |
|
27 |
- BYTE $0xb8 |
|
28 |
- BYTE $0xc6 |
|
29 |
- MOVQ AX, ret+8(FP) |
|
30 |
- RET |
31 | 1 |
deleted file mode 100644 |
... | ... |
@@ -1,9 +0,0 @@ |
1 |
-// Copyright 2015 The Go Authors. All rights reserved. |
|
2 |
-// Use of this source code is governed by a BSD-style |
|
3 |
-// license that can be found in the LICENSE file. |
|
4 |
- |
|
5 |
-// +build gccgo |
|
6 |
- |
|
7 |
-package intsets |
|
8 |
- |
|
9 |
-func popcount(x word) int |
10 | 1 |
deleted file mode 100644 |
... | ... |
@@ -1,19 +0,0 @@ |
1 |
-// Copyright 2015 The Go Authors. All rights reserved. |
|
2 |
-// Use of this source code is governed by a BSD-style |
|
3 |
-// license that can be found in the LICENSE file. |
|
4 |
- |
|
5 |
-// +build gccgo |
|
6 |
- |
|
7 |
-#include <errno.h> |
|
8 |
-#include <stdint.h> |
|
9 |
-#include <unistd.h> |
|
10 |
- |
|
11 |
-#define _STRINGIFY2_(x) #x |
|
12 |
-#define _STRINGIFY_(x) _STRINGIFY2_(x) |
|
13 |
-#define GOSYM_PREFIX _STRINGIFY_(__USER_LABEL_PREFIX__) |
|
14 |
- |
|
15 |
-extern intptr_t popcount(uintptr_t x) __asm__(GOSYM_PREFIX GOPKGPATH ".popcount"); |
|
16 |
- |
|
17 |
-intptr_t popcount(uintptr_t x) { |
|
18 |
- return __builtin_popcountl((unsigned long)(x)); |
|
19 |
-} |
20 | 1 |
deleted file mode 100644 |
... | ... |
@@ -1,33 +0,0 @@ |
1 |
-// Copyright 2015 The Go Authors. All rights reserved. |
|
2 |
-// Use of this source code is governed by a BSD-style |
|
3 |
-// license that can be found in the LICENSE file. |
|
4 |
- |
|
5 |
-// +build !amd64 appengine |
|
6 |
-// +build !gccgo |
|
7 |
- |
|
8 |
-package intsets |
|
9 |
- |
|
10 |
-import "runtime" |
|
11 |
- |
|
12 |
-// We compared three algorithms---Hacker's Delight, table lookup, |
|
13 |
-// and AMD64's SSE4.1 hardware POPCNT---on a 2.67GHz Xeon X5550. |
|
14 |
-// |
|
15 |
-// % GOARCH=amd64 go test -run=NONE -bench=Popcount |
|
16 |
-// POPCNT 5.12 ns/op |
|
17 |
-// Table 8.53 ns/op |
|
18 |
-// HackersDelight 9.96 ns/op |
|
19 |
-// |
|
20 |
-// % GOARCH=386 go test -run=NONE -bench=Popcount |
|
21 |
-// Table 10.4 ns/op |
|
22 |
-// HackersDelight 5.23 ns/op |
|
23 |
-// |
|
24 |
-// (AMD64's ABM1 hardware supports ntz and nlz too, |
|
25 |
-// but they aren't critical.) |
|
26 |
- |
|
27 |
-// popcount returns the population count (number of set bits) of x. |
|
28 |
-func popcount(x word) int { |
|
29 |
- if runtime.GOARCH == "386" { |
|
30 |
- return popcountHD(uint32(x)) |
|
31 |
- } |
|
32 |
- return popcountTable(x) |
|
33 |
-} |
34 | 1 |
deleted file mode 100644 |
... | ... |
@@ -1,1091 +0,0 @@ |
1 |
-// Copyright 2014 The Go Authors. All rights reserved. |
|
2 |
-// Use of this source code is governed by a BSD-style |
|
3 |
-// license that can be found in the LICENSE file. |
|
4 |
- |
|
5 |
-// Package intsets provides Sparse, a compact and fast representation |
|
6 |
-// for sparse sets of int values. |
|
7 |
-// |
|
8 |
-// The time complexity of the operations Len, Insert, Remove and Has |
|
9 |
-// is in O(n) but in practice those methods are faster and more |
|
10 |
-// space-efficient than equivalent operations on sets based on the Go |
|
11 |
-// map type. The IsEmpty, Min, Max, Clear and TakeMin operations |
|
12 |
-// require constant time. |
|
13 |
-// |
|
14 |
-package intsets // import "golang.org/x/tools/container/intsets" |
|
15 |
- |
|
16 |
-// TODO(adonovan): |
|
17 |
-// - Add InsertAll(...int), RemoveAll(...int) |
|
18 |
-// - Add 'bool changed' results for {Intersection,Difference}With too. |
|
19 |
-// |
|
20 |
-// TODO(adonovan): implement Dense, a dense bit vector with a similar API. |
|
21 |
-// The space usage would be proportional to Max(), not Len(), and the |
|
22 |
-// implementation would be based upon big.Int. |
|
23 |
-// |
|
24 |
-// TODO(adonovan): opt: make UnionWith and Difference faster. |
|
25 |
-// These are the hot-spots for go/pointer. |
|
26 |
- |
|
27 |
-import ( |
|
28 |
- "bytes" |
|
29 |
- "fmt" |
|
30 |
-) |
|
31 |
- |
|
32 |
-// A Sparse is a set of int values. |
|
33 |
-// Sparse operations (even queries) are not concurrency-safe. |
|
34 |
-// |
|
35 |
-// The zero value for Sparse is a valid empty set. |
|
36 |
-// |
|
37 |
-// Sparse sets must be copied using the Copy method, not by assigning |
|
38 |
-// a Sparse value. |
|
39 |
-// |
|
40 |
-type Sparse struct { |
|
41 |
- // An uninitialized Sparse represents an empty set. |
|
42 |
- // An empty set may also be represented by |
|
43 |
- // root.next == root.prev == &root. |
|
44 |
- // |
|
45 |
- // The root is always the block with the smallest offset. |
|
46 |
- // It can be empty, but only if it is the only block; in that case, offset is |
|
47 |
- // MaxInt (which is not a valid offset). |
|
48 |
- root block |
|
49 |
-} |
|
50 |
- |
|
51 |
-type word uintptr |
|
52 |
- |
|
53 |
-const ( |
|
54 |
- _m = ^word(0) |
|
55 |
- bitsPerWord = 8 << (_m>>8&1 + _m>>16&1 + _m>>32&1) |
|
56 |
- bitsPerBlock = 256 // optimal value for go/pointer solver performance |
|
57 |
- wordsPerBlock = bitsPerBlock / bitsPerWord |
|
58 |
-) |
|
59 |
- |
|
60 |
-// Limit values of implementation-specific int type. |
|
61 |
-const ( |
|
62 |
- MaxInt = int(^uint(0) >> 1) |
|
63 |
- MinInt = -MaxInt - 1 |
|
64 |
-) |
|
65 |
- |
|
66 |
-// -- block ------------------------------------------------------------ |
|
67 |
- |
|
68 |
-// A set is represented as a circular doubly-linked list of blocks, |
|
69 |
-// each containing an offset and a bit array of fixed size |
|
70 |
-// bitsPerBlock; the blocks are ordered by increasing offset. |
|
71 |
-// |
|
72 |
-// The set contains an element x iff the block whose offset is x - (x |
|
73 |
-// mod bitsPerBlock) has the bit (x mod bitsPerBlock) set, where mod |
|
74 |
-// is the Euclidean remainder. |
|
75 |
-// |
|
76 |
-// A block may only be empty transiently. |
|
77 |
-// |
|
78 |
-type block struct { |
|
79 |
- offset int // offset mod bitsPerBlock == 0 |
|
80 |
- bits [wordsPerBlock]word // contains at least one set bit |
|
81 |
- next, prev *block // doubly-linked list of blocks |
|
82 |
-} |
|
83 |
- |
|
84 |
-// wordMask returns the word index (in block.bits) |
|
85 |
-// and single-bit mask for the block's ith bit. |
|
86 |
-func wordMask(i uint) (w uint, mask word) { |
|
87 |
- w = i / bitsPerWord |
|
88 |
- mask = 1 << (i % bitsPerWord) |
|
89 |
- return |
|
90 |
-} |
|
91 |
- |
|
92 |
-// insert sets the block b's ith bit and |
|
93 |
-// returns true if it was not already set. |
|
94 |
-// |
|
95 |
-func (b *block) insert(i uint) bool { |
|
96 |
- w, mask := wordMask(i) |
|
97 |
- if b.bits[w]&mask == 0 { |
|
98 |
- b.bits[w] |= mask |
|
99 |
- return true |
|
100 |
- } |
|
101 |
- return false |
|
102 |
-} |
|
103 |
- |
|
104 |
-// remove clears the block's ith bit and |
|
105 |
-// returns true if the bit was previously set. |
|
106 |
-// NB: may leave the block empty. |
|
107 |
-// |
|
108 |
-func (b *block) remove(i uint) bool { |
|
109 |
- w, mask := wordMask(i) |
|
110 |
- if b.bits[w]&mask != 0 { |
|
111 |
- b.bits[w] &^= mask |
|
112 |
- return true |
|
113 |
- } |
|
114 |
- return false |
|
115 |
-} |
|
116 |
- |
|
117 |
-// has reports whether the block's ith bit is set. |
|
118 |
-func (b *block) has(i uint) bool { |
|
119 |
- w, mask := wordMask(i) |
|
120 |
- return b.bits[w]&mask != 0 |
|
121 |
-} |
|
122 |
- |
|
123 |
-// empty reports whether b.len()==0, but more efficiently. |
|
124 |
-func (b *block) empty() bool { |
|
125 |
- for _, w := range b.bits { |
|
126 |
- if w != 0 { |
|
127 |
- return false |
|
128 |
- } |
|
129 |
- } |
|
130 |
- return true |
|
131 |
-} |
|
132 |
- |
|
133 |
-// len returns the number of set bits in block b. |
|
134 |
-func (b *block) len() int { |
|
135 |
- var l int |
|
136 |
- for _, w := range b.bits { |
|
137 |
- l += popcount(w) |
|
138 |
- } |
|
139 |
- return l |
|
140 |
-} |
|
141 |
- |
|
142 |
-// max returns the maximum element of the block. |
|
143 |
-// The block must not be empty. |
|
144 |
-func (b *block) max() int { |
|
145 |
- bi := b.offset + bitsPerBlock |
|
146 |
- // Decrement bi by number of high zeros in last.bits. |
|
147 |
- for i := len(b.bits) - 1; i >= 0; i-- { |
|
148 |
- if w := b.bits[i]; w != 0 { |
|
149 |
- return bi - nlz(w) - 1 |
|
150 |
- } |
|
151 |
- bi -= bitsPerWord |
|
152 |
- } |
|
153 |
- panic("BUG: empty block") |
|
154 |
-} |
|
155 |
- |
|
156 |
-// min returns the minimum element of the block, |
|
157 |
-// and also removes it if take is set. |
|
158 |
-// The block must not be initially empty. |
|
159 |
-// NB: may leave the block empty. |
|
160 |
-func (b *block) min(take bool) int { |
|
161 |
- for i, w := range b.bits { |
|
162 |
- if w != 0 { |
|
163 |
- tz := ntz(w) |
|
164 |
- if take { |
|
165 |
- b.bits[i] = w &^ (1 << uint(tz)) |
|
166 |
- } |
|
167 |
- return b.offset + int(i*bitsPerWord) + tz |
|
168 |
- } |
|
169 |
- } |
|
170 |
- panic("BUG: empty block") |
|
171 |
-} |
|
172 |
- |
|
173 |
-// lowerBound returns the smallest element of the block that is greater than or |
|
174 |
-// equal to the element corresponding to the ith bit. If there is no such |
|
175 |
-// element, the second return value is false. |
|
176 |
-func (b *block) lowerBound(i uint) (int, bool) { |
|
177 |
- w := i / bitsPerWord |
|
178 |
- bit := i % bitsPerWord |
|
179 |
- |
|
180 |
- if val := b.bits[w] >> bit; val != 0 { |
|
181 |
- return b.offset + int(i) + ntz(val), true |
|
182 |
- } |
|
183 |
- |
|
184 |
- for w++; w < wordsPerBlock; w++ { |
|
185 |
- if val := b.bits[w]; val != 0 { |
|
186 |
- return b.offset + int(w*bitsPerWord) + ntz(val), true |
|
187 |
- } |
|
188 |
- } |
|
189 |
- |
|
190 |
- return 0, false |
|
191 |
-} |
|
192 |
- |
|
193 |
-// forEach calls f for each element of block b. |
|
194 |
-// f must not mutate b's enclosing Sparse. |
|
195 |
-func (b *block) forEach(f func(int)) { |
|
196 |
- for i, w := range b.bits { |
|
197 |
- offset := b.offset + i*bitsPerWord |
|
198 |
- for bi := 0; w != 0 && bi < bitsPerWord; bi++ { |
|
199 |
- if w&1 != 0 { |
|
200 |
- f(offset) |
|
201 |
- } |
|
202 |
- offset++ |
|
203 |
- w >>= 1 |
|
204 |
- } |
|
205 |
- } |
|
206 |
-} |
|
207 |
- |
|
208 |
-// offsetAndBitIndex returns the offset of the block that would |
|
209 |
-// contain x and the bit index of x within that block. |
|
210 |
-// |
|
211 |
-func offsetAndBitIndex(x int) (int, uint) { |
|
212 |
- mod := x % bitsPerBlock |
|
213 |
- if mod < 0 { |
|
214 |
- // Euclidean (non-negative) remainder |
|
215 |
- mod += bitsPerBlock |
|
216 |
- } |
|
217 |
- return x - mod, uint(mod) |
|
218 |
-} |
|
219 |
- |
|
220 |
-// -- Sparse -------------------------------------------------------------- |
|
221 |
- |
|
222 |
-// none is a shared, empty, sentinel block that indicates the end of a block |
|
223 |
-// list. |
|
224 |
-var none block |
|
225 |
- |
|
226 |
-// Dummy type used to generate an implicit panic. This must be defined at the |
|
227 |
-// package level; if it is defined inside a function, it prevents the inlining |
|
228 |
-// of that function. |
|
229 |
-type to_copy_a_sparse_you_must_call_its_Copy_method struct{} |
|
230 |
- |
|
231 |
-// init ensures s is properly initialized. |
|
232 |
-func (s *Sparse) init() { |
|
233 |
- root := &s.root |
|
234 |
- if root.next == nil { |
|
235 |
- root.offset = MaxInt |
|
236 |
- root.next = root |
|
237 |
- root.prev = root |
|
238 |
- } else if root.next.prev != root { |
|
239 |
- // Copying a Sparse x leads to pernicious corruption: the |
|
240 |
- // new Sparse y shares the old linked list, but iteration |
|
241 |
- // on y will never encounter &y.root so it goes into a |
|
242 |
- // loop. Fail fast before this occurs. |
|
243 |
- // We don't want to call panic here because it prevents the |
|
244 |
- // inlining of this function. |
|
245 |
- _ = (interface{}(nil)).(to_copy_a_sparse_you_must_call_its_Copy_method) |
|
246 |
- } |
|
247 |
-} |
|
248 |
- |
|
249 |
-func (s *Sparse) first() *block { |
|
250 |
- s.init() |
|
251 |
- if s.root.offset == MaxInt { |
|
252 |
- return &none |
|
253 |
- } |
|
254 |
- return &s.root |
|
255 |
-} |
|
256 |
- |
|
257 |
-// next returns the next block in the list, or end if b is the last block. |
|
258 |
-func (s *Sparse) next(b *block) *block { |
|
259 |
- if b.next == &s.root { |
|
260 |
- return &none |
|
261 |
- } |
|
262 |
- return b.next |
|
263 |
-} |
|
264 |
- |
|
265 |
-// prev returns the previous block in the list, or end if b is the first block. |
|
266 |
-func (s *Sparse) prev(b *block) *block { |
|
267 |
- if b.prev == &s.root { |
|
268 |
- return &none |
|
269 |
- } |
|
270 |
- return b.prev |
|
271 |
-} |
|
272 |
- |
|
273 |
-// IsEmpty reports whether the set s is empty. |
|
274 |
-func (s *Sparse) IsEmpty() bool { |
|
275 |
- return s.root.next == nil || s.root.offset == MaxInt |
|
276 |
-} |
|
277 |
- |
|
278 |
-// Len returns the number of elements in the set s. |
|
279 |
-func (s *Sparse) Len() int { |
|
280 |
- var l int |
|
281 |
- for b := s.first(); b != &none; b = s.next(b) { |
|
282 |
- l += b.len() |
|
283 |
- } |
|
284 |
- return l |
|
285 |
-} |
|
286 |
- |
|
287 |
-// Max returns the maximum element of the set s, or MinInt if s is empty. |
|
288 |
-func (s *Sparse) Max() int { |
|
289 |
- if s.IsEmpty() { |
|
290 |
- return MinInt |
|
291 |
- } |
|
292 |
- return s.root.prev.max() |
|
293 |
-} |
|
294 |
- |
|
295 |
-// Min returns the minimum element of the set s, or MaxInt if s is empty. |
|
296 |
-func (s *Sparse) Min() int { |
|
297 |
- if s.IsEmpty() { |
|
298 |
- return MaxInt |
|
299 |
- } |
|
300 |
- return s.root.min(false) |
|
301 |
-} |
|
302 |
- |
|
303 |
-// LowerBound returns the smallest element >= x, or MaxInt if there is no such |
|
304 |
-// element. |
|
305 |
-func (s *Sparse) LowerBound(x int) int { |
|
306 |
- offset, i := offsetAndBitIndex(x) |
|
307 |
- for b := s.first(); b != &none; b = s.next(b) { |
|
308 |
- if b.offset > offset { |
|
309 |
- return b.min(false) |
|
310 |
- } |
|
311 |
- if b.offset == offset { |
|
312 |
- if y, ok := b.lowerBound(i); ok { |
|
313 |
- return y |
|
314 |
- } |
|
315 |
- } |
|
316 |
- } |
|
317 |
- return MaxInt |
|
318 |
-} |
|
319 |
- |
|
320 |
-// block returns the block that would contain offset, |
|
321 |
-// or nil if s contains no such block. |
|
322 |
-// Precondition: offset is a multiple of bitsPerBlock. |
|
323 |
-func (s *Sparse) block(offset int) *block { |
|
324 |
- for b := s.first(); b != &none && b.offset <= offset; b = s.next(b) { |
|
325 |
- if b.offset == offset { |
|
326 |
- return b |
|
327 |
- } |
|
328 |
- } |
|
329 |
- return nil |
|
330 |
-} |
|
331 |
- |
|
332 |
-// Insert adds x to the set s, and reports whether the set grew. |
|
333 |
-func (s *Sparse) Insert(x int) bool { |
|
334 |
- offset, i := offsetAndBitIndex(x) |
|
335 |
- |
|
336 |
- b := s.first() |
|
337 |
- for ; b != &none && b.offset <= offset; b = s.next(b) { |
|
338 |
- if b.offset == offset { |
|
339 |
- return b.insert(i) |
|
340 |
- } |
|
341 |
- } |
|
342 |
- |
|
343 |
- // Insert new block before b. |
|
344 |
- new := s.insertBlockBefore(b) |
|
345 |
- new.offset = offset |
|
346 |
- return new.insert(i) |
|
347 |
-} |
|
348 |
- |
|
349 |
-// removeBlock removes a block and returns the block that followed it (or end if |
|
350 |
-// it was the last block). |
|
351 |
-func (s *Sparse) removeBlock(b *block) *block { |
|
352 |
- if b != &s.root { |
|
353 |
- b.prev.next = b.next |
|
354 |
- b.next.prev = b.prev |
|
355 |
- if b.next == &s.root { |
|
356 |
- return &none |
|
357 |
- } |
|
358 |
- return b.next |
|
359 |
- } |
|
360 |
- |
|
361 |
- first := s.root.next |
|
362 |
- if first == &s.root { |
|
363 |
- // This was the only block. |
|
364 |
- s.Clear() |
|
365 |
- return &none |
|
366 |
- } |
|
367 |
- s.root.offset = first.offset |
|
368 |
- s.root.bits = first.bits |
|
369 |
- if first.next == &s.root { |
|
370 |
- // Single block remaining. |
|
371 |
- s.root.next = &s.root |
|
372 |
- s.root.prev = &s.root |
|
373 |
- } else { |
|
374 |
- s.root.next = first.next |
|
375 |
- first.next.prev = &s.root |
|
376 |
- } |
|
377 |
- return &s.root |
|
378 |
-} |
|
379 |
- |
|
380 |
-// Remove removes x from the set s, and reports whether the set shrank. |
|
381 |
-func (s *Sparse) Remove(x int) bool { |
|
382 |
- offset, i := offsetAndBitIndex(x) |
|
383 |
- if b := s.block(offset); b != nil { |
|
384 |
- if !b.remove(i) { |
|
385 |
- return false |
|
386 |
- } |
|
387 |
- if b.empty() { |
|
388 |
- s.removeBlock(b) |
|
389 |
- } |
|
390 |
- return true |
|
391 |
- } |
|
392 |
- return false |
|
393 |
-} |
|
394 |
- |
|
395 |
-// Clear removes all elements from the set s. |
|
396 |
-func (s *Sparse) Clear() { |
|
397 |
- s.root = block{ |
|
398 |
- offset: MaxInt, |
|
399 |
- next: &s.root, |
|
400 |
- prev: &s.root, |
|
401 |
- } |
|
402 |
-} |
|
403 |
- |
|
404 |
-// If set s is non-empty, TakeMin sets *p to the minimum element of |
|
405 |
-// the set s, removes that element from the set and returns true. |
|
406 |
-// Otherwise, it returns false and *p is undefined. |
|
407 |
-// |
|
408 |
-// This method may be used for iteration over a worklist like so: |
|
409 |
-// |
|
410 |
-// var x int |
|
411 |
-// for worklist.TakeMin(&x) { use(x) } |
|
412 |
-// |
|
413 |
-func (s *Sparse) TakeMin(p *int) bool { |
|
414 |
- if s.IsEmpty() { |
|
415 |
- return false |
|
416 |
- } |
|
417 |
- *p = s.root.min(true) |
|
418 |
- if s.root.empty() { |
|
419 |
- s.removeBlock(&s.root) |
|
420 |
- } |
|
421 |
- return true |
|
422 |
-} |
|
423 |
- |
|
424 |
-// Has reports whether x is an element of the set s. |
|
425 |
-func (s *Sparse) Has(x int) bool { |
|
426 |
- offset, i := offsetAndBitIndex(x) |
|
427 |
- if b := s.block(offset); b != nil { |
|
428 |
- return b.has(i) |
|
429 |
- } |
|
430 |
- return false |
|
431 |
-} |
|
432 |
- |
|
433 |
-// forEach applies function f to each element of the set s in order. |
|
434 |
-// |
|
435 |
-// f must not mutate s. Consequently, forEach is not safe to expose |
|
436 |
-// to clients. In any case, using "range s.AppendTo()" allows more |
|
437 |
-// natural control flow with continue/break/return. |
|
438 |
-// |
|
439 |
-func (s *Sparse) forEach(f func(int)) { |
|
440 |
- for b := s.first(); b != &none; b = s.next(b) { |
|
441 |
- b.forEach(f) |
|
442 |
- } |
|
443 |
-} |
|
444 |
- |
|
445 |
-// Copy sets s to the value of x. |
|
446 |
-func (s *Sparse) Copy(x *Sparse) { |
|
447 |
- if s == x { |
|
448 |
- return |
|
449 |
- } |
|
450 |
- |
|
451 |
- xb := x.first() |
|
452 |
- sb := s.first() |
|
453 |
- for xb != &none { |
|
454 |
- if sb == &none { |
|
455 |
- sb = s.insertBlockBefore(sb) |
|
456 |
- } |
|
457 |
- sb.offset = xb.offset |
|
458 |
- sb.bits = xb.bits |
|
459 |
- xb = x.next(xb) |
|
460 |
- sb = s.next(sb) |
|
461 |
- } |
|
462 |
- s.discardTail(sb) |
|
463 |
-} |
|
464 |
- |
|
465 |
-// insertBlockBefore returns a new block, inserting it before next. |
|
466 |
-// If next is the root, the root is replaced. If next is end, the block is |
|
467 |
-// inserted at the end. |
|
468 |
-func (s *Sparse) insertBlockBefore(next *block) *block { |
|
469 |
- if s.IsEmpty() { |
|
470 |
- if next != &none { |
|
471 |
- panic("BUG: passed block with empty set") |
|
472 |
- } |
|
473 |
- return &s.root |
|
474 |
- } |
|
475 |
- |
|
476 |
- if next == &s.root { |
|
477 |
- // Special case: we need to create a new block that will become the root |
|
478 |
- // block.The old root block becomes the second block. |
|
479 |
- second := s.root |
|
480 |
- s.root = block{ |
|
481 |
- next: &second, |
|
482 |
- } |
|
483 |
- if second.next == &s.root { |
|
484 |
- s.root.prev = &second |
|
485 |
- } else { |
|
486 |
- s.root.prev = second.prev |
|
487 |
- second.next.prev = &second |
|
488 |
- second.prev = &s.root |
|
489 |
- } |
|
490 |
- return &s.root |
|
491 |
- } |
|
492 |
- if next == &none { |
|
493 |
- // Insert before root. |
|
494 |
- next = &s.root |
|
495 |
- } |
|
496 |
- b := new(block) |
|
497 |
- b.next = next |
|
498 |
- b.prev = next.prev |
|
499 |
- b.prev.next = b |
|
500 |
- next.prev = b |
|
501 |
- return b |
|
502 |
-} |
|
503 |
- |
|
504 |
-// discardTail removes block b and all its successors from s. |
|
505 |
-func (s *Sparse) discardTail(b *block) { |
|
506 |
- if b != &none { |
|
507 |
- if b == &s.root { |
|
508 |
- s.Clear() |
|
509 |
- } else { |
|
510 |
- b.prev.next = &s.root |
|
511 |
- s.root.prev = b.prev |
|
512 |
- } |
|
513 |
- } |
|
514 |
-} |
|
515 |
- |
|
516 |
-// IntersectionWith sets s to the intersection s ∩ x. |
|
517 |
-func (s *Sparse) IntersectionWith(x *Sparse) { |
|
518 |
- if s == x { |
|
519 |
- return |
|
520 |
- } |
|
521 |
- |
|
522 |
- xb := x.first() |
|
523 |
- sb := s.first() |
|
524 |
- for xb != &none && sb != &none { |
|
525 |
- switch { |
|
526 |
- case xb.offset < sb.offset: |
|
527 |
- xb = x.next(xb) |
|
528 |
- |
|
529 |
- case xb.offset > sb.offset: |
|
530 |
- sb = s.removeBlock(sb) |
|
531 |
- |
|
532 |
- default: |
|
533 |
- var sum word |
|
534 |
- for i := range sb.bits { |
|
535 |
- r := xb.bits[i] & sb.bits[i] |
|
536 |
- sb.bits[i] = r |
|
537 |
- sum |= r |
|
538 |
- } |
|
539 |
- if sum != 0 { |
|
540 |
- sb = s.next(sb) |
|
541 |
- } else { |
|
542 |
- // sb will be overwritten or removed |
|
543 |
- } |
|
544 |
- |
|
545 |
- xb = x.next(xb) |
|
546 |
- } |
|
547 |
- } |
|
548 |
- |
|
549 |
- s.discardTail(sb) |
|
550 |
-} |
|
551 |
- |
|
552 |
-// Intersection sets s to the intersection x ∩ y. |
|
553 |
-func (s *Sparse) Intersection(x, y *Sparse) { |
|
554 |
- switch { |
|
555 |
- case s == x: |
|
556 |
- s.IntersectionWith(y) |
|
557 |
- return |
|
558 |
- case s == y: |
|
559 |
- s.IntersectionWith(x) |
|
560 |
- return |
|
561 |
- case x == y: |
|
562 |
- s.Copy(x) |
|
563 |
- return |
|
564 |
- } |
|
565 |
- |
|
566 |
- xb := x.first() |
|
567 |
- yb := y.first() |
|
568 |
- sb := s.first() |
|
569 |
- for xb != &none && yb != &none { |
|
570 |
- switch { |
|
571 |
- case xb.offset < yb.offset: |
|
572 |
- xb = x.next(xb) |
|
573 |
- continue |
|
574 |
- case xb.offset > yb.offset: |
|
575 |
- yb = y.next(yb) |
|
576 |
- continue |
|
577 |
- } |
|
578 |
- |
|
579 |
- if sb == &none { |
|
580 |
- sb = s.insertBlockBefore(sb) |
|
581 |
- } |
|
582 |
- sb.offset = xb.offset |
|
583 |
- |
|
584 |
- var sum word |
|
585 |
- for i := range sb.bits { |
|
586 |
- r := xb.bits[i] & yb.bits[i] |
|
587 |
- sb.bits[i] = r |
|
588 |
- sum |= r |
|
589 |
- } |
|
590 |
- if sum != 0 { |
|
591 |
- sb = s.next(sb) |
|
592 |
- } else { |
|
593 |
- // sb will be overwritten or removed |
|
594 |
- } |
|
595 |
- |
|
596 |
- xb = x.next(xb) |
|
597 |
- yb = y.next(yb) |
|
598 |
- } |
|
599 |
- |
|
600 |
- s.discardTail(sb) |
|
601 |
-} |
|
602 |
- |
|
603 |
-// Intersects reports whether s ∩ x ≠∅. |
|
604 |
-func (s *Sparse) Intersects(x *Sparse) bool { |
|
605 |
- sb := s.first() |
|
606 |
- xb := x.first() |
|
607 |
- for sb != &none && xb != &none { |
|
608 |
- switch { |
|
609 |
- case xb.offset < sb.offset: |
|
610 |
- xb = x.next(xb) |
|
611 |
- case xb.offset > sb.offset: |
|
612 |
- sb = s.next(sb) |
|
613 |
- default: |
|
614 |
- for i := range sb.bits { |
|
615 |
- if sb.bits[i]&xb.bits[i] != 0 { |
|
616 |
- return true |
|
617 |
- } |
|
618 |
- } |
|
619 |
- sb = s.next(sb) |
|
620 |
- xb = x.next(xb) |
|
621 |
- } |
|
622 |
- } |
|
623 |
- return false |
|
624 |
-} |
|
625 |
- |
|
626 |
-// UnionWith sets s to the union s ∪ x, and reports whether s grew. |
|
627 |
-func (s *Sparse) UnionWith(x *Sparse) bool { |
|
628 |
- if s == x { |
|
629 |
- return false |
|
630 |
- } |
|
631 |
- |
|
632 |
- var changed bool |
|
633 |
- xb := x.first() |
|
634 |
- sb := s.first() |
|
635 |
- for xb != &none { |
|
636 |
- if sb != &none && sb.offset == xb.offset { |
|
637 |
- for i := range xb.bits { |
|
638 |
- if sb.bits[i] != xb.bits[i] { |
|
639 |
- sb.bits[i] |= xb.bits[i] |
|
640 |
- changed = true |
|
641 |
- } |
|
642 |
- } |
|
643 |
- xb = x.next(xb) |
|
644 |
- } else if sb == &none || sb.offset > xb.offset { |
|
645 |
- sb = s.insertBlockBefore(sb) |
|
646 |
- sb.offset = xb.offset |
|
647 |
- sb.bits = xb.bits |
|
648 |
- changed = true |
|
649 |
- |
|
650 |
- xb = x.next(xb) |
|
651 |
- } |
|
652 |
- sb = s.next(sb) |
|
653 |
- } |
|
654 |
- return changed |
|
655 |
-} |
|
656 |
- |
|
657 |
-// Union sets s to the union x ∪ y. |
|
658 |
-func (s *Sparse) Union(x, y *Sparse) { |
|
659 |
- switch { |
|
660 |
- case x == y: |
|
661 |
- s.Copy(x) |
|
662 |
- return |
|
663 |
- case s == x: |
|
664 |
- s.UnionWith(y) |
|
665 |
- return |
|
666 |
- case s == y: |
|
667 |
- s.UnionWith(x) |
|
668 |
- return |
|
669 |
- } |
|
670 |
- |
|
671 |
- xb := x.first() |
|
672 |
- yb := y.first() |
|
673 |
- sb := s.first() |
|
674 |
- for xb != &none || yb != &none { |
|
675 |
- if sb == &none { |
|
676 |
- sb = s.insertBlockBefore(sb) |
|
677 |
- } |
|
678 |
- switch { |
|
679 |
- case yb == &none || (xb != &none && xb.offset < yb.offset): |
|
680 |
- sb.offset = xb.offset |
|
681 |
- sb.bits = xb.bits |
|
682 |
- xb = x.next(xb) |
|
683 |
- |
|
684 |
- case xb == &none || (yb != &none && yb.offset < xb.offset): |
|
685 |
- sb.offset = yb.offset |
|
686 |
- sb.bits = yb.bits |
|
687 |
- yb = y.next(yb) |
|
688 |
- |
|
689 |
- default: |
|
690 |
- sb.offset = xb.offset |
|
691 |
- for i := range xb.bits { |
|
692 |
- sb.bits[i] = xb.bits[i] | yb.bits[i] |
|
693 |
- } |
|
694 |
- xb = x.next(xb) |
|
695 |
- yb = y.next(yb) |
|
696 |
- } |
|
697 |
- sb = s.next(sb) |
|
698 |
- } |
|
699 |
- |
|
700 |
- s.discardTail(sb) |
|
701 |
-} |
|
702 |
- |
|
703 |
-// DifferenceWith sets s to the difference s ∖ x. |
|
704 |
-func (s *Sparse) DifferenceWith(x *Sparse) { |
|
705 |
- if s == x { |
|
706 |
- s.Clear() |
|
707 |
- return |
|
708 |
- } |
|
709 |
- |
|
710 |
- xb := x.first() |
|
711 |
- sb := s.first() |
|
712 |
- for xb != &none && sb != &none { |
|
713 |
- switch { |
|
714 |
- case xb.offset > sb.offset: |
|
715 |
- sb = s.next(sb) |
|
716 |
- |
|
717 |
- case xb.offset < sb.offset: |
|
718 |
- xb = x.next(xb) |
|
719 |
- |
|
720 |
- default: |
|
721 |
- var sum word |
|
722 |
- for i := range sb.bits { |
|
723 |
- r := sb.bits[i] & ^xb.bits[i] |
|
724 |
- sb.bits[i] = r |
|
725 |
- sum |= r |
|
726 |
- } |
|
727 |
- if sum == 0 { |
|
728 |
- sb = s.removeBlock(sb) |
|
729 |
- } else { |
|
730 |
- sb = s.next(sb) |
|
731 |
- } |
|
732 |
- xb = x.next(xb) |
|
733 |
- } |
|
734 |
- } |
|
735 |
-} |
|
736 |
- |
|
737 |
-// Difference sets s to the difference x ∖ y. |
|
738 |
-func (s *Sparse) Difference(x, y *Sparse) { |
|
739 |
- switch { |
|
740 |
- case x == y: |
|
741 |
- s.Clear() |
|
742 |
- return |
|
743 |
- case s == x: |
|
744 |
- s.DifferenceWith(y) |
|
745 |
- return |
|
746 |
- case s == y: |
|
747 |
- var y2 Sparse |
|
748 |
- y2.Copy(y) |
|
749 |
- s.Difference(x, &y2) |
|
750 |
- return |
|
751 |
- } |
|
752 |
- |
|
753 |
- xb := x.first() |
|
754 |
- yb := y.first() |
|
755 |
- sb := s.first() |
|
756 |
- for xb != &none && yb != &none { |
|
757 |
- if xb.offset > yb.offset { |
|
758 |
- // y has block, x has &none |
|
759 |
- yb = y.next(yb) |
|
760 |
- continue |
|
761 |
- } |
|
762 |
- |
|
763 |
- if sb == &none { |
|
764 |
- sb = s.insertBlockBefore(sb) |
|
765 |
- } |
|
766 |
- sb.offset = xb.offset |
|
767 |
- |
|
768 |
- switch { |
|
769 |
- case xb.offset < yb.offset: |
|
770 |
- // x has block, y has &none |
|
771 |
- sb.bits = xb.bits |
|
772 |
- |
|
773 |
- sb = s.next(sb) |
|
774 |
- |
|
775 |
- default: |
|
776 |
- // x and y have corresponding blocks |
|
777 |
- var sum word |
|
778 |
- for i := range sb.bits { |
|
779 |
- r := xb.bits[i] & ^yb.bits[i] |
|
780 |
- sb.bits[i] = r |
|
781 |
- sum |= r |
|
782 |
- } |
|
783 |
- if sum != 0 { |
|
784 |
- sb = s.next(sb) |
|
785 |
- } else { |
|
786 |
- // sb will be overwritten or removed |
|
787 |
- } |
|
788 |
- |
|
789 |
- yb = y.next(yb) |
|
790 |
- } |
|
791 |
- xb = x.next(xb) |
|
792 |
- } |
|
793 |
- |
|
794 |
- for xb != &none { |
|
795 |
- if sb == &none { |
|
796 |
- sb = s.insertBlockBefore(sb) |
|
797 |
- } |
|
798 |
- sb.offset = xb.offset |
|
799 |
- sb.bits = xb.bits |
|
800 |
- sb = s.next(sb) |
|
801 |
- |
|
802 |
- xb = x.next(xb) |
|
803 |
- } |
|
804 |
- |
|
805 |
- s.discardTail(sb) |
|
806 |
-} |
|
807 |
- |
|
808 |
-// SymmetricDifferenceWith sets s to the symmetric difference s ∆ x. |
|
809 |
-func (s *Sparse) SymmetricDifferenceWith(x *Sparse) { |
|
810 |
- if s == x { |
|
811 |
- s.Clear() |
|
812 |
- return |
|
813 |
- } |
|
814 |
- |
|
815 |
- sb := s.first() |
|
816 |
- xb := x.first() |
|
817 |
- for xb != &none && sb != &none { |
|
818 |
- switch { |
|
819 |
- case sb.offset < xb.offset: |
|
820 |
- sb = s.next(sb) |
|
821 |
- case xb.offset < sb.offset: |
|
822 |
- nb := s.insertBlockBefore(sb) |
|
823 |
- nb.offset = xb.offset |
|
824 |
- nb.bits = xb.bits |
|
825 |
- xb = x.next(xb) |
|
826 |
- default: |
|
827 |
- var sum word |
|
828 |
- for i := range sb.bits { |
|
829 |
- r := sb.bits[i] ^ xb.bits[i] |
|
830 |
- sb.bits[i] = r |
|
831 |
- sum |= r |
|
832 |
- } |
|
833 |
- if sum == 0 { |
|
834 |
- sb = s.removeBlock(sb) |
|
835 |
- } else { |
|
836 |
- sb = s.next(sb) |
|
837 |
- } |
|
838 |
- xb = x.next(xb) |
|
839 |
- } |
|
840 |
- } |
|
841 |
- |
|
842 |
- for xb != &none { // append the tail of x to s |
|
843 |
- sb = s.insertBlockBefore(sb) |
|
844 |
- sb.offset = xb.offset |
|
845 |
- sb.bits = xb.bits |
|
846 |
- sb = s.next(sb) |
|
847 |
- xb = x.next(xb) |
|
848 |
- } |
|
849 |
-} |
|
850 |
- |
|
851 |
-// SymmetricDifference sets s to the symmetric difference x ∆ y. |
|
852 |
-func (s *Sparse) SymmetricDifference(x, y *Sparse) { |
|
853 |
- switch { |
|
854 |
- case x == y: |
|
855 |
- s.Clear() |
|
856 |
- return |
|
857 |
- case s == x: |
|
858 |
- s.SymmetricDifferenceWith(y) |
|
859 |
- return |
|
860 |
- case s == y: |
|
861 |
- s.SymmetricDifferenceWith(x) |
|
862 |
- return |
|
863 |
- } |
|
864 |
- |
|
865 |
- sb := s.first() |
|
866 |
- xb := x.first() |
|
867 |
- yb := y.first() |
|
868 |
- for xb != &none && yb != &none { |
|
869 |
- if sb == &none { |
|
870 |
- sb = s.insertBlockBefore(sb) |
|
871 |
- } |
|
872 |
- switch { |
|
873 |
- case yb.offset < xb.offset: |
|
874 |
- sb.offset = yb.offset |
|
875 |
- sb.bits = yb.bits |
|
876 |
- sb = s.next(sb) |
|
877 |
- yb = y.next(yb) |
|
878 |
- case xb.offset < yb.offset: |
|
879 |
- sb.offset = xb.offset |
|
880 |
- sb.bits = xb.bits |
|
881 |
- sb = s.next(sb) |
|
882 |
- xb = x.next(xb) |
|
883 |
- default: |
|
884 |
- var sum word |
|
885 |
- for i := range sb.bits { |
|
886 |
- r := xb.bits[i] ^ yb.bits[i] |
|
887 |
- sb.bits[i] = r |
|
888 |
- sum |= r |
|
889 |
- } |
|
890 |
- if sum != 0 { |
|
891 |
- sb.offset = xb.offset |
|
892 |
- sb = s.next(sb) |
|
893 |
- } |
|
894 |
- xb = x.next(xb) |
|
895 |
- yb = y.next(yb) |
|
896 |
- } |
|
897 |
- } |
|
898 |
- |
|
899 |
- for xb != &none { // append the tail of x to s |
|
900 |
- if sb == &none { |
|
901 |
- sb = s.insertBlockBefore(sb) |
|
902 |
- } |
|
903 |
- sb.offset = xb.offset |
|
904 |
- sb.bits = xb.bits |
|
905 |
- sb = s.next(sb) |
|
906 |
- xb = x.next(xb) |
|
907 |
- } |
|
908 |
- |
|
909 |
- for yb != &none { // append the tail of y to s |
|
910 |
- if sb == &none { |
|
911 |
- sb = s.insertBlockBefore(sb) |
|
912 |
- } |
|
913 |
- sb.offset = yb.offset |
|
914 |
- sb.bits = yb.bits |
|
915 |
- sb = s.next(sb) |
|
916 |
- yb = y.next(yb) |
|
917 |
- } |
|
918 |
- |
|
919 |
- s.discardTail(sb) |
|
920 |
-} |
|
921 |
- |
|
922 |
-// SubsetOf reports whether s ∖ x = ∅. |
|
923 |
-func (s *Sparse) SubsetOf(x *Sparse) bool { |
|
924 |
- if s == x { |
|
925 |
- return true |
|
926 |
- } |
|
927 |
- |
|
928 |
- sb := s.first() |
|
929 |
- xb := x.first() |
|
930 |
- for sb != &none { |
|
931 |
- switch { |
|
932 |
- case xb == &none || xb.offset > sb.offset: |
|
933 |
- return false |
|
934 |
- case xb.offset < sb.offset: |
|
935 |
- xb = x.next(xb) |
|
936 |
- default: |
|
937 |
- for i := range sb.bits { |
|
938 |
- if sb.bits[i]&^xb.bits[i] != 0 { |
|
939 |
- return false |
|
940 |
- } |
|
941 |
- } |
|
942 |
- sb = s.next(sb) |
|
943 |
- xb = x.next(xb) |
|
944 |
- } |
|
945 |
- } |
|
946 |
- return true |
|
947 |
-} |
|
948 |
- |
|
949 |
-// Equals reports whether the sets s and t have the same elements. |
|
950 |
-func (s *Sparse) Equals(t *Sparse) bool { |
|
951 |
- if s == t { |
|
952 |
- return true |
|
953 |
- } |
|
954 |
- sb := s.first() |
|
955 |
- tb := t.first() |
|
956 |
- for { |
|
957 |
- switch { |
|
958 |
- case sb == &none && tb == &none: |
|
959 |
- return true |
|
960 |
- case sb == &none || tb == &none: |
|
961 |
- return false |
|
962 |
- case sb.offset != tb.offset: |
|
963 |
- return false |
|
964 |
- case sb.bits != tb.bits: |
|
965 |
- return false |
|
966 |
- } |
|
967 |
- |
|
968 |
- sb = s.next(sb) |
|
969 |
- tb = t.next(tb) |
|
970 |
- } |
|
971 |
-} |
|
972 |
- |
|
973 |
-// String returns a human-readable description of the set s. |
|
974 |
-func (s *Sparse) String() string { |
|
975 |
- var buf bytes.Buffer |
|
976 |
- buf.WriteByte('{') |
|
977 |
- s.forEach(func(x int) { |
|
978 |
- if buf.Len() > 1 { |
|
979 |
- buf.WriteByte(' ') |
|
980 |
- } |
|
981 |
- fmt.Fprintf(&buf, "%d", x) |
|
982 |
- }) |
|
983 |
- buf.WriteByte('}') |
|
984 |
- return buf.String() |
|
985 |
-} |
|
986 |
- |
|
987 |
-// BitString returns the set as a string of 1s and 0s denoting the sum |
|
988 |
-// of the i'th powers of 2, for each i in s. A radix point, always |
|
989 |
-// preceded by a digit, appears if the sum is non-integral. |
|
990 |
-// |
|
991 |
-// Examples: |
|
992 |
-// {}.BitString() = "0" |
|
993 |
-// {4,5}.BitString() = "110000" |
|
994 |
-// {-3}.BitString() = "0.001" |
|
995 |
-// {-3,0,4,5}.BitString() = "110001.001" |
|
996 |
-// |
|
997 |
-func (s *Sparse) BitString() string { |
|
998 |
- if s.IsEmpty() { |
|
999 |
- return "0" |
|
1000 |
- } |
|
1001 |
- |
|
1002 |
- min, max := s.Min(), s.Max() |
|
1003 |
- var nbytes int |
|
1004 |
- if max > 0 { |
|
1005 |
- nbytes = max |
|
1006 |
- } |
|
1007 |
- nbytes++ // zero bit |
|
1008 |
- radix := nbytes |
|
1009 |
- if min < 0 { |
|
1010 |
- nbytes += len(".") - min |
|
1011 |
- } |
|
1012 |
- |
|
1013 |
- b := make([]byte, nbytes) |
|
1014 |
- for i := range b { |
|
1015 |
- b[i] = '0' |
|
1016 |
- } |
|
1017 |
- if radix < nbytes { |
|
1018 |
- b[radix] = '.' |
|
1019 |
- } |
|
1020 |
- s.forEach(func(x int) { |
|
1021 |
- if x >= 0 { |
|
1022 |
- x += len(".") |
|
1023 |
- } |
|
1024 |
- b[radix-x] = '1' |
|
1025 |
- }) |
|
1026 |
- return string(b) |
|
1027 |
-} |
|
1028 |
- |
|
1029 |
-// GoString returns a string showing the internal representation of |
|
1030 |
-// the set s. |
|
1031 |
-// |
|
1032 |
-func (s *Sparse) GoString() string { |
|
1033 |
- var buf bytes.Buffer |
|
1034 |
- for b := s.first(); b != &none; b = s.next(b) { |
|
1035 |
- fmt.Fprintf(&buf, "block %p {offset=%d next=%p prev=%p", |
|
1036 |
- b, b.offset, b.next, b.prev) |
|
1037 |
- for _, w := range b.bits { |
|
1038 |
- fmt.Fprintf(&buf, " 0%016x", w) |
|
1039 |
- } |
|
1040 |
- fmt.Fprintf(&buf, "}\n") |
|
1041 |
- } |
|
1042 |
- return buf.String() |
|
1043 |
-} |
|
1044 |
- |
|
1045 |
-// AppendTo returns the result of appending the elements of s to slice |
|
1046 |
-// in order. |
|
1047 |
-func (s *Sparse) AppendTo(slice []int) []int { |
|
1048 |
- s.forEach(func(x int) { |
|
1049 |
- slice = append(slice, x) |
|
1050 |
- }) |
|
1051 |
- return slice |
|
1052 |
-} |
|
1053 |
- |
|
1054 |
-// -- Testing/debugging ------------------------------------------------ |
|
1055 |
- |
|
1056 |
-// check returns an error if the representation invariants of s are violated. |
|
1057 |
-func (s *Sparse) check() error { |
|
1058 |
- s.init() |
|
1059 |
- if s.root.empty() { |
|
1060 |
- // An empty set must have only the root block with offset MaxInt. |
|
1061 |
- if s.root.next != &s.root { |
|
1062 |
- return fmt.Errorf("multiple blocks with empty root block") |
|
1063 |
- } |
|
1064 |
- if s.root.offset != MaxInt { |
|
1065 |
- return fmt.Errorf("empty set has offset %d, should be MaxInt", s.root.offset) |
|
1066 |
- } |
|
1067 |
- return nil |
|
1068 |
- } |
|
1069 |
- for b := s.first(); ; b = s.next(b) { |
|
1070 |
- if b.offset%bitsPerBlock != 0 { |
|
1071 |
- return fmt.Errorf("bad offset modulo: %d", b.offset) |
|
1072 |
- } |
|
1073 |
- if b.empty() { |
|
1074 |
- return fmt.Errorf("empty block") |
|
1075 |
- } |
|
1076 |
- if b.prev.next != b { |
|
1077 |
- return fmt.Errorf("bad prev.next link") |
|
1078 |
- } |
|
1079 |
- if b.next.prev != b { |
|
1080 |
- return fmt.Errorf("bad next.prev link") |
|
1081 |
- } |
|
1082 |
- if b.next == &s.root { |
|
1083 |
- break |
|
1084 |
- } |
|
1085 |
- if b.offset >= b.next.offset { |
|
1086 |
- return fmt.Errorf("bad offset order: b.offset=%d, b.next.offset=%d", |
|
1087 |
- b.offset, b.next.offset) |
|
1088 |
- } |
|
1089 |
- } |
|
1090 |
- return nil |
|
1091 |
-} |
1092 | 1 |
deleted file mode 100644 |
... | ... |
@@ -1,84 +0,0 @@ |
1 |
-// Copyright 2013 The Go Authors. All rights reserved. |
|
2 |
-// Use of this source code is governed by a BSD-style |
|
3 |
-// license that can be found in the LICENSE file. |
|
4 |
- |
|
5 |
-package intsets |
|
6 |
- |
|
7 |
-// From Hacker's Delight, fig 5.2. |
|
8 |
-func popcountHD(x uint32) int { |
|
9 |
- x -= (x >> 1) & 0x55555555 |
|
10 |
- x = (x & 0x33333333) + ((x >> 2) & 0x33333333) |
|
11 |
- x = (x + (x >> 4)) & 0x0f0f0f0f |
|
12 |
- x = x + (x >> 8) |
|
13 |
- x = x + (x >> 16) |
|
14 |
- return int(x & 0x0000003f) |
|
15 |
-} |
|
16 |
- |
|
17 |
-var a [1 << 8]byte |
|
18 |
- |
|
19 |
-func init() { |
|
20 |
- for i := range a { |
|
21 |
- var n byte |
|
22 |
- for x := i; x != 0; x >>= 1 { |
|
23 |
- if x&1 != 0 { |
|
24 |
- n++ |
|
25 |
- } |
|
26 |
- } |
|
27 |
- a[i] = n |
|
28 |
- } |
|
29 |
-} |
|
30 |
- |
|
31 |
-func popcountTable(x word) int { |
|
32 |
- return int(a[byte(x>>(0*8))] + |
|
33 |
- a[byte(x>>(1*8))] + |
|
34 |
- a[byte(x>>(2*8))] + |
|
35 |
- a[byte(x>>(3*8))] + |
|
36 |
- a[byte(x>>(4*8))] + |
|
37 |
- a[byte(x>>(5*8))] + |
|
38 |
- a[byte(x>>(6*8))] + |
|
39 |
- a[byte(x>>(7*8))]) |
|
40 |
-} |
|
41 |
- |
|
42 |
-// nlz returns the number of leading zeros of x. |
|
43 |
-// From Hacker's Delight, fig 5.11. |
|
44 |
-func nlz(x word) int { |
|
45 |
- x |= (x >> 1) |
|
46 |
- x |= (x >> 2) |
|
47 |
- x |= (x >> 4) |
|
48 |
- x |= (x >> 8) |
|
49 |
- x |= (x >> 16) |
|
50 |
- x |= (x >> 32) |
|
51 |
- return popcount(^x) |
|
52 |
-} |
|
53 |
- |
|
54 |
-// ntz returns the number of trailing zeros of x. |
|
55 |
-// From Hacker's Delight, fig 5.13. |
|
56 |
-func ntz(x word) int { |
|
57 |
- if x == 0 { |
|
58 |
- return bitsPerWord |
|
59 |
- } |
|
60 |
- n := 1 |
|
61 |
- if bitsPerWord == 64 { |
|
62 |
- if (x & 0xffffffff) == 0 { |
|
63 |
- n = n + 32 |
|
64 |
- x = x >> 32 |
|
65 |
- } |
|
66 |
- } |
|
67 |
- if (x & 0x0000ffff) == 0 { |
|
68 |
- n = n + 16 |
|
69 |
- x = x >> 16 |
|
70 |
- } |
|
71 |
- if (x & 0x000000ff) == 0 { |
|
72 |
- n = n + 8 |
|
73 |
- x = x >> 8 |
|
74 |
- } |
|
75 |
- if (x & 0x0000000f) == 0 { |
|
76 |
- n = n + 4 |
|
77 |
- x = x >> 4 |
|
78 |
- } |
|
79 |
- if (x & 0x00000003) == 0 { |
|
80 |
- n = n + 2 |
|
81 |
- x = x >> 2 |
|
82 |
- } |
|
83 |
- return n - int(x&1) |
|
84 |
-} |