1
1
use crate :: Bitset ;
2
2
use ffi:: roaring_bitmap_t;
3
3
use std:: convert:: TryInto ;
4
- use std:: mem ;
4
+ use std:: ffi :: c_void ;
5
5
use std:: ops:: { Bound , RangeBounds } ;
6
+ use std:: { mem, ptr} ;
6
7
7
8
use super :: serialization:: { Deserializer , Serializer } ;
8
9
use super :: { Bitmap , Statistics } ;
@@ -25,7 +26,7 @@ impl Bitmap {
25
26
&& ffi:: ROARING_VERSION_MINOR == 3
26
27
&& ffi:: ROARING_VERSION_REVISION == 0
27
28
) ;
28
- ffi:: roaring_free ( p as * mut _ ) ;
29
+ ffi:: roaring_free ( p. cast :: < c_void > ( ) ) ;
29
30
result
30
31
}
31
32
@@ -41,6 +42,7 @@ impl Bitmap {
41
42
/// assert!(bitmap.is_empty());
42
43
/// ```
43
44
#[ inline]
45
+ #[ must_use]
44
46
pub fn create ( ) -> Self {
45
47
Self :: create_with_capacity ( 0 )
46
48
}
@@ -59,6 +61,7 @@ impl Bitmap {
59
61
/// ```
60
62
#[ inline]
61
63
#[ doc( alias = "roaring_bitmap_init_with_capacity" ) ]
64
+ #[ must_use]
62
65
pub fn create_with_capacity ( capacity : u32 ) -> Self {
63
66
let mut bitmap = mem:: MaybeUninit :: uninit ( ) ;
64
67
let success =
@@ -291,6 +294,7 @@ impl Bitmap {
291
294
/// ```
292
295
#[ inline]
293
296
#[ doc( alias = "roaring_bitmap_contains" ) ]
297
+ #[ must_use]
294
298
pub fn contains ( & self , element : u32 ) -> bool {
295
299
unsafe { ffi:: roaring_bitmap_contains ( & self . bitmap , element) }
296
300
}
@@ -313,6 +317,7 @@ impl Bitmap {
313
317
/// ```
314
318
#[ inline]
315
319
#[ doc( alias = "roaring_bitmap_add_offset" ) ]
320
+ #[ must_use]
316
321
pub fn add_offset ( & self , offset : i64 ) -> Self {
317
322
unsafe { Bitmap :: take_heap ( ffi:: roaring_bitmap_add_offset ( & self . bitmap , offset) ) }
318
323
}
@@ -358,6 +363,7 @@ impl Bitmap {
358
363
/// ```
359
364
#[ inline]
360
365
#[ doc( alias = "roaring_bitmap_get_cardinality" ) ]
366
+ #[ must_use]
361
367
pub fn cardinality ( & self ) -> u64 {
362
368
unsafe { ffi:: roaring_bitmap_get_cardinality ( & self . bitmap ) }
363
369
}
@@ -380,6 +386,7 @@ impl Bitmap {
380
386
/// ```
381
387
#[ inline]
382
388
#[ doc( alias = "roaring_bitmap_and" ) ]
389
+ #[ must_use]
383
390
pub fn and ( & self , other : & Self ) -> Self {
384
391
unsafe { Self :: take_heap ( ffi:: roaring_bitmap_and ( & self . bitmap , & other. bitmap ) ) }
385
392
}
@@ -434,6 +441,7 @@ impl Bitmap {
434
441
/// ```
435
442
#[ inline]
436
443
#[ doc( alias = "roaring_bitmap_or" ) ]
444
+ #[ must_use]
437
445
pub fn or ( & self , other : & Self ) -> Self {
438
446
unsafe { Self :: take_heap ( ffi:: roaring_bitmap_or ( & self . bitmap , & other. bitmap ) ) }
439
447
}
@@ -482,10 +490,11 @@ impl Bitmap {
482
490
/// ```
483
491
#[ inline]
484
492
#[ doc( alias = "roaring_bitmap_or_many" ) ]
493
+ #[ must_use]
485
494
pub fn fast_or ( bitmaps : & [ & Bitmap ] ) -> Self {
486
495
let mut bms: Vec < * const ffi:: roaring_bitmap_s > = bitmaps
487
496
. iter ( )
488
- . map ( |item| & item. bitmap as * const _ )
497
+ . map ( |item| ptr :: addr_of! ( item. bitmap) )
489
498
. collect ( ) ;
490
499
491
500
unsafe { Self :: take_heap ( ffi:: roaring_bitmap_or_many ( bms. len ( ) , bms. as_mut_ptr ( ) ) ) }
@@ -512,18 +521,16 @@ impl Bitmap {
512
521
/// ```
513
522
#[ inline]
514
523
#[ doc( alias = "roaring_bitmap_or_many_heap" ) ]
524
+ #[ must_use]
515
525
pub fn fast_or_heap ( bitmaps : & [ & Bitmap ] ) -> Self {
516
526
let mut bms: Vec < * const ffi:: roaring_bitmap_s > = bitmaps
517
527
. iter ( )
518
- . map ( |item| & item. bitmap as * const _ )
528
+ . map ( |item| ptr :: addr_of! ( item. bitmap) )
519
529
. collect ( ) ;
520
530
521
- unsafe {
522
- Self :: take_heap ( ffi:: roaring_bitmap_or_many_heap (
523
- bms. len ( ) as u32 ,
524
- bms. as_mut_ptr ( ) ,
525
- ) )
526
- }
531
+ let count = u32:: try_from ( bms. len ( ) ) . expect ( "can only or up to 2^32 bitmaps" ) ;
532
+
533
+ unsafe { Self :: take_heap ( ffi:: roaring_bitmap_or_many_heap ( count, bms. as_mut_ptr ( ) ) ) }
527
534
}
528
535
529
536
/// Computes the symmetric difference (xor) between two bitmaps
@@ -546,6 +553,7 @@ impl Bitmap {
546
553
/// ```
547
554
#[ inline]
548
555
#[ doc( alias = "roaring_bitmap_xor" ) ]
556
+ #[ must_use]
549
557
pub fn xor ( & self , other : & Self ) -> Self {
550
558
unsafe { Self :: take_heap ( ffi:: roaring_bitmap_xor ( & self . bitmap , & other. bitmap ) ) }
551
559
}
@@ -593,10 +601,11 @@ impl Bitmap {
593
601
/// ```
594
602
#[ inline]
595
603
#[ doc( alias = "roaring_bitmap_xor_many" ) ]
604
+ #[ must_use]
596
605
pub fn fast_xor ( bitmaps : & [ & Bitmap ] ) -> Self {
597
606
let mut bms: Vec < * const ffi:: roaring_bitmap_s > = bitmaps
598
607
. iter ( )
599
- . map ( |item| & item. bitmap as * const _ )
608
+ . map ( |item| ptr :: addr_of! ( item. bitmap) )
600
609
. collect ( ) ;
601
610
602
611
unsafe { Self :: take_heap ( ffi:: roaring_bitmap_xor_many ( bms. len ( ) , bms. as_mut_ptr ( ) ) ) }
@@ -621,6 +630,7 @@ impl Bitmap {
621
630
/// ```
622
631
#[ inline]
623
632
#[ doc( alias = "roaring_bitmap_andnot" ) ]
633
+ #[ must_use]
624
634
pub fn andnot ( & self , other : & Self ) -> Self {
625
635
unsafe { Self :: take_heap ( ffi:: roaring_bitmap_andnot ( & self . bitmap , & other. bitmap ) ) }
626
636
}
@@ -679,6 +689,7 @@ impl Bitmap {
679
689
/// ```
680
690
#[ inline]
681
691
#[ doc( alias = "roaring_bitmap_flip" ) ]
692
+ #[ must_use]
682
693
pub fn flip < R : RangeBounds < u32 > > ( & self , range : R ) -> Self {
683
694
let ( start, end) = range_to_exclusive ( range) ;
684
695
unsafe { Self :: take_heap ( ffi:: roaring_bitmap_flip ( & self . bitmap , start, end) ) }
@@ -723,6 +734,7 @@ impl Bitmap {
723
734
/// ```
724
735
#[ inline]
725
736
#[ doc( alias = "roaring_bitmap_to_uint32_array" ) ]
737
+ #[ must_use]
726
738
pub fn to_vec ( & self ) -> Vec < u32 > {
727
739
let bitmap_size: usize = self . cardinality ( ) . try_into ( ) . unwrap ( ) ;
728
740
@@ -736,8 +748,9 @@ impl Bitmap {
736
748
737
749
/// Computes the serialized size in bytes of the Bitmap in format `S`.
738
750
#[ inline]
751
+ #[ must_use]
739
752
pub fn get_serialized_size_in_bytes < S : Serializer > ( & self ) -> usize {
740
- S :: get_serialized_size_in_bytes ( & self )
753
+ S :: get_serialized_size_in_bytes ( self )
741
754
}
742
755
743
756
/// Serializes a bitmap to a slice of bytes in format `S`.
@@ -756,6 +769,7 @@ impl Bitmap {
756
769
/// assert_eq!(original_bitmap, deserialized_bitmap);
757
770
/// ```
758
771
#[ inline]
772
+ #[ must_use]
759
773
pub fn serialize < S : Serializer > ( & self ) -> Vec < u8 > {
760
774
let mut dst = Vec :: new ( ) ;
761
775
self . serialize_into :: < S > ( & mut dst) ;
@@ -809,6 +823,7 @@ impl Bitmap {
809
823
/// assert!(deserialized_bitmap.is_none());
810
824
/// ```
811
825
#[ inline]
826
+ #[ must_use]
812
827
pub fn try_deserialize < D : Deserializer > ( buffer : & [ u8 ] ) -> Option < Self > {
813
828
D :: try_deserialize ( buffer)
814
829
}
@@ -846,6 +861,7 @@ impl Bitmap {
846
861
/// ```
847
862
#[ inline]
848
863
#[ doc( alias = "roaring_bitmap_of_ptr" ) ]
864
+ #[ must_use]
849
865
pub fn of ( elements : & [ u32 ] ) -> Self {
850
866
unsafe {
851
867
Self :: take_heap ( ffi:: roaring_bitmap_of_ptr (
@@ -1017,6 +1033,7 @@ impl Bitmap {
1017
1033
/// ```
1018
1034
#[ inline]
1019
1035
#[ doc( alias = "roaring_bitmap_is_empty" ) ]
1036
+ #[ must_use]
1020
1037
pub fn is_empty ( & self ) -> bool {
1021
1038
unsafe { ffi:: roaring_bitmap_is_empty ( & self . bitmap ) }
1022
1039
}
@@ -1039,6 +1056,7 @@ impl Bitmap {
1039
1056
/// ```
1040
1057
#[ inline]
1041
1058
#[ doc( alias = "roaring_bitmap_is_subset" ) ]
1059
+ #[ must_use]
1042
1060
pub fn is_subset ( & self , other : & Self ) -> bool {
1043
1061
unsafe { ffi:: roaring_bitmap_is_subset ( & self . bitmap , & other. bitmap ) }
1044
1062
}
@@ -1062,6 +1080,7 @@ impl Bitmap {
1062
1080
/// ```
1063
1081
#[ inline]
1064
1082
#[ doc( alias = "roaring_bitmap_is_strict_subset" ) ]
1083
+ #[ must_use]
1065
1084
pub fn is_strict_subset ( & self , other : & Self ) -> bool {
1066
1085
unsafe { ffi:: roaring_bitmap_is_strict_subset ( & self . bitmap , & other. bitmap ) }
1067
1086
}
@@ -1083,6 +1102,7 @@ impl Bitmap {
1083
1102
/// ```
1084
1103
#[ inline]
1085
1104
#[ doc( alias = "roaring_bitmap_intersect" ) ]
1105
+ #[ must_use]
1086
1106
pub fn intersect ( & self , other : & Self ) -> bool {
1087
1107
unsafe { ffi:: roaring_bitmap_intersect ( & self . bitmap , & other. bitmap ) }
1088
1108
}
@@ -1126,6 +1146,7 @@ impl Bitmap {
1126
1146
/// ```
1127
1147
#[ inline]
1128
1148
#[ doc( alias = "roaring_bitmap_jaccard_index" ) ]
1149
+ #[ must_use]
1129
1150
pub fn jaccard_index ( & self , other : & Self ) -> f64 {
1130
1151
unsafe { ffi:: roaring_bitmap_jaccard_index ( & self . bitmap , & other. bitmap ) }
1131
1152
}
@@ -1144,6 +1165,7 @@ impl Bitmap {
1144
1165
/// ```
1145
1166
#[ inline]
1146
1167
#[ doc( alias = "roaring_bitmap_and_cardinality" ) ]
1168
+ #[ must_use]
1147
1169
pub fn and_cardinality ( & self , other : & Self ) -> u64 {
1148
1170
unsafe { ffi:: roaring_bitmap_and_cardinality ( & self . bitmap , & other. bitmap ) }
1149
1171
}
@@ -1161,6 +1183,7 @@ impl Bitmap {
1161
1183
/// assert_eq!(bitmap1.or_cardinality(&bitmap2), 2);
1162
1184
#[ inline]
1163
1185
#[ doc( alias = "roaring_bitmap_or_cardinality" ) ]
1186
+ #[ must_use]
1164
1187
pub fn or_cardinality ( & self , other : & Self ) -> u64 {
1165
1188
unsafe { ffi:: roaring_bitmap_or_cardinality ( & self . bitmap , & other. bitmap ) }
1166
1189
}
@@ -1179,6 +1202,7 @@ impl Bitmap {
1179
1202
/// ```
1180
1203
#[ inline]
1181
1204
#[ doc( alias = "roaring_bitmap_andnot_cardinality" ) ]
1205
+ #[ must_use]
1182
1206
pub fn andnot_cardinality ( & self , other : & Self ) -> u64 {
1183
1207
unsafe { ffi:: roaring_bitmap_andnot_cardinality ( & self . bitmap , & other. bitmap ) }
1184
1208
}
@@ -1197,6 +1221,7 @@ impl Bitmap {
1197
1221
/// ```
1198
1222
#[ inline]
1199
1223
#[ doc( alias = "roaring_bitmap_xor_cardinality" ) ]
1224
+ #[ must_use]
1200
1225
pub fn xor_cardinality ( & self , other : & Self ) -> u64 {
1201
1226
unsafe { ffi:: roaring_bitmap_xor_cardinality ( & self . bitmap , & other. bitmap ) }
1202
1227
}
@@ -1222,6 +1247,7 @@ impl Bitmap {
1222
1247
/// ```
1223
1248
#[ inline]
1224
1249
#[ doc( alias = "roaring_bitmap_minimum" ) ]
1250
+ #[ must_use]
1225
1251
pub fn minimum ( & self ) -> Option < u32 > {
1226
1252
if self . is_empty ( ) {
1227
1253
None
@@ -1251,6 +1277,7 @@ impl Bitmap {
1251
1277
/// ```
1252
1278
#[ inline]
1253
1279
#[ doc( alias = "roaring_bitmap_maximum" ) ]
1280
+ #[ must_use]
1254
1281
pub fn maximum ( & self ) -> Option < u32 > {
1255
1282
if self . is_empty ( ) {
1256
1283
None
@@ -1279,6 +1306,7 @@ impl Bitmap {
1279
1306
/// ```
1280
1307
#[ inline]
1281
1308
#[ doc( alias = "roaring_bitmap_rank" ) ]
1309
+ #[ must_use]
1282
1310
pub fn rank ( & self , x : u32 ) -> u64 {
1283
1311
unsafe { ffi:: roaring_bitmap_rank ( & self . bitmap , x) }
1284
1312
}
@@ -1316,13 +1344,13 @@ impl Bitmap {
1316
1344
#[ inline]
1317
1345
#[ doc( alias = "index" ) ]
1318
1346
#[ doc( alias = "roaring_bitmap_get_index" ) ]
1347
+ #[ must_use]
1319
1348
pub fn position ( & self , x : u32 ) -> Option < u32 > {
1320
1349
let index = unsafe { ffi:: roaring_bitmap_get_index ( & self . bitmap , x) } ;
1321
1350
if index == -1 {
1322
1351
None
1323
1352
} else {
1324
- debug_assert ! ( ( 0 ..=u32 :: MAX as i64 ) . contains( & index) ) ;
1325
- Some ( index as u32 )
1353
+ Some ( u32:: try_from ( index) . unwrap ( ) )
1326
1354
}
1327
1355
}
1328
1356
@@ -1355,6 +1383,7 @@ impl Bitmap {
1355
1383
/// ```
1356
1384
#[ inline]
1357
1385
#[ doc( alias = "roaring_bitmap_select" ) ]
1386
+ #[ must_use]
1358
1387
pub fn select ( & self , position : u32 ) -> Option < u32 > {
1359
1388
let mut element: u32 = 0 ;
1360
1389
let result = unsafe { ffi:: roaring_bitmap_select ( & self . bitmap , position, & mut element) } ;
@@ -1411,6 +1440,7 @@ impl Bitmap {
1411
1440
/// ```
1412
1441
#[ inline]
1413
1442
#[ doc( alias = "roaring_bitmap_statistics" ) ]
1443
+ #[ must_use]
1414
1444
pub fn statistics ( & self ) -> Statistics {
1415
1445
let mut statistics: ffi:: roaring_statistics_s = unsafe { :: std:: mem:: zeroed ( ) } ;
1416
1446
@@ -1436,6 +1466,7 @@ impl Bitmap {
1436
1466
/// ```
1437
1467
#[ inline]
1438
1468
#[ doc( alias = "roaring_bitmap_to_bitset" ) ]
1469
+ #[ must_use]
1439
1470
pub fn to_bitset ( & self ) -> Option < Bitset > {
1440
1471
let mut bitset = Bitset :: new ( ) ;
1441
1472
let success = unsafe { ffi:: roaring_bitmap_to_bitset ( & self . bitmap , bitset. as_raw_mut ( ) ) } ;
0 commit comments