home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-04-21 | 8.3 KB | 302 lines | [TEXT/MPS ] |
- // The C++ Booch Components (Version 2.1)
- // (C) Copyright 1990-1993 Grady Booch. All Rights Reserved.
- //
- // Restricted Rights Legend
- // Use, duplication, or disclosure is subject to restrictions as set forth
- // in subdivision (c)(1)(ii) of the Rights in Technical Data and Computer
- // Software clause at DFARS 252.227-7013.
- //
- // BCUnboun.cpp
- //
- // This file contains the definition for the list-based class
- // used for the representation of unbounded structures.
-
- #include "BCUnboun.h"
-
- template<class Item, class StorageManager>
- BC_TUnbounded<Item, StorageManager>::BC_TUnbounded()
- : fRep(0),
- fLast(0),
- fSize(0),
- fCache(0),
- fCacheIndex(0) {}
-
- template<class Item, class StorageManager>
- BC_TUnbounded<Item, StorageManager>::
- BC_TUnbounded(const BC_TUnbounded<Item, StorageManager>& c)
- : fRep(0),
- fLast(0),
- fSize(c.fSize),
- fCache(0),
- fCacheIndex(0)
- {
- operator=(c);
- }
-
- template<class Item, class StorageManager>
- BC_TUnbounded<Item, StorageManager>::~BC_TUnbounded()
- {
- Clear();
- }
-
- template<class Item, class StorageManager>
- BC_TUnbounded<Item, StorageManager>&
- BC_TUnbounded<Item, StorageManager>::
- operator=(const BC_TUnbounded<Item, StorageManager>& c)
- {
- if (this == &c)
- return *this;
- Clear();
- BC_TNode<Item, StorageManager>* ptr = c.fLast;
- if (ptr) {
- fRep = fLast = new BC_TNode<Item, StorageManager>(ptr->fItem, 0, 0);
- ptr = ptr->fPrevious;
- while (ptr) {
- fRep = new BC_TNode<Item, StorageManager>(ptr->fItem, 0, fRep);
- ptr = ptr->fPrevious;
- }
- }
- fSize = c.fSize;
- return *this;
- }
-
- template<class Item, class StorageManager>
- BC_Boolean BC_TUnbounded<Item, StorageManager>::
- operator==(const BC_TUnbounded<Item, StorageManager>& c) const
- {
- if (this == &c)
- return 1;
- if (fSize == c.fSize) {
- BC_TNode<Item, StorageManager>* ptr1 = fRep;
- BC_TNode<Item, StorageManager>* ptr2 = c.fRep;
- for (; ptr1; ptr1 = ptr1->fNext, ptr2 = ptr2->fNext)
- if (ptr1->fItem != ptr2->fItem)
- return 0;
- return 1;
- } else
- return 0;
- }
-
- template<class Item, class StorageManager>
- void BC_TUnbounded<Item, StorageManager>::Clear()
- {
- while (fRep) {
- BC_TNode<Item, StorageManager>* ptr = fRep;
- fRep = fRep->fNext;
- delete ptr;
- }
- fRep = fLast = fCache = 0;
- fSize = fCacheIndex = 0;
- }
-
- template<class Item, class StorageManager>
- void BC_TUnbounded<Item, StorageManager>::Insert(const Item& item)
- {
- fRep = new BC_TNode<Item, StorageManager>(item, 0, fRep);
- if (!fLast)
- fLast = fRep;
- fSize++;
- fCache = fRep;
- fCacheIndex = 0;
- }
-
- template<class Item, class StorageManager>
- void BC_TUnbounded<Item, StorageManager>::Insert(const Item& i, BC_Index before)
- {
- BC_Assert((before < fSize),
- BC_XRangeError((const char*)"BC_TUnbounded::Insert", BC_kInvalidIndex));
- if (!fSize || !before)
- Insert(i);
- else {
- ItemAt(before);
- BC_TNode<Item, StorageManager>* ptr =
- new BC_TNode<Item, StorageManager>(i, fCache->fPrevious, fCache);
- if (!ptr->fPrevious)
- fRep = ptr;
- fSize++;
- fCache = ptr;
- }
- }
-
- template<class Item, class StorageManager>
- void BC_TUnbounded<Item, StorageManager>::Append(const Item& item)
- {
- fLast = new BC_TNode<Item, StorageManager>(item, fLast, 0);
- if (!fRep)
- fRep = fLast;
- fSize++;
- fCache = fLast;
- fCacheIndex = fSize - 1;
- }
-
- template<class Item, class StorageManager>
- void BC_TUnbounded<Item, StorageManager>::
- Append(const Item& i, BC_Index after)
- {
- BC_Assert((after < fSize),
- BC_XRangeError((const char*)"BC_TUnbounded::Append", BC_kInvalidIndex));
- if (!fSize || (after == fSize))
- Append(i);
- else {
- ItemAt(after);
- BC_TNode<Item, StorageManager>* ptr =
- new BC_TNode<Item, StorageManager>(i, fCache, fCache->fNext);
- if (!ptr->fNext)
- fLast = ptr;
- fSize++;
- fCache = ptr;
- fCacheIndex++;
- }
- }
-
- template<class Item, class StorageManager>
- void BC_TUnbounded<Item, StorageManager>::Remove(BC_Index at)
- {
- BC_Assert((at < fSize),
- BC_XRangeError((const char*)"BC_TUnbounded::Remove", BC_kInvalidIndex));
- BC_Assert(fSize, BC_XUnderflow((const char*)"BC_TUnbounded::Remove", BC_kEmpty));
- if (fSize == 1)
- Clear();
- else {
- ItemAt(at);
- BC_TNode<Item, StorageManager>* ptr = fCache;
- if (!ptr->fPrevious)
- fRep = ptr->fNext;
- else
- ptr->fPrevious->fNext = ptr->fNext;
- if (!ptr->fNext)
- fLast = ptr->fPrevious;
- else
- ptr->fNext->fPrevious = ptr->fPrevious;
- fSize--;
- if (ptr->fNext)
- fCache = ptr->fNext;
- else if (ptr->fPrevious) {
- fCache = ptr->fPrevious;
- fCacheIndex--;
- } else {
- fCache = 0;
- fCacheIndex = 0;
- }
- delete ptr;
- }
- }
-
- template<class Item, class StorageManager>
- void BC_TUnbounded<Item, StorageManager>::Replace(BC_Index at, const Item& item)
- {
- BC_Assert((at < Length()),
- BC_XRangeError((const char*)"BC_TDynamic::Replace", BC_kInvalidIndex));
- if (!(fCache && (at == fCacheIndex))) {
- BC_TNode<Item, StorageManager>* ptr = fRep;
- for (BC_Index index = 0; (index < fSize); index++) {
- if (index == at) {
- fCache = ptr;
- fCacheIndex = index;
- break;
- } else
- ptr = ptr->fNext;
- }
- }
- fCache->fItem = item;
- }
-
- template<class Item, class StorageManager>
- BC_Index BC_TUnbounded<Item, StorageManager>::Length() const
- {
- return fSize;
- }
-
- template<class Item, class StorageManager>
- const Item& BC_TUnbounded<Item, StorageManager>::ItemAt(BC_Index index) const
- {
- if (fCache) {
- if (index == fCacheIndex)
- return fCache->fItem;
- else if (index == fCacheIndex + 1) {
- ((BC_TUnbounded<Item, StorageManager>&)(*this)).fCache =
- fCache->fNext;
- ((BC_TUnbounded<Item, StorageManager>&)(*this)).fCacheIndex++;
- return fCache->fItem;
- } else if (index == fCacheIndex - 1) {
- ((BC_TUnbounded<Item, StorageManager>&)(*this)).fCache =
- fCache->fPrevious;
- ((BC_TUnbounded<Item, StorageManager>&)(*this)).fCacheIndex--;
- return fCache->fItem;
- }
- }
- BC_TNode<Item, StorageManager>* ptr = fRep;
- for (BC_Index listIndex = 0; (listIndex < fSize); listIndex++)
- if (listIndex == index) {
- ((BC_TUnbounded<Item, StorageManager>&)(*this)).fCache = ptr;
- ((BC_TUnbounded<Item, StorageManager>&)(*this)).fCacheIndex =
- listIndex;
- return ptr->fItem;
- } else
- ptr = ptr->fNext;
- return ptr->fItem;
- }
-
- template<class Item, class StorageManager>
- Item& BC_TUnbounded<Item, StorageManager>::ItemAt(BC_Index index)
- {
- if (fCache) {
- if (index == fCacheIndex)
- return fCache->fItem;
- else if (index == fCacheIndex + 1) {
- ((BC_TUnbounded<Item, StorageManager>&)(*this)).fCache =
- fCache->fNext;
- ((BC_TUnbounded<Item, StorageManager>&)(*this)).fCacheIndex++;
- return fCache->fItem;
- } else if (index == fCacheIndex - 1) {
- ((BC_TUnbounded<Item, StorageManager>&)(*this)).fCache =
- fCache->fPrevious;
- ((BC_TUnbounded<Item, StorageManager>&)(*this)).fCacheIndex--;
- return fCache->fItem;
- }
- }
- BC_TNode<Item, StorageManager>* ptr = fRep;
- for (BC_Index listIndex = 0; (listIndex < fSize); listIndex++)
- if (listIndex == index) {
- ((BC_TUnbounded<Item, StorageManager>&)(*this)).fCache = ptr;
- ((BC_TUnbounded<Item, StorageManager>&)(*this)).fCacheIndex =
- listIndex;
- return ptr->fItem;
- } else
- ptr = ptr->fNext;
- return ptr->fItem;
- }
-
- template<class Item, class StorageManager>
- BC_ExtendedIndex BC_TUnbounded<Item, StorageManager>::
- Location(const Item& i, BC_Index start) const
- {
- BC_Assert((start <= fSize),
- BC_XRangeError((const char*)"BC_TUnbounded::Location", BC_kInvalidIndex));
- if ((!start) && fCache && (fCache->fItem == i))
- return fCacheIndex;
- BC_TNode<Item, StorageManager>* ptr = fRep;
- for (BC_Index index = 0; (index < start); index++)
- ptr = ptr->fNext;
- for (; (index < fSize); index++)
- if (ptr->fItem == i) {
- ((BC_TUnbounded<Item, StorageManager>&)(*this)).fCache = ptr;
- ((BC_TUnbounded<Item, StorageManager>&)(*this)).fCacheIndex = index;
- return index;
- } else
- ptr = ptr->fNext;
- return -1;
- }
-
- template<class Item, class StorageManager>
- void* BC_TUnbounded<Item, StorageManager>::operator new(size_t s)
- {
- return StorageManager::Allocate(s);
- }
-
- template<class Item, class StorageManager>
- void BC_TUnbounded<Item, StorageManager>::operator delete(void* p, size_t s)
- {
- StorageManager::Deallocate(p, s);
- }
-