4#ifndef INCLUDE_ROARING_HH_
5#define INCLUDE_ROARING_HH_
9#include <initializer_list>
15#if !defined(ROARING_EXCEPTIONS)
17#ifndef __cpp_exceptions
18#error "__cpp_exceptions should be defined"
21#define ROARING_EXCEPTIONS 1
23#define ROARING_EXCEPTIONS 0
27#ifndef ROARING_TERMINATE
29#define ROARING_TERMINATE(_s) throw std::runtime_error(_s)
31#define ROARING_TERMINATE(_s) std::terminate()
35#define ROARING_API_NOT_IN_GLOBAL_NAMESPACE
37#undef ROARING_API_NOT_IN_GLOBAL_NAMESPACE
39#include <roaring/roaring_array.h>
81 api::roaring_bitmap_init_cleared(&
roaring);
88 api::roaring_bitmap_add_many(&
roaring, n, data);
95 addMany(l.size(), l.begin());
116 api::roaring_bitmap_set_copy_on_write(
132 api::roaring_bitmap_init_cleared(&r.roaring);
142 for (
size_t i = 0; i < n; i++) {
143 ans.
add(va_arg(vl, uint32_t));
158 api::roaring_bitmap_set_copy_on_write(
168 api::roaring_bitmap_clear(&
roaring);
173 api::roaring_bitmap_init_cleared(&r.roaring);
193 ans.
addMany(l.size(), l.begin());
200 void add(uint32_t x)
noexcept { api::roaring_bitmap_add(&
roaring, x); }
208 return api::roaring_bitmap_add_checked(&
roaring, x);
214 void addRange(
const uint64_t min,
const uint64_t max)
noexcept {
215 return api::roaring_bitmap_add_range(&
roaring, min, max);
222 return api::roaring_bitmap_add_range_closed(&
roaring, min, max);
228 void addMany(
size_t n_args,
const uint32_t *vals)
noexcept {
229 api::roaring_bitmap_add_many(&
roaring, n_args, vals);
241 api::roaring_bitmap_add_bulk(&
roaring, &context.context_, x);
253 return api::roaring_bitmap_contains_bulk(&
roaring, &context.context_,
261 api::roaring_bitmap_remove(&
roaring, x);
270 return api::roaring_bitmap_remove_checked(&
roaring, x);
277 return api::roaring_bitmap_remove_range(&
roaring, min, max);
284 return api::roaring_bitmap_remove_range_closed(&
roaring, min, max);
296 return api::roaring_bitmap_maximum(&
roaring);
303 return api::roaring_bitmap_minimum(&
roaring);
310 return api::roaring_bitmap_contains(&
roaring, x);
317 return api::roaring_bitmap_contains_range(&
roaring, x, y);
321 const uint32_t y)
const noexcept {
322 return api::roaring_bitmap_contains_range_closed(&
roaring, x, y);
334 api::roaring_bitmap_and_inplace(&
roaring, &r.roaring);
344 api::roaring_bitmap_andnot_inplace(&
roaring, &r.roaring);
356 api::roaring_bitmap_or_inplace(&
roaring, &r.roaring);
366 api::roaring_bitmap_xor_inplace(&
roaring, &r.roaring);
379 return api::roaring_bitmap_get_cardinality(&
roaring);
386 return api::roaring_bitmap_is_empty(&
roaring);
395 return api::roaring_bitmap_get_cardinality(&
roaring) ==
396 ((uint64_t)(std::numeric_limits<uint32_t>::max)()) + 1;
403 return api::roaring_bitmap_is_subset(&
roaring, &r.roaring);
410 return api::roaring_bitmap_is_strict_subset(&
roaring, &r.roaring);
419 api::roaring_bitmap_to_uint32_array(&
roaring, ans);
425 size_t limit)
const noexcept {
426 api::roaring_bitmap_range_uint32_array(&
roaring, offset, limit, ans);
433 return api::roaring_bitmap_equals(&
roaring, &r.roaring);
440 void flip(uint64_t range_start, uint64_t range_end)
noexcept {
441 api::roaring_bitmap_flip_inplace(&
roaring, range_start, range_end);
448 void flipClosed(uint32_t range_start, uint32_t range_end)
noexcept {
449 api::roaring_bitmap_flip_inplace_closed(&
roaring, range_start,
458 return api::roaring_bitmap_remove_run_compression(&
roaring);
468 return api::roaring_bitmap_run_optimize(&
roaring);
476 return api::roaring_bitmap_shrink_to_fit(&
roaring);
488 void iterate(api::roaring_iterator iterator,
void *ptr)
const {
489 api::roaring_iterate(&
roaring, iterator, ptr);
500 bool select(uint32_t rnk, uint32_t *element)
const noexcept {
501 return api::roaring_bitmap_select(&
roaring, rnk, element);
508 return api::roaring_bitmap_and_cardinality(&
roaring, &r.roaring);
515 return api::roaring_bitmap_intersect(&
roaring, &r.roaring);
526 return api::roaring_bitmap_jaccard_index(&
roaring, &r.roaring);
533 return api::roaring_bitmap_or_cardinality(&
roaring, &r.roaring);
540 return api::roaring_bitmap_andnot_cardinality(&
roaring, &r.roaring);
548 return api::roaring_bitmap_xor_cardinality(&
roaring, &r.roaring);
559 uint64_t
rank(uint32_t x)
const noexcept {
560 return api::roaring_bitmap_rank(&
roaring, x);
568 void rank_many(
const uint32_t *begin,
const uint32_t *end,
569 uint64_t *ans)
const noexcept {
570 return api::roaring_bitmap_rank_many(&
roaring, begin, end, ans);
581 return api::roaring_bitmap_get_index(&
roaring, x);
623 size_t write(
char *buf,
bool portable =
true) const noexcept {
625 return api::roaring_bitmap_portable_serialize(&
roaring, buf);
627 return api::roaring_bitmap_serialize(&
roaring, buf);
648 roaring_bitmap_t *r =
649 portable ? api::roaring_bitmap_portable_deserialize(buf)
650 : api::roaring_bitmap_deserialize(buf);
681 roaring_bitmap_t *r =
682 api::roaring_bitmap_portable_deserialize_safe(buf, maxbytes);
699 return api::roaring_bitmap_portable_size_in_bytes(&
roaring);
701 return api::roaring_bitmap_size_in_bytes(&
roaring);
710 const roaring_bitmap_t *s =
711 api::roaring_bitmap_frozen_view(buf, length);
725 const roaring_bitmap_t *s =
726 api::roaring_bitmap_portable_deserialize_frozen(buf);
760 roaring_bitmap_t *r = api::roaring_bitmap_and(&
roaring, &o.
roaring);
773 roaring_bitmap_t *r = api::roaring_bitmap_andnot(&
roaring, &o.
roaring);
786 roaring_bitmap_t *r = api::roaring_bitmap_or(&
roaring, &o.
roaring);
799 roaring_bitmap_t *r = api::roaring_bitmap_xor(&
roaring, &o.
roaring);
810 api::roaring_bitmap_set_copy_on_write(&
roaring, val);
825 char first_char =
'{';
829 [](uint32_t value,
void *inner_iter_data) ->
bool {
830 ((iter_data *)inner_iter_data)->str +=
831 ((iter_data *)inner_iter_data)->first_char;
832 ((iter_data *)inner_iter_data)->str +=
833 std::to_string(value);
834 ((iter_data *)inner_iter_data)->first_char =
',';
837 (
void *)&outer_iter_data);
839 outer_iter_data.str =
'{';
840 outer_iter_data.str +=
'}';
841 return outer_iter_data.str;
848 return api::roaring_bitmap_get_copy_on_write(&
roaring);
857 const roaring_bitmap_t **x = (
const roaring_bitmap_t **)roaring_malloc(
858 n *
sizeof(roaring_bitmap_t *));
862 for (
size_t k = 0; k < n; ++k) x[k] = &inputs[k]->
roaring;
864 roaring_bitmap_t *c_ans = api::roaring_bitmap_or_many(n, x);
879 if (!(
roaring.high_low_container.flags & ROARING_FLAG_FROZEN)) {
880 api::roaring_bitmap_clear(&
roaring);
889 (roaring_bitmap_t *)((
char *)
890 roaring.high_low_container.containers -
891 sizeof(roaring_bitmap_t)));
932 bool exhausted =
false) {
935 i.container_index = INT32_MAX;
937 i.current_value = UINT32_MAX;
939 api::roaring_iterator_init(&parent.
roaring, &i);
949 if (!i.has_value)
return false;
950 if (!o.
i.has_value)
return true;
951 return i.current_value < *o;
955 if (!o.
i.has_value)
return true;
956 if (!i.has_value)
return false;
957 return i.current_value <= *o;
961 if (!o.
i.has_value)
return false;
962 if (!i.has_value)
return true;
963 return i.current_value > *o;
967 if (!i.has_value)
return true;
968 if (!o.
i.has_value)
return false;
969 return i.current_value >= *o;
973 api::roaring_uint32_iterator_advance(&i);
979 api::roaring_uint32_iterator_advance(&i);
988 return api::roaring_uint32_iterator_move_equalorlarger(&i, val);
993 api::roaring_uint32_iterator_move_equalorlarger(&i, val);
997 api::roaring_uint32_iterator_previous(&i);
1003 api::roaring_uint32_iterator_previous(&i);
1008 return i.current_value == *o && i.has_value == o.
i.has_value;
1012 return i.current_value != *o || i.has_value != o.
i.has_value;
1015 api::roaring_uint32_iterator_t
BulkContext & operator=(const BulkContext &)=delete
BulkContext(const BulkContext &)=delete
BulkContext(BulkContext &&) noexcept=default
api::roaring_bulk_context_t roaring_bitmap_bulk_context_t
bool move_equalorlarger(value_type val)
bool operator>=(const type_of_iterator &o) const
bool operator<=(const type_of_iterator &o) const
bool operator==(const RoaringSetBitBiDirectionalIterator &o) const
api::roaring_uint32_iterator_t i
CROARING_DEPRECATED void equalorlarger(uint32_t val)
bool operator<(const type_of_iterator &o) const
value_type operator*() const
type_of_iterator operator--(int)
uint32_t & reference_type
RoaringSetBitBiDirectionalIterator type_of_iterator
bool operator>(const type_of_iterator &o) const
type_of_iterator & operator++()
type_of_iterator & operator--()
std::bidirectional_iterator_tag iterator_category
RoaringSetBitBiDirectionalIterator(const Roaring &parent, bool exhausted=false)
type_of_iterator operator++(int)
bool operator!=(const RoaringSetBitBiDirectionalIterator &o) const
Roaring operator-(const Roaring &o) const
Roaring(roaring_bitmap_t *s) noexcept
static Roaring fastunion(size_t n, const Roaring **inputs)
size_t getFrozenSizeInBytes() const noexcept
size_t shrinkToFit() noexcept
uint64_t xor_cardinality(const Roaring &r) const noexcept
static Roaring readSafe(const char *buf, size_t maxbytes)
bool addChecked(uint32_t x) noexcept
uint64_t rank(uint32_t x) const noexcept
void addRange(const uint64_t min, const uint64_t max) noexcept
size_t write(char *buf, bool portable=true) const noexcept
void addRangeClosed(const uint32_t min, const uint32_t max) noexcept
uint64_t or_cardinality(const Roaring &r) const noexcept
Roaring(Roaring &&r) noexcept
static Roaring bitmapOfList(std::initializer_list< uint32_t > l)
static Roaring read(const char *buf, bool portable=true)
Roaring & operator=(const Roaring &r)
bool runOptimize() noexcept
Roaring & operator^=(const Roaring &r) noexcept
Roaring operator|(const Roaring &o) const
uint64_t cardinality() const noexcept
bool containsRange(const uint64_t x, const uint64_t y) const noexcept
bool removeRunCompression() noexcept
void add(uint32_t x) noexcept
bool containsRangeClosed(const uint32_t x, const uint32_t y) const noexcept
static Roaring bitmapOf(size_t n,...)
void addBulk(BulkContext &context, uint32_t x) noexcept
void addMany(size_t n_args, const uint32_t *vals) noexcept
const_iterator begin() const
bool isFull() const noexcept
bool intersect(const Roaring &r) const noexcept
std::string toString() const noexcept
static const Roaring frozenView(const char *buf, size_t length)
Roaring(size_t n, const uint32_t *data)
bool containsBulk(BulkContext &context, uint32_t x) const noexcept
RoaringSetBitBiDirectionalIterator const_iterator
bool operator==(const Roaring &r) const noexcept
void flipClosed(uint32_t range_start, uint32_t range_end) noexcept
Roaring & operator-=(const Roaring &r) noexcept
Roaring & operator|=(const Roaring &r) noexcept
void writeFrozen(char *buf) const noexcept
bool removeChecked(uint32_t x) noexcept
Roaring operator&(const Roaring &o) const
uint64_t andnot_cardinality(const Roaring &r) const noexcept
bool contains(uint32_t x) const noexcept
static const Roaring portableDeserializeFrozen(const char *buf)
bool getCopyOnWrite() const noexcept
void rangeUint32Array(uint32_t *ans, size_t offset, size_t limit) const noexcept
uint64_t and_cardinality(const Roaring &r) const noexcept
size_t getSizeInBytes(bool portable=true) const noexcept
Roaring & operator&=(const Roaring &r) noexcept
void flip(uint64_t range_start, uint64_t range_end) noexcept
void iterate(api::roaring_iterator iterator, void *ptr) const
Roaring & operator=(Roaring &&r) noexcept
void rank_many(const uint32_t *begin, const uint32_t *end, uint64_t *ans) const noexcept
Roaring(std::initializer_list< uint32_t > l)
void toUint32Array(uint32_t *ans) const noexcept
void remove(uint32_t x) noexcept
bool isEmpty() const noexcept
void removeRange(uint64_t min, uint64_t max) noexcept
Roaring operator^(const Roaring &o) const
void setCopyOnWrite(bool val) noexcept
Roaring & operator=(std::initializer_list< uint32_t > l)
void printf() const noexcept
uint32_t minimum() const noexcept
double jaccard_index(const Roaring &r) const noexcept
RoaringSetBitBiDirectionalIterator const_bidirectional_iterator
bool isSubset(const Roaring &r) const noexcept
bool select(uint32_t rnk, uint32_t *element) const noexcept
int64_t getIndex(uint32_t x) const noexcept
void swap(Roaring &r) noexcept
Roaring(const Roaring &r)
uint32_t maximum() const noexcept
bool isStrictSubset(const Roaring &r) const noexcept
const_iterator & end() const
void removeRangeClosed(uint32_t min, uint32_t max) noexcept
size_t roaring_bitmap_frozen_size_in_bytes(const roaring_bitmap_t *r)
void roaring_bitmap_frozen_serialize(const roaring_bitmap_t *r, char *buf)
void roaring_bitmap_free(const roaring_bitmap_t *r)
struct roaring_bitmap_s roaring_bitmap_t
#define ROARING_TERMINATE(_s)