/************************************************************************* * * * DYNARRAY.C * * * * Copyright (C) Microsoft Corporation 1994-1995 * * All Rights reserved. * * * * This library implements a robust dynamic array scheme. It replaces the * * old DRG structure and should probably also replace the MR. * * The total size of the array is NOT limited to 64K since it uses * * Binh's threaded block memory manager to add new elements. Therefore it * * should work correctly on both 16- and 32-bit platforms for any number * * of elements. * * * * Items in the array are assumed to be of a fixed size, which is defined * * when the array is first initialized. To speed up the common operation * * of forward enumeration, the next element function/macro is provided. * * * * There are two types of lists possible: normal, and single-block * * Use single-block for better space and possible more efficient time * * usage when you know that your entire array will fit within a block. * * Allocations beyond the one block limit will return NULL. * * * * The first member of any element in the array MUST be an LPVOID. * * * UNIMPLEMENTED: Insert into, delete * ************************************************************************** * * ************************************************************************** * * * Written By : KevynCT * * Current Owner: KevynCT * * * **************************************************************************/ #ifndef __DYNARRAY_H__ #define __DYNARRAY_H__ #if defined( __cplusplus ) extern "C" { #endif #define CALC_BLOCK_SIZE(x, y) (sizeof(x) * (y)) #define DEFAULT_BLOCK_MAX ((WORD)0xFFFF) #define DynArrayValid(lpdl) ((lpdl)->lpBlockHead) #define DynArrayGetNumElts(lpdl) ((lpdl)->cFoo) #define DynArrayEmpty(lpdl) ((lpdl)->cFoo == 0) #define DynArraySingleBlockGetNumElts(lpdl) ((lpdl)->cFoo) #define DynArrayGetFirstElt(lpdl) ((lpdl)->lpFooCache = (lpdl)->lpFooHead) #define DynArraySingleBlockGetFirstElt(lpdl) ((lpdl)->lpFooHead) #define DynArrayGetCurElt(lpdl) ((lpdl)->lpFooCache) #define DynArraySingleBlockGetCurElt(lpdl) ((lpdl)->lpFooCache) #define DynArraySetCurElt(lpdl, lpv) ((lpdl)->lpFooCache = (lpv)) #define DynArraySingleBlockSetCurElt(lpdl, lpv) ((lpdl)->lpFooCache = (lpv)) #define DynArrayNextElt(lpdl) ((lpdl)->lpFooCache = *(LPVOID FAR *)((lpdl)->lpFooCache)) #define DYN_ARRAY_SINGLEBLOCK 0x00000001 #define DynArrayEltCopy(lpdest, lpsrc, size) MEMCPY(((LPBYTE)(lpdest)) + sizeof(LPVOID), \ ((LPBYTE)(lpsrc)) + sizeof(LPVOID), size - sizeof(LPVOID)) // init using some default settings #define DynArrayInitDef(lpdl, s, wAvg) \ DynArrayInit(lpdl, CALC_BLOCK_SIZE(s, wAvg), DEFAULT_BLOCK_MAX, sizeof(s), 0) // DFL elements: typedef struct tagDL { LPBLK lpBlockHead; // the linked list of blocks for this list WORD cbFoo; // the (fixed) size of the list elements WORD cFooPerBlock; DWORD cFoo; DWORD dwFlags; LPVOID lpFooHead; // the first element of the linked list LPVOID lpFooFree; // the next free element of the linked list LPVOID lpFooCache; // the last element accessed by an element method. } DL, FAR *LPDL; ///// ordinary (multi-block) arrays BOOL PASCAL FAR DynArrayInit(LPDL lpdl, DWORD BlockSize, WORD cMaxBlock, WORD wElemSize, DWORD dwFlags); LPVOID PASCAL FAR DynArrayAppendElt(LPDL lpdl); LPVOID PASCAL FAR DynArrayGetOrdinalElt(LPDL lpdl, DWORD dwEltIndex); //_inline LPVOID PASCAL FAR DynArrayNextElt(LPDL lpdl); LPVOID PASCAL FAR DynArrayClearElt(LPDL lpdl); VOID PASCAL FAR DynArrayFree(LPDL lpdl); VOID PASCAL FAR DynArrayReset(LPDL lpdl); ///// single-block arrays #ifdef SINGLE_BLOCK BOOL PASCAL FAR DynArraySingleBlockInit(LPDL lpdl, DWORD BlockSize, WORD wElemSize, DWORD dwFlags); LPVOID PASCAL FAR DynArraySingleBlockAppendElt(LPDL lpdl); LPVOID PASCAL FAR DynArraySingleBlockGetOrdinalElt(LPDL lpdl, DWORD dwEltIndex); _inline LPVOID PASCAL FAR DynArraySingleBlockNextElt(LPDL lpdl); #define DynArraySingleBlockClearElt(lpdl) DynArrayClearElt(lpdl) #define DynArraySingleBlockFree(lpdl) DynArrayFree(lpdl) #define DynArraySingleBlockReset(lpdl) DynArrayReset(lpdl) #endif #if defined( __cplusplus ) } #endif #endif // __DYNARRAY_H__