@@ -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