| // { dg-do compile { target i?86-*-* x86_64-*-* } } |
| // { dg-options "-O3 -mxop" } |
| |
| typedef long unsigned int size_t; |
| typedef unsigned long ulong_t; |
| typedef signed long slong_t; |
| |
| template<typename _Iterator> |
| struct iterator_traits |
| { |
| typedef typename _Iterator::reference reference; |
| }; |
| |
| template<typename _Tp> |
| struct iterator_traits<_Tp*> |
| { |
| typedef _Tp& reference; |
| }; |
| |
| template<typename _Iterator, typename _Container> |
| class __normal_iterator |
| { |
| protected: |
| _Iterator _M_current; |
| typedef iterator_traits<_Iterator> __traits_type; |
| |
| public: |
| typedef typename __traits_type::reference reference; |
| |
| explicit |
| __normal_iterator(const _Iterator& __i) : _M_current(__i) { } |
| |
| reference |
| operator*() const |
| { return *_M_current; } |
| |
| __normal_iterator& |
| operator++() |
| { |
| ++_M_current; |
| return *this; |
| } |
| |
| const _Iterator& |
| base() const |
| { return _M_current; } |
| }; |
| |
| template<typename _Iterator, typename _Container> |
| inline bool |
| operator!=(const __normal_iterator<_Iterator, _Container>& __lhs, |
| const __normal_iterator<_Iterator, _Container>& __rhs) |
| { return __lhs.base() != __rhs.base(); } |
| |
| template<typename _Tp> |
| class allocator |
| { |
| public: |
| typedef _Tp* pointer; |
| typedef _Tp value_type; |
| |
| template<typename _Tp1> |
| struct rebind |
| { typedef allocator<_Tp1> other; }; |
| |
| pointer allocate(size_t __n, const void* = 0) |
| { |
| return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp))); |
| } |
| }; |
| |
| template<typename _Tp, typename _Alloc> |
| struct _Vector_base |
| { |
| typedef typename _Alloc::template rebind<_Tp>::other _Tp_alloc_type; |
| |
| struct _Vector_impl |
| : public _Tp_alloc_type |
| { |
| typename _Tp_alloc_type::pointer _M_start; |
| typename _Tp_alloc_type::pointer _M_finish; |
| typename _Tp_alloc_type::pointer _M_end_of_storage; |
| |
| _Vector_impl(_Tp_alloc_type const& __a) { } |
| }; |
| |
| public: |
| typedef _Alloc allocator_type; |
| |
| _Vector_base(size_t __n, const allocator_type& __a) |
| : _M_impl(__a) |
| { |
| this->_M_impl._M_start = this->_M_allocate(__n); |
| this->_M_impl._M_finish = this->_M_impl._M_start; |
| this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n; |
| } |
| |
| public: |
| _Vector_impl _M_impl; |
| |
| typename _Tp_alloc_type::pointer |
| _M_allocate(size_t __n) |
| { return __n != 0 ? _M_impl.allocate(__n) : 0; } |
| |
| }; |
| |
| template<typename _Tp, typename _Alloc = allocator<_Tp> > |
| class vector : protected _Vector_base<_Tp, _Alloc> |
| { |
| typedef _Vector_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 __normal_iterator<pointer, vector> iterator; |
| typedef _Alloc allocator_type; |
| |
| protected: |
| using _Base::_M_allocate; |
| using _Base::_M_impl; |
| |
| public: |
| |
| explicit |
| vector(size_t __n, const value_type& __value = value_type(), |
| const allocator_type& __a = allocator_type()) |
| : _Base(__n, __a) |
| { _M_fill_initialize(__n, __value); } |
| |
| iterator begin() |
| { return iterator(this->_M_impl._M_start); } |
| |
| iterator end() |
| { return iterator(this->_M_impl._M_finish); } |
| |
| protected: |
| void |
| _M_fill_initialize(size_t __n, const value_type& __value) |
| { |
| this->_M_impl._M_finish = this->_M_impl._M_end_of_storage; |
| } |
| }; |
| |
| template<typename _InputIterator, typename _OutputIterator, typename _Tp> |
| _OutputIterator |
| replace_copy(_InputIterator __first, _InputIterator __last, |
| _OutputIterator __result, |
| const _Tp& __old_value, const _Tp& __new_value) |
| { |
| ; |
| for (; __first != __last; ++__first, ++__result) |
| if (*__first == __old_value) |
| *__result = __new_value; |
| else |
| *__result = *__first; |
| return __result; |
| } |
| |
| extern size_t shape_rank; |
| |
| void createDataspaceIdentifier() |
| { |
| vector< ulong_t > dataspaceDims( shape_rank ); |
| vector< ulong_t > maxDataspaceDims( shape_rank ); |
| |
| replace_copy( |
| dataspaceDims.begin(), dataspaceDims.end(), |
| maxDataspaceDims.begin(), ulong_t( 0 ), ((ulong_t)(slong_t)(-1)) ); |
| } |