arraycontainer.go 26 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048
  1. package roaring
  2. import (
  3. "fmt"
  4. )
  5. type arrayContainer struct {
  6. content []uint16
  7. }
  8. func (ac *arrayContainer) String() string {
  9. s := "{"
  10. for it := ac.getShortIterator(); it.hasNext(); {
  11. s += fmt.Sprintf("%v, ", it.next())
  12. }
  13. return s + "}"
  14. }
  15. func (ac *arrayContainer) fillLeastSignificant16bits(x []uint32, i int, mask uint32) int {
  16. for k := 0; k < len(ac.content); k++ {
  17. x[k+i] = uint32(ac.content[k]) | mask
  18. }
  19. return i + len(ac.content)
  20. }
  21. func (ac *arrayContainer) iterate(cb func(x uint16) bool) bool {
  22. iterator := shortIterator{ac.content, 0}
  23. for iterator.hasNext() {
  24. if !cb(iterator.next()) {
  25. return false
  26. }
  27. }
  28. return true
  29. }
  30. func (ac *arrayContainer) getShortIterator() shortPeekable {
  31. return &shortIterator{ac.content, 0}
  32. }
  33. func (ac *arrayContainer) getReverseIterator() shortIterable {
  34. return &reverseIterator{ac.content, len(ac.content) - 1}
  35. }
  36. func (ac *arrayContainer) getManyIterator() manyIterable {
  37. return &shortIterator{ac.content, 0}
  38. }
  39. func (ac *arrayContainer) minimum() uint16 {
  40. return ac.content[0] // assume not empty
  41. }
  42. func (ac *arrayContainer) maximum() uint16 {
  43. return ac.content[len(ac.content)-1] // assume not empty
  44. }
  45. func (ac *arrayContainer) getSizeInBytes() int {
  46. return ac.getCardinality() * 2
  47. }
  48. func (ac *arrayContainer) serializedSizeInBytes() int {
  49. return ac.getCardinality() * 2
  50. }
  51. func arrayContainerSizeInBytes(card int) int {
  52. return card * 2
  53. }
  54. // add the values in the range [firstOfRange,endx)
  55. func (ac *arrayContainer) iaddRange(firstOfRange, endx int) container {
  56. if firstOfRange >= endx {
  57. return ac
  58. }
  59. indexstart := binarySearch(ac.content, uint16(firstOfRange))
  60. if indexstart < 0 {
  61. indexstart = -indexstart - 1
  62. }
  63. indexend := binarySearch(ac.content, uint16(endx-1))
  64. if indexend < 0 {
  65. indexend = -indexend - 1
  66. } else {
  67. indexend++
  68. }
  69. rangelength := endx - firstOfRange
  70. newcardinality := indexstart + (ac.getCardinality() - indexend) + rangelength
  71. if newcardinality > arrayDefaultMaxSize {
  72. a := ac.toBitmapContainer()
  73. return a.iaddRange(firstOfRange, endx)
  74. }
  75. if cap(ac.content) < newcardinality {
  76. tmp := make([]uint16, newcardinality, newcardinality)
  77. copy(tmp[:indexstart], ac.content[:indexstart])
  78. copy(tmp[indexstart+rangelength:], ac.content[indexend:])
  79. ac.content = tmp
  80. } else {
  81. ac.content = ac.content[:newcardinality]
  82. copy(ac.content[indexstart+rangelength:], ac.content[indexend:])
  83. }
  84. for k := 0; k < rangelength; k++ {
  85. ac.content[k+indexstart] = uint16(firstOfRange + k)
  86. }
  87. return ac
  88. }
  89. // remove the values in the range [firstOfRange,endx)
  90. func (ac *arrayContainer) iremoveRange(firstOfRange, endx int) container {
  91. if firstOfRange >= endx {
  92. return ac
  93. }
  94. indexstart := binarySearch(ac.content, uint16(firstOfRange))
  95. if indexstart < 0 {
  96. indexstart = -indexstart - 1
  97. }
  98. indexend := binarySearch(ac.content, uint16(endx-1))
  99. if indexend < 0 {
  100. indexend = -indexend - 1
  101. } else {
  102. indexend++
  103. }
  104. rangelength := indexend - indexstart
  105. answer := ac
  106. copy(answer.content[indexstart:], ac.content[indexstart+rangelength:])
  107. answer.content = answer.content[:ac.getCardinality()-rangelength]
  108. return answer
  109. }
  110. // flip the values in the range [firstOfRange,endx)
  111. func (ac *arrayContainer) not(firstOfRange, endx int) container {
  112. if firstOfRange >= endx {
  113. return ac.clone()
  114. }
  115. return ac.notClose(firstOfRange, endx-1) // remove everything in [firstOfRange,endx-1]
  116. }
  117. // flip the values in the range [firstOfRange,lastOfRange]
  118. func (ac *arrayContainer) notClose(firstOfRange, lastOfRange int) container {
  119. if firstOfRange > lastOfRange { // unlike add and remove, not uses an inclusive range [firstOfRange,lastOfRange]
  120. return ac.clone()
  121. }
  122. // determine the span of array indices to be affected^M
  123. startIndex := binarySearch(ac.content, uint16(firstOfRange))
  124. if startIndex < 0 {
  125. startIndex = -startIndex - 1
  126. }
  127. lastIndex := binarySearch(ac.content, uint16(lastOfRange))
  128. if lastIndex < 0 {
  129. lastIndex = -lastIndex - 2
  130. }
  131. currentValuesInRange := lastIndex - startIndex + 1
  132. spanToBeFlipped := lastOfRange - firstOfRange + 1
  133. newValuesInRange := spanToBeFlipped - currentValuesInRange
  134. cardinalityChange := newValuesInRange - currentValuesInRange
  135. newCardinality := len(ac.content) + cardinalityChange
  136. if newCardinality > arrayDefaultMaxSize {
  137. return ac.toBitmapContainer().not(firstOfRange, lastOfRange+1)
  138. }
  139. answer := newArrayContainer()
  140. answer.content = make([]uint16, newCardinality, newCardinality) //a hack for sure
  141. copy(answer.content, ac.content[:startIndex])
  142. outPos := startIndex
  143. inPos := startIndex
  144. valInRange := firstOfRange
  145. for ; valInRange <= lastOfRange && inPos <= lastIndex; valInRange++ {
  146. if uint16(valInRange) != ac.content[inPos] {
  147. answer.content[outPos] = uint16(valInRange)
  148. outPos++
  149. } else {
  150. inPos++
  151. }
  152. }
  153. for ; valInRange <= lastOfRange; valInRange++ {
  154. answer.content[outPos] = uint16(valInRange)
  155. outPos++
  156. }
  157. for i := lastIndex + 1; i < len(ac.content); i++ {
  158. answer.content[outPos] = ac.content[i]
  159. outPos++
  160. }
  161. answer.content = answer.content[:newCardinality]
  162. return answer
  163. }
  164. func (ac *arrayContainer) equals(o container) bool {
  165. srb, ok := o.(*arrayContainer)
  166. if ok {
  167. // Check if the containers are the same object.
  168. if ac == srb {
  169. return true
  170. }
  171. if len(srb.content) != len(ac.content) {
  172. return false
  173. }
  174. for i, v := range ac.content {
  175. if v != srb.content[i] {
  176. return false
  177. }
  178. }
  179. return true
  180. }
  181. // use generic comparison
  182. bCard := o.getCardinality()
  183. aCard := ac.getCardinality()
  184. if bCard != aCard {
  185. return false
  186. }
  187. ait := ac.getShortIterator()
  188. bit := o.getShortIterator()
  189. for ait.hasNext() {
  190. if bit.next() != ait.next() {
  191. return false
  192. }
  193. }
  194. return true
  195. }
  196. func (ac *arrayContainer) toBitmapContainer() *bitmapContainer {
  197. bc := newBitmapContainer()
  198. bc.loadData(ac)
  199. return bc
  200. }
  201. func (ac *arrayContainer) iadd(x uint16) (wasNew bool) {
  202. // Special case adding to the end of the container.
  203. l := len(ac.content)
  204. if l > 0 && l < arrayDefaultMaxSize && ac.content[l-1] < x {
  205. ac.content = append(ac.content, x)
  206. return true
  207. }
  208. loc := binarySearch(ac.content, x)
  209. if loc < 0 {
  210. s := ac.content
  211. i := -loc - 1
  212. s = append(s, 0)
  213. copy(s[i+1:], s[i:])
  214. s[i] = x
  215. ac.content = s
  216. return true
  217. }
  218. return false
  219. }
  220. func (ac *arrayContainer) iaddReturnMinimized(x uint16) container {
  221. // Special case adding to the end of the container.
  222. l := len(ac.content)
  223. if l > 0 && l < arrayDefaultMaxSize && ac.content[l-1] < x {
  224. ac.content = append(ac.content, x)
  225. return ac
  226. }
  227. loc := binarySearch(ac.content, x)
  228. if loc < 0 {
  229. if len(ac.content) >= arrayDefaultMaxSize {
  230. a := ac.toBitmapContainer()
  231. a.iadd(x)
  232. return a
  233. }
  234. s := ac.content
  235. i := -loc - 1
  236. s = append(s, 0)
  237. copy(s[i+1:], s[i:])
  238. s[i] = x
  239. ac.content = s
  240. }
  241. return ac
  242. }
  243. // iremoveReturnMinimized is allowed to change the return type to minimize storage.
  244. func (ac *arrayContainer) iremoveReturnMinimized(x uint16) container {
  245. ac.iremove(x)
  246. return ac
  247. }
  248. func (ac *arrayContainer) iremove(x uint16) bool {
  249. loc := binarySearch(ac.content, x)
  250. if loc >= 0 {
  251. s := ac.content
  252. s = append(s[:loc], s[loc+1:]...)
  253. ac.content = s
  254. return true
  255. }
  256. return false
  257. }
  258. func (ac *arrayContainer) remove(x uint16) container {
  259. out := &arrayContainer{make([]uint16, len(ac.content))}
  260. copy(out.content, ac.content[:])
  261. loc := binarySearch(out.content, x)
  262. if loc >= 0 {
  263. s := out.content
  264. s = append(s[:loc], s[loc+1:]...)
  265. out.content = s
  266. }
  267. return out
  268. }
  269. func (ac *arrayContainer) or(a container) container {
  270. switch x := a.(type) {
  271. case *arrayContainer:
  272. return ac.orArray(x)
  273. case *bitmapContainer:
  274. return x.orArray(ac)
  275. case *runContainer16:
  276. if x.isFull() {
  277. return x.clone()
  278. }
  279. return x.orArray(ac)
  280. }
  281. panic("unsupported container type")
  282. }
  283. func (ac *arrayContainer) orCardinality(a container) int {
  284. switch x := a.(type) {
  285. case *arrayContainer:
  286. return ac.orArrayCardinality(x)
  287. case *bitmapContainer:
  288. return x.orArrayCardinality(ac)
  289. case *runContainer16:
  290. return x.orArrayCardinality(ac)
  291. }
  292. panic("unsupported container type")
  293. }
  294. func (ac *arrayContainer) ior(a container) container {
  295. switch x := a.(type) {
  296. case *arrayContainer:
  297. return ac.iorArray(x)
  298. case *bitmapContainer:
  299. return a.(*bitmapContainer).orArray(ac)
  300. //return ac.iorBitmap(x) // note: this does not make sense
  301. case *runContainer16:
  302. if x.isFull() {
  303. return x.clone()
  304. }
  305. return ac.iorRun16(x)
  306. }
  307. panic("unsupported container type")
  308. }
  309. func (ac *arrayContainer) iorArray(value2 *arrayContainer) container {
  310. value1 := ac
  311. len1 := value1.getCardinality()
  312. len2 := value2.getCardinality()
  313. maxPossibleCardinality := len1 + len2
  314. if maxPossibleCardinality > cap(value1.content) {
  315. // doubling the capacity reduces new slice allocations in the case of
  316. // repeated calls to iorArray().
  317. newSize := 2 * maxPossibleCardinality
  318. // the second check is to handle overly large array containers
  319. // and should not occur in normal usage,
  320. // as all array containers should be at most arrayDefaultMaxSize
  321. if newSize > 2*arrayDefaultMaxSize && maxPossibleCardinality <= 2*arrayDefaultMaxSize {
  322. newSize = 2 * arrayDefaultMaxSize
  323. }
  324. newcontent := make([]uint16, 0, newSize)
  325. copy(newcontent[len2:maxPossibleCardinality], ac.content[0:len1])
  326. ac.content = newcontent
  327. } else {
  328. copy(ac.content[len2:maxPossibleCardinality], ac.content[0:len1])
  329. }
  330. nl := union2by2(value1.content[len2:maxPossibleCardinality], value2.content, ac.content)
  331. ac.content = ac.content[:nl] // reslice to match actual used capacity
  332. if nl > arrayDefaultMaxSize {
  333. // Only converting to a bitmap when arrayDefaultMaxSize
  334. // is actually exceeded minimizes conversions in the case of repeated
  335. // calls to iorArray().
  336. return ac.toBitmapContainer()
  337. }
  338. return ac
  339. }
  340. // Note: such code does not make practical sense, except for lazy evaluations
  341. func (ac *arrayContainer) iorBitmap(bc2 *bitmapContainer) container {
  342. bc1 := ac.toBitmapContainer()
  343. bc1.iorBitmap(bc2)
  344. *ac = *newArrayContainerFromBitmap(bc1)
  345. return ac
  346. }
  347. func (ac *arrayContainer) iorRun16(rc *runContainer16) container {
  348. runCardinality := rc.getCardinality()
  349. // heuristic for if the container should maybe be an
  350. // array container.
  351. if runCardinality < ac.getCardinality() &&
  352. runCardinality+ac.getCardinality() < arrayDefaultMaxSize {
  353. var result container
  354. result = ac
  355. for _, run := range rc.iv {
  356. result = result.iaddRange(int(run.start), int(run.start)+int(run.length)+1)
  357. }
  358. return result
  359. }
  360. return rc.orArray(ac)
  361. }
  362. func (ac *arrayContainer) lazyIOR(a container) container {
  363. switch x := a.(type) {
  364. case *arrayContainer:
  365. return ac.lazyIorArray(x)
  366. case *bitmapContainer:
  367. return ac.lazyIorBitmap(x)
  368. case *runContainer16:
  369. if x.isFull() {
  370. return x.clone()
  371. }
  372. return ac.lazyIorRun16(x)
  373. }
  374. panic("unsupported container type")
  375. }
  376. func (ac *arrayContainer) lazyIorArray(ac2 *arrayContainer) container {
  377. // TODO actually make this lazy
  378. return ac.iorArray(ac2)
  379. }
  380. func (ac *arrayContainer) lazyIorBitmap(bc *bitmapContainer) container {
  381. // TODO actually make this lazy
  382. return ac.iorBitmap(bc)
  383. }
  384. func (ac *arrayContainer) lazyIorRun16(rc *runContainer16) container {
  385. // TODO actually make this lazy
  386. return ac.iorRun16(rc)
  387. }
  388. func (ac *arrayContainer) lazyOR(a container) container {
  389. switch x := a.(type) {
  390. case *arrayContainer:
  391. return ac.lazyorArray(x)
  392. case *bitmapContainer:
  393. return a.lazyOR(ac)
  394. case *runContainer16:
  395. if x.isFull() {
  396. return x.clone()
  397. }
  398. return x.orArray(ac)
  399. }
  400. panic("unsupported container type")
  401. }
  402. func (ac *arrayContainer) orArray(value2 *arrayContainer) container {
  403. value1 := ac
  404. maxPossibleCardinality := value1.getCardinality() + value2.getCardinality()
  405. if maxPossibleCardinality > arrayDefaultMaxSize { // it could be a bitmap!
  406. bc := newBitmapContainer()
  407. for k := 0; k < len(value2.content); k++ {
  408. v := value2.content[k]
  409. i := uint(v) >> 6
  410. mask := uint64(1) << (v % 64)
  411. bc.bitmap[i] |= mask
  412. }
  413. for k := 0; k < len(ac.content); k++ {
  414. v := ac.content[k]
  415. i := uint(v) >> 6
  416. mask := uint64(1) << (v % 64)
  417. bc.bitmap[i] |= mask
  418. }
  419. bc.cardinality = int(popcntSlice(bc.bitmap))
  420. if bc.cardinality <= arrayDefaultMaxSize {
  421. return bc.toArrayContainer()
  422. }
  423. return bc
  424. }
  425. answer := newArrayContainerCapacity(maxPossibleCardinality)
  426. nl := union2by2(value1.content, value2.content, answer.content)
  427. answer.content = answer.content[:nl] // reslice to match actual used capacity
  428. return answer
  429. }
  430. func (ac *arrayContainer) orArrayCardinality(value2 *arrayContainer) int {
  431. return union2by2Cardinality(ac.content, value2.content)
  432. }
  433. func (ac *arrayContainer) lazyorArray(value2 *arrayContainer) container {
  434. value1 := ac
  435. maxPossibleCardinality := value1.getCardinality() + value2.getCardinality()
  436. if maxPossibleCardinality > arrayLazyLowerBound { // it could be a bitmap!
  437. bc := newBitmapContainer()
  438. for k := 0; k < len(value2.content); k++ {
  439. v := value2.content[k]
  440. i := uint(v) >> 6
  441. mask := uint64(1) << (v % 64)
  442. bc.bitmap[i] |= mask
  443. }
  444. for k := 0; k < len(ac.content); k++ {
  445. v := ac.content[k]
  446. i := uint(v) >> 6
  447. mask := uint64(1) << (v % 64)
  448. bc.bitmap[i] |= mask
  449. }
  450. bc.cardinality = invalidCardinality
  451. return bc
  452. }
  453. answer := newArrayContainerCapacity(maxPossibleCardinality)
  454. nl := union2by2(value1.content, value2.content, answer.content)
  455. answer.content = answer.content[:nl] // reslice to match actual used capacity
  456. return answer
  457. }
  458. func (ac *arrayContainer) and(a container) container {
  459. switch x := a.(type) {
  460. case *arrayContainer:
  461. return ac.andArray(x)
  462. case *bitmapContainer:
  463. return x.and(ac)
  464. case *runContainer16:
  465. if x.isFull() {
  466. return ac.clone()
  467. }
  468. return x.andArray(ac)
  469. }
  470. panic("unsupported container type")
  471. }
  472. func (ac *arrayContainer) andCardinality(a container) int {
  473. switch x := a.(type) {
  474. case *arrayContainer:
  475. return ac.andArrayCardinality(x)
  476. case *bitmapContainer:
  477. return x.andCardinality(ac)
  478. case *runContainer16:
  479. return x.andArrayCardinality(ac)
  480. }
  481. panic("unsupported container type")
  482. }
  483. func (ac *arrayContainer) intersects(a container) bool {
  484. switch x := a.(type) {
  485. case *arrayContainer:
  486. return ac.intersectsArray(x)
  487. case *bitmapContainer:
  488. return x.intersects(ac)
  489. case *runContainer16:
  490. return x.intersects(ac)
  491. }
  492. panic("unsupported container type")
  493. }
  494. func (ac *arrayContainer) iand(a container) container {
  495. switch x := a.(type) {
  496. case *arrayContainer:
  497. return ac.iandArray(x)
  498. case *bitmapContainer:
  499. return ac.iandBitmap(x)
  500. case *runContainer16:
  501. if x.isFull() {
  502. return ac
  503. }
  504. return x.andArray(ac)
  505. }
  506. panic("unsupported container type")
  507. }
  508. func (ac *arrayContainer) iandBitmap(bc *bitmapContainer) container {
  509. pos := 0
  510. c := ac.getCardinality()
  511. for k := 0; k < c; k++ {
  512. // branchless
  513. v := ac.content[k]
  514. ac.content[pos] = v
  515. pos += int(bc.bitValue(v))
  516. }
  517. ac.content = ac.content[:pos]
  518. return ac
  519. }
  520. func (ac *arrayContainer) xor(a container) container {
  521. switch x := a.(type) {
  522. case *arrayContainer:
  523. return ac.xorArray(x)
  524. case *bitmapContainer:
  525. return a.xor(ac)
  526. case *runContainer16:
  527. return x.xorArray(ac)
  528. }
  529. panic("unsupported container type")
  530. }
  531. func (ac *arrayContainer) xorArray(value2 *arrayContainer) container {
  532. value1 := ac
  533. totalCardinality := value1.getCardinality() + value2.getCardinality()
  534. if totalCardinality > arrayDefaultMaxSize { // it could be a bitmap!
  535. bc := newBitmapContainer()
  536. for k := 0; k < len(value2.content); k++ {
  537. v := value2.content[k]
  538. i := uint(v) >> 6
  539. bc.bitmap[i] ^= (uint64(1) << (v % 64))
  540. }
  541. for k := 0; k < len(ac.content); k++ {
  542. v := ac.content[k]
  543. i := uint(v) >> 6
  544. bc.bitmap[i] ^= (uint64(1) << (v % 64))
  545. }
  546. bc.computeCardinality()
  547. if bc.cardinality <= arrayDefaultMaxSize {
  548. return bc.toArrayContainer()
  549. }
  550. return bc
  551. }
  552. desiredCapacity := totalCardinality
  553. answer := newArrayContainerCapacity(desiredCapacity)
  554. length := exclusiveUnion2by2(value1.content, value2.content, answer.content)
  555. answer.content = answer.content[:length]
  556. return answer
  557. }
  558. func (ac *arrayContainer) andNot(a container) container {
  559. switch x := a.(type) {
  560. case *arrayContainer:
  561. return ac.andNotArray(x)
  562. case *bitmapContainer:
  563. return ac.andNotBitmap(x)
  564. case *runContainer16:
  565. return ac.andNotRun16(x)
  566. }
  567. panic("unsupported container type")
  568. }
  569. func (ac *arrayContainer) andNotRun16(rc *runContainer16) container {
  570. acb := ac.toBitmapContainer()
  571. rcb := rc.toBitmapContainer()
  572. return acb.andNotBitmap(rcb)
  573. }
  574. func (ac *arrayContainer) iandNot(a container) container {
  575. switch x := a.(type) {
  576. case *arrayContainer:
  577. return ac.iandNotArray(x)
  578. case *bitmapContainer:
  579. return ac.iandNotBitmap(x)
  580. case *runContainer16:
  581. return ac.iandNotRun16(x)
  582. }
  583. panic("unsupported container type")
  584. }
  585. func (ac *arrayContainer) iandNotRun16(rc *runContainer16) container {
  586. rcb := rc.toBitmapContainer()
  587. acb := ac.toBitmapContainer()
  588. acb.iandNotBitmapSurely(rcb)
  589. *ac = *(acb.toArrayContainer())
  590. return ac
  591. }
  592. func (ac *arrayContainer) andNotArray(value2 *arrayContainer) container {
  593. value1 := ac
  594. desiredcapacity := value1.getCardinality()
  595. answer := newArrayContainerCapacity(desiredcapacity)
  596. length := difference(value1.content, value2.content, answer.content)
  597. answer.content = answer.content[:length]
  598. return answer
  599. }
  600. func (ac *arrayContainer) iandNotArray(value2 *arrayContainer) container {
  601. length := difference(ac.content, value2.content, ac.content)
  602. ac.content = ac.content[:length]
  603. return ac
  604. }
  605. func (ac *arrayContainer) andNotBitmap(value2 *bitmapContainer) container {
  606. desiredcapacity := ac.getCardinality()
  607. answer := newArrayContainerCapacity(desiredcapacity)
  608. answer.content = answer.content[:desiredcapacity]
  609. pos := 0
  610. for _, v := range ac.content {
  611. answer.content[pos] = v
  612. pos += 1 - int(value2.bitValue(v))
  613. }
  614. answer.content = answer.content[:pos]
  615. return answer
  616. }
  617. func (ac *arrayContainer) andBitmap(value2 *bitmapContainer) container {
  618. desiredcapacity := ac.getCardinality()
  619. answer := newArrayContainerCapacity(desiredcapacity)
  620. answer.content = answer.content[:desiredcapacity]
  621. pos := 0
  622. for _, v := range ac.content {
  623. answer.content[pos] = v
  624. pos += int(value2.bitValue(v))
  625. }
  626. answer.content = answer.content[:pos]
  627. return answer
  628. }
  629. func (ac *arrayContainer) iandNotBitmap(value2 *bitmapContainer) container {
  630. pos := 0
  631. for _, v := range ac.content {
  632. ac.content[pos] = v
  633. pos += 1 - int(value2.bitValue(v))
  634. }
  635. ac.content = ac.content[:pos]
  636. return ac
  637. }
  638. func copyOf(array []uint16, size int) []uint16 {
  639. result := make([]uint16, size)
  640. for i, x := range array {
  641. if i == size {
  642. break
  643. }
  644. result[i] = x
  645. }
  646. return result
  647. }
  648. // flip the values in the range [firstOfRange,endx)
  649. func (ac *arrayContainer) inot(firstOfRange, endx int) container {
  650. if firstOfRange >= endx {
  651. return ac
  652. }
  653. return ac.inotClose(firstOfRange, endx-1) // remove everything in [firstOfRange,endx-1]
  654. }
  655. // flip the values in the range [firstOfRange,lastOfRange]
  656. func (ac *arrayContainer) inotClose(firstOfRange, lastOfRange int) container {
  657. if firstOfRange > lastOfRange { // unlike add and remove, not uses an inclusive range [firstOfRange,lastOfRange]
  658. return ac
  659. }
  660. // determine the span of array indices to be affected
  661. startIndex := binarySearch(ac.content, uint16(firstOfRange))
  662. if startIndex < 0 {
  663. startIndex = -startIndex - 1
  664. }
  665. lastIndex := binarySearch(ac.content, uint16(lastOfRange))
  666. if lastIndex < 0 {
  667. lastIndex = -lastIndex - 1 - 1
  668. }
  669. currentValuesInRange := lastIndex - startIndex + 1
  670. spanToBeFlipped := lastOfRange - firstOfRange + 1
  671. newValuesInRange := spanToBeFlipped - currentValuesInRange
  672. buffer := make([]uint16, newValuesInRange)
  673. cardinalityChange := newValuesInRange - currentValuesInRange
  674. newCardinality := len(ac.content) + cardinalityChange
  675. if cardinalityChange > 0 {
  676. if newCardinality > len(ac.content) {
  677. if newCardinality > arrayDefaultMaxSize {
  678. bcRet := ac.toBitmapContainer()
  679. bcRet.inot(firstOfRange, lastOfRange+1)
  680. *ac = *bcRet.toArrayContainer()
  681. return bcRet
  682. }
  683. ac.content = copyOf(ac.content, newCardinality)
  684. }
  685. base := lastIndex + 1
  686. copy(ac.content[lastIndex+1+cardinalityChange:], ac.content[base:base+len(ac.content)-1-lastIndex])
  687. ac.negateRange(buffer, startIndex, lastIndex, firstOfRange, lastOfRange+1)
  688. } else { // no expansion needed
  689. ac.negateRange(buffer, startIndex, lastIndex, firstOfRange, lastOfRange+1)
  690. if cardinalityChange < 0 {
  691. for i := startIndex + newValuesInRange; i < newCardinality; i++ {
  692. ac.content[i] = ac.content[i-cardinalityChange]
  693. }
  694. }
  695. }
  696. ac.content = ac.content[:newCardinality]
  697. return ac
  698. }
  699. func (ac *arrayContainer) negateRange(buffer []uint16, startIndex, lastIndex, startRange, lastRange int) {
  700. // compute the negation into buffer
  701. outPos := 0
  702. inPos := startIndex // value here always >= valInRange,
  703. // until it is exhausted
  704. // n.b., we can start initially exhausted.
  705. valInRange := startRange
  706. for ; valInRange < lastRange && inPos <= lastIndex; valInRange++ {
  707. if uint16(valInRange) != ac.content[inPos] {
  708. buffer[outPos] = uint16(valInRange)
  709. outPos++
  710. } else {
  711. inPos++
  712. }
  713. }
  714. // if there are extra items (greater than the biggest
  715. // pre-existing one in range), buffer them
  716. for ; valInRange < lastRange; valInRange++ {
  717. buffer[outPos] = uint16(valInRange)
  718. outPos++
  719. }
  720. if outPos != len(buffer) {
  721. panic("negateRange: internal bug")
  722. }
  723. for i, item := range buffer {
  724. ac.content[i+startIndex] = item
  725. }
  726. }
  727. func (ac *arrayContainer) isFull() bool {
  728. return false
  729. }
  730. func (ac *arrayContainer) andArray(value2 *arrayContainer) container {
  731. desiredcapacity := minOfInt(ac.getCardinality(), value2.getCardinality())
  732. answer := newArrayContainerCapacity(desiredcapacity)
  733. length := intersection2by2(
  734. ac.content,
  735. value2.content,
  736. answer.content)
  737. answer.content = answer.content[:length]
  738. return answer
  739. }
  740. func (ac *arrayContainer) andArrayCardinality(value2 *arrayContainer) int {
  741. return intersection2by2Cardinality(
  742. ac.content,
  743. value2.content)
  744. }
  745. func (ac *arrayContainer) intersectsArray(value2 *arrayContainer) bool {
  746. return intersects2by2(
  747. ac.content,
  748. value2.content)
  749. }
  750. func (ac *arrayContainer) iandArray(value2 *arrayContainer) container {
  751. length := intersection2by2(
  752. ac.content,
  753. value2.content,
  754. ac.content)
  755. ac.content = ac.content[:length]
  756. return ac
  757. }
  758. func (ac *arrayContainer) getCardinality() int {
  759. return len(ac.content)
  760. }
  761. func (ac *arrayContainer) isEmpty() bool {
  762. return len(ac.content) == 0
  763. }
  764. func (ac *arrayContainer) rank(x uint16) int {
  765. answer := binarySearch(ac.content, x)
  766. if answer >= 0 {
  767. return answer + 1
  768. }
  769. return -answer - 1
  770. }
  771. func (ac *arrayContainer) selectInt(x uint16) int {
  772. return int(ac.content[x])
  773. }
  774. func (ac *arrayContainer) clone() container {
  775. ptr := arrayContainer{make([]uint16, len(ac.content))}
  776. copy(ptr.content, ac.content[:])
  777. return &ptr
  778. }
  779. func (ac *arrayContainer) contains(x uint16) bool {
  780. return binarySearch(ac.content, x) >= 0
  781. }
  782. func (ac *arrayContainer) loadData(bitmapContainer *bitmapContainer) {
  783. ac.content = make([]uint16, bitmapContainer.cardinality, bitmapContainer.cardinality)
  784. bitmapContainer.fillArray(ac.content)
  785. }
  786. func (ac *arrayContainer) resetTo(a container) {
  787. switch x := a.(type) {
  788. case *arrayContainer:
  789. ac.realloc(len(x.content))
  790. copy(ac.content, x.content)
  791. case *bitmapContainer:
  792. ac.realloc(x.cardinality)
  793. x.fillArray(ac.content)
  794. case *runContainer16:
  795. card := int(x.getCardinality())
  796. ac.realloc(card)
  797. cur := 0
  798. for _, r := range x.iv {
  799. for val := r.start; val <= r.last(); val++ {
  800. ac.content[cur] = val
  801. cur++
  802. }
  803. }
  804. default:
  805. panic("unsupported container type")
  806. }
  807. }
  808. func (ac *arrayContainer) realloc(size int) {
  809. if cap(ac.content) < size {
  810. ac.content = make([]uint16, size)
  811. } else {
  812. ac.content = ac.content[:size]
  813. }
  814. }
  815. func newArrayContainer() *arrayContainer {
  816. p := new(arrayContainer)
  817. return p
  818. }
  819. func newArrayContainerFromBitmap(bc *bitmapContainer) *arrayContainer {
  820. ac := &arrayContainer{}
  821. ac.loadData(bc)
  822. return ac
  823. }
  824. func newArrayContainerCapacity(size int) *arrayContainer {
  825. p := new(arrayContainer)
  826. p.content = make([]uint16, 0, size)
  827. return p
  828. }
  829. func newArrayContainerSize(size int) *arrayContainer {
  830. p := new(arrayContainer)
  831. p.content = make([]uint16, size, size)
  832. return p
  833. }
  834. func newArrayContainerRange(firstOfRun, lastOfRun int) *arrayContainer {
  835. valuesInRange := lastOfRun - firstOfRun + 1
  836. this := newArrayContainerCapacity(valuesInRange)
  837. for i := 0; i < valuesInRange; i++ {
  838. this.content = append(this.content, uint16(firstOfRun+i))
  839. }
  840. return this
  841. }
  842. func (ac *arrayContainer) numberOfRuns() (nr int) {
  843. n := len(ac.content)
  844. var runlen uint16
  845. var cur, prev uint16
  846. switch n {
  847. case 0:
  848. return 0
  849. case 1:
  850. return 1
  851. default:
  852. for i := 1; i < n; i++ {
  853. prev = ac.content[i-1]
  854. cur = ac.content[i]
  855. if cur == prev+1 {
  856. runlen++
  857. } else {
  858. if cur < prev {
  859. panic("the fundamental arrayContainer assumption of sorted ac.content was broken")
  860. }
  861. if cur == prev {
  862. panic("the fundamental arrayContainer assumption of deduplicated content was broken")
  863. } else {
  864. nr++
  865. runlen = 0
  866. }
  867. }
  868. }
  869. nr++
  870. }
  871. return
  872. }
  873. // convert to run or array *if needed*
  874. func (ac *arrayContainer) toEfficientContainer() container {
  875. numRuns := ac.numberOfRuns()
  876. sizeAsRunContainer := runContainer16SerializedSizeInBytes(numRuns)
  877. sizeAsBitmapContainer := bitmapContainerSizeInBytes()
  878. card := ac.getCardinality()
  879. sizeAsArrayContainer := arrayContainerSizeInBytes(card)
  880. if sizeAsRunContainer <= minOfInt(sizeAsBitmapContainer, sizeAsArrayContainer) {
  881. return newRunContainer16FromArray(ac)
  882. }
  883. if card <= arrayDefaultMaxSize {
  884. return ac
  885. }
  886. return ac.toBitmapContainer()
  887. }
  888. func (ac *arrayContainer) containerType() contype {
  889. return arrayContype
  890. }
  891. func (ac *arrayContainer) addOffset(x uint16) (container, container) {
  892. var low, high *arrayContainer
  893. if len(ac.content) == 0 {
  894. return nil, nil
  895. }
  896. if y := uint32(ac.content[0]) + uint32(x); highbits(y) == 0 {
  897. // Some elements will fall into low part, allocate a container.
  898. // Checking the first one is enough because they are ordered.
  899. low = &arrayContainer{}
  900. }
  901. if y := uint32(ac.content[len(ac.content)-1]) + uint32(x); highbits(y) > 0 {
  902. // Some elements will fall into high part, allocate a container.
  903. // Checking the last one is enough because they are ordered.
  904. high = &arrayContainer{}
  905. }
  906. for _, val := range ac.content {
  907. y := uint32(val) + uint32(x)
  908. if highbits(y) > 0 {
  909. // OK, if high == nil then highbits(y) == 0 for all y.
  910. high.content = append(high.content, lowbits(y))
  911. } else {
  912. // OK, if low == nil then highbits(y) > 0 for all y.
  913. low.content = append(low.content, lowbits(y))
  914. }
  915. }
  916. // Ensure proper nil interface.
  917. if low == nil {
  918. return nil, high
  919. }
  920. if high == nil {
  921. return low, nil
  922. }
  923. return low, high
  924. }