Skip to content

Commit 96a971e

Browse files
committed
Updating CRoaring.
1 parent e799f2a commit 96a971e

File tree

2 files changed

+74
-25
lines changed

2 files changed

+74
-25
lines changed

roaring.c

Lines changed: 63 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
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
240240
static 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+
456466
static 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
89588978
CROARING_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
1124411264
CROARING_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

1756317606
uint64_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

1889418937
static 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

1892318964
static 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];

roaring.h

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
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
@@ -23,11 +23,11 @@
2323
// /include/roaring/roaring_version.h automatically generated by release.py, do not change by hand
2424
#ifndef ROARING_INCLUDE_ROARING_VERSION
2525
#define ROARING_INCLUDE_ROARING_VERSION
26-
#define ROARING_VERSION = 0.3.1,
26+
#define ROARING_VERSION = 0.3.2,
2727
enum {
2828
ROARING_VERSION_MAJOR = 0,
2929
ROARING_VERSION_MINOR = 3,
30-
ROARING_VERSION_REVISION = 1
30+
ROARING_VERSION_REVISION = 2
3131
};
3232
#endif // ROARING_INCLUDE_ROARING_VERSION
3333
/* end file include/roaring/roaring_version.h */
@@ -279,6 +279,12 @@ uint64_t roaring_bitmap_and_cardinality(const roaring_bitmap_t *r1,
279279
bool roaring_bitmap_intersect(const roaring_bitmap_t *r1,
280280
const roaring_bitmap_t *r2);
281281

282+
/**
283+
* Check whether a bitmap and a closed range intersect.
284+
*/
285+
bool roaring_bitmap_intersect_with_range(const roaring_bitmap_t *bm,
286+
uint64_t x, uint64_t y);
287+
282288
/**
283289
* Computes the Jaccard index between two bitmaps. (Also known as the Tanimoto
284290
* distance, or the Jaccard similarity coefficient)
@@ -672,6 +678,8 @@ const roaring_bitmap_t *roaring_bitmap_frozen_view(const char *buf,
672678
*
673679
* Returns true if the roaring_iterator returned true throughout (so that all
674680
* data points were necessarily visited).
681+
*
682+
* Iteration is ordered: from the smallest to the largest elements.
675683
*/
676684
bool roaring_iterate(const roaring_bitmap_t *r, roaring_iterator iterator,
677685
void *ptr);

0 commit comments

Comments
 (0)