00001
00002 #ifndef FIFO_h
00003 #define FIFO_h 1
00004
00005 #ifdef _MSC_VER
00006 # pragma warning(disable: 4786)
00007 #endif
00008
00009 #include <vector>
00010 #include <cassert>
00011
00012
00013
00014
00015
00016
00017 using std::vector;
00018
00019 template <class _T>
00020 class FIFO : private vector<_T>
00021 {
00022 public:
00023 FIFO (unsigned int depth = 0)
00024 : vector<_T>(), m_depth(depth)
00025 {
00026 if (depth > 0) reserve ( depth );
00027
00028
00029
00030
00031 }
00032
00033 FIFO (const FIFO& f)
00034 : vector<_T>(f), m_depth(f.m_depth)
00035 {
00036 }
00037
00038
00039
00040
00041 bool push (const _T& x)
00042 {
00043 if ((m_depth != 0) && (size() >= m_depth)) return false;
00044
00045 push_back( x );
00046
00047 return true;
00048 }
00049
00050
00051
00052
00053 _T pop ()
00054 {
00055 assert(size()>0);
00056 _T value (*begin());
00057 erase(begin());
00058
00059
00060
00061 return value;
00062 }
00063
00064 _T& front () { return vector<_T>::front(); }
00065 _T& back () { return vector<_T>::back(); }
00066
00067 const _T& front () const { return vector<_T>::front(); }
00068 const _T& back () const { return vector<_T>::back(); }
00069
00070 bool empty () const { return (size() == 0); }
00071
00072
00073 unsigned int maxSize () const
00074 {
00075 return m_depth;
00076 }
00077
00078
00079 unsigned int size () const
00080 {
00081 return vector<_T>::size();
00082 }
00083
00084 void clear ()
00085 {
00086 vector<_T>::clear();
00087 }
00088
00089
00090 void printOn (std::ostream& out = cout)
00091 {
00092 short i = 1;
00093 for (vector<_T>::reverse_iterator it = rbegin(); it != rend(); ++it) {
00094 out << (*it)();
00095 if ((i % 8) == 0) out << "\n";
00096 else out << "\t";
00097 i++;
00098 }
00099 }
00100
00101 bool full () const { return size() == m_depth; }
00102
00103 bool avail () const { return size() < m_depth; }
00104
00105 private:
00106
00107
00108 unsigned int m_depth;
00109 };
00110
00111 #endif