📄 lists.h
字号:
object at that ordinal position or the index was beyond the size of the array then the function asserts. The object accessed in this way is remembered by the class and further access will be fast. Access to elements one either side of that saved element, and the head and tail of the list, will always be fast. @return reference to the object at #index# position. */ T & operator[](PINDEX index) const { return (T &)GetReferenceAt(index); } //@} protected: PList(int dummy, const PList * c) : PAbstractList(dummy, c) { }};/**Declare a list class. This macro is used to declare a descendent of PAbstractList class, customised for a particular object type {\bf T}. This macro closes the class declaration off so no additional members can be added. If the compilation is using templates then this macro produces a typedef of the #PList# template class. See the #PList# class and #PDECLARE_LIST# macro for more information. */#define PLIST(cls, T) typedef PList<T> cls/**Begin declaration of list class. This macro is used to declare a descendent of PAbstractList class, customised for a particular object type {\bf T}. If the compilation is using templates then this macro produces a descendent of the #PList# template class. If templates are not being used then the macro defines a set of inline functions to do all casting of types. The resultant classes have an identical set of functions in either case. See the #PList# and #PAbstractList# classes for more information. */#define PDECLARE_LIST(cls, T) \ PLIST(cls##_PTemplate, T); \ PDECLARE_CLASS(cls, cls##_PTemplate) \ protected: \ cls(int dummy, const cls * c) \ : cls##_PTemplate(dummy, c) { } \ public: \ cls() \ : cls##_PTemplate() { } \ virtual PObject * Clone() const \ { return PNEW cls(0, this); } \/**This template class maps the PAbstractList to a specific object type, and adds functionality that allows the list to be used as a first in first out queue. The functions in this class primarily do all the appropriate casting of types. By default, objects placed into the set will {\bf not} be deleted when removed or when all references to the set are destroyed. This is different from the default on most collection classes. Note that if templates are not used the #PDECLARE_QUEUE# macro will simulate the template instantiation. */template <class T> class PQueue : public PAbstractList{ PCLASSINFO(PQueue, PAbstractList); public: /**@name Construction */ //@{ /**Create a new, empty, queue. Note that by default, objects placed into the queue will {\bf not} be deleted when removed or when all references to the queue are destroyed. This is different from the default on most collection classes. */ PQueue() : PAbstractList() { DisallowDeleteObjects(); } //@} /**@name Overrides from class PObject */ //@{ /**Make a complete duplicate of the list. Note that all objects in the array are also cloned, so this will make a complete copy of the list. */ virtual PObject * Clone() const { return PNEW PQueue(0, this); } //@} /**@name New functions for class */ //@{ /**Add a new object to the queue. This places a new link at the "tail" of the list, which is the "in" side of the queue. */ virtual void Enqueue( T * obj /// Object to add to the queue. ) { PAbstractList::Append(obj); } /**Remove an object that was added to the queue. @return first object added to the queue or NULL if queue empty. */ virtual T * Dequeue() { if (GetSize() == 0) return NULL; else return (T *)PAbstractList::RemoveAt(0);} //@} protected: PQueue(int dummy, const PQueue * c) : PAbstractList(dummy, c) { reference->deleteObjects = c->reference->deleteObjects; }};/**Declare a queue class. This macro is used to declare a descendent of PAbstractList class, customised for a particular object type {\bf T}, and adds functionality that allows the list to be used as a first in first out queue. This macro closes the class declaration off so no additional members can be added. If the compilation is using templates then this macro produces a typedef of the #PQueue# template class. See the #PList# class and #PDECLARE_QUEUE# macro for more information. */#define PQUEUE(cls, T) typedef PQueue<T> cls/**Begin declataion of a queue class. This macro is used to declare a descendent of PAbstractList class, customised for a particular object type {\bf T}, and adds functionality that allows the list to be used as a first in first out queue. If the compilation is using templates then this macro produces a descendent of the #PQueue# template class. If templates are not being used then the macro defines a set of inline functions to do all casting of types. The resultant classes have an identical set of functions in either case. See the #PQueue# and #PAbstractList# classes for more information. */#define PDECLARE_QUEUE(cls, T) \ PQUEUE(cls##_PTemplate, T); \ PDECLARE_CLASS(cls, cls##_PTemplate) \ protected: \ cls(int dummy, const cls * c) \ : cls##_PTemplate(dummy, c) { } \ public: \ cls() \ : cls##_PTemplate() { } \ virtual PObject * Clone() const \ { return PNEW cls(0, this); } \/**This template class maps the PAbstractList to a specific object type, and adds functionality that allows the list to be used as a last in first out stack. The functions in this class primarily do all the appropriate casting of types. By default, objects placed into the set will {\bf not} be deleted when removed or when all references to the set are destroyed. This is different from the default on most collection classes. Note that if templates are not used the #PDECLARE_STACK# macro will simulate the template instantiation. */template <class T> class PStack : public PAbstractList{ PCLASSINFO(PStack, PAbstractList); public: /**@name Construction */ //@{ /**Create a new, empty, stack. Note that by default, objects placed into the stack will {\bf not} be deleted when removed or when all references to the stack are destroyed. This is different from the default on most collection classes. */ PStack() : PAbstractList() { DisallowDeleteObjects(); } //@} /**@name Overrides from class PObject */ //@{ /**Make a complete duplicate of the stack. Note that all objects in the array are also cloned, so this will make a complete copy of the stack. */ virtual PObject * Clone() const { return PNEW PStack(0, this); } //@} /**@name New functions for class */ //@{ /**Add an object to the stack. This object will be on "top" of the stack and will be the object returned by the #Pop()# function. */ virtual void Push( T * obj /// Object to add to the stack. ) { PAbstractList::InsertAt(0, obj); } /**Remove the last object pushed onto the stack. @return object on top of the stack. */ virtual T * Pop() { return (T *)PAbstractList::RemoveAt(0); } /**Get the element that is currently on top of the stack without removing it. @return reference to object on top of the stack. */ virtual T & Top() { PAssert(GetSize() > 0, PStackEmpty); return *(T *)GetAt(0); } //@} protected: PStack(int dummy, const PStack * c) : PAbstractList(dummy, c) { reference->deleteObjects = c->reference->deleteObjects; }};/**Declare a stack class. This macro is used to declare a descendent of PAbstractList class, customised for a particular object type {\bf T}, and adds functionality that allows the list to be used as a last in first out stack. This macro closes the class declaration off so no additional members can be added. If the compilation is using templates then this macro produces a typedef of the #PStack# template class. See the #PStack# class and #PDECLARE_STACK# macro for more information. */#define PSTACK(cls, T) typedef PStack<T> cls/**Begin declaration of a stack class. This macro is used to declare a descendent of PAbstractList class, customised for a particular object type {\bf T}, and adds functionality that allows the list to be used as a last in first out stack. If the compilation is using templates then this macro produces a descendent of the #PStack# template class. If templates are not being used then the macro defines a set of inline functions to do all casting of types. The resultant classes have an identical set of functions in either case. See the #PStack# and #PAbstractList# classes for more information. */#define PDECLARE_STACK(cls, T) \ PSTACK(cls##_PTemplate, T); \ PDECLARE_CLASS(cls, cls##_PTemplate) \ protected: \ cls(int dummy, const cls * c) \ : cls##_PTemplate(dummy, c) { } \ public: \ cls() \ : cls##_PTemplate() { } \ virtual PObject * Clone() const \ { return PNEW cls(0, this); } \#else // PHAS_TEMPLATES#define PLIST(cls, T) \ class cls : public PAbstractList { \ PCLASSINFO(cls, PAbstractList); \ protected: \ inline cls(int dummy, const cls * c) \ : PAbstractList(dummy, c) { } \ public: \ inline cls() \ : PAbstractList() { } \ inline virtual PObject * Clone() const \ { return PNEW cls(0, this); } \ inline T & operator[](PINDEX index) const \ { return (T &)GetReferenceAt(index); } \ }#define PDECLARE_LIST(cls, T) \ PLIST(cls##_PTemplate, T); \ PDECLARE_CLASS(cls, cls##_PTemplate) \ protected: \ cls(int dummy, const cls * c) \ : cls##_PTemplate(dummy, c) { } \ public: \ cls() \ : cls##_PTemplate() { } \ virtual PObject * Clone() const \ { return PNEW cls(0, this); } \#define PQUEUE(cls, T) \ class cls : public PAbstractList { \ PCLASSINFO(cls, PAbstractList); \ protected: \ inline cls(int dummy, const cls * c) \ : PAbstractList(dummy, c) \ { reference->deleteObjects = c->reference->deleteObjects; } \ public: \ inline cls() \ : PAbstractList() { DisallowDeleteObjects(); } \ inline virtual PObject * Clone() const \ { return PNEW cls(0, this); } \ virtual inline void Enqueue(T * t) \ { PAbstractList::Append(t); } \ virtual inline T * Dequeue() \ { if (GetSize() == 0) return NULL; else return (T *)PAbstractList::RemoveAt(0);} \ }#define PDECLARE_QUEUE(cls, T) \ PQUEUE(cls##_PTemplate, T); \ PDECLARE_CLASS(cls, cls##_PTemplate) \ protected: \ cls(int dummy, const cls * c) \ : cls##_PTemplate(dummy, c) { } \ public: \ cls() \ : cls##_PTemplate() { } \ virtual PObject * Clone() const \ { return PNEW cls(0, this); } \#define PSTACK(cls, T) \ class cls : public PAbstractList { \ PCLASSINFO(cls, PAbstractList); \ protected: \ inline cls(int dummy, const cls * c) \ : PAbstractList(dummy, c) \ { reference->deleteObjects = c->reference->deleteObjects; } \ public: \ inline cls() \ : PAbstractList() { DisallowDeleteObjects(); } \ inline virtual PObject * Clone() const \ { return PNEW cls(0, this); } \ virtual inline void Push(T * t) \ { PAbstractList::InsertAt(0, t); } \ virtual inline T * Pop() \ { PAssert(GetSize() > 0, PStackEmpty); return (T *)PAbstractList::RemoveAt(0); } \ virtual inline T & Top() \ { PAssert(GetSize() > 0, PStackEmpty); return *(T *)GetAt(0); } \ }#define PDECLARE_STACK(cls, T) \ PSTACK(cls##_PTemplate, T); \ PDECLARE_CLASS(cls, cls##_PTemplate) \ protected: \ cls(int dummy, const cls * c) \ : cls##_PTemplate(dummy, c) { } \ public: \ cls() \ : cls##_PTemplate() { } \ virtual PObject * Clone() const \ { return PNEW cls(0, this); } \#endif // PHAS_TEMPLATES///////////////////////////////////////////////////////////////////////////////// Sorted List of PObjects/**This class is a collection of objects which are descendents of the #PObject# class. It is implemeted as a Red-Black binary tree to maintain the objects in rank order. Note that this requires that the #PObject::Compare()# function be fully implemented oin objects contained in the collection. The implementation of a sorted list allows fast inserting and deleting as well as random access of objects in the collection. As the objects are being
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -