123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279 |
- /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
- /* 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 "txList.h"
- //----------------------------/
- //- Implementation of txList -/
- //----------------------------/
- /**
- * Default constructor for a txList;
- **/
- txList::txList() {
- firstItem = 0;
- lastItem = 0;
- itemCount = 0;
- } //-- txList;
- /**
- * txList destructor, cleans up ListItems, but will not delete the Object
- * references
- */
- txList::~txList() {
- clear();
- } //-- ~txList
- nsresult txList::add(void* objPtr)
- {
- return insertBefore(objPtr, 0);
- } //-- add
- /**
- * Returns the number of items in this txList
- **/
- int32_t List::getLength() {
- return itemCount;
- } //-- getLength
- /**
- * Inserts the given Object pointer as the item just after refItem.
- * If refItem is a null pointer the Object will be inserted at the
- * beginning of the txList (ie, insert after nothing).
- * This method assumes refItem is a member of this list, and since this
- * is a private method, I feel that's a valid assumption
- **/
- nsresult txList::insertAfter(void* objPtr, ListItem* refItem)
- {
- //-- if refItem == null insert at front
- if (!refItem)
- return insertBefore(objPtr, firstItem);
- return insertBefore(objPtr, refItem->nextItem);
- } //-- insertAfter
- /**
- * Inserts the given Object pointer as the item just before refItem.
- * If refItem is a null pointer the Object will be inserted at the
- * end of the txList (ie, insert before nothing).
- * This method assumes refItem is a member of this list, and since this
- * is a private method, I feel that's a valid assumption
- **/
- nsresult txList::insertBefore(void* objPtr, ListItem* refItem)
- {
- ListItem* item = new ListItem;
- item->objPtr = objPtr;
- item->nextItem = 0;
- item->prevItem = 0;
- //-- if refItem == null insert at end
- if (!refItem) {
- //-- add to back of list
- if (lastItem) {
- lastItem->nextItem = item;
- item->prevItem = lastItem;
- }
- lastItem = item;
- if (!firstItem)
- firstItem = item;
- }
- else {
- //-- insert before given item
- item->nextItem = refItem;
- item->prevItem = refItem->prevItem;
- refItem->prevItem = item;
- if (item->prevItem)
- item->prevItem->nextItem = item;
- else
- firstItem = item;
- }
- // increase the item count
- ++itemCount;
-
- return NS_OK;
- } //-- insertBefore
- txList::ListItem* txList::remove(ListItem* item) {
- if (!item)
- return item;
- //-- adjust the previous item's next pointer
- if (item->prevItem) {
- item->prevItem->nextItem = item->nextItem;
- }
- //-- adjust the next item's previous pointer
- if (item->nextItem) {
- item->nextItem->prevItem = item->prevItem;
- }
- //-- adjust first and last items
- if (item == firstItem)
- firstItem = item->nextItem;
- if (item == lastItem)
- lastItem = item->prevItem;
- //-- decrease Item count
- --itemCount;
- return item;
- } //-- remove
- void txList::clear()
- {
- ListItem* item = firstItem;
- while (item) {
- ListItem* tItem = item;
- item = item->nextItem;
- delete tItem;
- }
- firstItem = 0;
- lastItem = 0;
- itemCount = 0;
- }
- //------------------------------------/
- //- Implementation of txListIterator -/
- //------------------------------------/
- /**
- * Creates a new txListIterator for the given txList
- * @param list, the txList to create an Iterator for
- **/
- txListIterator::txListIterator(txList* list) {
- this->list = list;
- currentItem = 0;
- atEndOfList = false;
- } //-- txListIterator
- /**
- * Adds the Object pointer to the txList pointed to by this txListIterator.
- * The Object pointer is inserted as the next item in the txList
- * based on the current position within the txList
- * @param objPtr the Object pointer to add to the list
- **/
- nsresult txListIterator::addAfter(void* objPtr)
- {
- if (currentItem || !atEndOfList)
- return list->insertAfter(objPtr, currentItem);
- return list->insertBefore(objPtr, 0);
- } //-- addAfter
- /**
- * Adds the Object pointer to the txList pointed to by this txListIterator.
- * The Object pointer is inserted as the previous item in the txList
- * based on the current position within the txList
- * @param objPtr the Object pointer to add to the list
- **/
- nsresult txListIterator::addBefore(void* objPtr)
- {
- if (currentItem || atEndOfList)
- return list->insertBefore(objPtr, currentItem);
- return list->insertAfter(objPtr, 0);
- } //-- addBefore
- /**
- * Returns true if a successful call to the next() method can be made
- * @return true if a successful call to the next() method can be made,
- * otherwise false
- **/
- bool txListIterator::hasNext() {
- bool hasNext = false;
- if (currentItem)
- hasNext = (currentItem->nextItem != 0);
- else if (!atEndOfList)
- hasNext = (list->firstItem != 0);
- return hasNext;
- } //-- hasNext
- /**
- * Returns the next Object pointer in the list
- **/
- void* txListIterator::next() {
- void* obj = 0;
- if (currentItem)
- currentItem = currentItem->nextItem;
- else if (!atEndOfList)
- currentItem = list->firstItem;
- if (currentItem)
- obj = currentItem->objPtr;
- else
- atEndOfList = true;
- return obj;
- } //-- next
- /**
- * Returns the previous Object in the list
- **/
- void* txListIterator::previous() {
- void* obj = 0;
- if (currentItem)
- currentItem = currentItem->prevItem;
- else if (atEndOfList)
- currentItem = list->lastItem;
-
- if (currentItem)
- obj = currentItem->objPtr;
- atEndOfList = false;
- return obj;
- } //-- previous
- /**
- * Returns the current Object
- **/
- void* txListIterator::current() {
- if (currentItem)
- return currentItem->objPtr;
- return 0;
- } //-- current
- /**
- * Removes the Object last returned by the next() or previous() methods;
- * @return the removed Object pointer
- **/
- void* txListIterator::remove() {
- void* obj = 0;
- if (currentItem) {
- obj = currentItem->objPtr;
- txList::ListItem* item = currentItem;
- previous(); //-- make previous item the current item
- list->remove(item);
- delete item;
- }
- return obj;
- } //-- remove
- /**
- * Resets the current location within the txList to the beginning of the txList
- **/
- void txListIterator::reset() {
- atEndOfList = false;
- currentItem = 0;
- } //-- reset
- /**
- * Move the iterator to right after the last element
- **/
- void txListIterator::resetToEnd() {
- atEndOfList = true;
- currentItem = 0;
- } //-- moveToEnd
|