Skip to content

Commit f6ca140

Browse files
committed
Factor out slot_map::underlying_swap from slot_map::partition.
See #131.
1 parent 85f5713 commit f6ca140

File tree

1 file changed

+19
-13
lines changed

1 file changed

+19
-13
lines changed

SG14/slot_map.h

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,24 @@ class slot_map
278278
return 1;
279279
}
280280

281+
constexpr void underlying_swap(const_iterator cit, const_iterator cjt) {
282+
// Swap *it and *jt in the underlying container,
283+
// but then fix up their keys so they don't appear to move.
284+
auto it_value_index = std::distance(this->cbegin(), cit);
285+
auto it = std::next(this->begin(), it_value_index);
286+
auto it_reversemap_iter = std::next(reverse_map_.begin(), it_value_index);
287+
auto it_slot_iter = std::next(slots_.begin(), *it_reversemap_iter);
288+
auto jt_value_index = std::distance(this->cbegin(), cjt);
289+
auto jt = std::next(this->begin(), jt_value_index);
290+
auto jt_reversemap_iter = std::next(reverse_map_.begin(), jt_value_index);
291+
auto jt_slot_iter = std::next(slots_.begin(), *jt_reversemap_iter);
292+
293+
using std::swap;
294+
swap(*it, *jt);
295+
swap(*it_slot_iter, *jt_slot_iter);
296+
swap(*it_reversemap_iter, *jt_reversemap_iter);
297+
}
298+
281299
template<class Pred>
282300
constexpr iterator partition(const Pred& pred) {
283301
iterator it = this->begin();
@@ -294,19 +312,7 @@ class slot_map
294312
--jt;
295313
if (it == jt) return it;
296314
}
297-
// Swap *it and *jt in the underlying container,
298-
// but then fix up their keys so they don't appear to move.
299-
auto it_value_index = std::distance(values_.begin(), it);
300-
auto it_reversemap_iter = std::next(reverse_map_.begin(), it_value_index);
301-
auto it_slot_iter = std::next(slots_.begin(), *it_reversemap_iter);
302-
auto jt_value_index = std::distance(values_.begin(), jt);
303-
auto jt_reversemap_iter = std::next(reverse_map_.begin(), jt_value_index);
304-
auto jt_slot_iter = std::next(slots_.begin(), *jt_reversemap_iter);
305-
306-
using std::swap;
307-
swap(*it, *jt);
308-
swap(*it_slot_iter, *jt_slot_iter);
309-
swap(*it_reversemap_iter, *jt_reversemap_iter);
315+
this->underlying_swap(it, jt);
310316
++it;
311317
if (it == jt) return it;
312318
}

0 commit comments

Comments
 (0)