tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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