diff --git a/include/roaring/roaring64.h b/include/roaring/roaring64.h index 4656ca840..e281bda53 100644 --- a/include/roaring/roaring64.h +++ b/include/roaring/roaring64.h @@ -29,7 +29,6 @@ typedef struct roaring64_leaf_s roaring64_leaf_t; */ typedef struct roaring64_bulk_context_s { uint8_t high_bytes[6]; - uint16_t low_bytes; roaring64_leaf_t *leaf; } roaring64_bulk_context_t; diff --git a/src/roaring64.c b/src/roaring64.c index d2bc9f164..d1c725a98 100644 --- a/src/roaring64.c +++ b/src/roaring64.c @@ -24,14 +24,13 @@ #else // CROARING_IS_BIG_ENDIAN // Gets compiled to bswap or equivalent on most compilers. -#define htobe64(x) \ - (((x & 0x00000000000000FFULL) << 56) | \ - ((x & 0x000000000000FF00ULL) << 40) | \ - ((x & 0x0000000000FF0000ULL) << 24) | \ - ((x & 0x00000000FF000000ULL) << 8) | \ - ((x & 0x000000FF00000000ULL) >> 8) | \ - ((x & 0x0000FF0000000000ULL) >> 24) | \ - ((x & 0x00FF000000000000ULL) >> 40) | \ +#define htobe64(x) \ + (((x & 0x00000000000000FFULL) << 56) | \ + ((x & 0x000000000000FF00ULL) << 40) | \ + ((x & 0x0000000000FF0000ULL) << 24) | \ + ((x & 0x00000000FF000000ULL) << 8) | ((x & 0x000000FF00000000ULL) >> 8) | \ + ((x & 0x0000FF0000000000ULL) >> 24) | \ + ((x & 0x00FF000000000000ULL) >> 40) | \ ((x & 0xFF00000000000000ULL) >> 56)) #endif // CROARING_IS_BIG_ENDIAN @@ -278,7 +277,6 @@ void roaring64_bitmap_add_bulk(roaring64_bitmap_t *r, // differ. context->leaf = containerptr_roaring64_bitmap_add(r, high48, low16, NULL); - context->low_bytes = low16; memcpy(context->high_bytes, high48, ART_KEY_BYTES); } } @@ -537,7 +535,6 @@ void roaring64_bitmap_remove_bulk(roaring64_bitmap_t *r, leaf_t *leaf = (leaf_t *)art_find(art, high48); context->leaf = containerptr_roaring64_bitmap_remove(r, high48, low16, leaf); - context->low_bytes = low16; memcpy(context->high_bytes, high48, ART_KEY_BYTES); } } @@ -627,6 +624,9 @@ uint64_t roaring64_bitmap_get_cardinality(const roaring64_bitmap_t *r) { uint64_t roaring64_bitmap_range_cardinality(const roaring64_bitmap_t *r, uint64_t min, uint64_t max) { + if (min >= max) { + return 0; + } max--; // A closed range is easier to work with. uint64_t cardinality = 0; diff --git a/tests/roaring64_unit.cpp b/tests/roaring64_unit.cpp index d48b2127b..9423ab252 100644 --- a/tests/roaring64_unit.cpp +++ b/tests/roaring64_unit.cpp @@ -384,6 +384,7 @@ DEFINE_TEST(test_range_cardinality) { roaring64_bitmap_add(r, 100002); roaring64_bitmap_add(r, 200000); + assert_true(roaring64_bitmap_range_cardinality(r, 0, 0) == 0); assert_true(roaring64_bitmap_range_cardinality(r, 0, 100000) == 1); assert_true(roaring64_bitmap_range_cardinality(r, 1, 100001) == 1); assert_true(roaring64_bitmap_range_cardinality(r, 0, 200001) == 5);