2014-06-30 15:39:45 +00:00
|
|
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
2012-05-21 11:12:37 +00:00
|
|
|
/* 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/. */
|
1998-04-22 18:28:48 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* MODULE NOTES:
|
2002-02-20 03:08:32 +00:00
|
|
|
*
|
1998-04-22 18:28:48 +00:00
|
|
|
* The Deque is a very small, very efficient container object
|
|
|
|
* than can hold elements of type void*, offering the following features:
|
2002-02-20 03:08:32 +00:00
|
|
|
* Its interface supports pushing and popping of elements.
|
|
|
|
* It can iterate (via an interator class) its elements.
|
|
|
|
* When full, it can efficiently resize dynamically.
|
1998-04-22 18:28:48 +00:00
|
|
|
*
|
|
|
|
*
|
|
|
|
* NOTE: The only bit of trickery here is that this deque is
|
2002-02-20 03:08:32 +00:00
|
|
|
* built upon a ring-buffer. Like all ring buffers, the first
|
|
|
|
* element may not be at index[0]. The mOrigin member determines
|
|
|
|
* where the first child is. This point is quietly hidden from
|
1998-04-22 18:28:48 +00:00
|
|
|
* customers of this class.
|
2002-02-20 03:08:32 +00:00
|
|
|
*
|
1998-04-22 18:28:48 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _NSDEQUE
|
|
|
|
#define _NSDEQUE
|
|
|
|
|
|
|
|
#include "nscore.h"
|
2013-05-28 23:57:54 +00:00
|
|
|
#include "nsDebug.h"
|
2012-09-21 18:27:27 +00:00
|
|
|
#include "mozilla/Attributes.h"
|
2013-05-28 23:57:54 +00:00
|
|
|
#include "mozilla/fallible.h"
|
2014-03-05 21:31:04 +00:00
|
|
|
#include "mozilla/MemoryReporting.h"
|
1998-04-22 18:28:48 +00:00
|
|
|
|
|
|
|
/**
|
2002-02-20 03:08:32 +00:00
|
|
|
* The nsDequeFunctor class is used when you want to create
|
1998-04-22 18:28:48 +00:00
|
|
|
* callbacks between the deque and your generic code.
|
|
|
|
* Use these objects in a call to ForEach();
|
|
|
|
*
|
|
|
|
*/
|
2002-02-20 03:08:32 +00:00
|
|
|
|
2014-06-27 01:35:39 +00:00
|
|
|
class nsDequeFunctor
|
|
|
|
{
|
1998-04-22 18:28:48 +00:00
|
|
|
public:
|
2014-06-27 01:35:39 +00:00
|
|
|
virtual void* operator()(void* aObject) = 0;
|
2012-09-21 18:27:27 +00:00
|
|
|
virtual ~nsDequeFunctor() {}
|
1998-04-22 18:28:48 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/******************************************************
|
|
|
|
* Here comes the nsDeque class itself...
|
|
|
|
******************************************************/
|
|
|
|
|
|
|
|
/**
|
2002-02-20 03:08:32 +00:00
|
|
|
* The deque (double-ended queue) class is a common container type,
|
1998-04-22 18:28:48 +00:00
|
|
|
* whose behavior mimics a line in your favorite checkout stand.
|
2002-02-20 03:08:32 +00:00
|
|
|
* Classic CS describes the common behavior of a queue as FIFO.
|
|
|
|
* A deque allows insertion and removal at both ends of
|
|
|
|
* the container.
|
1998-04-22 18:28:48 +00:00
|
|
|
*
|
2002-02-20 03:08:32 +00:00
|
|
|
* The deque stores pointers to items.
|
1998-04-22 18:28:48 +00:00
|
|
|
*/
|
|
|
|
|
2002-01-10 14:16:05 +00:00
|
|
|
class nsDequeIterator;
|
|
|
|
|
2014-08-27 22:47:27 +00:00
|
|
|
class nsDeque
|
2014-06-27 01:35:39 +00:00
|
|
|
{
|
2013-05-28 23:57:54 +00:00
|
|
|
typedef mozilla::fallible_t fallible_t;
|
2014-06-27 01:35:39 +00:00
|
|
|
public:
|
2014-07-28 17:19:06 +00:00
|
|
|
explicit nsDeque(nsDequeFunctor* aDeallocator = nullptr);
|
2002-02-20 03:08:32 +00:00
|
|
|
~nsDeque();
|
|
|
|
|
1998-04-22 18:28:48 +00:00
|
|
|
/**
|
|
|
|
* Returns the number of elements currently stored in
|
|
|
|
* this deque.
|
|
|
|
*
|
2002-02-20 03:08:32 +00:00
|
|
|
* @return number of elements currently in the deque
|
1998-04-22 18:28:48 +00:00
|
|
|
*/
|
2015-11-15 13:48:08 +00:00
|
|
|
inline size_t GetSize() const { return mSize; }
|
1998-04-22 18:28:48 +00:00
|
|
|
|
|
|
|
/**
|
2002-02-20 03:08:32 +00:00
|
|
|
* Appends new member at the end of the deque.
|
1998-04-22 18:28:48 +00:00
|
|
|
*
|
2002-02-20 03:08:32 +00:00
|
|
|
* @param item to store in deque
|
1998-04-22 18:28:48 +00:00
|
|
|
*/
|
2014-06-27 01:35:39 +00:00
|
|
|
void Push(void* aItem)
|
|
|
|
{
|
2015-01-28 09:00:40 +00:00
|
|
|
if (!Push(aItem, mozilla::fallible)) {
|
2014-11-12 08:13:44 +00:00
|
|
|
NS_ABORT_OOM(mSize * sizeof(void*));
|
2013-05-28 23:57:54 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-03-19 07:46:40 +00:00
|
|
|
MOZ_WARN_UNUSED_RESULT bool Push(void* aItem, const fallible_t&);
|
1999-01-09 01:09:39 +00:00
|
|
|
|
|
|
|
/**
|
2002-02-20 03:08:32 +00:00
|
|
|
* Inserts new member at the front of the deque.
|
1999-01-09 01:09:39 +00:00
|
|
|
*
|
2002-02-20 03:08:32 +00:00
|
|
|
* @param item to store in deque
|
1999-01-09 01:09:39 +00:00
|
|
|
*/
|
2014-06-27 01:35:39 +00:00
|
|
|
void PushFront(void* aItem)
|
|
|
|
{
|
2015-01-28 09:00:40 +00:00
|
|
|
if (!PushFront(aItem, mozilla::fallible)) {
|
2014-11-12 08:13:44 +00:00
|
|
|
NS_ABORT_OOM(mSize * sizeof(void*));
|
2013-05-28 23:57:54 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-03-19 07:46:40 +00:00
|
|
|
MOZ_WARN_UNUSED_RESULT bool PushFront(void* aItem, const fallible_t&);
|
2002-02-20 03:08:32 +00:00
|
|
|
|
1998-04-22 18:28:48 +00:00
|
|
|
/**
|
2002-02-20 03:08:32 +00:00
|
|
|
* Remove and return the last item in the container.
|
|
|
|
*
|
|
|
|
* @return the item that was the last item in container
|
1998-04-22 18:28:48 +00:00
|
|
|
*/
|
2002-02-20 03:08:32 +00:00
|
|
|
void* Pop();
|
1998-08-05 01:59:34 +00:00
|
|
|
|
2002-02-20 03:08:32 +00:00
|
|
|
/**
|
1999-01-09 01:09:39 +00:00
|
|
|
* Remove and return the first item in the container.
|
2002-02-20 03:08:32 +00:00
|
|
|
*
|
|
|
|
* @return the item that was first item in container
|
1998-08-05 01:59:34 +00:00
|
|
|
*/
|
2002-02-20 03:08:32 +00:00
|
|
|
void* PopFront();
|
1999-01-09 01:09:39 +00:00
|
|
|
|
1999-11-27 17:47:05 +00:00
|
|
|
/**
|
2002-02-20 03:08:32 +00:00
|
|
|
* Retrieve the bottom item without removing it.
|
|
|
|
*
|
|
|
|
* @return the first item in container
|
|
|
|
*/
|
|
|
|
|
|
|
|
void* Peek();
|
1998-04-22 18:28:48 +00:00
|
|
|
/**
|
1999-01-09 01:09:39 +00:00
|
|
|
* Return topmost item without removing it.
|
2002-02-20 03:08:32 +00:00
|
|
|
*
|
|
|
|
* @return the first item in container
|
1998-04-22 18:28:48 +00:00
|
|
|
*/
|
2002-02-20 03:08:32 +00:00
|
|
|
void* PeekFront();
|
|
|
|
|
1999-01-15 19:20:51 +00:00
|
|
|
/**
|
2014-06-27 01:35:39 +00:00
|
|
|
* Retrieve a member from the deque without removing it.
|
1999-01-15 19:20:51 +00:00
|
|
|
*
|
|
|
|
* @param index of desired item
|
2014-06-27 01:35:39 +00:00
|
|
|
* @return element in list
|
1999-01-15 19:20:51 +00:00
|
|
|
*/
|
2015-11-15 13:48:08 +00:00
|
|
|
void* ObjectAt(size_t aIndex) const;
|
2002-02-20 03:08:32 +00:00
|
|
|
|
1998-04-22 18:28:48 +00:00
|
|
|
/**
|
2002-02-20 03:08:32 +00:00
|
|
|
* Remove and delete all items from container.
|
|
|
|
* Deletes are handled by the deallocator nsDequeFunctor
|
|
|
|
* which is specified at deque construction.
|
1998-04-22 18:28:48 +00:00
|
|
|
*/
|
2013-05-28 23:57:54 +00:00
|
|
|
void Erase();
|
1998-04-22 18:28:48 +00:00
|
|
|
|
|
|
|
/**
|
2001-12-08 06:59:49 +00:00
|
|
|
* Call this method when you want to iterate all the
|
1998-04-22 18:28:48 +00:00
|
|
|
* members of the container, passing a functor along
|
|
|
|
* to call your code.
|
|
|
|
*
|
|
|
|
* @param aFunctor object to call for each member
|
|
|
|
*/
|
1998-08-27 02:39:36 +00:00
|
|
|
void ForEach(nsDequeFunctor& aFunctor) const;
|
1998-08-05 01:59:34 +00:00
|
|
|
|
2014-03-05 21:31:04 +00:00
|
|
|
size_t SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
|
|
|
|
size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
|
|
|
|
|
1998-04-22 18:28:48 +00:00
|
|
|
protected:
|
2015-11-15 13:48:08 +00:00
|
|
|
size_t mSize;
|
|
|
|
size_t mCapacity;
|
|
|
|
size_t mOrigin;
|
1999-02-26 06:33:54 +00:00
|
|
|
nsDequeFunctor* mDeallocator;
|
1999-07-16 17:31:00 +00:00
|
|
|
void* mBuffer[8];
|
1998-06-17 23:13:28 +00:00
|
|
|
void** mData;
|
|
|
|
|
2002-02-20 03:08:32 +00:00
|
|
|
private:
|
1998-04-22 18:28:48 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Copy constructor (PRIVATE)
|
2002-02-20 03:08:32 +00:00
|
|
|
*
|
2014-06-27 01:35:39 +00:00
|
|
|
* @param aOther another deque
|
1998-04-22 18:28:48 +00:00
|
|
|
*/
|
2014-06-27 01:35:39 +00:00
|
|
|
nsDeque(const nsDeque& aOther);
|
1998-04-22 18:28:48 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Deque assignment operator (PRIVATE)
|
|
|
|
*
|
2014-06-27 01:35:39 +00:00
|
|
|
* @param aOther another deque
|
|
|
|
* @return *this
|
1998-04-22 18:28:48 +00:00
|
|
|
*/
|
2014-06-27 01:35:39 +00:00
|
|
|
nsDeque& operator=(const nsDeque& aOther);
|
1998-04-22 18:28:48 +00:00
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
bool GrowCapacity();
|
2015-11-15 13:48:02 +00:00
|
|
|
void SetDeallocator(nsDequeFunctor* aDeallocator);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Remove all items from container without destroying them.
|
|
|
|
*/
|
|
|
|
void Empty();
|
1998-04-22 18:28:48 +00:00
|
|
|
};
|
|
|
|
#endif
|