| // { dg-do compile } |
| // { dg-options "-fgnu-tm" } |
| |
| typedef long int ptrdiff_t; |
| typedef long unsigned int size_t; |
| namespace std __attribute__ ((__visibility__ ("default"))) |
| { |
| using::ptrdiff_t; |
| using::size_t; |
| } |
| |
| namespace std __attribute__ ((__visibility__ ("default"))) |
| { |
| struct input_iterator_tag |
| { |
| }; |
| struct output_iterator_tag |
| { |
| }; |
| struct forward_iterator_tag:public input_iterator_tag |
| { |
| }; |
| struct bidirectional_iterator_tag:public forward_iterator_tag |
| { |
| }; |
| struct random_access_iterator_tag:public bidirectional_iterator_tag |
| { |
| }; |
| template < typename _Category, typename _Tp, typename _Distance = |
| ptrdiff_t, typename _Pointer = _Tp *, typename _Reference = |
| _Tp & >struct iterator |
| { |
| typedef _Category iterator_category; |
| typedef _Tp value_type; |
| typedef _Distance difference_type; |
| typedef _Pointer pointer; |
| typedef _Reference reference; |
| }; |
| template < typename _Iterator > struct iterator_traits |
| { |
| typedef typename _Iterator::iterator_category iterator_category; |
| typedef typename _Iterator::value_type value_type; |
| typedef typename _Iterator::difference_type difference_type; |
| typedef typename _Iterator::pointer pointer; |
| typedef typename _Iterator::reference reference; |
| }; |
| template < typename _Tp > struct iterator_traits <_Tp * > |
| { |
| typedef random_access_iterator_tag iterator_category; |
| typedef _Tp value_type; |
| typedef ptrdiff_t difference_type; |
| typedef _Tp *pointer; |
| typedef _Tp & reference; |
| }; |
| template < typename _Tp > struct iterator_traits <const _Tp *> |
| { |
| typedef random_access_iterator_tag iterator_category; |
| typedef _Tp value_type; |
| typedef ptrdiff_t difference_type; |
| typedef const _Tp *pointer; |
| typedef const _Tp & reference; |
| }; |
| template < typename _Iter > inline typename iterator_traits < |
| _Iter >::iterator_category __iterator_category (const _Iter &) |
| { |
| return typename iterator_traits < _Iter >::iterator_category (); |
| } |
| } |
| |
| namespace std __attribute__ ((__visibility__ ("default"))) |
| { |
| template < typename _Iterator > class reverse_iterator:public iterator < typename iterator_traits < _Iterator >::iterator_category, |
| typename iterator_traits < _Iterator >::value_type, |
| typename iterator_traits < _Iterator >::difference_type, |
| typename iterator_traits < _Iterator >::pointer, |
| typename iterator_traits < _Iterator >::reference > |
| { |
| protected:_Iterator current; |
| typedef iterator_traits < _Iterator > __traits_type; |
| public:typedef _Iterator iterator_type; |
| typedef typename __traits_type::difference_type difference_type; |
| typedef typename __traits_type::pointer pointer; |
| typedef typename __traits_type::reference reference; |
| reverse_iterator ():current () |
| { |
| } explicit reverse_iterator (iterator_type __x):current (__x) |
| { |
| } reverse_iterator (const reverse_iterator & __x):current (__x.current) |
| { |
| } template < typename _Iter > reverse_iterator (const reverse_iterator < |
| _Iter > |
| &__x):current (__x. |
| base ()) |
| { |
| } iterator_type base () const |
| { |
| return current; |
| } |
| reference operator* () const |
| { |
| _Iterator __tmp = current; |
| return *--__tmp; |
| } |
| pointer operator-> () const |
| { |
| return &(operator* ()); |
| } |
| reverse_iterator & operator++ () |
| { |
| --current; |
| return *this; |
| } |
| reverse_iterator operator++ (int) |
| { |
| reverse_iterator __tmp = *this; |
| --current; |
| return __tmp; |
| } |
| reverse_iterator & operator-- () |
| { |
| ++current; |
| return *this; |
| } |
| reverse_iterator operator-- (int) |
| { |
| reverse_iterator __tmp = *this; |
| ++current; |
| return __tmp; |
| } |
| reverse_iterator operator+ (difference_type __n) const |
| { |
| return reverse_iterator (current - __n); |
| } |
| reverse_iterator & operator+= (difference_type __n) |
| { |
| current -= __n; |
| return *this; |
| } |
| reverse_iterator operator- (difference_type __n) const |
| { |
| return reverse_iterator (current + __n); |
| } |
| reverse_iterator & operator-= (difference_type __n) |
| { |
| current += __n; |
| return *this; |
| } |
| reference operator[] (difference_type __n) const |
| { |
| return *(*this + __n); |
| } |
| }; |
| template < typename _Iterator > |
| inline bool operator== (const reverse_iterator < _Iterator > &__x, |
| const reverse_iterator < _Iterator > &__y) |
| { |
| return __x.base () == __y.base (); |
| } |
| template < typename _Iterator > |
| inline bool operator< (const reverse_iterator < _Iterator > &__x, |
| const reverse_iterator < _Iterator > &__y) |
| { |
| return __y.base () < __x.base (); |
| } |
| template < typename _Iterator > |
| inline bool operator!= (const reverse_iterator < _Iterator > &__x, |
| const reverse_iterator < _Iterator > &__y) |
| { |
| return !(__x == __y); |
| } |
| template < typename _Iterator > |
| inline bool operator> (const reverse_iterator < _Iterator > &__x, |
| const reverse_iterator < _Iterator > &__y) |
| { |
| return __y < __x; |
| } |
| template < typename _Iterator > |
| inline bool operator<= (const reverse_iterator < _Iterator > &__x, |
| const reverse_iterator < _Iterator > &__y) |
| { |
| return !(__y < __x); |
| } |
| template < typename _Iterator > |
| inline bool operator>= (const reverse_iterator < _Iterator > &__x, |
| const reverse_iterator < _Iterator > &__y) |
| { |
| return !(__x < __y); |
| } |
| template < typename _Iterator > inline typename reverse_iterator < |
| _Iterator >::difference_type operator- (const reverse_iterator < |
| _Iterator > &__x, |
| const reverse_iterator < |
| _Iterator > &__y) |
| { |
| return __y.base () - __x.base (); |
| } |
| template < typename _Iterator > inline reverse_iterator < _Iterator > |
| operator+ (typename reverse_iterator < _Iterator >::difference_type __n, |
| const reverse_iterator < _Iterator > &__x) |
| { |
| return reverse_iterator < _Iterator > (__x.base () - __n); |
| } |
| template < typename _IteratorL, |
| typename _IteratorR > inline bool operator== (const reverse_iterator < |
| _IteratorL > &__x, |
| const reverse_iterator < |
| _IteratorR > &__y) |
| { |
| return __x.base () == __y.base (); |
| } |
| template < typename _IteratorL, |
| typename _IteratorR > inline bool operator< (const reverse_iterator < |
| _IteratorL > &__x, |
| const reverse_iterator < |
| _IteratorR > &__y) |
| { |
| return __y.base () < __x.base (); |
| } |
| template < typename _IteratorL, |
| typename _IteratorR > inline bool operator!= (const reverse_iterator < |
| _IteratorL > &__x, |
| const reverse_iterator < |
| _IteratorR > &__y) |
| { |
| return !(__x == __y); |
| } |
| template < typename _IteratorL, |
| typename _IteratorR > inline bool operator> (const reverse_iterator < |
| _IteratorL > &__x, |
| const reverse_iterator < |
| _IteratorR > &__y) |
| { |
| return __y < __x; |
| } |
| template < typename _IteratorL, |
| typename _IteratorR > inline bool operator<= (const reverse_iterator < |
| _IteratorL > &__x, |
| const reverse_iterator < |
| _IteratorR > &__y) |
| { |
| return !(__y < __x); |
| } |
| template < typename _IteratorL, |
| typename _IteratorR > inline bool operator>= (const reverse_iterator < |
| _IteratorL > &__x, |
| const reverse_iterator < |
| _IteratorR > &__y) |
| { |
| return !(__x < __y); |
| } |
| template < typename _IteratorL, |
| typename _IteratorR > inline typename reverse_iterator < |
| _IteratorL >::difference_type operator- (const reverse_iterator < |
| _IteratorL > &__x, |
| const reverse_iterator < |
| _IteratorR > &__y) |
| { |
| return __y.base () - __x.base (); |
| } |
| template < typename _Container > class back_insert_iterator:public iterator < output_iterator_tag, void, void, void, |
| void > |
| { |
| protected:_Container * container; |
| public:typedef _Container container_type; |
| explicit back_insert_iterator (_Container & __x):container (&__x) |
| { |
| } back_insert_iterator & operator= (typename _Container:: |
| const_reference __value) |
| { |
| container->push_back (__value); |
| return *this; |
| } |
| back_insert_iterator & operator* () |
| { |
| return *this; |
| } |
| back_insert_iterator & operator++ () |
| { |
| return *this; |
| } |
| back_insert_iterator operator++ (int) |
| { |
| return *this; |
| } |
| }; |
| template < typename _Container > inline back_insert_iterator < _Container > |
| back_inserter (_Container & __x) |
| { |
| return back_insert_iterator < _Container > (__x); |
| } |
| template < typename _Container > class front_insert_iterator:public iterator < output_iterator_tag, void, void, void, |
| void > |
| { |
| protected:_Container * container; |
| public:typedef _Container container_type; |
| explicit front_insert_iterator (_Container & __x):container (&__x) |
| { |
| } front_insert_iterator & operator= (typename _Container:: |
| const_reference __value) |
| { |
| container->push_front (__value); |
| return *this; |
| } |
| front_insert_iterator & operator* () |
| { |
| return *this; |
| } |
| front_insert_iterator & operator++ () |
| { |
| return *this; |
| } |
| front_insert_iterator operator++ (int) |
| { |
| return *this; |
| } |
| }; |
| template < typename _Container > inline front_insert_iterator < _Container > |
| front_inserter (_Container & __x) |
| { |
| return front_insert_iterator < _Container > (__x); |
| } |
| template < typename _Container > class insert_iterator:public iterator < output_iterator_tag, void, void, void, |
| void > |
| { |
| protected:_Container * container; |
| typename _Container::iterator iter; |
| public:typedef _Container container_type; |
| insert_iterator (_Container & __x, |
| typename _Container::iterator __i):container (&__x), |
| iter (__i) |
| { |
| } insert_iterator & operator= (typename _Container:: |
| const_reference __value) |
| { |
| iter = container->insert (iter, __value); |
| ++iter; |
| return *this; |
| } |
| insert_iterator & operator* () |
| { |
| return *this; |
| } |
| insert_iterator & operator++ () |
| { |
| return *this; |
| } |
| insert_iterator & operator++ (int) |
| { |
| return *this; |
| } |
| }; |
| template < typename _Container, |
| typename _Iterator > inline insert_iterator < _Container > |
| inserter (_Container & __x, _Iterator __i) |
| { |
| return insert_iterator < _Container > (__x, |
| typename _Container:: |
| iterator (__i)); |
| } |
| } |
| |
| namespace __gnu_cxx __attribute__ ((__visibility__ ("default"))) |
| { |
| using std::size_t; |
| using std::ptrdiff_t; |
| template < typename _Tp > class new_allocator |
| { |
| public:typedef size_t size_type; |
| typedef ptrdiff_t difference_type; |
| typedef _Tp *pointer; |
| typedef const _Tp *const_pointer; |
| typedef _Tp & reference; |
| typedef const _Tp & const_reference; |
| typedef _Tp value_type; |
| template < typename _Tp1 > struct rebind |
| { |
| typedef new_allocator < _Tp1 > other; |
| }; |
| new_allocator ()throw () |
| { |
| } new_allocator (const new_allocator &) throw () |
| { |
| } template < typename _Tp1 > new_allocator (const new_allocator < _Tp1 > |
| &) throw () |
| { |
| } ~new_allocator ()throw () |
| { |
| } pointer address (reference __x) const |
| { |
| return &__x; |
| } |
| const_pointer address (const_reference __x) const |
| { |
| return &__x; |
| } |
| pointer allocate (size_type __n, const void * = 0) |
| { |
| return static_cast < _Tp * >(::operator new (__n * sizeof (_Tp))); |
| } |
| void deallocate (pointer __p, size_type) |
| { |
| ::operator delete (__p); |
| } size_type max_size () const throw () |
| { |
| return size_t (-1) / sizeof (_Tp); |
| } |
| void construct (pointer __p, const _Tp & __val) |
| { |
| ::new ((void *) __p) _Tp (__val); |
| } void destroy (pointer __p) |
| { |
| __p->~_Tp (); |
| }}; |
| template < typename _Tp > inline bool operator== (const new_allocator < |
| _Tp > &, |
| const new_allocator < |
| _Tp > &) |
| { |
| return true; |
| } |
| template < typename _Tp > inline bool operator!= (const new_allocator < |
| _Tp > &, |
| const new_allocator < |
| _Tp > &) |
| { |
| return false; |
| } |
| } |
| |
| namespace std __attribute__ ((__visibility__ ("default"))) |
| { |
| template < typename _Tp > class allocator; |
| template <> class allocator < void > |
| { |
| public:typedef size_t size_type; |
| typedef ptrdiff_t difference_type; |
| typedef void *pointer; |
| typedef const void *const_pointer; |
| typedef void value_type; |
| template < typename _Tp1 > struct rebind |
| { |
| typedef allocator < _Tp1 > other; |
| }; |
| }; |
| template < typename _Tp > class allocator:public __gnu_cxx::new_allocator < |
| _Tp > |
| { |
| public:typedef size_t size_type; |
| typedef ptrdiff_t difference_type; |
| typedef _Tp *pointer; |
| typedef const _Tp *const_pointer; |
| typedef _Tp & reference; |
| typedef const _Tp & const_reference; |
| typedef _Tp value_type; |
| template < typename _Tp1 > struct rebind |
| { |
| typedef allocator < _Tp1 > other; |
| }; |
| allocator ()throw () |
| { |
| } allocator (const allocator & __a) throw ():__gnu_cxx::new_allocator < |
| _Tp > (__a) |
| { |
| } template < typename _Tp1 > allocator (const allocator < _Tp1 > |
| &) throw () |
| { |
| } ~allocator ()throw () |
| { |
| }}; |
| template < typename _T1, |
| typename _T2 > inline bool operator== (const allocator < _T1 > &, |
| const allocator < _T2 > &) |
| { |
| return true; |
| } |
| template < typename _Tp > inline bool operator== (const allocator < _Tp > &, |
| const allocator < _Tp > &) |
| { |
| return true; |
| } |
| template < typename _T1, |
| typename _T2 > inline bool operator!= (const allocator < _T1 > &, |
| const allocator < _T2 > &) |
| { |
| return false; |
| } |
| template < typename _Tp > inline bool operator!= (const allocator < _Tp > &, |
| const allocator < _Tp > &) |
| { |
| return false; |
| } |
| template < typename _Alloc, bool = __is_empty (_Alloc) > struct __alloc_swap |
| { |
| static void _S_do_it (_Alloc &, _Alloc &) |
| { |
| }}; |
| template < typename _Alloc > struct __alloc_swap <_Alloc, false > |
| { |
| static void _S_do_it (_Alloc & __one, _Alloc & __two) |
| { |
| if (__one != __two) |
| swap (__one, __two); |
| } |
| }; |
| template < typename _Alloc, bool = __is_empty (_Alloc) > struct __alloc_neq |
| { |
| static bool _S_do_it (const _Alloc &, const _Alloc &) |
| { |
| return false; |
| } |
| }; |
| template < typename _Alloc > struct __alloc_neq <_Alloc, false > |
| { |
| static bool _S_do_it (const _Alloc & __one, const _Alloc & __two) |
| { |
| return __one != __two; |
| } |
| }; |
| } |
| |
| namespace std __attribute__ ((__visibility__ ("default"))) |
| { |
| struct _List_node_base |
| { |
| _List_node_base *_M_next; |
| _List_node_base *_M_prev; |
| static void swap (_List_node_base & __x, _List_node_base & __y) throw (); |
| void _M_transfer (_List_node_base * const __first, |
| _List_node_base * const __last) throw (); |
| void _M_reverse () throw (); |
| void _M_hook (_List_node_base * const __position) throw (); |
| void _M_unhook () throw (); |
| }; |
| template < typename _Tp > struct _List_node:public _List_node_base |
| { |
| _Tp _M_data; |
| }; |
| template < typename _Tp > struct _List_iterator |
| { |
| typedef _List_iterator < _Tp > _Self; |
| typedef _List_node < _Tp > _Node; |
| typedef ptrdiff_t difference_type; |
| typedef std::bidirectional_iterator_tag iterator_category; |
| typedef _Tp value_type; |
| typedef _Tp *pointer; |
| typedef _Tp & reference; |
| _List_iterator ():_M_node () |
| { |
| } explicit _List_iterator (_List_node_base * __x):_M_node (__x) |
| { |
| } reference operator* () const |
| { |
| return static_cast < _Node * >(_M_node)->_M_data; |
| } |
| pointer operator-> () const |
| { |
| return &static_cast < _Node * >(_M_node)->_M_data; |
| } |
| _Self & operator++ () |
| { |
| _M_node = _M_node->_M_next; |
| return *this; |
| } |
| _Self operator++ (int) |
| { |
| _Self __tmp = *this; |
| _M_node = _M_node->_M_next; |
| return __tmp; |
| } |
| _Self & operator-- () |
| { |
| _M_node = _M_node->_M_prev; |
| return *this; |
| } |
| _Self operator-- (int) |
| { |
| _Self __tmp = *this; |
| _M_node = _M_node->_M_prev; |
| return __tmp; |
| } |
| bool operator== (const _Self & __x) const |
| { |
| return _M_node == __x._M_node; |
| } |
| bool operator!= (const _Self & __x) const |
| { |
| return _M_node != __x._M_node; |
| } |
| _List_node_base *_M_node; |
| }; |
| template < typename _Tp > struct _List_const_iterator |
| { |
| typedef _List_const_iterator < _Tp > _Self; |
| typedef const _List_node < _Tp > _Node; |
| typedef _List_iterator < _Tp > iterator; |
| typedef ptrdiff_t difference_type; |
| typedef std::bidirectional_iterator_tag iterator_category; |
| typedef _Tp value_type; |
| typedef const _Tp *pointer; |
| typedef const _Tp & reference; |
| _List_const_iterator ():_M_node () |
| { |
| } explicit _List_const_iterator (const _List_node_base * |
| __x):_M_node (__x) |
| { |
| } _List_const_iterator (const iterator & __x):_M_node (__x._M_node) |
| { |
| } reference operator* () const |
| { |
| return static_cast < _Node * >(_M_node)->_M_data; |
| } |
| pointer operator-> () const |
| { |
| return &static_cast < _Node * >(_M_node)->_M_data; |
| } |
| _Self & operator++ () |
| { |
| _M_node = _M_node->_M_next; |
| return *this; |
| } |
| _Self operator++ (int) |
| { |
| _Self __tmp = *this; |
| _M_node = _M_node->_M_next; |
| return __tmp; |
| } |
| _Self & operator-- () |
| { |
| _M_node = _M_node->_M_prev; |
| return *this; |
| } |
| _Self operator-- (int) |
| { |
| _Self __tmp = *this; |
| _M_node = _M_node->_M_prev; |
| return __tmp; |
| } |
| bool operator== (const _Self & __x) const |
| { |
| return _M_node == __x._M_node; |
| } |
| bool operator!= (const _Self & __x) const |
| { |
| return _M_node != __x._M_node; |
| } |
| const _List_node_base *_M_node; |
| }; |
| template < typename _Tp, typename _Alloc > class _List_base |
| { |
| protected:typedef typename _Alloc::template rebind < _List_node < _Tp > |
| >::other _Node_alloc_type; |
| typedef typename _Alloc::template rebind < _Tp >::other _Tp_alloc_type; |
| struct _List_impl:public _Node_alloc_type |
| { |
| _List_node_base _M_node; |
| _List_impl ():_Node_alloc_type (), _M_node () |
| { |
| } _List_impl (const _Node_alloc_type & __a):_Node_alloc_type (__a), |
| _M_node () |
| { |
| }}; |
| _List_impl _M_impl; |
| _List_node < _Tp > *_M_get_node () |
| { |
| return _M_impl._Node_alloc_type::allocate (1); |
| } |
| void _M_put_node (_List_node < _Tp > *__p) |
| { |
| _M_impl._Node_alloc_type::deallocate (__p, 1); |
| } public:typedef _Alloc allocator_type; |
| _Node_alloc_type & _M_get_Node_allocator () |
| { |
| return *static_cast < _Node_alloc_type * >(&this->_M_impl); |
| } |
| const _Node_alloc_type & _M_get_Node_allocator () const |
| { |
| return *static_cast < const _Node_alloc_type *>(&this->_M_impl); |
| } _Tp_alloc_type _M_get_Tp_allocator () const |
| { |
| return _Tp_alloc_type (_M_get_Node_allocator ()); |
| } |
| allocator_type get_allocator () const |
| { |
| return allocator_type (_M_get_Node_allocator ()); |
| } |
| _List_base ():_M_impl () |
| { |
| _M_init (); |
| } |
| _List_base (const allocator_type & __a):_M_impl (__a) |
| { |
| _M_init (); |
| } ~_List_base () |
| { |
| _M_clear (); |
| } void _M_clear (); |
| void _M_init () |
| { |
| this->_M_impl._M_node._M_next = &this->_M_impl._M_node; |
| this->_M_impl._M_node._M_prev = &this->_M_impl._M_node; |
| }}; |
| template < typename _Tp, typename _Alloc = std::allocator < _Tp > >class list:protected _List_base < _Tp, |
| _Alloc |
| > |
| { |
| typedef typename _Alloc::value_type _Alloc_value_type; |
| typedef _List_base < _Tp, _Alloc > _Base; |
| typedef typename _Base::_Tp_alloc_type _Tp_alloc_type; |
| public:typedef _Tp value_type; |
| typedef typename _Tp_alloc_type::pointer pointer; |
| typedef typename _Tp_alloc_type::const_pointer const_pointer; |
| typedef typename _Tp_alloc_type::reference reference; |
| typedef typename _Tp_alloc_type::const_reference const_reference; |
| typedef _List_iterator < _Tp > iterator; |
| typedef _List_const_iterator < _Tp > const_iterator; |
| typedef std::reverse_iterator < const_iterator > const_reverse_iterator; |
| typedef std::reverse_iterator < iterator > reverse_iterator; |
| typedef size_t size_type; |
| typedef ptrdiff_t difference_type; |
| typedef _Alloc allocator_type; |
| protected:typedef _List_node < _Tp > _Node; |
| using _Base::_M_impl; |
| using _Base::_M_put_node; |
| using _Base::_M_get_node; |
| using _Base::_M_get_Tp_allocator; |
| using _Base::_M_get_Node_allocator; |
| public:iterator begin () |
| { |
| return iterator (this->_M_impl._M_node._M_next); |
| } |
| const_iterator begin () const |
| { |
| return const_iterator (this->_M_impl._M_node._M_next); |
| } |
| iterator end () |
| { |
| return iterator (&this->_M_impl._M_node); |
| } |
| void remove (const _Tp & __value); |
| template < typename _Predicate > void remove_if (_Predicate); |
| void _M_erase (iterator __position) |
| { |
| __position._M_node->_M_unhook (); |
| _Node *__n = static_cast < _Node * >(__position._M_node); |
| _M_get_Tp_allocator ().destroy (&__n->_M_data); |
| _M_put_node (__n); |
| } void _M_check_equal_allocators (list & __x) |
| { |
| if (std::__alloc_neq < |
| typename _Base::_Node_alloc_type >:: |
| _S_do_it (_M_get_Node_allocator (), __x._M_get_Node_allocator ())); |
| } |
| }; |
| } |
| |
| namespace std __attribute__ ((__visibility__ ("default"))) |
| { |
| template < typename _Tp, typename _Alloc > void list < _Tp, |
| _Alloc >::remove (const value_type & __value) |
| { |
| iterator __first = begin (); |
| iterator __last = end (); |
| iterator __extra = __last; |
| while (__first != __last) |
| { |
| iterator __next = __first; |
| ++__next; |
| if (*__first == __value) |
| { |
| if (&*__first != &__value) |
| _M_erase (__first); |
| else |
| __extra = __first; |
| } |
| __first = __next; |
| } |
| if (__extra != __last) |
| _M_erase (__extra); |
| } |
| } |
| |
| class Unit |
| { |
| public:int dummy; |
| }; |
| class Building |
| { |
| public:__attribute__ ((transaction_callable)) void removeUnitFromInside (Unit * |
| unit); |
| std::list < Unit * >unitsInside; |
| }; |
| void |
| Building::removeUnitFromInside (Unit * unit) |
| { |
| unitsInside.remove (unit); |
| } |