30#ifndef _STLP_INTERNAL_DEQUE_H
31#define _STLP_INTERNAL_DEQUE_H
33#ifndef _STLP_INTERNAL_ALGOBASE_H
37#ifndef _STLP_INTERNAL_ALLOC_H
41#ifndef _STLP_INTERNAL_ITERATOR_H
45#ifndef _STLP_INTERNAL_UNINITIALIZED_H
49#ifndef _STLP_RANGE_ERRORS_H
88 return (
sizeof(_Tp) < blocksize ? (blocksize /
sizeof(_Tp)) : 1);
107 : _M_cur(__x), _M_first(*__y),
113#if defined (_STLP_MSVC) && (_STLP_MSVC <= 1401) && defined (MIPS) && defined (NDEBUG)
115 : _M_cur(__other._M_cur), _M_first(__other._M_first),
116 _M_last(__other._M_last), _M_node(__other._M_node) {}
125 if (++_M_cur == _M_last) {
132 if (_M_cur == _M_first) {
146 __offset > 0 ? __offset / buffersize
161template <
class _Tp,
class _Traits>
224template <
class _Tp,
class _Traits>
230#if defined (_STLP_USE_SEPARATE_RELOPS_NAMESPACE)
260{
return !(__x < __y); }
265{
return !(__y < __x); }
269template <
class _Tp,
class _Traits1,
class _Traits2>
275template <
class _Tp,
class _Traits1,
class _Traits2>
299{
return !(__x < __y); }
305{
return !(__y < __x); }
308#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
310template <
class _Tp,
class _Traits>
321#if defined (_STLP_USE_OLD_HP_ITERATOR_QUERIES)
323template <
class _Tp,
class _Traits>
inline _Tp*
_STLP_CALL
339template <
class _Tp,
class _Alloc>
365#if !defined (_STLP_NO_MOVE_SEMANTIC)
371 src.get()._M_map_size._M_data = 0;
372 src.get()._M_finish =
src.get()._M_start;
391#if defined (_STLP_USE_PTR_SPECIALIZATIONS)
392# define deque _STLP_PTR_IMPL_NAME(deque)
393#elif defined (_STLP_DEBUG)
394# define deque _STLP_NON_DBG_NAME(deque)
399template <
class _Tp, _STLP_DFL_TMPL_PARAM(_Alloc, allocator<_Tp>) >
401#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (deque)
427#if defined (_STLP_NO_MOVE_SEMANTIC)
440 {
return const_reverse_iterator(this->_M_finish); }
441 const_reverse_iterator
rend()
const
442 {
return const_reverse_iterator(this->_M_start); }
473 bool empty()
const {
return this->_M_finish == this->_M_start; }
477#if !defined (_STLP_DONT_SUP_DFLT_PARAM)
490#if !defined (_STLP_DONT_SUP_DFLT_PARAM)
515#if defined (_STLP_MEMBER_TEMPLATES)
517 template <
class _Integer>
518 void _M_initialize_dispatch(_Integer
__n, _Integer __x,
const __true_type&) {
519 this->_M_initialize_map(
__n);
523 template <
class _InputIter>
524 void _M_initialize_dispatch(_InputIter __first, _InputIter
__last,
531 template <
class _InputIterator>
532 deque(_InputIterator __first, _InputIterator
__last,
536 _M_initialize_dispatch(__first,
__last, _Integral());
539# if defined (_STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS)
540 template <
class _InputIterator>
541 deque(_InputIterator __first, _InputIterator
__last)
544 _M_initialize_dispatch(__first,
__last, _Integral());
560#if !defined (_STLP_NO_MOVE_SEMANTIC)
567 { _STLP_STD::_Destroy_Range(this->_M_start, this->_M_finish); }
572 _STLP_STD::swap(this->_M_start, __x._M_start);
573 _STLP_STD::swap(this->_M_finish, __x._M_finish);
574 this->_M_map.swap(__x._M_map);
575 this->_M_map_size.swap(__x._M_map_size);
577#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
578 void _M_swap_workaround(
_Self& __x) {
swap(__x); }
602#if defined (_STLP_MEMBER_TEMPLATES)
603 template <
class _InputIterator>
604 void assign(_InputIterator __first, _InputIterator
__last) {
606 _M_assign_dispatch(__first,
__last, _Integral());
611 template <
class _Integer>
612 void _M_assign_dispatch(_Integer
__n, _Integer
__val,
616 template <
class _InputIterator>
617 void _M_assign_dispatch(_InputIterator __first, _InputIterator
__last,
622 template <
class _InputIter>
625 for ( ; __first !=
__last && __cur !=
end(); ++__cur, ++__first)
633 template <
class _ForwardIterator>
634 void _M_assign_aux(_ForwardIterator __first, _ForwardIterator
__last,
640 if (__len > __size) {
642 _STLP_STD::copy(__first, __mid,
begin());
653 if (__len >
size()) {
654 _ForwardIterator __mid = __first;
655 _STLP_STD::advance(__mid,
size());
656 _STLP_STD::copy(__first, __mid,
begin());
667#if !defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
672 if (this->_M_finish._M_cur != this->_M_finish._M_last - 1) {
674 ++this->_M_finish._M_cur;
679#if !defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
684 if (this->_M_start._M_cur != this->_M_start._M_first) {
686 --this->_M_start._M_cur;
692#if defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
694 if (this->_M_finish._M_cur != this->_M_finish._M_last - 1) {
695 _STLP_STD::_Construct(this->_M_finish._M_cur);
696 ++this->_M_finish._M_cur;
702 if (this->_M_start._M_cur != this->_M_start._M_first) {
703 _STLP_STD::_Construct(this->_M_start._M_cur - 1);
704 --this->_M_start._M_cur;
712 if (this->_M_finish._M_cur != this->_M_finish._M_first) {
713 --this->_M_finish._M_cur;
714 _STLP_STD::_Destroy(this->_M_finish._M_cur);
718 _STLP_STD::_Destroy(this->_M_finish._M_cur);
723 _STLP_STD::_Destroy(this->_M_start._M_cur);
729#if !defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
734#if !defined (_STLP_NO_MOVE_SEMANTIC)
737 if (__pos._M_cur == this->_M_start._M_cur) {
739 return this->_M_start;
741 else if (__pos._M_cur == this->_M_finish._M_cur) {
752#if defined(_STLP_DONT_SUP_DFLT_PARAM) && !defined(_STLP_NO_ANACHRONISMS)
766#if defined (_STLP_MEMBER_TEMPLATES)
767 template <
class _Integer>
768 void _M_insert_dispatch(
iterator __pos, _Integer
__n, _Integer __x,
773 template <
class _InputIterator>
774 void _M_insert_dispatch(
iterator __pos,
775 _InputIterator __first, _InputIterator
__last,
782 template <
class _InputIterator>
785 _M_insert_dispatch(__pos, __first,
__last, _Integral());
810#if !defined(_STLP_DONT_SUP_DFLT_PARAM)
817 if (__new_size < __len)
818 erase(this->_M_start + __new_size, this->_M_finish);
820 insert(this->_M_finish, __new_size - __len, __x);
823#if defined (_STLP_DONT_SUP_DFLT_PARAM)
836#if !defined (_STLP_NO_MOVE_SEMANTIC)
842#if !defined (_STLP_NO_MOVE_SEMANTIC)
845 if (__first == this->_M_start &&
__last == this->_M_finish) {
847 return this->_M_finish;
863#if defined (_STLP_MEMBER_TEMPLATES)
864 template <
class _InputIterator>
865 void _M_range_initialize(_InputIterator __first, _InputIterator
__last,
867 this->_M_initialize_map(0);
869 for ( ; __first !=
__last; ++__first)
874 template <
class _ForwardIterator>
875 void _M_range_initialize(_ForwardIterator __first, _ForwardIterator
__last,
878 this->_M_initialize_map(
__n);
881 for (; __cur_node < this->_M_finish._M_node; ++__cur_node) {
882 _ForwardIterator __mid = __first;
884 _STLP_STD::uninitialized_copy(__first, __mid, *__cur_node);
887 _STLP_STD::uninitialized_copy(__first,
__last, this->_M_finish._M_first);
897#if defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
898 void _M_push_back_aux();
899 void _M_push_front_aux();
906#if defined (_STLP_MEMBER_TEMPLATES)
908 template <
class _InputIterator>
910 _InputIterator __first,
916 template <
class _ForwardIterator>
918 _ForwardIterator __first, _ForwardIterator
__last,
920#if !defined (_STLP_NO_MOVE_SEMANTIC)
924 if (__pos._M_cur == this->_M_start._M_cur) {
928 this->_M_start = __new_start;
930 _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
932 else if (__pos._M_cur == this->_M_finish._M_cur) {
936 this->_M_finish = __new_finish;
938 _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1))
944 template <
class _ForwardIterator>
946 _ForwardIterator __first, _ForwardIterator
__last,
952 __pos = this->_M_start + __elemsbefore;
956 for (; __src != __pos; ++__dst, ++__src) {
957 _STLP_STD::_Move_Construct(&(*__dst), *__src);
958 _STLP_STD::_Destroy_Moved(&(*__src));
960 this->_M_start = __new_start;
963 _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
968 __pos = this->_M_finish - __elemsafter;
972 for (--__src, --__dst; __src >= __pos; --__src, --__dst) {
973 _STLP_STD::_Move_Construct(&(*__dst), *__src);
974 _STLP_STD::_Destroy_Moved(&(*__src));
976 this->_M_finish = __new_finish;
979 _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1))
983 template <
class _ForwardIterator>
985 _ForwardIterator __first, _ForwardIterator
__last,
991 iterator __old_start = this->_M_start;
992 __pos = this->_M_start + __elemsbefore;
996 _STLP_STD::uninitialized_copy(this->_M_start, __start_n, __new_start);
997 this->_M_start = __new_start;
998 _STLP_STD::copy(__start_n, __pos, __old_start);
1002 _ForwardIterator __mid = __first;
1005 this->_M_start = __new_start;
1006 _STLP_STD::copy(__mid,
__last, __old_start);
1009 _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node))
1013 iterator __old_finish = this->_M_finish;
1015 __pos = this->_M_finish - __elemsafter;
1019 _STLP_STD::uninitialized_copy(__finish_n, this->_M_finish, this->_M_finish);
1020 this->_M_finish = __new_finish;
1021 _STLP_STD::copy_backward(__pos, __finish_n, __old_finish);
1022 _STLP_STD::copy(__first,
__last, __pos);
1025 _ForwardIterator __mid = __first;
1026 _STLP_STD::advance(__mid, __elemsafter);
1028 this->_M_finish = __new_finish;
1029 _STLP_STD::copy(__first, __mid, __pos);
1032 _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1))
1038 size_type __vacancies = this->_M_start._M_cur - this->_M_start._M_first;
1039 if (
__n > __vacancies)
1045 size_type __vacancies = (this->_M_finish._M_last - this->_M_finish._M_cur) - 1;
1046 if (
__n > __vacancies)
1061 if (__nodes_to_add + 1 > this->_M_map_size._M_data - (this->_M_finish._M_node - this->_M_map._M_data))
1066 if (__nodes_to_add >
size_type(this->_M_start._M_node - this->_M_map._M_data))
1080#if !defined (_STLP_LINK_TIME_INSTANTIATION)
1084#if defined (_STLP_USE_PTR_SPECIALIZATIONS)
1088#if defined (_STLP_DEBUG)
1094#define _STLP_TEMPLATE_CONTAINER deque<_Tp, _Alloc>
1095#define _STLP_TEMPLATE_HEADER template <class _Tp, class _Alloc>
1097#undef _STLP_TEMPLATE_CONTAINER
1098#undef _STLP_TEMPLATE_HEADER
1100#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) && !defined (_STLP_NO_MOVE_SEMANTIC)
1101template <
class _Tp,
class _Alloc>
#define random_access_iterator_tag
#define _Deque_iterator_base
_STLP_INLINE_LOOP _InputIter __last
_STLP_INLINE_LOOP _InputIter const _Tp & __val
#define _STLP_CONVERT_ALLOCATOR(__a, _Tp)
#define _STLP_FORCE_ALLOCATORS(a, y)
void _Copy_Construct(_Tp *__p, const _Tp &__val)
#define _STLP_DEFAULT_CONSTRUCTED(_TTp)
bool _STLP_CALL operator<(const _Deque_iterator< _Tp, _Traits1 > &__x, const _Deque_iterator< _Tp, _Traits2 > &__y)
bool _STLP_CALL operator>(const _Deque_iterator< _Tp, _Nonconst_traits< _Tp > > &__x, const _Deque_iterator< _Tp, _Const_traits< _Tp > > &__y)
bool _STLP_CALL operator==(const _Deque_iterator< _Tp, _Traits1 > &__x, const _Deque_iterator< _Tp, _Traits2 > &__y)
bool _STLP_CALL operator<=(const _Deque_iterator< _Tp, _Nonconst_traits< _Tp > > &__x, const _Deque_iterator< _Tp, _Const_traits< _Tp > > &__y)
_Deque_iterator< _Tp, _Traits > _STLP_CALL operator+(ptrdiff_t __n, const _Deque_iterator< _Tp, _Traits > &__x)
bool _STLP_CALL operator!=(const _Deque_iterator< _Tp, _Nonconst_traits< _Tp > > &__x, const _Deque_iterator< _Tp, _Const_traits< _Tp > > &__y)
bool _STLP_CALL operator>=(const _Deque_iterator< _Tp, _Nonconst_traits< _Tp > > &__x, const _Deque_iterator< _Tp, _Const_traits< _Tp > > &__y)
insert_iterator< _Container > _STLP_CALL inserter(_Container &__x, _Iterator __i)
#define _STLP_ITERATOR_CATEGORY(_It, _Tp)
#define _STLP_DEFINE_ARROW_OPERATOR
_STLP_THROW_FUNCT_SPEC _STLP_CALL __stl_throw_out_of_range(const char *__msg)
_STLP_BEGIN_NAMESPACE _STLP_MOVE_TO_PRIV_NAMESPACE _OutputIter __ucopy(_InputIter __first, _InputIter __last, _OutputIter __result, _Distance *)
_STLP_MOVE_TO_STD_NAMESPACE _ForwardIter uninitialized_copy(_InputIter __first, _InputIter __last, _ForwardIter __result)
_STLP_MOVE_TO_PRIV_NAMESPACE _ForwardIter __uninitialized_copy_copy(_InputIter1 __first1, _InputIter1 __last1, _InputIter2 __first2, _InputIter2 __last2, _ForwardIter __result)
void get(int argc, const char *argv[])
void _M_initialize_map(size_t)
void _M_create_nodes(_Tp **__nstart, _Tp **__nfinish)
_Deque_base(const allocator_type &__a, size_t __num_elements)
_Alloc_traits< _Tp *, _Alloc >::allocator_type _Map_alloc_type
_Deque_base(const allocator_type &__a)
void _M_destroy_nodes(_Tp **__nstart, _Tp **__nfinish)
_Deque_base< _Tp, _Alloc > _Self
_Deque_base(__move_source< _Self > src)
static size_t _STLP_CALL buffer_size()
const_iterator end() const
void _M_range_check(size_type __n) const
const_reference back() const
iterator erase(iterator __pos)
iterator insert(iterator __pos, const value_type &__x=_STLP_DEFAULT_CONSTRUCTED(_Tp))
size_type max_size() const
reverse_iterator rbegin()
_Self & operator=(const _Self &__x)
void push_back(const value_type &__t=_STLP_DEFAULT_CONSTRUCTED(_Tp))
deque(const_iterator __first, const_iterator __last, const allocator_type &__a=allocator_type())
void _M_push_back_aux_v(const value_type &)
const_reverse_iterator rend() const
iterator _M_fill_insert_aux(iterator __pos, size_type __n, const value_type &__x, const __true_type &)
void _M_new_elements_at_back(size_type __new_elements)
void push_front(const value_type &__t=_STLP_DEFAULT_CONSTRUCTED(_Tp))
deque(const allocator_type &__a=allocator_type())
_Base::const_iterator const_iterator
const_reverse_iterator rbegin() const
const_reference front() const
deque< _Tp, _Alloc > _Self
iterator erase(iterator __first, iterator __last)
reference operator[](size_type __n)
const_reference operator[](size_type __n) const
deque(__move_source< _Self > src)
_STLP_DECLARE_RANDOM_ACCESS_REVERSE_ITERATORS
void _M_reallocate_map(size_type __nodes_to_add, bool __add_at_front)
void _M_reserve_map_at_front(size_type __nodes_to_add=1)
iterator _M_reserve_elements_at_back(size_type __n)
_Base::allocator_type allocator_type
iterator _M_erase(iterator __pos, const __true_type &)
const value_type & const_reference
void _M_fill_assign(size_type __n, const _Tp &__val)
ptrdiff_t difference_type
_STLP_PRIV _Deque_base< _Tp, _Alloc > _Base
void _M_initialize(size_type __n, const value_type &__val=_STLP_DEFAULT_CONSTRUCTED(_Tp))
const_reference at(size_type __n) const
allocator_type get_allocator() const
void assign(size_type __n, const _Tp &__val)
iterator _M_reserve_elements_at_front(size_type __n)
void _M_fill_initialize(const value_type &__val, const __true_type &)
void _M_reserve_map_at_back(size_type __nodes_to_add=1)
void assign(const value_type *__first, const value_type *__last)
const value_type * const_pointer
const_iterator begin() const
void insert(iterator __pos, size_type __n, const value_type &__x)
void _M_push_front_aux_v(const value_type &)
deque(const value_type *__first, const value_type *__last, const allocator_type &__a=allocator_type())
void assign(const_iterator __first, const_iterator __last)
void _M_new_elements_at_front(size_type __new_elements)
void _M_fill_insert(iterator __pos, size_type __n, const value_type &__x)
deque(size_type __n, const value_type &__val, const allocator_type &__a=allocator_type())
reference at(size_type __n)
void resize(size_type __new_size, const value_type &__x=_STLP_DEFAULT_CONSTRUCTED(_Tp))
void _M_insert_range_aux(iterator __pos, const value_type *__first, const value_type *__last, size_type __n, const __true_type &)
random_access_iterator_tag _Iterator_category
__kernel_ptrdiff_t ptrdiff_t
#define _STLP_UNWIND(action)
#define _STLP_MOVE_TO_STD_NAMESPACE
#define _STLP_ALLOCATOR_TYPE_DFL
#define _STLP_BEGIN_NAMESPACE
#define _STLP_END_NAMESPACE
#define _STLP_MOVE_TO_PRIV_NAMESPACE
wchar_t const *const size_t const buffer_size
void _M_set_node(_Map_pointer __new_node)
static size_t _S_buffer_size()
_Deque_iterator_base< _Tp > _Self
value_type ** _Map_pointer
_Deque_iterator_base(value_type *__x, _Map_pointer __y)
random_access_iterator_tag iterator_category
difference_type _M_subtract(const _Self &__x) const
ptrdiff_t difference_type
void _M_advance(difference_type __n)
_Deque_iterator(const iterator &__x)
_Self & operator+=(difference_type __n)
_Traits::_ConstTraits _ConstTraits
_Self operator+(difference_type __n) const
_Self operator-(difference_type __n) const
_Traits::reference reference
_STLP_DEFINE_ARROW_OPERATOR difference_type operator-(const const_iterator &__x) const
random_access_iterator_tag iterator_category
_Deque_iterator_base< _Tp > _Base
_Self & operator-=(difference_type __n)
_Traits::_NonConstTraits _NonConstTraits
_Deque_iterator(value_type *__x, _Map_pointer __y)
reference operator*() const
_Deque_iterator< _Tp, _NonConstTraits > iterator
_Deque_iterator< _Tp, _Traits > _Self
ptrdiff_t difference_type
reference operator[](difference_type __n) const
value_type ** _Map_pointer
_Deque_iterator< _Tp, _ConstTraits > const_iterator
__bool2type< pod >::_Ret is_POD_type
__bool2type< trivial_destructor >::_Ret has_trivial_destructor
__bool2type< trivial_constructor >::_Ret has_trivial_default_constructor
__bool2type< trivial_copy >::_Ret has_trivial_copy_constructor
__bool2type< trivial_assign >::_Ret has_trivial_assignment_operator