27 #include <type_traits>
33 template <
typename Node,
typename Accessor >
39 template <
typename T,
typename Node >
41 { T::get( n ) } -> std::convertible_to< list_header< Node, T >& >;
42 { T::get( cn ) } -> std::convertible_to< const list_header< Node, T >& >;
54 template <
typename Node,
typename Accessor >
72 *
this = std::move( other );
80 next = std::exchange( other.next,
nullptr );
81 prev = std::exchange( other.prev,
nullptr );
93 template <
typename Accessor,
typename Node >
96 template <
typename Ptr,
typename... Args >
99 template <
typename Ptr,
typename Node >
102 template <
typename Header >
105 template <
typename ListHeader >
109 static constexpr
bool is_const = std::is_const_v< ListHeader >;
115 const typename header_type::node_type,
116 typename header_type::node_type >;
144 return accessor_type::get( *node_ );
150 template <
typename ListHeader >
193 template <
typename... Args >
198 [[nodiscard]]
bool empty()
const;
208 template <
typename Node,
typename Accessor >
211 static_assert( header_accessor< Accessor, Node > );
213 if (
auto* h = next.find_header() )
216 if (
auto* h = prev.find_header() )
220 template <
typename Accessor,
typename Node >
223 auto& lnode = Accessor::get( node );
225 if ( lnode.next !=
nullptr )
226 Accessor::get( *lnode.next ).prev = lnode.prev;
227 if ( lnode.prev !=
nullptr )
228 Accessor::get( *lnode.prev ).next = lnode.next;
230 lnode.prev =
nullptr;
231 lnode.next =
nullptr;
234 template <
typename Ptr,
typename... Args >
237 using Node =
typename Ptr::node_type;
239 Node* nnode =
new Node{ std::forward< Args >( args )... };
244 template <
typename Ptr,
typename Node >
247 static_assert( std::same_as< typename Ptr::node_type, Node > );
248 using Accessor =
typename Ptr::accessor_type;
249 using Header =
typename Ptr::header_type;
251 Header& nnode = Accessor::get( next );
253 nnode.next = ptr.find_header()->next;
254 if ( nnode.next !=
nullptr )
255 nnode.next.find_header()->prev = &next;
257 ptr.find_header()->next = &next;
261 template <
typename Header >
264 while (
auto* node = header.next.get_node() )
268 template <
typename ListHeader >
274 template <
typename ListHeader >
280 template <
typename ListHeader >
286 template <
typename ListHeader >
292 template <
typename ListHeader >
298 template <
typename ListHeader >
305 template <
typename ListHeader >
312 template <
typename ListHeader >
320 template <
typename ListHeader >
328 template <
typename ListHeader >
331 iterator res{ header_.next.get_node() };
335 template <
typename ListHeader >
342 template <
typename ListHeader >
348 template <
typename ListHeader >
354 template <
typename ListHeader >
355 template <
typename... Args >
361 template <
typename ListHeader >
367 template <
typename ListHeader >
370 return header_.next ==
nullptr;
373 template <
typename ListHeader >
376 for (
auto iter = begin(); iter != end(); ) {
377 auto* node = &*( iter++ );
383 template <
typename ListHeader >
static constexpr bool is_const
Definition: list.hpp:109
list_iterator & operator--()
Definition: list.hpp:306
value_type & operator*()
Definition: list.hpp:275
std::conditional_t< is_const, const typename header_type::node_type, typename header_type::node_type > value_type
Definition: list.hpp:116
auto operator<=>(const list_iterator &) const =default
std::ptrdiff_t difference_type
Definition: list.hpp:112
ListHeader header_type
Definition: list.hpp:111
list_iterator & operator++()
Definition: list.hpp:299
value_type * operator->()
Definition: list.hpp:287
typename header_type::accessor_type accessor_type
Definition: list.hpp:117
Node * get_node()
Definition: list_ptr.hpp:87
Header * find_header()
Definition: list_ptr.hpp:97
ListHeader header_type
Definition: list.hpp:154
bool empty() const
Definition: list.hpp:368
list & operator=(const list &)=delete
node_type & back()
Definition: list.hpp:183
~list()
Definition: list.hpp:384
void link_front(node_type &node)
Definition: list.hpp:362
list(const list &)=delete
typename header_type::accessor_type accessor_type
Definition: list.hpp:156
void clear_if(auto &&f)
Definition: list.hpp:374
node_type & front()
Definition: list.hpp:173
const node_type & back() const
Definition: list.hpp:188
iterator end()
Definition: list.hpp:343
node_type & emplace_front(Args &&... args)
Definition: list.hpp:356
iterator begin()
Definition: list.hpp:329
typename header_type::node_type node_type
Definition: list.hpp:155
list & operator=(list &&)=default
const node_type & front() const
Definition: list.hpp:178
MIT License.
Definition: dag.hpp:27
auto & list_emplace_next(Ptr ptr, Args &&... args)
Definition: list.hpp:235
void list_delete_all_next(Header &header)
Definition: list.hpp:262
void list_unlink(Node &node)
Definition: list.hpp:221
concept header_accessor
Header accessor is a type that has static member function get(n) which returns reference to list head...
Definition: list.hpp:40
void list_link_next(Ptr ptr, Node &next)
Definition: list.hpp:245
Fun && f
Definition: task.hpp:93
requires(std::same_as< std::remove_cvref_t< T >, task_set >) void for_each_task(T &ts
Recursively executes function f for each task in set ts.