105 lines
4.9 KiB
C
105 lines
4.9 KiB
C
/*************************************************************************
|
|
* *
|
|
* 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__
|