Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

182 lines
4.3 KiB

//+------------------------------------------------------------
//
// Copyright (C) 1998, Microsoft Corporation
//
// File: simparray.h
//
// Contents: Simple growable array class
//
// Classes: CSimpArray
//
// Functions:
//
// History:
// jstamerj 1998/07/14 11:30:13: Created.
//
//-------------------------------------------------------------
#ifndef __SIMPARRAY_H__
#define __SIMPARRAY_H__
#include <windows.h>
#include "spinlock.h"
#include <dbgtrace.h>
//
// If you want this array to behave as follows:
// When Inserting an array element and the allocated array size is
// not sufficient,
// Alloc an array size of CSIMPARRAY_DEFAULT_INITIAL_SIZE the
// first time
// Double the current array size until sufficient thereafter
// Then define CSIMPARRAY_DOUBLE and CSIMPARRAY_DEFAULT_INITIAL_SIZE
//
// Otherwise, it will allocate only as much space as needed when
// needed.
//
// Define this to attempt to double the array size when reallocing is necessary
//#undef CSIMPARRAY_DOUBLE
// Default initial allocation
//#undef CSIMPARRAY_DEFAULT_INITIAL_SIZE 20
//+------------------------------------------------------------
//
// Class: CSimpArray
//
// Synopsis: Simple array class with usefull msgcat utility functions
//
// Hungarian: csa, pcsa
//
// History:
// jstamerj 1998/07/15 12:15:50: Created.
//
//-------------------------------------------------------------
template <class T> class CSimpArray
{
public:
CSimpArray();
~CSimpArray();
// Optinal Initialize function - reserves array memory for a
// specified array size
HRESULT Initialize(DWORD dwSize);
// Add one element to the array
HRESULT Add(T Data);
// Add a real array to this array
HRESULT AddArray(DWORD dwSize, T *pData);
// Number of valid elements added to the array
DWORD Size();
// Direct access to the array
operator T * ();
private:
HRESULT AllocArrayRange(DWORD dwSize, PDWORD pdwIndex);
HRESULT ReAllocArrayIfNecessary(DWORD dwSize);
#define SIGNATURE_CSIMPARRAY (DWORD)'SArr'
#define SIGNATURE_CSIMPARRAY_INVALID (DWORD) 'XArr'
DWORD m_dwSignature;
DWORD m_dwArrayAllocSize;
DWORD m_dwArrayClaimedSize;
DWORD m_dwArrayValidSize;
T * m_rgData;
SPIN_LOCK m_slAllocate;
};
//+------------------------------------------------------------
//
// Function: CSimpArray::CSimpArary (constructor)
//
// Synopsis: Initialize member data
//
// Arguments: NONE
//
// Returns: NOTHIGN
//
// History:
// jstamerj 1998/07/14 11:39:08: Created.
//
//-------------------------------------------------------------
template <class T> inline CSimpArray<T>::CSimpArray()
{
m_dwSignature = SIGNATURE_CSIMPARRAY;
m_dwArrayAllocSize = m_dwArrayClaimedSize = m_dwArrayValidSize = 0;
m_rgData = NULL;
InitializeSpinLock(&m_slAllocate);
}
//+------------------------------------------------------------
//
// Function: CSimpArray::~CSimpArray (destructor)
//
// Synopsis: Free's memory
//
// Arguments: NONE
//
// Returns: NOTHING
//
// History:
// jstamerj 1998/07/14 12:19:10: Created.
//
//-------------------------------------------------------------
template <class T> inline CSimpArray<T>::~CSimpArray()
{
_ASSERT(m_dwSignature == SIGNATURE_CSIMPARRAY);
m_dwSignature = SIGNATURE_CSIMPARRAY_INVALID;
delete m_rgData;
}
//+------------------------------------------------------------
//
// Function: CSimpArray::operator T*
//
// Synopsis: Returns pointer to the array
//
// Arguments: NONE
//
// Returns: pointer to array of T's or NULL (if nothing is allocated)
//
// History:
// jstamerj 1998/07/14 14:15:21: Created.
//
//-------------------------------------------------------------
template <class T> inline CSimpArray<T>::operator T*()
{
return m_rgData;
}
//+------------------------------------------------------------
//
// Function: CSimpArray::Size
//
// Synopsis: Returns the count of (valid) array elements.
//
// Arguments: NONE
//
// Returns: DWORD size
//
// History:
// jstamerj 1998/07/14 14:16:36: Created.
//
//-------------------------------------------------------------
template <class T> inline DWORD CSimpArray<T>::Size()
{
return m_dwArrayValidSize;
}
#endif //__SIMPARRAY_H__