/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* * The contents of this file are subject to the Netscape Public License * Version 1.0 (the "NPL"); you may not use this file except in * compliance with the NPL. You may obtain a copy of the NPL at * http://www.mozilla.org/NPL/ * * Software distributed under the NPL is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL * for the specific language governing rights and limitations under the * NPL. * * The Initial Developer of this code under the NPL is Netscape * Communications Corporation. Portions created by Netscape are * Copyright (C) 1998 Netscape Communications Corporation. All Rights * Reserved. */ #include "nsDeque.h" /** * Standard constructor * @update gess4/18/98 * @return new deque */ nsDeque::nsDeque(PRBool aOwnsMemory) { mOwnsMemory=aOwnsMemory; mCapacity=eGrowthDelta; mOrigin=mSize=0; mData=new void*[mCapacity]; } /** * Destructor * @update gess4/18/98 */ nsDeque::~nsDeque() { if(mOwnsMemory) Erase(); delete [] mData; mData=0; mOwnsMemory=PR_FALSE; } /** * Returns the number of elements currently stored in * this deque. * * @update gess4/18/98 * @param * @return int contains element count */ PRInt32 nsDeque::GetSize(void) const { return mSize; } /** * Remove all items from container without destroying them. * * @update gess4/18/98 * @param * @return */ nsDeque& nsDeque::Empty() { for(int i=0;i0) { result=mData[mOrigin]; mData[mOrigin++]=0; //zero it out for debugging purposes. mSize--; if(0==mSize) mOrigin=0; } return result; } /** * Call this to retrieve the ith element from this container. * Keep in mind that accessing the underlying elements is * done in a relative fashion. Object 0 is not necessarily * the first element (the first element is at mOrigin). * * @update gess4/18/98 * @param anIndex : 0 relative offset of item you want * @return void* or null */ void* nsDeque::ObjectAt(PRInt32 anIndex) const { void* result=0; if((anIndex>=0) && (anIndexoperator==(anIter)); } /** * Compare 2 iterators for equivalence. * * @update gess4/18/98 * @param anIter is the other iterator to be compared to * @return TRUE if EQUAL */ PRBool nsDequeIterator::operator==(nsDequeIterator& anIter) { return PRBool(((mIndex==anIter.mIndex) && (&mDeque==&anIter.mDeque))); } /** * Pre-increment operator * * @update gess4/18/98 * @return object at preincremented index */ void* nsDequeIterator::operator++() { return mDeque.ObjectAt(++mIndex); } /** * Post-increment operator * * @update gess4/18/98 * @param param is ignored * @return object at post-incremented index */ void* nsDequeIterator::operator++(int) { return mDeque.ObjectAt(mIndex++); } /** * Pre-decrement operator * * @update gess4/18/98 * @return object at pre-decremented index */ void* nsDequeIterator::operator--() { return mDeque.ObjectAt(--mIndex); } /** * Post-decrement operator * * @update gess4/18/98 * @param param is ignored * @return object at post-decremented index */ void* nsDequeIterator::operator--(int) { return mDeque.ObjectAt(mIndex--); } /** * Dereference operator * * @update gess4/18/98 * @return object at ith index */ void* nsDequeIterator::GetCurrent(void) { return mDeque.ObjectAt(mIndex); } /** * Call this method when you wanto to iterate all the * members of the container, passing a functor along * to call your code. * * @update gess4/20/98 * @param aFunctor object to call for each member * @return *this */ const nsDequeIterator& nsDequeIterator::ForEach(nsDequeFunctor& aFunctor) const{ mDeque.ForEach(aFunctor); return *this; } /** * conduct automated self test for this class * * @update gess4/18/98 * @param * @return */ void nsDeque::SelfTest(void) { #undef _SELFTEST_DEQUE #ifdef _SELFTEST_DEQUE #include { nsDeque theDeque(PR_FALSE); //construct a simple one... int ints[10]={100,200,300,400,500,600,700,800,900,1000}; int count=sizeof(ints)/sizeof(int); for(int i=0;i