3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-17 14:25:35 +00:00
z3/src/util/queue.h
Nikolaj Bjorner d0e20e44ff booyah
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
2020-07-04 15:56:30 -07:00

72 lines
1.3 KiB
C++

/*++
Copyright (c) 2017 Microsoft Corporation
Module Name:
queue.h
Abstract:
Generic queue.
Author:
Nikolaj Bjorner (nbjorner) 2017-4-17
Notes:
--*/
#pragma once
#include "vector.h"
template<class T>
class queue {
vector<T> m_elems;
unsigned m_head;
unsigned m_capacity;
public:
queue(): m_head(0), m_capacity(0) {}
void push(T const& t) { m_elems.push_back(t); }
bool empty() const {
return m_head == m_elems.size();
}
T top() const {
return m_elems[m_head];
}
T pop_front() {
SASSERT(!empty());
m_capacity = std::max(m_capacity, m_elems.size());
SASSERT(m_head < m_elems.size());
if (2 * m_head > m_capacity && m_capacity > 10) {
for (unsigned i = 0; i < m_elems.size() - m_head; ++i) {
m_elems[i] = m_elems[i + m_head];
}
m_elems.shrink(m_elems.size() - m_head);
m_head = 0;
}
return m_elems[m_head++];
}
T back() const {
return m_elems[m_elems.size() - 1];
}
T pop_back() {
SASSERT(!empty());
SASSERT(m_head < m_elems.size());
T result = back();
m_elems.shrink(m_elems.size() - 1);
return result;
}
};