You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

867 lines
24 KiB

5 years ago
// -*- C++ -*-
/***************************************************************************
*
* deque - Declaration and definition for the Standard Library deque class
*
* $Id: deque 172106 2011-11-02 17:04:12Z statham $
*
***************************************************************************
*
* Copyright (c) 1994
* Hewlett-Packard Company
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Hewlett-Packard Company makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*
***************************************************************************
*
* Copyright (c) 1994-2001 Rogue Wave Software, Inc. All Rights Reserved.
*
* This computer software is owned by Rogue Wave Software, Inc. and is
* protected by U.S. copyright laws and other laws and by international
* treaties. This computer software is furnished by Rogue Wave Software,
* Inc. pursuant to a written license agreement and may be used, copied,
* transmitted, and stored only in accordance with the terms of such
* license and with the inclusion of the above copyright notice. This
* computer software or any other copies thereof may not be provided or
* otherwise made available to any other person.
*
* U.S. Government Restricted Rights. This computer software is provided
* with Restricted Rights. Use, duplication, or disclosure by the
* Government is subject to restrictions as set forth in subparagraph (c)
* (1) (ii) of The Rights in Technical Data and Computer Software clause
* at DFARS 252.227-7013 or subparagraphs (c) (1) and (2) of the
* Commercial Computer Software--Restricted Rights at 48 CFR 52.227-19,
* as applicable. Manufacturer is Rogue Wave Software, Inc., 5500
* Flatiron Parkway, Boulder, Colorado 80301 USA.
*
**************************************************************************/
#ifndef _RWSTD_DEQUE_INCLUDED
#define _RWSTD_DEQUE_INCLUDED
#include <limits>
#include <memory>
#include <rw/_algobase.h>
#include <rw/_dispatch.h>
#include <rw/_iterator.h>
#include <rw/_defs.h>
#include <rw/_error.h>
_RWSTD_NAMESPACE_BEGIN (std)
template <class _TypeT, class _Allocator>
class deque;
template <class _TypeT, class _DiffT, class _Pointer,
class _Reference, class _Allocator>
class __rw_deque_iter
: public iterator <random_access_iterator_tag, _TypeT, _DiffT,
_Pointer, _Reference>
{
typedef iterator <bidirectional_iterator_tag, _TypeT, _DiffT,
_Pointer, _Reference> _C_iter_base;
public:
typedef _Allocator allocator_type;
typedef _TYPENAME allocator_type::size_type size_type;
typedef _TYPENAME _C_iter_base::value_type value_type;
typedef _TYPENAME _C_iter_base::difference_type difference_type;
typedef _TYPENAME _C_iter_base::pointer pointer;
typedef _TYPENAME _C_iter_base::reference reference;
typedef random_access_iterator_tag iterator_category;
typedef __rw_deque_iter<value_type, difference_type,
value_type*, value_type&, allocator_type>
_C_mutable_iter;
typedef _RWSTD_REBIND (allocator_type, value_type*) _C_map_alloc_type;
typedef _TYPENAME _C_map_alloc_type::pointer _C_map_pointer;
static size_type _C_bufsize () {
// deque only uses __rw_new_capacity to retrieve the minimum
// allocation amount; this may be specialized to provide a
// customized minimum amount
return _RW::__rw_new_capacity(0, (deque<_TypeT, _Allocator>*)0);
}
__rw_deque_iter () { }
// dummy first argument used to easily switch between
// iterators with and without support for debugging
__rw_deque_iter (pointer __x, _C_map_pointer __y)
: _C_current (__x),
_C_first (__y ? *__y : 0),
_C_last (__y ? *__y + _C_bufsize () : 0) ,
_C_node (__y) {
_RWSTD_ASSERT (__x && __y || !__x && !__y);
}
// no copy ctor other than the one below defined; will use
// a compiler generated one if __rw_deque_iter != _C_mutable_iter
__rw_deque_iter (const _C_mutable_iter &__rhs)
: _C_current (__rhs._C_current),
_C_first (__rhs._C_first),
_C_last (__rhs._C_last),
_C_node (__rhs._C_node) { }
__rw_deque_iter& operator++ () {
if (++_C_current == _C_last)
_C_last = (_C_current = _C_first = *++_C_node) + _C_bufsize ();
return *this;
}
__rw_deque_iter& operator-- () {
if (_C_current == _C_first) {
_C_last = (_C_current = (_C_first = *--_C_node) + _C_bufsize ());
}
--_C_current;
return *this;
}
__rw_deque_iter operator++ (int) {
__rw_deque_iter __tmp = *this;
return ++*this, __tmp;
}
__rw_deque_iter operator-- (int) {
__rw_deque_iter __tmp = *this;
return --*this, __tmp;
}
__rw_deque_iter& operator+= (difference_type __n);
__rw_deque_iter& operator-= (difference_type __n) {
return *this += -__n;
}
__rw_deque_iter operator+ (difference_type __n) const {
return __rw_deque_iter (*this) += __n;
}
__rw_deque_iter operator- (difference_type __n) const {
return __rw_deque_iter (*this) -= __n;
}
reference operator* () const {
return *_C_current;
}
_RWSTD_OPERATOR_ARROW (pointer operator-> () const);
reference operator[] (difference_type __n) const {
return *(*this + __n);
}
pointer _C_current;
pointer _C_first;
pointer _C_last;
_C_map_pointer _C_node;
};
template <class _TypeT, class _DiffT, class _Pointer,
class _Reference, class _Allocator>
inline __rw_deque_iter<_TypeT, _DiffT, _Pointer, _Reference, _Allocator>&
__rw_deque_iter<_TypeT, _DiffT, _Pointer, _Reference, _Allocator>::
operator+= (difference_type __n)
{
difference_type __offset = __n + (_C_current - _C_first);
difference_type __jump = __offset >= 0 ? __offset / _C_bufsize ()
: -(difference_type)((-__offset + _C_bufsize () - 1) / _C_bufsize ());
if (!__jump)
_C_current += __n;
else {
_C_first = *(_C_node += __jump);
_C_last = _C_first + _C_bufsize ();
_C_current = _C_first + (__offset - __jump * _C_bufsize ());
}
return *this;
}
// for symmetry
template <class _TypeT, class _DiffT, class _Ptr, class _Ref, class _Alloc>
inline __rw_deque_iter<_TypeT, _DiffT, _Ptr, _Ref, _Alloc>
operator+ (_DiffT __lhs,
const __rw_deque_iter<_TypeT, _DiffT, _Ptr, _Ref, _Alloc> &__rhs)
{
return __rhs + __lhs;
}
#define _RWSTD_DEQUE_ITER(n) \
__rw_deque_iter<_TypeT, _DiffT, _Ptr##n, _Ref##n, _Alloc>
template <class _TypeT, class _DiffT,
class _Ptr1, class _Ref1, class _Ptr2, class _Ref2, class _Alloc>
inline _DiffT
operator- (const _RWSTD_DEQUE_ITER(1) &__x, const _RWSTD_DEQUE_ITER(2) &__y)
{
return __x._C_node == __y._C_node ? __x._C_current - __y._C_current
: _DiffT (__x._C_bufsize () * (__x._C_node - __y._C_node - 1)
+ (__x._C_current - __x._C_first) + (__y._C_last - __y._C_current));
}
template <class _TypeT, class _DiffT,
class _Ptr1, class _Ref1, class _Ptr2, class _Ref2, class _Alloc>
inline bool
operator== (const _RWSTD_DEQUE_ITER(1) &__x, const _RWSTD_DEQUE_ITER(2) &__y)
{
return __x._C_current == __y._C_current
|| ( ( __x._C_current == __x._C_first
|| __y._C_current == __y._C_first)
&& __x - __y == 0);
}
template <class _TypeT, class _DiffT,
class _Ptr1, class _Ref1, class _Ptr2, class _Ref2, class _Alloc>
inline bool
operator< (const _RWSTD_DEQUE_ITER(1) &__x, const _RWSTD_DEQUE_ITER(2) &__y)
{
return __x._C_node == __y._C_node ? (__x._C_current < __y._C_current)
: (__x._C_node < __y._C_node);
}
template <class _TypeT, class _DiffT,
class _Ptr1, class _Ref1, class _Ptr2, class _Ref2, class _Alloc>
inline bool
operator!= (const _RWSTD_DEQUE_ITER(1) &__x, const _RWSTD_DEQUE_ITER(2) &__y)
{
return !(__x == __y);
}
template <class _TypeT, class _DiffT,
class _Ptr1, class _Ref1, class _Ptr2, class _Ref2, class _Alloc>
inline bool
operator<= (const _RWSTD_DEQUE_ITER(1) &__x, const _RWSTD_DEQUE_ITER(2) &__y)
{
return !(__y < __x);
}
template <class _TypeT, class _DiffT,
class _Ptr1, class _Ref1, class _Ptr2, class _Ref2, class _Alloc>
inline bool
operator>= (const _RWSTD_DEQUE_ITER(1) &__x, const _RWSTD_DEQUE_ITER(2) &__y)
{
return !(__x < __y);
}
template <class _TypeT, class _DiffT,
class _Ptr1, class _Ref1, class _Ptr2, class _Ref2, class _Alloc>
inline bool
operator> (const _RWSTD_DEQUE_ITER(1) &__x, const _RWSTD_DEQUE_ITER(2) &__y)
{
return __y < __x;
}
#undef _RWSTD_DEQUE_ITER
template <class _TypeT,
class _Allocator _RWSTD_COMPLEX_DEFAULT (allocator<_TypeT>) >
class deque : private _Allocator
{
public:
typedef _TypeT value_type;
typedef _Allocator allocator_type;
typedef _TYPENAME allocator_type::size_type size_type;
typedef _TYPENAME allocator_type::difference_type difference_type;
typedef _TYPENAME allocator_type::pointer pointer;
typedef _TYPENAME allocator_type::const_pointer const_pointer;
typedef _TYPENAME allocator_type::reference reference;
typedef _TYPENAME allocator_type::const_reference const_reference;
typedef _RWSTD_ALLOC_TYPE (allocator_type, value_type) _C_value_alloc_type;
// following two typedefs are used for convenience with debug iters
typedef __rw_deque_iter<value_type, difference_type, pointer,
reference, allocator_type> _C_deque_iter;
typedef __rw_deque_iter<value_type, difference_type, const_pointer,
const_reference, allocator_type> _C_deque_citer;
typedef _RWSTD_REBIND (allocator_type, value_type*) _C_map_alloc_type;
typedef _TYPENAME _C_map_alloc_type::pointer _C_map_pointer;
#ifndef _RWSTD_NO_DEBUG_ITER
typedef _RW::__rw_debug_iter<deque, _C_deque_iter, _C_deque_iter>
iterator;
typedef _RW::__rw_debug_iter<deque, _C_deque_citer, _C_deque_iter>
const_iterator;
iterator _C_make_iter (const _C_deque_iter& __iter) {
return iterator (*this, __iter);
}
const_iterator _C_make_iter (const _C_deque_citer& __citer) const {
return const_iterator (*this, __citer);
}
#else // if defined (_RWSTD_NO_DEBUG_ITER)
typedef _C_deque_iter iterator;
typedef _C_deque_citer const_iterator;
iterator _C_make_iter (const _C_deque_iter& __iter) {
return __iter;
}
const_iterator _C_make_iter (const _C_deque_citer& __citer) const {
return __citer;
}
#endif // _RWSTD_NO_DEBUG_ITER
static size_type _C_bufsize () {
return _C_deque_iter::_C_bufsize ();
}
#ifndef _RWSTD_NO_CLASS_PARTIAL_SPEC
typedef _STD::reverse_iterator<const_iterator> const_reverse_iterator;
typedef _STD::reverse_iterator<iterator> reverse_iterator;
#else // if defined (_RWSTD_NO_CLASS_PARTIAL_SPEC)
typedef _STD::reverse_iterator<const_iterator,
random_access_iterator_tag, value_type,
const_reference, const_pointer, difference_type> const_reverse_iterator;
typedef _STD::reverse_iterator<iterator,
random_access_iterator_tag, value_type,
reference, pointer, difference_type> reverse_iterator;
#endif // _RWSTD_NO_CLASS_PARTIAL_SPEC
protected:
_C_deque_iter _C_begin;
_C_deque_iter _C_end;
size_type _C_size;
_C_map_pointer _C_map;
size_type _C_map_size;
void _C_init () {
_C_begin =
_C_end = _C_deque_iter (0, 0);
_C_size = 0;
_C_map = 0;
}
void _C_alloc_at_begin ();
void _C_alloc_at_end ();
void _C_free_at_begin ();
void _C_free_at_end ();
void __insert_aux (iterator __pos, size_type __n, const_reference __val);
#ifndef _RWSTD_NO_MEMBER_TEMPLATES
template<class _InputIter>
void __insert_aux (iterator __pos,
_InputIter __first, _InputIter __last,
_RW_is_not_integer) {
__insert_aux2 (__pos, __first, __last);
}
template<class _InputIter>
void __insert_aux (iterator __pos,
_InputIter __first, _InputIter __last,
_RW_is_integer) {
__insert_aux (__pos, (size_type)__first, __last);
}
template<class _InputIter>
void __insert_aux2 (iterator, _InputIter, _InputIter);
template <class _InputIter>
void __insert_interval_dispatch (iterator __pos,
_InputIter __first,
_InputIter __last,
forward_iterator_tag) {
typedef _TYPENAME _RWdispatch<_InputIter>::_RWtype _RWtype;
__insert_aux (__pos, __first, __last, _RWtype ());
}
template <class _InputIter>
void __insert_interval_dispatch (iterator __pos,
_InputIter __first,
_InputIter __last,
input_iterator_tag) {
_RWSTD_ASSERT_RANGE (__pos, end ());
_RWSTD_ASSERT_RANGE (__first, __last);
for ( ; __first != __last; ++__pos, ++__first)
__pos = insert (__pos, *__first);
}
#endif // _RWSTD_NO_MEMBER_TEMPLATES
public:
_EXPLICIT
deque (const allocator_type &__alloc = allocator_type ())
: allocator_type (__alloc), _C_map_size (0) {
_C_init ();
}
_EXPLICIT
deque (size_type __n, const_reference __val = value_type (),
const allocator_type& __alloc = allocator_type ())
: allocator_type (__alloc), _C_map_size (0) {
_C_init ();
insert (begin (), __n, __val);
}
#ifndef _RWSTD_NO_MEMBER_TEMPLATES
template<class _InputIter>
deque (_InputIter __first, _InputIter __last,
const allocator_type& __al = allocator_type ())
: allocator_type (__al), _C_map_size (0) {
_C_init ();
_RWSTD_ASSERT_RANGE (__first, __last);
typedef _TYPENAME _RWdispatch<_InputIter>::_RWtype _RWtype;
__insert_aux (begin (), __first, __last, _RWtype ());
}
#else // if defined (_RWSTD_NO_MEMBER_TEMPLATES)
deque (const_iterator __first, const_iterator __last,
const allocator_type& __alloc = allocator_type ())
: allocator_type (__alloc), _C_map_size (0) {
_C_init ();
_RWSTD_ASSERT_RANGE (__first, __last);
copy (__first, __last, back_inserter (*this));
}
deque (const_pointer __first, const_pointer __last,
const allocator_type& __alloc = allocator_type ())
: allocator_type (__alloc), _C_map_size (0) {
_C_init ();
_RWSTD_ASSERT_RANGE (__first, __last);
copy (__first, __last, back_inserter (*this));
}
#endif // _RWSTD_NO_MEMBER_TEMPLATES
deque (const deque &__x)
: allocator_type (__x.get_allocator ()), _C_map_size (0) {
_C_init ();
copy (__x.begin (), __x.end (), back_inserter (*this));
}
~deque () {
while (!empty ())
pop_front ();
}
deque& operator= (const deque &__x) {
if (this != &__x) {
if (size () >= __x.size ())
erase (copy (__x.begin (), __x.end (), begin ()), end ());
else
copy (__x.begin () + size (), __x.end (),
inserter (*this,
copy (__x.begin (),
__x.begin () + size (), begin ())));
}
return *this;
}
#ifndef _RWSTD_NO_MEMBER_TEMPLATES
template<class _InputIter>
void assign (_InputIter __first, _InputIter __last) {
_RWSTD_ASSERT_RANGE (__first, __last);
clear ();
typedef _TYPENAME _RWdispatch<_InputIter>::_RWtype _RWtype;
__insert_aux (begin (), __first, __last, _RWtype ());
}
void assign (size_type __n, const_reference __t) {
clear ();
insert (begin (), __n, __t);
}
#else // if defined (_RWSTD_NO_MEMBER_TEMPLATES)
void assign (const_iterator __first, const_iterator __last) {
_RWSTD_ASSERT_RANGE (__first, __last);
clear ();
insert (begin (), __first, __last);
}
void assign (const_pointer __first, const_pointer __last) {
clear ();
insert (begin (), __first, __last);
}
void assign (size_type __n, const_reference __x) {
clear ();
insert (begin (), __n, __x);
}
#endif // _RWSTD_NO_MEMBER_TEMPLATES
allocator_type get_allocator () const {
return *this;
}
iterator begin () {
return _C_make_iter (_C_begin);
}
const_iterator begin () const {
return _C_make_iter (_C_begin);
}
iterator end () {
return _C_make_iter(_C_end);
}
const_iterator end () const {
return _C_make_iter (_C_end);
}
reverse_iterator rbegin () {
return reverse_iterator (end ());
}
const_reverse_iterator rbegin () const {
return const_reverse_iterator (end ());
}
reverse_iterator rend () {
return reverse_iterator (begin ());
}
const_reverse_iterator rend () const {
return const_reverse_iterator (begin ());
}
bool empty () const {
return 0 == size ();
}
size_type size () const {
return _C_size;
}
size_type max_size () const {
return _RWSTD_VALUE_ALLOC (_C_value_alloc_type, max_size ());
}
void resize (size_type, value_type);
void resize (size_type __size) {
resize (__size, value_type ());
}
reference operator[] (size_type __n) {
#ifdef _RWSTD_BOUNDS_CHECKING
return at (__n);
#else
return *(begin () + __n);
#endif
}
const_reference operator[] (size_type __n) const {
#ifdef _RWSTD_BOUNDS_CHECKING
return at (__n);
#else
return *(begin () + __n);
#endif
}
const_reference at (size_type __n) const {
return _RWSTD_CONST_CAST (deque*, this)->at (__n);
}
reference at (size_type __n) {
_RWSTD_REQUIRES (__n < size (),
(_RWSTD_ERROR_OUT_OF_RANGE,
_RWSTD_FUNC ("deque::at(size_type)"), __n, size ()));
return *(begin () + __n);
}
reference front () {
_RWSTD_ASSERT (!empty ());
return *begin ();
}
const_reference front () const {
_RWSTD_ASSERT (!empty ());
return *begin ();
}
reference back () {
_RWSTD_ASSERT (!empty ());
return *(end () - 1);
}
const_reference back () const {
_RWSTD_ASSERT (!empty ());
return *(end () - 1);
}
void push_front (const_reference);
void push_back (const_reference);
iterator insert (iterator, const_reference);
#ifndef _RWSTD_NO_MEMBER_TEMPLATES
template <class _InputIter>
void insert (iterator __pos, _InputIter __first, _InputIter __last) {
insert (__pos, __first, __last, _RWSTD_DISPATCH (_InputIter));
}
template <class _InputIter>
void insert (iterator __pos, _InputIter __first, _InputIter __last,
_RWSTD_DISPATCH_INT (false)) {
_RWSTD_ASSERT_RANGE (begin (), __pos);
_RWSTD_ASSERT_RANGE (__first, __last);
__insert_interval_dispatch (__pos, __first, __last,
_RWSTD_ITERATOR_CATEGORY (_InputIter,
__first));
}
void insert (iterator __pos, size_type __n, const_reference __val,
_RWSTD_DISPATCH_INT (true) = 0) {
__insert_aux (__pos, __n, __val);
}
#else // if defined (_RWSTD_NO_MEMBER_TEMPLATES)
void insert (iterator __pos, size_type __n, const_reference __val) {
__insert_aux (__pos, __n, __val);
}
void insert (iterator, const_pointer, const_pointer);
void insert (iterator, const_iterator, const_iterator);
#endif // _RWSTD_NO_MEMBER_TEMPLATES
void pop_front ();
void pop_back ();
iterator erase (iterator);
iterator erase (iterator, iterator);
void swap (deque &);
void clear () {
erase (begin (), end ());
_RWSTD_ASSERT (empty ());
}
};
template <class _TypeT, class _Allocator>
inline void
deque<_TypeT, _Allocator>::push_front (const_reference __val)
{
if ( empty ()
|| _C_begin._C_current == _C_begin._C_first)
_C_alloc_at_begin ();
--_C_begin._C_current;
_RWSTD_VALUE_ALLOC (_C_value_alloc_type,
construct (_C_begin._C_current, __val));
++_C_size;
_RWSTD_ASSERT (!empty ());
}
template <class _TypeT, class _Allocator>
inline void
deque<_TypeT, _Allocator>::push_back (const_reference __val)
{
if ( empty ()
|| _C_end._C_current == _C_end._C_last)
_C_alloc_at_end ();
_RWSTD_VALUE_ALLOC (_C_value_alloc_type,
construct (_C_end._C_current, __val));
++_C_end._C_current;
++_C_size;
_RWSTD_ASSERT (!empty ());
}
template <class _TypeT, class _Allocator>
inline void
deque<_TypeT, _Allocator>::pop_front ()
{
_RWSTD_ASSERT (!empty ());
_C_deque_iter __tmp = _C_begin;
++_C_begin._C_current;
--_C_size;
_RWSTD_VALUE_ALLOC (_C_value_alloc_type,
destroy (__tmp._C_current));
if ( empty ()
|| _C_begin._C_current == _C_begin._C_last)
_C_free_at_begin ();
}
template <class _TypeT, class _Allocator>
inline void
deque<_TypeT, _Allocator>::pop_back ()
{
_RWSTD_ASSERT (!empty ());
--_C_end._C_current;
--_C_size;
_RWSTD_VALUE_ALLOC (_C_value_alloc_type,
destroy (_C_end._C_current));
if ( empty ()
|| _C_end._C_current == _C_end._C_first)
_C_free_at_end ();
}
template <class _TypeT, class _Allocator>
inline void
deque<_TypeT, _Allocator>::swap (deque<_TypeT, _Allocator>& __x)
{
if (get_allocator () == __x.get_allocator ()) {
_STD::swap (_C_begin, __x._C_begin);
_STD::swap (_C_end, __x._C_end);
_STD::swap (_C_size, __x._C_size);
_STD::swap (_C_map, __x._C_map);
_STD::swap (_C_map_size, __x._C_map_size);
}
else {
deque __tmp = *this;
*this = __x;
__x = __tmp;
}
}
template <class _TypeT, class _Allocator>
inline bool
operator== (const deque<_TypeT, _Allocator>& __x,
const deque<_TypeT, _Allocator>& __y)
{
return __x.size () == __y.size ()
&& equal (__x.begin (), __x.end (), __y.begin ());
}
template <class _TypeT, class _Allocator>
inline bool
operator< (const deque<_TypeT, _Allocator>& __x,
const deque<_TypeT, _Allocator>& __y)
{
return lexicographical_compare (__x.begin (), __x.end (),
__y.begin (), __y.end ());
}
template <class _TypeT, class _Allocator>
inline bool
operator!= (const deque<_TypeT, _Allocator>& __x,
const deque<_TypeT, _Allocator>& __y)
{
return !(__x == __y);
}
template <class _TypeT, class _Allocator>
inline bool
operator<= (const deque<_TypeT, _Allocator>& __x,
const deque<_TypeT, _Allocator>& __y)
{
return !(__y < __x);
}
template <class _TypeT, class _Allocator>
inline bool
operator> (const deque<_TypeT, _Allocator>& __x,
const deque<_TypeT, _Allocator>& __y)
{
return __y < __x;
}
template <class _TypeT, class _Allocator>
inline bool
operator>= (const deque<_TypeT, _Allocator>& __x,
const deque<_TypeT, _Allocator>& __y)
{
return !(__x < __y);
}
template <class _TypeT, class _Allocator>
inline void
deque<_TypeT, _Allocator>::resize (size_type __size, value_type __val)
{
if (__size > size ())
insert (end (), __size - size (), __val);
else if (__size < size ())
erase (begin () + __size, end ());
}
_RWSTD_NAMESPACE_END // end
#ifdef _RWSTD_COMPILE_INSTANTIATE
# include <deque.cc>
#endif
#ifndef _RWSTD_NO_STL_SPECIALIZATION
# include "deque_spec.h"
#endif // _RWSTD_NO_STL_SPECIALIZATION
#endif // _RWSTD_DEQUE_INCLUDED