@@ -109,7 +109,6 @@ impl<T, A: Allocator> Drop for Drain<'_, T, A> {
109109
110110 let source_deque = unsafe { self . 0 . deque . as_mut ( ) } ;
111111
112- let drain_start = source_deque. len ( ) ;
113112 let drain_len = self . 0 . drain_len ;
114113 let new_len = self . 0 . new_len ;
115114
@@ -119,40 +118,32 @@ impl<T, A: Allocator> Drop for Drain<'_, T, A> {
119118 return ;
120119 }
121120
122- let head_len = drain_start ;
121+ let head_len = source_deque . len ( ) ;
123122 let tail_len = new_len - head_len;
124123
125- match ( head_len, tail_len) {
126- ( 0 , 0 ) => {
127- source_deque. head = 0 ;
128- source_deque. len = 0 ;
129- }
130- ( 0 , _) => {
131- source_deque. head = source_deque. to_physical_idx ( drain_len) ;
132- source_deque. len = new_len;
133- }
134- ( _, 0 ) => {
135- source_deque. len = new_len;
124+ if head_len != 0 && tail_len != 0 {
125+ let ( src, dst, len) ;
126+ if head_len < tail_len {
127+ src = source_deque. head ;
128+ dst = source_deque. to_physical_idx ( drain_len) ;
129+ len = head_len;
130+ } else {
131+ src = source_deque. to_physical_idx ( head_len + drain_len) ;
132+ dst = source_deque. to_physical_idx ( head_len) ;
133+ len = tail_len;
134+ } ;
135+
136+ unsafe {
137+ source_deque. wrap_copy ( src, dst, len) ;
136138 }
137- _ => unsafe {
138- if head_len <= tail_len {
139- source_deque. wrap_copy (
140- source_deque. head ,
141- source_deque. to_physical_idx ( drain_len) ,
142- head_len,
143- ) ;
144- source_deque. head = source_deque. to_physical_idx ( drain_len) ;
145- source_deque. len = new_len;
146- } else {
147- source_deque. wrap_copy (
148- source_deque. to_physical_idx ( head_len + drain_len) ,
149- source_deque. to_physical_idx ( head_len) ,
150- tail_len,
151- ) ;
152- source_deque. len = new_len;
153- }
154- } ,
155139 }
140+
141+ if new_len == 0 {
142+ source_deque. head = 0 ;
143+ } else if head_len < tail_len {
144+ source_deque. head = source_deque. to_physical_idx ( drain_len) ;
145+ }
146+ source_deque. len = new_len;
156147 }
157148 }
158149
0 commit comments