@@ -179,6 +179,34 @@ struct transaction_manager_test_t :
179179 return *this ;
180180 }
181181
182+ bool to_left () {
183+ assert (is_end () || is_valid ());
184+ do {
185+ if (biter == parent.extents .begin ()
186+ && oiter == parent.delta .begin ()) {
187+ return false ;
188+ } else if (biter == parent.extents .begin ()) {
189+ --oiter;
190+ } else if (oiter == parent.delta .begin ()) {
191+ --biter;
192+ } else {
193+ auto l_biter = biter;
194+ auto l_oiter = oiter;
195+ --l_biter;
196+ --l_oiter;
197+ auto l_bkey = l_biter->first ;
198+ auto l_okey = l_oiter->first ;
199+ if (l_bkey > l_okey) {
200+ biter = l_biter;
201+ } else { // l_bkey <= l_okey
202+ oiter = l_oiter;
203+ }
204+ }
205+ } while (!is_valid ());
206+ cur = get_pair ();
207+ return true ;
208+ }
209+
182210 bool operator ==(const iterator &o) const {
183211 return o.biter == biter && o.oiter == oiter;
184212 }
@@ -187,10 +215,12 @@ struct transaction_manager_test_t :
187215 }
188216
189217 auto operator *() {
218+ assert (is_valid ());
190219 assert (!is_end ());
191220 return *cur;
192221 }
193222 auto operator ->() {
223+ assert (is_valid ());
194224 assert (!is_end ());
195225 return &*cur;
196226 }
@@ -228,18 +258,36 @@ struct transaction_manager_test_t :
228258 return ret;
229259 }
230260 }
261+
262+ std::optional<iterator> get_left (const iterator &it) {
263+ iterator left_it (it);
264+ bool success = left_it.to_left ();
265+ if (success) {
266+ auto ret = left_it;
267+ assert (++left_it == it);
268+ return ret;
269+ } else {
270+ assert (begin () == it);
271+ return std::nullopt ;
272+ }
273+ }
231274 };
275+
232276 private:
233277 void check_available (
234278 laddr_t addr, extent_len_t len, const delta_t &delta
235279 ) const {
236280 delta_overlay_t overlay (*this , delta);
237- for (const auto &i: overlay) {
238- if (i.first < addr) {
239- EXPECT_FALSE (i.first + i.second .desc .len > addr);
240- } else {
241- EXPECT_FALSE (addr + len > i.first );
242- }
281+ auto iter = overlay.lower_bound (addr);
282+ if (iter != overlay.end ()) {
283+ assert (iter->first >= addr);
284+ EXPECT_TRUE (iter->first >= addr + len);
285+ }
286+ auto maybe_left_it = overlay.get_left (iter);
287+ if (maybe_left_it.has_value ()) {
288+ auto left_it = *maybe_left_it;
289+ assert (left_it->first < addr);
290+ EXPECT_TRUE (left_it->first + left_it->second .desc .len <= addr);
243291 }
244292 }
245293
0 commit comments