Line data Source code
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 "nsCOMPtr.h"
7 : #include "nsCycleCollectionParticipant.h"
8 : #include "nsISupportsUtils.h"
9 : #include "nsTransactionItem.h"
10 : #include "nsTransactionStack.h"
11 : #include "nscore.h"
12 :
13 15 : class nsTransactionStackDeallocator : public nsDequeFunctor {
14 0 : virtual void* operator() (void* aObject) {
15 0 : RefPtr<nsTransactionItem> releaseMe = dont_AddRef(static_cast<nsTransactionItem*>(aObject));
16 0 : return nullptr;
17 : }
18 : };
19 :
20 6 : nsTransactionStack::nsTransactionStack(Type aType)
21 6 : : nsDeque(new nsTransactionStackDeallocator())
22 6 : , mType(aType)
23 : {
24 6 : }
25 :
26 6 : nsTransactionStack::~nsTransactionStack()
27 : {
28 3 : Clear();
29 3 : }
30 :
31 : void
32 3 : nsTransactionStack::Push(nsTransactionItem* aTransactionItem)
33 : {
34 3 : if (!aTransactionItem) {
35 0 : return;
36 : }
37 :
38 6 : RefPtr<nsTransactionItem> item(aTransactionItem);
39 3 : Push(item.forget());
40 : }
41 :
42 : void
43 3 : nsTransactionStack::Push(already_AddRefed<nsTransactionItem> aTransactionItem)
44 : {
45 6 : RefPtr<nsTransactionItem> item(aTransactionItem);
46 3 : if (!item) {
47 0 : return;
48 : }
49 :
50 3 : nsDeque::Push(item.forget().take());
51 : }
52 :
53 : already_AddRefed<nsTransactionItem>
54 3 : nsTransactionStack::Pop()
55 : {
56 : RefPtr<nsTransactionItem> item =
57 6 : dont_AddRef(static_cast<nsTransactionItem*>(nsDeque::Pop()));
58 6 : return item.forget();
59 : }
60 :
61 : already_AddRefed<nsTransactionItem>
62 0 : nsTransactionStack::PopBottom()
63 : {
64 : RefPtr<nsTransactionItem> item =
65 0 : dont_AddRef(static_cast<nsTransactionItem*>(nsDeque::PopFront()));
66 0 : return item.forget();
67 : }
68 :
69 : already_AddRefed<nsTransactionItem>
70 1 : nsTransactionStack::Peek()
71 : {
72 : RefPtr<nsTransactionItem> item =
73 2 : static_cast<nsTransactionItem*>(nsDeque::Peek());
74 2 : return item.forget();
75 : }
76 :
77 : already_AddRefed<nsTransactionItem>
78 0 : nsTransactionStack::GetItem(int32_t aIndex)
79 : {
80 0 : if (aIndex < 0 || aIndex >= static_cast<int32_t>(nsDeque::GetSize())) {
81 0 : return nullptr;
82 : }
83 : RefPtr<nsTransactionItem> item =
84 0 : static_cast<nsTransactionItem*>(nsDeque::ObjectAt(aIndex));
85 0 : return item.forget();
86 : }
87 :
88 : void
89 7 : nsTransactionStack::Clear()
90 : {
91 7 : while (GetSize() != 0) {
92 : RefPtr<nsTransactionItem> item =
93 0 : mType == FOR_UNDO ? Pop() : PopBottom();
94 : }
95 7 : }
96 :
97 : void
98 0 : nsTransactionStack::DoTraverse(nsCycleCollectionTraversalCallback &cb)
99 : {
100 0 : int32_t size = GetSize();
101 0 : for (int32_t i = 0; i < size; ++i) {
102 0 : nsTransactionItem* item = static_cast<nsTransactionItem*>(nsDeque::ObjectAt(i));
103 0 : if (item) {
104 0 : NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "transaction stack mDeque[i]");
105 0 : cb.NoteNativeChild(item, NS_CYCLE_COLLECTION_PARTICIPANT(nsTransactionItem));
106 : }
107 : }
108 0 : }
|