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/. */
8 #include "nsCycleCollectionParticipant.h"
9 #include "nsISupportsUtils.h"
10 #include "nsTransactionItem.h"
11 #include "nsTransactionStack.h"
14 nsTransactionStack::nsTransactionStack(nsTransactionStack::Type aType
)
19 nsTransactionStack::~nsTransactionStack()
25 nsTransactionStack::Push(nsTransactionItem
*aTransaction
)
31 // The stack's bottom is the front of the deque, and the top is the back.
32 mDeque
.push_back(aTransaction
);
35 already_AddRefed
<nsTransactionItem
>
36 nsTransactionStack::Pop()
41 nsRefPtr
<nsTransactionItem
> ret
= mDeque
.back().forget();
46 already_AddRefed
<nsTransactionItem
>
47 nsTransactionStack::PopBottom()
52 nsRefPtr
<nsTransactionItem
> ret
= mDeque
.front().forget();
57 already_AddRefed
<nsTransactionItem
>
58 nsTransactionStack::Peek()
63 nsRefPtr
<nsTransactionItem
> ret
= mDeque
.back();
67 already_AddRefed
<nsTransactionItem
>
68 nsTransactionStack::GetItem(int32_t aIndex
)
70 if (aIndex
< 0 || aIndex
>= static_cast<int32_t>(mDeque
.size())) {
73 nsRefPtr
<nsTransactionItem
> ret
= mDeque
[aIndex
];
78 nsTransactionStack::Clear()
80 while (!mDeque
.empty()) {
81 nsRefPtr
<nsTransactionItem
> tx
= mType
== FOR_UNDO
? Pop() : PopBottom();
86 nsTransactionStack::DoTraverse(nsCycleCollectionTraversalCallback
&cb
)
88 int32_t size
= mDeque
.size();
89 for (int32_t i
= 0; i
< size
; ++i
) {
90 nsTransactionItem
* item
= mDeque
[i
];
92 NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb
, "transaction stack mDeque[i]");
93 cb
.NoteNativeChild(item
, NS_CYCLE_COLLECTION_PARTICIPANT(nsTransactionItem
));