NT4/private/ole32/stg/h/ptrcache.hxx
2020-09-30 17:12:29 +02:00

131 lines
2.4 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1993.
//
// File: ptrcache.hxx
//
// Contents: CPtrCache header
//
// Classes: CPtrCache
//
// History: 26-Jul-93 DrewB Created
//
//----------------------------------------------------------------------------
#ifndef __PTRCACHE_HXX__
#define __PTRCACHE_HXX__
#include <debnot.h>
#include <dfmem.hxx>
//+---------------------------------------------------------------------------
//
// Class: CPtrBlock (pb)
//
// Purpose: Holds an array of pointers
//
// Interface: See below
//
// History: 26-Jul-93 DrewB Created
//
//----------------------------------------------------------------------------
#define CBLOCKPTRS 50
class CPtrBlock
{
public:
inline CPtrBlock(CPtrBlock *pbNext);
inline void Add(void *pv);
inline BOOL Full(void);
inline int Count(void);
inline void *Nth(int n);
inline CPtrBlock *Next(void);
private:
int _cPtrs;
CPtrBlock *_pbNext;
void *_apv[CBLOCKPTRS];
};
inline CPtrBlock::CPtrBlock(CPtrBlock *pbNext)
{
_cPtrs = 0;
_pbNext = pbNext;
}
inline void CPtrBlock::Add(void *pv)
{
Win4Assert(_cPtrs < CBLOCKPTRS);
_apv[_cPtrs++] = pv;
}
inline BOOL CPtrBlock::Full(void)
{
return _cPtrs == CBLOCKPTRS;
}
inline int CPtrBlock::Count(void)
{
return _cPtrs;
}
inline void *CPtrBlock::Nth(int n)
{
Win4Assert(n >= 0 && n < _cPtrs);
return _apv[n];
}
inline CPtrBlock *CPtrBlock::Next(void)
{
return _pbNext;
}
//+---------------------------------------------------------------------------
//
// Class: CPtrCache (pc)
//
// Purpose: Holds an arbitrary number of pointers using an efficient
// block allocation scheme
//
// Interface: See below
//
// History: 26-Jul-93 DrewB Created
//
//----------------------------------------------------------------------------
class CPtrCache : public CLocalAlloc
{
public:
inline CPtrCache(void);
~CPtrCache(void);
SCODE Add(void *pv);
inline void StartEnum(void);
BOOL Next(void **ppv);
private:
CPtrBlock _pbFirst;
CPtrBlock *_pbHead;
CPtrBlock *_pbEnum;
int _iEnum;
};
inline CPtrCache::CPtrCache(void)
: _pbFirst(NULL)
{
_pbHead = &_pbFirst;
StartEnum();
}
inline void CPtrCache::StartEnum(void)
{
_pbEnum = _pbHead;
_iEnum = 0;
}
#endif // #ifndef __PTRCACHE_HXX__