diff -r 000000000000 -r 6474c204b198 editor/txmgr/src/nsTransactionStack.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/editor/txmgr/src/nsTransactionStack.cpp Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,96 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "nsAutoPtr.h" +#include "nsCOMPtr.h" +#include "nsCycleCollectionParticipant.h" +#include "nsISupportsUtils.h" +#include "nsTransactionItem.h" +#include "nsTransactionStack.h" +#include "nscore.h" + +nsTransactionStack::nsTransactionStack(nsTransactionStack::Type aType) + : mType(aType) +{ +} + +nsTransactionStack::~nsTransactionStack() +{ + Clear(); +} + +void +nsTransactionStack::Push(nsTransactionItem *aTransaction) +{ + if (!aTransaction) { + return; + } + + // The stack's bottom is the front of the deque, and the top is the back. + mDeque.push_back(aTransaction); +} + +already_AddRefed +nsTransactionStack::Pop() +{ + if (mDeque.empty()) { + return nullptr; + } + nsRefPtr ret = mDeque.back().forget(); + mDeque.pop_back(); + return ret.forget(); +} + +already_AddRefed +nsTransactionStack::PopBottom() +{ + if (mDeque.empty()) { + return nullptr; + } + nsRefPtr ret = mDeque.front().forget(); + mDeque.pop_front(); + return ret.forget(); +} + +already_AddRefed +nsTransactionStack::Peek() +{ + if (mDeque.empty()) { + return nullptr; + } + nsRefPtr ret = mDeque.back(); + return ret.forget(); +} + +already_AddRefed +nsTransactionStack::GetItem(int32_t aIndex) +{ + if (aIndex < 0 || aIndex >= static_cast(mDeque.size())) { + return nullptr; + } + nsRefPtr ret = mDeque[aIndex]; + return ret.forget(); +} + +void +nsTransactionStack::Clear() +{ + while (!mDeque.empty()) { + nsRefPtr tx = mType == FOR_UNDO ? Pop() : PopBottom(); + }; +} + +void +nsTransactionStack::DoTraverse(nsCycleCollectionTraversalCallback &cb) +{ + int32_t size = mDeque.size(); + for (int32_t i = 0; i < size; ++i) { + nsTransactionItem* item = mDeque[i]; + if (item) { + NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "transaction stack mDeque[i]"); + cb.NoteNativeChild(item, NS_CYCLE_COLLECTION_PARTICIPANT(nsTransactionItem)); + } + } +}