lists.h
来自「开源代码的pwlib的1.10.0版本,使用openh323的1.18.0版本毕」· C头文件 代码 · 共 1,187 行 · 第 1/3 页
H
1,187 行
Element * head;
Element * tail;
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 + =
减小字号Ctrl + -
显示快捷键?