Skip to content

Commit 0e8b615

Browse files
committed
Update CRoaring to v0.2.65.
1 parent d2801f3 commit 0e8b615

File tree

5 files changed

+131
-112
lines changed

5 files changed

+131
-112
lines changed

roaring.c

Lines changed: 76 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
/* auto-generated on Fri Mar 15 10:33:21 CST 2019. Do not edit! */
1+
/* auto-generated on Wed Sep 11 23:36:34 CST 2019. Do not edit! */
22
#include "roaring.h"
33

44
/* used for http://dmalloc.com/ Dmalloc - Debug Malloc Library */
55
#ifdef DMALLOC
66
#include "dmalloc.h"
77
#endif
88

9-
/* begin file /data/zeromax/CRoaring-0.2.60/src/array_util.c */
9+
/* begin file src/array_util.c */
1010
#include <assert.h>
1111
#include <stdbool.h>
1212
#include <stdint.h>
@@ -515,6 +515,10 @@ int32_t intersect_vector16_cardinality(const uint16_t *__restrict__ A,
515515
return (int32_t)count;
516516
}
517517

518+
/////////
519+
// Warning:
520+
// This function may not be safe if A == C or B == C.
521+
/////////
518522
int32_t difference_vector16(const uint16_t *__restrict__ A, size_t s_a,
519523
const uint16_t *__restrict__ B, size_t s_b,
520524
uint16_t *C) {
@@ -638,7 +642,16 @@ int32_t difference_vector16(const uint16_t *__restrict__ A, size_t s_a,
638642
}
639643
}
640644
if (i_a < s_a) {
641-
memmove(C + count, A + i_a, sizeof(uint16_t) * (s_a - i_a));
645+
if(C == A) {
646+
assert(count <= i_a);
647+
if(count < i_a) {
648+
memmove(C + count, A + i_a, sizeof(uint16_t) * (s_a - i_a));
649+
}
650+
} else {
651+
for(size_t i = 0; i < (s_a - i_a); i++) {
652+
C[count + i] = A[i + i_a];
653+
}
654+
}
642655
count += (int32_t)(s_a - i_a);
643656
}
644657
return count;
@@ -1553,6 +1566,7 @@ static int uint16_compare(const void *a, const void *b) {
15531566
}
15541567

15551568
// a one-pass SSE union algorithm
1569+
// This function may not be safe if array1 == output or array2 == output.
15561570
uint32_t union_vector16(const uint16_t *__restrict__ array1, uint32_t length1,
15571571
const uint16_t *__restrict__ array2, uint32_t length2,
15581572
uint16_t *__restrict__ output) {
@@ -1946,8 +1960,8 @@ bool memequals(const void *s1, const void *s2, size_t n) {
19461960
return memcmp(s1, s2, n) == 0;
19471961
#endif
19481962
}
1949-
/* end file /data/zeromax/CRoaring-0.2.60/src/array_util.c */
1950-
/* begin file /data/zeromax/CRoaring-0.2.60/src/bitset_util.c */
1963+
/* end file src/array_util.c */
1964+
/* begin file src/bitset_util.c */
19511965
#include <assert.h>
19521966
#include <stdint.h>
19531967
#include <stdio.h>
@@ -2874,8 +2888,8 @@ void bitset_flip_list(void *bitset, const uint16_t *list, uint64_t length) {
28742888
list++;
28752889
}
28762890
}
2877-
/* end file /data/zeromax/CRoaring-0.2.60/src/bitset_util.c */
2878-
/* begin file /data/zeromax/CRoaring-0.2.60/src/containers/array.c */
2891+
/* end file src/bitset_util.c */
2892+
/* begin file src/containers/array.c */
28792893
/*
28802894
* array.c
28812895
*
@@ -3063,9 +3077,15 @@ void array_container_andnot(const array_container_t *array_1,
30633077
if (out->capacity < array_1->cardinality)
30643078
array_container_grow(out, array_1->cardinality, false);
30653079
#ifdef ROARING_VECTOR_OPERATIONS_ENABLED
3066-
out->cardinality =
3067-
difference_vector16(array_1->array, array_1->cardinality,
3080+
if((out != array_1) && (out != array_2)) {
3081+
out->cardinality =
3082+
difference_vector16(array_1->array, array_1->cardinality,
30683083
array_2->array, array_2->cardinality, out->array);
3084+
} else {
3085+
out->cardinality =
3086+
difference_uint16(array_1->array, array_1->cardinality, array_2->array,
3087+
array_2->cardinality, out->array);
3088+
}
30693089
#else
30703090
out->cardinality =
30713091
difference_uint16(array_1->array, array_1->cardinality, array_2->array,
@@ -3371,8 +3391,8 @@ bool array_container_iterate64(const array_container_t *cont, uint32_t base,
33713391
return false;
33723392
return true;
33733393
}
3374-
/* end file /data/zeromax/CRoaring-0.2.60/src/containers/array.c */
3375-
/* begin file /data/zeromax/CRoaring-0.2.60/src/containers/bitset.c */
3394+
/* end file src/containers/array.c */
3395+
/* begin file src/containers/bitset.c */
33763396
/*
33773397
* bitset.c
33783398
*
@@ -3392,7 +3412,7 @@ extern inline void bitset_container_set(bitset_container_t *bitset, uint16_t pos
33923412
extern inline void bitset_container_unset(bitset_container_t *bitset, uint16_t pos);
33933413
extern inline bool bitset_container_get(const bitset_container_t *bitset,
33943414
uint16_t pos);
3395-
extern inline int32_t bitset_container_serialized_size_in_bytes();
3415+
extern inline int32_t bitset_container_serialized_size_in_bytes(void);
33963416
extern inline bool bitset_container_add(bitset_container_t *bitset, uint16_t pos);
33973417
extern inline bool bitset_container_remove(bitset_container_t *bitset, uint16_t pos);
33983418
extern inline bool bitset_container_contains(const bitset_container_t *bitset,
@@ -3420,7 +3440,7 @@ bitset_container_t *bitset_container_create(void) {
34203440
return NULL;
34213441
}
34223442
// sizeof(__m256i) == 32
3423-
bitset->array = (uint64_t *)aligned_malloc(
3443+
bitset->array = (uint64_t *)roaring_bitmap_aligned_malloc(
34243444
32, sizeof(uint64_t) * BITSET_CONTAINER_SIZE_IN_WORDS);
34253445
if (!bitset->array) {
34263446
free(bitset);
@@ -3469,7 +3489,7 @@ void bitset_container_add_from_range(bitset_container_t *bitset, uint32_t min,
34693489
/* Free memory. */
34703490
void bitset_container_free(bitset_container_t *bitset) {
34713491
if(bitset->array != NULL) {// Jon Strabala reports that some tools complain otherwise
3472-
aligned_free(bitset->array);
3492+
roaring_bitmap_aligned_free(bitset->array);
34733493
bitset->array = NULL; // pedantic
34743494
}
34753495
free(bitset);
@@ -3484,7 +3504,7 @@ bitset_container_t *bitset_container_clone(const bitset_container_t *src) {
34843504
return NULL;
34853505
}
34863506
// sizeof(__m256i) == 32
3487-
bitset->array = (uint64_t *)aligned_malloc(
3507+
bitset->array = (uint64_t *)roaring_bitmap_aligned_malloc(
34883508
32, sizeof(uint64_t) * BITSET_CONTAINER_SIZE_IN_WORDS);
34893509
if (!bitset->array) {
34903510
free(bitset);
@@ -3918,7 +3938,7 @@ void* bitset_container_deserialize(const char *buf, size_t buf_len) {
39183938
if((ptr = (bitset_container_t *)malloc(sizeof(bitset_container_t))) != NULL) {
39193939
memcpy(ptr, buf, sizeof(bitset_container_t));
39203940
// sizeof(__m256i) == 32
3921-
ptr->array = (uint64_t *) aligned_malloc(32, l);
3941+
ptr->array = (uint64_t *) roaring_bitmap_aligned_malloc(32, l);
39223942
if (! ptr->array) {
39233943
free(ptr);
39243944
return NULL;
@@ -4060,19 +4080,16 @@ uint16_t bitset_container_maximum(const bitset_container_t *container) {
40604080

40614081
/* Returns the number of values equal or smaller than x */
40624082
int bitset_container_rank(const bitset_container_t *container, uint16_t x) {
4063-
uint32_t x32 = x;
4083+
// credit: aqrit
40644084
int sum = 0;
4065-
uint32_t k = 0;
4066-
for (; k + 63 <= x32; k += 64) {
4067-
sum += hamming(container->array[k / 64]);
4085+
int i = 0;
4086+
for (int end = x / 64; i < end; i++){
4087+
sum += hamming(container->array[i]);
40684088
}
4069-
// at this point, we have covered everything up to k, k not included.
4070-
// we have that k < x, but not so large that k+63<=x
4071-
// k is a power of 64
4072-
int bitsleft = x32 - k + 1;// will be in [0,64)
4073-
uint64_t leftoverword = container->array[k / 64];// k / 64 should be within scope
4074-
leftoverword = leftoverword & ((UINT64_C(1) << bitsleft) - 1);
4075-
sum += hamming(leftoverword);
4089+
uint64_t lastword = container->array[i];
4090+
uint64_t lastpos = UINT64_C(1) << (x % 64);
4091+
uint64_t mask = lastpos + lastpos - 1; // smear right
4092+
sum += hamming(lastword & mask);
40764093
return sum;
40774094
}
40784095

@@ -4090,8 +4107,8 @@ int bitset_container_index_equalorlarger(const bitset_container_t *container, ui
40904107
}
40914108
return k * 64 + __builtin_ctzll(word);
40924109
}
4093-
/* end file /data/zeromax/CRoaring-0.2.60/src/containers/bitset.c */
4094-
/* begin file /data/zeromax/CRoaring-0.2.60/src/containers/containers.c */
4110+
/* end file src/containers/bitset.c */
4111+
/* begin file src/containers/containers.c */
40954112

40964113

40974114
extern inline const void *container_unwrap_shared(
@@ -4361,8 +4378,8 @@ extern inline void *container_lazy_ixor(void *c1, uint8_t type1, const void *c2,
43614378

43624379
extern inline void *container_andnot(const void *c1, uint8_t type1, const void *c2,
43634380
uint8_t type2, uint8_t *result_type);
4364-
/* end file /data/zeromax/CRoaring-0.2.60/src/containers/containers.c */
4365-
/* begin file /data/zeromax/CRoaring-0.2.60/src/containers/convert.c */
4381+
/* end file src/containers/containers.c */
4382+
/* begin file src/containers/convert.c */
43664383
#include <stdio.h>
43674384

43684385

@@ -4669,8 +4686,8 @@ bitset_container_t *bitset_container_from_run_range(const run_container_t *run,
46694686
bitset->cardinality = union_cardinality;
46704687
return bitset;
46714688
}
4672-
/* end file /data/zeromax/CRoaring-0.2.60/src/containers/convert.c */
4673-
/* begin file /data/zeromax/CRoaring-0.2.60/src/containers/mixed_andnot.c */
4689+
/* end file src/containers/convert.c */
4690+
/* begin file src/containers/mixed_andnot.c */
46744691
/*
46754692
* mixed_andnot.c. More methods since operation is not symmetric,
46764693
* except no "wide" andnot , so no lazy options motivated.
@@ -5172,8 +5189,8 @@ bool bitset_bitset_container_iandnot(bitset_container_t *src_1,
51725189
return true;
51735190
}
51745191
}
5175-
/* end file /data/zeromax/CRoaring-0.2.60/src/containers/mixed_andnot.c */
5176-
/* begin file /data/zeromax/CRoaring-0.2.60/src/containers/mixed_equal.c */
5192+
/* end file src/containers/mixed_andnot.c */
5193+
/* begin file src/containers/mixed_equal.c */
51775194

51785195
bool array_container_equal_bitset(const array_container_t* container1,
51795196
const bitset_container_t* container2) {
@@ -5250,8 +5267,8 @@ bool run_container_equals_bitset(const run_container_t* container1,
52505267

52515268
return true;
52525269
}
5253-
/* end file /data/zeromax/CRoaring-0.2.60/src/containers/mixed_equal.c */
5254-
/* begin file /data/zeromax/CRoaring-0.2.60/src/containers/mixed_intersection.c */
5270+
/* end file src/containers/mixed_equal.c */
5271+
/* begin file src/containers/mixed_intersection.c */
52555272
/*
52565273
* mixed_intersection.c
52575274
*
@@ -5592,8 +5609,8 @@ bool bitset_bitset_container_intersection_inplace(
55925609
}
55935610
return false; // not a bitset
55945611
}
5595-
/* end file /data/zeromax/CRoaring-0.2.60/src/containers/mixed_intersection.c */
5596-
/* begin file /data/zeromax/CRoaring-0.2.60/src/containers/mixed_negation.c */
5612+
/* end file src/containers/mixed_intersection.c */
5613+
/* begin file src/containers/mixed_negation.c */
55975614
/*
55985615
* mixed_negation.c
55995616
*
@@ -5921,8 +5938,8 @@ int run_container_negation_range_inplace(run_container_t *src,
59215938

59225939
return return_typecode;
59235940
}
5924-
/* end file /data/zeromax/CRoaring-0.2.60/src/containers/mixed_negation.c */
5925-
/* begin file /data/zeromax/CRoaring-0.2.60/src/containers/mixed_subset.c */
5941+
/* end file src/containers/mixed_negation.c */
5942+
/* begin file src/containers/mixed_subset.c */
59265943

59275944
bool array_container_is_subset_bitset(const array_container_t* container1,
59285945
const bitset_container_t* container2) {
@@ -6054,8 +6071,8 @@ bool bitset_container_is_subset_run(const bitset_container_t* container1,
60546071
}
60556072
return true;
60566073
}
6057-
/* end file /data/zeromax/CRoaring-0.2.60/src/containers/mixed_subset.c */
6058-
/* begin file /data/zeromax/CRoaring-0.2.60/src/containers/mixed_union.c */
6074+
/* end file src/containers/mixed_subset.c */
6075+
/* begin file src/containers/mixed_union.c */
60596076
/*
60606077
* mixed_union.c
60616078
*
@@ -6252,7 +6269,7 @@ bool array_array_container_inplace_union(array_container_t *src_1,
62526269
return false; // not a bitset
62536270
} else {
62546271
memmove(src_1->array + src_2->cardinality, src_1->array, src_1->cardinality * sizeof(uint16_t));
6255-
src_1->cardinality = (int32_t)fast_union_uint16(src_1->array + src_2->cardinality, src_1->cardinality,
6272+
src_1->cardinality = (int32_t)union_uint16(src_1->array + src_2->cardinality, src_1->cardinality,
62566273
src_2->array, src_2->cardinality, src_1->array);
62576274
return false; // not a bitset
62586275
}
@@ -6324,7 +6341,7 @@ bool array_array_container_lazy_inplace_union(array_container_t *src_1,
63246341
return false; // not a bitset
63256342
} else {
63266343
memmove(src_1->array + src_2->cardinality, src_1->array, src_1->cardinality * sizeof(uint16_t));
6327-
src_1->cardinality = (int32_t)fast_union_uint16(src_1->array + src_2->cardinality, src_1->cardinality,
6344+
src_1->cardinality = (int32_t)union_uint16(src_1->array + src_2->cardinality, src_1->cardinality,
63286345
src_2->array, src_2->cardinality, src_1->array);
63296346
return false; // not a bitset
63306347
}
@@ -6339,8 +6356,8 @@ bool array_array_container_lazy_inplace_union(array_container_t *src_1,
63396356
}
63406357
return returnval;
63416358
}
6342-
/* end file /data/zeromax/CRoaring-0.2.60/src/containers/mixed_union.c */
6343-
/* begin file /data/zeromax/CRoaring-0.2.60/src/containers/mixed_xor.c */
6359+
/* end file src/containers/mixed_union.c */
6360+
/* begin file src/containers/mixed_xor.c */
63446361
/*
63456362
* mixed_xor.c
63466363
*/
@@ -6681,8 +6698,8 @@ int run_run_container_ixor(run_container_t *src_1, const run_container_t *src_2,
66816698
run_container_free(src_1);
66826699
return ans;
66836700
}
6684-
/* end file /data/zeromax/CRoaring-0.2.60/src/containers/mixed_xor.c */
6685-
/* begin file /data/zeromax/CRoaring-0.2.60/src/containers/run.c */
6701+
/* end file src/containers/mixed_xor.c */
6702+
/* begin file src/containers/run.c */
66866703
#include <stdio.h>
66876704
#include <stdlib.h>
66886705

@@ -7517,8 +7534,8 @@ int run_container_rank(const run_container_t *container, uint16_t x) {
75177534
}
75187535
return sum;
75197536
}
7520-
/* end file /data/zeromax/CRoaring-0.2.60/src/containers/run.c */
7521-
/* begin file /data/zeromax/CRoaring-0.2.60/src/roaring.c */
7537+
/* end file src/containers/run.c */
7538+
/* begin file src/roaring.c */
75227539
#include <assert.h>
75237540
#include <stdarg.h>
75247541
#include <stdint.h>
@@ -8712,8 +8729,8 @@ uint64_t roaring_bitmap_range_cardinality(const roaring_bitmap_t *ra,
87128729
range_end--; // make range_end inclusive
87138730
// now we have: 0 <= range_start <= range_end <= UINT32_MAX
87148731

8715-
int minhb = range_start >> 16;
8716-
int maxhb = range_end >> 16;
8732+
uint16_t minhb = range_start >> 16;
8733+
uint16_t maxhb = range_end >> 16;
87178734

87188735
uint64_t card = 0;
87198736

@@ -10451,14 +10468,15 @@ roaring_bitmap_frozen_view(const char *buf, size_t length) {
1045110468
break;
1045210469
}
1045310470
default:
10471+
free(arena);
1045410472
return NULL;
1045510473
}
1045610474
}
1045710475

1045810476
return rb;
1045910477
}
10460-
/* end file /data/zeromax/CRoaring-0.2.60/src/roaring.c */
10461-
/* begin file /data/zeromax/CRoaring-0.2.60/src/roaring_array.c */
10478+
/* end file src/roaring.c */
10479+
/* begin file src/roaring_array.c */
1046210480
#include <assert.h>
1046310481
#include <stdbool.h>
1046410482
#include <stdio.h>
@@ -11375,8 +11393,8 @@ bool ra_portable_deserialize(roaring_array_t *answer, const char *buf, const siz
1137511393
}
1137611394
return true;
1137711395
}
11378-
/* end file /data/zeromax/CRoaring-0.2.60/src/roaring_array.c */
11379-
/* begin file /data/zeromax/CRoaring-0.2.60/src/roaring_priority_queue.c */
11396+
/* end file src/roaring_array.c */
11397+
/* begin file src/roaring_priority_queue.c */
1138011398

1138111399
struct roaring_pq_element_s {
1138211400
uint64_t size;
@@ -11617,4 +11635,4 @@ roaring_bitmap_t *roaring_bitmap_or_many_heap(uint32_t number,
1161711635
pq_free(pq);
1161811636
return answer;
1161911637
}
11620-
/* end file /data/zeromax/CRoaring-0.2.60/src/roaring_priority_queue.c */
11638+
/* end file src/roaring_priority_queue.c */

0 commit comments

Comments
 (0)