Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/libmupen64plus/D3D8Interceptor/PointerSet.h
2 views
1
#pragma once
2
3
#include <objidl.h>
4
5
const UINT PointerSetHashSize = 128;
6
7
struct PointerLinkedList
8
{
9
PVOID pKey;
10
PVOID pData;
11
PointerLinkedList* pNext;
12
};
13
14
class PointerSet
15
{
16
public:
17
PointerSet()
18
{
19
for(UINT i = 0; i < PointerSetHashSize; i++)
20
{
21
m_pHead[i] = NULL;
22
}
23
}
24
25
PVOID GetDataPtr(PVOID pKey)
26
{
27
PointerLinkedList* pThis = m_pHead[GetHash(pKey)];
28
while(pThis)
29
{
30
if(pThis->pKey == pKey)
31
{
32
return pThis->pData;
33
}
34
pThis = pThis->pNext;
35
}
36
return NULL;
37
}
38
bool AddMember(PVOID pKey, PVOID pData)
39
{
40
UINT Hash = GetHash(pKey);
41
PointerLinkedList* pThis = new PointerLinkedList;
42
if(pThis == NULL)
43
{
44
return false;
45
}
46
47
pThis->pNext = m_pHead[Hash];
48
pThis->pKey = pKey;
49
pThis->pData = pData;
50
m_pHead[Hash] = pThis;
51
return true;
52
}
53
bool DeleteMember(PVOID pKey)
54
{
55
UINT Hash = GetHash(pKey);
56
PointerLinkedList* pThis = m_pHead[Hash];
57
PointerLinkedList* pLast = 0L;
58
59
if( m_pHead[Hash]->pKey == pKey )
60
{
61
m_pHead[Hash] = pThis->pNext;
62
delete pThis;
63
return true;
64
}
65
else
66
{
67
pLast = pThis;
68
pThis = pThis->pNext;
69
}
70
71
while( pThis )
72
{
73
if( pThis->pKey == pKey )
74
{
75
pLast->pNext = pThis->pNext;
76
delete pThis;
77
return true;
78
}
79
pLast = pThis;
80
pThis = pThis->pNext;
81
}
82
return false;
83
}
84
__forceinline UINT GetHash(PVOID pKey)
85
{
86
DWORD Key = (DWORD)pKey;
87
return (( Key >> 3 ^ Key >> 7 ^ Key >> 11 ^ Key >> 17 ) & (PointerSetHashSize - 1));
88
}
89
90
private:
91
PointerLinkedList* m_pHead[PointerSetHashSize];
92
};
93
94
95
class ThreadSafePointerSet : public PointerSet
96
{
97
public:
98
ThreadSafePointerSet()
99
{
100
InitializeCriticalSection(&m_CritSec);
101
}
102
~ThreadSafePointerSet()
103
{
104
DeleteCriticalSection(&m_CritSec);
105
}
106
PVOID GetDataPtr(PVOID pKey)
107
{
108
EnterCriticalSection(&m_CritSec);
109
PVOID p = PointerSet::GetDataPtr(pKey);
110
LeaveCriticalSection(&m_CritSec);
111
return p;
112
}
113
bool AddMember(PVOID pKey, PVOID pData)
114
{
115
EnterCriticalSection(&m_CritSec);
116
bool Result = PointerSet::AddMember(pKey, pData);
117
LeaveCriticalSection(&m_CritSec);
118
return Result;
119
}
120
bool DeleteMember(PVOID pKey)
121
{
122
EnterCriticalSection(&m_CritSec);
123
bool Result = PointerSet::DeleteMember(pKey);
124
LeaveCriticalSection(&m_CritSec);
125
return Result;
126
}
127
128
private:
129
CRITICAL_SECTION m_CritSec;
130
};
131
132