70 using allocator_type = __alloc_rebind<_NodeAlloc, _Val>;
73 get_allocator()
const noexcept
75 __glibcxx_assert(!this->empty());
76 return allocator_type(_M_alloc._M_alloc);
79 explicit operator bool()
const noexcept {
return _M_ptr !=
nullptr; }
81 [[nodiscard]]
bool empty()
const noexcept {
return _M_ptr ==
nullptr; }
108 else if (__nh.empty())
116 _M_alloc = __nh._M_alloc.release();
117 _M_ptr = __nh._M_ptr;
118 __nh._M_ptr =
nullptr;
124 const _NodeAlloc& __alloc)
125 : _M_ptr(__ptr), _M_alloc(__alloc)
127 __glibcxx_assert(__ptr !=
nullptr);
138 else if (__nh.empty())
143 swap(_M_ptr, __nh._M_ptr);
144 _M_alloc.swap(__nh._M_alloc);
156 _M_ptr = __nh._M_ptr;
157 __nh._M_ptr =
nullptr;
166 _NodeAlloc __alloc = _M_alloc.release();
188 union _Optional_alloc
190 _Optional_alloc() { }
191 ~_Optional_alloc() { }
193 _Optional_alloc(_Optional_alloc&&) =
delete;
194 _Optional_alloc& operator=(_Optional_alloc&&) =
delete;
196 _Optional_alloc(
const _NodeAlloc& __alloc) noexcept
202 operator=(_NodeAlloc&& __alloc)
noexcept
205 if constexpr (_ATr::propagate_on_container_move_assignment::value)
207 else if constexpr (!_AllocTraits::is_always_equal::value)
208 __glibcxx_assert(_M_alloc == __alloc);
213 swap(_Optional_alloc& __other)
noexcept
216 if constexpr (_AllocTraits::propagate_on_container_swap::value)
217 swap(_M_alloc, __other._M_alloc);
218 else if constexpr (!_AllocTraits::is_always_equal::value)
219 __glibcxx_assert(_M_alloc == __other._M_alloc);
223 _NodeAlloc&
operator*()
noexcept {
return _M_alloc; }
226 _NodeAlloc release()
noexcept
229 _M_alloc.~_NodeAlloc();
233 [[__no_unique_address__]] _NodeAlloc _M_alloc;
236 [[__no_unique_address__]] _Optional_alloc _M_alloc;
238 template<
typename _Key2,
typename _Value2,
typename _KeyOfValue,
239 typename _Compare,
typename _ValueAlloc>
240 friend class _Rb_tree;
242 template<
typename _Key2,
typename _Value2,
typename _ValueAlloc,
243 typename _ExtractKey,
typename _Equal,
244 typename _Hash,
typename _RangeHash,
typename _Unused,
245 typename _RehashPolicy,
typename _Traits>
246 friend class _Hashtable;
263 using key_type = _Key;
264 using mapped_type =
typename _Value::second_type;
269 __glibcxx_assert(!this->empty());
274 mapped()
const noexcept
276 __glibcxx_assert(!this->empty());
285 swap(_M_pkey, __nh._M_pkey);
286 swap(_M_pmapped, __nh._M_pmapped);
291 noexcept(
noexcept(__x.swap(__y)))
298 const _NodeAlloc& __alloc)
303 auto& __key =
const_cast<_Key&
>(__ptr->_M_valptr()->first);
304 _M_pkey = _S_pointer_to(__key);
305 _M_pmapped = _S_pointer_to(__ptr->_M_valptr()->second);
310 _M_pmapped =
nullptr;
314 template<
typename _Tp>
319 __pointer<_Key> _M_pkey =
nullptr;
320 __pointer<typename _Value::second_type> _M_pmapped =
nullptr;
322 template<
typename _Tp>
324 _S_pointer_to(_Tp& __obj)
328 _M_key()
const noexcept {
return key(); }
330 template<
typename _Key2,
typename _Value2,
typename _KeyOfValue,
331 typename _Compare,
typename _ValueAlloc>
332 friend class _Rb_tree;
334 template<
typename _Key2,
typename _Value2,
typename _ValueAlloc,
335 typename _ExtractKey,
typename _Equal,
336 typename _Hash,
typename _RangeHash,
typename _Unused,
337 typename _RehashPolicy,
typename _Traits>
338 friend class _Hashtable;