roaring 0.0.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,302 @@
1
+ #include "ruby.h"
2
+ #include "roaring.h"
3
+
4
+ #include <stdio.h>
5
+
6
+ static VALUE cRoaringBitmap;
7
+ VALUE rb_mRoaring;
8
+
9
+ #ifndef RBOOL
10
+ #define RBOOL(x) ((x) ? Qtrue : Qfalse)
11
+ #endif
12
+
13
+ static inline uint32_t
14
+ NUM2UINT32(VALUE num) {
15
+ if (!FIXNUM_P(num) && !RB_TYPE_P(num, T_BIGNUM)) {
16
+ rb_raise(rb_eTypeError, "wrong argument type %s (expected Integer)", rb_obj_classname(num));
17
+ } else if ((SIGNED_VALUE)num < (SIGNED_VALUE)INT2FIX(0)) {
18
+ rb_raise(rb_eRangeError, "Integer %"PRIdVALUE " must be >= 0 to use with Roaring::Bitmap", num);
19
+ } else {
20
+ return FIX2UINT(num);
21
+ }
22
+ }
23
+
24
+ static void rb_roaring_free(void *data)
25
+ {
26
+ roaring_bitmap_free(data);
27
+ }
28
+
29
+ static size_t rb_roaring_memsize(const void *data)
30
+ {
31
+ // This is probably an estimate, "frozen" refers to the "frozen"
32
+ // serialization format, which mimics the in-memory representation.
33
+ return sizeof(roaring_bitmap_t) + roaring_bitmap_frozen_size_in_bytes(data);
34
+ }
35
+
36
+ static const rb_data_type_t roaring_type = {
37
+ .wrap_struct_name = "roaring/bitmap",
38
+ .function = {
39
+ .dfree = rb_roaring_free,
40
+ .dsize = rb_roaring_memsize
41
+ },
42
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY,
43
+ };
44
+
45
+ static VALUE rb_roaring_alloc(VALUE self)
46
+ {
47
+ roaring_bitmap_t *data = roaring_bitmap_create();
48
+ return TypedData_Wrap_Struct(self, &roaring_type, data);
49
+ }
50
+
51
+ static roaring_bitmap_t *get_bitmap(VALUE obj) {
52
+ roaring_bitmap_t *bitmap;
53
+ TypedData_Get_Struct(obj, roaring_bitmap_t, &roaring_type, bitmap);
54
+ return bitmap;
55
+ }
56
+
57
+ static VALUE rb_roaring_initialize_copy(VALUE self, VALUE other) {
58
+ roaring_bitmap_t *self_data = get_bitmap(self);
59
+ roaring_bitmap_t *other_data = get_bitmap(other);
60
+
61
+ roaring_bitmap_overwrite(self_data, other_data);
62
+
63
+ return self;
64
+ }
65
+
66
+ static VALUE rb_roaring_cardinality(VALUE self)
67
+ {
68
+ roaring_bitmap_t *data = get_bitmap(self);
69
+ uint64_t cardinality = roaring_bitmap_get_cardinality(data);
70
+ return ULONG2NUM(cardinality);
71
+ }
72
+
73
+ static VALUE rb_roaring_add(VALUE self, VALUE val)
74
+ {
75
+ roaring_bitmap_t *data = get_bitmap(self);
76
+
77
+ uint32_t num = NUM2UINT32(val);
78
+ roaring_bitmap_add(data, num);
79
+ return self;
80
+ }
81
+
82
+ static VALUE rb_roaring_add_p(VALUE self, VALUE val)
83
+ {
84
+ roaring_bitmap_t *data = get_bitmap(self);
85
+
86
+ uint32_t num = NUM2UINT32(val);
87
+ return roaring_bitmap_add_checked(data, num) ? self : Qnil;
88
+ }
89
+
90
+ static VALUE rb_roaring_remove(VALUE self, VALUE val)
91
+ {
92
+ roaring_bitmap_t *data = get_bitmap(self);
93
+
94
+ uint32_t num = NUM2UINT32(val);
95
+ roaring_bitmap_remove(data, num);
96
+ return self;
97
+ }
98
+
99
+ static VALUE rb_roaring_remove_p(VALUE self, VALUE val)
100
+ {
101
+ roaring_bitmap_t *data = get_bitmap(self);
102
+
103
+ uint32_t num = NUM2UINT32(val);
104
+ return roaring_bitmap_remove_checked(data, num) ? self : Qnil;
105
+ }
106
+
107
+ static VALUE rb_roaring_include_p(VALUE self, VALUE val)
108
+ {
109
+ roaring_bitmap_t *data = get_bitmap(self);
110
+
111
+ uint32_t num = NUM2UINT32(val);
112
+ return RBOOL(roaring_bitmap_contains(data, num));
113
+ }
114
+
115
+ static VALUE rb_roaring_empty_p(VALUE self)
116
+ {
117
+ roaring_bitmap_t *data = get_bitmap(self);
118
+ return RBOOL(roaring_bitmap_is_empty(data));
119
+ }
120
+
121
+ static VALUE rb_roaring_clear(VALUE self)
122
+ {
123
+ roaring_bitmap_t *data = get_bitmap(self);
124
+ roaring_bitmap_clear(data);
125
+ return self;
126
+ }
127
+
128
+ bool rb_roaring_each_i(uint32_t value, void *param) {
129
+ rb_yield(UINT2NUM(value));
130
+ return true; // iterate till the end
131
+ }
132
+
133
+ static VALUE rb_roaring_each(VALUE self)
134
+ {
135
+ roaring_bitmap_t *data = get_bitmap(self);
136
+ roaring_iterate(data, rb_roaring_each_i, NULL);
137
+ return self;
138
+ }
139
+
140
+ static VALUE rb_roaring_aref(VALUE self, VALUE rankv)
141
+ {
142
+ roaring_bitmap_t *data = get_bitmap(self);
143
+
144
+ uint32_t rank = NUM2UINT32(rankv);
145
+ uint32_t val;
146
+
147
+ if (roaring_bitmap_select(data, rank, &val)) {
148
+ return UINT2NUM(val);
149
+ } else {
150
+ return Qnil;
151
+ }
152
+ return self;
153
+ }
154
+
155
+ static VALUE rb_roaring_min(VALUE self)
156
+ {
157
+ roaring_bitmap_t *data = get_bitmap(self);
158
+
159
+ if (roaring_bitmap_is_empty(data)) {
160
+ return Qnil;
161
+ } else {
162
+ uint32_t val = roaring_bitmap_minimum(data);
163
+ return UINT2NUM(val);
164
+ }
165
+ }
166
+
167
+ static VALUE rb_roaring_max(VALUE self)
168
+ {
169
+ roaring_bitmap_t *data = get_bitmap(self);
170
+
171
+ if (roaring_bitmap_is_empty(data)) {
172
+ return Qnil;
173
+ } else {
174
+ uint32_t val = roaring_bitmap_maximum(data);
175
+ return UINT2NUM(val);
176
+ }
177
+ }
178
+
179
+ static VALUE rb_roaring_run_optimize(VALUE self)
180
+ {
181
+ roaring_bitmap_t *data = get_bitmap(self);
182
+ return RBOOL(roaring_bitmap_run_optimize(data));
183
+ }
184
+
185
+ static VALUE rb_roaring_serialize(VALUE self)
186
+ {
187
+ roaring_bitmap_t *data = get_bitmap(self);
188
+
189
+ size_t size = roaring_bitmap_portable_size_in_bytes(data);
190
+ VALUE str = rb_str_buf_new(size);
191
+
192
+ size_t written = roaring_bitmap_portable_serialize(data, RSTRING_PTR(str));
193
+ rb_str_set_len(str, written);
194
+
195
+ return str;
196
+ }
197
+
198
+ static VALUE rb_roaring_deserialize(VALUE self, VALUE str)
199
+ {
200
+ roaring_bitmap_t *bitmap = roaring_bitmap_portable_deserialize_safe(RSTRING_PTR(str), RSTRING_LEN(str));
201
+
202
+ return TypedData_Wrap_Struct(cRoaringBitmap, &roaring_type, bitmap);
203
+ }
204
+
205
+ typedef roaring_bitmap_t *binary_func(const roaring_bitmap_t *, const roaring_bitmap_t *);
206
+ static VALUE rb_roaring_binary_op(VALUE self, VALUE other, binary_func func) {
207
+ roaring_bitmap_t *self_data = get_bitmap(self);
208
+ roaring_bitmap_t *other_data = get_bitmap(other);
209
+
210
+ roaring_bitmap_t *result = func(self_data, other_data);
211
+
212
+ return TypedData_Wrap_Struct(cRoaringBitmap, &roaring_type, result);
213
+ }
214
+
215
+ typedef bool binary_func_bool(const roaring_bitmap_t *, const roaring_bitmap_t *);
216
+ static VALUE rb_roaring_binary_op_bool(VALUE self, VALUE other, binary_func_bool func) {
217
+ roaring_bitmap_t *self_data = get_bitmap(self);
218
+ roaring_bitmap_t *other_data = get_bitmap(other);
219
+
220
+ bool result = func(self_data, other_data);
221
+ return RBOOL(result);
222
+ }
223
+
224
+
225
+ static VALUE rb_roaring_and(VALUE self, VALUE other)
226
+ {
227
+ return rb_roaring_binary_op(self, other, roaring_bitmap_and);
228
+ }
229
+
230
+ static VALUE rb_roaring_or(VALUE self, VALUE other)
231
+ {
232
+ return rb_roaring_binary_op(self, other, roaring_bitmap_or);
233
+ }
234
+
235
+ static VALUE rb_roaring_xor(VALUE self, VALUE other)
236
+ {
237
+ return rb_roaring_binary_op(self, other, roaring_bitmap_xor);
238
+ }
239
+
240
+ static VALUE rb_roaring_andnot(VALUE self, VALUE other)
241
+ {
242
+ return rb_roaring_binary_op(self, other, roaring_bitmap_andnot);
243
+ }
244
+
245
+ static VALUE rb_roaring_eq(VALUE self, VALUE other)
246
+ {
247
+ return rb_roaring_binary_op_bool(self, other, roaring_bitmap_equals);
248
+ }
249
+
250
+ static VALUE rb_roaring_lt(VALUE self, VALUE other)
251
+ {
252
+ return rb_roaring_binary_op_bool(self, other, roaring_bitmap_is_strict_subset);
253
+ }
254
+
255
+ static VALUE rb_roaring_lte(VALUE self, VALUE other)
256
+ {
257
+ return rb_roaring_binary_op_bool(self, other, roaring_bitmap_is_subset);
258
+ }
259
+
260
+ static VALUE rb_roaring_intersect_p(VALUE self, VALUE other)
261
+ {
262
+ return rb_roaring_binary_op_bool(self, other, roaring_bitmap_intersect);
263
+ }
264
+
265
+ void
266
+ Init_roaring(void)
267
+ {
268
+ rb_mRoaring = rb_define_module("Roaring");
269
+
270
+ cRoaringBitmap = rb_define_class_under(rb_mRoaring, "Bitmap", rb_cObject);
271
+ rb_define_alloc_func(cRoaringBitmap, rb_roaring_alloc);
272
+ rb_define_method(cRoaringBitmap, "initialize_copy", rb_roaring_initialize_copy, 1);
273
+ rb_define_method(cRoaringBitmap, "empty?", rb_roaring_empty_p, 0);
274
+ rb_define_method(cRoaringBitmap, "clear", rb_roaring_clear, 0);
275
+ rb_define_method(cRoaringBitmap, "cardinality", rb_roaring_cardinality, 0);
276
+ rb_define_method(cRoaringBitmap, "add", rb_roaring_add, 1);
277
+ rb_define_method(cRoaringBitmap, "add?", rb_roaring_add_p, 1);
278
+ rb_define_method(cRoaringBitmap, "<<", rb_roaring_add, 1);
279
+ rb_define_method(cRoaringBitmap, "remove", rb_roaring_remove, 1);
280
+ rb_define_method(cRoaringBitmap, "remove?", rb_roaring_remove_p, 1);
281
+ rb_define_method(cRoaringBitmap, "include?", rb_roaring_include_p, 1);
282
+ rb_define_method(cRoaringBitmap, "each", rb_roaring_each, 0);
283
+ rb_define_method(cRoaringBitmap, "[]", rb_roaring_aref, 1);
284
+
285
+ rb_define_method(cRoaringBitmap, "&", rb_roaring_and, 1);
286
+ rb_define_method(cRoaringBitmap, "|", rb_roaring_or, 1);
287
+ rb_define_method(cRoaringBitmap, "^", rb_roaring_xor, 1);
288
+ rb_define_method(cRoaringBitmap, "-", rb_roaring_andnot, 1);
289
+
290
+ rb_define_method(cRoaringBitmap, "==", rb_roaring_eq, 1);
291
+ rb_define_method(cRoaringBitmap, "<", rb_roaring_lt, 1);
292
+ rb_define_method(cRoaringBitmap, "<=", rb_roaring_lte, 1);
293
+ rb_define_method(cRoaringBitmap, "intersect?", rb_roaring_intersect_p, 1);
294
+
295
+ rb_define_method(cRoaringBitmap, "min", rb_roaring_min, 0);
296
+ rb_define_method(cRoaringBitmap, "max", rb_roaring_max, 0);
297
+
298
+ rb_define_method(cRoaringBitmap, "run_optimize", rb_roaring_run_optimize, 0);
299
+
300
+ rb_define_method(cRoaringBitmap, "serialize", rb_roaring_serialize, 0);
301
+ rb_define_singleton_method(cRoaringBitmap, "deserialize", rb_roaring_deserialize, 1);
302
+ }
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "mkmf"
4
+
5
+ submodule = "#{__dir__}/roaring/"
6
+
7
+ $objs = ["cext.o", "#{submodule}/roaring.o"]
8
+ $CPPFLAGS += " -I#{submodule} "
9
+
10
+ create_makefile("roaring/roaring")
@@ -0,0 +1,235 @@
1
+ The CRoaring project is under a dual license (Apache/MIT).
2
+ Users of the library may choose one or the other license.
3
+
4
+ ------------------
5
+
6
+ Apache License
7
+ Version 2.0, January 2004
8
+ http://www.apache.org/licenses/
9
+
10
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
11
+
12
+ 1. Definitions.
13
+
14
+ "License" shall mean the terms and conditions for use, reproduction,
15
+ and distribution as defined by Sections 1 through 9 of this document.
16
+
17
+ "Licensor" shall mean the copyright owner or entity authorized by
18
+ the copyright owner that is granting the License.
19
+
20
+ "Legal Entity" shall mean the union of the acting entity and all
21
+ other entities that control, are controlled by, or are under common
22
+ control with that entity. For the purposes of this definition,
23
+ "control" means (i) the power, direct or indirect, to cause the
24
+ direction or management of such entity, whether by contract or
25
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
26
+ outstanding shares, or (iii) beneficial ownership of such entity.
27
+
28
+ "You" (or "Your") shall mean an individual or Legal Entity
29
+ exercising permissions granted by this License.
30
+
31
+ "Source" form shall mean the preferred form for making modifications,
32
+ including but not limited to software source code, documentation
33
+ source, and configuration files.
34
+
35
+ "Object" form shall mean any form resulting from mechanical
36
+ transformation or translation of a Source form, including but
37
+ not limited to compiled object code, generated documentation,
38
+ and conversions to other media types.
39
+
40
+ "Work" shall mean the work of authorship, whether in Source or
41
+ Object form, made available under the License, as indicated by a
42
+ copyright notice that is included in or attached to the work
43
+ (an example is provided in the Appendix below).
44
+
45
+ "Derivative Works" shall mean any work, whether in Source or Object
46
+ form, that is based on (or derived from) the Work and for which the
47
+ editorial revisions, annotations, elaborations, or other modifications
48
+ represent, as a whole, an original work of authorship. For the purposes
49
+ of this License, Derivative Works shall not include works that remain
50
+ separable from, or merely link (or bind by name) to the interfaces of,
51
+ the Work and Derivative Works thereof.
52
+
53
+ "Contribution" shall mean any work of authorship, including
54
+ the original version of the Work and any modifications or additions
55
+ to that Work or Derivative Works thereof, that is intentionally
56
+ submitted to Licensor for inclusion in the Work by the copyright owner
57
+ or by an individual or Legal Entity authorized to submit on behalf of
58
+ the copyright owner. For the purposes of this definition, "submitted"
59
+ means any form of electronic, verbal, or written communication sent
60
+ to the Licensor or its representatives, including but not limited to
61
+ communication on electronic mailing lists, source code control systems,
62
+ and issue tracking systems that are managed by, or on behalf of, the
63
+ Licensor for the purpose of discussing and improving the Work, but
64
+ excluding communication that is conspicuously marked or otherwise
65
+ designated in writing by the copyright owner as "Not a Contribution."
66
+
67
+ "Contributor" shall mean Licensor and any individual or Legal Entity
68
+ on behalf of whom a Contribution has been received by Licensor and
69
+ subsequently incorporated within the Work.
70
+
71
+ 2. Grant of Copyright License. Subject to the terms and conditions of
72
+ this License, each Contributor hereby grants to You a perpetual,
73
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
74
+ copyright license to reproduce, prepare Derivative Works of,
75
+ publicly display, publicly perform, sublicense, and distribute the
76
+ Work and such Derivative Works in Source or Object form.
77
+
78
+ 3. Grant of Patent License. Subject to the terms and conditions of
79
+ this License, each Contributor hereby grants to You a perpetual,
80
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
81
+ (except as stated in this section) patent license to make, have made,
82
+ use, offer to sell, sell, import, and otherwise transfer the Work,
83
+ where such license applies only to those patent claims licensable
84
+ by such Contributor that are necessarily infringed by their
85
+ Contribution(s) alone or by combination of their Contribution(s)
86
+ with the Work to which such Contribution(s) was submitted. If You
87
+ institute patent litigation against any entity (including a
88
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
89
+ or a Contribution incorporated within the Work constitutes direct
90
+ or contributory patent infringement, then any patent licenses
91
+ granted to You under this License for that Work shall terminate
92
+ as of the date such litigation is filed.
93
+
94
+ 4. Redistribution. You may reproduce and distribute copies of the
95
+ Work or Derivative Works thereof in any medium, with or without
96
+ modifications, and in Source or Object form, provided that You
97
+ meet the following conditions:
98
+
99
+ (a) You must give any other recipients of the Work or
100
+ Derivative Works a copy of this License; and
101
+
102
+ (b) You must cause any modified files to carry prominent notices
103
+ stating that You changed the files; and
104
+
105
+ (c) You must retain, in the Source form of any Derivative Works
106
+ that You distribute, all copyright, patent, trademark, and
107
+ attribution notices from the Source form of the Work,
108
+ excluding those notices that do not pertain to any part of
109
+ the Derivative Works; and
110
+
111
+ (d) If the Work includes a "NOTICE" text file as part of its
112
+ distribution, then any Derivative Works that You distribute must
113
+ include a readable copy of the attribution notices contained
114
+ within such NOTICE file, excluding those notices that do not
115
+ pertain to any part of the Derivative Works, in at least one
116
+ of the following places: within a NOTICE text file distributed
117
+ as part of the Derivative Works; within the Source form or
118
+ documentation, if provided along with the Derivative Works; or,
119
+ within a display generated by the Derivative Works, if and
120
+ wherever such third-party notices normally appear. The contents
121
+ of the NOTICE file are for informational purposes only and
122
+ do not modify the License. You may add Your own attribution
123
+ notices within Derivative Works that You distribute, alongside
124
+ or as an addendum to the NOTICE text from the Work, provided
125
+ that such additional attribution notices cannot be construed
126
+ as modifying the License.
127
+
128
+ You may add Your own copyright statement to Your modifications and
129
+ may provide additional or different license terms and conditions
130
+ for use, reproduction, or distribution of Your modifications, or
131
+ for any such Derivative Works as a whole, provided Your use,
132
+ reproduction, and distribution of the Work otherwise complies with
133
+ the conditions stated in this License.
134
+
135
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
136
+ any Contribution intentionally submitted for inclusion in the Work
137
+ by You to the Licensor shall be under the terms and conditions of
138
+ this License, without any additional terms or conditions.
139
+ Notwithstanding the above, nothing herein shall supersede or modify
140
+ the terms of any separate license agreement you may have executed
141
+ with Licensor regarding such Contributions.
142
+
143
+ 6. Trademarks. This License does not grant permission to use the trade
144
+ names, trademarks, service marks, or product names of the Licensor,
145
+ except as required for reasonable and customary use in describing the
146
+ origin of the Work and reproducing the content of the NOTICE file.
147
+
148
+ 7. Disclaimer of Warranty. Unless required by applicable law or
149
+ agreed to in writing, Licensor provides the Work (and each
150
+ Contributor provides its Contributions) on an "AS IS" BASIS,
151
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
152
+ implied, including, without limitation, any warranties or conditions
153
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
154
+ PARTICULAR PURPOSE. You are solely responsible for determining the
155
+ appropriateness of using or redistributing the Work and assume any
156
+ risks associated with Your exercise of permissions under this License.
157
+
158
+ 8. Limitation of Liability. In no event and under no legal theory,
159
+ whether in tort (including negligence), contract, or otherwise,
160
+ unless required by applicable law (such as deliberate and grossly
161
+ negligent acts) or agreed to in writing, shall any Contributor be
162
+ liable to You for damages, including any direct, indirect, special,
163
+ incidental, or consequential damages of any character arising as a
164
+ result of this License or out of the use or inability to use the
165
+ Work (including but not limited to damages for loss of goodwill,
166
+ work stoppage, computer failure or malfunction, or any and all
167
+ other commercial damages or losses), even if such Contributor
168
+ has been advised of the possibility of such damages.
169
+
170
+ 9. Accepting Warranty or Additional Liability. While redistributing
171
+ the Work or Derivative Works thereof, You may choose to offer,
172
+ and charge a fee for, acceptance of support, warranty, indemnity,
173
+ or other liability obligations and/or rights consistent with this
174
+ License. However, in accepting such obligations, You may act only
175
+ on Your own behalf and on Your sole responsibility, not on behalf
176
+ of any other Contributor, and only if You agree to indemnify,
177
+ defend, and hold each Contributor harmless for any liability
178
+ incurred by, or claims asserted against, such Contributor by reason
179
+ of your accepting any such warranty or additional liability.
180
+
181
+ END OF TERMS AND CONDITIONS
182
+
183
+ APPENDIX: How to apply the Apache License to your work.
184
+
185
+ To apply the Apache License to your work, attach the following
186
+ boilerplate notice, with the fields enclosed by brackets "{}"
187
+ replaced with your own identifying information. (Don't include
188
+ the brackets!) The text should be enclosed in the appropriate
189
+ comment syntax for the file format. We also recommend that a
190
+ file or class name and description of purpose be included on the
191
+ same "printed page" as the copyright notice for easier
192
+ identification within third-party archives.
193
+
194
+ Copyright 2016-2022 The CRoaring authors
195
+
196
+ Licensed under the Apache License, Version 2.0 (the "License");
197
+ you may not use this file except in compliance with the License.
198
+ You may obtain a copy of the License at
199
+
200
+ http://www.apache.org/licenses/LICENSE-2.0
201
+
202
+ Unless required by applicable law or agreed to in writing, software
203
+ distributed under the License is distributed on an "AS IS" BASIS,
204
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
205
+ See the License for the specific language governing permissions and
206
+ limitations under the License.
207
+
208
+ -----------------------------------
209
+
210
+ MIT License
211
+
212
+ Copyright 2016-2022 The CRoaring authors
213
+
214
+ Permission is hereby granted, free of charge, to any
215
+ person obtaining a copy of this software and associated
216
+ documentation files (the "Software"), to deal in the
217
+ Software without restriction, including without
218
+ limitation the rights to use, copy, modify, merge,
219
+ publish, distribute, sublicense, and/or sell copies of
220
+ the Software, and to permit persons to whom the Software
221
+ is furnished to do so, subject to the following
222
+ conditions:
223
+
224
+ The above copyright notice and this permission notice
225
+ shall be included in all copies or substantial portions
226
+ of the Software.
227
+
228
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
229
+ ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
230
+ TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
231
+ PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
232
+ SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
233
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
234
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
235
+ IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
@@ -0,0 +1,42 @@
1
+ # CRoaringUnityBuild
2
+ Dumps of CRoaring unity builds (for convenience)
3
+
4
+ This code is automatically generated from https://github.com/RoaringBitmap/CRoaring
5
+
6
+ ## Building
7
+
8
+ ```bash
9
+ echo -e "#include <roaring.hh>\n int main(){Roaring x;}" > test.cpp && cc -c roaring.c -I. -std=c11 && c++ -o test test.cpp roaring.o -I. -std=c++11
10
+ ```
11
+
12
+ You need to compile and link `roaring.c` with your project: this is not a header-only build.
13
+
14
+ ## Usage (C)
15
+
16
+ ```C
17
+ #include <stdio.h>
18
+ #include "roaring.c"
19
+ int main() {
20
+ roaring_bitmap_t *r1 = roaring_bitmap_create();
21
+ for (uint32_t i = 100; i < 1000; i++) roaring_bitmap_add(r1, i);
22
+ printf("cardinality = %d\n", (int) roaring_bitmap_get_cardinality(r1));
23
+ roaring_bitmap_free(r1);
24
+ return 0;
25
+ }
26
+ ```
27
+ ## Usage (C++)
28
+
29
+
30
+ ```C++
31
+ #include <iostream>
32
+ #include "roaring.hh"
33
+ #include "roaring.c"
34
+ int main() {
35
+ Roaring r1;
36
+ for (uint32_t i = 100; i < 1000; i++) {
37
+ r1.add(i);
38
+ }
39
+ std::cout << "cardinality = " << r1.cardinality() << std::endl;
40
+  return 0;
41
+ }
42
+ ```