62 {
return *
static_cast<_Container*
>(
this); }
68#if __cplusplus > 201402L
70 template<
typename _ExtractKey,
typename _Source>
71 struct _UContInvalidatePred
73 template<
typename _Iterator>
75 operator()(_Iterator __it)
const
76 {
return _M_source.count(_ExtractKey{}(*__it)) == 0; }
78 const _Source& _M_source;
81 template<
typename _ExtractKey,
typename _Source>
82 struct _UMContInvalidatePred
84 template<
typename _Iterator>
86 operator()(_Iterator __it)
const
89 _M_source._M_base().equal_range(_ExtractKey{}(*__it));
90 for (
auto __rit = __rng.first;
91 __rit != __rng.second; ++__rit)
100 const _Source& _M_source;
103 template<
typename _Source,
typename _Inval
idatePred>
104 struct _UContMergeGuard
106 _UContMergeGuard(_Source& __src) noexcept
107 : _M_source(__src), _M_size(__src.size()), _M_pred { __src }
110 _UContMergeGuard(
const _UContMergeGuard&) =
delete;
114 const std::size_t __size = _M_source.size();
115 if (__size == _M_size)
121 _M_source._M_invalidate_all();
123 _M_source._M_invalidate_all_if(_M_pred);
127 _M_source._M_invalidate_all();
132 const std::size_t _M_size;
133 _InvalidatePred _M_pred;
136 template<
typename _ExtractKey,
typename _Source>
137 static _UContMergeGuard<_Source,
138 _UContInvalidatePred<_ExtractKey, _Source>>
139 _S_uc_guard(_ExtractKey, _Source& __src)
141 typedef _UContInvalidatePred<_ExtractKey, _Source> _InvalidatePred;
142 return _UContMergeGuard<_Source, _InvalidatePred>(__src);
145 template<
typename _ExtractKey,
typename _Source>
146 static _UContMergeGuard<_Source,
147 _UMContInvalidatePred<_ExtractKey, _Source>>
148 _S_umc_guard(_ExtractKey, _Source& __src)
150 typedef _UMContInvalidatePred<_ExtractKey, _Source> _InvalidatePred;
151 return _UContMergeGuard<_Source, _InvalidatePred>(__src);
160 auto __end = _M_cont()._M_base().cend();
162 [__end](
decltype(__end) __it)
163 {
return __it != __end; },
166 auto __local_end = _M_cont()._M_base().cend(0);
167 _M_invalidate_local_if(
168 [__local_end](
decltype(__local_end) __it)
169 {
return __it != __local_end; },
173 template<
typename _Predicate>
175 _M_invalidate_all_if(_Predicate __pred)
178 _M_invalidate_if(__pred, sentry);
179 _M_invalidate_local_if(__pred, sentry);
183 template<
typename _VictimIt>
185 _M_invalidate(_VictimIt __victim)
188 _M_invalidate(__victim, sentry);
191 template<
typename _VictimIt>
195 auto __end = _M_cont()._M_base().cend();
197 [__victim](
decltype(__end) __it)
198 {
return __it == __victim; },
201 auto __local_end = _M_cont()._M_base().cend(0);
202 _M_invalidate_local_if(
203 [__victim](
decltype(__local_end) __it)
204 {
return __it == __victim; },
213 template<
typename _Predicate>
221 template<
typename _Predicate>
223 _M_invalidate_local_if(_Predicate __pred,