Skip to main content

doubly_list Class Template

A class template for a doubly linked list of nodes. More...

Declaration

template <doubly_list_links_node T, doubly_list_links_node L = doubly_list_links>
class micro_os_plus::utils::doubly_list<T, L> { ... }

Included Headers

Public Member Typedefs Index

template < ... >
usingis_statically_allocated = typename links_type::is_statically_allocated

Type indicating if the links node is statically allocated. More...

template < ... >
usingiterator = doubly_list_iterator< value_type >

Type of iterator over the values. More...

template < ... >
usingiterator_pointer = value_type *

Type of reference to the iterator internal pointer. More...

template < ... >
usinglinks_type = L

Type of the links node object where the pointers to the list head and tail are stored. More...

template < ... >
usingpointer = value_type *

Type of pointer to object pointed to by the iterator. More...

template < ... >
usingreference = value_type &

Type of reference to object pointed to by the iterator. More...

template < ... >
usingreverse_iterator = std::reverse_iterator< iterator >

Type of reverse iterator over the values. More...

template < ... >
usingvalue_type = T

Type of value pointed to by the iterator. More...

Public Constructors Index

template < ... >
doubly_list () noexcept

Construct a doubly linked list. More...

template < ... >
doubly_list (const doubly_list &)=delete

Deleted copy constructor. More...

template < ... >
doubly_list (doubly_list &&)=delete

Deleted move constructor. More...

Public Destructor Index

template < ... >
constexpr~doubly_list ()

Destruct the list. More...

Public Operators Index

template < ... >
doubly_list &operator= (const doubly_list &)=delete

Deleted copy assignment operator. More...

template < ... >
doubly_list &operator= (doubly_list &&)=delete

Deleted move assignment operator. More...

Public Member Functions Index

template < ... >
iteratorbegin () const noexcept

Iterator begin. More...

template < ... >
voidclear (void) noexcept

Clear the list. More...

template < ... >
constexpr boolempty (void) const noexcept

Check if the list is empty. More...

template < ... >
iteratorend () const noexcept

Iterator end. More...

template < ... >
constexpr pointerhead (void) const noexcept

Get the list head. More...

template < ... >
boolinitialise_once (void) noexcept

Initialise the list only at first run. More...

template < ... >
boolinitialised (void) const noexcept

Check if the list is initialised (only statically allocated lists can be uninitialised). More...

template < ... >
voidlink_head (reference node) noexcept

Add a node to the head of the list. More...

template < ... >
voidlink_tail (reference node) noexcept

Add a node to the tail of the list. More...

template < ... >
constexpr const links_type *links_pointer (void) const noexcept

Get the address of the node storing the list links. More...

template < ... >
reverse_iteratorrbegin () const noexcept

Reverse iterator begin. More...

template < ... >
reverse_iteratorrend () const noexcept

Reverse iterator end. More...

template < ... >
constexpr pointertail (void) const noexcept

Get the list tail. More...

Protected Member Attributes Index

template < ... >
links_typelinks_

The list top node used to point to head and tail nodes. More...

Description

A class template for a doubly linked list of nodes.

Template Parameters
T

Type of the elements linked into the list, derived from class doubly_list_links_base.

L

Type of the links node (either doubly_list_links or static_doubly_list_links).

This class implements a generic doubly linked list, maintaining a pair of head and tail pointers to allow efficient iteration and manipulation of nodes. The list elements (of type T) must be derived from doubly_list_links_base (typically from doubly_list_links) and extended with the required payload, which may be the actual content or a pointer to it.

The class uses composition for the links node, rather than inheritance, to avoid inheriting unwanted methods. Iterators return pointers to the list elements, enabling traversal of the list in a manner similar to standard containers.

info

std::reverse_iterator adaptors (rbegin()/rend()) are provided as thin wrappers around the bidirectional iterator.

Definition at line 250 of file doubly-list.h.

Public Member Typedefs

is_statically_allocated

template <doubly_list_links_node T, doubly_list_links_node L = doubly_list_links>
using micro_os_plus::utils::doubly_list< T, L >::is_statically_allocated = typename links_type::is_statically_allocated

Type indicating if the links node is statically allocated.

Definition at line 292 of file doubly-list.h.

iterator

template <doubly_list_links_node T, doubly_list_links_node L = doubly_list_links>
using micro_os_plus::utils::doubly_list< T, L >::iterator = doubly_list_iterator<value_type>

Type of iterator over the values.

Definition at line 277 of file doubly-list.h.

iterator_pointer

template <doubly_list_links_node T, doubly_list_links_node L = doubly_list_links>
using micro_os_plus::utils::doubly_list< T, L >::iterator_pointer = value_type*

Type of reference to the iterator internal pointer.

Definition at line 287 of file doubly-list.h.

links_type

template <doubly_list_links_node T, doubly_list_links_node L = doubly_list_links>
using micro_os_plus::utils::doubly_list< T, L >::links_type = L

Type of the links node object where the pointers to the list head and tail are stored.

Definition at line 257 of file doubly-list.h.

257 using links_type = L;

pointer

template <doubly_list_links_node T, doubly_list_links_node L = doubly_list_links>
using micro_os_plus::utils::doubly_list< T, L >::pointer = value_type*

Type of pointer to object pointed to by the iterator.

Definition at line 267 of file doubly-list.h.

reference

template <doubly_list_links_node T, doubly_list_links_node L = doubly_list_links>
using micro_os_plus::utils::doubly_list< T, L >::reference = value_type&

Type of reference to object pointed to by the iterator.

Definition at line 272 of file doubly-list.h.

reverse_iterator

template <doubly_list_links_node T, doubly_list_links_node L = doubly_list_links>
using micro_os_plus::utils::doubly_list< T, L >::reverse_iterator = std::reverse_iterator<iterator>

Type of reverse iterator over the values.

Definition at line 282 of file doubly-list.h.

282 using reverse_iterator = std::reverse_iterator<iterator>;

value_type

template <doubly_list_links_node T, doubly_list_links_node L = doubly_list_links>
using micro_os_plus::utils::doubly_list< T, L >::value_type = T

Type of value pointed to by the iterator.

Definition at line 262 of file doubly-list.h.

262 using value_type = T;

Public Constructors

doubly_list()

template <doubly_list_links_node T, doubly_list_links_node L = doubly_list_links>
micro_os_plus::utils::doubly_list< T, L >::doubly_list ()
noexcept

Construct a doubly linked list.

For non-statically allocated lists, the initial list status is empty after construction, meaning the list is ready for use and contains no nodes.

For statically allocated lists, the list remains uninitialised after construction, with its internal pointers set to nullptr. Such lists require explicit initialisation (typically via initialise_once()) before use.

This constructor does not clear or modify the internal pointers for statically allocated lists, relying on zero-initialisation by the runtime. For dynamically allocated lists, it calls clear() to ensure the list is in a valid empty state.

The rule of five

The copy constructor, move constructor, copy assignment operator, and move assignment operator are explicitly deleted to prevent accidental copying or moving of doubly_list objects. This ensures the integrity of the list structure, as duplicating or moving lists could result in invalid or inconsistent links within the list.

Declaration at line 298 of file doubly-list.h, definition at line 270 of file doubly-list-inlines.h.

271 {
272#if defined(MICRO_OS_PLUS_UTILS_LISTS_TRACE_CONSTRUCTORS_ENABLED)
273 trace::printf ("%s() @%p \n", __func__, static_cast<const void*> (this));
274#endif // defined(MICRO_OS_PLUS_UTILS_LISTS_TRACE_CONSTRUCTORS_ENABLED)
275
276 if constexpr (is_statically_allocated::value)
277 {
278 // By all means, do not add any code to clear the pointers, since
279 // the links node was statically initialised.
280 }
281 else
282 {
283 clear ();
284 }
285 }

Reference micro_os_plus::utils::doubly_list< T, L >::clear.

Referenced by micro_os_plus::utils::doubly_list< T, L >::doubly_list, micro_os_plus::utils::doubly_list< T, L >::doubly_list, micro_os_plus::utils::doubly_list< T, L >::operator= and micro_os_plus::utils::doubly_list< T, L >::operator=.

doubly_list()

template <doubly_list_links_node T, doubly_list_links_node L = doubly_list_links>
micro_os_plus::utils::doubly_list< T, L >::doubly_list (const doubly_list &)
delete

Deleted copy constructor.

Copying of doubly_list instances is explicitly disallowed to prevent accidental duplication, which could compromise the integrity of the list structure.

Definition at line 308 of file doubly-list.h.

Reference micro_os_plus::utils::doubly_list< T, L >::doubly_list.

doubly_list()

template <doubly_list_links_node T, doubly_list_links_node L = doubly_list_links>
micro_os_plus::utils::doubly_list< T, L >::doubly_list (doubly_list &&)
delete

Deleted move constructor.

Moving of doubly_list instances is explicitly disallowed to avoid invalid or inconsistent links within the list that could result from moving lists.

Definition at line 318 of file doubly-list.h.

Reference micro_os_plus::utils::doubly_list< T, L >::doubly_list.

Public Destructor

~doubly_list()

template <doubly_list_links_node T, doubly_list_links_node L = doubly_list_links>
micro_os_plus::utils::doubly_list< T, L >::~doubly_list ()
constexpr

Destruct the list.

Normally at this point there must be no nodes in the list. However, for statically allocated lists, this might not be always true due to their lifetime and initialization patterns.

info

In debug mode, the destructor emits a warning if the list is not empty when destroyed, helping to catch potential resource leaks or logic errors in list management.

Declaration at line 346 of file doubly-list.h, definition at line 300 of file doubly-list-inlines.h.

301 {
302#if defined(MICRO_OS_PLUS_UTILS_LISTS_TRACE_CONSTRUCTORS_ENABLED)
303 trace::printf ("%s() @%p \n", __func__, static_cast<const void*> (this));
304#endif // defined(MICRO_OS_PLUS_UTILS_LISTS_TRACE_CONSTRUCTORS_ENABLED)
305
306 // Perhaps enable it for non statically allocated lists.
307 // assert (empty ());
308#if defined(MICRO_OS_PLUS_UTILS_LISTS_TRACE_ENABLED)
309 if (!empty ())
310 {
311 trace::printf ("%s() @%p list not empty\n", __func__,
312 static_cast<const void*> (this));
313 }
314#endif // defined(MICRO_OS_PLUS_UTILS_LISTS_TRACE_ENABLED)
315 }

Reference micro_os_plus::utils::doubly_list< T, L >::empty.

Public Operators

operator=()

template <doubly_list_links_node T, doubly_list_links_node L = doubly_list_links>
doubly_list & micro_os_plus::utils::doubly_list< T, L >::operator= (const doubly_list &)
delete

Deleted copy assignment operator.

Copy assignment is explicitly disallowed to prevent accidental overwriting of list objects, which could lead to corruption of the list structure.

Definition at line 329 of file doubly-list.h.

Reference micro_os_plus::utils::doubly_list< T, L >::doubly_list.

operator=()

Public Member Functions

begin()

template <doubly_list_links_node T, doubly_list_links_node L = doubly_list_links>
doubly_list< T, L >::iterator micro_os_plus::utils::doubly_list< T, L >::begin ()
nodiscard noexcept

Iterator begin.

Returns

An iterator to the first element.

Returns an iterator to the first element in the list. For statically allocated lists, asserts that the list is already initialised. The iterator will point to the node after the internal links node (the head). If the list is empty, the iterator will compare equal to end().

Declaration at line 442 of file doubly-list.h, definition at line 495 of file doubly-list-inlines.h.

495 doubly_list<T, L>::begin () const noexcept
496 {
497#if defined(MICRO_OS_PLUS_UTILS_LISTS_TRACE_ENABLED)
498 trace::printf ("%s() @%p\n", __func__, static_cast<const void*> (this));
499#endif // defined(MICRO_OS_PLUS_UTILS_LISTS_TRACE_ENABLED)
500
501 if constexpr (is_statically_allocated::value)
502 {
503 assert (links_.initialised ());
504 }
505
506 return iterator{ static_cast<iterator_pointer> (links_.next ()) };
507 }

Reference micro_os_plus::utils::doubly_list< T, L >::links_.

Referenced by micro_os_plus::utils::doubly_list< T, L >::operator= and micro_os_plus::utils::doubly_list< T, L >::rend.

clear()

template <doubly_list_links_node T, doubly_list_links_node L = doubly_list_links>
void micro_os_plus::utils::doubly_list< T, L >::clear (void)
noexcept

Clear the list.

Parameters

None.

Returns

Nothing.

The clear() method initialises the mandatory internal links node so that both its previous_ and next_ pointers refer to itself. This marks the list as empty and ensures it is in a safe, known state, ready for new insertions. This operation is typically used to reset the list, removing all elements and breaking any existing links.

Declaration at line 392 of file doubly-list.h, definition at line 394 of file doubly-list-inlines.h.

395 {
396#if defined(MICRO_OS_PLUS_UTILS_LISTS_TRACE_ENABLED)
397 trace::printf ("%s() @%p\n", __func__, static_cast<const void*> (this));
398#endif // defined(MICRO_OS_PLUS_UTILS_LISTS_TRACE_ENABLED)
399
400 links_.initialise ();
401 }

Reference micro_os_plus::utils::doubly_list< T, L >::links_.

Referenced by micro_os_plus::utils::doubly_list< T, L >::doubly_list and micro_os_plus::utils::doubly_list< T, L >::operator=.

empty()

template <doubly_list_links_node T, doubly_list_links_node L = doubly_list_links>
bool micro_os_plus::utils::doubly_list< T, L >::empty (void)
nodiscard constexpr noexcept

Check if the list is empty.

Parameters

None.

Return Values
true

The list has no nodes.

false

The list has at least one node.

Checks whether the list contains any nodes. The list is considered empty if the internal links node is not linked to any other nodes. This method provides a fast way to determine if the list has elements or is currently empty.

Declaration at line 381 of file doubly-list.h, definition at line 378 of file doubly-list-inlines.h.

378 doubly_list<T, L>::empty (void) const noexcept
379 {
380 // If the links node is not linked, the list is empty.
381 return !links_.linked ();
382 }

Referenced by micro_os_plus::utils::doubly_list< T, L >::~doubly_list, micro_os_plus::utils::intrusive_list< T, N, MP, L, U >::empty and micro_os_plus::utils::doubly_list< T, L >::operator=.

end()

template <doubly_list_links_node T, doubly_list_links_node L = doubly_list_links>
doubly_list< T, L >::iterator micro_os_plus::utils::doubly_list< T, L >::end ()
nodiscard noexcept

Iterator end.

Returns

An iterator positioned after the last element.

Returns an iterator to the position after the last element in the list (the end iterator). This iterator points to the internal links node, which acts as a sentinel. It is used as the past-the-end marker in iteration and comparison operations. The end iterator does not reference any valid list element.

Declaration at line 450 of file doubly-list.h, definition at line 519 of file doubly-list-inlines.h.

519 doubly_list<T, L>::end () const noexcept
520 {
521#if defined(MICRO_OS_PLUS_UTILS_LISTS_TRACE_ENABLED)
522 trace::printf ("%s() @%p\n", __func__, static_cast<const void*> (this));
523#endif // defined(MICRO_OS_PLUS_UTILS_LISTS_TRACE_ENABLED)
524
525 // The assert would probably be redundant, since it was
526 // already tested in `begin()`.
527
528 return iterator{ reinterpret_cast<iterator_pointer> (
529 const_cast<links_type*> (&links_)) };
530 }

Reference micro_os_plus::utils::doubly_list< T, L >::links_.

Referenced by micro_os_plus::utils::doubly_list< T, L >::operator= and micro_os_plus::utils::doubly_list< T, L >::rbegin.

head()

template <doubly_list_links_node T, doubly_list_links_node L = doubly_list_links>
doubly_list< T, L >::pointer micro_os_plus::utils::doubly_list< T, L >::head (void)
nodiscard constexpr noexcept

Get the list head.

Parameters

None.

Returns

Pointer to the head node.

Returns a pointer to the first node in the list. If the list is empty, this will point to the internal links node itself, which can be used to detect the end of the list during iteration. The returned pointer should be checked against end() or the sentinel node to determine if the list contains any elements.

Declaration at line 402 of file doubly-list.h, definition at line 413 of file doubly-list-inlines.h.

413 doubly_list<T, L>::head (void) const noexcept
414 {
415 return static_cast<pointer> (links_.next ());
416 }

Reference micro_os_plus::utils::doubly_list< T, L >::links_.

Referenced by micro_os_plus::utils::doubly_list< T, L >::link_head, micro_os_plus::utils::intrusive_list< T, N, MP, L, U >::link_head and micro_os_plus::utils::doubly_list< T, L >::operator=.

initialise_once()

template <doubly_list_links_node T, doubly_list_links_node L = doubly_list_links>
bool micro_os_plus::utils::doubly_list< T, L >::initialise_once (void)
noexcept

Initialise the list only at first run.

Parameters

None.

Returns

true if the list was initialised, false otherwise.

If the statically allocated list is still in the initial uninitialised state (with both pointers null), this method initialises the list to the empty state, with both pointers pointing to itself. For non-statically initialised lists, this method has no effect.

info

Must be manually called for statically allocated lists before inserting elements or performing any other operations.

Declaration at line 370 of file doubly-list.h, definition at line 353 of file doubly-list-inlines.h.

354 {
355#if defined(MICRO_OS_PLUS_UTILS_LISTS_TRACE_ENABLED)
356 trace::printf ("%s() @%p\n", __func__, static_cast<const void*> (this));
357#endif // defined(MICRO_OS_PLUS_UTILS_LISTS_TRACE_ENABLED)
358
359 if constexpr (is_statically_allocated::value)
360 {
361 return links_.initialise_once ();
362 }
363 else
364 {
365 return false;
366 }
367 }

Referenced by micro_os_plus::utils::intrusive_list< T, N, MP, L, U >::initialise_once and micro_os_plus::utils::doubly_list< T, L >::operator=.

initialised()

template <doubly_list_links_node T, doubly_list_links_node L = doubly_list_links>
bool micro_os_plus::utils::doubly_list< T, L >::initialised (void)
nodiscard noexcept

Check if the list is initialised (only statically allocated lists can be uninitialised).

Parameters

None.

Return Values
true

The list was initialised.

false

The list was not initialised.

An uninitialised node is a node with any of the pointers set to nullptr. Only statically allocated nodes in the initial state are considered uninitialised. For dynamically allocated lists, this method always returns true since their nodes are explicitly initialised during construction.

Declaration at line 359 of file doubly-list.h, definition at line 327 of file doubly-list-inlines.h.

327 doubly_list<T, L>::initialised (void) const noexcept
328 {
329 if constexpr (is_statically_allocated::value)
330 {
331 return links_.initialised ();
332 }
333 else
334 {
335 return true;
336 }
337 }

Reference micro_os_plus::utils::doubly_list< T, L >::links_.

Referenced by micro_os_plus::utils::doubly_list< T, L >::operator=.

link_head()

template <doubly_list_links_node T, doubly_list_links_node L = doubly_list_links>
void micro_os_plus::utils::doubly_list< T, L >::link_head (reference node)
noexcept

Add a node to the head of the list.

Parameters
[in] node

Reference to the node to add.

Returns

Nothing.

Adds a new node to the beginning (head) of the list. For statically allocated lists, asserts that the list is already initialised. The new node is linked before the current head node, updating the list structure accordingly. This operation does not check for duplicate nodes or whether the node is already linked elsewhere.

Declaration at line 432 of file doubly-list.h, definition at line 469 of file doubly-list-inlines.h.

470 {
471#if defined(MICRO_OS_PLUS_UTILS_LISTS_TRACE_ENABLED)
472 trace::printf ("%s() @%p %p\n", __func__, static_cast<const void*> (this),
473 static_cast<const void*> (&node));
474#endif // defined(MICRO_OS_PLUS_UTILS_LISTS_TRACE_ENABLED)
475
476 if constexpr (is_statically_allocated::value)
477 {
478 assert (links_.initialised ());
479 }
480
481 // Add the new node at the head of the list.
482 head ()->link_previous (&node);
483 }

References micro_os_plus::utils::doubly_list< T, L >::head and micro_os_plus::utils::doubly_list< T, L >::links_.

Referenced by micro_os_plus::utils::doubly_list< T, L >::operator=.

link_tail()

template <doubly_list_links_node T, doubly_list_links_node L = doubly_list_links>
void micro_os_plus::utils::doubly_list< T, L >::link_tail (reference node)
noexcept

Add a node to the tail of the list.

Parameters
[in] node

Reference to the node to add.

Returns

Nothing.

Adds a new node to the end (tail) of the list. For statically allocated lists, asserts that the list is already initialised. The new node is linked after the current tail node, updating the list structure accordingly. This operation does not check for duplicate nodes or whether the node is already linked elsewhere.

Declaration at line 422 of file doubly-list.h, definition at line 443 of file doubly-list-inlines.h.

444 {
445#if defined(MICRO_OS_PLUS_UTILS_LISTS_TRACE_ENABLED)
446 trace::printf ("%s() @%p %p\n", __func__, static_cast<const void*> (this),
447 static_cast<const void*> (&node));
448#endif // defined(MICRO_OS_PLUS_UTILS_LISTS_TRACE_ENABLED)
449
450 if constexpr (is_statically_allocated::value)
451 {
452 assert (links_.initialised ());
453 }
454
455 // Add new node at the end of the list.
456 tail ()->link_next (&node);
457 }

Referenced by micro_os_plus::utils::doubly_list< T, L >::operator=.

links_pointer()

template <doubly_list_links_node T, doubly_list_links_node L = doubly_list_links>
const doubly_list< T, L >::links_type * micro_os_plus::utils::doubly_list< T, L >::links_pointer (void)
nodiscard constexpr noexcept

Get the address of the node storing the list links.

Parameters

None.

Returns

A pointer to the internal links node.

Returns the address of the links_ member. This method is required by derived classes (such as intrusive_list) when constructing their end() iterator, where a direct reference to the protected member is not accessible.

Returns the address of the links_ member directly. This method is required by derived classes (such as intrusive_list) when constructing their end() iterator, where a direct reference to the protected member is not accessible from the derived scope.

Declaration at line 484 of file doubly-list.h, definition at line 567 of file doubly-list-inlines.h.

568 {
569 return &links_;
570 }

Reference micro_os_plus::utils::doubly_list< T, L >::links_.

Referenced by micro_os_plus::utils::intrusive_list< T, N, MP, L, U >::end and micro_os_plus::utils::doubly_list< T, L >::operator=.

rbegin()

template <doubly_list_links_node T, doubly_list_links_node L = doubly_list_links>
doubly_list< T, L >::reverse_iterator micro_os_plus::utils::doubly_list< T, L >::rbegin ()
nodiscard noexcept

Reverse iterator begin.

Returns

A reverse iterator positioned at the last element.

Returns a reverse iterator to the last element in the list. Equivalent to reverse_iterator{ end() }. Traversal proceeds from the tail towards the head.

Declaration at line 458 of file doubly-list.h, definition at line 540 of file doubly-list-inlines.h.

540 doubly_list<T, L>::rbegin () const noexcept
541 {
542 return reverse_iterator{ end () };
543 }

Reference micro_os_plus::utils::doubly_list< T, L >::end.

Referenced by micro_os_plus::utils::doubly_list< T, L >::operator=.

rend()

template <doubly_list_links_node T, doubly_list_links_node L = doubly_list_links>
doubly_list< T, L >::reverse_iterator micro_os_plus::utils::doubly_list< T, L >::rend ()
nodiscard noexcept

Reverse iterator end.

Returns

A reverse iterator positioned before the first element.

Returns a reverse iterator to the position before the first element in the list. Equivalent to reverse_iterator{ begin() }. Used as the past-the-end marker for reverse-direction iteration.

Declaration at line 466 of file doubly-list.h, definition at line 553 of file doubly-list-inlines.h.

553 doubly_list<T, L>::rend () const noexcept
554 {
555 return reverse_iterator{ begin () };
556 }

Reference micro_os_plus::utils::doubly_list< T, L >::begin.

Referenced by micro_os_plus::utils::doubly_list< T, L >::operator=.

tail()

template <doubly_list_links_node T, doubly_list_links_node L = doubly_list_links>
doubly_list< T, L >::pointer micro_os_plus::utils::doubly_list< T, L >::tail (void)
nodiscard constexpr noexcept

Get the list tail.

Parameters

None.

Returns

Pointer to the tail node.

Returns a pointer to the last node in the list. If the list is empty, this will point to the internal links node itself, which can be used to detect the end of the list during reverse iteration. The returned pointer should be checked against the sentinel node to determine if the list contains any elements.

Declaration at line 412 of file doubly-list.h, definition at line 428 of file doubly-list-inlines.h.

428 doubly_list<T, L>::tail (void) const noexcept
429 {
430 return static_cast<pointer> (links_.previous ());
431 }

Reference micro_os_plus::utils::doubly_list< T, L >::links_.

Referenced by micro_os_plus::utils::intrusive_list< T, N, MP, L, U >::link_tail and micro_os_plus::utils::doubly_list< T, L >::operator=.

Protected Member Attributes

links_

template <doubly_list_links_node T, doubly_list_links_node L = doubly_list_links>
links_type micro_os_plus::utils::doubly_list< T, L >::links_
protected

The documentation for this class was generated from the following files:


Generated via doxygen2docusaurus 2.2.2 by Doxygen 1.17.0.