From 5f8de423f190bbb79a62f804151bc24824fa32d8 Mon Sep 17 00:00:00 2001 From: "Matt A. Tobin" Date: Fri, 2 Feb 2018 04:16:08 -0500 Subject: Add m-esr52 at 52.6.0 --- editor/txmgr/nsTransactionStack.cpp | 108 ++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 editor/txmgr/nsTransactionStack.cpp (limited to 'editor/txmgr/nsTransactionStack.cpp') diff --git a/editor/txmgr/nsTransactionStack.cpp b/editor/txmgr/nsTransactionStack.cpp new file mode 100644 index 000000000..febfa3110 --- /dev/null +++ b/editor/txmgr/nsTransactionStack.cpp @@ -0,0 +1,108 @@ +/* -*- 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 "nsCOMPtr.h" +#include "nsCycleCollectionParticipant.h" +#include "nsISupportsUtils.h" +#include "nsTransactionItem.h" +#include "nsTransactionStack.h" +#include "nscore.h" + +class nsTransactionStackDeallocator : public nsDequeFunctor { + virtual void* operator() (void* aObject) { + RefPtr releaseMe = dont_AddRef(static_cast(aObject)); + return nullptr; + } +}; + +nsTransactionStack::nsTransactionStack(Type aType) + : nsDeque(new nsTransactionStackDeallocator()) + , mType(aType) +{ +} + +nsTransactionStack::~nsTransactionStack() +{ + Clear(); +} + +void +nsTransactionStack::Push(nsTransactionItem* aTransactionItem) +{ + if (!aTransactionItem) { + return; + } + + RefPtr item(aTransactionItem); + Push(item.forget()); +} + +void +nsTransactionStack::Push(already_AddRefed aTransactionItem) +{ + RefPtr item(aTransactionItem); + if (!item) { + return; + } + + nsDeque::Push(item.forget().take()); +} + +already_AddRefed +nsTransactionStack::Pop() +{ + RefPtr item = + dont_AddRef(static_cast(nsDeque::Pop())); + return item.forget(); +} + +already_AddRefed +nsTransactionStack::PopBottom() +{ + RefPtr item = + dont_AddRef(static_cast(nsDeque::PopFront())); + return item.forget(); +} + +already_AddRefed +nsTransactionStack::Peek() +{ + RefPtr item = + static_cast(nsDeque::Peek()); + return item.forget(); +} + +already_AddRefed +nsTransactionStack::GetItem(int32_t aIndex) +{ + if (aIndex < 0 || aIndex >= static_cast(nsDeque::GetSize())) { + return nullptr; + } + RefPtr item = + static_cast(nsDeque::ObjectAt(aIndex)); + return item.forget(); +} + +void +nsTransactionStack::Clear() +{ + while (GetSize() != 0) { + RefPtr item = + mType == FOR_UNDO ? Pop() : PopBottom(); + } +} + +void +nsTransactionStack::DoTraverse(nsCycleCollectionTraversalCallback &cb) +{ + int32_t size = GetSize(); + for (int32_t i = 0; i < size; ++i) { + nsTransactionItem* item = static_cast(nsDeque::ObjectAt(i)); + if (item) { + NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "transaction stack mDeque[i]"); + cb.NoteNativeChild(item, NS_CYCLE_COLLECTION_PARTICIPANT(nsTransactionItem)); + } + } +} -- cgit v1.2.3