diff --git a/include/fast_io_dsal/impl/list.h b/include/fast_io_dsal/impl/list.h index c1c4c516e..1f86e05ba 100644 --- a/include/fast_io_dsal/impl/list.h +++ b/include/fast_io_dsal/impl/list.h @@ -36,6 +36,9 @@ class list_iterator using reference = ::std::conditional_t; using const_reference = value_type const &; + + using size_type = ::std::size_t; + using difference_type = ::std::ptrdiff_t; void *iter{}; constexpr list_iterator &operator++() noexcept @@ -295,7 +298,6 @@ inline void list_debug(void *leftfirstptr, void *leftlastptr) template inline constexpr void list_merge_common(void *leftfirstptr, void *leftlastptr, void *rightfirstptr, void *rightlastptr, Cmp cmp) { - for (; leftfirstptr != leftlastptr;) { auto rightfirst{static_cast<::fast_io::containers::details::list_node_common *>(rightfirstptr)}; @@ -328,12 +330,28 @@ inline constexpr void list_merge_common(void *leftfirstptr, void *leftlastptr, v } leftfirstptr = leftfirstnext; } -} + list_splice_range_common(leftlastptr, rightfirstptr, rightlastptr); +#if 0 + if (rightfirstptr != rightlastptr) + { -template -inline constexpr void list_sort_merge_common(void *firstptr, void *middleptr, void *lastptr, Cmp cmp) -{ - list_merge_common(firstptr, middleptr, middleptr, lastptr, cmp); + auto leftlast{static_cast<::fast_io::containers::details::list_node_common *>(leftlastptr)}; + auto leftlastprev{static_cast<::fast_io::containers::details::list_node_common *>(leftlast->prev)}; + + auto rightfirst{static_cast<::fast_io::containers::details::list_node_common *>(rightfirstptr)}; + auto rightfirstprev{static_cast<::fast_io::containers::details::list_node_common *>(rightfirst->prev)}; + leftlastprev->next = rightfirst; + rightfirst->prev = leftlastprev; + + auto rightlast{static_cast<::fast_io::containers::details::list_node_common *>(rightlastptr)}; + auto rightlastprev{static_cast<::fast_io::containers::details::list_node_common *>(rightlast->prev)}; + rightlastprev->next = leftlast; + leftlast->prev = rightlastprev; + + rightlast->prev = rightfirstprev; + rightfirstprev->next = rightlast; + } +#endif } template @@ -816,7 +834,7 @@ class list constexpr void splice(const_iterator pos, list &&other) noexcept { - this->splice(pos, other.imp.next, __builtin_addressof(other.imp)); + ::fast_io::containers::details::list_splice_range_common(pos.iter, other.imp.next, __builtin_addressof(other.imp)); other.imp = {__builtin_addressof(other.imp), __builtin_addressof(other.imp)}; } diff --git a/tests/0026.container/0002.list/list_splice.cc b/tests/0026.container/0002.list/list_splice.cc new file mode 100644 index 000000000..63eeff565 --- /dev/null +++ b/tests/0026.container/0002.list/list_splice.cc @@ -0,0 +1,22 @@ +#include +#include +#include + +int main() +{ + fast_io::list list1{1, 2, 3, 4, 5}; + fast_io::list list2{10, 20, 30, 40, 50}; + + auto it = list1.begin(); + std::advance(it, 2); + + list1.splice(it, std::move(list2)); + + println("list1:", ::fast_io::mnp::rgvw(list1," ")); + println("list2:", ::fast_io::mnp::rgvw(list2," ")); + + list2.splice(list2.begin(), it, list1.end()); + + println("list1:", ::fast_io::mnp::rgvw(list1," ")); + println("list2:", ::fast_io::mnp::rgvw(list2," ")); +} \ No newline at end of file