@@ -107,7 +107,7 @@ impl<Item, Gap, const CAP: usize> LinkedChunk<Item, Gap, CAP> {
107
107
/// Push a gap at the end of the [`LinkedChunk`], i.e. after the last
108
108
/// chunk.
109
109
pub fn push_gap_back ( & mut self , content : Gap ) {
110
- let next_identifier = self . chunk_identifier_generator . generate_next ( ) . unwrap ( ) ;
110
+ let next_identifier = self . chunk_identifier_generator . next ( ) ;
111
111
112
112
let last_chunk = self . latest_chunk_mut ( ) ;
113
113
last_chunk. insert_next ( Chunk :: new_gap_leaked ( next_identifier, content) ) ;
@@ -210,10 +210,8 @@ impl<Item, Gap, const CAP: usize> LinkedChunk<Item, Gap, CAP> {
210
210
// `chunk.previous.is_some()` in the `if` statement.
211
211
. expect ( "Previous chunk must be present" ) ;
212
212
213
- previous_chunk. insert_next ( Chunk :: new_gap_leaked (
214
- chunk_identifier_generator. generate_next ( ) . unwrap ( ) ,
215
- content,
216
- ) ) ;
213
+ previous_chunk
214
+ . insert_next ( Chunk :: new_gap_leaked ( chunk_identifier_generator. next ( ) , content) ) ;
217
215
218
216
// We don't need to update `self.last` because we have inserted a new chunk
219
217
// before `chunk`.
@@ -237,14 +235,9 @@ impl<Item, Gap, const CAP: usize> LinkedChunk<Item, Gap, CAP> {
237
235
238
236
chunk
239
237
// Insert a new gap chunk.
240
- . insert_next ( Chunk :: new_gap_leaked (
241
- chunk_identifier_generator. generate_next ( ) . unwrap ( ) ,
242
- content,
243
- ) )
238
+ . insert_next ( Chunk :: new_gap_leaked ( chunk_identifier_generator. next ( ) , content) )
244
239
// Insert a new items chunk.
245
- . insert_next ( Chunk :: new_items_leaked (
246
- chunk_identifier_generator. generate_next ( ) . unwrap ( ) ,
247
- ) )
240
+ . insert_next ( Chunk :: new_items_leaked ( chunk_identifier_generator. next ( ) ) )
248
241
// Finally, push the items that have been detached.
249
242
. push_items ( detached_items. into_iter ( ) , & chunk_identifier_generator)
250
243
}
@@ -295,9 +288,8 @@ impl<Item, Gap, const CAP: usize> LinkedChunk<Item, Gap, CAP> {
295
288
296
289
let last_inserted_chunk = chunk
297
290
// Insert a new items chunk…
298
- . insert_next ( Chunk :: new_items_leaked (
299
- chunk_identifier_generator. generate_next ( ) . unwrap ( ) ,
300
- ) ) // … and insert the items.
291
+ . insert_next ( Chunk :: new_items_leaked ( chunk_identifier_generator. next ( ) ) )
292
+ // … and insert the items.
301
293
. push_items ( items, & chunk_identifier_generator) ;
302
294
303
295
(
@@ -590,18 +582,17 @@ impl ChunkIdentifierGenerator {
590
582
/// Generate the next unique identifier.
591
583
///
592
584
/// Note that it can fail if there is no more unique identifier available.
593
- /// In this case, `Result::Err` contains the previous unique identifier .
594
- pub fn generate_next ( & self ) -> Result < ChunkIdentifier , ChunkIdentifier > {
585
+ /// In this case, this method will panic .
586
+ pub fn next ( & self ) -> ChunkIdentifier {
595
587
let previous = self . next . fetch_add ( 1 , Ordering :: Relaxed ) ;
596
- let current = self . next . load ( Ordering :: Relaxed ) ;
597
588
598
589
// Check for overflows.
599
590
// unlikely — TODO: call `std::intrinsics::unlikely` once it's stable.
600
- if current < previous {
601
- return Err ( ChunkIdentifier ( previous ) ) ;
591
+ if previous == u64 :: MAX {
592
+ panic ! ( "No more chunk identifiers available. Congrats, you did it. 2^64 identifiers have been consumed." )
602
593
}
603
594
604
- Ok ( ChunkIdentifier ( current ) )
595
+ ChunkIdentifier ( previous + 1 )
605
596
}
606
597
}
607
598
@@ -836,9 +827,7 @@ impl<Item, Gap, const CAPACITY: usize> Chunk<Item, Gap, CAPACITY> {
836
827
ChunkContent :: Gap ( ..) => {
837
828
self
838
829
// Insert a new items chunk.
839
- . insert_next ( Self :: new_items_leaked (
840
- chunk_identifier_generator. generate_next ( ) . unwrap ( ) ,
841
- ) )
830
+ . insert_next ( Self :: new_items_leaked ( chunk_identifier_generator. next ( ) ) )
842
831
// Now push the new items on the next chunk, and return the result of
843
832
// `push_items`.
844
833
. push_items ( new_items, chunk_identifier_generator)
@@ -862,9 +851,7 @@ impl<Item, Gap, const CAPACITY: usize> Chunk<Item, Gap, CAPACITY> {
862
851
863
852
self
864
853
// Insert a new items chunk.
865
- . insert_next ( Self :: new_items_leaked (
866
- chunk_identifier_generator. generate_next ( ) . unwrap ( ) ,
867
- ) )
854
+ . insert_next ( Self :: new_items_leaked ( chunk_identifier_generator. next ( ) ) )
868
855
// Now push the rest of the new items on the next chunk, and return the
869
856
// result of `push_items`.
870
857
. push_items ( new_items, chunk_identifier_generator)
@@ -1041,18 +1028,18 @@ mod tests {
1041
1028
fn test_chunk_identifier_generator ( ) {
1042
1029
let generator = ChunkIdentifierGenerator :: new_from_scratch ( ) ;
1043
1030
1044
- assert_eq ! ( generator. generate_next ( ) , Ok ( ChunkIdentifier ( 1 ) ) ) ;
1045
- assert_eq ! ( generator. generate_next ( ) , Ok ( ChunkIdentifier ( 2 ) ) ) ;
1046
- assert_eq ! ( generator. generate_next ( ) , Ok ( ChunkIdentifier ( 3 ) ) ) ;
1047
- assert_eq ! ( generator. generate_next ( ) , Ok ( ChunkIdentifier ( 4 ) ) ) ;
1031
+ assert_eq ! ( generator. next ( ) , ChunkIdentifier ( 1 ) ) ;
1032
+ assert_eq ! ( generator. next ( ) , ChunkIdentifier ( 2 ) ) ;
1033
+ assert_eq ! ( generator. next ( ) , ChunkIdentifier ( 3 ) ) ;
1034
+ assert_eq ! ( generator. next ( ) , ChunkIdentifier ( 4 ) ) ;
1048
1035
1049
1036
let generator =
1050
1037
ChunkIdentifierGenerator :: new_from_previous_chunk_identifier ( ChunkIdentifier ( 42 ) ) ;
1051
1038
1052
- assert_eq ! ( generator. generate_next ( ) , Ok ( ChunkIdentifier ( 43 ) ) ) ;
1053
- assert_eq ! ( generator. generate_next ( ) , Ok ( ChunkIdentifier ( 44 ) ) ) ;
1054
- assert_eq ! ( generator. generate_next ( ) , Ok ( ChunkIdentifier ( 45 ) ) ) ;
1055
- assert_eq ! ( generator. generate_next ( ) , Ok ( ChunkIdentifier ( 46 ) ) ) ;
1039
+ assert_eq ! ( generator. next ( ) , ChunkIdentifier ( 43 ) ) ;
1040
+ assert_eq ! ( generator. next ( ) , ChunkIdentifier ( 44 ) ) ;
1041
+ assert_eq ! ( generator. next ( ) , ChunkIdentifier ( 45 ) ) ;
1042
+ assert_eq ! ( generator. next ( ) , ChunkIdentifier ( 46 ) ) ;
1056
1043
}
1057
1044
1058
1045
#[ test]
0 commit comments