CRoaring 4.5.0
Roaring bitmaps in C (and C++)
Loading...
Searching...
No Matches
roaring.h
Go to the documentation of this file.
1/*
2 * An implementation of Roaring Bitmaps in C.
3 */
4
5#ifndef ROARING_H
6#define ROARING_H
7
8#include <stdbool.h>
9#include <stddef.h> // for `size_t`
10#include <stdint.h>
11
12#include <roaring/roaring_types.h>
13
14// Include other headers after roaring_types.h
15#include <roaring/bitset/bitset.h>
16#include <roaring/containers/containers.h>
17#include <roaring/memory.h>
18#include <roaring/portability.h>
19#include <roaring/roaring_array.h>
20#include <roaring/roaring_version.h>
21
22#ifdef __cplusplus
23extern "C" {
24namespace roaring {
25namespace api {
26#endif
27
31
39
48
55
64
70roaring_bitmap_t *roaring_bitmap_from_range(uint64_t min, uint64_t max,
71 uint32_t step);
72
77roaring_bitmap_t *roaring_bitmap_of_ptr(size_t n_args, const uint32_t *vals);
78
83
90
91/*
92 * Whether you want to use copy-on-write.
93 * Saves memory and avoids copies, but needs more care in a threaded context.
94 * Most users should ignore this flag.
95 *
96 * Note: If you do turn this flag to 'true', enabling COW, then ensure that you
97 * do so for all of your bitmaps, since interactions between bitmaps with and
98 * without COW is unsafe.
99 *
100 * When setting this flag to false, if any containers are shared, they
101 * are unshared (cloned) immediately.
102 */
104 return r->high_low_container.flags & ROARING_FLAG_COW;
105}
107 if (cow) {
108 r->high_low_container.flags |= ROARING_FLAG_COW;
109 } else {
112 }
113 r->high_low_container.flags &= ~ROARING_FLAG_COW;
114 }
115}
116
123 int64_t offset);
128
137CROARING_DEPRECATED roaring_bitmap_t *roaring_bitmap_of(size_t n, ...);
138
139#ifdef __cplusplus
146// Use an immediately invoked closure, capturing by reference
147// (in case __VA_ARGS__ refers to context outside the closure)
148// Include a 0 at the beginning of the array to make the array length > 0
149// (zero sized arrays are not valid in standard c/c++)
150#define roaring_bitmap_from(...) \
151 [&]() { \
152 const uint32_t roaring_bitmap_from_array[] = {0, __VA_ARGS__}; \
153 return roaring_bitmap_of_ptr((sizeof(roaring_bitmap_from_array) / \
154 sizeof(roaring_bitmap_from_array[0])) - \
155 1, \
156 &roaring_bitmap_from_array[1]); \
157 }()
158#else
165// While __VA_ARGS__ occurs twice in expansion, one of the times is in a sizeof
166// expression, which is an unevaluated context, so it's even safe in the case
167// where expressions passed have side effects (roaring64_bitmap_from(my_func(),
168// ++i))
169// Include a 0 at the beginning of the array to make the array length > 0
170// (zero sized arrays are not valid in standard c/c++)
171#define roaring_bitmap_from(...) \
172 roaring_bitmap_of_ptr( \
173 (sizeof((const uint32_t[]){0, __VA_ARGS__}) / sizeof(uint32_t)) - 1, \
174 &((const uint32_t[]){0, __VA_ARGS__})[1])
175#endif
176
183
197 const roaring_bitmap_t *src);
198
203
215 const roaring_bitmap_t *r2);
216
221 const roaring_bitmap_t *r2);
222
227 const roaring_bitmap_t *r2);
228
233 uint64_t y);
234
242 const roaring_bitmap_t *r2);
243
248 const roaring_bitmap_t *r2);
249
254 const roaring_bitmap_t *r2);
255
260 const roaring_bitmap_t *r2);
261
270 const roaring_bitmap_t *r2);
271
278 const roaring_bitmap_t *r2);
279
285 const roaring_bitmap_t *r2);
286
294 const roaring_bitmap_t **rs);
295
302 const roaring_bitmap_t **rs);
303
310 const roaring_bitmap_t *r2);
311
316 const roaring_bitmap_t *r2);
317
324 const roaring_bitmap_t **rs);
325
332 const roaring_bitmap_t *r2);
333
338 const roaring_bitmap_t *r2);
339
355
368 ROARING_CONTAINER_T *container;
369 int idx;
370 uint16_t key;
371 uint8_t typecode;
373
389 roaring_bulk_context_t *context, uint32_t val);
390
400 const uint32_t *vals);
401
406
412
417 uint32_t max);
418
422inline void roaring_bitmap_add_range(roaring_bitmap_t *r, uint64_t min,
423 uint64_t max) {
424 if (max <= min || min > (uint64_t)UINT32_MAX + 1) {
425 return;
426 }
427 roaring_bitmap_add_range_closed(r, (uint32_t)min, (uint32_t)(max - 1));
428}
429
434
439 uint32_t max);
440
445 uint64_t max) {
446 if (max <= min || min > (uint64_t)UINT32_MAX + 1) {
447 return;
448 }
449 roaring_bitmap_remove_range_closed(r, (uint32_t)min, (uint32_t)(max - 1));
450}
451
456 const uint32_t *vals);
457
463
467inline bool roaring_bitmap_contains(const roaring_bitmap_t *r, uint32_t val) {
468 // For performance reasons, this function is inline and uses internal
469 // functions directly.
470#ifdef __cplusplus
471 using namespace ::roaring::internal;
472#endif
473 const uint16_t hb = val >> 16;
474 /*
475 * the next function call involves a binary search and lots of branching.
476 */
477 int32_t i = ra_get_index(&r->high_low_container, hb);
478 if (i < 0) return false;
479
480 uint8_t typecode;
481 // next call ought to be cheap
482 container_t *container = ra_get_container_at_index(&r->high_low_container,
483 (uint16_t)i, &typecode);
484 // rest might be a tad expensive, possibly involving another round of binary
485 // search
486 return container_contains(container, val & 0xFFFF, typecode);
487}
488
494 uint64_t range_start, uint64_t range_end);
495
501 uint32_t range_start,
502 uint32_t range_end);
503
520 roaring_bulk_context_t *context,
521 uint32_t val);
522
527
532 uint64_t range_start,
533 uint64_t range_end);
534
539 uint32_t range_start,
540 uint32_t range_end);
545
552
561
578bool roaring_bitmap_to_bitset(const roaring_bitmap_t *r, bitset_t *bitset);
579
595 size_t limit, uint32_t *ans);
596
602
611
617
636size_t roaring_bitmap_serialize(const roaring_bitmap_t *r, char *buf);
637
651
669 size_t maxbytes);
670
676
695
732 size_t maxbytes);
733
757
766 size_t maxbytes);
767
775
795
796/*
797 * "Frozen" serialization format imitates memory layout of roaring_bitmap_t.
798 * Deserialized bitmap is a constant view of the underlying buffer.
799 * This significantly reduces amount of allocations and copying required during
800 * deserialization.
801 * It can be used with memory mapped files.
802 * Example can be found in benchmarks/frozen_benchmark.c
803 *
804 * [#####] const roaring_bitmap_t *
805 * | | |
806 * +----+ | +-+
807 * | | |
808 * [#####################################] underlying buffer
809 *
810 * Note that because frozen serialization format imitates C memory layout
811 * of roaring_bitmap_t, it is not fixed. It is different on big/little endian
812 * platforms and can be changed in future.
813 */
814
819
833
850 size_t length);
851
865bool roaring_iterate(const roaring_bitmap_t *r, roaring_iterator iterator,
866 void *ptr);
867
868bool roaring_iterate64(const roaring_bitmap_t *r, roaring_iterator64 iterator,
869 uint64_t high_bits, void *ptr);
870
875 const roaring_bitmap_t *r2);
876
881 const roaring_bitmap_t *r2);
882
888 const roaring_bitmap_t *r2);
889
908 const roaring_bitmap_t *r2,
909 const bool bitsetconversion);
910
920 const roaring_bitmap_t *r2,
921 const bool bitsetconversion);
922
930
945 const roaring_bitmap_t *r2);
946
953 const roaring_bitmap_t *r2);
954
962 uint64_t range_start, uint64_t range_end);
963
971 uint32_t range_start,
972 uint32_t range_end);
979void roaring_bitmap_flip_inplace(roaring_bitmap_t *r1, uint64_t range_start,
980 uint64_t range_end);
981
989 uint32_t range_start,
990 uint32_t range_end);
991
998bool roaring_bitmap_select(const roaring_bitmap_t *r, uint32_t rank,
999 uint32_t *element);
1000
1011uint64_t roaring_bitmap_rank(const roaring_bitmap_t *r, uint32_t x);
1012
1022void roaring_bitmap_rank_many(const roaring_bitmap_t *r, const uint32_t *begin,
1023 const uint32_t *end, uint64_t *ans);
1024
1032int64_t roaring_bitmap_get_index(const roaring_bitmap_t *r, uint32_t x);
1033
1038
1043
1051 roaring_statistics_t *stat);
1052
1068 const char **reason);
1069
1070
1092 const roaring_bitmap_t *parent; // Owner
1093 const ROARING_CONTAINER_T *container; // Current container
1094 uint8_t typecode; // Typecode of current container
1095 int32_t container_index; // Current container index
1096 uint32_t highbits; // High 16 bits of the current value
1097 roaring_container_iterator_t container_it;
1098
1102
1110
1112CROARING_DEPRECATED static inline void roaring_init_iterator(
1114 roaring_iterator_init(r, newit);
1115}
1116
1124
1126CROARING_DEPRECATED static inline void roaring_init_iterator_last(
1129}
1130
1140
1142CROARING_DEPRECATED static inline roaring_uint32_iterator_t *
1146
1157
1159CROARING_DEPRECATED static inline bool roaring_advance_uint32_iterator(
1162}
1163
1174
1176CROARING_DEPRECATED static inline bool roaring_previous_uint32_iterator(
1179}
1180
1187 uint32_t val);
1188
1190CROARING_DEPRECATED static inline bool
1195
1201 const roaring_uint32_iterator_t *it);
1202
1204CROARING_DEPRECATED static inline roaring_uint32_iterator_t *
1208
1213
1215CROARING_DEPRECATED static inline void roaring_free_uint32_iterator(
1218}
1219
1232 uint32_t *buf, uint32_t count);
1233
1235CROARING_DEPRECATED static inline uint32_t roaring_read_uint32_iterator(
1236 roaring_uint32_iterator_t *it, uint32_t *buf, uint32_t count) {
1237 return roaring_uint32_iterator_read(it, buf, count);
1238}
1239
1250 uint32_t count);
1251
1262 uint32_t count);
1263
1264#ifdef __cplusplus
1265}
1266}
1267} // extern "C" { namespace roaring { namespace api {
1268#endif
1269
1270#endif /* ROARING_H */
1271
1272#ifdef __cplusplus
1284#if !defined(ROARING_API_NOT_IN_GLOBAL_NAMESPACE)
1285using namespace ::roaring::api;
1286#endif
1287#endif
1288
1289// roaring64 will include roaring.h, but we would
1290// prefer to avoid having our users include roaring64.h
1291// in addition to roaring.h.
1292#include <roaring/roaring64.h>
bool roaring_bitmap_select(const roaring_bitmap_t *r, uint32_t rank, uint32_t *element)
roaring_bitmap_t * roaring_bitmap_create(void)
Definition roaring.h:45
roaring_bitmap_t * roaring_bitmap_flip(const roaring_bitmap_t *r1, uint64_t range_start, uint64_t range_end)
bool roaring_bitmap_add_checked(roaring_bitmap_t *r, uint32_t x)
void roaring_bitmap_andnot_inplace(roaring_bitmap_t *r1, const roaring_bitmap_t *r2)
void roaring_bitmap_add_range_closed(roaring_bitmap_t *r, uint32_t min, uint32_t max)
size_t roaring_bitmap_portable_deserialize_size(const char *buf, size_t maxbytes)
bool roaring_bitmap_contains_bulk(const roaring_bitmap_t *r, roaring_bulk_context_t *context, uint32_t val)
roaring_bitmap_t * roaring_bitmap_create_with_capacity(uint32_t cap)
size_t roaring_bitmap_portable_serialize(const roaring_bitmap_t *r, char *buf)
bool roaring_bitmap_equals(const roaring_bitmap_t *r1, const roaring_bitmap_t *r2)
void roaring_bitmap_flip_inplace(roaring_bitmap_t *r1, uint64_t range_start, uint64_t range_end)
size_t roaring_bitmap_shrink_to_fit(roaring_bitmap_t *r)
void roaring_iterator_init_last(const roaring_bitmap_t *r, roaring_uint32_iterator_t *newit)
void roaring_bitmap_remove_many(roaring_bitmap_t *r, size_t n_args, const uint32_t *vals)
bool roaring_unshare_all(roaring_bitmap_t *r)
void roaring_bitmap_clear(roaring_bitmap_t *r)
bool roaring_bitmap_intersect(const roaring_bitmap_t *r1, const roaring_bitmap_t *r2)
bool roaring_iterate64(const roaring_bitmap_t *r, roaring_iterator64 iterator, uint64_t high_bits, void *ptr)
void roaring_bitmap_printf_describe(const roaring_bitmap_t *r)
bool roaring_bitmap_internal_validate(const roaring_bitmap_t *r, const char **reason)
static CROARING_DEPRECATED void roaring_init_iterator(const roaring_bitmap_t *r, roaring_uint32_iterator_t *newit)
Definition roaring.h:1112
static CROARING_DEPRECATED roaring_uint32_iterator_t * roaring_create_iterator(const roaring_bitmap_t *r)
Definition roaring.h:1143
roaring_bitmap_t * roaring_bitmap_copy(const roaring_bitmap_t *r)
bool roaring_bitmap_run_optimize(roaring_bitmap_t *r)
roaring_bitmap_t * roaring_bitmap_lazy_xor(const roaring_bitmap_t *r1, const roaring_bitmap_t *r2)
void roaring_bitmap_and_inplace(roaring_bitmap_t *r1, const roaring_bitmap_t *r2)
uint64_t roaring_bitmap_or_cardinality(const roaring_bitmap_t *r1, const roaring_bitmap_t *r2)
static CROARING_DEPRECATED void roaring_init_iterator_last(const roaring_bitmap_t *r, roaring_uint32_iterator_t *newit)
Definition roaring.h:1126
roaring_bitmap_t * roaring_bitmap_or_many_heap(uint32_t number, const roaring_bitmap_t **rs)
void roaring_iterator_init(const roaring_bitmap_t *r, roaring_uint32_iterator_t *newit)
size_t roaring_bitmap_frozen_size_in_bytes(const roaring_bitmap_t *r)
uint64_t roaring_bitmap_range_cardinality(const roaring_bitmap_t *r, uint64_t range_start, uint64_t range_end)
bool roaring_bitmap_range_uint32_array(const roaring_bitmap_t *r, size_t offset, size_t limit, uint32_t *ans)
bool roaring_bitmap_get_copy_on_write(const roaring_bitmap_t *r)
Definition roaring.h:103
void roaring_bitmap_to_uint32_array(const roaring_bitmap_t *r, uint32_t *ans)
roaring_uint32_iterator_t * roaring_uint32_iterator_copy(const roaring_uint32_iterator_t *it)
roaring_bitmap_t * roaring_bitmap_portable_deserialize_frozen(const char *buf)
roaring_bitmap_t * roaring_bitmap_or_many(size_t number, const roaring_bitmap_t **rs)
bool roaring_bitmap_overwrite(roaring_bitmap_t *dest, const roaring_bitmap_t *src)
roaring_bitmap_t * roaring_bitmap_portable_deserialize(const char *buf)
void roaring_bitmap_xor_inplace(roaring_bitmap_t *r1, const roaring_bitmap_t *r2)
bool roaring_uint32_iterator_move_equalorlarger(roaring_uint32_iterator_t *it, uint32_t val)
double roaring_bitmap_jaccard_index(const roaring_bitmap_t *r1, const roaring_bitmap_t *r2)
size_t roaring_bitmap_size_in_bytes(const roaring_bitmap_t *r)
const roaring_bitmap_t * roaring_bitmap_frozen_view(const char *buf, size_t length)
bool roaring_uint32_iterator_previous(roaring_uint32_iterator_t *it)
bool roaring_bitmap_remove_run_compression(roaring_bitmap_t *r)
bool roaring_iterate(const roaring_bitmap_t *r, roaring_iterator iterator, void *ptr)
void roaring_bitmap_init_cleared(roaring_bitmap_t *r)
Definition roaring.h:61
roaring_uint32_iterator_t * roaring_iterator_create(const roaring_bitmap_t *r)
void roaring_bitmap_add_bulk(roaring_bitmap_t *r, roaring_bulk_context_t *context, uint32_t val)
void roaring_bitmap_frozen_serialize(const roaring_bitmap_t *r, char *buf)
void roaring_bitmap_remove_range(roaring_bitmap_t *r, uint64_t min, uint64_t max)
Definition roaring.h:444
void roaring_bitmap_lazy_xor_inplace(roaring_bitmap_t *r1, const roaring_bitmap_t *r2)
void roaring_bitmap_add_many(roaring_bitmap_t *r, size_t n_args, const uint32_t *vals)
bool roaring_bitmap_contains_range(const roaring_bitmap_t *r, uint64_t range_start, uint64_t range_end)
void roaring_bitmap_lazy_or_inplace(roaring_bitmap_t *r1, const roaring_bitmap_t *r2, const bool bitsetconversion)
bool roaring_bitmap_is_empty(const roaring_bitmap_t *r)
static CROARING_DEPRECATED bool roaring_previous_uint32_iterator(roaring_uint32_iterator_t *it)
Definition roaring.h:1176
roaring_bitmap_t * roaring_bitmap_portable_deserialize_safe(const char *buf, size_t maxbytes)
roaring_bitmap_t * roaring_bitmap_from_range(uint64_t min, uint64_t max, uint32_t step)
roaring_bitmap_t * roaring_bitmap_or(const roaring_bitmap_t *r1, const roaring_bitmap_t *r2)
void roaring_bitmap_free(const roaring_bitmap_t *r)
uint32_t roaring_uint32_iterator_skip_backward(roaring_uint32_iterator_t *it, uint32_t count)
void roaring_bitmap_statistics(const roaring_bitmap_t *r, roaring_statistics_t *stat)
bool roaring_bitmap_contains(const roaring_bitmap_t *r, uint32_t val)
Definition roaring.h:467
void roaring_bitmap_remove(roaring_bitmap_t *r, uint32_t x)
roaring_bitmap_t * roaring_bitmap_add_offset(const roaring_bitmap_t *bm, int64_t offset)
uint32_t roaring_uint32_iterator_skip(roaring_uint32_iterator_t *it, uint32_t count)
void roaring_bitmap_set_copy_on_write(roaring_bitmap_t *r, bool cow)
Definition roaring.h:106
roaring_bitmap_t * roaring_bitmap_deserialize_safe(const void *buf, size_t maxbytes)
void roaring_bitmap_remove_range_closed(roaring_bitmap_t *r, uint32_t min, uint32_t max)
bool roaring_bitmap_is_strict_subset(const roaring_bitmap_t *r1, const roaring_bitmap_t *r2)
roaring_bitmap_t * roaring_bitmap_lazy_or(const roaring_bitmap_t *r1, const roaring_bitmap_t *r2, const bool bitsetconversion)
struct roaring_bitmap_s roaring_bitmap_t
uint64_t roaring_bitmap_xor_cardinality(const roaring_bitmap_t *r1, const roaring_bitmap_t *r2)
roaring_bitmap_t * roaring_bitmap_flip_closed(const roaring_bitmap_t *x1, uint32_t range_start, uint32_t range_end)
bool roaring_bitmap_to_bitset(const roaring_bitmap_t *r, bitset_t *bitset)
uint64_t roaring_bitmap_andnot_cardinality(const roaring_bitmap_t *r1, const roaring_bitmap_t *r2)
bool roaring_bitmap_intersect_with_range(const roaring_bitmap_t *bm, uint64_t x, uint64_t y)
roaring_bitmap_t * roaring_bitmap_deserialize(const void *buf)
size_t roaring_bitmap_portable_size_in_bytes(const roaring_bitmap_t *r)
static CROARING_DEPRECATED roaring_uint32_iterator_t * roaring_copy_uint32_iterator(const roaring_uint32_iterator_t *it)
Definition roaring.h:1205
bool roaring_bitmap_is_subset(const roaring_bitmap_t *r1, const roaring_bitmap_t *r2)
static CROARING_DEPRECATED uint32_t roaring_read_uint32_iterator(roaring_uint32_iterator_t *it, uint32_t *buf, uint32_t count)
Definition roaring.h:1235
void roaring_bitmap_rank_many(const roaring_bitmap_t *r, const uint32_t *begin, const uint32_t *end, uint64_t *ans)
CROARING_DEPRECATED roaring_bitmap_t * roaring_bitmap_of(size_t n,...)
void roaring_bitmap_or_inplace(roaring_bitmap_t *r1, const roaring_bitmap_t *r2)
uint32_t roaring_uint32_iterator_read(roaring_uint32_iterator_t *it, uint32_t *buf, uint32_t count)
uint64_t roaring_bitmap_rank(const roaring_bitmap_t *r, uint32_t x)
void roaring_uint32_iterator_free(roaring_uint32_iterator_t *it)
static CROARING_DEPRECATED bool roaring_move_uint32_iterator_equalorlarger(roaring_uint32_iterator_t *it, uint32_t val)
Definition roaring.h:1191
uint32_t roaring_bitmap_maximum(const roaring_bitmap_t *r)
bool roaring_contains_shared(const roaring_bitmap_t *r)
bool roaring_bitmap_init_with_capacity(roaring_bitmap_t *r, uint32_t cap)
roaring_bitmap_t * roaring_bitmap_xor_many(size_t number, const roaring_bitmap_t **rs)
void roaring_bitmap_add_range(roaring_bitmap_t *r, uint64_t min, uint64_t max)
Definition roaring.h:422
void roaring_bitmap_flip_inplace_closed(roaring_bitmap_t *r1, uint32_t range_start, uint32_t range_end)
int64_t roaring_bitmap_get_index(const roaring_bitmap_t *r, uint32_t x)
roaring_bitmap_t * roaring_bitmap_and(const roaring_bitmap_t *r1, const roaring_bitmap_t *r2)
uint64_t roaring_bitmap_get_cardinality(const roaring_bitmap_t *r)
uint64_t roaring_bitmap_range_cardinality_closed(const roaring_bitmap_t *r, uint32_t range_start, uint32_t range_end)
size_t roaring_bitmap_serialize(const roaring_bitmap_t *r, char *buf)
uint64_t roaring_bitmap_and_cardinality(const roaring_bitmap_t *r1, const roaring_bitmap_t *r2)
roaring_bitmap_t * roaring_bitmap_xor(const roaring_bitmap_t *r1, const roaring_bitmap_t *r2)
struct roaring_bulk_context_s roaring_bulk_context_t
struct roaring_uint32_iterator_s roaring_uint32_iterator_t
bool roaring_bitmap_contains_range_closed(const roaring_bitmap_t *r, uint32_t range_start, uint32_t range_end)
bool roaring_bitmap_remove_checked(roaring_bitmap_t *r, uint32_t x)
static CROARING_DEPRECATED bool roaring_advance_uint32_iterator(roaring_uint32_iterator_t *it)
Definition roaring.h:1159
void roaring_bitmap_repair_after_lazy(roaring_bitmap_t *r1)
void roaring_bitmap_printf(const roaring_bitmap_t *r)
bool roaring_uint32_iterator_advance(roaring_uint32_iterator_t *it)
static CROARING_DEPRECATED void roaring_free_uint32_iterator(roaring_uint32_iterator_t *it)
Definition roaring.h:1215
roaring_bitmap_t * roaring_bitmap_andnot(const roaring_bitmap_t *r1, const roaring_bitmap_t *r2)
uint32_t roaring_bitmap_minimum(const roaring_bitmap_t *r)
roaring_bitmap_t * roaring_bitmap_of_ptr(size_t n_args, const uint32_t *vals)
void roaring_bitmap_add(roaring_bitmap_t *r, uint32_t x)
roaring_array_t high_low_container
Definition roaring.h:29
ROARING_CONTAINER_T * container
Definition roaring.h:368
const roaring_bitmap_t * parent
Definition roaring.h:1092
const ROARING_CONTAINER_T * container
Definition roaring.h:1093
roaring_container_iterator_t container_it
Definition roaring.h:1097