gem5  v20.0.0.2
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
Public Types | Public Member Functions | Public Attributes | Private Member Functions | Friends | List of all members
CircularQueue< T >::iterator Struct Reference

Iterator to the circular queue. More...

#include <circular_queue.hh>

Public Types

using value_type = T
 Iterator Traits. More...
 
using difference_type = std::ptrdiff_t
 
using reference = value_type &
 
using const_reference = const value_type &
 
using pointer = value_type *
 
using const_pointer = const value_type *
 
using iterator_category = std::random_access_iterator_tag
 

Public Member Functions

 iterator (CircularQueue *cq, uint32_t idx, uint32_t round)
 
 iterator ()
 Trait reference type iterator satisfies OutputIterator, therefore reference must be T&. More...
 
 iterator (const iterator &it)
 
iteratoroperator= (const iterator &it)
 
 ~iterator ()
 
bool dereferenceable () const
 Test dereferenceability. More...
 
bool operator== (const iterator &that) const
 InputIterator. More...
 
bool operator!= (const iterator &that)
 Inequality operator. More...
 
reference operator* ()
 Dereference operator. More...
 
const_reference operator* () const
 
pointer operator-> ()
 Dereference operator. More...
 
const_pointer operator-> () const
 
iteratoroperator++ ()
 Pre-increment operator. More...
 
iterator operator++ (int)
 Post-increment operator. More...
 
iteratoroperator-- ()
 Pre-decrement operator. More...
 
iterator operator-- (int)
 Post-decrement operator. More...
 
iteratoroperator+= (const difference_type &t)
 RandomAccessIterator requirements. More...
 
iteratoroperator-= (const difference_type &t)
 
iterator operator+ (const difference_type &t)
 Addition operator. More...
 
iterator operator- (const difference_type &t)
 Substraction operator. More...
 
difference_type operator- (const iterator &that)
 Difference operator. More...
 
template<typename Idx >
std::enable_if< std::is_integral< Idx >::value, reference >::type operator[] (const Idx &index)
 Index operator. More...
 
bool operator< (const iterator &that) const
 Comparisons. More...
 
bool operator> (const iterator &that) const
 
bool operator>= (const iterator &that) const
 
bool operator<= (const iterator &that) const
 
size_t idx () const
 OutputIterator has no extra requirements. More...
 

Public Attributes

CircularQueue_cq
 
uint32_t _idx
 
uint32_t _round
 

Private Member Functions

bool decrementable () const
 ForwardIterator The multipass guarantee is provided by the reliance on _idx. More...
 

Friends

iterator operator+ (const difference_type &t, iterator &it)
 
iterator operator- (const difference_type &t, iterator &it)
 

Detailed Description

template<typename T>
struct CircularQueue< T >::iterator

Iterator to the circular queue.

iterator implementation to provide the circular-ness that the standard std::vector<T>::iterator does not implement. Iterators to a queue are represented by a pair of a character and the round counter. For the character, '*' denotes the element pointed to by the iterator if it is valid. 'x' denotes the element pointed to by the iterator when it is BTB or PTE. E.g.:

Definition at line 151 of file circular_queue.hh.

Member Typedef Documentation

◆ const_pointer

template<typename T>
using CircularQueue< T >::iterator::const_pointer = const value_type*

Definition at line 166 of file circular_queue.hh.

◆ const_reference

template<typename T>
using CircularQueue< T >::iterator::const_reference = const value_type&

Definition at line 164 of file circular_queue.hh.

◆ difference_type

template<typename T>
using CircularQueue< T >::iterator::difference_type = std::ptrdiff_t

Definition at line 162 of file circular_queue.hh.

◆ iterator_category

template<typename T>
using CircularQueue< T >::iterator::iterator_category = std::random_access_iterator_tag

Definition at line 167 of file circular_queue.hh.

◆ pointer

template<typename T>
using CircularQueue< T >::iterator::pointer = value_type*

Definition at line 165 of file circular_queue.hh.

◆ reference

template<typename T>
using CircularQueue< T >::iterator::reference = value_type&

Definition at line 163 of file circular_queue.hh.

◆ value_type

template<typename T>
using CircularQueue< T >::iterator::value_type = T

Iterator Traits.

Definition at line 161 of file circular_queue.hh.

Constructor & Destructor Documentation

◆ iterator() [1/3]

template<typename T>
CircularQueue< T >::iterator::iterator ( CircularQueue cq,
uint32_t  idx,
uint32_t  round 
)
inline

Definition at line 157 of file circular_queue.hh.

◆ iterator() [2/3]

template<typename T>
CircularQueue< T >::iterator::iterator ( )
inline

Trait reference type iterator satisfies OutputIterator, therefore reference must be T&.

Definition at line 175 of file circular_queue.hh.

Referenced by CircularQueue< Tick >::begin(), CircularQueue< Tick >::end(), and CircularQueue< Tick >::getIterator().

◆ iterator() [3/3]

template<typename T>
CircularQueue< T >::iterator::iterator ( const iterator it)
inline

Definition at line 177 of file circular_queue.hh.

◆ ~iterator()

template<typename T>
CircularQueue< T >::iterator::~iterator ( )
inline

Definition at line 189 of file circular_queue.hh.

Member Function Documentation

◆ decrementable()

template<typename T>
bool CircularQueue< T >::iterator::decrementable ( ) const
inlineprivate

ForwardIterator The multipass guarantee is provided by the reliance on _idx.

BidirectionalIterator requirements. Test decrementability. An iterator to a non-null circular queue is not-decrementable if it is pointing to the head element, unless the queue is full and we are talking about the past-the-end iterator. In that case, the iterator round equals the cq round unless the head is at the zero position and the round is one more than the cq round.

Definition at line 292 of file circular_queue.hh.

References CircularQueue< T >::_round, CircularQueue< T >::empty(), and CircularQueue< T >::head().

Referenced by CircularQueue< T >::iterator::operator--().

◆ dereferenceable()

template<typename T>
bool CircularQueue< T >::iterator::dereferenceable ( ) const
inline

Test dereferenceability.

An iterator is dereferenceable if it is pointing to a non-null circular queue, it is not the past-the-end iterator and the index is a valid index to that queue. PTE test is required to distinguish between:

  • An iterator to the first element of a full queue (4,F,1,0): |o]|[*|o|o|
  • The end() iterator of a full queue (4,F,1,0): |o]|x[o|o|o| Sometimes, though, users will get the PTE iterator and expect it to work after growing the buffer on the tail, so we have to check if the iterator is still PTE.

Definition at line 205 of file circular_queue.hh.

References CircularQueue< T >::isValidIdx().

Referenced by LSQUnit< Impl >::willWB(), and LSQUnit< Impl >::writebackStores().

◆ idx()

template<typename T>
size_t CircularQueue< T >::iterator::idx ( ) const
inline

◆ operator!=()

template<typename T>
bool CircularQueue< T >::iterator::operator!= ( const iterator that)
inline

Inequality operator.

Conversely, two iterators are different if they both point to different circular queues or they point to different elements.

Definition at line 228 of file circular_queue.hh.

◆ operator*() [1/2]

template<typename T>
reference CircularQueue< T >::iterator::operator* ( )
inline

Dereference operator.

Definition at line 234 of file circular_queue.hh.

References CircularQueue< T >::iterator::_idx.

◆ operator*() [2/2]

template<typename T>
const_reference CircularQueue< T >::iterator::operator* ( ) const
inline

Definition at line 240 of file circular_queue.hh.

References CircularQueue< T >::iterator::_idx.

◆ operator+()

template<typename T>
iterator CircularQueue< T >::iterator::operator+ ( const difference_type t)
inline

Addition operator.

Definition at line 339 of file circular_queue.hh.

References ArmISA::t.

◆ operator++() [1/2]

template<typename T>
iterator& CircularQueue< T >::iterator::operator++ ( )
inline

Pre-increment operator.

Definition at line 260 of file circular_queue.hh.

References CircularQueue< T >::iterator::_round, and CircularQueue< T >::increase().

◆ operator++() [2/2]

template<typename T>
iterator CircularQueue< T >::iterator::operator++ ( int  )
inline

Post-increment operator.

Definition at line 271 of file circular_queue.hh.

References ArmISA::t.

◆ operator+=()

template<typename T>
iterator& CircularQueue< T >::iterator::operator+= ( const difference_type t)
inline

RandomAccessIterator requirements.

Definition at line 316 of file circular_queue.hh.

References CircularQueue< T >::iterator::_idx, CircularQueue< T >::capacity(), and CircularQueue< T >::moduloAdd().

◆ operator-() [1/2]

template<typename T>
iterator CircularQueue< T >::iterator::operator- ( const difference_type t)
inline

Substraction operator.

Definition at line 352 of file circular_queue.hh.

References ArmISA::t.

◆ operator-() [2/2]

template<typename T>
difference_type CircularQueue< T >::iterator::operator- ( const iterator that)
inline

◆ operator--() [1/2]

template<typename T>
iterator& CircularQueue< T >::iterator::operator-- ( )
inline

◆ operator--() [2/2]

template<typename T>
iterator CircularQueue< T >::iterator::operator-- ( int  )
inline

Post-decrement operator.

Definition at line 313 of file circular_queue.hh.

References ArmISA::t.

◆ operator-=()

template<typename T>
iterator& CircularQueue< T >::iterator::operator-= ( const difference_type t)
inline

◆ operator->() [1/2]

template<typename T>
pointer CircularQueue< T >::iterator::operator-> ( )
inline

Dereference operator.

Rely on operator* to check for dereferenceability.

Definition at line 249 of file circular_queue.hh.

References CircularQueue< T >::iterator::_idx.

◆ operator->() [2/2]

template<typename T>
const_pointer CircularQueue< T >::iterator::operator-> ( ) const
inline

Definition at line 254 of file circular_queue.hh.

References CircularQueue< T >::iterator::_idx.

◆ operator<()

template<typename T>
bool CircularQueue< T >::iterator::operator< ( const iterator that) const
inline

◆ operator<=()

template<typename T>
bool CircularQueue< T >::iterator::operator<= ( const iterator that) const
inline

Definition at line 401 of file circular_queue.hh.

◆ operator=()

template<typename T>
iterator& CircularQueue< T >::iterator::operator= ( const iterator it)
inline

◆ operator==()

template<typename T>
bool CircularQueue< T >::iterator::operator== ( const iterator that) const
inline

InputIterator.

Equality operator. Two iterators must point to the same, possibly null, circular queue and the same element on it, including PTE, to be equal. In case the clients the the PTE iterator and then grow on the back and expect it to work, we have to check if the PTE is still PTE

Definition at line 218 of file circular_queue.hh.

References CircularQueue< T >::iterator::_cq, CircularQueue< T >::iterator::_idx, and CircularQueue< T >::iterator::_round.

◆ operator>()

template<typename T>
bool CircularQueue< T >::iterator::operator> ( const iterator that) const
inline

Definition at line 395 of file circular_queue.hh.

◆ operator>=()

template<typename T>
bool CircularQueue< T >::iterator::operator>= ( const iterator that) const
inline

Definition at line 398 of file circular_queue.hh.

◆ operator[]()

template<typename T>
template<typename Idx >
std::enable_if<std::is_integral<Idx>::value,reference>::type CircularQueue< T >::iterator::operator[] ( const Idx &  index)
inline

Index operator.

The use of * tests for dereferenceability.

Definition at line 383 of file circular_queue.hh.

References MipsISA::index.

Friends And Related Function Documentation

◆ operator+

template<typename T>
iterator operator+ ( const difference_type t,
iterator it 
)
friend

Definition at line 345 of file circular_queue.hh.

◆ operator-

template<typename T>
iterator operator- ( const difference_type t,
iterator it 
)
friend

Definition at line 358 of file circular_queue.hh.

Member Data Documentation

◆ _cq

template<typename T>
CircularQueue* CircularQueue< T >::iterator::_cq

◆ _idx

template<typename T>
uint32_t CircularQueue< T >::iterator::_idx

◆ _round

template<typename T>
uint32_t CircularQueue< T >::iterator::_round

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

Generated on Mon Jun 8 2020 15:45:20 for gem5 by doxygen 1.8.13