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 #ifndef __EDEQUE_H
00027 #define __EDEQUE_H
00028 #else
00029 #error Multiple includes of EDEQUE.H not allowed
00030 #endif
00031
00032 #ifndef __dj_include_assert_h_
00033 #include <assert.h>
00034 #endif
00035
00036
00037
00038
00039 #if 0
00040
00041 template <class T >
00042 class edeque
00043 { public:
00044 edeque();
00045
00046 edeque(edeque<T> const & s);
00047 edeque<T> const & operator=(edeque<T> const & s);
00048 ~edeque();
00049
00050 void push_back(T const & d);
00051 void push_front(T const & d);
00052 void pop_back();
00053 void pop_front();
00054
00055 bool is_empty() const;
00056 int size() const;
00057 T const & operator[](int i) const;
00058 T & operator[](int i);
00059 private:
00060 ...
00061 };
00062 #endif
00063
00064 template <class T>
00065 class edeque
00066 { public:
00067 edeque(): mitem(0), msize(0), mspace(0), mfirst(0) {};
00068
00069 edeque(edeque<T> const & s) { copy(s); };
00070
00071 edeque<T> const & operator=(edeque<T> const & s)
00072 { drop(); copy(s); return s; };
00073
00074 ~edeque() { drop(); };
00075
00076 void push_back(T const & d)
00077 { if (msize==mspace) realloc((mspace==0)?1:(mspace<<1));
00078 mitem[adjidx(msize)]=d;
00079 msize++;
00080 };
00081
00082 void push_front(T const & d)
00083 { if (msize==mspace) realloc((mspace==0)?1:(mspace<<1));
00084 mfirst=adjidx(-1);
00085 mitem[mfirst]=d;
00086 msize++;
00087 };
00088
00089 void pop_back()
00090 { assert(!is_empty());
00091 msize--;
00092 if ((msize>>1) == mspace) realloc(mspace>>1);
00093 };
00094
00095 void pop_front()
00096 { assert(!is_empty());
00097 mfirst=adjidx(1);
00098 msize--;
00099 if ((msize>>1) == mspace) realloc(mspace>>1);
00100 };
00101
00102 bool is_empty() const { return msize == 0; };
00103
00104 int size() const { return msize; };
00105
00106 T const & operator[](int i) const
00107 { assert(i>=0);
00108 assert(i<msize);
00109 int k=adjidx(i);
00110 assert(k>=0);
00111 assert(k<mspace);
00112 return mitem[k];
00113 };
00114
00115 T & operator[](int i)
00116 { assert(i>=0);
00117 assert(i<msize);
00118 int k=adjidx(i);
00119 assert(k>=0);
00120 assert(k<mspace);
00121 return mitem[k];
00122 };
00123
00124 private:
00125
00126 void drop()
00127 { if (mitem) delete[] mitem;
00128 mspace=0; msize=0; mfirst=0;
00129 };
00130
00131 void copy(edeque<T> const & s)
00132 { mspace=s.mspace;
00133 msize=s.msize;
00134 mfirst=0;
00135 if (s.mitem)
00136 { mitem=new T[mspace];
00137 for (int i=0; i<msize; i++)
00138 { mitem[i]=s.mitem[s.adjidx(i)];
00139 }
00140 } else
00141 { mitem=0;
00142 }
00143 };
00144
00145 void realloc(int newspace)
00146 { assert(newspace>msize);
00147 T * big=new T[newspace];
00148 if (mitem)
00149 { for (int i=0; i<msize; i++)
00150 { big[i]=mitem[adjidx(i)];
00151 };
00152 delete[] mitem;
00153 };
00154 mitem=big;
00155 mfirst=0;
00156 mspace=newspace;
00157 };
00158
00159 int adjidx(int idx) const
00160 { idx+=mfirst;
00161 while (idx<0) idx+=mspace;
00162 while (idx>=mspace) idx-=mspace;
00163 return idx;
00164 };
00165
00166 T * mitem;
00167 int msize, mspace, mfirst;
00168 };