CircularQueue.hpp
Go to the documentation of this file.00001 #ifndef INC_CircularQueue_hpp__
00002 #define INC_CircularQueue_hpp__
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include <antlr/config.hpp>
00012 #include <vector>
00013
00014 #ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
00015 namespace antlr {
00016 #endif
00017
00018
00019 #define OFFSET_MAX_RESIZE 5000
00020
00021 template <class T>
00022 class ANTLR_API CircularQueue {
00023 public:
00024 CircularQueue()
00025 : storage(), m_offset(0)
00026 {
00027 }
00028 ~CircularQueue()
00029 {
00030 }
00031
00033 inline void clear( void )
00034 {
00035 m_offset = 0;
00036 storage.clear();
00037 }
00038
00040 inline T elementAt(int idx) const
00041 {
00042 return storage[idx+m_offset];
00043 }
00044 void removeFirst()
00045 {
00046 if (m_offset >= OFFSET_MAX_RESIZE)
00047 {
00048 storage.erase( storage.begin(), storage.begin() + m_offset + 1 );
00049 m_offset = 0;
00050 }
00051 else
00052 ++m_offset;
00053 }
00054 inline void removeItems( int nb )
00055 {
00056 if (m_offset >= OFFSET_MAX_RESIZE)
00057 {
00058 storage.erase( storage.begin(), storage.begin() + m_offset + nb );
00059 m_offset = 0;
00060 }
00061 else
00062 m_offset+=nb;
00063 }
00064 inline void append(const T& t)
00065 {
00066 storage.push_back(t);
00067 }
00068 inline int entries() const
00069 {
00070 return storage.size()-m_offset;
00071 }
00072
00073 private:
00074 typename ANTLR_USE_NAMESPACE(std)vector<T> storage;
00075 int m_offset;
00076
00077 CircularQueue(const CircularQueue&);
00078 const CircularQueue& operator=(const CircularQueue&);
00079 };
00080
00081 #ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
00082 }
00083 #endif
00084
00085 #endif
This file is part of the documentation for KDevelop Version 3.1.2.