TransactionStack.cpp (2240B)
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 #include "TransactionStack.h" 7 8 #include "nsCycleCollectionParticipant.h" 9 #include "nsDebug.h" 10 #include "nsISupportsUtils.h" 11 #include "nscore.h" 12 #include "TransactionItem.h" 13 14 namespace mozilla { 15 16 TransactionStack::TransactionStack(Type aType) : mType(aType) {} 17 18 TransactionStack::~TransactionStack() { Clear(); } 19 20 void TransactionStack::Push(TransactionItem* aTransactionItem) { 21 if (NS_WARN_IF(!aTransactionItem)) { 22 return; 23 } 24 nsRefPtrDeque<TransactionItem>::Push(aTransactionItem); 25 } 26 27 void TransactionStack::Push( 28 already_AddRefed<TransactionItem> aTransactionItem) { 29 TransactionItem* transactionItem = aTransactionItem.take(); 30 if (NS_WARN_IF(!transactionItem)) { 31 return; 32 } 33 nsRefPtrDeque<TransactionItem>::Push(dont_AddRef(transactionItem)); 34 } 35 36 already_AddRefed<TransactionItem> TransactionStack::Pop() { 37 return nsRefPtrDeque<TransactionItem>::Pop(); 38 } 39 40 already_AddRefed<TransactionItem> TransactionStack::PopBottom() { 41 return nsRefPtrDeque<TransactionItem>::PopFront(); 42 } 43 44 already_AddRefed<TransactionItem> TransactionStack::Peek() const { 45 RefPtr<TransactionItem> item = nsRefPtrDeque<TransactionItem>::Peek(); 46 return item.forget(); 47 } 48 49 already_AddRefed<TransactionItem> TransactionStack::GetItemAt( 50 size_t aIndex) const { 51 RefPtr<TransactionItem> item = 52 nsRefPtrDeque<TransactionItem>::ObjectAt(aIndex); 53 return item.forget(); 54 } 55 56 void TransactionStack::Clear() { 57 while (GetSize()) { 58 RefPtr<TransactionItem> item = mType == FOR_UNDO ? Pop() : PopBottom(); 59 } 60 } 61 62 void TransactionStack::DoTraverse(nsCycleCollectionTraversalCallback& cb) { 63 size_t size = GetSize(); 64 for (size_t i = 0; i < size; ++i) { 65 auto* item = nsRefPtrDeque<TransactionItem>::ObjectAt(i); 66 if (item) { 67 NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "transaction stack mDeque[i]"); 68 cb.NoteNativeChild(item, 69 NS_CYCLE_COLLECTION_PARTICIPANT(TransactionItem)); 70 } 71 } 72 } 73 74 } // namespace mozilla