📄 lists.h
字号:
Element * lastElement; PINDEX lastIndex; } * info;};#ifdef PHAS_TEMPLATES/**This template class maps the PAbstractList to a specific object type. The functions in this class primarily do all the appropriate casting of types. Note that if templates are not used the #PDECLARE_LIST# macro will simulate the template instantiation. */template <class T> class PList : public PAbstractList{ PCLASSINFO(PList, PAbstractList); public: /**@name Construction */ //@{ /**Create a new, empty, list. Note that by default, objects placed into the list will be deleted when removed or when all references to the list are destroyed. */ PList() : PAbstractList() { } //@} /**@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 PList(0, this); } //@} /**@name New functions for class */ //@{ /**Retrieve a reference to the object in the list. If there was not an 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, PList<T>) \ protected: \ cls(int dummy, const cls * c) \ : PList<T>(dummy, c) { } \ public: \ cls() \ : PList<T>() { } \ 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() { } \ 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(); } \ virtual PObject * Clone() const \ { return PNEW cls(0, this); } \ virtual void Enqueue(T * t) \ { PAbstractList::Append(t); } \ virtual 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(); } \ virtual PObject * Clone() const \ { return PNEW cls(0, this); } \ virtual void Push(T * t) \ { PAbstractList::InsertAt(0, t); } \ virtual T * Pop() \ { PAssert(GetSize() > 0, PStackEmpty); return (T *)PAbstractList::RemoveAt(0); } \ virtual T & Top() \ { PAssert(GetSize() > 0, PStackEmpty); return *(T *)GetAt(0); } \ }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -