setutil_generic.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. //go:build !arm64 || gccgo || appengine
  2. // +build !arm64 gccgo appengine
  3. package roaring
  4. func union2by2(set1 []uint16, set2 []uint16, buffer []uint16) int {
  5. pos := 0
  6. k1 := 0
  7. k2 := 0
  8. if 0 == len(set2) {
  9. buffer = buffer[:len(set1)]
  10. copy(buffer, set1[:])
  11. return len(set1)
  12. }
  13. if 0 == len(set1) {
  14. buffer = buffer[:len(set2)]
  15. copy(buffer, set2[:])
  16. return len(set2)
  17. }
  18. s1 := set1[k1]
  19. s2 := set2[k2]
  20. buffer = buffer[:cap(buffer)]
  21. for {
  22. if s1 < s2 {
  23. buffer[pos] = s1
  24. pos++
  25. k1++
  26. if k1 >= len(set1) {
  27. copy(buffer[pos:], set2[k2:])
  28. pos += len(set2) - k2
  29. break
  30. }
  31. s1 = set1[k1]
  32. } else if s1 == s2 {
  33. buffer[pos] = s1
  34. pos++
  35. k1++
  36. k2++
  37. if k1 >= len(set1) {
  38. copy(buffer[pos:], set2[k2:])
  39. pos += len(set2) - k2
  40. break
  41. }
  42. if k2 >= len(set2) {
  43. copy(buffer[pos:], set1[k1:])
  44. pos += len(set1) - k1
  45. break
  46. }
  47. s1 = set1[k1]
  48. s2 = set2[k2]
  49. } else { // if (set1[k1]>set2[k2])
  50. buffer[pos] = s2
  51. pos++
  52. k2++
  53. if k2 >= len(set2) {
  54. copy(buffer[pos:], set1[k1:])
  55. pos += len(set1) - k1
  56. break
  57. }
  58. s2 = set2[k2]
  59. }
  60. }
  61. return pos
  62. }