ManaPlus
Public Types | Public Member Functions | Private Member Functions | Private Attributes | Friends
mse::msevector< _Ty, _A >::mm_iterator_type Class Reference

#include <msemsevector.h>

Inheritance diagram for mse::msevector< _Ty, _A >::mm_iterator_type:
mse::msevector< _Ty, _A >::random_access_iterator_base

Public Types

typedef base_class::iterator::iterator_category iterator_category
 
typedef base_class::iterator::value_type value_type
 
typedef msev_int difference_type
 
typedef difference_type distance_type
 
typedef base_class::iterator::pointer pointer
 
typedef base_class::iterator::reference reference
 

Public Member Functions

void reset ()
 
bool points_to_an_item () const
 
bool points_to_end_marker () const
 
bool points_to_beginning () const
 
bool has_next_item_or_end_marker () const
 
bool has_next () const
 
bool has_previous () const
 
void set_to_beginning ()
 
void set_to_end_marker ()
 
void set_to_next ()
 
void set_to_previous ()
 
mm_iterator_typeoperator++ ()
 
mm_iterator_type operator++ (int)
 
mm_iterator_typeoperator-- ()
 
mm_iterator_type operator-- (int)
 
void advance (difference_type n)
 
void regress (int n)
 
mm_iterator_typeoperator+= (difference_type n)
 
mm_iterator_typeoperator-= (difference_type n)
 
mm_iterator_type operator+ (difference_type n) const
 
mm_iterator_type operator- (difference_type n) const
 
difference_type operator- (const mm_iterator_type &rhs) const
 
reference operator* () const
 
reference item () const
 
reference previous_item () const
 
pointer operator-> () const
 
reference operator[] (difference_type _Off) const
 
mm_iterator_typeoperator= (const mm_iterator_type &_Right_cref)
 
bool operator== (const mm_iterator_type &_Right_cref) const
 
bool operator!= (const mm_iterator_type &_Right_cref) const
 
bool operator< (const mm_iterator_type &_Right) const
 
bool operator<= (const mm_iterator_type &_Right) const
 
bool operator> (const mm_iterator_type &_Right) const
 
bool operator>= (const mm_iterator_type &_Right) const
 
void set_to_item_pointer (const mm_iterator_type &_Right_cref)
 
void invalidate_inclusive_range (msev_size_t index_of_first, msev_size_t index_of_last)
 
void shift_inclusive_range (msev_size_t index_of_first, msev_size_t index_of_last, msev_int shift)
 
msev_size_t position () const
 
 operator mm_const_iterator_type () const
 
 mm_iterator_type (_Myt &owner_ref)
 

Private Member Functions

 mm_iterator_type (const mm_iterator_type &src_cref)
 
void sync_iterator_to_index ()
 

Private Attributes

msev_bool m_points_to_an_item = false
 
msev_size_t m_index = 0
 
_Mytm_owner_ptr = nullptr
 

Friends

class mm_iterator_set_type
 
class msevector< _Ty, _A >
 

Detailed Description

template<class _Ty, class _A = std::allocator<_Ty>>
class mse::msevector< _Ty, _A >::mm_iterator_type

Definition at line 925 of file msemsevector.h.

Member Typedef Documentation

◆ difference_type

template<class _Ty , class _A = std::allocator<_Ty>>
typedef msev_int mse::msevector< _Ty, _A >::mm_iterator_type::difference_type

Definition at line 930 of file msemsevector.h.

◆ distance_type

template<class _Ty , class _A = std::allocator<_Ty>>
typedef difference_type mse::msevector< _Ty, _A >::mm_iterator_type::distance_type

Definition at line 931 of file msemsevector.h.

◆ iterator_category

template<class _Ty , class _A = std::allocator<_Ty>>
typedef base_class::iterator::iterator_category mse::msevector< _Ty, _A >::mm_iterator_type::iterator_category

Definition at line 927 of file msemsevector.h.

◆ pointer

template<class _Ty , class _A = std::allocator<_Ty>>
typedef base_class::iterator::pointer mse::msevector< _Ty, _A >::mm_iterator_type::pointer

Definition at line 932 of file msemsevector.h.

◆ reference

template<class _Ty , class _A = std::allocator<_Ty>>
typedef base_class::iterator::reference mse::msevector< _Ty, _A >::mm_iterator_type::reference

Definition at line 933 of file msemsevector.h.

◆ value_type

template<class _Ty , class _A = std::allocator<_Ty>>
typedef base_class::iterator::value_type mse::msevector< _Ty, _A >::mm_iterator_type::value_type

Definition at line 928 of file msemsevector.h.

Constructor & Destructor Documentation

◆ mm_iterator_type() [1/2]

template<class _Ty , class _A = std::allocator<_Ty>>
mse::msevector< _Ty, _A >::mm_iterator_type::mm_iterator_type ( _Myt owner_ref)
inline

◆ mm_iterator_type() [2/2]

template<class _Ty , class _A = std::allocator<_Ty>>
mse::msevector< _Ty, _A >::mm_iterator_type::mm_iterator_type ( const mm_iterator_type src_cref)
inlineprivate

Definition at line 1107 of file msemsevector.h.

1107 : m_owner_ptr(src_cref.m_owner_ptr) { (*this) = src_cref; }

Member Function Documentation

◆ advance()

template<class _Ty , class _A = std::allocator<_Ty>>
void mse::msevector< _Ty, _A >::mm_iterator_type::advance ( difference_type  n)
inline

Definition at line 989 of file msemsevector.h.

989  {
990  auto new_index = msev_int(m_index) + n;
991  if ((0 > new_index) || (m_owner_ptr->size() < msev_size_t(new_index))) {
992  MSE_THROW(msevector_range_error("index out of range - void advance(difference_type n) - mm_iterator_type - msevector"));
993  }
994  else {
995  m_index = msev_size_t(new_index);
996  if (m_owner_ptr->size() <= m_index) {
997  (*this).m_points_to_an_item = false;
998  }
999  else {
1000  (*this).m_points_to_an_item = true;
1001  }
1002  }
1003  }
#define MSE_THROW(x)
Definition: msemsevector.h:44
long int msev_int
Definition: msemsevector.h:62
size_t msev_size_t
Definition: msemsevector.h:61

References mse::msevector< _Ty, _A >::mm_iterator_type::m_index, mse::msevector< _Ty, _A >::mm_iterator_type::m_owner_ptr, and MSE_THROW.

Referenced by mse::msevector< _Ty, _A >::ipointer::advance(), mse::msevector< _Ty, _A >::mm_iterator_type::operator+(), mse::msevector< _Ty, _A >::mm_iterator_type::operator+=(), and mse::msevector< _Ty, _A >::mm_iterator_type::regress().

◆ has_next()

template<class _Ty , class _A = std::allocator<_Ty>>
bool mse::msevector< _Ty, _A >::mm_iterator_type::has_next ( ) const
inline

◆ has_next_item_or_end_marker()

template<class _Ty , class _A = std::allocator<_Ty>>
bool mse::msevector< _Ty, _A >::mm_iterator_type::has_next_item_or_end_marker ( ) const
inline

◆ has_previous()

template<class _Ty , class _A = std::allocator<_Ty>>
bool mse::msevector< _Ty, _A >::mm_iterator_type::has_previous ( ) const
inline

◆ invalidate_inclusive_range()

template<class _Ty , class _A = std::allocator<_Ty>>
void mse::msevector< _Ty, _A >::mm_iterator_type::invalidate_inclusive_range ( msev_size_t  index_of_first,
msev_size_t  index_of_last 
)
inline

Definition at line 1078 of file msemsevector.h.

1078  {
1079  if ((index_of_first <= (*this).m_index) && (index_of_last >= (*this).m_index)) {
1080  (*this).reset();
1081  }
1082  }

◆ item()

template<class _Ty , class _A = std::allocator<_Ty>>
reference mse::msevector< _Ty, _A >::mm_iterator_type::item ( ) const
inline

Definition at line 1023 of file msemsevector.h.

1023 { return operator*(); }

References mse::msevector< _Ty, _A >::mm_iterator_type::operator*().

◆ operator mm_const_iterator_type()

template<class _Ty , class _A = std::allocator<_Ty>>
mse::msevector< _Ty, _A >::mm_iterator_type::operator mm_const_iterator_type ( ) const
inline

Definition at line 1098 of file msemsevector.h.

1098  {
1099  mm_const_iterator_type retval(*m_owner_ptr);
1100  retval.set_to_beginning();
1101  retval.advance(msev_int(m_index));
1102  return retval;
1103  }

References mse::msevector< _Ty, _A >::mm_const_iterator_type::advance(), mse::msevector< _Ty, _A >::mm_iterator_type::m_index, mse::msevector< _Ty, _A >::mm_iterator_type::m_owner_ptr, and mse::msevector< _Ty, _A >::mm_const_iterator_type::set_to_beginning().

◆ operator!=()

template<class _Ty , class _A = std::allocator<_Ty>>
bool mse::msevector< _Ty, _A >::mm_iterator_type::operator!= ( const mm_iterator_type _Right_cref) const
inline

Definition at line 1067 of file msemsevector.h.

1067 { return (!(_Right_cref == (*this))); }

◆ operator*()

template<class _Ty , class _A = std::allocator<_Ty>>
reference mse::msevector< _Ty, _A >::mm_iterator_type::operator* ( ) const
inline

◆ operator+()

template<class _Ty , class _A = std::allocator<_Ty>>
mm_iterator_type mse::msevector< _Ty, _A >::mm_iterator_type::operator+ ( difference_type  n) const
inline

Definition at line 1007 of file msemsevector.h.

1007  {
1008  mm_iterator_type retval(*this);
1009  retval = (*this);
1010  retval.advance(n);
1011  return retval;
1012  }

References mse::msevector< _Ty, _A >::mm_iterator_type::advance().

◆ operator++() [1/2]

template<class _Ty , class _A = std::allocator<_Ty>>
mm_iterator_type& mse::msevector< _Ty, _A >::mm_iterator_type::operator++ ( )
inline

Definition at line 985 of file msemsevector.h.

985 { (*this).set_to_next(); return (*this); }

References mse::msevector< _Ty, _A >::mm_iterator_type::set_to_next().

◆ operator++() [2/2]

template<class _Ty , class _A = std::allocator<_Ty>>
mm_iterator_type mse::msevector< _Ty, _A >::mm_iterator_type::operator++ ( int  )
inline

Definition at line 986 of file msemsevector.h.

986 { mm_iterator_type _Tmp = *this; ++*this; return (_Tmp); }

◆ operator+=()

template<class _Ty , class _A = std::allocator<_Ty>>
mm_iterator_type& mse::msevector< _Ty, _A >::mm_iterator_type::operator+= ( difference_type  n)
inline

Definition at line 1005 of file msemsevector.h.

1005 { (*this).advance(n); return (*this); }

References mse::msevector< _Ty, _A >::mm_iterator_type::advance().

◆ operator-() [1/2]

template<class _Ty , class _A = std::allocator<_Ty>>
difference_type mse::msevector< _Ty, _A >::mm_iterator_type::operator- ( const mm_iterator_type rhs) const
inline

Definition at line 1014 of file msemsevector.h.

1014  {
1015  if ((rhs.m_owner_ptr) != ((*this).m_owner_ptr)) { MSE_THROW(msevector_range_error("invalid argument - difference_type operator-(const mm_iterator_type& rhs) const - msevector::mm_iterator_type")); }
1016  auto retval = difference_type((*this).m_index) - difference_type(rhs.m_index);
1017  assert(difference_type(m_owner_ptr->size()) >= retval);
1018  return retval;
1019  }

References mse::msevector< _Ty, _A >::mm_iterator_type::m_index, mse::msevector< _Ty, _A >::mm_iterator_type::m_owner_ptr, and MSE_THROW.

◆ operator-() [2/2]

template<class _Ty , class _A = std::allocator<_Ty>>
mm_iterator_type mse::msevector< _Ty, _A >::mm_iterator_type::operator- ( difference_type  n) const
inline

Definition at line 1013 of file msemsevector.h.

1013 { return ((*this) + (-n)); }

◆ operator--() [1/2]

template<class _Ty , class _A = std::allocator<_Ty>>
mm_iterator_type& mse::msevector< _Ty, _A >::mm_iterator_type::operator-- ( )
inline

Definition at line 987 of file msemsevector.h.

987 { (*this).set_to_previous(); return (*this); }

References mse::msevector< _Ty, _A >::mm_iterator_type::set_to_previous().

◆ operator--() [2/2]

template<class _Ty , class _A = std::allocator<_Ty>>
mm_iterator_type mse::msevector< _Ty, _A >::mm_iterator_type::operator-- ( int  )
inline

Definition at line 988 of file msemsevector.h.

988 { mm_iterator_type _Tmp = *this; --*this; return (_Tmp); }

◆ operator-=()

template<class _Ty , class _A = std::allocator<_Ty>>
mm_iterator_type& mse::msevector< _Ty, _A >::mm_iterator_type::operator-= ( difference_type  n)
inline

Definition at line 1006 of file msemsevector.h.

1006 { (*this).regress(n); return (*this); }

References mse::msevector< _Ty, _A >::mm_iterator_type::regress().

◆ operator->()

template<class _Ty , class _A = std::allocator<_Ty>>
pointer mse::msevector< _Ty, _A >::mm_iterator_type::operator-> ( ) const
inline

◆ operator<()

template<class _Ty , class _A = std::allocator<_Ty>>
bool mse::msevector< _Ty, _A >::mm_iterator_type::operator< ( const mm_iterator_type _Right) const
inline

Definition at line 1068 of file msemsevector.h.

1068  {
1069  if (((*this).m_owner_ptr) != (_Right.m_owner_ptr)) { MSE_THROW(msevector_range_error("invalid argument - mm_iterator_type& operator<(const typename base_class::iterator& _Right) - mm_iterator_type - msevector")); }
1070  return (m_index < _Right.m_index);
1071  }

References mse::msevector< _Ty, _A >::mm_iterator_type::m_index, mse::msevector< _Ty, _A >::mm_iterator_type::m_owner_ptr, and MSE_THROW.

◆ operator<=()

template<class _Ty , class _A = std::allocator<_Ty>>
bool mse::msevector< _Ty, _A >::mm_iterator_type::operator<= ( const mm_iterator_type _Right) const
inline

Definition at line 1072 of file msemsevector.h.

1072 { return (((*this) < _Right) || (_Right == (*this))); }

◆ operator=()

template<class _Ty , class _A = std::allocator<_Ty>>
mm_iterator_type& mse::msevector< _Ty, _A >::mm_iterator_type::operator= ( const mm_iterator_type _Right_cref)
inline

Definition at line 1051 of file msemsevector.h.

1052  {
1053  if (((*this).m_owner_ptr) == (_Right_cref.m_owner_ptr)) {
1054  assert((*this).m_owner_ptr->size() >= _Right_cref.m_index);
1055  (*this).m_points_to_an_item = _Right_cref.m_points_to_an_item;
1056  (*this).m_index = _Right_cref.m_index;
1057  }
1058  else {
1059  MSE_THROW(msevector_range_error("doesn't seem to be a valid assignment value - mm_iterator_type& operator=(const typename base_class::iterator& _Right_cref) - mm_const_iterator_type - msevector"));
1060  }
1061  return (*this);
1062  }

References mse::msevector< _Ty, _A >::mm_iterator_type::m_index, mse::msevector< _Ty, _A >::mm_iterator_type::m_owner_ptr, mse::msevector< _Ty, _A >::mm_iterator_type::m_points_to_an_item, and MSE_THROW.

◆ operator==()

template<class _Ty , class _A = std::allocator<_Ty>>
bool mse::msevector< _Ty, _A >::mm_iterator_type::operator== ( const mm_iterator_type _Right_cref) const
inline

Definition at line 1063 of file msemsevector.h.

1063  {
1064  if (((*this).m_owner_ptr) != (_Right_cref.m_owner_ptr)) { MSE_THROW(msevector_range_error("invalid argument - mm_iterator_type& operator==(const typename base_class::iterator& _Right) - mm_iterator_type - msevector")); }
1065  return (_Right_cref.m_index == m_index);
1066  }

References mse::msevector< _Ty, _A >::mm_iterator_type::m_index, mse::msevector< _Ty, _A >::mm_iterator_type::m_owner_ptr, and MSE_THROW.

◆ operator>()

template<class _Ty , class _A = std::allocator<_Ty>>
bool mse::msevector< _Ty, _A >::mm_iterator_type::operator> ( const mm_iterator_type _Right) const
inline

Definition at line 1073 of file msemsevector.h.

1073 { return (!((*this) <= _Right)); }

◆ operator>=()

template<class _Ty , class _A = std::allocator<_Ty>>
bool mse::msevector< _Ty, _A >::mm_iterator_type::operator>= ( const mm_iterator_type _Right) const
inline

Definition at line 1074 of file msemsevector.h.

1074 { return (!((*this) < _Right)); }

◆ operator[]()

template<class _Ty , class _A = std::allocator<_Ty>>
reference mse::msevector< _Ty, _A >::mm_iterator_type::operator[] ( difference_type  _Off) const
inline

Definition at line 1030 of file msemsevector.h.

1030 { return (*m_owner_ptr).at(msev_as_a_size_t(difference_type(m_index) + _Off)); }

References mse::msevector< _Ty, _A >::mm_iterator_type::m_index.

◆ points_to_an_item()

template<class _Ty , class _A = std::allocator<_Ty>>
bool mse::msevector< _Ty, _A >::mm_iterator_type::points_to_an_item ( ) const
inline

◆ points_to_beginning()

template<class _Ty , class _A = std::allocator<_Ty>>
bool mse::msevector< _Ty, _A >::mm_iterator_type::points_to_beginning ( ) const
inline

Definition at line 944 of file msemsevector.h.

944  {
945  if (0 == m_index) { return true; }
946  else { return false; }
947  }

References mse::msevector< _Ty, _A >::mm_iterator_type::m_index.

Referenced by mse::msevector< _Ty, _A >::mm_iterator_type::has_previous(), and mse::msevector< _Ty, _A >::ipointer::points_to_beginning().

◆ points_to_end_marker()

template<class _Ty , class _A = std::allocator<_Ty>>
bool mse::msevector< _Ty, _A >::mm_iterator_type::points_to_end_marker ( ) const
inline

◆ position()

template<class _Ty , class _A = std::allocator<_Ty>>
msev_size_t mse::msevector< _Ty, _A >::mm_iterator_type::position ( ) const
inline

Definition at line 1095 of file msemsevector.h.

1095  {
1096  return m_index;
1097  }

References mse::msevector< _Ty, _A >::mm_iterator_type::m_index.

Referenced by mse::msevector< _Ty, _A >::ipointer::position().

◆ previous_item()

template<class _Ty , class _A = std::allocator<_Ty>>
reference mse::msevector< _Ty, _A >::mm_iterator_type::previous_item ( ) const
inline

◆ regress()

template<class _Ty , class _A = std::allocator<_Ty>>
void mse::msevector< _Ty, _A >::mm_iterator_type::regress ( int  n)
inline

◆ reset()

template<class _Ty , class _A = std::allocator<_Ty>>
void mse::msevector< _Ty, _A >::mm_iterator_type::reset ( )
inline

◆ set_to_beginning()

template<class _Ty , class _A = std::allocator<_Ty>>
void mse::msevector< _Ty, _A >::mm_iterator_type::set_to_beginning ( )
inline

◆ set_to_end_marker()

template<class _Ty , class _A = std::allocator<_Ty>>
void mse::msevector< _Ty, _A >::mm_iterator_type::set_to_end_marker ( )
inline

◆ set_to_item_pointer()

template<class _Ty , class _A = std::allocator<_Ty>>
void mse::msevector< _Ty, _A >::mm_iterator_type::set_to_item_pointer ( const mm_iterator_type _Right_cref)
inline

Definition at line 1075 of file msemsevector.h.

1075  {
1076  (*this) = _Right_cref;
1077  }

Referenced by mse::msevector< _Ty, _A >::ipointer::set_to_item_pointer().

◆ set_to_next()

template<class _Ty , class _A = std::allocator<_Ty>>
void mse::msevector< _Ty, _A >::mm_iterator_type::set_to_next ( )
inline

Definition at line 964 of file msemsevector.h.

964  {
965  if (points_to_an_item()) {
966  m_index += 1;
967  if (m_owner_ptr->size() <= m_index) {
968  (*this).m_points_to_an_item = false;
969  if (m_owner_ptr->size() < m_index) { assert(false); reset(); }
970  }
971  }
972  else {
973  MSE_THROW(msevector_range_error("attempt to use invalid item_pointer - void set_to_next() - mm_const_iterator_type - msevector"));
974  }
975  }

References mse::msevector< _Ty, _A >::mm_iterator_type::m_index, mse::msevector< _Ty, _A >::mm_iterator_type::m_owner_ptr, MSE_THROW, mse::msevector< _Ty, _A >::mm_iterator_type::points_to_an_item(), and mse::msevector< _Ty, _A >::mm_iterator_type::reset().

Referenced by mse::msevector< _Ty, _A >::mm_iterator_type::operator++(), and mse::msevector< _Ty, _A >::ipointer::set_to_next().

◆ set_to_previous()

template<class _Ty , class _A = std::allocator<_Ty>>
void mse::msevector< _Ty, _A >::mm_iterator_type::set_to_previous ( )
inline

Definition at line 976 of file msemsevector.h.

976  {
977  if (has_previous()) {
978  m_index -= 1;
979  (*this).m_points_to_an_item = true;
980  }
981  else {
982  MSE_THROW(msevector_range_error("attempt to use invalid item_pointer - void set_to_previous() - mm_iterator_type - msevector"));
983  }
984  }

References mse::msevector< _Ty, _A >::mm_iterator_type::has_previous(), mse::msevector< _Ty, _A >::mm_iterator_type::m_index, and MSE_THROW.

Referenced by mse::msevector< _Ty, _A >::mm_iterator_type::operator--(), and mse::msevector< _Ty, _A >::ipointer::set_to_previous().

◆ shift_inclusive_range()

template<class _Ty , class _A = std::allocator<_Ty>>
void mse::msevector< _Ty, _A >::mm_iterator_type::shift_inclusive_range ( msev_size_t  index_of_first,
msev_size_t  index_of_last,
msev_int  shift 
)
inline

Definition at line 1083 of file msemsevector.h.

1083  {
1084  if ((index_of_first <= (*this).m_index) && (index_of_last >= (*this).m_index)) {
1085  auto new_index = (*this).m_index + shift;
1086  if ((0 > new_index) || (m_owner_ptr->size() < new_index)) {
1087  MSE_THROW(msevector_range_error("void shift_inclusive_range() - mm_iterator_type - msevector"));
1088  }
1089  else {
1090  (*this).m_index = msev_size_t(new_index);
1091  (*this).sync_iterator_to_index();
1092  }
1093  }
1094  }

References mse::msevector< _Ty, _A >::mm_iterator_type::m_owner_ptr, and MSE_THROW.

◆ sync_iterator_to_index()

template<class _Ty , class _A = std::allocator<_Ty>>
void mse::msevector< _Ty, _A >::mm_iterator_type::sync_iterator_to_index ( )
inlineprivate

Definition at line 1108 of file msemsevector.h.

1108  {
1109  assert(m_owner_ptr->size() >= (*this).m_index);
1110  }

References mse::msevector< _Ty, _A >::mm_iterator_type::m_owner_ptr.

Friends And Related Function Documentation

◆ mm_iterator_set_type

template<class _Ty , class _A = std::allocator<_Ty>>
friend class mm_iterator_set_type
friend

Definition at line 1114 of file msemsevector.h.

◆ msevector< _Ty, _A >

template<class _Ty , class _A = std::allocator<_Ty>>
friend class msevector< _Ty, _A >
friend

Definition at line 1114 of file msemsevector.h.

Field Documentation

◆ m_index

template<class _Ty , class _A = std::allocator<_Ty>>
msev_size_t mse::msevector< _Ty, _A >::mm_iterator_type::m_index = 0
private

◆ m_owner_ptr

template<class _Ty , class _A = std::allocator<_Ty>>
_Myt* mse::msevector< _Ty, _A >::mm_iterator_type::m_owner_ptr = nullptr
private

◆ m_points_to_an_item

template<class _Ty , class _A = std::allocator<_Ty>>
msev_bool mse::msevector< _Ty, _A >::mm_iterator_type::m_points_to_an_item = false
private

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