11// !!! DO NOT EDIT - THIS IS AN AUTO-GENERATED FILE !!!
2- // Created by amalgamation.sh on 2024-09-19T23:52:46Z
2+ // Created by amalgamation.sh on 2024-09-30T21:45:33Z
33
44/*
55 * The CRoaring project is under a dual license (Apache/MIT).
@@ -11215,14 +11215,23 @@ bool bitset_inplace_union(bitset_t *CROARING_CBITSET_RESTRICT b1,
1121511215 return true;
1121611216}
1121711217
11218+ bool bitset_empty(const bitset_t *bitset) {
11219+ for (size_t k = 0; k < bitset->arraysize; k++) {
11220+ if (bitset->array[k] != 0) {
11221+ return false;
11222+ }
11223+ }
11224+ return true;
11225+ }
11226+
1121811227size_t bitset_minimum(const bitset_t *bitset) {
1121911228 for (size_t k = 0; k < bitset->arraysize; k++) {
1122011229 uint64_t w = bitset->array[k];
1122111230 if (w != 0) {
1122211231 return roaring_trailing_zeroes(w) + k * 64;
1122311232 }
1122411233 }
11225- return 0 ;
11234+ return SIZE_MAX ;
1122611235}
1122711236
1122811237bool bitset_grow(bitset_t *bitset, size_t newarraysize) {
@@ -19319,6 +19328,7 @@ void roaring_aligned_free(void* p) { global_memory_hook.aligned_free(p); }
1931919328/* begin file src/roaring.c */
1932019329#include <assert.h>
1932119330#include <inttypes.h>
19331+ #include <limits.h>
1932219332#include <stdarg.h>
1932319333#include <stdint.h>
1932419334#include <stdio.h>
@@ -20644,15 +20654,22 @@ uint64_t roaring_bitmap_get_cardinality(const roaring_bitmap_t *r) {
2064420654uint64_t roaring_bitmap_range_cardinality(const roaring_bitmap_t *r,
2064520655 uint64_t range_start,
2064620656 uint64_t range_end) {
20657+ if (range_start >= range_end || range_start > (uint64_t)UINT32_MAX + 1) {
20658+ return 0;
20659+ }
20660+ return roaring_bitmap_range_cardinality_closed(r, (uint32_t)range_start,
20661+ (uint32_t)(range_end - 1));
20662+ }
20663+
20664+ uint64_t roaring_bitmap_range_cardinality_closed(const roaring_bitmap_t *r,
20665+ uint32_t range_start,
20666+ uint32_t range_end) {
2064720667 const roaring_array_t *ra = &r->high_low_container;
2064820668
20649- if (range_end > UINT32_MAX) {
20650- range_end = UINT32_MAX + UINT64_C(1);
20651- }
20652- if (range_start >= range_end) {
20669+ if (range_start > range_end) {
2065320670 return 0;
2065420671 }
20655- range_end--; // make range_end inclusive
20672+
2065620673 // now we have: 0 <= range_start <= range_end <= UINT32_MAX
2065720674
2065820675 uint16_t minhb = (uint16_t)(range_start >> 16);
@@ -21319,20 +21336,27 @@ static void inplace_fully_flip_container(roaring_array_t *x1_arr, uint16_t hb) {
2131921336roaring_bitmap_t *roaring_bitmap_flip(const roaring_bitmap_t *x1,
2132021337 uint64_t range_start,
2132121338 uint64_t range_end) {
21322- if (range_start >= range_end) {
21339+ if (range_start >= range_end || range_start > (uint64_t)UINT32_MAX + 1 ) {
2132321340 return roaring_bitmap_copy(x1);
2132421341 }
21325- if (range_end >= UINT64_C(0x100000000)) {
21326- range_end = UINT64_C(0x100000000);
21342+ return roaring_bitmap_flip_closed(x1, (uint32_t)range_start,
21343+ (uint32_t)(range_end - 1));
21344+ }
21345+
21346+ roaring_bitmap_t *roaring_bitmap_flip_closed(const roaring_bitmap_t *x1,
21347+ uint32_t range_start,
21348+ uint32_t range_end) {
21349+ if (range_start > range_end) {
21350+ return roaring_bitmap_copy(x1);
2132721351 }
2132821352
2132921353 roaring_bitmap_t *ans = roaring_bitmap_create();
2133021354 roaring_bitmap_set_copy_on_write(ans, is_cow(x1));
2133121355
2133221356 uint16_t hb_start = (uint16_t)(range_start >> 16);
2133321357 const uint16_t lb_start = (uint16_t)range_start; // & 0xFFFF;
21334- uint16_t hb_end = (uint16_t)(( range_end - 1) >> 16);
21335- const uint16_t lb_end = (uint16_t)( range_end - 1) ; // & 0xFFFF;
21358+ uint16_t hb_end = (uint16_t)(range_end >> 16);
21359+ const uint16_t lb_end = (uint16_t)range_end; // & 0xFFFF;
2133621360
2133721361 ra_append_copies_until(&ans->high_low_container, &x1->high_low_container,
2133821362 hb_start, is_cow(x1));
@@ -21373,17 +21397,24 @@ roaring_bitmap_t *roaring_bitmap_flip(const roaring_bitmap_t *x1,
2137321397
2137421398void roaring_bitmap_flip_inplace(roaring_bitmap_t *x1, uint64_t range_start,
2137521399 uint64_t range_end) {
21376- if (range_start >= range_end) {
21377- return; // empty range
21400+ if (range_start >= range_end || range_start > (uint64_t)UINT32_MAX + 1 ) {
21401+ return;
2137821402 }
21379- if (range_end >= UINT64_C(0x100000000)) {
21380- range_end = UINT64_C(0x100000000);
21403+ roaring_bitmap_flip_inplace_closed(x1, (uint32_t)range_start,
21404+ (uint32_t)(range_end - 1));
21405+ }
21406+
21407+ void roaring_bitmap_flip_inplace_closed(roaring_bitmap_t *x1,
21408+ uint32_t range_start,
21409+ uint32_t range_end) {
21410+ if (range_start > range_end) {
21411+ return; // empty range
2138121412 }
2138221413
2138321414 uint16_t hb_start = (uint16_t)(range_start >> 16);
2138421415 const uint16_t lb_start = (uint16_t)range_start;
21385- uint16_t hb_end = (uint16_t)(( range_end - 1) >> 16);
21386- const uint16_t lb_end = (uint16_t)( range_end - 1) ;
21416+ uint16_t hb_end = (uint16_t)(range_end >> 16);
21417+ const uint16_t lb_end = (uint16_t)range_end;
2138721418
2138821419 if (hb_start == hb_end) {
2138921420 inplace_flip_container(&x1->high_low_container, hb_start, lb_start,
@@ -22141,15 +22172,28 @@ bool roaring_bitmap_contains(const roaring_bitmap_t *r, uint32_t val) {
2214122172 */
2214222173bool roaring_bitmap_contains_range(const roaring_bitmap_t *r,
2214322174 uint64_t range_start, uint64_t range_end) {
22144- if (range_end >= UINT64_C(0x100000000) ) {
22145- range_end = UINT64_C(0x100000000) ;
22175+ if (range_start >= range_end || range_start > (uint64_t)UINT32_MAX + 1 ) {
22176+ return true ;
2214622177 }
22147- if (range_start >= range_end)
22148- return true; // empty range are always contained!
22149- if (range_end - range_start == 1)
22178+ return roaring_bitmap_contains_range_closed(r, (uint32_t)range_start,
22179+ (uint32_t)(range_end - 1));
22180+ }
22181+
22182+ /**
22183+ * Check whether a range of values from range_start (included) to range_end
22184+ * (included) is present
22185+ */
22186+ bool roaring_bitmap_contains_range_closed(const roaring_bitmap_t *r,
22187+ uint32_t range_start,
22188+ uint32_t range_end) {
22189+ if (range_start > range_end) {
22190+ return true;
22191+ } // empty range are always contained!
22192+ if (range_end == range_start) {
2215022193 return roaring_bitmap_contains(r, (uint32_t)range_start);
22194+ }
2215122195 uint16_t hb_rs = (uint16_t)(range_start >> 16);
22152- uint16_t hb_re = (uint16_t)(( range_end - 1) >> 16);
22196+ uint16_t hb_re = (uint16_t)(range_end >> 16);
2215322197 const int32_t span = hb_re - hb_rs;
2215422198 const int32_t hlc_sz = ra_get_size(&r->high_low_container);
2215522199 if (hlc_sz < span + 1) {
@@ -22161,7 +22205,7 @@ bool roaring_bitmap_contains_range(const roaring_bitmap_t *r,
2216122205 return false;
2216222206 }
2216322207 const uint32_t lb_rs = range_start & 0xFFFF;
22164- const uint32_t lb_re = (( range_end - 1) & 0xFFFF) + 1;
22208+ const uint32_t lb_re = (range_end & 0xFFFF) + 1;
2216522209 uint8_t type;
2216622210 container_t *c =
2216722211 ra_get_container_at_index(&r->high_low_container, (uint16_t)is, &type);
@@ -24646,6 +24690,8 @@ roaring64_bitmap_t *roaring64_bitmap_portable_deserialize_safe(
2464624690 roaring64_bitmap_free(r);
2464724691 return NULL;
2464824692 }
24693+ previous_high32 = high32;
24694+
2464924695 // Read the 32-bit Roaring bitmaps representing the least significant
2465024696 // bits of a set of elements.
2465124697 size_t bitmap32_size = roaring_bitmap_portable_deserialize_size(
@@ -25510,7 +25556,7 @@ size_t ra_portable_deserialize_size(const char *buf, const size_t maxbytes) {
2551025556 memcpy(&size, buf, sizeof(int32_t));
2551125557 buf += sizeof(uint32_t);
2551225558 }
25513- if (size > (1 << 16)) {
25559+ if (size > (1 << 16) || size < 0 ) {
2551425560 return 0;
2551525561 }
2551625562 char *bitmapOfRunContainers = NULL;
0 commit comments