ReactOS  0.4.14-dev-317-g96040ec
_Rope_iterator_base< _CharT, _Alloc > Class Template Reference

#include <_rope.h>

Inheritance diagram for _Rope_iterator_base< _CharT, _Alloc >:
Collaboration diagram for _Rope_iterator_base< _CharT, _Alloc >:

Public Types

enum  { _S_path_cache_len = 4 }
 
enum  { _S_iterator_buf_len = 15 }
 
typedef _Rope_RopeRep< _CharT, _Alloc_RopeRep
 

Public Member Functions

 _Rope_iterator_base ()
 
 _Rope_iterator_base (_RopeRep *__root, size_t __pos)
 
void _M_incr (size_t __n)
 
void _M_decr (size_t __n)
 
size_t index () const
 
 _Rope_iterator_base (const _Self &__x)
 
_Selfoperator= (const _Self &__x)
 

Static Public Member Functions

static void _S_setbuf (_Rope_iterator_base< _CharT, _Alloc > &__x)
 
static void _S_setcache (_Rope_iterator_base< _CharT, _Alloc > &__x)
 
static void _S_setcache_for_incr (_Rope_iterator_base< _CharT, _Alloc > &__x)
 

Public Attributes

size_t _M_current_pos
 
_RopeRep_M_root
 
size_t _M_leaf_pos
 
_CharT * _M_buf_start
 
_CharT * _M_buf_ptr
 
_CharT * _M_buf_end
 
struct {
   _RopeRep const *   _M_data [_S_path_cache_len]
 
_M_path_end
 
int _M_leaf_index
 
unsigned char _M_path_directions
 
struct {
   _CharT   _M_data [_S_iterator_buf_len]
 
_M_tmp_buf
 

Private Types

typedef _Rope_iterator_base< _CharT, _Alloc_Self
 
typedef _Rope_RopeConcatenation< _CharT, _Alloc_RopeConcat
 

Private Member Functions

void _M_copy_buf (const _Self &__x)
 

Friends

class rope< _CharT, _Alloc >
 

Detailed Description

template<class _CharT, class _Alloc>
class _Rope_iterator_base< _CharT, _Alloc >

Definition at line 753 of file _rope.h.

Member Typedef Documentation

◆ _RopeConcat

template<class _CharT, class _Alloc>
typedef _Rope_RopeConcatenation<_CharT,_Alloc> _Rope_iterator_base< _CharT, _Alloc >::_RopeConcat
private

Definition at line 758 of file _rope.h.

◆ _RopeRep

template<class _CharT, class _Alloc>
typedef _Rope_RopeRep<_CharT,_Alloc> _Rope_iterator_base< _CharT, _Alloc >::_RopeRep

Definition at line 760 of file _rope.h.

◆ _Self

template<class _CharT, class _Alloc>
typedef _Rope_iterator_base<_CharT, _Alloc> _Rope_iterator_base< _CharT, _Alloc >::_Self
private

Definition at line 757 of file _rope.h.

Member Enumeration Documentation

◆ anonymous enum

template<class _CharT, class _Alloc>
anonymous enum
Enumerator
_S_path_cache_len 

Definition at line 762 of file _rope.h.

762 { _S_path_cache_len = 4 }; // Must be <= 9 because of _M_path_direction.

◆ anonymous enum

template<class _CharT, class _Alloc>
anonymous enum
Enumerator
_S_iterator_buf_len 

Definition at line 763 of file _rope.h.

Constructor & Destructor Documentation

◆ _Rope_iterator_base() [1/3]

template<class _CharT, class _Alloc>
_Rope_iterator_base< _CharT, _Alloc >::_Rope_iterator_base ( )
inline

Definition at line 817 of file _rope.h.

817 {}

◆ _Rope_iterator_base() [2/3]

template<class _CharT, class _Alloc>
_Rope_iterator_base< _CharT, _Alloc >::_Rope_iterator_base ( _RopeRep __root,
size_t  __pos 
)
inline

Definition at line 818 of file _rope.h.

819  : _M_current_pos(__pos),_M_root(__root), _M_buf_ptr(0) {}
size_t _M_current_pos
Definition: _rope.h:764
_CharT * _M_buf_ptr
Definition: _rope.h:772
_RopeRep * _M_root
Definition: _rope.h:766

◆ _Rope_iterator_base() [3/3]

template<class _CharT, class _Alloc>
_Rope_iterator_base< _CharT, _Alloc >::_Rope_iterator_base ( const _Self __x)
inline

Definition at line 837 of file _rope.h.

837  :
838  _M_current_pos(__x._M_current_pos),
839  _M_root(__x._M_root),
840  _M_leaf_pos( __x._M_leaf_pos ),
841  _M_buf_start(__x._M_buf_start),
842  _M_buf_ptr(__x._M_buf_ptr),
843  _M_path_end(__x._M_path_end),
844  _M_leaf_index(__x._M_leaf_index),
845  _M_path_directions(__x._M_path_directions)
846  {
847  if (0 != __x._M_buf_ptr) {
848  _M_copy_buf(__x);
849  }
850  }
unsigned char _M_path_directions
Definition: _rope.h:795
void _M_copy_buf(const _Self &__x)
Definition: _rope.h:825
size_t _M_current_pos
Definition: _rope.h:764
size_t _M_leaf_pos
Definition: _rope.h:768
_CharT * _M_buf_ptr
Definition: _rope.h:772
struct _Rope_iterator_base::@1793 _M_path_end
_CharT * _M_buf_start
Definition: _rope.h:770
_RopeRep * _M_root
Definition: _rope.h:766

Member Function Documentation

◆ _M_copy_buf()

template<class _CharT, class _Alloc>
void _Rope_iterator_base< _CharT, _Alloc >::_M_copy_buf ( const _Self __x)
inlineprivate

Definition at line 825 of file _rope.h.

825  {
826  _M_tmp_buf = __x._M_tmp_buf;
827  if (__x._M_buf_start == __x._M_tmp_buf._M_data) {
828  _M_buf_start = _M_tmp_buf._M_data;
829  _M_buf_end = _M_buf_start + (__x._M_buf_end - __x._M_buf_start);
830  _M_buf_ptr = _M_buf_start + (__x._M_buf_ptr - __x._M_buf_start);
831  } else {
832  _M_buf_end = __x._M_buf_end;
833  }
834  }
struct _Rope_iterator_base::@1794 _M_tmp_buf
_CharT * _M_buf_ptr
Definition: _rope.h:772
_CharT * _M_buf_end
Definition: _rope.h:774
_CharT * _M_buf_start
Definition: _rope.h:770

Referenced by _Rope_iterator_base< _CharT, _Alloc >::_Rope_iterator_base(), and _Rope_iterator_base< _CharT, _Alloc >::operator=().

◆ _M_decr()

template<class _CharT , class _Alloc >
void _Rope_iterator_base< _CharT, _Alloc >::_M_decr ( size_t  __n)

◆ _M_incr()

template<class _CharT , class _Alloc >
void _Rope_iterator_base< _CharT, _Alloc >::_M_incr ( size_t  __n)

Definition at line 270 of file _rope.c.

270  {
271  _M_current_pos += __n;
272  if (0 != _M_buf_ptr) {
273  size_t __chars_left = _M_buf_end - _M_buf_ptr;
274  if (__chars_left > __n) {
275  _M_buf_ptr += __n;
276  } else if (__chars_left == __n) {
277  _M_buf_ptr += __n;
278  _S_setcache_for_incr(*this);
279  } else {
280  _M_buf_ptr = 0;
281  }
282  }
283 }
return __n
Definition: _algo.h:75
size_t _M_current_pos
Definition: _rope.h:764
static void _S_setcache_for_incr(_Rope_iterator_base< _CharT, _Alloc > &__x)
Definition: _rope.c:208
_CharT * _M_buf_ptr
Definition: _rope.h:772
_CharT * _M_buf_end
Definition: _rope.h:774

Referenced by _Rope_const_iterator< _CharT, _Alloc >::operator++(), _Rope_iterator< _CharT, _Alloc >::operator++(), _Rope_const_iterator< _CharT, _Alloc >::operator+=(), _Rope_iterator< _CharT, _Alloc >::operator+=(), _Rope_const_iterator< _CharT, _Alloc >::operator-=(), and _Rope_iterator< _CharT, _Alloc >::operator-=().

◆ _S_setbuf()

template<class _CharT , class _Alloc >
void _Rope_iterator_base< _CharT, _Alloc >::_S_setbuf ( _Rope_iterator_base< _CharT, _Alloc > &  __x)
static

Definition at line 90 of file _rope.c.

91  {
92  const _RopeRep* __leaf = __x._M_path_end._M_data[__x._M_leaf_index];
93  size_t __leaf_pos = __x._M_leaf_pos;
94  size_t __pos = __x._M_current_pos;
95 
96  switch(__leaf->_M_tag) {
97  case _RopeRep::_S_leaf:
98  typedef _Rope_RopeLeaf<_CharT, _Alloc> _RopeLeaf;
99  __x._M_buf_start = __STATIC_CAST(const _RopeLeaf*, __leaf)->_M_data;
100  __x._M_buf_ptr = __x._M_buf_start + (__pos - __leaf_pos);
101  __x._M_buf_end = __x._M_buf_start + __leaf->_M_size._M_data;
102  break;
105  {
106  size_t __len = _S_iterator_buf_len;
107  size_t __buf_start_pos = __leaf_pos;
108  size_t __leaf_end = __leaf_pos + __leaf->_M_size._M_data;
109  typedef _Rope_RopeFunction<_CharT, _Alloc> _RopeFunction;
110  char_producer<_CharT>* __fn = __STATIC_CAST(const _RopeFunction*, __leaf)->_M_fn;
111 
112  if (__buf_start_pos + __len <= __pos) {
113  __buf_start_pos = __pos - __len/4;
114  if (__buf_start_pos + __len > __leaf_end) {
115  __buf_start_pos = __leaf_end - __len;
116  }
117  }
118  if (__buf_start_pos + __len > __leaf_end) {
119  __len = __leaf_end - __buf_start_pos;
120  }
121  (*__fn)(__buf_start_pos - __leaf_pos, __len, __x._M_tmp_buf._M_data);
122  __x._M_buf_ptr = __x._M_tmp_buf._M_data + (__pos - __buf_start_pos);
123  __x._M_buf_start = __x._M_tmp_buf._M_data;
124  __x._M_buf_end = __x._M_tmp_buf._M_data + __len;
125  }
126  break;
127  default:
128  _STLP_ASSERT(0)
129  ;
130  }
131 }
#define __STATIC_CAST(__x, __y)
Definition: features.h:585
size_t _M_current_pos
Definition: _rope.h:764
size_t _M_leaf_pos
Definition: _rope.h:768
struct _Rope_iterator_base::@1794 _M_tmp_buf
_Rope_RopeRep< _CharT, _Alloc > _RopeRep
Definition: _rope.h:760
_CharT * _M_buf_ptr
Definition: _rope.h:772
struct _Rope_iterator_base::@1793 _M_path_end
_CharT * _M_buf_end
Definition: _rope.h:774
_CharT * _M_buf_start
Definition: _rope.h:770
#define _STLP_ASSERT(expr)
Definition: _debug.h:165

◆ _S_setcache()

template<class _CharT , class _Alloc >
void _Rope_iterator_base< _CharT, _Alloc >::_S_setcache ( _Rope_iterator_base< _CharT, _Alloc > &  __x)
static

Definition at line 136 of file _rope.c.

137  {
138  const _RopeRep* __path[_RopeRep::_S_max_rope_depth+1];
139  const _RopeRep* __curr_rope;
140  int __curr_depth = -1; /* index into path */
141  size_t __curr_start_pos = 0;
142  size_t __pos = __x._M_current_pos;
143  unsigned char __dirns = 0; // Bit vector marking right turns in the path
144 
145  _STLP_ASSERT(__pos <= __x._M_root->_M_size._M_data)
146  if (__pos >= __x._M_root->_M_size._M_data) {
147  __x._M_buf_ptr = 0;
148  return;
149  }
150  __curr_rope = __x._M_root;
151  if (0 != __curr_rope->_M_c_string) {
152  /* Treat the root as a leaf. */
153  __x._M_buf_start = __curr_rope->_M_c_string;
154  __x._M_buf_end = __curr_rope->_M_c_string + __curr_rope->_M_size._M_data;
155  __x._M_buf_ptr = __curr_rope->_M_c_string + __pos;
156  __x._M_path_end._M_data[0] = __curr_rope;
157  __x._M_leaf_index = 0;
158  __x._M_leaf_pos = 0;
159  return;
160  }
161  for(;;) {
162  ++__curr_depth;
164  __path[__curr_depth] = __curr_rope;
165  switch(__curr_rope->_M_tag) {
166  case _RopeRep::_S_leaf:
169  __x._M_leaf_pos = __curr_start_pos;
170  goto done;
171  case _RopeRep::_S_concat:
172  {
173  const _RopeConcat* __c = __STATIC_CAST(const _RopeConcat*, __curr_rope);
174  _RopeRep* __left = __c->_M_left;
175  size_t __left_len = __left->_M_size._M_data;
176 
177  __dirns <<= 1;
178  if (__pos >= __curr_start_pos + __left_len) {
179  __dirns |= 1;
180  __curr_rope = __c->_M_right;
181  __curr_start_pos += __left_len;
182  } else {
183  __curr_rope = __left;
184  }
185  }
186  break;
187  }
188  }
189 done:
190  // Copy last section of path into _M_path_end.
191  {
192  int __i = -1;
193  int __j = __curr_depth + 1 - _S_path_cache_len;
194 
195  if (__j < 0) __j = 0;
196  while (__j <= __curr_depth) {
197  __x._M_path_end._M_data[++__i] = __path[__j++];
198  }
199  __x._M_leaf_index = __i;
200  }
201  __x._M_path_directions = __dirns;
202  _S_setbuf(__x);
203 }
unsigned char _M_path_directions
Definition: _rope.h:795
static void _S_setbuf(_Rope_iterator_base< _CharT, _Alloc > &__x)
Definition: _rope.c:90
#define __STATIC_CAST(__x, __y)
Definition: features.h:585
size_t _M_current_pos
Definition: _rope.h:764
size_t _M_leaf_pos
Definition: _rope.h:768
#define __c
Definition: schilyio.h:209
_Value _M_data
Definition: _alloc.h:478
_Rope_RopeRep< _CharT, _Alloc > _RopeRep
Definition: _rope.h:760
_CharT * _M_buf_ptr
Definition: _rope.h:772
struct _Rope_iterator_base::@1793 _M_path_end
_CharT * _M_buf_end
Definition: _rope.h:774
_CharT * _M_buf_start
Definition: _rope.h:770
_Rope_RopeConcatenation< _CharT, _Alloc > _RopeConcat
Definition: _rope.h:758
#define _STLP_ASSERT(expr)
Definition: _debug.h:165
_STLP_PRIV _STLP_alloc_proxy< size_t, _CharT, allocator_type > _M_size
Definition: _rope.h:362
_RopeRep * _M_root
Definition: _rope.h:766

Referenced by _Rope_iterator< _CharT, _Alloc >::_Rope_iterator(), and _Rope_const_iterator< _CharT, _Alloc >::operator *().

◆ _S_setcache_for_incr()

template<class _CharT , class _Alloc >
void _Rope_iterator_base< _CharT, _Alloc >::_S_setcache_for_incr ( _Rope_iterator_base< _CharT, _Alloc > &  __x)
static

Definition at line 208 of file _rope.c.

209  {
210  int __current_index = __x._M_leaf_index;
211  const _RopeRep* __current_node = __x._M_path_end._M_data[__current_index];
212  size_t __len = __current_node->_M_size._M_data;
213  size_t __node_start_pos = __x._M_leaf_pos;
214  unsigned char __dirns = __x._M_path_directions;
215  const _RopeConcat* __c;
216 
218  if (__x._M_current_pos - __node_start_pos < __len) {
219  /* More stuff in this leaf, we just didn't cache it. */
220  _S_setbuf(__x);
221  return;
222  }
223  _STLP_ASSERT(__node_start_pos + __len == __x._M_current_pos)
224  // node_start_pos is starting position of last_node.
225  while (--__current_index >= 0) {
226  if (!(__dirns & 1) /* Path turned left */)
227  break;
228  __current_node = __x._M_path_end._M_data[__current_index];
229  __c = __STATIC_CAST(const _RopeConcat*, __current_node);
230  // Otherwise we were in the right child. Thus we should pop
231  // the concatenation node.
232  __node_start_pos -= __c->_M_left->_M_size._M_data;
233  __dirns >>= 1;
234  }
235  if (__current_index < 0) {
236  // We underflowed the cache. Punt.
237  _S_setcache(__x);
238  return;
239  }
240  __current_node = __x._M_path_end._M_data[__current_index];
241  __c = __STATIC_CAST(const _RopeConcat*, __current_node);
242  // current_node is a concatenation node. We are positioned on the first
243  // character in its right child.
244  // node_start_pos is starting position of current_node.
245  __node_start_pos += __c->_M_left->_M_size._M_data;
246  __current_node = __c->_M_right;
247  __x._M_path_end._M_data[++__current_index] = __current_node;
248  __dirns |= 1;
249  while (_RopeRep::_S_concat == __current_node->_M_tag) {
250  ++__current_index;
251  if (_S_path_cache_len == __current_index) {
252  int __i;
253  for (__i = 0; __i < _S_path_cache_len-1; ++__i) {
254  __x._M_path_end._M_data[__i] = __x._M_path_end._M_data[__i+1];
255  }
256  --__current_index;
257  }
258  __current_node = __STATIC_CAST(const _RopeConcat*, __current_node)->_M_left;
259  __x._M_path_end._M_data[__current_index] = __current_node;
260  __dirns <<= 1;
261  // node_start_pos is unchanged.
262  }
263  __x._M_leaf_index = __current_index;
264  __x._M_leaf_pos = __node_start_pos;
265  __x._M_path_directions = __dirns;
266  _S_setbuf(__x);
267 }
unsigned char _M_path_directions
Definition: _rope.h:795
static void _S_setbuf(_Rope_iterator_base< _CharT, _Alloc > &__x)
Definition: _rope.c:90
static void _S_setcache(_Rope_iterator_base< _CharT, _Alloc > &__x)
Definition: _rope.c:136
#define __STATIC_CAST(__x, __y)
Definition: features.h:585
size_t _M_current_pos
Definition: _rope.h:764
size_t _M_leaf_pos
Definition: _rope.h:768
#define __c
Definition: schilyio.h:209
_Value _M_data
Definition: _alloc.h:478
while(1)
Definition: macro.lex.yy.c:740
_Rope_RopeRep< _CharT, _Alloc > _RopeRep
Definition: _rope.h:760
struct _Rope_iterator_base::@1793 _M_path_end
if(!(yy_init))
Definition: macro.lex.yy.c:714
_Rope_RopeConcatenation< _CharT, _Alloc > _RopeConcat
Definition: _rope.h:758
#define _STLP_ASSERT(expr)
Definition: _debug.h:165
_STLP_PRIV _STLP_alloc_proxy< size_t, _CharT, allocator_type > _M_size
Definition: _rope.h:362
_RopeRep * _M_root
Definition: _rope.h:766

◆ index()

◆ operator=()

template<class _CharT, class _Alloc>
_Self& _Rope_iterator_base< _CharT, _Alloc >::operator= ( const _Self __x)
inline

Definition at line 851 of file _rope.h.

852  {
853  _M_current_pos = __x._M_current_pos;
854  _M_root = __x._M_root;
855  _M_buf_start = __x._M_buf_start;
856  _M_buf_ptr = __x._M_buf_ptr;
857  _M_path_end = __x._M_path_end;
858  _M_leaf_index = __x._M_leaf_index;
859  _M_path_directions = __x._M_path_directions;
860  _M_leaf_pos = __x._M_leaf_pos;
861  if (0 != __x._M_buf_ptr) {
862  _M_copy_buf(__x);
863  }
864  return *this;
865  }
unsigned char _M_path_directions
Definition: _rope.h:795
void _M_copy_buf(const _Self &__x)
Definition: _rope.h:825
size_t _M_current_pos
Definition: _rope.h:764
size_t _M_leaf_pos
Definition: _rope.h:768
_CharT * _M_buf_ptr
Definition: _rope.h:772
struct _Rope_iterator_base::@1793 _M_path_end
_CharT * _M_buf_start
Definition: _rope.h:770
_RopeRep * _M_root
Definition: _rope.h:766

Referenced by _Rope_const_iterator< _CharT, _Alloc >::operator=(), and _Rope_iterator< _CharT, _Alloc >::operator=().

Friends And Related Function Documentation

◆ rope< _CharT, _Alloc >

template<class _CharT, class _Alloc>
friend class rope< _CharT, _Alloc >
friend

Definition at line 756 of file _rope.h.

Member Data Documentation

◆ _M_buf_end

◆ _M_buf_ptr

◆ _M_buf_start

◆ _M_current_pos

◆ _M_data [1/2]

template<class _CharT, class _Alloc>
_RopeRep const* _Rope_iterator_base< _CharT, _Alloc >::_M_data[_S_path_cache_len]

Definition at line 784 of file _rope.h.

◆ _M_data [2/2]

template<class _CharT, class _Alloc>
_CharT _Rope_iterator_base< _CharT, _Alloc >::_M_data[_S_iterator_buf_len]

Definition at line 807 of file _rope.h.

◆ _M_leaf_index

◆ _M_leaf_pos

◆ _M_path_directions

template<class _CharT, class _Alloc>
unsigned char _Rope_iterator_base< _CharT, _Alloc >::_M_path_directions

◆ _M_path_end

◆ _M_root

◆ _M_tmp_buf


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