github.com/pankona/gometalinter@v2.0.11+incompatible/_linters/src/golang.org/x/tools/container/intsets/sparse.go (about) 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 }