include/boost/corosio/detail/intrusive.hpp

95.7% Lines (67/70) 98.1% List of functions (105/107)
intrusive.hpp
f(x) Functions (107)
Function Calls Lines Blocks
boost::corosio::detail::intrusive_list<boost::corosio::detail::epoll_local_datagram_socket>::intrusive_list() :47 662x 100.0% 100.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::epoll_local_stream_acceptor>::intrusive_list() :47 662x 100.0% 100.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::epoll_local_stream_socket>::intrusive_list() :47 662x 100.0% 100.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::epoll_tcp_acceptor>::intrusive_list() :47 662x 100.0% 100.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::epoll_tcp_socket>::intrusive_list() :47 662x 100.0% 100.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::epoll_udp_socket>::intrusive_list() :47 662x 100.0% 100.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::io_uring_multishot_acceptor_base<boost::corosio::detail::io_uring_local_stream_acceptor, boost::corosio::local_stream_acceptor::implementation, boost::corosio::local_endpoint, boost::corosio::detail::io_uring_local_stream_service>::ready_fd_node>::intrusive_list() :47 22x 100.0% 100.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::io_uring_multishot_acceptor_base<boost::corosio::detail::io_uring_local_stream_acceptor, boost::corosio::local_stream_acceptor::implementation, boost::corosio::local_endpoint, boost::corosio::detail::io_uring_local_stream_service>::waiter_node>::intrusive_list() :47 22x 100.0% 100.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::io_uring_multishot_acceptor_base<boost::corosio::detail::io_uring_tcp_acceptor, boost::corosio::tcp_acceptor::implementation, boost::corosio::endpoint, boost::corosio::detail::io_uring_tcp_service>::ready_fd_node>::intrusive_list() :47 91x 100.0% 100.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::io_uring_multishot_acceptor_base<boost::corosio::detail::io_uring_tcp_acceptor, boost::corosio::tcp_acceptor::implementation, boost::corosio::endpoint, boost::corosio::detail::io_uring_tcp_service>::waiter_node>::intrusive_list() :47 91x 100.0% 100.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::io_uring_random_access_file>::intrusive_list() :47 389x 100.0% 100.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::io_uring_stream_file>::intrusive_list() :47 389x 100.0% 100.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::posix_random_access_file::raf_op>::intrusive_list() :47 43x 100.0% 100.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::posix_random_access_file>::intrusive_list() :47 1090x 100.0% 100.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::posix_resolver>::intrusive_list() :47 1479x 100.0% 100.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::posix_signal>::intrusive_list() :47 1479x 100.0% 100.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::posix_stream_file>::intrusive_list() :47 1090x 100.0% 100.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::select_local_datagram_socket>::intrusive_list() :47 428x 100.0% 100.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::select_local_stream_acceptor>::intrusive_list() :47 428x 100.0% 100.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::select_local_stream_socket>::intrusive_list() :47 428x 100.0% 100.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::select_tcp_acceptor>::intrusive_list() :47 428x 100.0% 100.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::select_tcp_socket>::intrusive_list() :47 428x 100.0% 100.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::select_udp_socket>::intrusive_list() :47 428x 100.0% 100.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::waiter_node>::intrusive_list() :47 526x 100.0% 100.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::io_uring_multishot_acceptor_base<boost::corosio::detail::io_uring_local_stream_acceptor, boost::corosio::local_stream_acceptor::implementation, boost::corosio::local_endpoint, boost::corosio::detail::io_uring_local_stream_service>::waiter_node>::empty() const :61 9x 100.0% 100.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::io_uring_multishot_acceptor_base<boost::corosio::detail::io_uring_tcp_acceptor, boost::corosio::tcp_acceptor::implementation, boost::corosio::endpoint, boost::corosio::detail::io_uring_tcp_service>::waiter_node>::empty() const :61 3945x 100.0% 100.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::waiter_node>::empty() const :61 57x 100.0% 100.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::io_uring_multishot_acceptor_base<boost::corosio::detail::io_uring_local_stream_acceptor, boost::corosio::local_stream_acceptor::implementation, boost::corosio::local_endpoint, boost::corosio::detail::io_uring_local_stream_service>::waiter_node>::front() const :67 8x 100.0% 100.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::io_uring_multishot_acceptor_base<boost::corosio::detail::io_uring_tcp_acceptor, boost::corosio::tcp_acceptor::implementation, boost::corosio::endpoint, boost::corosio::detail::io_uring_tcp_service>::waiter_node>::front() const :67 3940x 100.0% 100.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::epoll_local_datagram_socket>::push_back(boost::corosio::detail::epoll_local_datagram_socket*) :72 65x 100.0% 80.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::epoll_local_stream_acceptor>::push_back(boost::corosio::detail::epoll_local_stream_acceptor*) :72 22x 88.9% 50.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::epoll_local_stream_socket>::push_back(boost::corosio::detail::epoll_local_stream_socket*) :72 68x 100.0% 80.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::epoll_tcp_acceptor>::push_back(boost::corosio::detail::epoll_tcp_acceptor*) :72 1165x 100.0% 80.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::epoll_tcp_socket>::push_back(boost::corosio::detail::epoll_tcp_socket*) :72 15049x 100.0% 80.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::epoll_udp_socket>::push_back(boost::corosio::detail::epoll_udp_socket*) :72 91x 100.0% 80.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::io_uring_multishot_acceptor_base<boost::corosio::detail::io_uring_local_stream_acceptor, boost::corosio::local_stream_acceptor::implementation, boost::corosio::local_endpoint, boost::corosio::detail::io_uring_local_stream_service>::ready_fd_node>::push_back(boost::corosio::detail::io_uring_multishot_acceptor_base<boost::corosio::detail::io_uring_local_stream_acceptor, boost::corosio::local_stream_acceptor::implementation, boost::corosio::local_endpoint, boost::corosio::detail::io_uring_local_stream_service>::ready_fd_node*) :72 2x 88.9% 75.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::io_uring_multishot_acceptor_base<boost::corosio::detail::io_uring_local_stream_acceptor, boost::corosio::local_stream_acceptor::implementation, boost::corosio::local_endpoint, boost::corosio::detail::io_uring_local_stream_service>::waiter_node>::push_back(boost::corosio::detail::io_uring_multishot_acceptor_base<boost::corosio::detail::io_uring_local_stream_acceptor, boost::corosio::local_stream_acceptor::implementation, boost::corosio::local_endpoint, boost::corosio::detail::io_uring_local_stream_service>::waiter_node*) :72 10x 88.9% 75.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::io_uring_multishot_acceptor_base<boost::corosio::detail::io_uring_tcp_acceptor, boost::corosio::tcp_acceptor::implementation, boost::corosio::endpoint, boost::corosio::detail::io_uring_tcp_service>::ready_fd_node>::push_back(boost::corosio::detail::io_uring_multishot_acceptor_base<boost::corosio::detail::io_uring_tcp_acceptor, boost::corosio::tcp_acceptor::implementation, boost::corosio::endpoint, boost::corosio::detail::io_uring_tcp_service>::ready_fd_node*) :72 6x 88.9% 75.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::io_uring_multishot_acceptor_base<boost::corosio::detail::io_uring_tcp_acceptor, boost::corosio::tcp_acceptor::implementation, boost::corosio::endpoint, boost::corosio::detail::io_uring_tcp_service>::waiter_node>::push_back(boost::corosio::detail::io_uring_multishot_acceptor_base<boost::corosio::detail::io_uring_tcp_acceptor, boost::corosio::tcp_acceptor::implementation, boost::corosio::endpoint, boost::corosio::detail::io_uring_tcp_service>::waiter_node*) :72 3946x 88.9% 75.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::io_uring_random_access_file>::push_back(boost::corosio::detail::io_uring_random_access_file*) :72 5x 88.9% 50.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::io_uring_stream_file>::push_back(boost::corosio::detail::io_uring_stream_file*) :72 5x 88.9% 50.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::posix_random_access_file::raf_op>::push_back(boost::corosio::detail::posix_random_access_file::raf_op*) :72 150x 100.0% 80.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::posix_random_access_file>::push_back(boost::corosio::detail::posix_random_access_file*) :72 43x 88.9% 50.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::posix_resolver>::push_back(boost::corosio::detail::posix_resolver*) :72 45x 100.0% 80.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::posix_signal>::push_back(boost::corosio::detail::posix_signal*) :72 156x 100.0% 80.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::posix_stream_file>::push_back(boost::corosio::detail::posix_stream_file*) :72 43x 100.0% 80.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::select_local_datagram_socket>::push_back(boost::corosio::detail::select_local_datagram_socket*) :72 65x 100.0% 80.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::select_local_stream_acceptor>::push_back(boost::corosio::detail::select_local_stream_acceptor*) :72 22x 88.9% 50.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::select_local_stream_socket>::push_back(boost::corosio::detail::select_local_stream_socket*) :72 68x 100.0% 80.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::select_tcp_acceptor>::push_back(boost::corosio::detail::select_tcp_acceptor*) :72 108x 100.0% 80.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::select_tcp_socket>::push_back(boost::corosio::detail::select_tcp_socket*) :72 11491x 100.0% 80.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::select_udp_socket>::push_back(boost::corosio::detail::select_udp_socket*) :72 91x 100.0% 80.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::waiter_node>::push_back(boost::corosio::detail::waiter_node*) :72 26449x 100.0% 100.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::epoll_local_datagram_socket>::pop_front() :103 662x 25.0% 19.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::epoll_local_stream_acceptor>::pop_front() :103 662x 25.0% 19.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::epoll_local_stream_socket>::pop_front() :103 662x 25.0% 19.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::epoll_tcp_acceptor>::pop_front() :103 662x 25.0% 19.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::epoll_tcp_socket>::pop_front() :103 662x 25.0% 19.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::epoll_udp_socket>::pop_front() :103 662x 25.0% 19.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::io_uring_multishot_acceptor_base<boost::corosio::detail::io_uring_local_stream_acceptor, boost::corosio::local_stream_acceptor::implementation, boost::corosio::local_endpoint, boost::corosio::detail::io_uring_local_stream_service>::ready_fd_node>::pop_front() :103 55x 91.7% 86.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::io_uring_multishot_acceptor_base<boost::corosio::detail::io_uring_local_stream_acceptor, boost::corosio::local_stream_acceptor::implementation, boost::corosio::local_endpoint, boost::corosio::detail::io_uring_local_stream_service>::waiter_node>::pop_front() :103 55x 91.7% 86.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::io_uring_multishot_acceptor_base<boost::corosio::detail::io_uring_tcp_acceptor, boost::corosio::tcp_acceptor::implementation, boost::corosio::endpoint, boost::corosio::detail::io_uring_tcp_service>::ready_fd_node>::pop_front() :103 4131x 91.7% 86.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::io_uring_multishot_acceptor_base<boost::corosio::detail::io_uring_tcp_acceptor, boost::corosio::tcp_acceptor::implementation, boost::corosio::endpoint, boost::corosio::detail::io_uring_tcp_service>::waiter_node>::pop_front() :103 8073x 91.7% 86.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::io_uring_random_access_file>::pop_front() :103 389x 25.0% 19.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::io_uring_stream_file>::pop_front() :103 389x 25.0% 19.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::posix_random_access_file>::pop_front() :103 1090x 25.0% 19.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::posix_resolver>::pop_front() :103 1479x 25.0% 19.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::posix_signal>::pop_front() :103 1479x 25.0% 19.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::posix_stream_file>::pop_front() :103 1090x 25.0% 19.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::select_local_datagram_socket>::pop_front() :103 428x 25.0% 19.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::select_local_stream_acceptor>::pop_front() :103 428x 25.0% 19.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::select_local_stream_socket>::pop_front() :103 428x 25.0% 19.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::select_tcp_acceptor>::pop_front() :103 428x 25.0% 19.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::select_tcp_socket>::pop_front() :103 428x 25.0% 19.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::select_udp_socket>::pop_front() :103 428x 25.0% 19.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::waiter_node>::pop_front() :103 699408x 100.0% 100.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::epoll_local_datagram_socket>::remove(boost::corosio::detail::epoll_local_datagram_socket*) :121 65x 83.3% 64.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::epoll_local_stream_acceptor>::remove(boost::corosio::detail::epoll_local_stream_acceptor*) :121 22x 75.0% 50.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::epoll_local_stream_socket>::remove(boost::corosio::detail::epoll_local_stream_socket*) :121 68x 91.7% 77.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::epoll_tcp_acceptor>::remove(boost::corosio::detail::epoll_tcp_acceptor*) :121 1165x 91.7% 77.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::epoll_tcp_socket>::remove(boost::corosio::detail::epoll_tcp_socket*) :121 15049x 91.7% 77.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::epoll_udp_socket>::remove(boost::corosio::detail::epoll_udp_socket*) :121 91x 83.3% 64.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::io_uring_multishot_acceptor_base<boost::corosio::detail::io_uring_local_stream_acceptor, boost::corosio::local_stream_acceptor::implementation, boost::corosio::local_endpoint, boost::corosio::detail::io_uring_local_stream_service>::waiter_node>::remove(boost::corosio::detail::io_uring_multishot_acceptor_base<boost::corosio::detail::io_uring_local_stream_acceptor, boost::corosio::local_stream_acceptor::implementation, boost::corosio::local_endpoint, boost::corosio::detail::io_uring_local_stream_service>::waiter_node*) :121 0 0.0% 0.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::io_uring_multishot_acceptor_base<boost::corosio::detail::io_uring_tcp_acceptor, boost::corosio::tcp_acceptor::implementation, boost::corosio::endpoint, boost::corosio::detail::io_uring_tcp_service>::waiter_node>::remove(boost::corosio::detail::io_uring_multishot_acceptor_base<boost::corosio::detail::io_uring_tcp_acceptor, boost::corosio::tcp_acceptor::implementation, boost::corosio::endpoint, boost::corosio::detail::io_uring_tcp_service>::waiter_node*) :121 0 0.0% 0.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::io_uring_random_access_file>::remove(boost::corosio::detail::io_uring_random_access_file*) :121 5x 75.0% 50.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::io_uring_stream_file>::remove(boost::corosio::detail::io_uring_stream_file*) :121 5x 75.0% 50.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::posix_random_access_file::raf_op>::remove(boost::corosio::detail::posix_random_access_file::raf_op*) :121 150x 83.3% 64.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::posix_random_access_file>::remove(boost::corosio::detail::posix_random_access_file*) :121 43x 75.0% 50.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::posix_resolver>::remove(boost::corosio::detail::posix_resolver*) :121 45x 83.3% 64.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::posix_signal>::remove(boost::corosio::detail::posix_signal*) :121 156x 83.3% 64.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::posix_stream_file>::remove(boost::corosio::detail::posix_stream_file*) :121 43x 83.3% 64.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::select_local_datagram_socket>::remove(boost::corosio::detail::select_local_datagram_socket*) :121 65x 83.3% 64.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::select_local_stream_acceptor>::remove(boost::corosio::detail::select_local_stream_acceptor*) :121 22x 75.0% 50.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::select_local_stream_socket>::remove(boost::corosio::detail::select_local_stream_socket*) :121 68x 91.7% 77.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::select_tcp_acceptor>::remove(boost::corosio::detail::select_tcp_acceptor*) :121 108x 91.7% 77.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::select_tcp_socket>::remove(boost::corosio::detail::select_tcp_socket*) :121 11491x 91.7% 77.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::select_udp_socket>::remove(boost::corosio::detail::select_udp_socket*) :121 91x 83.3% 64.0% boost::corosio::detail::intrusive_list<boost::corosio::detail::waiter_node>::remove(boost::corosio::detail::waiter_node*) :121 54x 83.3% 77.0% void boost::corosio::detail::intrusive_list<boost::corosio::detail::posix_random_access_file::raf_op>::for_each<boost::corosio::detail::posix_random_access_file::cancel()::{lambda(boost::corosio::detail::posix_random_access_file::raf_op*)#1}>(boost::corosio::detail::posix_random_access_file::cancel()::{lambda(boost::corosio::detail::posix_random_access_file::raf_op*)#1}) :141 122x 75.0% 38.0% boost::corosio::detail::intrusive_queue<boost::corosio::detail::pool_work_item>::intrusive_queue() :183 1481x 100.0% 100.0% boost::corosio::detail::intrusive_queue<boost::corosio::detail::scheduler_op>::intrusive_queue() :183 4579x 100.0% 100.0% boost::corosio::detail::intrusive_queue<boost::corosio::detail::pool_work_item>::empty() const :197 1743x 100.0% 100.0% boost::corosio::detail::intrusive_queue<boost::corosio::detail::scheduler_op>::empty() const :197 5249663x 100.0% 100.0% boost::corosio::detail::intrusive_queue<boost::corosio::detail::pool_work_item>::push(boost::corosio::detail::pool_work_item*) :202 218x 100.0% 100.0% boost::corosio::detail::intrusive_queue<boost::corosio::detail::scheduler_op>::push(boost::corosio::detail::scheduler_op*) :202 1598580x 100.0% 100.0% boost::corosio::detail::intrusive_queue<boost::corosio::detail::scheduler_op>::splice(boost::corosio::detail::intrusive_queue<boost::corosio::detail::scheduler_op>&) :212 824309x 94.4% 88.0% boost::corosio::detail::intrusive_queue<boost::corosio::detail::pool_work_item>::pop() :225 29x 100.0% 100.0%
Line TLA Hits Source Code
1 //
2 // Copyright (c) 2025 Vinnie Falco ([email protected])
3 //
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 //
7 // Official repository: https://github.com/cppalliance/corosio
8 //
9
10 #ifndef BOOST_COROSIO_DETAIL_INTRUSIVE_HPP
11 #define BOOST_COROSIO_DETAIL_INTRUSIVE_HPP
12
13 namespace boost::corosio::detail {
14
15 /** An intrusive doubly linked list.
16
17 This container provides O(1) push and pop operations for
18 elements that derive from @ref node. Elements are not
19 copied or moved; they are linked directly into the list.
20
21 @tparam T The element type. Must derive from `intrusive_list<T>::node`.
22 */
23 template<class T>
24 class intrusive_list
25 {
26 public:
27 /** Base class for list elements.
28
29 Derive from this class to make a type usable with
30 @ref intrusive_list. The `next_` and `prev_` pointers
31 are private and accessible only to the list.
32 */
33 class node
34 {
35 friend class intrusive_list;
36
37 private:
38 T* next_;
39 T* prev_;
40 };
41
42 private:
43 T* head_ = nullptr;
44 T* tail_ = nullptr;
45
46 public:
47 13251x intrusive_list() = default;
48
49 intrusive_list(intrusive_list&& other) noexcept
50 : head_(other.head_)
51 , tail_(other.tail_)
52 {
53 other.head_ = nullptr;
54 other.tail_ = nullptr;
55 }
56
57 intrusive_list(intrusive_list const&) = delete;
58 intrusive_list& operator=(intrusive_list const&) = delete;
59 intrusive_list& operator=(intrusive_list&&) = delete;
60
61 4011x bool empty() const noexcept
62 {
63 4011x return head_ == nullptr;
64 }
65
66 /// Peek at the head element without removing it.
67 3948x T* front() const noexcept
68 {
69 3948x return head_;
70 }
71
72 59165x void push_back(T* w) noexcept
73 {
74 59165x auto* n = static_cast<node*>(w);
75 59165x n->next_ = nullptr;
76 59165x n->prev_ = tail_;
77 59165x if (tail_)
78 25638x static_cast<node*>(tail_)->next_ = w;
79 else
80 33527x head_ = w;
81 59165x tail_ = w;
82 59165x }
83
84 void splice_back(intrusive_list& other) noexcept
85 {
86 if (other.empty())
87 return;
88 if (tail_)
89 {
90 static_cast<node*>(tail_)->next_ = other.head_;
91 static_cast<node*>(other.head_)->prev_ = tail_;
92 tail_ = other.tail_;
93 }
94 else
95 {
96 head_ = other.head_;
97 tail_ = other.tail_;
98 }
99 other.head_ = nullptr;
100 other.tail_ = nullptr;
101 }
102
103 724178x T* pop_front() noexcept
104 {
105 724178x if (!head_)
106 693819x return nullptr;
107 30359x T* w = head_;
108 30359x head_ = static_cast<node*>(head_)->next_;
109 30359x if (head_)
110 62x static_cast<node*>(head_)->prev_ = nullptr;
111 else
112 30297x tail_ = nullptr;
113 // Defensive: clear stale linkage so remove() on a
114 // popped node cannot corrupt the list.
115 30359x auto* n = static_cast<node*>(w);
116 30359x n->next_ = nullptr;
117 30359x n->prev_ = nullptr;
118 30359x return w;
119 }
120
121 28806x void remove(T* w) noexcept
122 {
123 28806x auto* n = static_cast<node*>(w);
124 // Already detached — nothing to do.
125 28806x if (!n->next_ && !n->prev_ && head_ != w && tail_ != w)
126 return;
127 28806x if (n->prev_)
128 7873x static_cast<node*>(n->prev_)->next_ = n->next_;
129 else
130 20933x head_ = n->next_;
131 28806x if (n->next_)
132 17792x static_cast<node*>(n->next_)->prev_ = n->prev_;
133 else
134 11014x tail_ = n->prev_;
135 28806x n->next_ = nullptr;
136 28806x n->prev_ = nullptr;
137 }
138
139 /// Invoke @p f for each element in the list.
140 template<class F>
141 122x void for_each(F f)
142 {
143 122x for (T* p = head_; p; p = static_cast<node*>(p)->next_)
144 f(p);
145 122x }
146 };
147
148 /** An intrusive singly linked FIFO queue.
149
150 This container provides O(1) push and pop operations for
151 elements that derive from @ref node. Elements are not
152 copied or moved; they are linked directly into the queue.
153
154 Unlike @ref intrusive_list, this uses only a single `next_`
155 pointer per node, saving memory at the cost of not supporting
156 O(1) removal of arbitrary elements.
157
158 @tparam T The element type. Must derive from `intrusive_queue<T>::node`.
159 */
160 template<class T>
161 class intrusive_queue
162 {
163 public:
164 /** Base class for queue elements.
165
166 Derive from this class to make a type usable with
167 @ref intrusive_queue. The `next_` pointer is private
168 and accessible only to the queue.
169 */
170 class node
171 {
172 friend class intrusive_queue;
173
174 private:
175 T* next_;
176 };
177
178 private:
179 T* head_ = nullptr;
180 T* tail_ = nullptr;
181
182 public:
183 6060x intrusive_queue() = default;
184
185 intrusive_queue(intrusive_queue&& other) noexcept
186 : head_(other.head_)
187 , tail_(other.tail_)
188 {
189 other.head_ = nullptr;
190 other.tail_ = nullptr;
191 }
192
193 intrusive_queue(intrusive_queue const&) = delete;
194 intrusive_queue& operator=(intrusive_queue const&) = delete;
195 intrusive_queue& operator=(intrusive_queue&&) = delete;
196
197 5251406x bool empty() const noexcept
198 {
199 5251406x return head_ == nullptr;
200 }
201
202 1598798x void push(T* w) noexcept
203 {
204 1598798x w->next_ = nullptr;
205 1598798x if (tail_)
206 723862x tail_->next_ = w;
207 else
208 874936x head_ = w;
209 1598798x tail_ = w;
210 1598798x }
211
212 824309x void splice(intrusive_queue& other) noexcept
213 {
214 824309x if (other.empty())
215 return;
216 824309x if (tail_)
217 259122x tail_->next_ = other.head_;
218 else
219 565187x head_ = other.head_;
220 824309x tail_ = other.tail_;
221 824309x other.head_ = nullptr;
222 824309x other.tail_ = nullptr;
223 }
224
225 2231464x T* pop() noexcept
226 {
227 2231464x if (!head_)
228 632666x return nullptr;
229 1598798x T* w = head_;
230 1598798x head_ = head_->next_;
231 1598798x if (!head_)
232 615814x tail_ = nullptr;
233 // Defensive: clear stale linkage on popped node.
234 1598798x w->next_ = nullptr;
235 1598798x return w;
236 }
237 };
238
239 } // namespace boost::corosio::detail
240
241 #endif
242