1/* 2 * 3 * Copyright (c) 1994 4 * Hewlett-Packard Company 5 * 6 * Copyright (c) 1996,1997 7 * Silicon Graphics Computer Systems, Inc. 8 * 9 * Copyright (c) 1997 10 * Moscow Center for SPARC Technology 11 * 12 * Copyright (c) 1999 13 * Boris Fomitchev 14 * 15 * This material is provided "as is", with absolutely no warranty expressed 16 * or implied. Any use is at your own risk. 17 * 18 * Permission to use or copy this software for any purpose is hereby granted 19 * without fee, provided the above notices are retained on all copies. 20 * Permission to modify the code and to distribute modified code is granted, 21 * provided the above notices are retained, and a notice that the code was 22 * modified is included with the above copyright notice. 23 * 24 */ 25 26/* NOTE: This is an internal header file, included by other STL headers. 27 * You should not attempt to use it directly. 28 */ 29 30#ifndef _STLP_INTERNAL_STACK_H 31#define _STLP_INTERNAL_STACK_H 32 33#ifndef _STLP_INTERNAL_DEQUE_H 34# include <stl/_deque.h> 35#endif 36 37_STLP_BEGIN_NAMESPACE 38 39#if !defined ( _STLP_LIMITED_DEFAULT_TEMPLATES ) 40template <class _Tp, class _Sequence = deque<_Tp> > 41#elif defined ( _STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS ) 42# define _STLP_STACK_ARGS _Tp 43template <class _Tp> 44#else 45template <class _Tp, class _Sequence> 46#endif 47class stack 48#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) 49# if defined (_STLP_STACK_ARGS) 50 : public __stlport_class<stack<_Tp> > 51# else 52 : public __stlport_class<stack<_Tp, _Sequence> > 53# endif 54#endif 55{ 56#ifdef _STLP_STACK_ARGS 57 typedef deque<_Tp> _Sequence; 58 typedef stack<_Tp> _Self; 59#else 60 typedef stack<_Tp, _Sequence> _Self; 61#endif 62 63public: 64 typedef typename _Sequence::value_type value_type; 65 typedef typename _Sequence::size_type size_type; 66 typedef _Sequence container_type; 67 68 typedef typename _Sequence::reference reference; 69 typedef typename _Sequence::const_reference const_reference; 70protected: 71 //c is a Standard name (23.2.3.3), do no make it STLport naming convention compliant. 72 _Sequence c; 73public: 74 stack() : c() {} 75 explicit stack(const _Sequence& __s) : c(__s) {} 76 77#if !defined (_STLP_NO_MOVE_SEMANTIC) 78 stack(__move_source<_Self> src) 79 : c(_STLP_PRIV _AsMoveSource(src.get().c)) {} 80#endif 81 82 bool empty() const { return c.empty(); } 83 size_type size() const { return c.size(); } 84 reference top() { return c.back(); } 85 const_reference top() const { return c.back(); } 86 void push(const value_type& __x) { c.push_back(__x); } 87 void pop() { c.pop_back(); } 88 const _Sequence& _Get_s() const { return c; } 89#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER) 90 void _M_swap_workaround(_Self& __x) { 91 _Sequence __tmp = c; 92 c = __x.c; 93 __x.c = __tmp; 94 } 95#endif 96}; 97 98#ifndef _STLP_STACK_ARGS 99# define _STLP_STACK_ARGS _Tp, _Sequence 100# define _STLP_STACK_HEADER_ARGS class _Tp, class _Sequence 101#else 102# define _STLP_STACK_HEADER_ARGS class _Tp 103#endif 104 105template < _STLP_STACK_HEADER_ARGS > 106inline bool _STLP_CALL operator==(const stack< _STLP_STACK_ARGS >& __x, 107 const stack< _STLP_STACK_ARGS >& __y) 108{ return __x._Get_s() == __y._Get_s(); } 109 110template < _STLP_STACK_HEADER_ARGS > 111inline bool _STLP_CALL operator<(const stack< _STLP_STACK_ARGS >& __x, 112 const stack< _STLP_STACK_ARGS >& __y) 113{ return __x._Get_s() < __y._Get_s(); } 114 115_STLP_RELOPS_OPERATORS(template < _STLP_STACK_HEADER_ARGS >, stack< _STLP_STACK_ARGS >) 116 117#undef _STLP_STACK_ARGS 118#undef _STLP_STACK_HEADER_ARGS 119 120#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) && !defined (_STLP_NO_MOVE_SEMANTIC) 121template <class _Tp, class _Sequence> 122struct __move_traits<stack<_Tp, _Sequence> > : 123 _STLP_PRIV __move_traits_aux<_Sequence> 124{}; 125#endif 126 127_STLP_END_NAMESPACE 128 129#endif /* _STLP_INTERNAL_STACK_H */ 130 131// Local Variables: 132// mode:C++ 133// End: 134