2121use core:: cmp:: Ordering ;
2222use core:: fmt;
2323use core:: iter:: { repeat, FromIterator } ;
24+ use core:: mem;
2425use core:: ops:: { Index , IndexMut } ;
2526use core:: ptr;
2627use core:: slice;
28+ use core:: usize;
2729
2830use core:: hash:: { Hash , Hasher } ;
2931use core:: cmp;
@@ -32,6 +34,7 @@ use alloc::raw_vec::RawVec;
3234
3335const INITIAL_CAPACITY : usize = 7 ; // 2^3 - 1
3436const MINIMUM_CAPACITY : usize = 1 ; // 2 - 1
37+ const MAXIMUM_ZST_CAPACITY : usize = 1 << ( usize:: BITS - 1 ) ; // Largest possible power of two
3538
3639/// `VecDeque` is a growable ring buffer, which can be used as a
3740/// double-ended queue efficiently.
@@ -83,7 +86,12 @@ impl<T> VecDeque<T> {
8386 /// Marginally more convenient
8487 #[ inline]
8588 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+ }
8795 }
8896
8997 /// Turn ptr into a slice
@@ -1465,6 +1473,7 @@ impl<T: Clone> VecDeque<T> {
14651473#[ inline]
14661474fn wrap_index ( index : usize , size : usize ) -> usize {
14671475 // size is always a power of 2
1476+ debug_assert ! ( size. is_power_of_two( ) ) ;
14681477 index & ( size - 1 )
14691478}
14701479
@@ -2032,4 +2041,34 @@ mod tests {
20322041 }
20332042 }
20342043 }
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+ }
20352074}
0 commit comments