1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
extern crate libc;

#[repr(C)]
#[derive(Copy, Clone)]
pub struct roaring_bitmap_s {
    pub high_low_container: roaring_array_s,
    pub copy_on_write: bool
}

#[repr(C)]
#[derive(Copy, Clone)]
pub struct roaring_array_s {
    pub size: ::libc::int32_t,
    pub allocation_size: ::libc::int32_t,
    pub containers: *mut *mut ::std::os::raw::c_void,
    pub keys: *mut ::libc::uint16_t,
    pub typecodes: *mut ::libc::uint8_t
}

#[repr(C)]
#[derive(Copy, Clone)]
pub struct roaring_uint32_iterator_s {
    pub parent: *const roaring_bitmap_s,
    pub container_index: ::libc::int32_t,
    pub in_container_index: ::libc::int32_t,
    pub run_index: ::libc::int32_t,
    pub in_run_index: ::libc::uint32_t,
    pub current_value: ::libc::uint32_t,
    pub has_value: bool
}

#[repr(C)]
#[derive(Copy, Clone)]
pub struct roaring_statistics_s {
    pub n_containers: ::libc::uint32_t,
    pub n_array_containers: ::libc::uint32_t,
    pub n_run_containers: ::libc::uint32_t,
    pub n_bitset_containers: ::libc::uint32_t,
    pub n_values_array_containers: ::libc::uint32_t,
    pub n_values_run_containers: ::libc::uint32_t,
    pub n_values_bitset_containers: ::libc::uint32_t,
    pub n_bytes_array_containers: ::libc::uint32_t,
    pub n_bytes_run_containers: ::libc::uint32_t,
    pub n_bytes_bitset_containers: ::libc::uint32_t,
    pub max_value: ::libc::uint32_t,
    pub min_value: ::libc::uint32_t,
    pub sum_value: ::libc::uint64_t,
    pub cardinality: ::libc::uint64_t
}

impl Default for roaring_statistics_s {
    fn default() -> roaring_statistics_s { unsafe { std::mem::zeroed() } }
}

#[link(name = "roaring", kind = "static")]
extern "C" {
    pub fn roaring_bitmap_create() -> *mut roaring_bitmap_s;
    pub fn roaring_bitmap_create_with_capacity(cap: ::libc::uint32_t) -> *mut roaring_bitmap_s;
    pub fn roaring_bitmap_of_ptr(n_args: ::libc::size_t, vals: *const ::libc::uint32_t) -> *mut roaring_bitmap_s;
    pub fn roaring_bitmap_of(n: ::libc::size_t, ...) -> *mut roaring_bitmap_s;
    pub fn roaring_bitmap_copy(r: *const roaring_bitmap_s) -> *mut roaring_bitmap_s;
    pub fn roaring_bitmap_printf(ra: *const roaring_bitmap_s);
    pub fn roaring_bitmap_and(x1: *const roaring_bitmap_s, x2: *const roaring_bitmap_s) -> *mut roaring_bitmap_s;
    pub fn roaring_bitmap_and_inplace(x1: *mut roaring_bitmap_s, x2: *const roaring_bitmap_s);
    pub fn roaring_bitmap_or(x1: *const roaring_bitmap_s, x2: *const roaring_bitmap_s) -> *mut roaring_bitmap_s;
    pub fn roaring_bitmap_or_inplace(x1: *mut roaring_bitmap_s, x2: *const roaring_bitmap_s);
    pub fn roaring_bitmap_or_many(number: ::libc::size_t, x: *mut *const roaring_bitmap_s) -> *mut roaring_bitmap_s;
    pub fn roaring_bitmap_or_many_heap(number: ::libc::uint32_t, x: *mut *const roaring_bitmap_s) -> *mut roaring_bitmap_s;
    pub fn roaring_bitmap_xor(x1: *const roaring_bitmap_s, x2: *const roaring_bitmap_s) -> *mut roaring_bitmap_s;
    pub fn roaring_bitmap_xor_inplace(x1: *mut roaring_bitmap_s, x2: *const roaring_bitmap_s);
    pub fn roaring_bitmap_flip(x1: *const roaring_bitmap_s,
                               range_start: ::libc::uint64_t, range_end: ::libc::uint64_t)
                               -> *mut roaring_bitmap_s;
    pub fn roaring_bitmap_flip_inplace(x1: *mut roaring_bitmap_s,
                                       range_start: ::libc::uint64_t,
                                       range_end: ::libc::uint64_t);
    pub fn roaring_bitmap_xor_many(number: ::libc::size_t, x: *mut *const roaring_bitmap_s) -> *mut roaring_bitmap_s;
    pub fn roaring_bitmap_andnot(x1: *const roaring_bitmap_s, x2: *const roaring_bitmap_s) -> *mut roaring_bitmap_s;
    pub fn roaring_bitmap_andnot_inplace(x1: *mut roaring_bitmap_s, x2: *const roaring_bitmap_s);
    pub fn roaring_bitmap_free(r: *mut roaring_bitmap_s);
    pub fn roaring_bitmap_add(r: *mut roaring_bitmap_s, x: ::libc::uint32_t);
    pub fn roaring_bitmap_add_many(r: *mut roaring_bitmap_s, n_args: ::libc::size_t, vals: *const ::libc::uint32_t);
    pub fn roaring_bitmap_remove(r: *mut roaring_bitmap_s, x: ::libc::uint32_t);
    pub fn roaring_bitmap_contains(r: *const roaring_bitmap_s, x: ::libc::uint32_t) -> bool;
    pub fn roaring_bitmap_get_cardinality(ra: *const roaring_bitmap_s) -> ::libc::uint64_t;
    pub fn roaring_bitmap_to_uint32_array(ra: *const roaring_bitmap_s, cardinality: *mut ::libc::uint32_t);
    pub fn roaring_bitmap_remove_run_compression(r: *mut roaring_bitmap_s) -> bool;
    pub fn roaring_bitmap_run_optimize(r: *mut roaring_bitmap_s) -> bool;
    pub fn roaring_bitmap_serialize(ra: *const roaring_bitmap_s, buf: *mut ::libc::c_char) -> ::libc::size_t;
    pub fn roaring_bitmap_deserialize(buf: *const ::libc::c_void) -> *mut roaring_bitmap_s;
    pub fn roaring_bitmap_portable_deserialize(buf: *const ::libc::c_char) -> *mut roaring_bitmap_s;
    pub fn roaring_bitmap_portable_size_in_bytes(ra: *const roaring_bitmap_s) -> ::libc::size_t;
    pub fn roaring_bitmap_portable_serialize(ra: *const roaring_bitmap_s, buf: *mut ::libc::c_char) -> ::libc::size_t;
    pub fn roaring_bitmap_is_empty(ra: *const roaring_bitmap_s) -> bool;
    pub fn roaring_bitmap_equals(ra1: *const roaring_bitmap_s, ra2: *const roaring_bitmap_s) -> bool;
    pub fn roaring_bitmap_is_subset(ra1: *const roaring_bitmap_s, ra2: *const roaring_bitmap_s) -> bool;
    pub fn roaring_bitmap_is_strict_subset(ra1: *const roaring_bitmap_s, ra2: *const roaring_bitmap_s) -> bool;
    pub fn roaring_bitmap_statistics(ra: *const roaring_bitmap_s, stat: *mut roaring_statistics_s);
    pub fn roaring_create_iterator(ra: *const roaring_bitmap_s) -> *mut roaring_uint32_iterator_s;
    pub fn roaring_advance_uint32_iterator(it: *mut roaring_uint32_iterator_s) -> bool;
    pub fn roaring_free_uint32_iterator(it: *mut roaring_uint32_iterator_s);
    pub fn roaring_bitmap_minimum(bm: *const roaring_bitmap_s) -> ::libc::uint32_t;
    pub fn roaring_bitmap_maximum(bm: *const roaring_bitmap_s) -> ::libc::uint32_t;
    pub fn roaring_bitmap_rank(bm: *const roaring_bitmap_s, x: ::libc::uint32_t) -> ::libc::uint64_t;
    pub fn roaring_bitmap_select(ra: *const roaring_bitmap_s,
                                 rank: ::libc::uint32_t,
                                 element: *mut ::libc::uint32_t) -> bool;
}