99 lines
3.2 KiB
C
99 lines
3.2 KiB
C
|
//***************************************************************************
|
||
|
//
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
//
|
||
|
// FLEXARRY.H
|
||
|
//
|
||
|
// CFlexArray and CWStringArray implementation.
|
||
|
//
|
||
|
// This
|
||
|
//
|
||
|
// 15-Jul-97 raymcc This implementation is not based on arenas.
|
||
|
// 8-Jun-98 bobw cleaned up for use with WBEMPERF provider
|
||
|
//
|
||
|
//***************************************************************************
|
||
|
|
||
|
#ifndef _FLEXARRY_H_
|
||
|
#define _FLEXARRY_H_
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
//***************************************************************************
|
||
|
//
|
||
|
// class CFlexArray
|
||
|
//
|
||
|
// This class is a generic pointer array.
|
||
|
//
|
||
|
//***************************************************************************
|
||
|
|
||
|
class CFlexArray
|
||
|
{
|
||
|
private:
|
||
|
int m_nSize; // apparent size
|
||
|
int m_nExtent; // de facto size
|
||
|
int m_nGrowBy;
|
||
|
HANDLE m_hHeap; // heap to hold array
|
||
|
void** m_pArray;
|
||
|
|
||
|
public:
|
||
|
enum { no_error, failed, out_of_memory, array_full, range_error };
|
||
|
|
||
|
// Constructs a flex array at an initial size and
|
||
|
// specifies the initial size and growth-size chunk.
|
||
|
// =================================================
|
||
|
CFlexArray(
|
||
|
IN int nInitialSize = 32,
|
||
|
IN int nGrowBy = 32
|
||
|
);
|
||
|
|
||
|
~CFlexArray();
|
||
|
CFlexArray(CFlexArray &);
|
||
|
CFlexArray& operator=(CFlexArray &);
|
||
|
|
||
|
// Gets an element at a particular location.
|
||
|
// =========================================
|
||
|
void * GetAt(int nIndex) const { return m_pArray[nIndex]; }
|
||
|
|
||
|
// Returns a ptr in the array; allows use on left-hand side of assignment.
|
||
|
// =======================================================================
|
||
|
void * operator[](int nIndex) const { return m_pArray[nIndex]; }
|
||
|
void *& operator[](int nIndex) { return m_pArray[nIndex]; }
|
||
|
|
||
|
// Sets the element at the requested location.
|
||
|
// ===========================================
|
||
|
void SetAt(int nIndex, void *p) { m_pArray[nIndex] = p; }
|
||
|
|
||
|
// Removes an element.
|
||
|
// ====================
|
||
|
int RemoveAt(int nIndex);
|
||
|
int Remove( void* p );
|
||
|
|
||
|
// Inserts an element.
|
||
|
// ===================
|
||
|
int InsertAt(int nIndex, void *);
|
||
|
|
||
|
// Removes all zero entries (null ptrs) and shrinks the array size.
|
||
|
// ================================================================
|
||
|
void Compress();
|
||
|
|
||
|
// Adds a new element to the end of the array.
|
||
|
// ===========================================
|
||
|
int Add(void *pSrc) { return InsertAt(m_nSize, pSrc); }
|
||
|
|
||
|
// Gets the apparent size of the array (number of used elements)
|
||
|
// =============================================================
|
||
|
int Size() const { return m_nSize; }
|
||
|
|
||
|
// Removes all entries and reduces array size to zero. The elements
|
||
|
// are simply removed; not deallocated (this class doesn't know what
|
||
|
// they are).
|
||
|
// =================================================================
|
||
|
void Empty();
|
||
|
|
||
|
// Gets a pointer to the internal array.
|
||
|
// =====================================
|
||
|
void** GetArrayPtr() { return m_pArray; }
|
||
|
};
|
||
|
|
||
|
#endif // __cplusplus
|
||
|
#endif // not defined
|