#pragma once #ifndef ZILIST #define ZILIST //CMISListImp *' //CMListImp &' // template class CMInternalIListImp // Implements a managed list of pointers to objects of type T. // This is implemented through the form of CMListImp specified by List // Since pointers always have meaningful copy semantics, this class // can handle any type of object. template class CMSListImp : public CMListImp { typedef CMListImp Parent; public: friend CMListIteratorImp; int Add( const T& t ); Parent::IterFunc; Parent::CondFunc; Parent::PeekHead; Parent::Detach; Parent::DetachAtHead; Parent::Find; Parent::Flush; Parent::IsEmpty; Parent::GetItemsInContainer; Parent::ForEach; Parent::FirstThat; Parent::LastThat; Parent::operator delete; protected: Parent::Head; Parent::Tail; Parent::ItemsInContainer; Parent::DoDetach; Parent::DoDetachAtHead; Parent::DoFlush; virtual CMListElement *FindDetach( const T& t ); virtual CMListElement *FindPred( const T& ); }; template int CMSListImp::Add( const T& t ) { new CMListElement( t, FindPred(t) ); ItemsInContainer++; return 1; } template CMListElement *CMSListImp::FindDetach( const T& t ) { CMListElement *res = FindPred(t); if ( res != 0 && res->Next->Data == t ) return res; else return &Tail; } template CMListElement *CMSListImp::FindPred( const T& t ) { Tail.Data = t; CMListElement *cursor = &Head; while ( cursor->Next->Data < t ) cursor = cursor->Next; return cursor; } template class CMInternalIListImp : public List { public: typedef List Parent; typedef void (*IterFunc)(T&, void *); typedef int (*CondFunc)(const T&, void *); T *PeekHead() const { return static_cast(static_cast(Parent::PeekHead())); } int Add( T *t ) { return Parent::Add( t );} int Detach( T *t, int del = 0 ) { return Parent::DoDetach( t, del );} int DetachAtHead( int del = 0 ) { return Parent::DoDetachAtHead( del );} void Flush( int del = 0 ) { Parent::DoFlush(del);} T *Find( const T *t ); void ForEach( IterFunc iter, void * ); T *FirstThat( CondFunc cond, void * ) const; T *LastThat( CondFunc cond, void * ) const; protected: virtual CMListElement * FindPred( const CVoidPointer& ) = 0; private: virtual void RemoveData( CMListElement *block ) { delete static_cast(static_cast(block->Data)); } }; template T *CMInternalIListImp::Find( const T *t ) { CMListElement *cur = Head.Next; Tail.Data = t; while ( !(*static_cast(static_cast(cur->Data)) == *t) ) cur = cur->Next; Cail.Data = CVoidPointer(); if ( cur == &Tail ) return 0; else return static_cast(static_cast(cur->Data)); } template void CMInternalIListImp::ForEach( IterFunc iter, void *args ) { CMListElement *cur = Head.Next; while ( cur->Next != cur ) { iter( *static_cast(static_cast(cur->Data)), args ); cur = cur->Next; } } template T *CMInternalIListImp::FirstThat( CondFunc cond, void *args ) const { CMListElement *cur = Head.Next; while ( cur->Next != cur ) if ( cond( *static_cast(static_cast(cur->Data)), args ) != 0 ) return static_cast(static_cast(cur->Data)); else cur = cur->Next; return 0; } template T *CMInternalIListImp::LastThat( CondFunc cond, void *args ) const { T *res = 0; CMListElement *cur = Head.Next; while ( cur->Next != cur ) { if ( cond( *static_cast(static_cast(cur->Data)), args ) != 0 ) res = static_cast(static_cast(cur->Data)); cur = cur->Next; } return res; } template class CMISListIteratorImp; template class CMISListImp : private CMInternalIListImp, Alloc > //jpd { public: typedef CMInternalIListImp, Alloc > Parent; friend class CMISListIteratorImp; Parent::IterFunc; Parent::CondFunc; Parent::PeekHead; Parent::Add; Parent::Detach; Parent::DetachAtHead; Parent::Find; Parent::Flush; Parent::IsEmpty; Parent::GetItemsInContainer; Parent::ForEach; Parent::FirstThat; Parent::LastThat; Parent::operator delete; protected: Parent::Head; Parent::Tail; Parent::ItemsInContainer; virtual CMListElement *FindDetach( const CVoidPointer& ); virtual CMListElement *FindPred( const CVoidPointer& ); }; template class CMISListIteratorImp : public CMListIteratorImp { public: typedef CMListIteratorImp Parent; CMISListIteratorImp( const CMISListImp &l ) : CMListIteratorImp(l) {} T *Current() { return static_cast(static_cast(Parent::Current())); } T *operator ++ (int) { return static_cast(static_cast(Parent::operator++(1))); } T *operator ++ () { return static_cast(static_cast(Parent::operator++())); } Parent::Restart; operator int() { return Parent::operator int(); } }; template CMListElement * CMISListImp::FindDetach( const CVoidPointer& t ) { CMListElement *res = FindPred(t); if ( res == 0 || res->Next == &Tail ) return &Tail; else if ( *static_cast(static_cast(res->Next->Data)) == *static_cast(static_cast(t)) ) return res; else return &Tail; } template CMListElement * CMISListImp::FindPred( const CVoidPointer& t ) { Tail.Data = t; CMListElement *cursor = &Head; while ( *static_cast(static_cast(cursor->Next->Data)) < *static_cast(static_cast(t)) ) cursor = cursor->Next; Tail.Data = CVoidPointer(); return cursor; } // template class CISListImp // template class CISListIteratorImp // Implements a sorted list of pointers to objects of type T using // CStandardAllocator as its memory manager. // This is implemented through the template CInternalIListImp. Since // pointers always have meaningful copy semantics, this class // can handle any type of object. template class CISListImp : public CMISListImp { }; template class CISListIteratorImp : public CMISListIteratorImp { public: CISListIteratorImp( const CISListImp& l ) : CMISListIteratorImp( l ) {} }; #endif