1- /* auto-generated on Fri Mar 15 10:33:21 CST 2019. Do not edit! */
1+ /* auto-generated on Wed Sep 11 23:36:34 CST 2019. Do not edit! */
22#include "roaring.h"
33
44/* used for http://dmalloc.com/ Dmalloc - Debug Malloc Library */
55#ifdef DMALLOC
66#include "dmalloc.h"
77#endif
88
9- /* begin file /data/zeromax/CRoaring-0.2.60/ src/array_util.c */
9+ /* begin file src/array_util.c */
1010#include <assert.h>
1111#include <stdbool.h>
1212#include <stdint.h>
@@ -515,6 +515,10 @@ int32_t intersect_vector16_cardinality(const uint16_t *__restrict__ A,
515515 return (int32_t )count ;
516516}
517517
518+ /////////
519+ // Warning:
520+ // This function may not be safe if A == C or B == C.
521+ /////////
518522int32_t difference_vector16 (const uint16_t * __restrict__ A , size_t s_a ,
519523 const uint16_t * __restrict__ B , size_t s_b ,
520524 uint16_t * C ) {
@@ -638,7 +642,16 @@ int32_t difference_vector16(const uint16_t *__restrict__ A, size_t s_a,
638642 }
639643 }
640644 if (i_a < s_a ) {
641- memmove (C + count , A + i_a , sizeof (uint16_t ) * (s_a - i_a ));
645+ if (C == A ) {
646+ assert (count <= i_a );
647+ if (count < i_a ) {
648+ memmove (C + count , A + i_a , sizeof (uint16_t ) * (s_a - i_a ));
649+ }
650+ } else {
651+ for (size_t i = 0 ; i < (s_a - i_a ); i ++ ) {
652+ C [count + i ] = A [i + i_a ];
653+ }
654+ }
642655 count += (int32_t )(s_a - i_a );
643656 }
644657 return count ;
@@ -1553,6 +1566,7 @@ static int uint16_compare(const void *a, const void *b) {
15531566}
15541567
15551568// a one-pass SSE union algorithm
1569+ // This function may not be safe if array1 == output or array2 == output.
15561570uint32_t union_vector16 (const uint16_t * __restrict__ array1 , uint32_t length1 ,
15571571 const uint16_t * __restrict__ array2 , uint32_t length2 ,
15581572 uint16_t * __restrict__ output ) {
@@ -1946,8 +1960,8 @@ bool memequals(const void *s1, const void *s2, size_t n) {
19461960 return memcmp (s1 , s2 , n ) == 0 ;
19471961#endif
19481962}
1949- /* end file /data/zeromax/CRoaring-0.2.60/ src/array_util.c */
1950- /* begin file /data/zeromax/CRoaring-0.2.60/ src/bitset_util.c */
1963+ /* end file src/array_util.c */
1964+ /* begin file src/bitset_util.c */
19511965#include <assert.h>
19521966#include <stdint.h>
19531967#include <stdio.h>
@@ -2874,8 +2888,8 @@ void bitset_flip_list(void *bitset, const uint16_t *list, uint64_t length) {
28742888 list ++ ;
28752889 }
28762890}
2877- /* end file /data/zeromax/CRoaring-0.2.60/ src/bitset_util.c */
2878- /* begin file /data/zeromax/CRoaring-0.2.60/ src/containers/array.c */
2891+ /* end file src/bitset_util.c */
2892+ /* begin file src/containers/array.c */
28792893/*
28802894 * array.c
28812895 *
@@ -3063,9 +3077,15 @@ void array_container_andnot(const array_container_t *array_1,
30633077 if (out -> capacity < array_1 -> cardinality )
30643078 array_container_grow (out , array_1 -> cardinality , false);
30653079#ifdef ROARING_VECTOR_OPERATIONS_ENABLED
3066- out -> cardinality =
3067- difference_vector16 (array_1 -> array , array_1 -> cardinality ,
3080+ if ((out != array_1 ) && (out != array_2 )) {
3081+ out -> cardinality =
3082+ difference_vector16 (array_1 -> array , array_1 -> cardinality ,
30683083 array_2 -> array , array_2 -> cardinality , out -> array );
3084+ } else {
3085+ out -> cardinality =
3086+ difference_uint16 (array_1 -> array , array_1 -> cardinality , array_2 -> array ,
3087+ array_2 -> cardinality , out -> array );
3088+ }
30693089#else
30703090 out -> cardinality =
30713091 difference_uint16 (array_1 -> array , array_1 -> cardinality , array_2 -> array ,
@@ -3371,8 +3391,8 @@ bool array_container_iterate64(const array_container_t *cont, uint32_t base,
33713391 return false;
33723392 return true;
33733393}
3374- /* end file /data/zeromax/CRoaring-0.2.60/ src/containers/array.c */
3375- /* begin file /data/zeromax/CRoaring-0.2.60/ src/containers/bitset.c */
3394+ /* end file src/containers/array.c */
3395+ /* begin file src/containers/bitset.c */
33763396/*
33773397 * bitset.c
33783398 *
@@ -3392,7 +3412,7 @@ extern inline void bitset_container_set(bitset_container_t *bitset, uint16_t pos
33923412extern inline void bitset_container_unset (bitset_container_t * bitset , uint16_t pos );
33933413extern inline bool bitset_container_get (const bitset_container_t * bitset ,
33943414 uint16_t pos );
3395- extern inline int32_t bitset_container_serialized_size_in_bytes ();
3415+ extern inline int32_t bitset_container_serialized_size_in_bytes (void );
33963416extern inline bool bitset_container_add (bitset_container_t * bitset , uint16_t pos );
33973417extern inline bool bitset_container_remove (bitset_container_t * bitset , uint16_t pos );
33983418extern inline bool bitset_container_contains (const bitset_container_t * bitset ,
@@ -3420,7 +3440,7 @@ bitset_container_t *bitset_container_create(void) {
34203440 return NULL ;
34213441 }
34223442 // sizeof(__m256i) == 32
3423- bitset -> array = (uint64_t * )aligned_malloc (
3443+ bitset -> array = (uint64_t * )roaring_bitmap_aligned_malloc (
34243444 32 , sizeof (uint64_t ) * BITSET_CONTAINER_SIZE_IN_WORDS );
34253445 if (!bitset -> array ) {
34263446 free (bitset );
@@ -3469,7 +3489,7 @@ void bitset_container_add_from_range(bitset_container_t *bitset, uint32_t min,
34693489/* Free memory. */
34703490void bitset_container_free (bitset_container_t * bitset ) {
34713491 if (bitset -> array != NULL ) {// Jon Strabala reports that some tools complain otherwise
3472- aligned_free (bitset -> array );
3492+ roaring_bitmap_aligned_free (bitset -> array );
34733493 bitset -> array = NULL ; // pedantic
34743494 }
34753495 free (bitset );
@@ -3484,7 +3504,7 @@ bitset_container_t *bitset_container_clone(const bitset_container_t *src) {
34843504 return NULL ;
34853505 }
34863506 // sizeof(__m256i) == 32
3487- bitset -> array = (uint64_t * )aligned_malloc (
3507+ bitset -> array = (uint64_t * )roaring_bitmap_aligned_malloc (
34883508 32 , sizeof (uint64_t ) * BITSET_CONTAINER_SIZE_IN_WORDS );
34893509 if (!bitset -> array ) {
34903510 free (bitset );
@@ -3918,7 +3938,7 @@ void* bitset_container_deserialize(const char *buf, size_t buf_len) {
39183938 if ((ptr = (bitset_container_t * )malloc (sizeof (bitset_container_t ))) != NULL ) {
39193939 memcpy (ptr , buf , sizeof (bitset_container_t ));
39203940 // sizeof(__m256i) == 32
3921- ptr -> array = (uint64_t * ) aligned_malloc (32 , l );
3941+ ptr -> array = (uint64_t * ) roaring_bitmap_aligned_malloc (32 , l );
39223942 if (! ptr -> array ) {
39233943 free (ptr );
39243944 return NULL ;
@@ -4060,19 +4080,16 @@ uint16_t bitset_container_maximum(const bitset_container_t *container) {
40604080
40614081/* Returns the number of values equal or smaller than x */
40624082int bitset_container_rank (const bitset_container_t * container , uint16_t x ) {
4063- uint32_t x32 = x ;
4083+ // credit: aqrit
40644084 int sum = 0 ;
4065- uint32_t k = 0 ;
4066- for (; k + 63 <= x32 ; k += 64 ) {
4067- sum += hamming (container -> array [k / 64 ]);
4085+ int i = 0 ;
4086+ for (int end = x / 64 ; i < end ; i ++ ) {
4087+ sum += hamming (container -> array [i ]);
40684088 }
4069- // at this point, we have covered everything up to k, k not included.
4070- // we have that k < x, but not so large that k+63<=x
4071- // k is a power of 64
4072- int bitsleft = x32 - k + 1 ;// will be in [0,64)
4073- uint64_t leftoverword = container -> array [k / 64 ];// k / 64 should be within scope
4074- leftoverword = leftoverword & ((UINT64_C (1 ) << bitsleft ) - 1 );
4075- sum += hamming (leftoverword );
4089+ uint64_t lastword = container -> array [i ];
4090+ uint64_t lastpos = UINT64_C (1 ) << (x % 64 );
4091+ uint64_t mask = lastpos + lastpos - 1 ; // smear right
4092+ sum += hamming (lastword & mask );
40764093 return sum ;
40774094}
40784095
@@ -4090,8 +4107,8 @@ int bitset_container_index_equalorlarger(const bitset_container_t *container, ui
40904107 }
40914108 return k * 64 + __builtin_ctzll (word );
40924109}
4093- /* end file /data/zeromax/CRoaring-0.2.60/ src/containers/bitset.c */
4094- /* begin file /data/zeromax/CRoaring-0.2.60/ src/containers/containers.c */
4110+ /* end file src/containers/bitset.c */
4111+ /* begin file src/containers/containers.c */
40954112
40964113
40974114extern inline const void * container_unwrap_shared (
@@ -4361,8 +4378,8 @@ extern inline void *container_lazy_ixor(void *c1, uint8_t type1, const void *c2,
43614378
43624379extern inline void * container_andnot (const void * c1 , uint8_t type1 , const void * c2 ,
43634380 uint8_t type2 , uint8_t * result_type );
4364- /* end file /data/zeromax/CRoaring-0.2.60/ src/containers/containers.c */
4365- /* begin file /data/zeromax/CRoaring-0.2.60/ src/containers/convert.c */
4381+ /* end file src/containers/containers.c */
4382+ /* begin file src/containers/convert.c */
43664383#include <stdio.h>
43674384
43684385
@@ -4669,8 +4686,8 @@ bitset_container_t *bitset_container_from_run_range(const run_container_t *run,
46694686 bitset -> cardinality = union_cardinality ;
46704687 return bitset ;
46714688}
4672- /* end file /data/zeromax/CRoaring-0.2.60/ src/containers/convert.c */
4673- /* begin file /data/zeromax/CRoaring-0.2.60/ src/containers/mixed_andnot.c */
4689+ /* end file src/containers/convert.c */
4690+ /* begin file src/containers/mixed_andnot.c */
46744691/*
46754692 * mixed_andnot.c. More methods since operation is not symmetric,
46764693 * except no "wide" andnot , so no lazy options motivated.
@@ -5172,8 +5189,8 @@ bool bitset_bitset_container_iandnot(bitset_container_t *src_1,
51725189 return true;
51735190 }
51745191}
5175- /* end file /data/zeromax/CRoaring-0.2.60/ src/containers/mixed_andnot.c */
5176- /* begin file /data/zeromax/CRoaring-0.2.60/ src/containers/mixed_equal.c */
5192+ /* end file src/containers/mixed_andnot.c */
5193+ /* begin file src/containers/mixed_equal.c */
51775194
51785195bool array_container_equal_bitset (const array_container_t * container1 ,
51795196 const bitset_container_t * container2 ) {
@@ -5250,8 +5267,8 @@ bool run_container_equals_bitset(const run_container_t* container1,
52505267
52515268 return true;
52525269}
5253- /* end file /data/zeromax/CRoaring-0.2.60/ src/containers/mixed_equal.c */
5254- /* begin file /data/zeromax/CRoaring-0.2.60/ src/containers/mixed_intersection.c */
5270+ /* end file src/containers/mixed_equal.c */
5271+ /* begin file src/containers/mixed_intersection.c */
52555272/*
52565273 * mixed_intersection.c
52575274 *
@@ -5592,8 +5609,8 @@ bool bitset_bitset_container_intersection_inplace(
55925609 }
55935610 return false; // not a bitset
55945611}
5595- /* end file /data/zeromax/CRoaring-0.2.60/ src/containers/mixed_intersection.c */
5596- /* begin file /data/zeromax/CRoaring-0.2.60/ src/containers/mixed_negation.c */
5612+ /* end file src/containers/mixed_intersection.c */
5613+ /* begin file src/containers/mixed_negation.c */
55975614/*
55985615 * mixed_negation.c
55995616 *
@@ -5921,8 +5938,8 @@ int run_container_negation_range_inplace(run_container_t *src,
59215938
59225939 return return_typecode ;
59235940}
5924- /* end file /data/zeromax/CRoaring-0.2.60/ src/containers/mixed_negation.c */
5925- /* begin file /data/zeromax/CRoaring-0.2.60/ src/containers/mixed_subset.c */
5941+ /* end file src/containers/mixed_negation.c */
5942+ /* begin file src/containers/mixed_subset.c */
59265943
59275944bool array_container_is_subset_bitset (const array_container_t * container1 ,
59285945 const bitset_container_t * container2 ) {
@@ -6054,8 +6071,8 @@ bool bitset_container_is_subset_run(const bitset_container_t* container1,
60546071 }
60556072 return true;
60566073}
6057- /* end file /data/zeromax/CRoaring-0.2.60/ src/containers/mixed_subset.c */
6058- /* begin file /data/zeromax/CRoaring-0.2.60/ src/containers/mixed_union.c */
6074+ /* end file src/containers/mixed_subset.c */
6075+ /* begin file src/containers/mixed_union.c */
60596076/*
60606077 * mixed_union.c
60616078 *
@@ -6252,7 +6269,7 @@ bool array_array_container_inplace_union(array_container_t *src_1,
62526269 return false; // not a bitset
62536270 } else {
62546271 memmove (src_1 -> array + src_2 -> cardinality , src_1 -> array , src_1 -> cardinality * sizeof (uint16_t ));
6255- src_1 -> cardinality = (int32_t )fast_union_uint16 (src_1 -> array + src_2 -> cardinality , src_1 -> cardinality ,
6272+ src_1 -> cardinality = (int32_t )union_uint16 (src_1 -> array + src_2 -> cardinality , src_1 -> cardinality ,
62566273 src_2 -> array , src_2 -> cardinality , src_1 -> array );
62576274 return false; // not a bitset
62586275 }
@@ -6324,7 +6341,7 @@ bool array_array_container_lazy_inplace_union(array_container_t *src_1,
63246341 return false; // not a bitset
63256342 } else {
63266343 memmove (src_1 -> array + src_2 -> cardinality , src_1 -> array , src_1 -> cardinality * sizeof (uint16_t ));
6327- src_1 -> cardinality = (int32_t )fast_union_uint16 (src_1 -> array + src_2 -> cardinality , src_1 -> cardinality ,
6344+ src_1 -> cardinality = (int32_t )union_uint16 (src_1 -> array + src_2 -> cardinality , src_1 -> cardinality ,
63286345 src_2 -> array , src_2 -> cardinality , src_1 -> array );
63296346 return false; // not a bitset
63306347 }
@@ -6339,8 +6356,8 @@ bool array_array_container_lazy_inplace_union(array_container_t *src_1,
63396356 }
63406357 return returnval ;
63416358}
6342- /* end file /data/zeromax/CRoaring-0.2.60/ src/containers/mixed_union.c */
6343- /* begin file /data/zeromax/CRoaring-0.2.60/ src/containers/mixed_xor.c */
6359+ /* end file src/containers/mixed_union.c */
6360+ /* begin file src/containers/mixed_xor.c */
63446361/*
63456362 * mixed_xor.c
63466363 */
@@ -6681,8 +6698,8 @@ int run_run_container_ixor(run_container_t *src_1, const run_container_t *src_2,
66816698 run_container_free (src_1 );
66826699 return ans ;
66836700}
6684- /* end file /data/zeromax/CRoaring-0.2.60/ src/containers/mixed_xor.c */
6685- /* begin file /data/zeromax/CRoaring-0.2.60/ src/containers/run.c */
6701+ /* end file src/containers/mixed_xor.c */
6702+ /* begin file src/containers/run.c */
66866703#include <stdio.h>
66876704#include <stdlib.h>
66886705
@@ -7517,8 +7534,8 @@ int run_container_rank(const run_container_t *container, uint16_t x) {
75177534 }
75187535 return sum ;
75197536}
7520- /* end file /data/zeromax/CRoaring-0.2.60/ src/containers/run.c */
7521- /* begin file /data/zeromax/CRoaring-0.2.60/ src/roaring.c */
7537+ /* end file src/containers/run.c */
7538+ /* begin file src/roaring.c */
75227539#include <assert.h>
75237540#include <stdarg.h>
75247541#include <stdint.h>
@@ -8712,8 +8729,8 @@ uint64_t roaring_bitmap_range_cardinality(const roaring_bitmap_t *ra,
87128729 range_end -- ; // make range_end inclusive
87138730 // now we have: 0 <= range_start <= range_end <= UINT32_MAX
87148731
8715- int minhb = range_start >> 16 ;
8716- int maxhb = range_end >> 16 ;
8732+ uint16_t minhb = range_start >> 16 ;
8733+ uint16_t maxhb = range_end >> 16 ;
87178734
87188735 uint64_t card = 0 ;
87198736
@@ -10451,14 +10468,15 @@ roaring_bitmap_frozen_view(const char *buf, size_t length) {
1045110468 break ;
1045210469 }
1045310470 default :
10471+ free (arena );
1045410472 return NULL ;
1045510473 }
1045610474 }
1045710475
1045810476 return rb ;
1045910477}
10460- /* end file /data/zeromax/CRoaring-0.2.60/ src/roaring.c */
10461- /* begin file /data/zeromax/CRoaring-0.2.60/ src/roaring_array.c */
10478+ /* end file src/roaring.c */
10479+ /* begin file src/roaring_array.c */
1046210480#include <assert.h>
1046310481#include <stdbool.h>
1046410482#include <stdio.h>
@@ -11375,8 +11393,8 @@ bool ra_portable_deserialize(roaring_array_t *answer, const char *buf, const siz
1137511393 }
1137611394 return true;
1137711395}
11378- /* end file /data/zeromax/CRoaring-0.2.60/ src/roaring_array.c */
11379- /* begin file /data/zeromax/CRoaring-0.2.60/ src/roaring_priority_queue.c */
11396+ /* end file src/roaring_array.c */
11397+ /* begin file src/roaring_priority_queue.c */
1138011398
1138111399struct roaring_pq_element_s {
1138211400 uint64_t size ;
@@ -11617,4 +11635,4 @@ roaring_bitmap_t *roaring_bitmap_or_many_heap(uint32_t number,
1161711635 pq_free (pq );
1161811636 return answer ;
1161911637}
11620- /* end file /data/zeromax/CRoaring-0.2.60/ src/roaring_priority_queue.c */
11638+ /* end file src/roaring_priority_queue.c */
0 commit comments