#pragma once #include ////////////////////////////////////////////////////////////////////////////// // slink ////////////////////////////////////////////////////////////////////////////// struct slink { DWORD _dwSig; slink* next; slink() { _dwSig = 'KNLS'; next = NULL; } slink(slink* p) { next = p; } }; ////////////////////////////////////////////////////////////////////////////// // tlink ////////////////////////////////////////////////////////////////////////////// template struct tlink : public slink { T info; tlink( T& t) : info(t) { } }; ////////////////////////////////////////////////////////////////////////////// // slist // slist of slinks ////////////////////////////////////////////////////////////////////////////// class slist { DWORD _dwSig; slink *last; public: void insert(slink* p); void append(slink* p); slink* get(); slist() { _dwSig = 'TSLS'; last = NULL; } slist(slink* p) { last = p->next = p; } friend class slist_iter; }; ////////////////////////////////////////////////////////////////////////////// // slist iterator ////////////////////////////////////////////////////////////////////////////// class slist_iter { slink* ce; slist* cs; public: inline slist_iter(slist& s); inline slink* next(); }; //----------------------------------------------------------------------------- // slist_iter ctor //----------------------------------------------------------------------------- slist_iter::slist_iter(slist& s) { cs = &s; ce = cs->last; } //----------------------------------------------------------------------------- // slist_iter::next //----------------------------------------------------------------------------- slink* slist_iter::next() { slink* p = ce ? (ce=ce->next) : 0; if (ce == cs->last) ce = 0; return p; } template class TList_Iter; ////////////////////////////////////////////////////////////////////////////// // TList // list of tlinks ////////////////////////////////////////////////////////////////////////////// template class TList : private slist { public: HRESULT Insert( T& t); HRESULT Append( T& t); void Destruct(); friend class TList_Iter; }; //----------------------------------------------------------------------------- // TList::Insert //----------------------------------------------------------------------------- template HRESULT TList::Insert( T& t) { HRESULT hr = S_OK; MAKE_ERROR_MACROS_STATIC(hr); tlink *pt = new tlink(t); IF_ALLOC_FAILED_EXIT(pt); slist::insert(pt); exit: return hr; } //----------------------------------------------------------------------------- // TList::Append //----------------------------------------------------------------------------- template HRESULT TList::Append( T& t) { HRESULT hr = S_OK; MAKE_ERROR_MACROS_STATIC(hr); tlink *pt = new tlink(t); IF_ALLOC_FAILED_EXIT(pt); slist::append(pt); exit: return hr; } //----------------------------------------------------------------------------- // TList::Destruct //----------------------------------------------------------------------------- template void TList::Destruct() { tlink* lnk; while (lnk = (tlink*) slist::get()) { delete lnk->info; delete lnk; } } ////////////////////////////////////////////////////////////////////////////// // TList iterator. ////////////////////////////////////////////////////////////////////////////// template class TList_Iter : private slist_iter { public: TList_Iter(TList& s) : slist_iter(s) { } inline T* Next (); }; //----------------------------------------------------------------------------- // TList_Iter::next //----------------------------------------------------------------------------- template T* TList_Iter::Next () { slink* p = slist_iter::next(); return p ? &(((tlink*) p)->info) : NULL; }