mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-13 21:35:39 +00:00
Bug 991720 part 1 - Add Spaghetti stack. r=h4writer.
This commit is contained in:
parent
ef2b0d42c3
commit
e2ec961ab9
@ -544,6 +544,106 @@ class InlineConcatListIterator
|
||||
Node *iter;
|
||||
};
|
||||
|
||||
template <typename T> class InlineSpaghettiStack;
|
||||
template <typename T> class InlineSpaghettiStackNode;
|
||||
template <typename T> class InlineSpaghettiStackIterator;
|
||||
|
||||
template <typename T>
|
||||
class InlineSpaghettiStackNode : public InlineForwardListNode<T>
|
||||
{
|
||||
typedef InlineForwardListNode<T> Parent;
|
||||
|
||||
public:
|
||||
InlineSpaghettiStackNode() : Parent()
|
||||
{ }
|
||||
|
||||
explicit InlineSpaghettiStackNode(InlineSpaghettiStackNode<T> *n)
|
||||
: Parent(n)
|
||||
{ }
|
||||
|
||||
InlineSpaghettiStackNode(const InlineSpaghettiStackNode<T> &) MOZ_DELETE;
|
||||
|
||||
protected:
|
||||
friend class InlineSpaghettiStack<T>;
|
||||
friend class InlineSpaghettiStackIterator<T>;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
class InlineSpaghettiStack : protected InlineSpaghettiStackNode<T>
|
||||
{
|
||||
friend class InlineSpaghettiStackIterator<T>;
|
||||
|
||||
typedef InlineSpaghettiStackNode<T> Node;
|
||||
|
||||
public:
|
||||
InlineSpaghettiStack()
|
||||
{ }
|
||||
|
||||
public:
|
||||
typedef InlineSpaghettiStackIterator<T> iterator;
|
||||
|
||||
public:
|
||||
iterator begin() const {
|
||||
return iterator(this);
|
||||
}
|
||||
iterator end() const {
|
||||
return iterator(nullptr);
|
||||
}
|
||||
|
||||
void push(Node *t) {
|
||||
MOZ_ASSERT(t->next == nullptr);
|
||||
t->next = this->next;
|
||||
this->next = t;
|
||||
}
|
||||
|
||||
void copy(const InlineSpaghettiStack<T> &stack) {
|
||||
this->next = stack.next;
|
||||
}
|
||||
|
||||
bool empty() const {
|
||||
return this->next == nullptr;
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
class InlineSpaghettiStackIterator
|
||||
{
|
||||
private:
|
||||
friend class InlineSpaghettiStack<T>;
|
||||
|
||||
typedef InlineSpaghettiStackNode<T> Node;
|
||||
|
||||
explicit InlineSpaghettiStackIterator<T>(const InlineSpaghettiStack<T> *owner)
|
||||
: iter(owner ? static_cast<Node *>(owner->next) : nullptr)
|
||||
{ }
|
||||
|
||||
public:
|
||||
InlineSpaghettiStackIterator<T> & operator ++() {
|
||||
iter = static_cast<Node *>(iter->next);
|
||||
return *this;
|
||||
}
|
||||
InlineSpaghettiStackIterator<T> operator ++(int) {
|
||||
InlineSpaghettiStackIterator<T> old(*this);
|
||||
operator++();
|
||||
return old;
|
||||
}
|
||||
T *operator *() const {
|
||||
return static_cast<T *>(iter);
|
||||
}
|
||||
T *operator ->() const {
|
||||
return static_cast<T *>(iter);
|
||||
}
|
||||
bool operator !=(const InlineSpaghettiStackIterator<T> &where) const {
|
||||
return iter != where.iter;
|
||||
}
|
||||
bool operator ==(const InlineSpaghettiStackIterator<T> &where) const {
|
||||
return iter == where.iter;
|
||||
}
|
||||
|
||||
private:
|
||||
Node *iter;
|
||||
};
|
||||
|
||||
} // namespace js
|
||||
|
||||
#endif /* jit_InlineList_h */
|
||||
|
Loading…
Reference in New Issue
Block a user