changeset 96:e93d0baf758a

Merge pull request #4 from thomaskrause/feature/current-key Add "current_key()" function to SSIterator.
author Lewin Bormann <lbo@spheniscida.de>
date Mon, 13 Apr 2020 08:54:16 +0200
parents 7b43cb6b9666 (current diff) da4beef6e417 (diff)
children b46bf8bc18d4
files
diffstat 4 files changed, 34 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/block.rs	Mon Feb 24 13:17:14 2020 +0100
+++ b/src/block.rs	Mon Apr 13 08:54:16 2020 +0200
@@ -297,6 +297,14 @@
             false
         }
     }
+
+    fn current_key(&self) -> Option<&[u8]> {
+        if self.valid() {
+            Some(&self.key)
+        } else {
+            None
+        }
+    }
 }
 
 #[cfg(test)]
--- a/src/table_reader.rs	Mon Feb 24 13:17:14 2020 +0100
+++ b/src/table_reader.rs	Mon Apr 13 08:54:16 2020 +0200
@@ -335,6 +335,14 @@
             false
         }
     }
+
+    fn current_key(&self) -> Option<&[u8]> {
+        if let Some(ref cb) = self.current_block {
+            cb.current_key()
+        } else {
+            None
+        }
+    }
 }
 
 #[cfg(test)]
--- a/src/test_util.rs	Mon Feb 24 13:17:14 2020 +0100
+++ b/src/test_util.rs	Mon Apr 13 08:54:16 2020 +0200
@@ -48,6 +48,15 @@
             false
         }
     }
+
+    fn current_key(&self) -> Option<&[u8]> {
+        if self.init && self.ix < self.v.len() {
+            Some(self.v[self.ix].0)
+        } else {
+            None
+        }
+    }
+
     fn valid(&self) -> bool {
         self.init && self.ix < self.v.len()
     }
@@ -95,14 +104,18 @@
     assert!(it.advance());
     assert!(it.valid());
     let first = current_key_val(&it);
+    assert_eq!(first.as_ref().unwrap().0, it.current_key().unwrap());
     assert!(it.advance());
     let second = current_key_val(&it);
+    assert_eq!(second.as_ref().unwrap().0, it.current_key().unwrap());
     assert!(it.advance());
     let third = current_key_val(&it);
+    assert_eq!(third.as_ref().unwrap().0, it.current_key().unwrap());
     // fourth (last) element
     assert!(it.advance());
     assert!(it.valid());
     let fourth = current_key_val(&it);
+    assert_eq!(fourth.as_ref().unwrap().0, it.current_key().unwrap());
     // past end is invalid
     assert!(!it.advance());
     assert!(!it.valid());
--- a/src/types.rs	Mon Feb 24 13:17:14 2020 +0100
+++ b/src/types.rs	Mon Apr 13 08:54:16 2020 +0200
@@ -69,6 +69,8 @@
     fn advance(&mut self) -> bool;
     /// Return the current item (i.e. the item most recently returned by `next()`).
     fn current(&self, key: &mut Vec<u8>, val: &mut Vec<u8>) -> bool;
+    /// Return a reference to the key of the current item (i.e. the item most recently returned by `next()`).
+    fn current_key(&self) -> Option<&[u8]>;
     /// Seek the iterator to `key` or the next bigger key. If the seek is invalid (past last
     /// element, or before first element), the iterator is `reset()` and not valid.
     fn seek(&mut self, key: &[u8]);
@@ -124,6 +126,9 @@
     fn current(&self, key: &mut Vec<u8>, val: &mut Vec<u8>) -> bool {
         self.as_ref().current(key, val)
     }
+    fn current_key(&self) -> Option<&[u8]> {
+        self.as_ref().current_key()
+    }
     fn seek(&mut self, key: &[u8]) {
         self.as_mut().seek(key)
     }