11// !!! DO NOT EDIT - THIS IS AN AUTO-GENERATED FILE !!!
2- // Created by amalgamation.sh on Thu 15 Apr 2021 11:00:31 EDT
2+ // Created by amalgamation.sh on Mon 5 Jul 2021 13:06:13 EDT
33
44/*
55 * Copyright 2016-2020 The CRoaring authors
@@ -238,7 +238,7 @@ static inline bool croaring_avx2() {
238238}
239239#else
240240static inline bool croaring_avx2() {
241- return (dynamic_croaring_detect_supported_architectures () & CROARING_AVX2) == CROARING_AVX2;
241+ return (croaring_detect_supported_architectures () & CROARING_AVX2) == CROARING_AVX2;
242242}
243243#endif
244244
@@ -453,11 +453,31 @@ static inline void roaring_bitmap_aligned_free(void *memblock) {
453453
454454#define IS_BIG_ENDIAN (*(uint16_t *)"\0\xff" < 0x100)
455455
456+ static inline int hammingbackup(uint64_t x) {
457+ uint64_t c1 = UINT64_C(0x5555555555555555);
458+ uint64_t c2 = UINT64_C(0x3333333333333333);
459+ uint64_t c4 = UINT64_C(0x0F0F0F0F0F0F0F0F);
460+ x -= (x >> 1) & c1;
461+ x = (( x >> 2) & c2) + (x & c2); x=(x +(x>>4))&c4;
462+ x *= UINT64_C(0x0101010101010101);
463+ return x >> 56;
464+ }
465+
456466static inline int hamming(uint64_t x) {
457467#if defined(_WIN64) && defined(_MSC_VER) && !defined(__clang__)
468+ #ifdef _M_ARM64
469+ return hammingbackup(x);
470+ // (int) _CountOneBits64(x); is unavailable
471+ #else // _M_ARM64
458472 return (int) __popcnt64(x);
473+ #endif // _M_ARM64
459474#elif defined(_WIN32) && defined(_MSC_VER) && !defined(__clang__)
475+ #ifdef _M_ARM
476+ return hammingbackup(x);
477+ // _CountOneBits is unavailable
478+ #else // _M_ARM
460479 return (int) __popcnt(( unsigned int)x) + (int) __popcnt(( unsigned int)(x>>32));
480+ #endif // _M_ARM
461481#else
462482 return __builtin_popcountll(x);
463483#endif
@@ -8956,7 +8976,7 @@ size_t fast_union_uint16(const uint16_t *set_1, size_t size_1, const uint16_t *s
89568976}
89578977#ifdef CROARING_IS_X64
89588978CROARING_TARGET_AVX2
8959- bool _avx2_memequals(const void *s1, const void *s2, size_t n) {
8979+ static inline bool _avx2_memequals(const void *s1, const void *s2, size_t n) {
89608980 const uint8_t *ptr1 = (const uint8_t *)s1;
89618981 const uint8_t *ptr2 = (const uint8_t *)s2;
89628982 const uint8_t *end1 = ptr1 + n;
@@ -9757,7 +9777,7 @@ size_t bitset_extract_setbits_uint16(const uint64_t *words, size_t length,
97579777
97589778#if defined(CROARING_ASMBITMANIPOPTIMIZATION) && defined(CROARING_IS_X64)
97599779
9760- uint64_t _asm_bitset_set_list_withcard(uint64_t *words, uint64_t card,
9780+ static inline uint64_t _asm_bitset_set_list_withcard(uint64_t *words, uint64_t card,
97619781 const uint16_t *list, uint64_t length) {
97629782 uint64_t offset, load, pos;
97639783 uint64_t shift = 6;
@@ -9782,7 +9802,7 @@ uint64_t _asm_bitset_set_list_withcard(uint64_t *words, uint64_t card,
97829802 return card;
97839803}
97849804
9785- void _asm_bitset_set_list(uint64_t *words, const uint16_t *list, uint64_t length) {
9805+ static inline void _asm_bitset_set_list(uint64_t *words, const uint16_t *list, uint64_t length) {
97869806 uint64_t pos;
97879807 const uint16_t *end = list + length;
97889808
@@ -9837,7 +9857,7 @@ void _asm_bitset_set_list(uint64_t *words, const uint16_t *list, uint64_t length
98379857 }
98389858}
98399859
9840- uint64_t _asm_bitset_clear_list(uint64_t *words, uint64_t card, const uint16_t *list,
9860+ static inline uint64_t _asm_bitset_clear_list(uint64_t *words, uint64_t card, const uint16_t *list,
98419861 uint64_t length) {
98429862 uint64_t offset, load, pos;
98439863 uint64_t shift = 6;
@@ -9863,7 +9883,7 @@ uint64_t _asm_bitset_clear_list(uint64_t *words, uint64_t card, const uint16_t *
98639883 return card;
98649884}
98659885
9866- uint64_t _scalar_bitset_clear_list(uint64_t *words, uint64_t card, const uint16_t *list,
9886+ static inline uint64_t _scalar_bitset_clear_list(uint64_t *words, uint64_t card, const uint16_t *list,
98679887 uint64_t length) {
98689888 uint64_t offset, load, newload, pos, index;
98699889 const uint16_t *end = list + length;
@@ -9880,7 +9900,7 @@ uint64_t _scalar_bitset_clear_list(uint64_t *words, uint64_t card, const uint16_
98809900 return card;
98819901}
98829902
9883- uint64_t _scalar_bitset_set_list_withcard(uint64_t *words, uint64_t card,
9903+ static inline uint64_t _scalar_bitset_set_list_withcard(uint64_t *words, uint64_t card,
98849904 const uint16_t *list, uint64_t length) {
98859905 uint64_t offset, load, newload, pos, index;
98869906 const uint16_t *end = list + length;
@@ -9897,7 +9917,7 @@ uint64_t _scalar_bitset_set_list_withcard(uint64_t *words, uint64_t card,
98979917 return card;
98989918}
98999919
9900- void _scalar_bitset_set_list(uint64_t *words, const uint16_t *list, uint64_t length) {
9920+ static inline void _scalar_bitset_set_list(uint64_t *words, const uint16_t *list, uint64_t length) {
99019921 uint64_t offset, load, newload, pos, index;
99029922 const uint16_t *end = list + length;
99039923 while (list != end) {
@@ -10645,7 +10665,7 @@ bool bitset_container_intersect(const bitset_container_t *src_1,
1064510665#define WORDS_IN_AVX2_REG sizeof(__m256i) / sizeof(uint64_t)
1064610666#endif
1064710667/* Get the number of bits set (force computation) */
10648- int _scalar_bitset_container_compute_cardinality(const bitset_container_t *bitset) {
10668+ static inline int _scalar_bitset_container_compute_cardinality(const bitset_container_t *bitset) {
1064910669 const uint64_t *words = bitset->words;
1065010670 int32_t sum = 0;
1065110671 for (int i = 0; i < BITSET_CONTAINER_SIZE_IN_WORDS; i += 4) {
@@ -10724,7 +10744,7 @@ int bitset_container_compute_cardinality(const bitset_container_t *bitset) {
1072410744// clang-format off
1072510745#define AVX_BITSET_CONTAINER_FN1(before, opname, opsymbol, avx_intrinsic, \
1072610746 neon_intrinsic, after) \
10727- int _avx2_bitset_container_##opname##_nocard( \
10747+ static inline int _avx2_bitset_container_##opname##_nocard( \
1072810748 const bitset_container_t *src_1, const bitset_container_t *src_2, \
1072910749 bitset_container_t *dst) { \
1073010750 const uint8_t *__restrict__ words_1 = (const uint8_t *)src_1->words; \
@@ -10779,7 +10799,7 @@ int bitset_container_compute_cardinality(const bitset_container_t *bitset) {
1077910799#define AVX_BITSET_CONTAINER_FN2(before, opname, opsymbol, avx_intrinsic, \
1078010800 neon_intrinsic, after) \
1078110801 /* next, a version that updates cardinality*/ \
10782- int _avx2_bitset_container_##opname(const bitset_container_t *src_1, \
10802+ static inline int _avx2_bitset_container_##opname(const bitset_container_t *src_1, \
1078310803 const bitset_container_t *src_2, \
1078410804 bitset_container_t *dst) { \
1078510805 const __m256i *__restrict__ words_1 = (const __m256i *)src_1->words; \
@@ -10794,7 +10814,7 @@ int bitset_container_compute_cardinality(const bitset_container_t *bitset) {
1079410814#define AVX_BITSET_CONTAINER_FN3(before, opname, opsymbol, avx_intrinsic, \
1079510815 neon_intrinsic, after) \
1079610816 /* next, a version that just computes the cardinality*/ \
10797- int _avx2_bitset_container_##opname##_justcard( \
10817+ static inline int _avx2_bitset_container_##opname##_justcard( \
1079810818 const bitset_container_t *src_1, const bitset_container_t *src_2) { \
1079910819 const __m256i *__restrict__ data1 = (const __m256i *)src_1->words; \
1080010820 const __m256i *__restrict__ data2 = (const __m256i *)src_2->words; \
@@ -10875,7 +10895,7 @@ CROARING_UNTARGET_REGION
1087510895
1087610896#define SCALAR_BITSET_CONTAINER_FN(opname, opsymbol, avx_intrinsic, \
1087710897 neon_intrinsic) \
10878- int _scalar_bitset_container_##opname(const bitset_container_t *src_1, \
10898+ static inline int _scalar_bitset_container_##opname(const bitset_container_t *src_1, \
1087910899 const bitset_container_t *src_2, \
1088010900 bitset_container_t *dst) { \
1088110901 const uint64_t *__restrict__ words_1 = src_1->words; \
@@ -10893,7 +10913,7 @@ CROARING_UNTARGET_REGION
1089310913 dst->cardinality = sum; \
1089410914 return dst->cardinality; \
1089510915 } \
10896- int _scalar_bitset_container_##opname##_nocard( \
10916+ static inline int _scalar_bitset_container_##opname##_nocard( \
1089710917 const bitset_container_t *src_1, const bitset_container_t *src_2, \
1089810918 bitset_container_t *dst) { \
1089910919 const uint64_t *__restrict__ words_1 = src_1->words; \
@@ -10905,7 +10925,7 @@ CROARING_UNTARGET_REGION
1090510925 dst->cardinality = BITSET_UNKNOWN_CARDINALITY; \
1090610926 return dst->cardinality; \
1090710927 } \
10908- int _scalar_bitset_container_##opname##_justcard( \
10928+ static inline int _scalar_bitset_container_##opname##_justcard( \
1090910929 const bitset_container_t *src_1, const bitset_container_t *src_2) { \
1091010930 const uint64_t *__restrict__ words_1 = src_1->words; \
1091110931 const uint64_t *__restrict__ words_2 = src_2->words; \
@@ -11242,7 +11262,7 @@ bool bitset_container_iterate64(const bitset_container_t *cont, uint32_t base, r
1124211262
1124311263#ifdef CROARING_IS_X64
1124411264CROARING_TARGET_AVX2
11245- bool _avx2_bitset_container_equals(const bitset_container_t *container1, const bitset_container_t *container2) {
11265+ static inline bool _avx2_bitset_container_equals(const bitset_container_t *container1, const bitset_container_t *container2) {
1124611266 const __m256i *ptr1 = (const __m256i*)container1->words;
1124711267 const __m256i *ptr2 = (const __m256i*)container2->words;
1124811268 for (size_t i = 0; i < BITSET_CONTAINER_SIZE_IN_WORDS*sizeof(uint64_t)/32; i++) {
@@ -12969,6 +12989,10 @@ void array_container_negation(const array_container_t *src,
1296912989 uint64_t card = UINT64_C(1 << 16);
1297012990 bitset_container_set_all(dst);
1297112991
12992+ if (src->cardinality == 0) {
12993+ return;
12994+ }
12995+
1297212996 dst->cardinality = (int32_t)bitset_clear_list(dst->words, card, src->array,
1297312997 (uint64_t)src->cardinality);
1297412998}
@@ -17559,6 +17583,25 @@ bool roaring_bitmap_intersect(const roaring_bitmap_t *x1,
1755917583 return answer != 0;
1756017584}
1756117585
17586+ bool roaring_bitmap_intersect_with_range(const roaring_bitmap_t *bm,
17587+ uint64_t x, uint64_t y) {
17588+ if (x >= y) {
17589+ // Empty range.
17590+ return false;
17591+ }
17592+ roaring_uint32_iterator_t it;
17593+ roaring_init_iterator(bm, &it);
17594+ if (!roaring_move_uint32_iterator_equalorlarger(&it, x)) {
17595+ // No values above x.
17596+ return false;
17597+ }
17598+ if (it.current_value >= y) {
17599+ // No values below y.
17600+ return false;
17601+ }
17602+ return true;
17603+ }
17604+
1756217605
1756317606uint64_t roaring_bitmap_and_cardinality(const roaring_bitmap_t *x1,
1756417607 const roaring_bitmap_t *x2) {
@@ -18892,8 +18935,6 @@ static void pq_add(roaring_pq_t *pq, roaring_pq_element_t *t) {
1889218935}
1889318936
1889418937static void pq_free(roaring_pq_t *pq) {
18895- free(pq->elements);
18896- pq->elements = NULL; // paranoid
1889718938 free(pq);
1889818939}
1889918940
@@ -18921,9 +18962,9 @@ static void percolate_down(roaring_pq_t *pq, uint32_t i) {
1892118962}
1892218963
1892318964static roaring_pq_t *create_pq(const roaring_bitmap_t **arr, uint32_t length) {
18924- roaring_pq_t *answer = (roaring_pq_t *)malloc( sizeof(roaring_pq_t)) ;
18925- answer->elements =
18926- (roaring_pq_element_t *)malloc(sizeof(roaring_pq_element_t) * length );
18965+ size_t alloc_size = sizeof (roaring_pq_t) + sizeof(roaring_pq_element_t) * length ;
18966+ roaring_pq_t * answer = (roaring_pq_t *)malloc(alloc_size);
18967+ answer->elements = (roaring_pq_element_t *)(answer + 1 );
1892718968 answer->size = length;
1892818969 for (uint32_t i = 0; i < length; i++) {
1892918970 answer->elements[i].bitmap = (roaring_bitmap_t *)arr[i];
0 commit comments