summaryrefslogtreecommitdiffstats
path: root/private/ole32/stg/h/ptrcache.hxx
blob: e514da582341ef1a2998c3d4c0111cd02834e94e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
//+---------------------------------------------------------------------------
//
//  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__