PAbstractList Class Reference

#include <lists.h>

Inheritance diagram for PAbstractList:

PCollection PContainer PObject PList< T > PQueue< T > PStack< T > PStringList List of all members.

Public Member Functions

virtual Comparison Compare (const PObject &obj) const
Construction
PINLINE PAbstractList ()
Overrides from class PContainer
virtual PBoolean SetSize (PINDEX newSize)
Overrides from class PCollection
virtual PINDEX Append (PObject *obj)
virtual PINDEX Insert (const PObject &before, PObject *obj)
virtual PINDEX InsertAt (PINDEX index, PObject *obj)
virtual PBoolean Remove (const PObject *obj)
virtual PObjectRemoveAt (PINDEX index)
virtual PBoolean SetAt (PINDEX index, PObject *val)
virtual PBoolean ReplaceAt (PINDEX index, PObject *val)
virtual PObjectGetAt (PINDEX index) const
virtual PINDEX GetObjectsIndex (const PObject *obj) const
virtual PINDEX GetValuesIndex (const PObject &obj) const

Protected Types

typedef PListElement Element

Protected Member Functions

PINLINE PObjectGetReferenceAt (PINDEX index) const
PBoolean SetCurrent (PINDEX index, PListElement *&lastElement) const
PObjectRemoveElement (PListElement *element)

Protected Attributes

PListInfoinfo

Detailed Description

This class is a collection of objects which are descendents of the PObject# class. It is implemeted as a doubly linked list.

The implementation of a list allows very fast inserting and deleting of objects in the collection, but has severe penalties for random access. All object access should be done sequentially to avoid these speed penalties.

The class remembers the last accessed element. This state information is used to optimise access by the "virtual array" model of collections. If access via ordinal index is made sequentially there is little overhead.

The PAbstractList class would very rarely be descended from directly by the user. The PDECLARE_LIST# and PLIST# macros would normally be used to create descendent classes. They will instantiate the template based on PList# or directly declare and define the class (using inline functions) if templates are not being used.

The PList# class or PDECLARE_LIST# macro will define the correctly typed operators for subscript access (operator[]#).


Member Typedef Documentation

typedef PListElement PAbstractList::Element [protected]


Constructor & Destructor Documentation

PINLINE PAbstractList::PAbstractList (  ) 

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.


Member Function Documentation

virtual PINDEX PAbstractList::Append ( PObject obj  )  [virtual]

Append a new object to the collection. This places a new link at the "tail" of the list.

Returns:
index of the newly added object.
Parameters:
obj  New object to place into the collection.

Implements PCollection.

virtual Comparison PAbstractList::Compare ( const PObject obj  )  const [virtual]

Get the relative rank of the two lists. The following algorithm is employed for the comparison: {description} [EqualTo#] if the two lists are identical in length and each objects values, not pointer, are equal.

[LessThan#] if the instances object value at an ordinal position is less than the corresponding objects value in the obj# parameters list.

This is also returned if all objects are equal and the instances list length is less than the obj# parameters list length.

[GreaterThan#] if the instances object value at an ordinal position is greater than the corresponding objects value in the obj# parameters list.

This is also returned if all objects are equal and the instances list length is greater than the obj# parameters list length. {description}

Returns:
comparison of the two objects, EqualTo# for same, LessThan# for obj# logically less than the object and GreaterThan# for obj# logically greater than the object.

Reimplemented from PObject.

virtual PObject* PAbstractList::GetAt ( PINDEX  index  )  const [virtual]

Get the object at the specified ordinal position. If the index was greater than the size of the collection then NULL is returned.

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.

Returns:
pointer to object at the specified index.
Parameters:
index  Index position in the collection of the object.

Implements PCollection.

virtual PINDEX PAbstractList::GetObjectsIndex ( const PObject obj  )  const [virtual]

Search the collection for the specific instance of the object. The object pointers are compared, not the values. A simple linear search from "head" of the list is performed.

Returns:
ordinal index position of the object, or P_MAX_INDEX.
Parameters:
obj  Object to find.

Implements PCollection.

PINLINE PObject & PAbstractList::GetReferenceAt ( PINDEX  index  )  const [protected]

Get the object at the specified ordinal position. If the index was greater than the size of the collection then this 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.

Returns:
reference to object at the specified index.
Parameters:
index  Ordinal index of the list element to set as current.

virtual PINDEX PAbstractList::GetValuesIndex ( const PObject obj  )  const [virtual]

Search the collection for the specified value of the object. The object values are compared, not the pointers. So the objects in the collection must correctly implement the PObject::Compare()# function. A simple linear search from "head" of the list is performed.

Returns:
ordinal index position of the object, or P_MAX_INDEX.
Parameters:
obj  Object to find value of.

Implements PCollection.

virtual PINDEX PAbstractList::Insert ( const PObject before,
PObject obj 
) [virtual]

Insert a new object immediately before the specified object. If the object to insert before is not in the collection then the equivalent of the Append()# function is performed.

Note that the object values are compared for the search of the before# parameter, not the pointers. So the objects in the collection must correctly implement the PObject::Compare()# function.

Returns:
index of the newly inserted object.
Parameters:
before  Object value to insert before.
obj  New object to place into the collection.

Implements PCollection.

virtual PINDEX PAbstractList::InsertAt ( PINDEX  index,
PObject obj 
) [virtual]

Insert a new object at the specified ordinal index. If the index is greater than the number of objects in the collection then the equivalent of the Append()# function is performed.

Returns:
index of the newly inserted object.
Parameters:
index  Index position in collection to place the object.
obj  New object to place into the collection.

Implements PCollection.

virtual PBoolean PAbstractList::Remove ( const PObject obj  )  [virtual]

Remove the object from the collection. If the AllowDeleteObjects option is set then the object is also deleted.

Returns:
PTrue if the object was in the collection.
Parameters:
obj  Existing object to remove from the collection.

Implements PCollection.

virtual PObject* PAbstractList::RemoveAt ( PINDEX  index  )  [virtual]

Remove the object at the specified ordinal index from the collection. If the AllowDeleteObjects option is set then the object is also deleted.

Note if the index is beyond the size of the collection then the function will assert.

Returns:
pointer to the object being removed, or NULL if it was deleted.
Parameters:
index  Index position in collection to place the object.

Implements PCollection.

PObject* PAbstractList::RemoveElement ( PListElement element  )  [protected]

virtual PBoolean PAbstractList::ReplaceAt ( PINDEX  index,
PObject val 
) [virtual]

Set the object at the specified ordinal position to the new value. This will overwrite the existing entry. If the AllowDeleteObjects option is set then the old object is also deleted.

Note if the index is beyond the size of the collection then the function will assert.

Returns:
PTrue if the object was successfully replaced.
Parameters:
index  Index position in collection to set.
val  New value to place into the collection.

virtual PBoolean PAbstractList::SetAt ( PINDEX  index,
PObject val 
) [virtual]

Set the object at the specified ordinal position to the new value. This will overwrite the existing entry. This method will NOT delete the old object independently of the AllowDeleteObjects option. Use ReplaceAt()# instead.

Note if the index is beyond the size of the collection then the function will assert.

Returns:
PTrue if the object was successfully added.
Parameters:
index  Index position in collection to set.
val  New value to place into the collection.

Implements PCollection.

PBoolean PAbstractList::SetCurrent ( PINDEX  index,
PListElement *&  lastElement 
) const [protected]

Move the internal "cursor" to the index position specified. This function will optimise the sequential move taking into account the previous current position and the position at the head and tail of the list. Whichever of these three points is closes is used as the starting point for a sequential move to the required index.

Returns:
PTrue if the index could be set as the current element.
Parameters:
index  Ordinal index of the list element to set as current.
lastElement  pointer to final element

virtual PBoolean PAbstractList::SetSize ( PINDEX  newSize  )  [virtual]

This function is meaningless for lists. The size of the collection is determined by the addition and removal of objects. The size cannot be set in any other way.

Returns:
Always PTrue.
Parameters:
newSize  New size for the list, this is ignored.

Implements PContainer.


Member Data Documentation

PListInfo* PAbstractList::info [protected]


The documentation for this class was generated from the following files:
Generated on Thu May 27 01:36:48 2010 for PTLib by  doxygen 1.4.7