reman3/Rayman_X/cpa/public/ITF/CpaListB.hpp

251 lines
18 KiB
C++

/*******************************************************************************/
/** CpaListB.hpp **/
/*******************************************************************************/
/** **/
/** Definition of the CPA_BaseObjectList class : list of CPA_BaseObject with **/
/** different sort orders and fast search functions. **/
/** **/
/*******************************************************************************/
/** Author : Yann Le Tensorer, Alexis Vaisse **/
/*******************************************************************************/
#ifndef __CPABLIST_HPP__
#define __CPABLIST_HPP__
#ifdef ACTIVE_EDITOR
/****************************************/
#ifndef CPA_EXPORT
#if defined(CPA_WANTS_IMPORT)
#define CPA_EXPORT __declspec(dllimport)
#elif defined(CPA_WANTS_EXPORT)
#define CPA_EXPORT __declspec(dllexport)
#else
#define CPA_EXPORT
#endif
#endif
/****************************************/
#include "Lst.hpp"
class CPA_BaseObject;
typedef CPA_BaseObject * tdp_BaseObjectPointer;
typedef long Position;
typedef enum eListOrder_
{
E_lo_Object ,
E_lo_First = E_lo_Object , /* Sort by adress of the CPA_BaseObject (to quickly find an object)*/
E_lo_Type , /* Sort by type*/
E_lo_Data , /* Sort by adress of the data*/
E_lo_Owner , /* Sort by adress of the owner*/
E_lo_Alpha , /* Sort by alphabetic order*/
E_lo_Common , /* Specific order*/
E_lo_Edited , /* Specific order*/
E_lo_Last = E_lo_Edited
}
tdeListOrder;
#define NO_CRITERIA ((CPA_BaseObject *) -1)
#define C_lNumberOfLists (E_lo_Last + 1)
#define E_lo_GoThrough E_lo_Edited /* When we go through the list with GetNext..., we use the E_lo_Edited order*/
/*---------------------------------*/
class CPA_EXPORT CPA_BaseObjectList
{
private:
CString m_csTypeName; /* Type name of the list. Can be ""*/
char * m_szTypeName; /* Same string, with a char **/
long m_lNumberOfObjects; /* Number of objects in the list*/
long m_lMaxNumberOfObjects; /* Maximum number of objects in the list (that is the size*/
/* of m_lIndexArray). If one try to add one more object,*/
long m_lCurrentUniqueIndex;
/* The array will have to be reallocated*/
tdp_BaseObjectPointer * m_Array [C_lNumberOfLists]; /* Contains the list of pointers to CPA_ObjectBase sorted*/
/* for each order. The actual size of the array is m_lMaxNumberOfObjects*/
/* --- Low level functions ---*/
void ReallocArray (long _lNewSize); /* Change the size of the arrray*/
long fn_lDichoSearchName (CPA_BaseObject** _List , unsigned long _ListSize , char * _NameToFind , BOOL * _bFound , CPA_BaseObject * _BaseObjectToFind = NULL);
/* Low level function to find an object with a given name in a given list*/
long fn_lDichoSearchType (CPA_BaseObject** _List, unsigned long _ListSize, char* _TypeToFind,BOOL* _bFound , CPA_BaseObject * _BaseObjectToFind = NULL);
/* Low level function to find an object with a given type in a given list*/
long fn_lDichoSearchData (CPA_BaseObject** _List, unsigned long _ListSize, void* _DataToFind,BOOL* _bFound , CPA_BaseObject * _BaseObjectToFind = NULL);
/* Low level function to find an object with a given data in a given list*/
long fn_lDichoSearchOwner (CPA_BaseObject** _List, unsigned long _ListSize, CPA_BaseObject* _OwnerToFind,BOOL* _bFound , CPA_BaseObject * _BaseObjectToFind = NULL);
/* Low level function to find an object with a given owner in a given list*/
long fn_lDichoSearchBaseObject (CPA_BaseObject** _List, unsigned long _ListSize, CPA_BaseObject* _BaseObjectToFind,BOOL* _bFound);
/* Low level function to find the index of an object in a given list*/
long fn_lDichoSearchNamesTypesOwners( /* Low level function to find objects with a given name, an optional type and an optional owner*/
CPA_List<CPA_BaseObject> *_p_oReturnList,
CPA_BaseObject** _p_oList,
unsigned long _ulListSize,
BOOL* _p_bFound,
char* _Name,
char* _type=NULL,
CPA_BaseObject* _Owner=NO_CRITERIA);
long fn_lDichoSearchOwnersAndTypes( /* Low level function to find objects with a given owner and an optional type*/
CPA_List<CPA_BaseObject> * _p_oReturnList,
CPA_BaseObject** _p_oList,
unsigned long _ulListSize,
BOOL* _p_bFound,
CPA_BaseObject* _Owner,
char* _type=NULL);
long fn_lDichoSearchNameTypeOwner( /* Low level function to find an object with a given name, an optional type and an optional owner*/
CPA_BaseObject** _p_oList,
unsigned long _ulListSize,
BOOL* _bFound,
char* _NameToFind,
char* _type=NULL,
CPA_BaseObject* _Owner=NO_CRITERIA
);
long fn_lDichoSearchDataTypeOwner( /* Low level function to find an object with a given data, an optional type and an optional owner*/
CPA_BaseObject** _p_oList,
unsigned long _ulListSize,
BOOL* _bFound,
void* _data,
char* _type=NULL,
CPA_BaseObject* _Owner=NO_CRITERIA
);
/* --- Medium level functions ---*/
long FindObjectWithType (CPA_List<CPA_BaseObject> * _p_oList ,
const CString _csTypeName); /* Return all the objects of the list with the given type*/
long FindIndex (tdeListOrder _eListOrder , CPA_BaseObject * _p_oObject , BOOL * _bExist);
/* Return the index of an object into a list with a given order*/
/* If the object is into the list, set _bExist to TRUE and return the index*/
/* If not, set _bExist to FALSE and return the index where to insert the object*/
void InsertObjectInList (tdeListOrder _eListOrder , CPA_BaseObject * _p_oObject , long _lIndex);
/* Insert the give object into the given list in the given Position*/
/* Shift the index after this Position*/
void RemoveObjectFromList (tdeListOrder _eListOrder , long _lIndex);
/* Remove the given index from the given list*/
/* Shift the index after this Position*/
void MoveIndexInList (tdeListOrder _eListOrder , long _lOldIndex , long _lNewIndex);
/* Move an object from one Position to another inside a given list*/
public:
/* --- Construction and destruction ---*/
CPA_BaseObjectList (const CString _csTypeName = ""); /* Constructor*/
~CPA_BaseObjectList (); /* Destructor*/
void DeleteAllElements (); /* Empty the list but do not delete the CPA_BaseObject*/
void DeleteAllObjects (); /* Empty the list and delete all CPA_BaseObject*/
/* --- Type ---*/
CString fn_csGetTypeName () { return m_csTypeName; } /* Return the type name of the list, "" for no type*/
char * fn_szGetTypeName () { return m_szTypeName; } /* Same string with a char **/
BOOL fn_bIsOfType (const CString _csTypeName) ; /* Return TRUE if the list is of the given type*/
/* --- Add and remove objects ---*/
BOOL fn_bAddObject (CPA_BaseObject * _p_oObject); /* Insert an object into the list.*/
/* If the list has a type and the object has not the same type -> ASSERT*/
/* If the object is already in the list, return FALSE*/
/* Else insert the object into the list and return TRUE*/
BOOL fn_bRemoveObject (CPA_BaseObject * _p_oObject); /* Remove an object from the list*/
/* If the object is not into the list, return FALSE*/
/* Else remove the object from the list and return TRUE*/
/* --- Get functions ---*/
long GetCount () { return m_lNumberOfObjects; } /* Return the number of objects in the list*/
CPA_BaseObject * GetObjectWithIndex (long _lIndex , tdeListOrder _eListOrder = E_lo_GoThrough);
/* Return the object with the given index into the given sort order*/
long GetIndexOfObject (CPA_BaseObject * _p_oObject ,
tdeListOrder _eListOrder); /* Return the index (between 0 et GetCount () - 1) of a given object*/
/* for a specific order (must be E_lo_Common or E_lo_Edited)*/
/* If the object is not into the list, return -1*/
/* Do not use this function too much, because it is slower than the others*/
/* --- Search functions ---*/
BOOL fn_bExist (CPA_BaseObject * _p_oObject); /* Return TRUE if the object is into the list*/
BOOL fn_bExist (const CString _csObjectName , /* Return TRUE if there is an object with the given name,*/
const CString _csTypeName = "" , /* eventually with the given type and the given owner*/
CPA_BaseObject * _p_oOwner = NO_CRITERIA);/* into the list*/
long fn_lFindObjects (CPA_List<CPA_BaseObject> * _p_oList , /* Find object from the list, put them into _p_oList*/
const CString _csObjectName , /* and return the number of found objects*/
const CString _csTypeName = "" ,
CPA_BaseObject * _p_oOwner = NO_CRITERIA);
CPA_BaseObject * fn_p_oFindObject /* Find an object from the list with the given name,*/
(const CString _csObjectName , /* eventually the given type and the given owner */
const CString _csTypeName = "" , /* If the object is into the list, return it*/
CPA_BaseObject * _p_oOwner = NO_CRITERIA); /* Else return NULL*/
CPA_BaseObject * fn_p_oFindObjectWithdData /* Find an object from the list with the given data,*/
(void * _p_vData , /* eventually the given type and the given owner*/
const CString _csTypeName = "" , /* If the object is into the list, return it*/
CPA_BaseObject * _p_oOwner = NO_CRITERIA); /* Else return NULL*/
/* --- Change order ---*/
void fn_vBeforeChangingObjectName (CPA_BaseObject * _p_oObject , /* Before changing the name of a CPA_BaseObject, one must*/
char * _szNewName); /* call this function to reorganize the alphabetic order sorted list*/
void fn_vBeforeChangingObjectData (CPA_BaseObject * _p_oObject , /* Before changing the data of a CPA_BaseObject, one must*/
void * _pNewData); /* call this function to reorganize the list*/
void fn_vBeforeChangingObjectOwner (CPA_BaseObject * _p_oObject ,/* Before changing the owner of a CPA_BaseObject, one must*/
CPA_BaseObject * _pNewOwner); /* call this function to reorganize the list*/
void fn_vExchangeObjectOrder (long _lIndex1 , /* Exchange two objects in a specific order*/
long _lIndex2 , /* (must be E_lo_Common or E_lo_Edited)*/
tdeListOrder _eListOrder);
void fn_vChangeObjectOrder (long _lOldIndex , /* Change the position in a specific order sorted list of*/
long _lNewIndex , /* an object (which must already be in the list)*/
tdeListOrder _eListOrder); /* Shift objects if necessary*/
/* (must be E_lo_Common or E_lo_Edited)*/
BOOL fn_bExchangeObjectOrder (CPA_BaseObject * _p_oObject1 , /* Exchange two objects in a specific order*/
CPA_BaseObject * _p_oObject2 , /* (must be E_lo_Common or E_lo_Edited)*/
tdeListOrder _eListOrder); /* If you know the index of the two objects in the list*/
/* (without calling the GetIndexOfObject function),*/
/* call the fn_vExchangeObjectOrder function which is faster*/
/* Return FALSE if one object is not in the list, else return TRUE*/
BOOL fn_bChangeObjectOrder (CPA_BaseObject* _p_oObject , /* Change the position in a specific order sorted list of*/
long _lNewIndex , /* an object. Shift objects if necessary (must be E_lo_Common*/
tdeListOrder _eListOrder); /* or E_lo_Edited). If you know the old index if the object in*/
/* the list (without calling the GetIndexOfObject function),*/
/* call the fn_vChangingObjectOrder function which is faster*/
/* Return FALSE if the object is not in the list, else return TRUE*/
void fn_vReSortListWithAlphaOrder (); /* If some objects may have been renamed without calling the*/
/* fn_vBeforeChangingObjectName function, call this function to sort the list*/
void fn_vReSortListWithDataOrder (); /* If data of some objects may have been changed without calling the*/
/* fn_vBeforeChangingObjectData function, call this function to sort the list*/
void fn_vReSortListWithOwnerOrder (); /* If owner of some objects may have been changed without calling the*/
/* fn_vBeforeChangingObjectOwner function, call this function to sort the list*/
void fn_vReSortList (); /* Call the three previous functions*/
/* --- To go through the list*/
Position GetHeadPosition () { return m_lNumberOfObjects ? 1 : 0; }
CPA_BaseObject * GetHead () { return m_Array [E_lo_GoThrough] [0]; }
CPA_BaseObject * GetHeadElement (Position & _Position);
Position GetTailPosition () { return m_lNumberOfObjects; }
CPA_BaseObject * GetTail () { return m_Array [E_lo_GoThrough] [m_lNumberOfObjects - 1]; }
CPA_BaseObject * GetTailElement (Position & _Position);
CPA_BaseObject * GetAt (Position _Position) { return m_Array [E_lo_GoThrough] [_Position - 1]; }
CPA_BaseObject * GetAtElement (Position _Position) { return m_Array [E_lo_GoThrough] [_Position - 1]; }
CPA_BaseObject * GetNext (Position & _Position);
CPA_BaseObject * GetNextElement (Position & _Position);
CPA_BaseObject * GetPrev (Position & _Position);
CPA_BaseObject * GetPrevElement (Position & _Position);
CPA_BaseObject * operator[] (long _lIndex) { return m_Array [E_lo_GoThrough] [_lIndex]; }
/* --- To get a new name*/
CString GetNewName (const CString csDefaultBaseName = "");
};
#endif /* ACTIVE_EDITOR*/
#endif /* __CPABLIST_HPP__*/