Skip to content

Commit 1e3849a

Browse files
author
Lukas Markeffsky
committed
reduce branchiness
1 parent 500ef67 commit 1e3849a

File tree

1 file changed

+22
-31
lines changed
  • library/alloc/src/collections/vec_deque

1 file changed

+22
-31
lines changed

library/alloc/src/collections/vec_deque/drain.rs

+22-31
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)