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.