From 200c148ae4311efeb561d8da81b44768ab01b9e2 Mon Sep 17 00:00:00 2001 From: HeartLinked Date: Thu, 3 Oct 2024 14:56:32 +0800 Subject: [PATCH] [week1] 1.5 task1 --- .../src/iterators/two_merge_iterator.rs | 50 +++++++++++++++---- mini-lsm-starter/src/tests.rs | 1 + 2 files changed, 41 insertions(+), 10 deletions(-) diff --git a/mini-lsm-starter/src/iterators/two_merge_iterator.rs b/mini-lsm-starter/src/iterators/two_merge_iterator.rs index bb7b4a8..8b02241 100644 --- a/mini-lsm-starter/src/iterators/two_merge_iterator.rs +++ b/mini-lsm-starter/src/iterators/two_merge_iterator.rs @@ -1,6 +1,3 @@ -#![allow(unused_variables)] // TODO(you): remove this lint after implementing this mod -#![allow(dead_code)] // TODO(you): remove this lint after implementing this mod - use anyhow::Result; use super::StorageIterator; @@ -19,7 +16,7 @@ impl< > TwoMergeIterator { pub fn create(a: A, b: B) -> Result { - unimplemented!() + Ok(TwoMergeIterator { a, b }) } } @@ -30,19 +27,52 @@ impl< { type KeyType<'a> = A::KeyType<'a>; - fn key(&self) -> Self::KeyType<'_> { - unimplemented!() + fn value(&self) -> &[u8] { + match (self.a.is_valid(), self.b.is_valid()) { + (true, true) => { + if self.a.key() <= self.b.key() { + self.a.value() + } else { + self.b.value() + } + } + (true, false) => self.a.value(), + _ => self.b.value(), + } } - fn value(&self) -> &[u8] { - unimplemented!() + fn key(&self) -> Self::KeyType<'_> { + match (self.a.is_valid(), self.b.is_valid()) { + (true, true) => { + if self.a.key() <= self.b.key() { + self.a.key() + } else { + self.b.key() + } + } + (true, false) => self.a.key(), + _ => self.b.key(), + } } fn is_valid(&self) -> bool { - unimplemented!() + self.a.is_valid() || self.b.is_valid() } fn next(&mut self) -> Result<()> { - unimplemented!() + match (self.a.is_valid(), self.b.is_valid()) { + (true, true) => { + if self.a.key() < self.b.key() { + self.a.next() + } else if self.a.key() == self.b.key() { + self.a.next()?; + self.b.next() // 如果 key 相等,则两个迭代器都要增加 + } else { + self.b.next() + } + } + (true, false) => self.a.next(), + _ => self.b.next(), + } } } diff --git a/mini-lsm-starter/src/tests.rs b/mini-lsm-starter/src/tests.rs index 590f76e..0eef038 100644 --- a/mini-lsm-starter/src/tests.rs +++ b/mini-lsm-starter/src/tests.rs @@ -6,3 +6,4 @@ mod week1_day1; mod week1_day2; mod week1_day3; mod week1_day4; +mod week1_day5;