- BORLAND/: Borland C++ 4.52 (chosen over 4.5 by byte-match: CODE/RP/CW32.LIB
is identical to 4.52's install lib). BCC32/TLINK32/TLIB/MAKE run natively on
Win11; CODE/BT/OPT.MAK is the shipped BTL4OPT.EXE's exact flag recipe
(extender = Borland PowerPack DPMI32, not Phar Lap TNT).
- restoration/source410/: the literal 1995-form reconstruction of the missing
BT game source (never mixed into CODE/). Round 1-3 state:
* 6 of 10 surviving original TUs COMPILE CLEAN under the period toolchain
(BTMSSN, BTCNSL, BTSCNRL, BTTEAM, BTL4MODE, BTL4ARND) - first builds
since 1996.
* BT_L4/BTL4APP.CPP pilot reconstruction: 12/12 functions, Fail() lands on
its binary-recorded line 400 exactly.
* BT/BTCNSL.HPP: console wire IDs recovered from the binary's ctors
(Killed=9, Damaged=10, ScoreUpdate=13, DeathWithoutHonor=15 [T1];
TeamScore=12 flagged [T4]).
* MUNGA/: 8 engine-header backfills back-dated from the BT412 WinTesla tree
(VDATA numbering decomp-verified; AUDREND's OpenAL-era virtual removed -
the period compiler is the drift detector).
* Tooling: backdate.py (WinTesla->1995 header transform), compile410.sh
(per-TU verification sweep under authentic OPT.MAK flags).
* README: corrected roadmap - MECH.HPP is the capstone grown with the mech
TU reconstructions; BTREG.CPP green = the header-family milestone.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
88 lines
2.0 KiB
C++
88 lines
2.0 KiB
C++
//
|
|
|
|
#ifndef _HASHTBL_H
|
|
#define _HASHTBL_H
|
|
|
|
|
|
#include <bole.h>
|
|
|
|
//------------------------------ IHashable -------------------------
|
|
// An ABC for objects which can be linked into a hash table
|
|
|
|
typedef unsigned int HashIndex;
|
|
|
|
template <class T> class _ICLASS IHashable : public IUnknown {
|
|
public:
|
|
virtual HashIndex Hash(HashIndex modulo) const = 0;
|
|
virtual BOOL operator==(const T *) const =0;
|
|
virtual BOOL operator!=(const T *) const =0;
|
|
virtual IHashable<T> *&Next() = 0;
|
|
};
|
|
|
|
|
|
template <class T, HashIndex SIZE> class _ICLASS HashTable {
|
|
protected:
|
|
IHashable<T> * aBuckets[SIZE];
|
|
IHashable<T> *& Insert(IHashable<T> *&rpFound, IHashable<T> *pKey);
|
|
IHashable<T> *& Delete(IHashable<T> *&rpFound);
|
|
IHashable<T> *& Find(IHashable<T> *hashKey);
|
|
|
|
public:
|
|
~HashTable();
|
|
// Add returns existing instance or adds
|
|
BOOL Add(IHashable<T> **pPat);
|
|
// Remove takes key out of HashTable
|
|
void Remove(IHashable<T> *pKey);
|
|
};
|
|
|
|
|
|
template <class T, HashIndex SIZE> IHashable<T> *& HashTable<T, SIZE>::
|
|
Insert(IHashable<T> *&rpFound, IHashable<T> *pKey)
|
|
{
|
|
pKey->Next()=rpFound,
|
|
pKey->AddRef(),
|
|
rpFound=pKey;
|
|
return rpFound;
|
|
}
|
|
|
|
template <class T, HashIndex SIZE> IHashable<T> *& HashTable<T, SIZE>::
|
|
Delete(IHashable<T> *&rpFound)
|
|
{
|
|
assert(rpFound != 0L);
|
|
IHashable<T> **ppFoundNext = &rpFound->Next();
|
|
IHashable<T> *pFoundNext = *ppFoundNext;
|
|
*ppFoundNext=0L;
|
|
rpFound->Release();
|
|
return rpFound = pFoundNext;
|
|
}
|
|
|
|
template <class T, HashIndex SIZE>
|
|
BOOL HashTable<T, SIZE>::Add(IHashable<T> **ppPat)
|
|
{
|
|
IHashable<T> *&pSrc = Find(*ppPat);
|
|
if (pSrc) {
|
|
(*ppPat)->Release();
|
|
*ppPat = pSrc;
|
|
}
|
|
else
|
|
Insert(pSrc, *ppPat) ;
|
|
|
|
(*ppPat) ->AddRef();
|
|
return TRUE;
|
|
}
|
|
|
|
// (pSrc) ?
|
|
// pPat->Release(),
|
|
// pPat = pSrc :
|
|
// Insert(pSrc, pPat) ;
|
|
|
|
template <class T, HashIndex SIZE>
|
|
void HashTable<T, SIZE>::Remove(IHashable<T> *pKey)
|
|
{
|
|
IHashable<T> *&pFound =Find(pKey);
|
|
pFound ? Delete(pFound) : 0L;
|
|
}
|
|
|
|
#endif
|
|
|