µOS++ IIIe Reference 7.0.0
The third edition of µOS++, a POSIX inspired open source framework, written in C++
Loading...
Searching...
No Matches
os::utils::intrusive_list_iterator< T, N, MP, U > Class Template Reference

Template for an intrusive list iterator. More...

#include <cmsis-plus/utils/lists.h>

Public Types

Public Types
using value_type = U
 Type of value "pointed to" by the iterator.
 
using pointer = U *
 Type of pointer to object "pointed to" by the iterator.
 
using reference = U &
 Type of reference to object "pointed to" by the iterator.
 
using iterator_pointer = N *
 Type of reference to the iterator internal pointer.
 
using difference_type = ptrdiff_t
 Type of pointer difference.
 
using iterator_category = std::forward_iterator_tag
 Category of iterator.
 

Public Member Functions

Constructors & Destructor
constexpr intrusive_list_iterator ()
 
constexpr intrusive_list_iterator (iterator_pointer const node)
 
constexpr intrusive_list_iterator (reference element)
 
Operators
pointer operator-> () const
 
reference operator* () const
 
intrusive_list_iteratoroperator++ ()
 
intrusive_list_iterator operator++ (int)
 
intrusive_list_iteratoroperator-- ()
 
intrusive_list_iterator operator-- (int)
 
bool operator== (const intrusive_list_iterator &other) const
 
bool operator!= (const intrusive_list_iterator &other) const
 
Public Member Functions
pointer get_pointer (void) const
 Get the object node from the intrusive node.
 
iterator_pointer get_iterator_pointer () const
 

Protected Attributes

Private Member Variables
iterator_pointer node_
 Pointer to intrusive node.
 

Detailed Description

template<typename T, typename N, N T::* MP, typename U = T>
class os::utils::intrusive_list_iterator< T, N, MP, U >
Template Parameters
TType of object that includes the intrusive node.
NType of intrusive node. Must have the public members prev & next.
MPName of the intrusive node member in object T.
UType stored in the list, derived from T.

This class provides an interface similar to std::list::iterator.

Definition at line 543 of file lists.h.

Member Typedef Documentation

◆ difference_type

template<typename T , typename N , N T::* MP, typename U = T>
using os::utils::intrusive_list_iterator< T, N, MP, U >::difference_type = ptrdiff_t

Definition at line 574 of file lists.h.

◆ iterator_category

template<typename T , typename N , N T::* MP, typename U = T>
using os::utils::intrusive_list_iterator< T, N, MP, U >::iterator_category = std::forward_iterator_tag

Definition at line 579 of file lists.h.

◆ iterator_pointer

template<typename T , typename N , N T::* MP, typename U = T>
using os::utils::intrusive_list_iterator< T, N, MP, U >::iterator_pointer = N*

Definition at line 569 of file lists.h.

◆ pointer

template<typename T , typename N , N T::* MP, typename U = T>
using os::utils::intrusive_list_iterator< T, N, MP, U >::pointer = U*

Definition at line 559 of file lists.h.

◆ reference

template<typename T , typename N , N T::* MP, typename U = T>
using os::utils::intrusive_list_iterator< T, N, MP, U >::reference = U&

Definition at line 564 of file lists.h.

◆ value_type

template<typename T , typename N , N T::* MP, typename U = T>
using os::utils::intrusive_list_iterator< T, N, MP, U >::value_type = U

Definition at line 554 of file lists.h.

Constructor & Destructor Documentation

◆ intrusive_list_iterator() [1/3]

template<typename T , typename N , N T::* MP, typename U >
constexpr os::utils::intrusive_list_iterator< T, N, MP, U >::intrusive_list_iterator
constexpr

Definition at line 1022 of file lists.h.

1023 : node_{}
1024 {
1025 }
iterator_pointer node_
Pointer to intrusive node.
Definition lists.h:662

◆ intrusive_list_iterator() [2/3]

template<typename T , typename N , N T::* MP, typename U >
constexpr os::utils::intrusive_list_iterator< T, N, MP, U >::intrusive_list_iterator ( iterator_pointer const  node)
explicitconstexpr

Definition at line 1028 of file lists.h.

1030 : node_{ node }
1031 {
1032 }

◆ intrusive_list_iterator() [3/3]

template<typename T , typename N , N T::* MP, typename U >
constexpr os::utils::intrusive_list_iterator< T, N, MP, U >::intrusive_list_iterator ( reference  element)
explicitconstexpr

Definition at line 1035 of file lists.h.

1037 : node_{ &(element.*MP) }
1038 {
1039 static_assert (std::is_convertible<U, T>::value == true,
1040 "U must be implicitly convertible to T!");
1041 }

Member Function Documentation

◆ get_iterator_pointer()

template<typename T , typename N , N T::* MP, typename U >
intrusive_list_iterator< T, N, MP, U >::iterator_pointer os::utils::intrusive_list_iterator< T, N, MP, U >::get_iterator_pointer
inline

Definition at line 1127 of file lists.h.

1128 {
1129 return node_;
1130 }

◆ get_pointer()

template<typename T , typename N , N T::* MP, typename U >
intrusive_list_iterator< T, N, MP, U >::pointer os::utils::intrusive_list_iterator< T, N, MP, U >::get_pointer ( void  ) const
inline
Returns
Pointer to object node.

Definition at line 1109 of file lists.h.

1110 {
1111 // static_assert(std::is_convertible<U, T>::value == true, "U must be
1112 // implicitly convertible to T!");
1113
1114 // Compute the distance between the member intrusive link
1115 // node and the class begin.
1116 const auto offset = reinterpret_cast<difference_type> (
1117 &(static_cast<T*> (nullptr)->*MP));
1118
1119 // Compute the address of the object which includes the
1120 // intrusive node, by adjusting down the node address.
1121 return reinterpret_cast<pointer> (
1122 reinterpret_cast<difference_type> (node_) - offset);
1123 }
ptrdiff_t difference_type
Type of pointer difference.
Definition lists.h:574
U * pointer
Type of pointer to object "pointed to" by the iterator.
Definition lists.h:559

◆ operator!=()

template<typename T , typename N , N T::* MP, typename U >
bool os::utils::intrusive_list_iterator< T, N, MP, U >::operator!= ( const intrusive_list_iterator< T, N, MP, U > &  other) const
inline

Definition at line 1101 of file lists.h.

1103 {
1104 return node_ != other.node_;
1105 }

References os::utils::intrusive_list_iterator< T, N, MP, U >::node_.

◆ operator*()

template<typename T , typename N , N T::* MP, typename U >
intrusive_list_iterator< T, N, MP, U >::reference os::utils::intrusive_list_iterator< T, N, MP, U >::operator*
inline

Definition at line 1052 of file lists.h.

1053 {
1054 return *get_pointer ();
1055 }
pointer get_pointer(void) const
Get the object node from the intrusive node.
Definition lists.h:1109

◆ operator++() [1/2]

template<typename T , typename N , N T::* MP, typename U >
intrusive_list_iterator< T, N, MP, U > & os::utils::intrusive_list_iterator< T, N, MP, U >::operator++
inline

Definition at line 1059 of file lists.h.

1060 {
1061 node_ = static_cast<iterator_pointer> (node_->next ());
1062 return *this;
1063 }
N * iterator_pointer
Type of reference to the iterator internal pointer.
Definition lists.h:569

◆ operator++() [2/2]

template<typename T , typename N , N T::* MP, typename U >
intrusive_list_iterator< T, N, MP, U > os::utils::intrusive_list_iterator< T, N, MP, U >::operator++ ( int  )
inline

Definition at line 1067 of file lists.h.

1068 {
1069 const auto tmp = *this;
1070 node_ = static_cast<iterator_pointer> (node_->next ());
1071 return tmp;
1072 }

◆ operator--() [1/2]

template<typename T , typename N , N T::* MP, typename U >
intrusive_list_iterator< T, N, MP, U > & os::utils::intrusive_list_iterator< T, N, MP, U >::operator--
inline

Definition at line 1076 of file lists.h.

1077 {
1078 node_ = static_cast<iterator_pointer> (node_->prev ());
1079 return *this;
1080 }

◆ operator--() [2/2]

template<typename T , typename N , N T::* MP, typename U >
intrusive_list_iterator< T, N, MP, U > os::utils::intrusive_list_iterator< T, N, MP, U >::operator-- ( int  )

Definition at line 1084 of file lists.h.

1085 {
1086 const auto tmp = *this;
1087 node_ = static_cast<iterator_pointer> (node_->prev ());
1088 return tmp;
1089 }

◆ operator->()

template<typename T , typename N , N T::* MP, typename U >
intrusive_list_iterator< T, N, MP, U >::pointer os::utils::intrusive_list_iterator< T, N, MP, U >::operator->
inline

Definition at line 1045 of file lists.h.

1046 {
1047 return get_pointer ();
1048 }

◆ operator==()

template<typename T , typename N , N T::* MP, typename U >
bool os::utils::intrusive_list_iterator< T, N, MP, U >::operator== ( const intrusive_list_iterator< T, N, MP, U > &  other) const
inline

Definition at line 1093 of file lists.h.

1095 {
1096 return node_ == other.node_;
1097 }

References os::utils::intrusive_list_iterator< T, N, MP, U >::node_.

Member Data Documentation

◆ node_

template<typename T , typename N , N T::* MP, typename U = T>
iterator_pointer os::utils::intrusive_list_iterator< T, N, MP, U >::node_
protected

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