Path: blob/master/libmupen64plus/D3D8Interceptor/PointerSet.h
2 views
#pragma once12#include <objidl.h>34const UINT PointerSetHashSize = 128;56struct PointerLinkedList7{8PVOID pKey;9PVOID pData;10PointerLinkedList* pNext;11};1213class PointerSet14{15public:16PointerSet()17{18for(UINT i = 0; i < PointerSetHashSize; i++)19{20m_pHead[i] = NULL;21}22}2324PVOID GetDataPtr(PVOID pKey)25{26PointerLinkedList* pThis = m_pHead[GetHash(pKey)];27while(pThis)28{29if(pThis->pKey == pKey)30{31return pThis->pData;32}33pThis = pThis->pNext;34}35return NULL;36}37bool AddMember(PVOID pKey, PVOID pData)38{39UINT Hash = GetHash(pKey);40PointerLinkedList* pThis = new PointerLinkedList;41if(pThis == NULL)42{43return false;44}4546pThis->pNext = m_pHead[Hash];47pThis->pKey = pKey;48pThis->pData = pData;49m_pHead[Hash] = pThis;50return true;51}52bool DeleteMember(PVOID pKey)53{54UINT Hash = GetHash(pKey);55PointerLinkedList* pThis = m_pHead[Hash];56PointerLinkedList* pLast = 0L;5758if( m_pHead[Hash]->pKey == pKey )59{60m_pHead[Hash] = pThis->pNext;61delete pThis;62return true;63}64else65{66pLast = pThis;67pThis = pThis->pNext;68}6970while( pThis )71{72if( pThis->pKey == pKey )73{74pLast->pNext = pThis->pNext;75delete pThis;76return true;77}78pLast = pThis;79pThis = pThis->pNext;80}81return false;82}83__forceinline UINT GetHash(PVOID pKey)84{85DWORD Key = (DWORD)pKey;86return (( Key >> 3 ^ Key >> 7 ^ Key >> 11 ^ Key >> 17 ) & (PointerSetHashSize - 1));87}8889private:90PointerLinkedList* m_pHead[PointerSetHashSize];91};929394class ThreadSafePointerSet : public PointerSet95{96public:97ThreadSafePointerSet()98{99InitializeCriticalSection(&m_CritSec);100}101~ThreadSafePointerSet()102{103DeleteCriticalSection(&m_CritSec);104}105PVOID GetDataPtr(PVOID pKey)106{107EnterCriticalSection(&m_CritSec);108PVOID p = PointerSet::GetDataPtr(pKey);109LeaveCriticalSection(&m_CritSec);110return p;111}112bool AddMember(PVOID pKey, PVOID pData)113{114EnterCriticalSection(&m_CritSec);115bool Result = PointerSet::AddMember(pKey, pData);116LeaveCriticalSection(&m_CritSec);117return Result;118}119bool DeleteMember(PVOID pKey)120{121EnterCriticalSection(&m_CritSec);122bool Result = PointerSet::DeleteMember(pKey);123LeaveCriticalSection(&m_CritSec);124return Result;125}126127private:128CRITICAL_SECTION m_CritSec;129};130131132