00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef lestes__std___stack_hh___included
00029 #define lestes__std___stack_hh___included
00030
00031 #include <lestes/common.hh>
00032 #include <lestes/std/reflect.hh>
00033 #include <lestes/std/objectize.hh>
00034 #include <lestes/std/data_types.hh>
00035 #include <lestes/std/list.hh>
00036 #include <lestes/std/pair.hh>
00037 #include <lestes/std/lassert.hh>
00038
00039 #include <stack>
00040 #include <iterator>
00041 #include <algorithm>
00042
00043
00044
00045
00046
00047
00048
00049 package(lestes);
00050 package(std);
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064 template <class T, class Container = list<T> >
00065 class stack : public object {
00066 public:
00067 typedef typename Container::value_type value_type;
00068 typedef typename Container::size_type size_type;
00069 typedef Container container_type;
00070 typedef typename Container::const_reverse_iterator const_iterator;
00071 typedef typename Container::reverse_iterator iterator;
00072 typedef typename Container::const_iterator const_reverse_iterator;
00073 typedef typename Container::iterator reverse_iterator;
00074
00075 static ptr < stack < T > > create(ptr < Container > container = Container::create())
00076 { return new stack < T > (container); }
00077 protected:
00078 srp < Container > c;
00079 stack<T, Container >(ptr < Container > container)
00080 : c(container) {}
00081 private:
00082 static ptr < object::reflection_list > reflection;
00083 public:
00084 virtual ptr<object::reflection_list> reflection_get() const;
00085 virtual ptr<object::field_list_list> field_values_get() const;
00086 virtual void gc_mark(void)
00087 { c.gc_mark(); return object::gc_mark(); }
00088
00089 bool empty() const
00090 { return c->empty(); }
00091 size_type size() const
00092 { return c->size(); }
00093 value_type& top()
00094 { lassert(!empty()); return c->back(); }
00095 const value_type& top() const
00096 { lassert(!empty()); return c->back(); }
00097 void push(const value_type& x)
00098 { c->push_back(x); }
00099 void pop()
00100 { lassert(!empty()); c->pop_back(); }
00101
00102 const_iterator begin() const
00103 { return c->rbegin(); }
00104 iterator begin()
00105 { return c->rbegin(); }
00106 const_iterator end() const
00107 { return c->rend(); }
00108 iterator end()
00109 { return c->rend(); }
00110
00111 const_reverse_iterator rbegin() const
00112 { return c->begin(); }
00113 reverse_iterator rbegin()
00114 { return c->begin(); }
00115 const_reverse_iterator rend() const
00116 { return c->end(); }
00117 reverse_iterator rend()
00118 { return c->end(); }
00119 };
00120
00121 template < typename T, typename C >
00122 ptr < object::reflection_list > stack < T, C > :: reflection;
00123
00124 template< typename T, typename C >
00125 ptr<object::reflection_list> stack< T, C >::reflection_get() const
00126 {
00127 if (!reflection) {
00128 typedef class_reflection::field_metadata md;
00129 typedef class_reflection::field_metadata_list mdlist;
00130 ptr<mdlist> mdl = mdlist::create();
00131 mdl->push_back( md::create( "c", "Collection < T >" ) );
00132 reflection = reflection_list::create( object::reflection_get() );
00133 reflection->push_back( class_reflection::create( "stack_of_T", mdl ) );
00134 }
00135 return reflection;
00136 }
00137
00138 template< typename T, typename C >
00139 ptr<object::field_list_list> stack< T, C >::field_values_get() const
00140 {
00141 ptr<field_list_list> result = object::field_values_get();
00142 result->push_back( value_list::create() );
00143 result->back()->push_back( c );
00144 return result;
00145 }
00146
00147 end_package(std);
00148 end_package(lestes);
00149
00150 #endif // lestes__std___stack_hh___included
00151