You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

bitmapcontainer.go 26KB

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