56 |
|
} |
57 |
|
inline void removeItems( size_t nb ) |
58 |
|
{ |
59 |
< |
assert(nb <= entries()); |
59 |
> |
// it would be nice if we would not get called with nb > entries |
60 |
> |
// (or to be precise when entries() == 0) |
61 |
> |
// This case is possible when lexer/parser::recover() calls |
62 |
> |
// consume+consumeUntil when the queue is empty. |
63 |
> |
// In recover the consume says to prepare to read another |
64 |
> |
// character/token. Then in the subsequent consumeUntil the |
65 |
> |
// LA() call will trigger |
66 |
> |
// syncConsume which calls this method *before* the same queue |
67 |
> |
// has been sufficiently filled. |
68 |
> |
if( nb > entries() ) |
69 |
> |
nb = entries(); |
70 |
> |
|
71 |
|
if (m_offset >= OFFSET_MAX_RESIZE) |
72 |
|
{ |
73 |
|
storage.erase( storage.begin(), storage.begin() + m_offset + nb ); |
86 |
|
} |
87 |
|
|
88 |
|
private: |
89 |
< |
typename ANTLR_USE_NAMESPACE(std)vector<T> storage; |
89 |
> |
ANTLR_USE_NAMESPACE(std)vector<T> storage; |
90 |
|
size_t m_offset; |
91 |
|
|
92 |
|
CircularQueue(const CircularQueue&); |