libstdc++: safe_sequence.tcc Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29#ifndef _GLIBCXX_DEBUG_SAFE_SEQUENCE_TCC
30#define _GLIBCXX_DEBUG_SAFE_SEQUENCE_TCC 1
31
33{
34 template<typename _Sequence>
35 template<typename _Predicate>
36 void
39 {
40 typedef typename _Sequence::iterator iterator;
41 typedef typename _Sequence::const_iterator const_iterator;
42
45 {
46 iterator* __victim = static_cast<iterator*>(__iter);
47 __iter = __iter->_M_next;
48 if (!__victim->_M_singular() && __pred(__victim->base()))
49 {
50 __victim->_M_invalidate();
51 }
52 }
53
55 {
56 const_iterator* __victim = static_cast<const_iterator*>(__iter2);
57 __iter2 = __iter2->_M_next;
58 if (!__victim->_M_singular() && __pred(__victim->base()))
59 {
60 __victim->_M_invalidate();
61 }
62 }
63 }
64
65 template<typename _Sequence>
66 template<typename _Predicate>
67 void
70 {
72 return;
73
74 typedef typename _Sequence::iterator iterator;
75 typedef typename _Sequence::const_iterator const_iterator;
76
81 {
82
84
86 {
88 iterator* __victim = static_cast<iterator*>(__victim_base);
90 if (!__victim->_M_singular() && __pred(__victim->base()))
91 {
93 if (__transfered_iterators)
94 {
95 __victim_base->_M_next = __transfered_iterators;
96 __transfered_iterators->_M_prior = __victim_base;
97 }
98 else
99 __last_iterator = __victim_base;
101 __victim_base->_M_version = this->_M_version;
102 __transfered_iterators = __victim_base;
103 }
104 }
105
107 __iter2;)
108 {
110 const_iterator* __victim =
111 static_cast<const_iterator*>(__victim_base);
112 __iter2 = __iter2->_M_next;
113 if (!__victim->_M_singular() && __pred(__victim->base()))
114 {
116 if (__transfered_const_iterators)
118 __victim_base->_M_next = __transfered_const_iterators;
119 __transfered_const_iterators->_M_prior = __victim_base;
120 }
121 else
122 __last_const_iterator = __victim;
124 __victim_base->_M_version = this->_M_version;
125 __transfered_const_iterators = __victim_base;
126 }
127 }
128 }
129
130
131 if (__last_iterator || __last_const_iterator)
132 {
134 if (__last_iterator)
135 {
136 if (this->_M_iterators)
137 {
138 this->_M_iterators->_M_prior = __last_iterator;
139 __last_iterator->_M_next = this->_M_iterators;
140 }
141 this->_M_iterators = __transfered_iterators;
142 }
143 if (__last_const_iterator)
144 {
145 if (this->_M_const_iterators)
146 {
147 this->_M_const_iterators->_M_prior = __last_const_iterator;
148 __last_const_iterator->_M_next = this->_M_const_iterators;
149 }
150 this->_M_const_iterators = __transfered_const_iterators;
151 }
152 }
153 }
154}
155
156#endif
constexpr _Tp * __addressof(_Tp &__r) noexcept
Same as C++11 std::addressof.
GNU debug classes for public use.
Base class for constructing a safe sequence type that tracks iterators that reference it.
void _M_invalidate_if(_Predicate __pred)
void _M_transfer_from_if(_Safe_sequence &__from, _Predicate __pred)
Basic functionality for a safe iterator.
_Safe_sequence_base * _M_sequence
_Safe_iterator_base * _M_prior
_Safe_iterator_base * _M_next
_Safe_iterator_base * _M_const_iterators
The list of constant iterators that reference this container.
__gnu_cxx::__mutex & _M_get_mutex()
_Safe_iterator_base * _M_iterators
The list of mutable iterators that reference this container.