21
21
use core:: cmp:: Ordering ;
22
22
use core:: fmt;
23
23
use core:: iter:: { repeat, FromIterator } ;
24
+ use core:: mem;
24
25
use core:: ops:: { Index , IndexMut } ;
25
26
use core:: ptr;
26
27
use core:: slice;
28
+ use core:: usize;
27
29
28
30
use core:: hash:: { Hash , Hasher } ;
29
31
use core:: cmp;
@@ -32,6 +34,7 @@ use alloc::raw_vec::RawVec;
32
34
33
35
const INITIAL_CAPACITY : usize = 7 ; // 2^3 - 1
34
36
const MINIMUM_CAPACITY : usize = 1 ; // 2 - 1
37
+ const MAXIMUM_ZST_CAPACITY : usize = 1 << ( usize:: BITS - 1 ) ; // Largest possible power of two
35
38
36
39
/// `VecDeque` is a growable ring buffer, which can be used as a
37
40
/// double-ended queue efficiently.
@@ -83,7 +86,12 @@ impl<T> VecDeque<T> {
83
86
/// Marginally more convenient
84
87
#[ inline]
85
88
fn cap ( & self ) -> usize {
86
- self . buf . cap ( )
89
+ if mem:: size_of :: < T > ( ) == 0 {
90
+ // For zero sized types, we are always at maximum capacity
91
+ MAXIMUM_ZST_CAPACITY
92
+ } else {
93
+ self . buf . cap ( )
94
+ }
87
95
}
88
96
89
97
/// Turn ptr into a slice
@@ -1465,6 +1473,7 @@ impl<T: Clone> VecDeque<T> {
1465
1473
#[ inline]
1466
1474
fn wrap_index ( index : usize , size : usize ) -> usize {
1467
1475
// size is always a power of 2
1476
+ debug_assert ! ( size. is_power_of_two( ) ) ;
1468
1477
index & ( size - 1 )
1469
1478
}
1470
1479
@@ -2032,4 +2041,34 @@ mod tests {
2032
2041
}
2033
2042
}
2034
2043
}
2044
+
2045
+ #[ test]
2046
+ fn test_zst_push ( ) {
2047
+ const N : usize = 8 ;
2048
+
2049
+ // Zero sized type
2050
+ struct Zst ;
2051
+
2052
+ // Test that for all possible sequences of push_front / push_back,
2053
+ // we end up with a deque of the correct size
2054
+
2055
+ for len in 0 ..N {
2056
+ let mut tester = VecDeque :: with_capacity ( len) ;
2057
+ assert_eq ! ( tester. len( ) , 0 ) ;
2058
+ assert ! ( tester. capacity( ) >= len) ;
2059
+ for case in 0 ..( 1 << len) {
2060
+ assert_eq ! ( tester. len( ) , 0 ) ;
2061
+ for bit in 0 ..len {
2062
+ if case & ( 1 << bit) != 0 {
2063
+ tester. push_front ( Zst ) ;
2064
+ } else {
2065
+ tester. push_back ( Zst ) ;
2066
+ }
2067
+ }
2068
+ assert_eq ! ( tester. len( ) , len) ;
2069
+ assert_eq ! ( tester. iter( ) . count( ) , len) ;
2070
+ tester. clear ( ) ;
2071
+ }
2072
+ }
2073
+ }
2035
2074
}
0 commit comments