bitmapcontainer.go 28 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183
  1. package roaring
  2. import (
  3. "fmt"
  4. "unsafe"
  5. )
  6. type bitmapContainer struct {
  7. cardinality int
  8. bitmap []uint64
  9. }
  10. func (bc bitmapContainer) String() string {
  11. var s string
  12. for it := bc.getShortIterator(); it.hasNext(); {
  13. s += fmt.Sprintf("%v, ", it.next())
  14. }
  15. return s
  16. }
  17. func newBitmapContainer() *bitmapContainer {
  18. p := new(bitmapContainer)
  19. size := (1 << 16) / 64
  20. p.bitmap = make([]uint64, size, size)
  21. return p
  22. }
  23. func newBitmapContainerwithRange(firstOfRun, lastOfRun int) *bitmapContainer {
  24. bc := newBitmapContainer()
  25. bc.cardinality = lastOfRun - firstOfRun + 1
  26. if bc.cardinality == maxCapacity {
  27. fill(bc.bitmap, uint64(0xffffffffffffffff))
  28. } else {
  29. firstWord := firstOfRun / 64
  30. lastWord := lastOfRun / 64
  31. zeroPrefixLength := uint64(firstOfRun & 63)
  32. zeroSuffixLength := uint64(63 - (lastOfRun & 63))
  33. fillRange(bc.bitmap, firstWord, lastWord+1, uint64(0xffffffffffffffff))
  34. bc.bitmap[firstWord] ^= ((uint64(1) << zeroPrefixLength) - 1)
  35. blockOfOnes := (uint64(1) << zeroSuffixLength) - 1
  36. maskOnLeft := blockOfOnes << (uint64(64) - zeroSuffixLength)
  37. bc.bitmap[lastWord] ^= maskOnLeft
  38. }
  39. return bc
  40. }
  41. func (bc *bitmapContainer) minimum() uint16 {
  42. for i := 0; i < len(bc.bitmap); i++ {
  43. w := bc.bitmap[i]
  44. if w != 0 {
  45. r := countTrailingZeros(w)
  46. return uint16(r + i*64)
  47. }
  48. }
  49. return MaxUint16
  50. }
  51. // i should be non-zero
  52. func clz(i uint64) int {
  53. n := 1
  54. x := uint32(i >> 32)
  55. if x == 0 {
  56. n += 32
  57. x = uint32(i)
  58. }
  59. if x>>16 == 0 {
  60. n += 16
  61. x = x << 16
  62. }
  63. if x>>24 == 0 {
  64. n += 8
  65. x = x << 8
  66. }
  67. if x>>28 == 0 {
  68. n += 4
  69. x = x << 4
  70. }
  71. if x>>30 == 0 {
  72. n += 2
  73. x = x << 2
  74. }
  75. return n - int(x>>31)
  76. }
  77. func (bc *bitmapContainer) maximum() uint16 {
  78. for i := len(bc.bitmap); i > 0; i-- {
  79. w := bc.bitmap[i-1]
  80. if w != 0 {
  81. r := clz(w)
  82. return uint16((i-1)*64 + 63 - r)
  83. }
  84. }
  85. return uint16(0)
  86. }
  87. func (bc *bitmapContainer) iterate(cb func(x uint16) bool) bool {
  88. iterator := bitmapContainerShortIterator{bc, bc.NextSetBit(0)}
  89. for iterator.hasNext() {
  90. if !cb(iterator.next()) {
  91. return false
  92. }
  93. }
  94. return true
  95. }
  96. type bitmapContainerShortIterator struct {
  97. ptr *bitmapContainer
  98. i int
  99. }
  100. func (bcsi *bitmapContainerShortIterator) next() uint16 {
  101. j := bcsi.i
  102. bcsi.i = bcsi.ptr.NextSetBit(uint(bcsi.i) + 1)
  103. return uint16(j)
  104. }
  105. func (bcsi *bitmapContainerShortIterator) hasNext() bool {
  106. return bcsi.i >= 0
  107. }
  108. func (bcsi *bitmapContainerShortIterator) peekNext() uint16 {
  109. return uint16(bcsi.i)
  110. }
  111. func (bcsi *bitmapContainerShortIterator) advanceIfNeeded(minval uint16) {
  112. if bcsi.hasNext() && bcsi.peekNext() < minval {
  113. bcsi.i = bcsi.ptr.NextSetBit(uint(minval))
  114. }
  115. }
  116. func newBitmapContainerShortIterator(a *bitmapContainer) *bitmapContainerShortIterator {
  117. return &bitmapContainerShortIterator{a, a.NextSetBit(0)}
  118. }
  119. func (bc *bitmapContainer) getShortIterator() shortPeekable {
  120. return newBitmapContainerShortIterator(bc)
  121. }
  122. type reverseBitmapContainerShortIterator struct {
  123. ptr *bitmapContainer
  124. i int
  125. }
  126. func (bcsi *reverseBitmapContainerShortIterator) next() uint16 {
  127. if bcsi.i == -1 {
  128. panic("reverseBitmapContainerShortIterator.next() going beyond what is available")
  129. }
  130. j := bcsi.i
  131. bcsi.i = bcsi.ptr.PrevSetBit(bcsi.i - 1)
  132. return uint16(j)
  133. }
  134. func (bcsi *reverseBitmapContainerShortIterator) hasNext() bool {
  135. return bcsi.i >= 0
  136. }
  137. func newReverseBitmapContainerShortIterator(a *bitmapContainer) *reverseBitmapContainerShortIterator {
  138. if a.cardinality == 0 {
  139. return &reverseBitmapContainerShortIterator{a, -1}
  140. }
  141. return &reverseBitmapContainerShortIterator{a, int(a.maximum())}
  142. }
  143. func (bc *bitmapContainer) getReverseIterator() shortIterable {
  144. return newReverseBitmapContainerShortIterator(bc)
  145. }
  146. type bitmapContainerManyIterator struct {
  147. ptr *bitmapContainer
  148. base int
  149. bitset uint64
  150. }
  151. func (bcmi *bitmapContainerManyIterator) nextMany(hs uint32, buf []uint32) int {
  152. n := 0
  153. base := bcmi.base
  154. bitset := bcmi.bitset
  155. for n < len(buf) {
  156. if bitset == 0 {
  157. base++
  158. if base >= len(bcmi.ptr.bitmap) {
  159. bcmi.base = base
  160. bcmi.bitset = bitset
  161. return n
  162. }
  163. bitset = bcmi.ptr.bitmap[base]
  164. continue
  165. }
  166. t := bitset & -bitset
  167. buf[n] = uint32(((base * 64) + int(popcount(t-1)))) | hs
  168. n = n + 1
  169. bitset ^= t
  170. }
  171. bcmi.base = base
  172. bcmi.bitset = bitset
  173. return n
  174. }
  175. func (bcmi *bitmapContainerManyIterator) nextMany64(hs uint64, buf []uint64) int {
  176. n := 0
  177. base := bcmi.base
  178. bitset := bcmi.bitset
  179. for n < len(buf) {
  180. if bitset == 0 {
  181. base++
  182. if base >= len(bcmi.ptr.bitmap) {
  183. bcmi.base = base
  184. bcmi.bitset = bitset
  185. return n
  186. }
  187. bitset = bcmi.ptr.bitmap[base]
  188. continue
  189. }
  190. t := bitset & -bitset
  191. buf[n] = uint64(((base * 64) + int(popcount(t-1)))) | hs
  192. n = n + 1
  193. bitset ^= t
  194. }
  195. bcmi.base = base
  196. bcmi.bitset = bitset
  197. return n
  198. }
  199. func newBitmapContainerManyIterator(a *bitmapContainer) *bitmapContainerManyIterator {
  200. return &bitmapContainerManyIterator{a, -1, 0}
  201. }
  202. func (bc *bitmapContainer) getManyIterator() manyIterable {
  203. return newBitmapContainerManyIterator(bc)
  204. }
  205. func (bc *bitmapContainer) getSizeInBytes() int {
  206. return len(bc.bitmap) * 8 // + bcBaseBytes
  207. }
  208. func (bc *bitmapContainer) serializedSizeInBytes() int {
  209. //return bc.Msgsize()// NOO! This breaks GetSerializedSizeInBytes
  210. return len(bc.bitmap) * 8
  211. }
  212. const bcBaseBytes = int(unsafe.Sizeof(bitmapContainer{}))
  213. // bitmapContainer doesn't depend on card, always fully allocated
  214. func bitmapContainerSizeInBytes() int {
  215. return bcBaseBytes + (1<<16)/8
  216. }
  217. func bitmapEquals(a, b []uint64) bool {
  218. if len(a) != len(b) {
  219. return false
  220. }
  221. for i, v := range a {
  222. if v != b[i] {
  223. return false
  224. }
  225. }
  226. return true
  227. }
  228. func (bc *bitmapContainer) fillLeastSignificant16bits(x []uint32, i int, mask uint32) int {
  229. // TODO: should be written as optimized assembly
  230. pos := i
  231. base := mask
  232. for k := 0; k < len(bc.bitmap); k++ {
  233. bitset := bc.bitmap[k]
  234. for bitset != 0 {
  235. t := bitset & -bitset
  236. x[pos] = base + uint32(popcount(t-1))
  237. pos++
  238. bitset ^= t
  239. }
  240. base += 64
  241. }
  242. return pos
  243. }
  244. func (bc *bitmapContainer) equals(o container) bool {
  245. srb, ok := o.(*bitmapContainer)
  246. if ok {
  247. if srb.cardinality != bc.cardinality {
  248. return false
  249. }
  250. return bitmapEquals(bc.bitmap, srb.bitmap)
  251. }
  252. // use generic comparison
  253. if bc.getCardinality() != o.getCardinality() {
  254. return false
  255. }
  256. ait := o.getShortIterator()
  257. bit := bc.getShortIterator()
  258. for ait.hasNext() {
  259. if bit.next() != ait.next() {
  260. return false
  261. }
  262. }
  263. return true
  264. }
  265. func (bc *bitmapContainer) iaddReturnMinimized(i uint16) container {
  266. bc.iadd(i)
  267. if bc.isFull() {
  268. return newRunContainer16Range(0, MaxUint16)
  269. }
  270. return bc
  271. }
  272. func (bc *bitmapContainer) iadd(i uint16) bool {
  273. x := int(i)
  274. previous := bc.bitmap[x/64]
  275. mask := uint64(1) << (uint(x) % 64)
  276. newb := previous | mask
  277. bc.bitmap[x/64] = newb
  278. bc.cardinality += int((previous ^ newb) >> (uint(x) % 64))
  279. return newb != previous
  280. }
  281. func (bc *bitmapContainer) iremoveReturnMinimized(i uint16) container {
  282. if bc.iremove(i) {
  283. if bc.cardinality == arrayDefaultMaxSize {
  284. return bc.toArrayContainer()
  285. }
  286. }
  287. return bc
  288. }
  289. // iremove returns true if i was found.
  290. func (bc *bitmapContainer) iremove(i uint16) bool {
  291. if bc.contains(i) {
  292. bc.cardinality--
  293. bc.bitmap[i/64] &^= (uint64(1) << (i % 64))
  294. return true
  295. }
  296. return false
  297. }
  298. func (bc *bitmapContainer) isFull() bool {
  299. return bc.cardinality == int(MaxUint16)+1
  300. }
  301. func (bc *bitmapContainer) getCardinality() int {
  302. return bc.cardinality
  303. }
  304. func (bc *bitmapContainer) isEmpty() bool {
  305. return bc.cardinality == 0
  306. }
  307. func (bc *bitmapContainer) clone() container {
  308. ptr := bitmapContainer{bc.cardinality, make([]uint64, len(bc.bitmap))}
  309. copy(ptr.bitmap, bc.bitmap[:])
  310. return &ptr
  311. }
  312. // add all values in range [firstOfRange,lastOfRange)
  313. func (bc *bitmapContainer) iaddRange(firstOfRange, lastOfRange int) container {
  314. bc.cardinality += setBitmapRangeAndCardinalityChange(bc.bitmap, firstOfRange, lastOfRange)
  315. return bc
  316. }
  317. // remove all values in range [firstOfRange,lastOfRange)
  318. func (bc *bitmapContainer) iremoveRange(firstOfRange, lastOfRange int) container {
  319. bc.cardinality += resetBitmapRangeAndCardinalityChange(bc.bitmap, firstOfRange, lastOfRange)
  320. if bc.getCardinality() <= arrayDefaultMaxSize {
  321. return bc.toArrayContainer()
  322. }
  323. return bc
  324. }
  325. // flip all values in range [firstOfRange,endx)
  326. func (bc *bitmapContainer) inot(firstOfRange, endx int) container {
  327. if endx-firstOfRange == maxCapacity {
  328. flipBitmapRange(bc.bitmap, firstOfRange, endx)
  329. bc.cardinality = maxCapacity - bc.cardinality
  330. } else if endx-firstOfRange > maxCapacity/2 {
  331. flipBitmapRange(bc.bitmap, firstOfRange, endx)
  332. bc.computeCardinality()
  333. } else {
  334. bc.cardinality += flipBitmapRangeAndCardinalityChange(bc.bitmap, firstOfRange, endx)
  335. }
  336. if bc.getCardinality() <= arrayDefaultMaxSize {
  337. return bc.toArrayContainer()
  338. }
  339. return bc
  340. }
  341. // flip all values in range [firstOfRange,endx)
  342. func (bc *bitmapContainer) not(firstOfRange, endx int) container {
  343. answer := bc.clone()
  344. return answer.inot(firstOfRange, endx)
  345. }
  346. func (bc *bitmapContainer) or(a container) container {
  347. switch x := a.(type) {
  348. case *arrayContainer:
  349. return bc.orArray(x)
  350. case *bitmapContainer:
  351. return bc.orBitmap(x)
  352. case *runContainer16:
  353. if x.isFull() {
  354. return x.clone()
  355. }
  356. return x.orBitmapContainer(bc)
  357. }
  358. panic("unsupported container type")
  359. }
  360. func (bc *bitmapContainer) orCardinality(a container) int {
  361. switch x := a.(type) {
  362. case *arrayContainer:
  363. return bc.orArrayCardinality(x)
  364. case *bitmapContainer:
  365. return bc.orBitmapCardinality(x)
  366. case *runContainer16:
  367. return x.orBitmapContainerCardinality(bc)
  368. }
  369. panic("unsupported container type")
  370. }
  371. func (bc *bitmapContainer) ior(a container) container {
  372. switch x := a.(type) {
  373. case *arrayContainer:
  374. return bc.iorArray(x)
  375. case *bitmapContainer:
  376. return bc.iorBitmap(x)
  377. case *runContainer16:
  378. if x.isFull() {
  379. return x.clone()
  380. }
  381. for i := range x.iv {
  382. bc.iaddRange(int(x.iv[i].start), int(x.iv[i].last())+1)
  383. }
  384. if bc.isFull() {
  385. return newRunContainer16Range(0, MaxUint16)
  386. }
  387. //bc.computeCardinality()
  388. return bc
  389. }
  390. panic(fmt.Errorf("unsupported container type %T", a))
  391. }
  392. func (bc *bitmapContainer) lazyIOR(a container) container {
  393. switch x := a.(type) {
  394. case *arrayContainer:
  395. return bc.lazyIORArray(x)
  396. case *bitmapContainer:
  397. return bc.lazyIORBitmap(x)
  398. case *runContainer16:
  399. if x.isFull() {
  400. return x.clone()
  401. }
  402. // Manually inlined setBitmapRange function
  403. bitmap := bc.bitmap
  404. for _, iv := range x.iv {
  405. start := int(iv.start)
  406. end := int(iv.last()) + 1
  407. if start >= end {
  408. continue
  409. }
  410. firstword := start / 64
  411. endword := (end - 1) / 64
  412. if firstword == endword {
  413. bitmap[firstword] |= (^uint64(0) << uint(start%64)) & (^uint64(0) >> (uint(-end) % 64))
  414. continue
  415. }
  416. bitmap[firstword] |= ^uint64(0) << uint(start%64)
  417. for i := firstword + 1; i < endword; i++ {
  418. bitmap[i] = ^uint64(0)
  419. }
  420. bitmap[endword] |= ^uint64(0) >> (uint(-end) % 64)
  421. }
  422. bc.cardinality = invalidCardinality
  423. return bc
  424. }
  425. panic("unsupported container type")
  426. }
  427. func (bc *bitmapContainer) lazyOR(a container) container {
  428. switch x := a.(type) {
  429. case *arrayContainer:
  430. return bc.lazyORArray(x)
  431. case *bitmapContainer:
  432. return bc.lazyORBitmap(x)
  433. case *runContainer16:
  434. if x.isFull() {
  435. return x.clone()
  436. }
  437. // TODO: implement lazy OR
  438. return x.orBitmapContainer(bc)
  439. }
  440. panic("unsupported container type")
  441. }
  442. func (bc *bitmapContainer) orArray(value2 *arrayContainer) container {
  443. answer := bc.clone().(*bitmapContainer)
  444. c := value2.getCardinality()
  445. for k := 0; k < c; k++ {
  446. v := value2.content[k]
  447. i := uint(v) >> 6
  448. bef := answer.bitmap[i]
  449. aft := bef | (uint64(1) << (v % 64))
  450. answer.bitmap[i] = aft
  451. answer.cardinality += int((bef - aft) >> 63)
  452. }
  453. return answer
  454. }
  455. func (bc *bitmapContainer) orArrayCardinality(value2 *arrayContainer) int {
  456. answer := 0
  457. c := value2.getCardinality()
  458. for k := 0; k < c; k++ {
  459. // branchless:
  460. v := value2.content[k]
  461. i := uint(v) >> 6
  462. bef := bc.bitmap[i]
  463. aft := bef | (uint64(1) << (v % 64))
  464. answer += int((bef - aft) >> 63)
  465. }
  466. return answer
  467. }
  468. func (bc *bitmapContainer) orBitmap(value2 *bitmapContainer) container {
  469. answer := newBitmapContainer()
  470. for k := 0; k < len(answer.bitmap); k++ {
  471. answer.bitmap[k] = bc.bitmap[k] | value2.bitmap[k]
  472. }
  473. answer.computeCardinality()
  474. if answer.isFull() {
  475. return newRunContainer16Range(0, MaxUint16)
  476. }
  477. return answer
  478. }
  479. func (bc *bitmapContainer) orBitmapCardinality(value2 *bitmapContainer) int {
  480. return int(popcntOrSlice(bc.bitmap, value2.bitmap))
  481. }
  482. func (bc *bitmapContainer) andBitmapCardinality(value2 *bitmapContainer) int {
  483. return int(popcntAndSlice(bc.bitmap, value2.bitmap))
  484. }
  485. func (bc *bitmapContainer) computeCardinality() {
  486. bc.cardinality = int(popcntSlice(bc.bitmap))
  487. }
  488. func (bc *bitmapContainer) iorArray(ac *arrayContainer) container {
  489. for k := range ac.content {
  490. vc := ac.content[k]
  491. i := uint(vc) >> 6
  492. bef := bc.bitmap[i]
  493. aft := bef | (uint64(1) << (vc % 64))
  494. bc.bitmap[i] = aft
  495. bc.cardinality += int((bef - aft) >> 63)
  496. }
  497. if bc.isFull() {
  498. return newRunContainer16Range(0, MaxUint16)
  499. }
  500. return bc
  501. }
  502. func (bc *bitmapContainer) iorBitmap(value2 *bitmapContainer) container {
  503. answer := bc
  504. answer.cardinality = 0
  505. for k := 0; k < len(answer.bitmap); k++ {
  506. answer.bitmap[k] = bc.bitmap[k] | value2.bitmap[k]
  507. }
  508. answer.computeCardinality()
  509. if bc.isFull() {
  510. return newRunContainer16Range(0, MaxUint16)
  511. }
  512. return answer
  513. }
  514. func (bc *bitmapContainer) lazyIORArray(value2 *arrayContainer) container {
  515. answer := bc
  516. c := value2.getCardinality()
  517. for k := 0; k+3 < c; k += 4 {
  518. content := (*[4]uint16)(unsafe.Pointer(&value2.content[k]))
  519. vc0 := content[0]
  520. i0 := uint(vc0) >> 6
  521. answer.bitmap[i0] = answer.bitmap[i0] | (uint64(1) << (vc0 % 64))
  522. vc1 := content[1]
  523. i1 := uint(vc1) >> 6
  524. answer.bitmap[i1] = answer.bitmap[i1] | (uint64(1) << (vc1 % 64))
  525. vc2 := content[2]
  526. i2 := uint(vc2) >> 6
  527. answer.bitmap[i2] = answer.bitmap[i2] | (uint64(1) << (vc2 % 64))
  528. vc3 := content[3]
  529. i3 := uint(vc3) >> 6
  530. answer.bitmap[i3] = answer.bitmap[i3] | (uint64(1) << (vc3 % 64))
  531. }
  532. for k := c &^ 3; k < c; k++ {
  533. vc := value2.content[k]
  534. i := uint(vc) >> 6
  535. answer.bitmap[i] = answer.bitmap[i] | (uint64(1) << (vc % 64))
  536. }
  537. answer.cardinality = invalidCardinality
  538. return answer
  539. }
  540. func (bc *bitmapContainer) lazyORArray(value2 *arrayContainer) container {
  541. answer := bc.clone().(*bitmapContainer)
  542. return answer.lazyIORArray(value2)
  543. }
  544. func (bc *bitmapContainer) lazyIORBitmap(value2 *bitmapContainer) container {
  545. answer := bc
  546. for k := 0; k < len(answer.bitmap); k++ {
  547. answer.bitmap[k] = bc.bitmap[k] | value2.bitmap[k]
  548. }
  549. bc.cardinality = invalidCardinality
  550. return answer
  551. }
  552. func (bc *bitmapContainer) lazyORBitmap(value2 *bitmapContainer) container {
  553. answer := bc.clone().(*bitmapContainer)
  554. return answer.lazyIORBitmap(value2)
  555. }
  556. func (bc *bitmapContainer) xor(a container) container {
  557. switch x := a.(type) {
  558. case *arrayContainer:
  559. return bc.xorArray(x)
  560. case *bitmapContainer:
  561. return bc.xorBitmap(x)
  562. case *runContainer16:
  563. return x.xorBitmap(bc)
  564. }
  565. panic("unsupported container type")
  566. }
  567. func (bc *bitmapContainer) xorArray(value2 *arrayContainer) container {
  568. answer := bc.clone().(*bitmapContainer)
  569. c := value2.getCardinality()
  570. for k := 0; k < c; k++ {
  571. vc := value2.content[k]
  572. index := uint(vc) >> 6
  573. abi := answer.bitmap[index]
  574. mask := uint64(1) << (vc % 64)
  575. answer.cardinality += 1 - 2*int((abi&mask)>>(vc%64))
  576. answer.bitmap[index] = abi ^ mask
  577. }
  578. if answer.cardinality <= arrayDefaultMaxSize {
  579. return answer.toArrayContainer()
  580. }
  581. return answer
  582. }
  583. func (bc *bitmapContainer) rank(x uint16) int {
  584. // TODO: rewrite in assembly
  585. leftover := (uint(x) + 1) & 63
  586. if leftover == 0 {
  587. return int(popcntSlice(bc.bitmap[:(uint(x)+1)/64]))
  588. }
  589. return int(popcntSlice(bc.bitmap[:(uint(x)+1)/64]) + popcount(bc.bitmap[(uint(x)+1)/64]<<(64-leftover)))
  590. }
  591. func (bc *bitmapContainer) selectInt(x uint16) int {
  592. remaining := x
  593. for k := 0; k < len(bc.bitmap); k++ {
  594. w := popcount(bc.bitmap[k])
  595. if uint16(w) > remaining {
  596. return k*64 + selectBitPosition(bc.bitmap[k], int(remaining))
  597. }
  598. remaining -= uint16(w)
  599. }
  600. return -1
  601. }
  602. func (bc *bitmapContainer) xorBitmap(value2 *bitmapContainer) container {
  603. newCardinality := int(popcntXorSlice(bc.bitmap, value2.bitmap))
  604. if newCardinality > arrayDefaultMaxSize {
  605. answer := newBitmapContainer()
  606. for k := 0; k < len(answer.bitmap); k++ {
  607. answer.bitmap[k] = bc.bitmap[k] ^ value2.bitmap[k]
  608. }
  609. answer.cardinality = newCardinality
  610. if answer.isFull() {
  611. return newRunContainer16Range(0, MaxUint16)
  612. }
  613. return answer
  614. }
  615. ac := newArrayContainerSize(newCardinality)
  616. fillArrayXOR(ac.content, bc.bitmap, value2.bitmap)
  617. ac.content = ac.content[:newCardinality]
  618. return ac
  619. }
  620. func (bc *bitmapContainer) and(a container) container {
  621. switch x := a.(type) {
  622. case *arrayContainer:
  623. return bc.andArray(x)
  624. case *bitmapContainer:
  625. return bc.andBitmap(x)
  626. case *runContainer16:
  627. if x.isFull() {
  628. return bc.clone()
  629. }
  630. return x.andBitmapContainer(bc)
  631. }
  632. panic("unsupported container type")
  633. }
  634. func (bc *bitmapContainer) andCardinality(a container) int {
  635. switch x := a.(type) {
  636. case *arrayContainer:
  637. return bc.andArrayCardinality(x)
  638. case *bitmapContainer:
  639. return bc.andBitmapCardinality(x)
  640. case *runContainer16:
  641. return x.andBitmapContainerCardinality(bc)
  642. }
  643. panic("unsupported container type")
  644. }
  645. func (bc *bitmapContainer) intersects(a container) bool {
  646. switch x := a.(type) {
  647. case *arrayContainer:
  648. return bc.intersectsArray(x)
  649. case *bitmapContainer:
  650. return bc.intersectsBitmap(x)
  651. case *runContainer16:
  652. return x.intersects(bc)
  653. }
  654. panic("unsupported container type")
  655. }
  656. func (bc *bitmapContainer) iand(a container) container {
  657. switch x := a.(type) {
  658. case *arrayContainer:
  659. return bc.iandArray(x)
  660. case *bitmapContainer:
  661. return bc.iandBitmap(x)
  662. case *runContainer16:
  663. if x.isFull() {
  664. return bc.clone()
  665. }
  666. return bc.iandRun16(x)
  667. }
  668. panic("unsupported container type")
  669. }
  670. func (bc *bitmapContainer) iandRun16(rc *runContainer16) container {
  671. rcb := newBitmapContainerFromRun(rc)
  672. return bc.iandBitmap(rcb)
  673. }
  674. func (bc *bitmapContainer) iandArray(ac *arrayContainer) container {
  675. acb := ac.toBitmapContainer()
  676. return bc.iandBitmap(acb)
  677. }
  678. func (bc *bitmapContainer) andArray(value2 *arrayContainer) *arrayContainer {
  679. answer := newArrayContainerCapacity(len(value2.content))
  680. answer.content = answer.content[:cap(answer.content)]
  681. c := value2.getCardinality()
  682. pos := 0
  683. for k := 0; k < c; k++ {
  684. v := value2.content[k]
  685. answer.content[pos] = v
  686. pos += int(bc.bitValue(v))
  687. }
  688. answer.content = answer.content[:pos]
  689. return answer
  690. }
  691. func (bc *bitmapContainer) andArrayCardinality(value2 *arrayContainer) int {
  692. c := value2.getCardinality()
  693. pos := 0
  694. for k := 0; k < c; k++ {
  695. v := value2.content[k]
  696. pos += int(bc.bitValue(v))
  697. }
  698. return pos
  699. }
  700. func (bc *bitmapContainer) getCardinalityInRange(start, end uint) int {
  701. if start >= end {
  702. return 0
  703. }
  704. firstword := start / 64
  705. endword := (end - 1) / 64
  706. const allones = ^uint64(0)
  707. if firstword == endword {
  708. return int(popcount(bc.bitmap[firstword] & ((allones << (start % 64)) & (allones >> ((64 - end) & 63)))))
  709. }
  710. answer := popcount(bc.bitmap[firstword] & (allones << (start % 64)))
  711. answer += popcntSlice(bc.bitmap[firstword+1 : endword])
  712. answer += popcount(bc.bitmap[endword] & (allones >> ((64 - end) & 63)))
  713. return int(answer)
  714. }
  715. func (bc *bitmapContainer) andBitmap(value2 *bitmapContainer) container {
  716. newcardinality := int(popcntAndSlice(bc.bitmap, value2.bitmap))
  717. if newcardinality > arrayDefaultMaxSize {
  718. answer := newBitmapContainer()
  719. for k := 0; k < len(answer.bitmap); k++ {
  720. answer.bitmap[k] = bc.bitmap[k] & value2.bitmap[k]
  721. }
  722. answer.cardinality = newcardinality
  723. return answer
  724. }
  725. ac := newArrayContainerSize(newcardinality)
  726. fillArrayAND(ac.content, bc.bitmap, value2.bitmap)
  727. ac.content = ac.content[:newcardinality] //not sure why i need this
  728. return ac
  729. }
  730. func (bc *bitmapContainer) intersectsArray(value2 *arrayContainer) bool {
  731. c := value2.getCardinality()
  732. for k := 0; k < c; k++ {
  733. v := value2.content[k]
  734. if bc.contains(v) {
  735. return true
  736. }
  737. }
  738. return false
  739. }
  740. func (bc *bitmapContainer) intersectsBitmap(value2 *bitmapContainer) bool {
  741. for k := 0; k < len(bc.bitmap); k++ {
  742. if (bc.bitmap[k] & value2.bitmap[k]) != 0 {
  743. return true
  744. }
  745. }
  746. return false
  747. }
  748. func (bc *bitmapContainer) iandBitmap(value2 *bitmapContainer) container {
  749. newcardinality := int(popcntAndSlice(bc.bitmap, value2.bitmap))
  750. for k := 0; k < len(bc.bitmap); k++ {
  751. bc.bitmap[k] = bc.bitmap[k] & value2.bitmap[k]
  752. }
  753. bc.cardinality = newcardinality
  754. if newcardinality <= arrayDefaultMaxSize {
  755. return newArrayContainerFromBitmap(bc)
  756. }
  757. return bc
  758. }
  759. func (bc *bitmapContainer) andNot(a container) container {
  760. switch x := a.(type) {
  761. case *arrayContainer:
  762. return bc.andNotArray(x)
  763. case *bitmapContainer:
  764. return bc.andNotBitmap(x)
  765. case *runContainer16:
  766. return bc.andNotRun16(x)
  767. }
  768. panic("unsupported container type")
  769. }
  770. func (bc *bitmapContainer) andNotRun16(rc *runContainer16) container {
  771. rcb := rc.toBitmapContainer()
  772. return bc.andNotBitmap(rcb)
  773. }
  774. func (bc *bitmapContainer) iandNot(a container) container {
  775. switch x := a.(type) {
  776. case *arrayContainer:
  777. return bc.iandNotArray(x)
  778. case *bitmapContainer:
  779. return bc.iandNotBitmapSurely(x)
  780. case *runContainer16:
  781. return bc.iandNotRun16(x)
  782. }
  783. panic("unsupported container type")
  784. }
  785. func (bc *bitmapContainer) iandNotArray(ac *arrayContainer) container {
  786. acb := ac.toBitmapContainer()
  787. return bc.iandNotBitmapSurely(acb)
  788. }
  789. func (bc *bitmapContainer) iandNotRun16(rc *runContainer16) container {
  790. rcb := rc.toBitmapContainer()
  791. return bc.iandNotBitmapSurely(rcb)
  792. }
  793. func (bc *bitmapContainer) andNotArray(value2 *arrayContainer) container {
  794. answer := bc.clone().(*bitmapContainer)
  795. c := value2.getCardinality()
  796. for k := 0; k < c; k++ {
  797. vc := value2.content[k]
  798. i := uint(vc) >> 6
  799. oldv := answer.bitmap[i]
  800. newv := oldv &^ (uint64(1) << (vc % 64))
  801. answer.bitmap[i] = newv
  802. answer.cardinality -= int((oldv ^ newv) >> (vc % 64))
  803. }
  804. if answer.cardinality <= arrayDefaultMaxSize {
  805. return answer.toArrayContainer()
  806. }
  807. return answer
  808. }
  809. func (bc *bitmapContainer) andNotBitmap(value2 *bitmapContainer) container {
  810. newCardinality := int(popcntMaskSlice(bc.bitmap, value2.bitmap))
  811. if newCardinality > arrayDefaultMaxSize {
  812. answer := newBitmapContainer()
  813. for k := 0; k < len(answer.bitmap); k++ {
  814. answer.bitmap[k] = bc.bitmap[k] &^ value2.bitmap[k]
  815. }
  816. answer.cardinality = newCardinality
  817. return answer
  818. }
  819. ac := newArrayContainerSize(newCardinality)
  820. fillArrayANDNOT(ac.content, bc.bitmap, value2.bitmap)
  821. return ac
  822. }
  823. func (bc *bitmapContainer) iandNotBitmapSurely(value2 *bitmapContainer) container {
  824. newCardinality := int(popcntMaskSlice(bc.bitmap, value2.bitmap))
  825. for k := 0; k < len(bc.bitmap); k++ {
  826. bc.bitmap[k] = bc.bitmap[k] &^ value2.bitmap[k]
  827. }
  828. bc.cardinality = newCardinality
  829. if bc.getCardinality() <= arrayDefaultMaxSize {
  830. return bc.toArrayContainer()
  831. }
  832. return bc
  833. }
  834. func (bc *bitmapContainer) contains(i uint16) bool { //testbit
  835. x := uint(i)
  836. w := bc.bitmap[x>>6]
  837. mask := uint64(1) << (x & 63)
  838. return (w & mask) != 0
  839. }
  840. func (bc *bitmapContainer) bitValue(i uint16) uint64 {
  841. x := uint(i)
  842. w := bc.bitmap[x>>6]
  843. return (w >> (x & 63)) & 1
  844. }
  845. func (bc *bitmapContainer) loadData(arrayContainer *arrayContainer) {
  846. bc.cardinality = arrayContainer.getCardinality()
  847. c := arrayContainer.getCardinality()
  848. for k := 0; k < c; k++ {
  849. x := arrayContainer.content[k]
  850. i := int(x) / 64
  851. bc.bitmap[i] |= (uint64(1) << uint(x%64))
  852. }
  853. }
  854. func (bc *bitmapContainer) resetTo(a container) {
  855. switch x := a.(type) {
  856. case *arrayContainer:
  857. fill(bc.bitmap, 0)
  858. bc.loadData(x)
  859. case *bitmapContainer:
  860. bc.cardinality = x.cardinality
  861. copy(bc.bitmap, x.bitmap)
  862. case *runContainer16:
  863. bc.cardinality = len(x.iv)
  864. lastEnd := 0
  865. for _, r := range x.iv {
  866. bc.cardinality += int(r.length)
  867. resetBitmapRange(bc.bitmap, lastEnd, int(r.start))
  868. lastEnd = int(r.start+r.length) + 1
  869. setBitmapRange(bc.bitmap, int(r.start), lastEnd)
  870. }
  871. resetBitmapRange(bc.bitmap, lastEnd, maxCapacity)
  872. default:
  873. panic("unsupported container type")
  874. }
  875. }
  876. func (bc *bitmapContainer) toArrayContainer() *arrayContainer {
  877. ac := &arrayContainer{}
  878. ac.loadData(bc)
  879. return ac
  880. }
  881. func (bc *bitmapContainer) fillArray(container []uint16) {
  882. //TODO: rewrite in assembly
  883. pos := 0
  884. base := 0
  885. for k := 0; k < len(bc.bitmap); k++ {
  886. bitset := bc.bitmap[k]
  887. for bitset != 0 {
  888. t := bitset & -bitset
  889. container[pos] = uint16((base + int(popcount(t-1))))
  890. pos = pos + 1
  891. bitset ^= t
  892. }
  893. base += 64
  894. }
  895. }
  896. func (bc *bitmapContainer) NextSetBit(i uint) int {
  897. var (
  898. x = i / 64
  899. length = uint(len(bc.bitmap))
  900. )
  901. if x >= length {
  902. return -1
  903. }
  904. w := bc.bitmap[x]
  905. w = w >> uint(i%64)
  906. if w != 0 {
  907. return int(i) + countTrailingZeros(w)
  908. }
  909. x++
  910. for ; x < length; x++ {
  911. if bc.bitmap[x] != 0 {
  912. return int(x*64) + countTrailingZeros(bc.bitmap[x])
  913. }
  914. }
  915. return -1
  916. }
  917. func (bc *bitmapContainer) PrevSetBit(i int) int {
  918. if i < 0 {
  919. return -1
  920. }
  921. x := i / 64
  922. if x >= len(bc.bitmap) {
  923. return -1
  924. }
  925. w := bc.bitmap[x]
  926. b := i % 64
  927. w = w << uint(63-b)
  928. if w != 0 {
  929. return i - countLeadingZeros(w)
  930. }
  931. x--
  932. for ; x >= 0; x-- {
  933. if bc.bitmap[x] != 0 {
  934. return (x * 64) + 63 - countLeadingZeros(bc.bitmap[x])
  935. }
  936. }
  937. return -1
  938. }
  939. // reference the java implementation
  940. // https://github.com/RoaringBitmap/RoaringBitmap/blob/master/src/main/java/org/roaringbitmap/BitmapContainer.java#L875-L892
  941. //
  942. func (bc *bitmapContainer) numberOfRuns() int {
  943. if bc.cardinality == 0 {
  944. return 0
  945. }
  946. var numRuns uint64
  947. nextWord := bc.bitmap[0]
  948. for i := 0; i < len(bc.bitmap)-1; i++ {
  949. word := nextWord
  950. nextWord = bc.bitmap[i+1]
  951. numRuns += popcount((^word)&(word<<1)) + ((word >> 63) &^ nextWord)
  952. }
  953. word := nextWord
  954. numRuns += popcount((^word) & (word << 1))
  955. if (word & 0x8000000000000000) != 0 {
  956. numRuns++
  957. }
  958. return int(numRuns)
  959. }
  960. // convert to run or array *if needed*
  961. func (bc *bitmapContainer) toEfficientContainer() container {
  962. numRuns := bc.numberOfRuns()
  963. sizeAsRunContainer := runContainer16SerializedSizeInBytes(numRuns)
  964. sizeAsBitmapContainer := bitmapContainerSizeInBytes()
  965. card := bc.getCardinality()
  966. sizeAsArrayContainer := arrayContainerSizeInBytes(card)
  967. if sizeAsRunContainer <= minOfInt(sizeAsBitmapContainer, sizeAsArrayContainer) {
  968. return newRunContainer16FromBitmapContainer(bc)
  969. }
  970. if card <= arrayDefaultMaxSize {
  971. return bc.toArrayContainer()
  972. }
  973. return bc
  974. }
  975. func newBitmapContainerFromRun(rc *runContainer16) *bitmapContainer {
  976. if len(rc.iv) == 1 {
  977. return newBitmapContainerwithRange(int(rc.iv[0].start), int(rc.iv[0].last()))
  978. }
  979. bc := newBitmapContainer()
  980. for i := range rc.iv {
  981. setBitmapRange(bc.bitmap, int(rc.iv[i].start), int(rc.iv[i].last())+1)
  982. bc.cardinality += int(rc.iv[i].last()) + 1 - int(rc.iv[i].start)
  983. }
  984. //bc.computeCardinality()
  985. return bc
  986. }
  987. func (bc *bitmapContainer) containerType() contype {
  988. return bitmapContype
  989. }
  990. func (bc *bitmapContainer) addOffset(x uint16) (container, container) {
  991. var low, high *bitmapContainer
  992. if bc.cardinality == 0 {
  993. return nil, nil
  994. }
  995. b := uint32(x) >> 6
  996. i := uint32(x) % 64
  997. end := uint32(1024) - b
  998. low = newBitmapContainer()
  999. if i == 0 {
  1000. copy(low.bitmap[b:], bc.bitmap[:end])
  1001. } else {
  1002. low.bitmap[b] = bc.bitmap[0] << i
  1003. for k := uint32(1); k < end; k++ {
  1004. newval := bc.bitmap[k] << i
  1005. newval |= bc.bitmap[k-1] >> (64 - i)
  1006. low.bitmap[b+k] = newval
  1007. }
  1008. }
  1009. low.computeCardinality()
  1010. if low.cardinality == bc.cardinality {
  1011. // All elements from bc ended up in low, meaning high will be empty.
  1012. return low, nil
  1013. }
  1014. if low.cardinality == 0 {
  1015. // low is empty, let's reuse the container for high.
  1016. high = low
  1017. low = nil
  1018. } else {
  1019. // None of the containers will be empty, so allocate both.
  1020. high = newBitmapContainer()
  1021. }
  1022. if i == 0 {
  1023. copy(high.bitmap[:b], bc.bitmap[end:])
  1024. } else {
  1025. for k := end; k < 1024; k++ {
  1026. newval := bc.bitmap[k] << i
  1027. newval |= bc.bitmap[k-1] >> (64 - i)
  1028. high.bitmap[k-end] = newval
  1029. }
  1030. high.bitmap[b] = bc.bitmap[1023] >> (64 - i)
  1031. }
  1032. high.computeCardinality()
  1033. // Ensure proper nil interface.
  1034. if low == nil {
  1035. return nil, high
  1036. }
  1037. return low, high
  1038. }