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