123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
-
- #ifndef cmDList_h
- #define cmDList_h
-
- #ifdef __cplusplus
- extern "C" {
- #endif
-
- //( { file_desc:"Dynamic generic array with user programmable indexing and sorting capablity." kw:[container] }
-
- enum
- {
- kOkDlRC = cmOkRC,
- kDuplicateIndexIdDlRC,
- kInvalidIndexDlRC,
- kIterNotFoundDlRC,
- kDataRecdNotFoundDlRC,
-
- };
-
- typedef unsigned cmDlRC_t;
- typedef cmHandle_t cmDListH_t;
- typedef cmHandle_t cmDListIterH_t;
-
- extern cmDListH_t cmDListNullHandle;
- extern cmDListIterH_t cmDListIterNullHandle;
-
- // Return < 0 if v0 < v1
- // == 0 if v0 == v1
- // > 0 if v0 > v1
- typedef int (*cmDListCmpFunc_t)( void* arg, const void* v0, unsigned v0N, const void* v1, unsigned v1N );
-
- typedef void (*cmDListIndexFreeFunc_t)( unsigned indexId, void* arg );
-
- // If 'cmpFunc' is not NULL then a default index with an indexId==0 will be automatically created.
- cmDlRC_t cmDListAlloc( cmCtx_t* ctx, cmDListH_t* hp, cmDListCmpFunc_t cmpFunc, void* funcArg );
- cmDlRC_t cmDListFree( cmDListH_t* hp );
- bool cmDListIsValid( cmDListH_t h );
-
- // Set resyncFl to automatically update the indexes to reflect the new record, otherwise
- // cmDListIndexUpdateAll() should be called to resynchronize the data list to the indexes.
- // If many inserts are to be performed with no intervening accesses to the list then it
- // is more efficient to defer updating the indexes until all the inserts are completed.
- cmDlRC_t cmDListInsert( cmDListH_t h, const void* recd, unsigned recdByteN, bool resyncFl );
-
- // Delete a data record.
- // 'recd' should be set to a value returned via one of the iterator accessors.
- // If 'resyncFl' is set then the indexes and interators will be
- // automatically synchronized with the data list after the deletion.
- // If 'resyncFl' is not set then the client must call cmDListIndexUpdateAll()
- // to resynchronize the indexes and iterators after the deletion.
- // Note that if multiple records are to be deleted without intervening accesses
- // to the list then it is more efficient to defer update the indexes until
- // all the deletions are completed.
- cmDlRC_t cmDListDelete( cmDListH_t h, const void* recd, bool resyncFl );
-
- // Allocate a new index. 'indexId' is used to identify this index and must be unique among all
- // previously allocated indexes.
- cmDlRC_t cmDListIndexAlloc( cmDListH_t h, unsigned indexId, cmDListCmpFunc_t cmpFunc, void* funcArg );
- cmDlRC_t cmDListIndexFree( cmDListH_t h, unsigned indexId );
-
- // Refresh all the indexes. This function should be called after new records are inserted
- // via cmDListInsert(..,false).
- cmDlRC_t cmDListIndexUpdateAll( cmDListH_t h );
-
- // Set a function to be called when indexes are released.
- cmDlRC_t cmDListIndexSetFreeFunc(cmDListH_t h, unsigned indexId, cmDListIndexFreeFunc_t func );
-
- // Allocate an interator. By default the new iterator is pointing to the first record
- // in the index identified by 'indexId'.
- cmDlRC_t cmDListIterAlloc( cmDListH_t h, cmDListIterH_t* iHp, unsigned indexId );
- cmDlRC_t cmDListIterFree( cmDListIterH_t* iHp );
- bool cmDListIterIsValid( cmDListIterH_t iH );
-
- // Set the current iteration location to the begin/end of the index it is attached to.
- cmDlRC_t cmDListIterSeekBegin( cmDListIterH_t iH );
- cmDlRC_t cmDListIterSeekEnd( cmDListIterH_t iH );
-
- // Return the current record this iterator is pointing to.
- const void* cmDListIterGet( cmDListIterH_t iH, unsigned* recdByteNRef );
-
- // Return the current record this iterator is pointint to and advance the iterator.
- const void* cmDListIterPrev( cmDListIterH_t iH, unsigned* recdByteNRef );
- const void* cmDListIterNext( cmDListIterH_t iH, unsigned* recdByteNRef );
-
- // Make the record which matches 'key' the current iterator.
- // The match is made by using the compare function which is assigned to the index
- // which this iterator is attached to.
- const void* cmDListIterFind( cmDListIterH_t iH, const void* key, unsigned keyN, unsigned* recdByteNRef);
-
- //)
- #ifdef __cplusplus
- }
- #endif
-
- #endif
|