changeset 313:e2a7eae0ce57

merging_iter: Reduce allocations in update_direction()
author Lewin Bormann <lbo@spheniscida.de>
date Fri, 29 Sep 2017 06:11:13 +0000
parents e2e8ce2a9434
children cc60cfd06226
files src/merging_iter.rs
diffstat 1 files changed, 6 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/merging_iter.rs	Thu Sep 28 20:44:14 2017 +0200
+++ b/src/merging_iter.rs	Fri Sep 29 06:11:13 2017 +0000
@@ -55,6 +55,9 @@
     /// call was next() or prev(). This basically sets all iterators to one
     /// entry after (Fwd) or one entry before (Rvrs) the current() entry.
     fn update_direction(&mut self, d: Direction) {
+        let mut keybuf = vec![];
+        let mut valbuf = vec![];
+
         if let Some((key, _)) = current_key_val(self) {
             if let Some(current) = self.current {
                 match d {
@@ -62,13 +65,12 @@
                         self.direction = Direction::Fwd;
                         for i in 0..self.iters.len() {
                             if i != current {
-                                self.iters[i].seek(&key);
+                                self.iters[i].seek(&keybuf);
                                 // This doesn't work if two iterators are returning the exact same
                                 // keys. However, in reality, two entries will always have differing
                                 // sequence numbers.
-                                if let Some((current_key, _)) = current_key_val(self.iters[i]
-                                    .as_ref()) {
-                                    if self.cmp.cmp(&current_key, &key) == Ordering::Equal {
+                                if self.iters[i].current(&mut keybuf, &mut valbuf) {
+                                    if self.cmp.cmp(&keybuf, &key) == Ordering::Equal {
                                         self.iters[i].advance();
                                     }
                                 }