1
1
// !!! DO NOT EDIT - THIS IS AN AUTO-GENERATED FILE !!!
2
- // Created by amalgamation.sh on 2024-05-13T21:29:25Z
2
+ // Created by amalgamation.sh on 2024-07-03T21:30:32Z
3
3
4
4
/*
5
5
* The CRoaring project is under a dual license (Apache/MIT).
@@ -10770,7 +10770,7 @@ static bool art_node_iterator_lower_bound(const art_node_t *node,
10770
10770
}
10771
10771
10772
10772
art_iterator_t art_init_iterator(const art_t *art, bool first) {
10773
- art_iterator_t iterator = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} ;
10773
+ art_iterator_t iterator = CROARING_ZERO_INITIALIZER ;
10774
10774
if (art->root == NULL) {
10775
10775
return iterator;
10776
10776
}
@@ -10793,8 +10793,11 @@ bool art_iterator_lower_bound(art_iterator_t *iterator,
10793
10793
// a valid key. Start from the root.
10794
10794
iterator->frame = 0;
10795
10795
iterator->depth = 0;
10796
- return art_node_iterator_lower_bound(art_iterator_node(iterator),
10797
- iterator, key);
10796
+ art_node_t *root = art_iterator_node(iterator);
10797
+ if (root == NULL) {
10798
+ return false;
10799
+ }
10800
+ return art_node_iterator_lower_bound(root, iterator, key);
10798
10801
}
10799
10802
int compare_result =
10800
10803
art_compare_prefix(iterator->key, 0, key, 0, ART_KEY_BYTES);
@@ -10827,15 +10830,15 @@ bool art_iterator_lower_bound(art_iterator_t *iterator,
10827
10830
}
10828
10831
10829
10832
art_iterator_t art_lower_bound(const art_t *art, const art_key_chunk_t *key) {
10830
- art_iterator_t iterator = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} ;
10833
+ art_iterator_t iterator = CROARING_ZERO_INITIALIZER ;
10831
10834
if (art->root != NULL) {
10832
10835
art_node_iterator_lower_bound(art->root, &iterator, key);
10833
10836
}
10834
10837
return iterator;
10835
10838
}
10836
10839
10837
10840
art_iterator_t art_upper_bound(const art_t *art, const art_key_chunk_t *key) {
10838
- art_iterator_t iterator = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} ;
10841
+ art_iterator_t iterator = CROARING_ZERO_INITIALIZER ;
10839
10842
if (art->root != NULL) {
10840
10843
if (art_node_iterator_lower_bound(art->root, &iterator, key) &&
10841
10844
art_compare_keys(iterator.key, key) == 0) {
@@ -19469,7 +19472,7 @@ roaring_bitmap_t *roaring_bitmap_of(size_t n_args, ...) {
19469
19472
// todo: could be greatly optimized but we do not expect this call to ever
19470
19473
// include long lists
19471
19474
roaring_bitmap_t *answer = roaring_bitmap_create();
19472
- roaring_bulk_context_t context = {0, 0, 0, 0} ;
19475
+ roaring_bulk_context_t context = CROARING_ZERO_INITIALIZER ;
19473
19476
va_list ap;
19474
19477
va_start(ap, n_args);
19475
19478
for (size_t i = 0; i < n_args; i++) {
@@ -20811,7 +20814,7 @@ roaring_bitmap_t *roaring_bitmap_deserialize(const void *buf) {
20811
20814
if (bitmap == NULL) {
20812
20815
return NULL;
20813
20816
}
20814
- roaring_bulk_context_t context = {0, 0, 0, 0} ;
20817
+ roaring_bulk_context_t context = CROARING_ZERO_INITIALIZER ;
20815
20818
for (uint32_t i = 0; i < card; i++) {
20816
20819
// elems may not be aligned, read with memcpy
20817
20820
uint32_t elem;
@@ -20854,7 +20857,7 @@ roaring_bitmap_t *roaring_bitmap_deserialize_safe(const void *buf,
20854
20857
if (bitmap == NULL) {
20855
20858
return NULL;
20856
20859
}
20857
- roaring_bulk_context_t context = {0, 0, 0, 0} ;
20860
+ roaring_bulk_context_t context = CROARING_ZERO_INITIALIZER ;
20858
20861
for (uint32_t i = 0; i < card; i++) {
20859
20862
// elems may not be aligned, read with memcpy
20860
20863
uint32_t elem;
@@ -22780,6 +22783,9 @@ roaring64_bitmap_t *roaring64_bitmap_create(void) {
22780
22783
}
22781
22784
22782
22785
void roaring64_bitmap_free(roaring64_bitmap_t *r) {
22786
+ if (!r) {
22787
+ return;
22788
+ }
22783
22789
art_iterator_t it = art_init_iterator(&r->art, /*first=*/true);
22784
22790
while (it.value != NULL) {
22785
22791
leaf_t *leaf = (leaf_t *)it.value;
@@ -22856,7 +22862,7 @@ roaring64_bitmap_t *roaring64_bitmap_of_ptr(size_t n_args,
22856
22862
22857
22863
roaring64_bitmap_t *roaring64_bitmap_of(size_t n_args, ...) {
22858
22864
roaring64_bitmap_t *r = roaring64_bitmap_create();
22859
- roaring64_bulk_context_t context = {0, 0, 0, 0, 0, 0, 0} ;
22865
+ roaring64_bulk_context_t context = CROARING_ZERO_INITIALIZER ;
22860
22866
va_list ap;
22861
22867
va_start(ap, n_args);
22862
22868
for (size_t i = 0; i < n_args; i++) {
@@ -22949,7 +22955,7 @@ void roaring64_bitmap_add_many(roaring64_bitmap_t *r, size_t n_args,
22949
22955
return;
22950
22956
}
22951
22957
const uint64_t *end = vals + n_args;
22952
- roaring64_bulk_context_t context = {0, 0, 0, 0, 0, 0, 0} ;
22958
+ roaring64_bulk_context_t context = CROARING_ZERO_INITIALIZER ;
22953
22959
for (const uint64_t *current_val = vals; current_val != end;
22954
22960
current_val++) {
22955
22961
roaring64_bitmap_add_bulk(r, &context, *current_val);
@@ -23273,7 +23279,7 @@ void roaring64_bitmap_remove_many(roaring64_bitmap_t *r, size_t n_args,
23273
23279
return;
23274
23280
}
23275
23281
const uint64_t *end = vals + n_args;
23276
- roaring64_bulk_context_t context = {0, 0, 0, 0, 0, 0, 0} ;
23282
+ roaring64_bulk_context_t context = CROARING_ZERO_INITIALIZER ;
23277
23283
for (const uint64_t *current_val = vals; current_val != end;
23278
23284
current_val++) {
23279
23285
roaring64_bitmap_remove_bulk(r, &context, *current_val);
@@ -23339,6 +23345,10 @@ void roaring64_bitmap_remove_range_closed(roaring64_bitmap_t *r, uint64_t min,
23339
23345
remove_range_closed_at(art, max_high48, 0, max_low16);
23340
23346
}
23341
23347
23348
+ void roaring64_bitmap_clear(roaring64_bitmap_t *r) {
23349
+ roaring64_bitmap_remove_range_closed(r, 0, UINT64_MAX);
23350
+ }
23351
+
23342
23352
uint64_t roaring64_bitmap_get_cardinality(const roaring64_bitmap_t *r) {
23343
23353
art_iterator_t it = art_init_iterator(&r->art, /*first=*/true);
23344
23354
uint64_t cardinality = 0;
@@ -23356,7 +23366,17 @@ uint64_t roaring64_bitmap_range_cardinality(const roaring64_bitmap_t *r,
23356
23366
if (min >= max) {
23357
23367
return 0;
23358
23368
}
23359
- max--; // A closed range is easier to work with.
23369
+ // Convert to a closed range
23370
+ // No underflow here: passing the above condition implies min < max, so
23371
+ // there is a number less than max
23372
+ return roaring64_bitmap_range_closed_cardinality(r, min, max - 1);
23373
+ }
23374
+
23375
+ uint64_t roaring64_bitmap_range_closed_cardinality(const roaring64_bitmap_t *r,
23376
+ uint64_t min, uint64_t max) {
23377
+ if (min > max) {
23378
+ return 0;
23379
+ }
23360
23380
23361
23381
uint64_t cardinality = 0;
23362
23382
uint8_t min_high48[ART_KEY_BYTES];
0 commit comments