aGrUM  0.20.3
a C++ library for (probabilistic) graphical models
gum::ListConstIterator< Val > Class Template Reference

Unsafe but fast const iterators for Lists. More...

#include <agrum/tools/core/list.h>

+ Inheritance diagram for gum::ListConstIterator< Val >:

Public Member Functions

template<typename Alloc >
INLINE ListConstIterator (const List< Val, Alloc > &theList) noexcept
 
Constructors / Destructors
 ListConstIterator () noexcept
 Default constructor. More...
 
template<typename Alloc >
 ListConstIterator (const List< Val, Alloc > &theList) noexcept
 Constructor for a begin. More...
 
 ListConstIterator (const ListConstIterator< Val > &src) noexcept
 Copy constructor. More...
 
 ListConstIterator (ListConstIterator< Val > &&src) noexcept
 Move constructor. More...
 
 ListConstIterator (const List< Val > &theList, Size ind_elt)
 Constructor for an iterator pointing to the ind_eltth element of a List. More...
 
 ~ListConstIterator () noexcept
 Class Desctructor. More...
 
Accessors / Modifiers
void clear () noexcept
 Makes the iterator point toward nothing. More...
 
void setToEnd () noexcept
 Positions the iterator to the end of the list. More...
 
bool isEnd () const noexcept
 Returns a bool indicating whether the iterator points to the end of the list. More...
 
Operators
ListConstIterator< Val > & operator= (const ListConstIterator< Val > &src) noexcept
 Copy operator. More...
 
ListConstIterator< Val > & operator= (ListConstIterator< Val > &&src) noexcept
 Move operator. More...
 
ListConstIterator< Val > & operator++ () noexcept
 Makes the iterator point to the next element in the List. More...
 
ListConstIterator< Val > & operator+= (difference_type i) noexcept
 Makes the iterator point to i elements further in the List. More...
 
ListConstIterator< Val > & operator-- () noexcept
 Makes the iterator point to the preceding element in the List. More...
 
ListConstIterator< Val > & operator-= (difference_type i) noexcept
 Makes the iterator point to i elements befor in the List. More...
 
ListConstIterator< Val > operator+ (difference_type i) noexcept
 Returns a new iterator pointing to i further elements in the gum::List. More...
 
ListConstIterator< Val > operator- (difference_type i) noexcept
 Returns a new iterator pointing to i preceding elements in the gum::List. More...
 
bool operator!= (const ListConstIterator< Val > &src) const noexcept
 Checks whether two iterators point toward different elements. More...
 
bool operator== (const ListConstIterator< Val > &src) const noexcept
 Checks whether two iterators point toward the same elements. More...
 
const Val & operator* () const
 Gives access to the content of the iterator. More...
 
const Val * operator-> () const
 Dereferences the value pointed to by the iterator. More...
 

Public Types

using iterator_category = std::bidirectional_iterator_tag
 Types for STL compliance. More...
 
using value_type = Val
 Types for STL compliance. More...
 
using reference = Val &
 Types for STL compliance. More...
 
using const_reference = const Val &
 Types for STL compliance. More...
 
using pointer = Val *
 Types for STL compliance. More...
 
using const_pointer = const Val *
 Types for STL compliance. More...
 
using difference_type = std::ptrdiff_t
 Types for STL compliance. More...
 

Friends

template<typename T , typename A >
class List
 Class List must be a friend because it uses the getBucket method to speed up some processes. More...
 

Detailed Description

template<typename Val>
class gum::ListConstIterator< Val >

Unsafe but fast const iterators for Lists.

Class ListConstIterator implements unsafe iterators for List. However, developers may consider using List<x>::const_iterator instead of ListConstIterator<x>.

These iterators are fast but they are unaware of changes within the List. Therefore, if they point to an element that is being deleted from memory by the list, their accessing this element will most probably produce a segmentation fault. Similarly, incrementing or decrementing such an iterator pointing to a deleted element will most certainly produce a mess. So, ListConstIterator should be used only if you are sure that they will never point to an element that has been removed from the list (a typical use is to iterate over a const List). Whenever you are not sure that this property holds, use ListConstIteratorSafe<x> or List<x>::const_iterator_safe. Those iterators are a little bit slower but guarantee that no segmentation fault will ever occur.

Usage example:
// create a list of strings
List<string> list;
list.pushBack ("toto"); list.pushBack ("titi");
// parse all the elements of a list
for ( List<string>::const_iterator iter = list.cbegin ();
iter != list.cend (); ++iter )
cerr << *iter << endl;
for ( List<string>::const_iterator iter = list.cbegin ();
iter != list.cend (); iter += 2 ) // step = 2
cerr << *iter << endl;
for ( List<string>::const_iterator iter = list.cbegin ();
iter != list.cend (); iter = iter + 2 ) // step = 2
cerr << *iter << endl;
for ( List<string>::const_iterator iter = list.crbegin ();
iter != list.crend (); --iter )
cerr << *iter << endl;
// use member size() of the strings
for ( List<string>::const_iterator iter = list.cbegin ();
iter != list.cend (); ++iter)
cerr << iter->size() << endl;
Template Parameters
ValThe gum::List values type.

Definition at line 1498 of file list.h.

Member Typedef Documentation

◆ const_pointer

template<typename Val >
using gum::ListConstIterator< Val >::const_pointer = const Val*

Types for STL compliance.

Definition at line 1507 of file list.h.

◆ const_reference

template<typename Val >
using gum::ListConstIterator< Val >::const_reference = const Val&

Types for STL compliance.

Definition at line 1505 of file list.h.

◆ difference_type

template<typename Val >
using gum::ListConstIterator< Val >::difference_type = std::ptrdiff_t

Types for STL compliance.

Definition at line 1508 of file list.h.

◆ iterator_category

template<typename Val >
using gum::ListConstIterator< Val >::iterator_category = std::bidirectional_iterator_tag

Types for STL compliance.

Definition at line 1502 of file list.h.

◆ pointer

template<typename Val >
using gum::ListConstIterator< Val >::pointer = Val*

Types for STL compliance.

Definition at line 1506 of file list.h.

◆ reference

template<typename Val >
using gum::ListConstIterator< Val >::reference = Val&

Types for STL compliance.

Definition at line 1504 of file list.h.

◆ value_type

template<typename Val >
using gum::ListConstIterator< Val >::value_type = Val

Types for STL compliance.

Definition at line 1503 of file list.h.

Constructor & Destructor Documentation

◆ ListConstIterator() [1/6]

template<typename Val >
INLINE gum::ListConstIterator< Val >::ListConstIterator ( )
noexcept

Default constructor.

Returns an iterator pointing toward nothing.

Definition at line 133 of file list_tpl.h.

References gum::Set< Key, Alloc >::emplace().

133  {
134  // for debugging purposes
135  GUM_CONSTRUCTOR(ListConstIterator);
136  }
ListConstIterator() noexcept
Default constructor.
Definition: list_tpl.h:133
+ Here is the call graph for this function:

◆ ListConstIterator() [2/6]

template<typename Val >
template<typename Alloc >
gum::ListConstIterator< Val >::ListConstIterator ( const List< Val, Alloc > &  theList)
noexcept

Constructor for a begin.

Template Parameters
AllocThe gum::List allocator.

◆ ListConstIterator() [3/6]

template<typename Val >
INLINE gum::ListConstIterator< Val >::ListConstIterator ( const ListConstIterator< Val > &  src)
noexcept

Copy constructor.

Parameters
srcThe gum::ListConstIterator to copy.

Definition at line 149 of file list_tpl.h.

References gum::Set< Key, Alloc >::emplace().

149  :
150  _bucket_{src._bucket_} {
151  // for debugging purposes
152  GUM_CONS_CPY(ListConstIterator);
153  }
ListBucket< Val > * _bucket_
The bucket in the chained list pointed to by the iterator.
Definition: list.h:1717
ListConstIterator() noexcept
Default constructor.
Definition: list_tpl.h:133
+ Here is the call graph for this function:

◆ ListConstIterator() [4/6]

template<typename Val >
INLINE gum::ListConstIterator< Val >::ListConstIterator ( ListConstIterator< Val > &&  src)
noexcept

Move constructor.

Parameters
srcThe gum::ListConstIterator to move.

Definition at line 157 of file list_tpl.h.

References gum::Set< Key, Alloc >::emplace().

157  :
158  _bucket_{std::move(src._bucket_)} {
159  // for debugging purposes
160  GUM_CONS_MOV(ListConstIterator);
161  }
ListBucket< Val > * _bucket_
The bucket in the chained list pointed to by the iterator.
Definition: list.h:1717
ListConstIterator() noexcept
Default constructor.
Definition: list_tpl.h:133
+ Here is the call graph for this function:

◆ ListConstIterator() [5/6]

template<typename Val >
INLINE gum::ListConstIterator< Val >::ListConstIterator ( const List< Val > &  theList,
Size  ind_elt 
)

Constructor for an iterator pointing to the ind_eltth element of a List.

Parameters
theListThe list to iterate over.
ind_eltThe iterator starting position.
Exceptions
UndefinedIteratorValueRaised if the element does not exist in the list.

Definition at line 166 of file list_tpl.h.

References gum::Set< Key, Alloc >::emplace().

166  {
167  // for debugging purposes
168  GUM_CONSTRUCTOR(ListConstIterator);
169 
170  // check if the index ind_elt passed as parameter is valid
171  if (ind_elt >= theList._nb_elements_) {
172  GUM_ERROR(UndefinedIteratorValue, "Not enough elements in the list")
173  }
174 
175  // check if it is faster to find the indexth element from the start or
176  // from the end of the list
177  if (ind_elt < (theList._nb_elements_ >> 1)) {
178  // find the element we shall point to src the start of the list
179  for (_bucket_ = theList._deb_list_; ind_elt; --ind_elt, _bucket_ = _bucket_->_next_) {}
180  } else {
181  // find the element we shall point to src the end of the list
182  for (_bucket_ = theList._end_list_, ind_elt = theList._nb_elements_ - ind_elt - 1; ind_elt;
183  --ind_elt, _bucket_ = _bucket_->_prev_) {}
184  }
185  }
ListBucket< Val > * _bucket_
The bucket in the chained list pointed to by the iterator.
Definition: list.h:1717
ListConstIterator() noexcept
Default constructor.
Definition: list_tpl.h:133
#define GUM_ERROR(type, msg)
Definition: exceptions.h:51
+ Here is the call graph for this function:

◆ ~ListConstIterator()

template<typename Val >
INLINE gum::ListConstIterator< Val >::~ListConstIterator ( )
noexcept

Class Desctructor.

Definition at line 189 of file list_tpl.h.

References gum::Set< Key, Alloc >::emplace().

189  {
190  // for debugging purposes
191  GUM_DESTRUCTOR(ListConstIterator);
192  }
ListConstIterator() noexcept
Default constructor.
Definition: list_tpl.h:133
+ Here is the call graph for this function:

◆ ListConstIterator() [6/6]

template<typename Val >
template<typename Alloc >
INLINE gum::ListConstIterator< Val >::ListConstIterator ( const List< Val, Alloc > &  theList)
noexcept

Definition at line 141 of file list_tpl.h.

References gum::Set< Key, Alloc >::emplace().

141  :
142  _bucket_{theList._deb_list_} {
143  // for debugging purposes
144  GUM_CONSTRUCTOR(ListConstIterator);
145  }
ListBucket< Val > * _bucket_
The bucket in the chained list pointed to by the iterator.
Definition: list.h:1717
ListConstIterator() noexcept
Default constructor.
Definition: list_tpl.h:133
+ Here is the call graph for this function:

Member Function Documentation

◆ _getBucket_()

template<typename Val >
INLINE ListBucket< Val > * gum::ListConstIterator< Val >::_getBucket_ ( ) const
privatenoexcept

Returns the bucket the iterator is pointing to.

Definition at line 217 of file list_tpl.h.

References gum::Set< Key, Alloc >::emplace().

217  {
218  return _bucket_;
219  }
ListBucket< Val > * _bucket_
The bucket in the chained list pointed to by the iterator.
Definition: list.h:1717
+ Here is the call graph for this function:

◆ clear()

template<typename Val >
INLINE void gum::ListConstIterator< Val >::clear ( )
noexcept

Makes the iterator point toward nothing.

A method for detaching the iterator from the List it is attached to. After being detached, the iterator does not point to any element, i.e., trying to access its content will raise an exception.

Definition at line 223 of file list_tpl.h.

References gum::Set< Key, Alloc >::emplace().

223  {
224  _bucket_ = nullptr;
225  }
ListBucket< Val > * _bucket_
The bucket in the chained list pointed to by the iterator.
Definition: list.h:1717
+ Here is the call graph for this function:

◆ isEnd()

template<typename Val >
INLINE bool gum::ListConstIterator< Val >::isEnd ( ) const
noexcept

Returns a bool indicating whether the iterator points to the end of the list.

Returns
Returns a bool indicating whether the iterator points to the end of the list.

Definition at line 236 of file list_tpl.h.

References gum::Set< Key, Alloc >::emplace().

236  {
237  return (_bucket_ == nullptr);
238  }
ListBucket< Val > * _bucket_
The bucket in the chained list pointed to by the iterator.
Definition: list.h:1717
+ Here is the call graph for this function:

◆ operator!=()

template<typename Val >
INLINE bool gum::ListConstIterator< Val >::operator!= ( const ListConstIterator< Val > &  src) const
noexcept

Checks whether two iterators point toward different elements.

Warning
the end and rend iterators are always equal, whatever the list they belong to, i.e., list1.end() == list2.rend().
Parameters
srcThe gum::ListConstIterator to test for inequality.
Returns
Returns true if src and this are equal.

Definition at line 301 of file list_tpl.h.

References gum::Set< Key, Alloc >::emplace().

301  {
302  return (_bucket_ != src._bucket_);
303  }
ListBucket< Val > * _bucket_
The bucket in the chained list pointed to by the iterator.
Definition: list.h:1717
+ Here is the call graph for this function:

◆ operator*()

template<typename Val >
INLINE const Val & gum::ListConstIterator< Val >::operator* ( ) const

Gives access to the content of the iterator.

Exceptions
UndefinedIteratorValueRaised if the iterator points to nothing.
Returns
Returns the content of the iterator.

Definition at line 324 of file list_tpl.h.

References gum::Set< Key, Alloc >::emplace().

324  {
325  if (_bucket_ != nullptr)
326  return _bucket_->_val_;
327  else {
328  GUM_ERROR(UndefinedIteratorValue, "Accessing a NULL object")
329  }
330  }
ListBucket< Val > * _bucket_
The bucket in the chained list pointed to by the iterator.
Definition: list.h:1717
#define GUM_ERROR(type, msg)
Definition: exceptions.h:51
+ Here is the call graph for this function:

◆ operator+()

template<typename Val >
INLINE ListConstIterator< Val > gum::ListConstIterator< Val >::operator+ ( difference_type  i)
noexcept

Returns a new iterator pointing to i further elements in the gum::List.

Parameters
iThe number of steps to move the iterator.
Returns
Returns a new gum::ListConstIterator.

Definition at line 286 of file list_tpl.h.

References gum::Set< Key, Alloc >::emplace().

287  {
288  return ListConstIterator< Val >(*this) += i;
289  }
+ Here is the call graph for this function:

◆ operator++()

template<typename Val >
INLINE ListConstIterator< Val > & gum::ListConstIterator< Val >::operator++ ( )
noexcept

Makes the iterator point to the next element in the List.

for (iter = list.begin(); iter != list.end(); ++iter) { }

The above loop is guaranteed to parse the whole List as long as no element is added to or deleted from the List while being in the loop. Runs in constant time.

Returns
Returns this gum::ListConstIterator.

Definition at line 242 of file list_tpl.h.

References gum::Set< Key, Alloc >::emplace().

242  {
243  // if we are pointing to an element of the chained list, just
244  // point on the next bucket in this list
245  if (_bucket_ != nullptr) { _bucket_ = _bucket_->_next_; }
246 
247  return *this;
248  }
ListBucket< Val > * _bucket_
The bucket in the chained list pointed to by the iterator.
Definition: list.h:1717
+ Here is the call graph for this function:

◆ operator+=()

template<typename Val >
INLINE ListConstIterator< Val > & gum::ListConstIterator< Val >::operator+= ( difference_type  i)
noexcept

Makes the iterator point to i elements further in the List.

Parameters
iThe number of steps to move the iterator.
Returns
Returns this gum::ListConstIterator.

Definition at line 252 of file list_tpl.h.

References gum::Set< Key, Alloc >::emplace().

253  {
254  if (i >= 0) {
255  for (; i && (_bucket_ != nullptr); --i, _bucket_ = _bucket_->_next_) {}
256  } else {
257  for (; i && (_bucket_ != nullptr); ++i, _bucket_ = _bucket_->_prev_) {}
258  }
259  return *this;
260  }
ListBucket< Val > * _bucket_
The bucket in the chained list pointed to by the iterator.
Definition: list.h:1717
+ Here is the call graph for this function:

◆ operator-()

template<typename Val >
INLINE ListConstIterator< Val > gum::ListConstIterator< Val >::operator- ( difference_type  i)
noexcept

Returns a new iterator pointing to i preceding elements in the gum::List.

Parameters
iThe number of steps to move the iterator.
Returns
Returns a new gum::ListConstIterator.

Definition at line 293 of file list_tpl.h.

References gum::Set< Key, Alloc >::emplace().

294  {
295  return ListConstIterator< Val >(*this) -= i;
296  }
+ Here is the call graph for this function:

◆ operator--()

template<typename Val >
INLINE ListConstIterator< Val > & gum::ListConstIterator< Val >::operator-- ( )
noexcept

Makes the iterator point to the preceding element in the List.

for (iter = list.rbegin(); iter != list.rend(); --iter) { }

The above loop is guaranteed to parse the whole List as long as no element is added to or deleted from the List while being in the loop. Runs in constant time.

Returns
Returns this gum::ListConstIterator.

Definition at line 264 of file list_tpl.h.

References gum::Set< Key, Alloc >::emplace().

264  {
265  // if we are pointing to an element of the chained list, just
266  // point on the preceding bucket in this list
267  if (_bucket_ != nullptr) { _bucket_ = _bucket_->_prev_; }
268 
269  return *this;
270  }
ListBucket< Val > * _bucket_
The bucket in the chained list pointed to by the iterator.
Definition: list.h:1717
+ Here is the call graph for this function:

◆ operator-=()

template<typename Val >
INLINE ListConstIterator< Val > & gum::ListConstIterator< Val >::operator-= ( difference_type  i)
noexcept

Makes the iterator point to i elements befor in the List.

Parameters
iThe number of steps to move the iterator.
Returns
Returns this gum::ListConstIterator.

Definition at line 274 of file list_tpl.h.

References gum::Set< Key, Alloc >::emplace().

275  {
276  if (i >= 0) {
277  for (; i && (_bucket_ != nullptr); --i, _bucket_ = _bucket_->_prev_) {}
278  } else {
279  for (; i && (_bucket_ != nullptr); ++i, _bucket_ = _bucket_->_next_) {}
280  }
281  return *this;
282  }
ListBucket< Val > * _bucket_
The bucket in the chained list pointed to by the iterator.
Definition: list.h:1717
+ Here is the call graph for this function:

◆ operator->()

template<typename Val >
INLINE const Val * gum::ListConstIterator< Val >::operator-> ( ) const

Dereferences the value pointed to by the iterator.

Exceptions
UndefinedIteratorValueRaised if the iterator points to nothing.
Returns
Returns the value pointed to by the iterator.

Definition at line 314 of file list_tpl.h.

References gum::Set< Key, Alloc >::emplace().

314  {
315  if (_bucket_ != nullptr)
316  return &(_bucket_->_val_);
317  else {
318  GUM_ERROR(UndefinedIteratorValue, "Accessing a NULL object")
319  }
320  }
ListBucket< Val > * _bucket_
The bucket in the chained list pointed to by the iterator.
Definition: list.h:1717
#define GUM_ERROR(type, msg)
Definition: exceptions.h:51
+ Here is the call graph for this function:

◆ operator=() [1/2]

template<typename Val >
INLINE ListConstIterator< Val > & gum::ListConstIterator< Val >::operator= ( const ListConstIterator< Val > &  src)
noexcept

Copy operator.

The current iterator now points to the same element as iterator from.

Parameters
srcThe gum::ListConstIterator to copy.
Returns
Returns this gum::ListConstIterator.

Definition at line 197 of file list_tpl.h.

References gum::Set< Key, Alloc >::emplace().

197  {
198  // for debugging purposes
199  GUM_OP_CPY(ListConstIterator);
200 
201  _bucket_ = src._bucket_;
202  return *this;
203  }
ListBucket< Val > * _bucket_
The bucket in the chained list pointed to by the iterator.
Definition: list.h:1717
ListConstIterator() noexcept
Default constructor.
Definition: list_tpl.h:133
+ Here is the call graph for this function:

◆ operator=() [2/2]

template<typename Val >
INLINE ListConstIterator< Val > & gum::ListConstIterator< Val >::operator= ( ListConstIterator< Val > &&  src)
noexcept

Move operator.

Parameters
srcThe gum::ListConstIterator to move.
Returns
Returns this gum::ListConstIterator.

Definition at line 208 of file list_tpl.h.

References gum::Set< Key, Alloc >::emplace().

208  {
209  // for debugging purposes
210  GUM_OP_MOV(ListConstIterator);
211  _bucket_ = src._bucket_;
212  return *this;
213  }
ListBucket< Val > * _bucket_
The bucket in the chained list pointed to by the iterator.
Definition: list.h:1717
ListConstIterator() noexcept
Default constructor.
Definition: list_tpl.h:133
+ Here is the call graph for this function:

◆ operator==()

template<typename Val >
INLINE bool gum::ListConstIterator< Val >::operator== ( const ListConstIterator< Val > &  src) const
noexcept

Checks whether two iterators point toward the same elements.

Warning
the end and rend iterators are always equal, whatever the list they belong to, i.e., list1.end() == list2.rend().
Parameters
srcThe gum::ListConstIterator to test for equality.
Returns
Returns true if src and this are equal.

Definition at line 308 of file list_tpl.h.

References gum::Set< Key, Alloc >::emplace().

308  {
309  return (_bucket_ == src._bucket_);
310  }
ListBucket< Val > * _bucket_
The bucket in the chained list pointed to by the iterator.
Definition: list.h:1717
+ Here is the call graph for this function:

◆ setToEnd()

template<typename Val >
INLINE void gum::ListConstIterator< Val >::setToEnd ( )
noexcept

Positions the iterator to the end of the list.

Definition at line 229 of file list_tpl.h.

References gum::Set< Key, Alloc >::emplace().

229  {
230  _bucket_ = nullptr;
231  }
ListBucket< Val > * _bucket_
The bucket in the chained list pointed to by the iterator.
Definition: list.h:1717
+ Here is the call graph for this function:

Friends And Related Function Documentation

◆ List

template<typename Val >
template<typename T , typename A >
friend class List
friend

Class List must be a friend because it uses the getBucket method to speed up some processes.

Definition at line 1714 of file list.h.

Member Data Documentation

◆ _bucket_

template<typename Val >
ListBucket< Val >* gum::ListConstIterator< Val >::_bucket_ {nullptr}
private

The bucket in the chained list pointed to by the iterator.

Definition at line 1717 of file list.h.


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