| 83 | |
| 84 | template<class T, int HashCount> |
| 85 | typename CNetBan::CBan<T> *CNetBan::CBanPool<T, HashCount>::Add(const T *pData, const CBanInfo *pInfo, const CNetHash *pNetHash) |
| 86 | { |
| 87 | if(!m_pFirstFree) |
| 88 | return nullptr; |
| 89 | |
| 90 | // create new ban |
| 91 | CBan<T> *pBan = m_pFirstFree; |
| 92 | pBan->m_Data = *pData; |
| 93 | pBan->m_Info = *pInfo; |
| 94 | pBan->m_NetHash = *pNetHash; |
| 95 | if(pBan->m_pNext) |
| 96 | pBan->m_pNext->m_pPrev = pBan->m_pPrev; |
| 97 | if(pBan->m_pPrev) |
| 98 | pBan->m_pPrev->m_pNext = pBan->m_pNext; |
| 99 | else |
| 100 | m_pFirstFree = pBan->m_pNext; |
| 101 | |
| 102 | // add it to the hash list |
| 103 | if(m_aapHashList[pNetHash->m_HashIndex][pNetHash->m_Hash]) |
| 104 | m_aapHashList[pNetHash->m_HashIndex][pNetHash->m_Hash]->m_pHashPrev = pBan; |
| 105 | pBan->m_pHashPrev = 0; |
| 106 | pBan->m_pHashNext = m_aapHashList[pNetHash->m_HashIndex][pNetHash->m_Hash]; |
| 107 | m_aapHashList[pNetHash->m_HashIndex][pNetHash->m_Hash] = pBan; |
| 108 | |
| 109 | // insert it into the used list |
| 110 | InsertUsed(pBan); |
| 111 | |
| 112 | // update ban count |
| 113 | ++m_CountUsed; |
| 114 | |
| 115 | return pBan; |
| 116 | } |
| 117 | |
| 118 | template<class T, int HashCount> |
| 119 | int CNetBan::CBanPool<T, HashCount>::Remove(CBan<T> *pBan) |