Modernize and simplify FastStack with a vector.

This commit is contained in:
Michael Hansen
2019-10-09 15:39:37 -07:00
parent 15da179173
commit 96b5dd1d02

View File

@@ -6,36 +6,30 @@
class FastStack {
public:
FastStack(int size) : m_size(size), m_ptr(-1) {
m_stack = new PycRef<ASTNode>[m_size];
}
FastStack(int size) : m_ptr(-1) { m_stack.resize(size); }
FastStack(const FastStack& copy) : m_size(copy.m_size), m_ptr(copy.m_ptr) {
m_stack = new PycRef<ASTNode>[m_size];
FastStack(const FastStack& copy)
: m_stack(copy.m_stack), m_ptr(copy.m_ptr) { }
for (int i = 0; i <= m_ptr; i++)
m_stack[i] = copy.m_stack[i];
}
~FastStack() {
delete[] m_stack;
}
FastStack& operator=(const FastStack& copy) {
replace(copy);
FastStack& operator=(const FastStack& copy)
{
m_stack = copy.m_stack;
m_ptr = copy.m_ptr;
return *this;
}
void push(PycRef<ASTNode> node) {
if (m_size == m_ptr + 1)
grow(1);
void push(PycRef<ASTNode> node)
{
if (static_cast<int>(m_stack.size()) == m_ptr + 1)
m_stack.emplace_back(nullptr);
m_stack[++m_ptr] = node;
m_stack[++m_ptr] = std::move(node);
}
void pop() {
void pop()
{
if (m_ptr > -1)
m_stack[m_ptr--] = NULL;
m_stack[m_ptr--] = nullptr;
}
PycRef<ASTNode> top() const
@@ -43,37 +37,12 @@ public:
if (m_ptr > -1)
return m_stack[m_ptr];
else
return NULL;
}
void replace(const FastStack& copy)
{
if (&copy == this)
return;
delete[] m_stack;
m_size = copy.m_size;
m_ptr = copy.m_ptr;
m_stack = new PycRef<ASTNode>[m_size];
for (int i = 0; i <= m_ptr; i++)
m_stack[i] = copy.m_stack[i];
}
void grow(int inc)
{
m_size += inc;
PycRef<ASTNode>* tmp = new PycRef<ASTNode>[m_size];
for (int i = 0; i <= m_ptr; i++)
tmp[i] = m_stack[i];
delete[] m_stack;
m_stack = tmp;
return nullptr;
}
private:
PycRef<ASTNode>* m_stack;
int m_size, m_ptr;
std::vector<PycRef<ASTNode>> m_stack;
int m_ptr;
};
typedef std::stack<FastStack> stackhist_t;