1*38fd1498Szrj// <forward_list> -*- C++ -*- 2*38fd1498Szrj 3*38fd1498Szrj// Copyright (C) 2010-2018 Free Software Foundation, Inc. 4*38fd1498Szrj// 5*38fd1498Szrj// This file is part of the GNU ISO C++ Library. This library is free 6*38fd1498Szrj// software; you can redistribute it and/or modify it under the 7*38fd1498Szrj// terms of the GNU General Public License as published by the 8*38fd1498Szrj// Free Software Foundation; either version 3, or (at your option) 9*38fd1498Szrj// any later version. 10*38fd1498Szrj 11*38fd1498Szrj// This library is distributed in the hope that it will be useful, 12*38fd1498Szrj// but WITHOUT ANY WARRANTY; without even the implied warranty of 13*38fd1498Szrj// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*38fd1498Szrj// GNU General Public License for more details. 15*38fd1498Szrj 16*38fd1498Szrj// Under Section 7 of GPL version 3, you are granted additional 17*38fd1498Szrj// permissions described in the GCC Runtime Library Exception, version 18*38fd1498Szrj// 3.1, as published by the Free Software Foundation. 19*38fd1498Szrj 20*38fd1498Szrj// You should have received a copy of the GNU General Public License and 21*38fd1498Szrj// a copy of the GCC Runtime Library Exception along with this program; 22*38fd1498Szrj// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23*38fd1498Szrj// <http://www.gnu.org/licenses/>. 24*38fd1498Szrj 25*38fd1498Szrj/** @file debug/forward_list 26*38fd1498Szrj * This file is a GNU debug extension to the Standard C++ Library. 27*38fd1498Szrj */ 28*38fd1498Szrj 29*38fd1498Szrj#ifndef _GLIBCXX_DEBUG_FORWARD_LIST 30*38fd1498Szrj#define _GLIBCXX_DEBUG_FORWARD_LIST 1 31*38fd1498Szrj 32*38fd1498Szrj#pragma GCC system_header 33*38fd1498Szrj 34*38fd1498Szrj#include <forward_list> 35*38fd1498Szrj#include <debug/safe_sequence.h> 36*38fd1498Szrj#include <debug/safe_container.h> 37*38fd1498Szrj#include <debug/safe_iterator.h> 38*38fd1498Szrj 39*38fd1498Szrj// Special validity check for forward_list ranges. 40*38fd1498Szrj#define __glibcxx_check_valid_fl_range(_First,_Last,_Dist) \ 41*38fd1498Szrj_GLIBCXX_DEBUG_VERIFY(_First._M_valid_range(_Last, _Dist, false), \ 42*38fd1498Szrj _M_message(__gnu_debug::__msg_valid_range) \ 43*38fd1498Szrj ._M_iterator(_First, #_First) \ 44*38fd1498Szrj ._M_iterator(_Last, #_Last)) 45*38fd1498Szrj 46*38fd1498Szrjnamespace __gnu_debug 47*38fd1498Szrj{ 48*38fd1498Szrj /// Special iterators swap and invalidation for forward_list because of the 49*38fd1498Szrj /// before_begin iterator. 50*38fd1498Szrj template<typename _SafeSequence> 51*38fd1498Szrj class _Safe_forward_list 52*38fd1498Szrj : public _Safe_sequence<_SafeSequence> 53*38fd1498Szrj { 54*38fd1498Szrj _SafeSequence& 55*38fd1498Szrj _M_this() noexcept 56*38fd1498Szrj { return *static_cast<_SafeSequence*>(this); } 57*38fd1498Szrj 58*38fd1498Szrj static void 59*38fd1498Szrj _M_swap_aux(_Safe_sequence_base& __lhs, 60*38fd1498Szrj _Safe_iterator_base*& __lhs_iterators, 61*38fd1498Szrj _Safe_sequence_base& __rhs, 62*38fd1498Szrj _Safe_iterator_base*& __rhs_iterators); 63*38fd1498Szrj 64*38fd1498Szrj void _M_swap_single(_Safe_sequence_base&) noexcept; 65*38fd1498Szrj 66*38fd1498Szrj protected: 67*38fd1498Szrj void 68*38fd1498Szrj _M_invalidate_all() 69*38fd1498Szrj { 70*38fd1498Szrj using _Base_const_iterator = __decltype(_M_this()._M_base().cend()); 71*38fd1498Szrj this->_M_invalidate_if([this](_Base_const_iterator __it) 72*38fd1498Szrj { 73*38fd1498Szrj return __it != _M_this()._M_base().cbefore_begin() 74*38fd1498Szrj && __it != _M_this()._M_base().cend(); }); 75*38fd1498Szrj } 76*38fd1498Szrj 77*38fd1498Szrj void _M_swap(_Safe_sequence_base&) noexcept; 78*38fd1498Szrj }; 79*38fd1498Szrj 80*38fd1498Szrj template<typename _SafeSequence> 81*38fd1498Szrj void 82*38fd1498Szrj _Safe_forward_list<_SafeSequence>:: 83*38fd1498Szrj _M_swap_aux(_Safe_sequence_base& __lhs, 84*38fd1498Szrj _Safe_iterator_base*& __lhs_iterators, 85*38fd1498Szrj _Safe_sequence_base& __rhs, 86*38fd1498Szrj _Safe_iterator_base*& __rhs_iterators) 87*38fd1498Szrj { 88*38fd1498Szrj using const_iterator = typename _SafeSequence::const_iterator; 89*38fd1498Szrj _Safe_iterator_base* __bbegin_its = 0; 90*38fd1498Szrj _Safe_iterator_base* __last_bbegin = 0; 91*38fd1498Szrj _SafeSequence& __rseq = static_cast<_SafeSequence&>(__rhs); 92*38fd1498Szrj 93*38fd1498Szrj for (_Safe_iterator_base* __iter = __lhs_iterators; __iter;) 94*38fd1498Szrj { 95*38fd1498Szrj // Even iterator is cast to const_iterator, not a problem. 96*38fd1498Szrj _Safe_iterator_base* __victim_base = __iter; 97*38fd1498Szrj const_iterator* __victim = 98*38fd1498Szrj static_cast<const_iterator*>(__victim_base); 99*38fd1498Szrj __iter = __iter->_M_next; 100*38fd1498Szrj if (__victim->base() == __rseq._M_base().cbefore_begin()) 101*38fd1498Szrj { 102*38fd1498Szrj __victim->_M_unlink(); 103*38fd1498Szrj if (__lhs_iterators == __victim_base) 104*38fd1498Szrj __lhs_iterators = __victim_base->_M_next; 105*38fd1498Szrj if (__bbegin_its) 106*38fd1498Szrj { 107*38fd1498Szrj __victim_base->_M_next = __bbegin_its; 108*38fd1498Szrj __bbegin_its->_M_prior = __victim_base; 109*38fd1498Szrj } 110*38fd1498Szrj else 111*38fd1498Szrj __last_bbegin = __victim_base; 112*38fd1498Szrj __bbegin_its = __victim_base; 113*38fd1498Szrj } 114*38fd1498Szrj else 115*38fd1498Szrj __victim_base->_M_sequence = std::__addressof(__lhs); 116*38fd1498Szrj } 117*38fd1498Szrj 118*38fd1498Szrj if (__bbegin_its) 119*38fd1498Szrj { 120*38fd1498Szrj if (__rhs_iterators) 121*38fd1498Szrj { 122*38fd1498Szrj __rhs_iterators->_M_prior = __last_bbegin; 123*38fd1498Szrj __last_bbegin->_M_next = __rhs_iterators; 124*38fd1498Szrj } 125*38fd1498Szrj __rhs_iterators = __bbegin_its; 126*38fd1498Szrj } 127*38fd1498Szrj } 128*38fd1498Szrj 129*38fd1498Szrj template<typename _SafeSequence> 130*38fd1498Szrj void 131*38fd1498Szrj _Safe_forward_list<_SafeSequence>:: 132*38fd1498Szrj _M_swap_single(_Safe_sequence_base& __other) noexcept 133*38fd1498Szrj { 134*38fd1498Szrj std::swap(_M_this()._M_iterators, __other._M_iterators); 135*38fd1498Szrj std::swap(_M_this()._M_const_iterators, __other._M_const_iterators); 136*38fd1498Szrj // Useless, always 1 on forward_list 137*38fd1498Szrj //std::swap(_M_this()_M_version, __other._M_version); 138*38fd1498Szrj _Safe_iterator_base* __this_its = _M_this()._M_iterators; 139*38fd1498Szrj _M_swap_aux(__other, __other._M_iterators, 140*38fd1498Szrj _M_this(), _M_this()._M_iterators); 141*38fd1498Szrj _Safe_iterator_base* __this_const_its = _M_this()._M_const_iterators; 142*38fd1498Szrj _M_swap_aux(__other, __other._M_const_iterators, 143*38fd1498Szrj _M_this(), _M_this()._M_const_iterators); 144*38fd1498Szrj _M_swap_aux(_M_this(), __this_its, 145*38fd1498Szrj __other, __other._M_iterators); 146*38fd1498Szrj _M_swap_aux(_M_this(), __this_const_its, 147*38fd1498Szrj __other, __other._M_const_iterators); 148*38fd1498Szrj } 149*38fd1498Szrj 150*38fd1498Szrj /* Special forward_list _M_swap version that does not swap the 151*38fd1498Szrj * before-begin ownership.*/ 152*38fd1498Szrj template<typename _SafeSequence> 153*38fd1498Szrj void 154*38fd1498Szrj _Safe_forward_list<_SafeSequence>:: 155*38fd1498Szrj _M_swap(_Safe_sequence_base& __other) noexcept 156*38fd1498Szrj { 157*38fd1498Szrj // We need to lock both sequences to swap 158*38fd1498Szrj using namespace __gnu_cxx; 159*38fd1498Szrj __mutex *__this_mutex = &_M_this()._M_get_mutex(); 160*38fd1498Szrj __mutex *__other_mutex = 161*38fd1498Szrj &static_cast<_SafeSequence&>(__other)._M_get_mutex(); 162*38fd1498Szrj if (__this_mutex == __other_mutex) 163*38fd1498Szrj { 164*38fd1498Szrj __scoped_lock __lock(*__this_mutex); 165*38fd1498Szrj _M_swap_single(__other); 166*38fd1498Szrj } 167*38fd1498Szrj else 168*38fd1498Szrj { 169*38fd1498Szrj __scoped_lock __l1(__this_mutex < __other_mutex 170*38fd1498Szrj ? *__this_mutex : *__other_mutex); 171*38fd1498Szrj __scoped_lock __l2(__this_mutex < __other_mutex 172*38fd1498Szrj ? *__other_mutex : *__this_mutex); 173*38fd1498Szrj _M_swap_single(__other); 174*38fd1498Szrj } 175*38fd1498Szrj } 176*38fd1498Szrj} 177*38fd1498Szrj 178*38fd1498Szrjnamespace std _GLIBCXX_VISIBILITY(default) 179*38fd1498Szrj{ 180*38fd1498Szrjnamespace __debug 181*38fd1498Szrj{ 182*38fd1498Szrj /// Class std::forward_list with safety/checking/debug instrumentation. 183*38fd1498Szrj template<typename _Tp, typename _Alloc = std::allocator<_Tp> > 184*38fd1498Szrj class forward_list 185*38fd1498Szrj : public __gnu_debug::_Safe_container< 186*38fd1498Szrj forward_list<_Tp, _Alloc>, _Alloc, __gnu_debug::_Safe_forward_list>, 187*38fd1498Szrj public _GLIBCXX_STD_C::forward_list<_Tp, _Alloc> 188*38fd1498Szrj { 189*38fd1498Szrj typedef _GLIBCXX_STD_C::forward_list<_Tp, _Alloc> _Base; 190*38fd1498Szrj typedef __gnu_debug::_Safe_container< 191*38fd1498Szrj forward_list, _Alloc, __gnu_debug::_Safe_forward_list> _Safe; 192*38fd1498Szrj 193*38fd1498Szrj typedef typename _Base::iterator _Base_iterator; 194*38fd1498Szrj typedef typename _Base::const_iterator _Base_const_iterator; 195*38fd1498Szrj 196*38fd1498Szrj public: 197*38fd1498Szrj typedef typename _Base::reference reference; 198*38fd1498Szrj typedef typename _Base::const_reference const_reference; 199*38fd1498Szrj 200*38fd1498Szrj typedef __gnu_debug::_Safe_iterator< 201*38fd1498Szrj _Base_iterator, forward_list> iterator; 202*38fd1498Szrj typedef __gnu_debug::_Safe_iterator< 203*38fd1498Szrj _Base_const_iterator, forward_list> const_iterator; 204*38fd1498Szrj 205*38fd1498Szrj typedef typename _Base::size_type size_type; 206*38fd1498Szrj typedef typename _Base::difference_type difference_type; 207*38fd1498Szrj 208*38fd1498Szrj typedef _Tp value_type; 209*38fd1498Szrj typedef typename _Base::allocator_type allocator_type; 210*38fd1498Szrj typedef typename _Base::pointer pointer; 211*38fd1498Szrj typedef typename _Base::const_pointer const_pointer; 212*38fd1498Szrj 213*38fd1498Szrj // 23.2.3.1 construct/copy/destroy: 214*38fd1498Szrj 215*38fd1498Szrj forward_list() = default; 216*38fd1498Szrj 217*38fd1498Szrj explicit 218*38fd1498Szrj forward_list(const allocator_type& __al) noexcept 219*38fd1498Szrj : _Base(__al) { } 220*38fd1498Szrj 221*38fd1498Szrj forward_list(const forward_list& __list, const allocator_type& __al) 222*38fd1498Szrj : _Base(__list, __al) 223*38fd1498Szrj { } 224*38fd1498Szrj 225*38fd1498Szrj forward_list(forward_list&& __list, const allocator_type& __al) 226*38fd1498Szrj : _Safe(std::move(__list._M_safe()), __al), 227*38fd1498Szrj _Base(std::move(__list._M_base()), __al) 228*38fd1498Szrj { } 229*38fd1498Szrj 230*38fd1498Szrj explicit 231*38fd1498Szrj forward_list(size_type __n, const allocator_type& __al = allocator_type()) 232*38fd1498Szrj : _Base(__n, __al) 233*38fd1498Szrj { } 234*38fd1498Szrj 235*38fd1498Szrj forward_list(size_type __n, const _Tp& __value, 236*38fd1498Szrj const allocator_type& __al = allocator_type()) 237*38fd1498Szrj : _Base(__n, __value, __al) 238*38fd1498Szrj { } 239*38fd1498Szrj 240*38fd1498Szrj template<typename _InputIterator, 241*38fd1498Szrj typename = std::_RequireInputIter<_InputIterator>> 242*38fd1498Szrj forward_list(_InputIterator __first, _InputIterator __last, 243*38fd1498Szrj const allocator_type& __al = allocator_type()) 244*38fd1498Szrj : _Base(__gnu_debug::__base(__gnu_debug::__check_valid_range(__first, 245*38fd1498Szrj __last)), 246*38fd1498Szrj __gnu_debug::__base(__last), __al) 247*38fd1498Szrj { } 248*38fd1498Szrj 249*38fd1498Szrj forward_list(const forward_list&) = default; 250*38fd1498Szrj 251*38fd1498Szrj forward_list(forward_list&&) = default; 252*38fd1498Szrj 253*38fd1498Szrj forward_list(std::initializer_list<_Tp> __il, 254*38fd1498Szrj const allocator_type& __al = allocator_type()) 255*38fd1498Szrj : _Base(__il, __al) 256*38fd1498Szrj { } 257*38fd1498Szrj 258*38fd1498Szrj ~forward_list() = default; 259*38fd1498Szrj 260*38fd1498Szrj forward_list& 261*38fd1498Szrj operator=(const forward_list&) = default; 262*38fd1498Szrj 263*38fd1498Szrj forward_list& 264*38fd1498Szrj operator=(forward_list&&) = default; 265*38fd1498Szrj 266*38fd1498Szrj forward_list& 267*38fd1498Szrj operator=(std::initializer_list<_Tp> __il) 268*38fd1498Szrj { 269*38fd1498Szrj _M_base() = __il; 270*38fd1498Szrj this->_M_invalidate_all(); 271*38fd1498Szrj return *this; 272*38fd1498Szrj } 273*38fd1498Szrj 274*38fd1498Szrj template<typename _InputIterator, 275*38fd1498Szrj typename = std::_RequireInputIter<_InputIterator>> 276*38fd1498Szrj void 277*38fd1498Szrj assign(_InputIterator __first, _InputIterator __last) 278*38fd1498Szrj { 279*38fd1498Szrj typename __gnu_debug::_Distance_traits<_InputIterator>::__type __dist; 280*38fd1498Szrj __glibcxx_check_valid_range2(__first, __last, __dist); 281*38fd1498Szrj 282*38fd1498Szrj if (__dist.second >= __gnu_debug::__dp_sign) 283*38fd1498Szrj _Base::assign(__gnu_debug::__unsafe(__first), 284*38fd1498Szrj __gnu_debug::__unsafe(__last)); 285*38fd1498Szrj else 286*38fd1498Szrj _Base::assign(__first, __last); 287*38fd1498Szrj 288*38fd1498Szrj this->_M_invalidate_all(); 289*38fd1498Szrj } 290*38fd1498Szrj 291*38fd1498Szrj void 292*38fd1498Szrj assign(size_type __n, const _Tp& __val) 293*38fd1498Szrj { 294*38fd1498Szrj _Base::assign(__n, __val); 295*38fd1498Szrj this->_M_invalidate_all(); 296*38fd1498Szrj } 297*38fd1498Szrj 298*38fd1498Szrj void 299*38fd1498Szrj assign(std::initializer_list<_Tp> __il) 300*38fd1498Szrj { 301*38fd1498Szrj _Base::assign(__il); 302*38fd1498Szrj this->_M_invalidate_all(); 303*38fd1498Szrj } 304*38fd1498Szrj 305*38fd1498Szrj using _Base::get_allocator; 306*38fd1498Szrj 307*38fd1498Szrj // iterators: 308*38fd1498Szrj 309*38fd1498Szrj iterator 310*38fd1498Szrj before_begin() noexcept 311*38fd1498Szrj { return iterator(_Base::before_begin(), this); } 312*38fd1498Szrj 313*38fd1498Szrj const_iterator 314*38fd1498Szrj before_begin() const noexcept 315*38fd1498Szrj { return const_iterator(_Base::before_begin(), this); } 316*38fd1498Szrj 317*38fd1498Szrj iterator 318*38fd1498Szrj begin() noexcept 319*38fd1498Szrj { return iterator(_Base::begin(), this); } 320*38fd1498Szrj 321*38fd1498Szrj const_iterator 322*38fd1498Szrj begin() const noexcept 323*38fd1498Szrj { return const_iterator(_Base::begin(), this); } 324*38fd1498Szrj 325*38fd1498Szrj iterator 326*38fd1498Szrj end() noexcept 327*38fd1498Szrj { return iterator(_Base::end(), this); } 328*38fd1498Szrj 329*38fd1498Szrj const_iterator 330*38fd1498Szrj end() const noexcept 331*38fd1498Szrj { return const_iterator(_Base::end(), this); } 332*38fd1498Szrj 333*38fd1498Szrj const_iterator 334*38fd1498Szrj cbegin() const noexcept 335*38fd1498Szrj { return const_iterator(_Base::cbegin(), this); } 336*38fd1498Szrj 337*38fd1498Szrj const_iterator 338*38fd1498Szrj cbefore_begin() const noexcept 339*38fd1498Szrj { return const_iterator(_Base::cbefore_begin(), this); } 340*38fd1498Szrj 341*38fd1498Szrj const_iterator 342*38fd1498Szrj cend() const noexcept 343*38fd1498Szrj { return const_iterator(_Base::cend(), this); } 344*38fd1498Szrj 345*38fd1498Szrj using _Base::empty; 346*38fd1498Szrj using _Base::max_size; 347*38fd1498Szrj 348*38fd1498Szrj // element access: 349*38fd1498Szrj 350*38fd1498Szrj reference 351*38fd1498Szrj front() 352*38fd1498Szrj { 353*38fd1498Szrj __glibcxx_check_nonempty(); 354*38fd1498Szrj return _Base::front(); 355*38fd1498Szrj } 356*38fd1498Szrj 357*38fd1498Szrj const_reference 358*38fd1498Szrj front() const 359*38fd1498Szrj { 360*38fd1498Szrj __glibcxx_check_nonempty(); 361*38fd1498Szrj return _Base::front(); 362*38fd1498Szrj } 363*38fd1498Szrj 364*38fd1498Szrj // modifiers: 365*38fd1498Szrj 366*38fd1498Szrj using _Base::emplace_front; 367*38fd1498Szrj using _Base::push_front; 368*38fd1498Szrj 369*38fd1498Szrj void 370*38fd1498Szrj pop_front() 371*38fd1498Szrj { 372*38fd1498Szrj __glibcxx_check_nonempty(); 373*38fd1498Szrj this->_M_invalidate_if([this](_Base_const_iterator __it) 374*38fd1498Szrj { return __it == this->_M_base().cbegin(); }); 375*38fd1498Szrj _Base::pop_front(); 376*38fd1498Szrj } 377*38fd1498Szrj 378*38fd1498Szrj template<typename... _Args> 379*38fd1498Szrj iterator 380*38fd1498Szrj emplace_after(const_iterator __pos, _Args&&... __args) 381*38fd1498Szrj { 382*38fd1498Szrj __glibcxx_check_insert_after(__pos); 383*38fd1498Szrj return iterator(_Base::emplace_after(__pos.base(), 384*38fd1498Szrj std::forward<_Args>(__args)...), 385*38fd1498Szrj this); 386*38fd1498Szrj } 387*38fd1498Szrj 388*38fd1498Szrj iterator 389*38fd1498Szrj insert_after(const_iterator __pos, const _Tp& __val) 390*38fd1498Szrj { 391*38fd1498Szrj __glibcxx_check_insert_after(__pos); 392*38fd1498Szrj return iterator(_Base::insert_after(__pos.base(), __val), this); 393*38fd1498Szrj } 394*38fd1498Szrj 395*38fd1498Szrj iterator 396*38fd1498Szrj insert_after(const_iterator __pos, _Tp&& __val) 397*38fd1498Szrj { 398*38fd1498Szrj __glibcxx_check_insert_after(__pos); 399*38fd1498Szrj return iterator(_Base::insert_after(__pos.base(), std::move(__val)), 400*38fd1498Szrj this); 401*38fd1498Szrj } 402*38fd1498Szrj 403*38fd1498Szrj iterator 404*38fd1498Szrj insert_after(const_iterator __pos, size_type __n, const _Tp& __val) 405*38fd1498Szrj { 406*38fd1498Szrj __glibcxx_check_insert_after(__pos); 407*38fd1498Szrj return iterator(_Base::insert_after(__pos.base(), __n, __val), 408*38fd1498Szrj this); 409*38fd1498Szrj } 410*38fd1498Szrj 411*38fd1498Szrj template<typename _InputIterator, 412*38fd1498Szrj typename = std::_RequireInputIter<_InputIterator>> 413*38fd1498Szrj iterator 414*38fd1498Szrj insert_after(const_iterator __pos, 415*38fd1498Szrj _InputIterator __first, _InputIterator __last) 416*38fd1498Szrj { 417*38fd1498Szrj typename __gnu_debug::_Distance_traits<_InputIterator>::__type __dist; 418*38fd1498Szrj __glibcxx_check_insert_range_after(__pos, __first, __last, __dist); 419*38fd1498Szrj 420*38fd1498Szrj if (__dist.second >= __gnu_debug::__dp_sign) 421*38fd1498Szrj return 422*38fd1498Szrj { 423*38fd1498Szrj _Base::insert_after(__pos.base(), 424*38fd1498Szrj __gnu_debug::__unsafe(__first), 425*38fd1498Szrj __gnu_debug::__unsafe(__last)), 426*38fd1498Szrj this 427*38fd1498Szrj }; 428*38fd1498Szrj else 429*38fd1498Szrj return { _Base::insert_after(__pos.base(), __first, __last), this }; 430*38fd1498Szrj } 431*38fd1498Szrj 432*38fd1498Szrj iterator 433*38fd1498Szrj insert_after(const_iterator __pos, std::initializer_list<_Tp> __il) 434*38fd1498Szrj { 435*38fd1498Szrj __glibcxx_check_insert_after(__pos); 436*38fd1498Szrj return iterator(_Base::insert_after(__pos.base(), __il), this); 437*38fd1498Szrj } 438*38fd1498Szrj 439*38fd1498Szrj private: 440*38fd1498Szrj _Base_iterator 441*38fd1498Szrj _M_erase_after(_Base_const_iterator __pos) 442*38fd1498Szrj { 443*38fd1498Szrj _Base_const_iterator __next = std::next(__pos); 444*38fd1498Szrj this->_M_invalidate_if([__next](_Base_const_iterator __it) 445*38fd1498Szrj { return __it == __next; }); 446*38fd1498Szrj return _Base::erase_after(__pos); 447*38fd1498Szrj } 448*38fd1498Szrj public: 449*38fd1498Szrj iterator 450*38fd1498Szrj erase_after(const_iterator __pos) 451*38fd1498Szrj { 452*38fd1498Szrj __glibcxx_check_erase_after(__pos); 453*38fd1498Szrj return iterator(_M_erase_after(__pos.base()), this); 454*38fd1498Szrj } 455*38fd1498Szrj 456*38fd1498Szrj iterator 457*38fd1498Szrj erase_after(const_iterator __pos, const_iterator __last) 458*38fd1498Szrj { 459*38fd1498Szrj __glibcxx_check_erase_range_after(__pos, __last); 460*38fd1498Szrj for (_Base_const_iterator __victim = std::next(__pos.base()); 461*38fd1498Szrj __victim != __last.base(); ++__victim) 462*38fd1498Szrj { 463*38fd1498Szrj _GLIBCXX_DEBUG_VERIFY(__victim != _Base::end(), 464*38fd1498Szrj _M_message(__gnu_debug::__msg_valid_range2) 465*38fd1498Szrj ._M_sequence(*this, "this") 466*38fd1498Szrj ._M_iterator(__pos, "pos") 467*38fd1498Szrj ._M_iterator(__last, "last")); 468*38fd1498Szrj this->_M_invalidate_if([__victim](_Base_const_iterator __it) 469*38fd1498Szrj { return __it == __victim; }); 470*38fd1498Szrj } 471*38fd1498Szrj return iterator(_Base::erase_after(__pos.base(), __last.base()), this); 472*38fd1498Szrj } 473*38fd1498Szrj 474*38fd1498Szrj void 475*38fd1498Szrj swap(forward_list& __list) 476*38fd1498Szrj noexcept( noexcept(declval<_Base&>().swap(__list)) ) 477*38fd1498Szrj { 478*38fd1498Szrj _Safe::_M_swap(__list); 479*38fd1498Szrj _Base::swap(__list); 480*38fd1498Szrj } 481*38fd1498Szrj 482*38fd1498Szrj void 483*38fd1498Szrj resize(size_type __sz) 484*38fd1498Szrj { 485*38fd1498Szrj this->_M_detach_singular(); 486*38fd1498Szrj 487*38fd1498Szrj // if __sz < size(), invalidate all iterators in [begin+__sz, end() 488*38fd1498Szrj _Base_iterator __victim = _Base::begin(); 489*38fd1498Szrj _Base_iterator __end = _Base::end(); 490*38fd1498Szrj for (size_type __i = __sz; __victim != __end && __i > 0; --__i) 491*38fd1498Szrj ++__victim; 492*38fd1498Szrj 493*38fd1498Szrj for (; __victim != __end; ++__victim) 494*38fd1498Szrj { 495*38fd1498Szrj this->_M_invalidate_if([__victim](_Base_const_iterator __it) 496*38fd1498Szrj { return __it == __victim; }); 497*38fd1498Szrj } 498*38fd1498Szrj 499*38fd1498Szrj __try 500*38fd1498Szrj { 501*38fd1498Szrj _Base::resize(__sz); 502*38fd1498Szrj } 503*38fd1498Szrj __catch(...) 504*38fd1498Szrj { 505*38fd1498Szrj this->_M_revalidate_singular(); 506*38fd1498Szrj __throw_exception_again; 507*38fd1498Szrj } 508*38fd1498Szrj } 509*38fd1498Szrj 510*38fd1498Szrj void 511*38fd1498Szrj resize(size_type __sz, const value_type& __val) 512*38fd1498Szrj { 513*38fd1498Szrj this->_M_detach_singular(); 514*38fd1498Szrj 515*38fd1498Szrj // if __sz < size(), invalidate all iterators in [begin+__sz, end()) 516*38fd1498Szrj _Base_iterator __victim = _Base::begin(); 517*38fd1498Szrj _Base_iterator __end = _Base::end(); 518*38fd1498Szrj for (size_type __i = __sz; __victim != __end && __i > 0; --__i) 519*38fd1498Szrj ++__victim; 520*38fd1498Szrj 521*38fd1498Szrj for (; __victim != __end; ++__victim) 522*38fd1498Szrj { 523*38fd1498Szrj this->_M_invalidate_if([__victim](_Base_const_iterator __it) 524*38fd1498Szrj { return __it == __victim; }); 525*38fd1498Szrj } 526*38fd1498Szrj 527*38fd1498Szrj __try 528*38fd1498Szrj { 529*38fd1498Szrj _Base::resize(__sz, __val); 530*38fd1498Szrj } 531*38fd1498Szrj __catch(...) 532*38fd1498Szrj { 533*38fd1498Szrj this->_M_revalidate_singular(); 534*38fd1498Szrj __throw_exception_again; 535*38fd1498Szrj } 536*38fd1498Szrj } 537*38fd1498Szrj 538*38fd1498Szrj void 539*38fd1498Szrj clear() noexcept 540*38fd1498Szrj { 541*38fd1498Szrj _Base::clear(); 542*38fd1498Szrj this->_M_invalidate_all(); 543*38fd1498Szrj } 544*38fd1498Szrj 545*38fd1498Szrj // 23.2.3.5 forward_list operations: 546*38fd1498Szrj void 547*38fd1498Szrj splice_after(const_iterator __pos, forward_list&& __list) 548*38fd1498Szrj { 549*38fd1498Szrj __glibcxx_check_insert_after(__pos); 550*38fd1498Szrj _GLIBCXX_DEBUG_VERIFY(std::__addressof(__list) != this, 551*38fd1498Szrj _M_message(__gnu_debug::__msg_self_splice) 552*38fd1498Szrj ._M_sequence(*this, "this")); 553*38fd1498Szrj _GLIBCXX_DEBUG_VERIFY(__list.get_allocator() == this->get_allocator(), 554*38fd1498Szrj _M_message(__gnu_debug::__msg_splice_alloc) 555*38fd1498Szrj ._M_sequence(*this) 556*38fd1498Szrj ._M_sequence(__list, "__list")); 557*38fd1498Szrj this->_M_transfer_from_if(__list, [&__list](_Base_const_iterator __it) 558*38fd1498Szrj { 559*38fd1498Szrj return __it != __list._M_base().cbefore_begin() 560*38fd1498Szrj && __it != __list._M_base().end(); 561*38fd1498Szrj }); 562*38fd1498Szrj _Base::splice_after(__pos.base(), std::move(__list._M_base())); 563*38fd1498Szrj } 564*38fd1498Szrj 565*38fd1498Szrj void 566*38fd1498Szrj splice_after(const_iterator __pos, forward_list& __list) 567*38fd1498Szrj { splice_after(__pos, std::move(__list)); } 568*38fd1498Szrj 569*38fd1498Szrj void 570*38fd1498Szrj splice_after(const_iterator __pos, forward_list&& __list, 571*38fd1498Szrj const_iterator __i) 572*38fd1498Szrj { 573*38fd1498Szrj __glibcxx_check_insert_after(__pos); 574*38fd1498Szrj _GLIBCXX_DEBUG_VERIFY(__i._M_before_dereferenceable(), 575*38fd1498Szrj _M_message(__gnu_debug::__msg_splice_bad) 576*38fd1498Szrj ._M_iterator(__i, "__i")); 577*38fd1498Szrj _GLIBCXX_DEBUG_VERIFY(__i._M_attached_to(std::__addressof(__list)), 578*38fd1498Szrj _M_message(__gnu_debug::__msg_splice_other) 579*38fd1498Szrj ._M_iterator(__i, "__i") 580*38fd1498Szrj ._M_sequence(__list, "__list")); 581*38fd1498Szrj _GLIBCXX_DEBUG_VERIFY(__list.get_allocator() == this->get_allocator(), 582*38fd1498Szrj _M_message(__gnu_debug::__msg_splice_alloc) 583*38fd1498Szrj ._M_sequence(*this) 584*38fd1498Szrj ._M_sequence(__list, "__list")); 585*38fd1498Szrj 586*38fd1498Szrj // _GLIBCXX_RESOLVE_LIB_DEFECTS 587*38fd1498Szrj // 250. splicing invalidates iterators 588*38fd1498Szrj _Base_const_iterator __next = std::next(__i.base()); 589*38fd1498Szrj this->_M_transfer_from_if(__list, [__next](_Base_const_iterator __it) 590*38fd1498Szrj { return __it == __next; }); 591*38fd1498Szrj _Base::splice_after(__pos.base(), std::move(__list._M_base()), 592*38fd1498Szrj __i.base()); 593*38fd1498Szrj } 594*38fd1498Szrj 595*38fd1498Szrj void 596*38fd1498Szrj splice_after(const_iterator __pos, forward_list& __list, 597*38fd1498Szrj const_iterator __i) 598*38fd1498Szrj { splice_after(__pos, std::move(__list), __i); } 599*38fd1498Szrj 600*38fd1498Szrj void 601*38fd1498Szrj splice_after(const_iterator __pos, forward_list&& __list, 602*38fd1498Szrj const_iterator __before, const_iterator __last) 603*38fd1498Szrj { 604*38fd1498Szrj typename __gnu_debug::_Distance_traits<const_iterator>::__type __dist; 605*38fd1498Szrj auto __listptr = std::__addressof(__list); 606*38fd1498Szrj __glibcxx_check_insert_after(__pos); 607*38fd1498Szrj __glibcxx_check_valid_fl_range(__before, __last, __dist); 608*38fd1498Szrj _GLIBCXX_DEBUG_VERIFY(__before._M_attached_to(__listptr), 609*38fd1498Szrj _M_message(__gnu_debug::__msg_splice_other) 610*38fd1498Szrj ._M_sequence(__list, "list") 611*38fd1498Szrj ._M_iterator(__before, "before")); 612*38fd1498Szrj _GLIBCXX_DEBUG_VERIFY(__before._M_dereferenceable() 613*38fd1498Szrj || __before._M_is_before_begin(), 614*38fd1498Szrj _M_message(__gnu_debug::__msg_valid_range2) 615*38fd1498Szrj ._M_sequence(__list, "list") 616*38fd1498Szrj ._M_iterator(__before, "before") 617*38fd1498Szrj ._M_iterator(__last, "last")); 618*38fd1498Szrj _GLIBCXX_DEBUG_VERIFY(__before != __last, 619*38fd1498Szrj _M_message(__gnu_debug::__msg_valid_range2) 620*38fd1498Szrj ._M_sequence(__list, "list") 621*38fd1498Szrj ._M_iterator(__before, "before") 622*38fd1498Szrj ._M_iterator(__last, "last")); 623*38fd1498Szrj _GLIBCXX_DEBUG_VERIFY(__list.get_allocator() == this->get_allocator(), 624*38fd1498Szrj _M_message(__gnu_debug::__msg_splice_alloc) 625*38fd1498Szrj ._M_sequence(*this) 626*38fd1498Szrj ._M_sequence(__list, "__list")); 627*38fd1498Szrj 628*38fd1498Szrj for (_Base_const_iterator __tmp = std::next(__before.base()); 629*38fd1498Szrj __tmp != __last.base(); ++__tmp) 630*38fd1498Szrj { 631*38fd1498Szrj _GLIBCXX_DEBUG_VERIFY(__tmp != __list._M_base().end(), 632*38fd1498Szrj _M_message(__gnu_debug::__msg_valid_range2) 633*38fd1498Szrj ._M_sequence(__list, "list") 634*38fd1498Szrj ._M_iterator(__before, "before") 635*38fd1498Szrj ._M_iterator(__last, "last")); 636*38fd1498Szrj _GLIBCXX_DEBUG_VERIFY(__listptr != this || __tmp != __pos.base(), 637*38fd1498Szrj _M_message(__gnu_debug::__msg_splice_overlap) 638*38fd1498Szrj ._M_iterator(__tmp, "position") 639*38fd1498Szrj ._M_iterator(__before, "before") 640*38fd1498Szrj ._M_iterator(__last, "last")); 641*38fd1498Szrj // _GLIBCXX_RESOLVE_LIB_DEFECTS 642*38fd1498Szrj // 250. splicing invalidates iterators 643*38fd1498Szrj this->_M_transfer_from_if(__list, [__tmp](_Base_const_iterator __it) 644*38fd1498Szrj { return __it == __tmp; }); 645*38fd1498Szrj } 646*38fd1498Szrj 647*38fd1498Szrj _Base::splice_after(__pos.base(), std::move(__list._M_base()), 648*38fd1498Szrj __before.base(), __last.base()); 649*38fd1498Szrj } 650*38fd1498Szrj 651*38fd1498Szrj void 652*38fd1498Szrj splice_after(const_iterator __pos, forward_list& __list, 653*38fd1498Szrj const_iterator __before, const_iterator __last) 654*38fd1498Szrj { splice_after(__pos, std::move(__list), __before, __last); } 655*38fd1498Szrj 656*38fd1498Szrj void 657*38fd1498Szrj remove(const _Tp& __val) 658*38fd1498Szrj { 659*38fd1498Szrj _Base_iterator __x = _Base::before_begin(); 660*38fd1498Szrj _Base_iterator __old = __x++; 661*38fd1498Szrj while (__x != _Base::end()) 662*38fd1498Szrj { 663*38fd1498Szrj if (*__x == __val) 664*38fd1498Szrj __x = _M_erase_after(__old); 665*38fd1498Szrj else 666*38fd1498Szrj __old = __x++; 667*38fd1498Szrj } 668*38fd1498Szrj } 669*38fd1498Szrj 670*38fd1498Szrj template<typename _Pred> 671*38fd1498Szrj void 672*38fd1498Szrj remove_if(_Pred __pred) 673*38fd1498Szrj { 674*38fd1498Szrj _Base_iterator __x = _Base::before_begin(); 675*38fd1498Szrj _Base_iterator __old = __x++; 676*38fd1498Szrj while (__x != _Base::end()) 677*38fd1498Szrj { 678*38fd1498Szrj if (__pred(*__x)) 679*38fd1498Szrj __x = _M_erase_after(__old); 680*38fd1498Szrj else 681*38fd1498Szrj __old = __x++; 682*38fd1498Szrj } 683*38fd1498Szrj } 684*38fd1498Szrj 685*38fd1498Szrj void 686*38fd1498Szrj unique() 687*38fd1498Szrj { 688*38fd1498Szrj _Base_iterator __first = _Base::begin(); 689*38fd1498Szrj _Base_iterator __last = _Base::end(); 690*38fd1498Szrj if (__first == __last) 691*38fd1498Szrj return; 692*38fd1498Szrj _Base_iterator __next = std::next(__first); 693*38fd1498Szrj while (__next != __last) 694*38fd1498Szrj { 695*38fd1498Szrj if (*__first == *__next) 696*38fd1498Szrj __next = _M_erase_after(__first); 697*38fd1498Szrj else 698*38fd1498Szrj __first = __next++; 699*38fd1498Szrj } 700*38fd1498Szrj } 701*38fd1498Szrj 702*38fd1498Szrj template<typename _BinPred> 703*38fd1498Szrj void 704*38fd1498Szrj unique(_BinPred __binary_pred) 705*38fd1498Szrj { 706*38fd1498Szrj _Base_iterator __first = _Base::begin(); 707*38fd1498Szrj _Base_iterator __last = _Base::end(); 708*38fd1498Szrj if (__first == __last) 709*38fd1498Szrj return; 710*38fd1498Szrj _Base_iterator __next = std::next(__first); 711*38fd1498Szrj while (__next != __last) 712*38fd1498Szrj { 713*38fd1498Szrj if (__binary_pred(*__first, *__next)) 714*38fd1498Szrj __next = _M_erase_after(__first); 715*38fd1498Szrj else 716*38fd1498Szrj __first = __next++; 717*38fd1498Szrj } 718*38fd1498Szrj } 719*38fd1498Szrj 720*38fd1498Szrj void 721*38fd1498Szrj merge(forward_list&& __list) 722*38fd1498Szrj { 723*38fd1498Szrj if (this != std::__addressof(__list)) 724*38fd1498Szrj { 725*38fd1498Szrj __glibcxx_check_sorted(_Base::begin(), _Base::end()); 726*38fd1498Szrj __glibcxx_check_sorted(__list._M_base().begin(), 727*38fd1498Szrj __list._M_base().end()); 728*38fd1498Szrj this->_M_transfer_from_if(__list, [&__list](_Base_const_iterator __it) 729*38fd1498Szrj { 730*38fd1498Szrj return __it != __list._M_base().cbefore_begin() 731*38fd1498Szrj && __it != __list._M_base().cend(); 732*38fd1498Szrj }); 733*38fd1498Szrj _Base::merge(std::move(__list._M_base())); 734*38fd1498Szrj } 735*38fd1498Szrj } 736*38fd1498Szrj 737*38fd1498Szrj void 738*38fd1498Szrj merge(forward_list& __list) 739*38fd1498Szrj { merge(std::move(__list)); } 740*38fd1498Szrj 741*38fd1498Szrj template<typename _Comp> 742*38fd1498Szrj void 743*38fd1498Szrj merge(forward_list&& __list, _Comp __comp) 744*38fd1498Szrj { 745*38fd1498Szrj if (this != std::__addressof(__list)) 746*38fd1498Szrj { 747*38fd1498Szrj __glibcxx_check_sorted_pred(_Base::begin(), _Base::end(), __comp); 748*38fd1498Szrj __glibcxx_check_sorted_pred(__list._M_base().begin(), 749*38fd1498Szrj __list._M_base().end(), __comp); 750*38fd1498Szrj this->_M_transfer_from_if(__list, 751*38fd1498Szrj [&__list](_Base_const_iterator __it) 752*38fd1498Szrj { 753*38fd1498Szrj return __it != __list._M_base().cbefore_begin() 754*38fd1498Szrj && __it != __list._M_base().cend(); 755*38fd1498Szrj }); 756*38fd1498Szrj _Base::merge(std::move(__list._M_base()), __comp); 757*38fd1498Szrj } 758*38fd1498Szrj } 759*38fd1498Szrj 760*38fd1498Szrj template<typename _Comp> 761*38fd1498Szrj void 762*38fd1498Szrj merge(forward_list& __list, _Comp __comp) 763*38fd1498Szrj { merge(std::move(__list), __comp); } 764*38fd1498Szrj 765*38fd1498Szrj using _Base::sort; 766*38fd1498Szrj using _Base::reverse; 767*38fd1498Szrj 768*38fd1498Szrj _Base& 769*38fd1498Szrj _M_base() noexcept { return *this; } 770*38fd1498Szrj 771*38fd1498Szrj const _Base& 772*38fd1498Szrj _M_base() const noexcept { return *this; } 773*38fd1498Szrj }; 774*38fd1498Szrj 775*38fd1498Szrj#if __cpp_deduction_guides >= 201606 776*38fd1498Szrj template<typename _InputIterator, typename _ValT 777*38fd1498Szrj = typename iterator_traits<_InputIterator>::value_type, 778*38fd1498Szrj typename _Allocator = allocator<_ValT>, 779*38fd1498Szrj typename = _RequireInputIter<_InputIterator>, 780*38fd1498Szrj typename = _RequireAllocator<_Allocator>> 781*38fd1498Szrj forward_list(_InputIterator, _InputIterator, _Allocator = _Allocator()) 782*38fd1498Szrj -> forward_list<_ValT, _Allocator>; 783*38fd1498Szrj#endif 784*38fd1498Szrj 785*38fd1498Szrj template<typename _Tp, typename _Alloc> 786*38fd1498Szrj bool 787*38fd1498Szrj operator==(const forward_list<_Tp, _Alloc>& __lx, 788*38fd1498Szrj const forward_list<_Tp, _Alloc>& __ly) 789*38fd1498Szrj { return __lx._M_base() == __ly._M_base(); } 790*38fd1498Szrj 791*38fd1498Szrj template<typename _Tp, typename _Alloc> 792*38fd1498Szrj inline bool 793*38fd1498Szrj operator<(const forward_list<_Tp, _Alloc>& __lx, 794*38fd1498Szrj const forward_list<_Tp, _Alloc>& __ly) 795*38fd1498Szrj { return __lx._M_base() < __ly._M_base(); } 796*38fd1498Szrj 797*38fd1498Szrj template<typename _Tp, typename _Alloc> 798*38fd1498Szrj inline bool 799*38fd1498Szrj operator!=(const forward_list<_Tp, _Alloc>& __lx, 800*38fd1498Szrj const forward_list<_Tp, _Alloc>& __ly) 801*38fd1498Szrj { return !(__lx == __ly); } 802*38fd1498Szrj 803*38fd1498Szrj /// Based on operator< 804*38fd1498Szrj template<typename _Tp, typename _Alloc> 805*38fd1498Szrj inline bool 806*38fd1498Szrj operator>(const forward_list<_Tp, _Alloc>& __lx, 807*38fd1498Szrj const forward_list<_Tp, _Alloc>& __ly) 808*38fd1498Szrj { return (__ly < __lx); } 809*38fd1498Szrj 810*38fd1498Szrj /// Based on operator< 811*38fd1498Szrj template<typename _Tp, typename _Alloc> 812*38fd1498Szrj inline bool 813*38fd1498Szrj operator>=(const forward_list<_Tp, _Alloc>& __lx, 814*38fd1498Szrj const forward_list<_Tp, _Alloc>& __ly) 815*38fd1498Szrj { return !(__lx < __ly); } 816*38fd1498Szrj 817*38fd1498Szrj /// Based on operator< 818*38fd1498Szrj template<typename _Tp, typename _Alloc> 819*38fd1498Szrj inline bool 820*38fd1498Szrj operator<=(const forward_list<_Tp, _Alloc>& __lx, 821*38fd1498Szrj const forward_list<_Tp, _Alloc>& __ly) 822*38fd1498Szrj { return !(__ly < __lx); } 823*38fd1498Szrj 824*38fd1498Szrj /// See std::forward_list::swap(). 825*38fd1498Szrj template<typename _Tp, typename _Alloc> 826*38fd1498Szrj inline void 827*38fd1498Szrj swap(forward_list<_Tp, _Alloc>& __lx, forward_list<_Tp, _Alloc>& __ly) 828*38fd1498Szrj noexcept(noexcept(__lx.swap(__ly))) 829*38fd1498Szrj { __lx.swap(__ly); } 830*38fd1498Szrj 831*38fd1498Szrj} // namespace __debug 832*38fd1498Szrj} // namespace std 833*38fd1498Szrj 834*38fd1498Szrjnamespace __gnu_debug 835*38fd1498Szrj{ 836*38fd1498Szrj template<typename _Tp, typename _Alloc> 837*38fd1498Szrj struct _BeforeBeginHelper<std::__debug::forward_list<_Tp, _Alloc> > 838*38fd1498Szrj { 839*38fd1498Szrj typedef std::__debug::forward_list<_Tp, _Alloc> _Sequence; 840*38fd1498Szrj 841*38fd1498Szrj template<typename _Iterator> 842*38fd1498Szrj static bool 843*38fd1498Szrj _S_Is(const _Safe_iterator<_Iterator, _Sequence>& __it) 844*38fd1498Szrj { 845*38fd1498Szrj return 846*38fd1498Szrj __it.base() == __it._M_get_sequence()->_M_base().before_begin(); 847*38fd1498Szrj } 848*38fd1498Szrj 849*38fd1498Szrj template<typename _Iterator> 850*38fd1498Szrj static bool 851*38fd1498Szrj _S_Is_Beginnest(const _Safe_iterator<_Iterator, _Sequence>& __it) 852*38fd1498Szrj { return _S_Is(__it); } 853*38fd1498Szrj }; 854*38fd1498Szrj 855*38fd1498Szrj template<typename _Tp, typename _Alloc> 856*38fd1498Szrj struct _Sequence_traits<std::__debug::forward_list<_Tp, _Alloc> > 857*38fd1498Szrj { 858*38fd1498Szrj typedef typename std::__debug::forward_list<_Tp, _Alloc>::iterator _It; 859*38fd1498Szrj 860*38fd1498Szrj static typename _Distance_traits<_It>::__type 861*38fd1498Szrj _S_size(const std::__debug::forward_list<_Tp, _Alloc>& __seq) 862*38fd1498Szrj { 863*38fd1498Szrj return __seq.empty() 864*38fd1498Szrj ? std::make_pair(0, __dp_exact) : std::make_pair(1, __dp_equality); 865*38fd1498Szrj } 866*38fd1498Szrj }; 867*38fd1498Szrj 868*38fd1498Szrj#ifndef _GLIBCXX_DEBUG_PEDANTIC 869*38fd1498Szrj template<class _Tp, class _Alloc> 870*38fd1498Szrj struct _Insert_range_from_self_is_safe< 871*38fd1498Szrj std::__debug::forward_list<_Tp, _Alloc> > 872*38fd1498Szrj { enum { __value = 1 }; }; 873*38fd1498Szrj#endif 874*38fd1498Szrj} 875*38fd1498Szrj 876*38fd1498Szrj#endif 877