//*******************************************************************************************
//
// Filename : Dpda.h
//
//Definitions of DPA routines
//
// Copyright 1994 - 1998 Microsoft Corporation. All rights reserved
//
//*******************************************************************************************
#ifndef _DPDA_H_
#define _DPDA_H_
#ifdef __cplusplus
extern "C" {
#endif
// Dynamic pointer array
typedef struct _DPA * HDPA;
HDPA DPA_Create(int cItemGrow);
HDPA DPA_CreateEx(int cpGrow, HANDLE hheap);
BOOL DPA_Destroy(HDPA hdpa);
HDPA DPA_Clone(HDPA hdpa, HDPA hdpaNew);
void * DPA_GetPtr(HDPA hdpa, int i);
int DPA_GetPtrIndex(HDPA hdpa, LPVOID p);
BOOL DPA_Grow(HDPA pdpa, int cp);
BOOL DPA_SetPtr(HDPA hdpa, int i, LPVOID p);
int DPA_InsertPtr(HDPA hdpa, int i, LPVOID p);
void * DPA_DeletePtr(HDPA hdpa, int i);
BOOL DPA_DeleteAllPtrs(HDPA hdpa);
#define DPA_GetPtrCount(hdpa) (*(int *)(hdpa))
#define DPA_GetPtrPtr(hdpa) (*((LPVOID * *)((BYTE *)(hdpa) + sizeof(int))))
#define DPA_FastGetPtr(hdpa, i) (DPA_GetPtrPtr(hdpa)[i])
typedef int (CALLBACK *PFNDPACOMPARE)(LPVOID p1, LPVOID p2, LPARAM lParam);
BOOL DPA_Sort(HDPA hdpa, PFNDPACOMPARE pfnCompare, LPARAM lParam);
typedef struct _DSA * HDSA;
// Search array. If DPAS_SORTED, then array is assumed to be sorted
// according to pfnCompare, and binary search algorithm is used.
// Otherwise, linear search is used.
//
// Searching starts at iStart (-1 to start search at beginning).
//
// DPAS_INSERTBEFORE/AFTER govern what happens if an exact match is not
// found. If neither are specified, this function returns -1 if no exact
// match is found. Otherwise, the index of the item before or after the
// closest (including exact) match is returned.
//
// Search option flags
//
#define DPAS_SORTED 0x0001
#define DPAS_INSERTBEFORE 0x0002
#define DPAS_INSERTAFTER 0x0004
int DPA_Search(HDPA hdpa, LPVOID pFind, int iStart,
PFNDPACOMPARE pfnCompare,
LPARAM lParam, UINT options);
#ifdef __cplusplus
}
#endif
#endif // _DPDA_H_