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 ) 40 template <class _Tp, class _Sequence = deque<_Tp> > 41 #elif defined ( _STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS ) 42 # define _STLP_STACK_ARGS _Tp 43 template <class _Tp> 44 #else 45 template <class _Tp, class _Sequence> 46 #endif 47 class 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 63 public: 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; 70 protected: 71 //c is a Standard name (23.2.3.3), do no make it STLport naming convention compliant. 72 _Sequence c; 73 public: 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 105 template < _STLP_STACK_HEADER_ARGS > 106 inline 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 110 template < _STLP_STACK_HEADER_ARGS > 111 inline 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) 121 template <class _Tp, class _Sequence> 122 struct __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