editor/txmgr/src/nsTransactionStack.cpp

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/editor/txmgr/src/nsTransactionStack.cpp	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,96 @@
     1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public
     1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this
     1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     1.8 +
     1.9 +#include "nsAutoPtr.h"
    1.10 +#include "nsCOMPtr.h"
    1.11 +#include "nsCycleCollectionParticipant.h"
    1.12 +#include "nsISupportsUtils.h"
    1.13 +#include "nsTransactionItem.h"
    1.14 +#include "nsTransactionStack.h"
    1.15 +#include "nscore.h"
    1.16 +
    1.17 +nsTransactionStack::nsTransactionStack(nsTransactionStack::Type aType)
    1.18 +  : mType(aType)
    1.19 +{
    1.20 +}
    1.21 +
    1.22 +nsTransactionStack::~nsTransactionStack()
    1.23 +{
    1.24 +  Clear();
    1.25 +}
    1.26 +
    1.27 +void
    1.28 +nsTransactionStack::Push(nsTransactionItem *aTransaction)
    1.29 +{
    1.30 +  if (!aTransaction) {
    1.31 +    return;
    1.32 +  }
    1.33 +
    1.34 +  // The stack's bottom is the front of the deque, and the top is the back.
    1.35 +  mDeque.push_back(aTransaction);
    1.36 +}
    1.37 +
    1.38 +already_AddRefed<nsTransactionItem>
    1.39 +nsTransactionStack::Pop()
    1.40 +{
    1.41 +  if (mDeque.empty()) {
    1.42 +    return nullptr;
    1.43 +  }
    1.44 +  nsRefPtr<nsTransactionItem> ret = mDeque.back().forget();
    1.45 +  mDeque.pop_back();
    1.46 +  return ret.forget();
    1.47 +}
    1.48 +
    1.49 +already_AddRefed<nsTransactionItem>
    1.50 +nsTransactionStack::PopBottom()
    1.51 +{
    1.52 +  if (mDeque.empty()) {
    1.53 +    return nullptr;
    1.54 +  }
    1.55 +  nsRefPtr<nsTransactionItem> ret = mDeque.front().forget();
    1.56 +  mDeque.pop_front();
    1.57 +  return ret.forget();
    1.58 +}
    1.59 +
    1.60 +already_AddRefed<nsTransactionItem>
    1.61 +nsTransactionStack::Peek()
    1.62 +{
    1.63 +  if (mDeque.empty()) {
    1.64 +    return nullptr;
    1.65 +  }
    1.66 +  nsRefPtr<nsTransactionItem> ret = mDeque.back();
    1.67 +  return ret.forget();
    1.68 +}
    1.69 +
    1.70 +already_AddRefed<nsTransactionItem>
    1.71 +nsTransactionStack::GetItem(int32_t aIndex)
    1.72 +{
    1.73 +  if (aIndex < 0 || aIndex >= static_cast<int32_t>(mDeque.size())) {
    1.74 +    return nullptr;
    1.75 +  }
    1.76 +  nsRefPtr<nsTransactionItem> ret = mDeque[aIndex];
    1.77 +  return ret.forget();
    1.78 +}
    1.79 +
    1.80 +void
    1.81 +nsTransactionStack::Clear()
    1.82 +{
    1.83 +  while (!mDeque.empty()) {
    1.84 +    nsRefPtr<nsTransactionItem> tx = mType == FOR_UNDO ? Pop() : PopBottom();
    1.85 +  };
    1.86 +}
    1.87 +
    1.88 +void
    1.89 +nsTransactionStack::DoTraverse(nsCycleCollectionTraversalCallback &cb)
    1.90 +{
    1.91 +  int32_t size = mDeque.size();
    1.92 +  for (int32_t i = 0; i < size; ++i) {
    1.93 +    nsTransactionItem* item = mDeque[i];
    1.94 +    if (item) {
    1.95 +      NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "transaction stack mDeque[i]");
    1.96 +      cb.NoteNativeChild(item, NS_CYCLE_COLLECTION_PARTICIPANT(nsTransactionItem));
    1.97 +    }
    1.98 +  }
    1.99 +}

mercurial