/*------------------------------------------------------------------------*/ /* */ /* DLISTIMP.H */ /* */ /* Copyright (c) 1991, 1994 Borland International */ /* All Rights Reserved */ /* */ /*------------------------------------------------------------------------*/ #if !defined( CLASSLIB_DLISTIMP_H ) #define CLASSLIB_DLISTIMP_H #if !defined( __LIMITS_H ) #include #endif #if !defined( __CHECKS_H ) #include #endif #if !defined( CLASSLIB_DEFS_H ) #include #endif #if !defined( CLASSLIB_MEMMGR_H ) #include #endif #if !defined( CLASSLIB_ALLOCTR_H ) #include #endif #if !defined( CLASSLIB_VOIDP_H ) #include #endif #pragma option -Vo- #if defined( BI_CLASSLIB_NO_po ) #pragma option -po- #endif /*------------------------------------------------------------------------*/ /* */ /* template class TMDoubleListElement */ /* */ /* Node for templates TMDoubleListImp and */ /* TMIDoubleListImp */ /* */ /*------------------------------------------------------------------------*/ template class TMDoubleListImp; template class TMDoubleListBlockInitializer : public Alloc { protected: TMDoubleListBlockInitializer(); ~TMDoubleListBlockInitializer(); static unsigned Count; }; #if defined( BI_OLDNAMES ) #define BI_DoubleListBlockInitializer TDoubleListBlockInitializer #endif template TMDoubleListBlockInitializer::TMDoubleListBlockInitializer() { PRECONDITION( Count != UINT_MAX ); if( Count++ == 0 ) TMDoubleListElement::Mgr = new(*this)TMMemBlocks( sizeof(TMDoubleListElement), 20 ); } template TMDoubleListBlockInitializer::~TMDoubleListBlockInitializer() { PRECONDITION( Count != 0 ); if( --Count == 0 ) { delete TMDoubleListElement::Mgr; TMDoubleListElement::Mgr = 0; } } template unsigned TMDoubleListBlockInitializer::Count = 0; template class TMDoubleListElement { public: TMDoubleListElement( const T& t, TMDoubleListElement *p ) : Data(t) { Next = p->Next; Prev = p; p->Next = this; Next->Prev = this; } TMDoubleListElement(); TMDoubleListElement *Next; TMDoubleListElement *Prev; T Data; void *operator new( size_t sz ); void operator delete( void * ); private: friend TMDoubleListBlockInitializer; static TMMemBlocks *Mgr; }; #if defined( BI_OLDNAMES ) #define BI_MDoubleListElement TMDoubleListElement #endif template TMMemBlocks *TMDoubleListElement::Mgr = 0; template inline TMDoubleListElement::TMDoubleListElement() { Next = Prev = 0; } template void *TMDoubleListElement::operator new( size_t sz ) { PRECONDITION( Mgr != 0 ); return Mgr->Allocate( sz ); } template void TMDoubleListElement::operator delete( void *b ) { PRECONDITION( Mgr != 0 ); Mgr->Free( b ); } /*------------------------------------------------------------------------*/ /* */ /* template class TMDoubleListImp */ /* */ /* Implements a managed double-linked list of objects of type T. */ /* Assumes that T has meaningful copy semantics and a default */ /* constructor. */ /* */ /*------------------------------------------------------------------------*/ template class TMDoubleListIteratorImp; template class TMDoubleListImp : private TMDoubleListBlockInitializer { typedef TMDoubleListBlockInitializer Parent; public: typedef void (*IterFunc)(T&, void *); typedef int (*CondFunc)(const T&, void *); friend TMDoubleListIteratorImp; TMDoubleListImp() { InitList(); } ~TMDoubleListImp() { Flush(); } const T& PeekHead() const { return Head.Next->Data; } const T& PeekTail() const { return Tail.Prev->Data; } int Add( const T& t ) { return AddElement(t,&Head); } int AddAtHead( const T& t ) { return AddElement(t,&Head); } int AddAtTail( const T& t ) { return AddElement(t,Tail.Prev); } int Detach( const T& t ) { return DoDetach(t,0); } int DetachAtHead() { return DoDetachAtHead(0); } int DetachAtTail() { return DoDetachAtTail(0); } T *Find( const T& t ); void Flush() { DoFlush(0); } int IsEmpty() const { return ItemsInContainer == 0; } int GetItemsInContainer() const { return ItemsInContainer; } void ForEach( IterFunc iter, void *args ); T *FirstThat( CondFunc cond, void *args ) const; T *LastThat( CondFunc cond, void *args ) const; Parent::operator delete; Parent::operator delete []; #if defined( BI_OLDNAMES ) const T& peekHead() const { return PeekHead(); } const T& peekTail() const { return PeekTail(); } void add( const T& t ) { Add(t); } void addAtTail( const T& t ) { AddAtTail(t); } void detach( const T& t, int del = 0 ) { Detach(t); } void flush( int = 0 ) { Flush(); } int isEmpty() const { return IsEmpty(); } int getItemsInContainer() const { return GetItemsInContainer(); } void forEach( IterFunc iter, void *args ) { ForEach( iter, args ); } T *firstThat( CondFunc cond, void *args ) const { return FirstThat( cond, args ); } T *lastThat( CondFunc cond, void *args ) const { return LastThat( cond, args ); } #endif // BI_OLDNAMES protected: int DoDetach( const T& t, int del = 0 ) { return DetachElement(FindDetach(t),del); } int DoDetachAtHead( int del = 0 ) { return DetachElement(&Head,del); } int DoDetachAtTail( int del = 0 ) { return DetachElement(Tail.Prev->Prev,del); } void DoFlush( int del = 0 ); TMDoubleListElement Head, Tail; virtual TMDoubleListElement *FindDetach( const T& t ) { return FindPred(t); } virtual TMDoubleListElement *FindPred( const T& ); int ItemsInContainer; private: virtual void RemoveData( TMDoubleListElement * ) { } void InitList(); int DetachElement( TMDoubleListElement *element, int del = 0 ); int AddElement( const T& t, TMDoubleListElement *element ); }; template void TMDoubleListImp::InitList() { Head.Next = &Tail; Head.Prev = &Head; Tail.Prev = &Head; Tail.Next = &Tail; ItemsInContainer = 0; } template int TMDoubleListImp::AddElement( const T& toAdd, TMDoubleListElement *Pos ) { new TMDoubleListElement( toAdd, Pos ); ItemsInContainer++; return 1; } template TMDoubleListElement *TMDoubleListImp::FindPred( const T&t ) { Tail.Data = t; TMDoubleListElement *cursor = &Head; while( !(t == cursor->Next->Data) ) cursor = cursor->Next; Tail.Data = T(); return cursor; } template int TMDoubleListImp::DetachElement( TMDoubleListElement *pred, int del ) { TMDoubleListElement *item = pred->Next; if( item == &Tail ) return 0; else { pred->Next = pred->Next->Next; pred->Next->Prev = pred; if( del != 0 ) RemoveData( item ); delete item; ItemsInContainer--; return 1; } } template T *TMDoubleListImp::Find( const T& t ) { TMDoubleListElement *pred = FindPred(t); if( pred->Next == &Tail ) return 0; else return &pred->Next->Data; } template void TMDoubleListImp::DoFlush( int del ) { TMDoubleListElement *current = Head.Next; while( current != &Tail ) { TMDoubleListElement *temp = current; current = current->Next; if( del != 0 ) RemoveData( temp ); delete temp; } InitList(); } template void TMDoubleListImp::ForEach( IterFunc f, void *args ) { TMDoubleListElement *cur = Head.Next; while( cur->Next != cur ) { f( cur->Data, args ); cur = cur->Next; } } template T *TMDoubleListImp::FirstThat( CondFunc cond, void *args ) const { TMDoubleListElement *cur = Head.Next; while( cur->Next != cur ) if( cond( cur->Data, args ) != 0 ) return &(cur->Data); else cur = cur->Next; return 0; } template T *TMDoubleListImp::LastThat( CondFunc cond, void *args ) const { T *res = 0; TMDoubleListElement *cur = Head.Next; while( cur->Next != cur ) { if( cond( cur->Data, args ) != 0 ) res = &(cur->Data); cur = cur->Next; } return res; } #if defined( BI_OLDNAMES ) #define BI_MDoubleListImp TMDoubleListImp #endif /*------------------------------------------------------------------------*/ /* */ /* template class TMDoubleListIteratorImp */ /* */ /* Implements a double list iterator. This iterator works with any */ /* direct double list. For indirect lists, see */ /* TMIDoubleListIteratorImp. */ /* */ /*------------------------------------------------------------------------*/ template class TMDoubleListIteratorImp { public: TMDoubleListIteratorImp( const TMDoubleListImp& l ) { List = &l; Cur = List->Head.Next; } TMDoubleListIteratorImp( const TMSDoubleListImp& l ); operator int() { return Cur != &(List->Head) && Cur != &(List->Tail); } const T& Current() { PRECONDITION( int(*this) != 0 ); return Cur->Data; } const T& operator ++ ( int ) { PRECONDITION( Cur != &(List->Tail) ); TMDoubleListElement *temp = Cur; Cur = Cur->Next; return temp->Data; } const T& operator ++ () { PRECONDITION( Cur->Next != &(List->Tail) ); Cur = Cur->Next; return Cur->Data; } const T& operator -- ( int ) { PRECONDITION( Cur != &(List->Head) ); TMDoubleListElement *temp = Cur; Cur = Cur->Prev; return temp->Data; } const T& operator -- () { PRECONDITION( Cur->Prev != &(List->Head) ); Cur = Cur->Prev; return Cur->Data; } void Restart() { Cur = List->Head.Next; } void RestartAtTail() { Cur = List->Tail.Prev; } #if defined( BI_OLDNAMES ) T current() { return Current(); } void restart() { Restart(); } #endif private: const TMDoubleListImp *List; TMDoubleListElement *Cur; }; #if defined( BI_OLDNAMES ) #define BI_MDoubleListIteratorImp TMDoubleListIteratorImp #endif /*------------------------------------------------------------------------*/ /* */ /* template class TDoubleListImp */ /* template class TDoubleListIteratorImp */ /* */ /* Implements a double-linked list of objects of type T using */ /* TStandardAllocator as its memory manager. Assumes that T has */ /* meaningful copy semantics and a default constructor. */ /* */ /*------------------------------------------------------------------------*/ template class TDoubleListImp : public TMDoubleListImp { }; template class TDoubleListIteratorImp : public TMDoubleListIteratorImp { public: TDoubleListIteratorImp( const TDoubleListImp& l ) : TMDoubleListIteratorImp(l) {} TDoubleListIteratorImp( const TSDoubleListImp& l ) : TMDoubleListIteratorImp(l) {} }; #if defined( BI_OLDNAMES ) #define BI_DoubleListImp TDoubleListImp #define BI_DoubleListIteratorImp TDoubleListIteratorImp #endif /*------------------------------------------------------------------------*/ /* */ /* template class TMSDoubleListImp */ /* template class TMSDoubleListIteratorImp */ /* */ /* Implements a managed sorted double-linked list of objects of type T. */ /* Assumes that T has meaningful copy semantics, a meaningful */ /* < operator, and a default constructor. */ /* */ /*------------------------------------------------------------------------*/ template class TMSDoubleListImp : private TMDoubleListImp { typedef TMDoubleListImp Parent; public: friend TMDoubleListIteratorImp; int Add( const T& t ); Parent::IterFunc; Parent::CondFunc; Parent::PeekHead; Parent::PeekTail; Parent::Detach; Parent::Find; Parent::Flush; Parent::IsEmpty; Parent::GetItemsInContainer; Parent::ForEach; Parent::FirstThat; Parent::LastThat; Parent::operator delete; Parent::operator delete []; #if defined( BI_OLDNAMES ) void add( const T& t ) { Add(t); } Parent::peekHead; Parent::peekTail; Parent::detach; Parent::flush; Parent::isEmpty; Parent::getItemsInContainer; Parent::forEach; Parent::firstThat; Parent::lastThat; #endif // BI_OLDNAMES protected: Parent::Head; Parent::Tail; Parent::ItemsInContainer; Parent::DoDetach; Parent::DoDetachAtHead; Parent::DoDetachAtTail; Parent::DoFlush; virtual TMDoubleListElement *FindDetach( const T& ); virtual TMDoubleListElement *FindPred( const T& ); }; template class TMSDoubleListIteratorImp : public TMDoubleListIteratorImp { public: TMSDoubleListIteratorImp( const TMSDoubleListImp& l ) : TMDoubleListIteratorImp(l) {} }; template int TMSDoubleListImp::Add( const T& t ) { new TMDoubleListElement( t, FindPred(t) ); ItemsInContainer++; return 1; } template TMDoubleListElement*TMSDoubleListImp::FindDetach(const T&t) { TMDoubleListElement *res = FindPred(t); if( res != 0 && res->Next->Data == t ) return res; else return &Tail; } template TMDoubleListElement*TMSDoubleListImp::FindPred(const T& t) { Tail.Data = t; TMDoubleListElement *cursor = &Head; while( cursor->Next->Data < t ) cursor = cursor->Next; Tail.Data = T(); return cursor; } // constructor for TMDoubleListIteratorImp template TMDoubleListIteratorImp::TMDoubleListIteratorImp( const TMSDoubleListImp& l ) { List = &l; Cur = List->Head.Next; } #if defined( BI_OLDNAMES ) #define BI_MSDoubleListImp TMSDoubleListImp #define BI_MSDoubleListIteratorImp TMSDoubleListIteratorImp #endif /*------------------------------------------------------------------------*/ /* */ /* template class TSDoubleListImp */ /* template class TSDoubleListIteratorImp */ /* */ /* Implements a sorted double-linked list of objects of type T, using */ /* TStandardAllocator as its memory manager. Assumes that T has */ /* meaningful copy semantics, a meaningful < operator, and a default */ /* constructor. */ /* */ /*------------------------------------------------------------------------*/ template class TSDoubleListImp : public TMSDoubleListImp { }; template class TSDoubleListIteratorImp : public TMSDoubleListIteratorImp { public: TSDoubleListIteratorImp( const TSDoubleListImp& l ) : TMSDoubleListIteratorImp(l) {} }; #if defined( BI_OLDNAMES ) #define BI_SDoubleListImp TSDoubleListImp #define BI_SDoubleListIteratorImp TSDoubleListIteratorImp #endif /*------------------------------------------------------------------------*/ /* */ /* template */ /* class TMInternalIDoubleListImp */ /* */ /* Implements a managed double-linked list of pointers to objects of */ /* type T. This is implemented through the form of TMDoubleListImp */ /* specified by List. Since pointers always have meaningful copy */ /* semantics, this class can handle any type of object. */ /* */ /*------------------------------------------------------------------------*/ template class TMInternalIDoubleListImp : public List { typedef List Parent; public: typedef void (*IterFunc)(T&, void *); typedef int (*CondFunc)(const T&, void *); T *PeekHead() const { return STATIC_CAST(T *, STATIC_CAST(void *, Parent::PeekHead())); } T *PeekTail() const { return STATIC_CAST(T *, STATIC_CAST(void *, Parent::PeekTail())); } 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 ); } int DetachAtTail( int del = 0 ) { return Parent::DoDetachAtTail( del ); } T *Find( const T *t ); void Flush( int del = 0 ) { DoFlush( del ); } void ForEach( IterFunc iter, void * ); T *FirstThat( CondFunc cond, void * ) const; T *LastThat( CondFunc cond, void * ) const; #if defined( BI_OLDNAMES ) T *peekHead() const { return PeekHead(); } T *peekTail() const { return PeekTail(); } void add( T *t ) { Add(t); } void detach( T *t, int del = 0 ) { Detach( t, del ); } void forEach( IterFunc iter, void *args ) { ForEach( iter, args ); } T *firstThat( CondFunc cond, void *args ) const { return FirstThat( cond, args ); } T *lastThat( CondFunc cond, void *args ) const { return LastThat( cond, args ); } #endif // BI_OLDNAMES protected: virtual TMDoubleListElement *FindPred( const TVoidPointer& ) = 0; private: virtual void RemoveData( TMDoubleListElement *block ) { delete STATIC_CAST(T *,STATIC_CAST(void *,block->Data)); } }; template T *TMInternalIDoubleListImp::Find( const T *t ) { TMDoubleListElement *pred = FindPred(t); if( pred->Next == &Tail ) return 0; else return STATIC_CAST(T *,STATIC_CAST(void *,pred->Next->Data)); } template void TMInternalIDoubleListImp::ForEach( IterFunc iter, void *args ) { TMDoubleListElement *cur = Head.Next; while( cur->Next != cur ) { iter( *STATIC_CAST(T *,STATIC_CAST(void *,cur->Data)), args ); cur = cur->Next; } } template T * TMInternalIDoubleListImp::FirstThat( CondFunc cond, void *args ) const { TMDoubleListElement *cur = Head.Next; while( cur->Next != cur ) if( cond( *STATIC_CAST(T *,STATIC_CAST(void *,cur->Data)), args ) != 0 ) return STATIC_CAST(T *,STATIC_CAST(void *,cur->Data)); else cur = cur->Next; return 0; } template T * TMInternalIDoubleListImp::LastThat( CondFunc cond, void *args ) const { T *res = 0; TMDoubleListElement *cur = Head.Next; while( cur->Next != cur ) { if( cond( *STATIC_CAST(T *,STATIC_CAST(void *,cur->Data)), args ) != 0 ) res = STATIC_CAST(T *,STATIC_CAST(void *,cur->Data)); cur = cur->Next; } return res; } template class TMInternalIDoubleListIteratorImp : public TMDoubleListIteratorImp { typedef TMDoubleListIteratorImp Parent; public: TMInternalIDoubleListIteratorImp( const TMInternalIDoubleListImp& l ) : TMDoubleListIteratorImp(l) {} T *Current() { return STATIC_CAST(T *,STATIC_CAST(void *,Parent::Current())); } T *operator ++ (int) { return STATIC_CAST(T *,STATIC_CAST(void *,Parent::operator++(1))); } T *operator ++ () { return STATIC_CAST(T *,STATIC_CAST(void *,Parent::operator++())); } T *operator -- (int) { return STATIC_CAST(T *,STATIC_CAST(void *,Parent::operator--(1))); } T *operator -- () { return STATIC_CAST(T *,STATIC_CAST(void *,Parent::operator--())); } #if defined( BI_OLDNAMES ) T *current() { return Current(); } #endif // BI_OLDNAMES }; #if defined( BI_OLDNAMES ) #define BI_MInternalIDoubleListImp TMInternalIDoubleListImp #endif /*------------------------------------------------------------------------*/ /* */ /* template class TMIDoubleListImp */ /* template class TMIDoubleListIteratorImp */ /* */ /* Implements a double-linked list of pointers to objects of */ /* type T. This is implemented through the template */ /* TMInternalIDoubleListImp. Since pointers always have meaningful */ /* copy semantics, this class can handle any type of object. */ /* */ /*------------------------------------------------------------------------*/ template class TMIDoubleListIteratorImp; template class TMIDoubleListImp : private TMInternalIDoubleListImp,Alloc > { typedef TMInternalIDoubleListImp,Alloc > Parent; public: friend TMIDoubleListIteratorImp; Parent::IterFunc; Parent::CondFunc; Parent::PeekHead; Parent::PeekTail; Parent::Add; Parent::AddAtHead; Parent::AddAtTail; Parent::Detach; Parent::DetachAtHead; Parent::DetachAtTail; Parent::Find; Parent::Flush; Parent::IsEmpty; Parent::GetItemsInContainer; Parent::ForEach; Parent::FirstThat; Parent::LastThat; Parent::operator delete; Parent::operator delete []; #if defined( BI_OLDNAMES ) Parent::peekHead; Parent::peekTail; Parent::add; Parent::addAtTail; Parent::detach; Parent::flush; Parent::isEmpty; Parent::forEach; Parent::firstThat; Parent::lastThat; #endif // BI_OLDNAMES protected: Parent::Head; Parent::Tail; Parent::ItemsInContainer; virtual TMDoubleListElement *FindPred(const TVoidPointer&); }; template class TMIDoubleListIteratorImp : public TMInternalIDoubleListIteratorImp,Alloc> { public: TMIDoubleListIteratorImp( const TMIDoubleListImp& l ) : TMInternalIDoubleListIteratorImp,Alloc>( l ) {} }; template TMDoubleListElement *TMIDoubleListImp::FindPred( const TVoidPointer& t ) { Tail.Data = t; TMDoubleListElement *cursor = &Head; while( !(*STATIC_CAST(T *,STATIC_CAST(void *,t)) == *STATIC_CAST(T *,STATIC_CAST(void *,cursor->Next->Data))) ) cursor = cursor->Next; Tail.Data = TVoidPointer(); return cursor; } #if defined( BI_OLDNAMES ) #define BI_MIDoubleListImp TMIDoubleListImp #define BI_MIDoubleListIteratorImp TMIDoubleListIteratorImp #endif /*------------------------------------------------------------------------*/ /* */ /* template class TIDoubleListImp */ /* template class TIDoubleListIteratorImp */ /* */ /* Implements a double-linked list of pointers to objects of */ /* type T using TStandardAllocator as its memory manager. */ /* This is implemented through the template */ /* TMInternalIDoubleListImp. Since pointers always have meaningful */ /* copy semantics, this class can handle any type of object. */ /* */ /*------------------------------------------------------------------------*/ template class TIDoubleListImp : public TMIDoubleListImp { }; template class TIDoubleListIteratorImp : public TMIDoubleListIteratorImp { public: TIDoubleListIteratorImp( const TIDoubleListImp& l ) : TMIDoubleListIteratorImp( l ) {} }; #if defined( BI_OLDNAMES ) #define BI_IDoubleListImp TIDoubleListImp #define BI_IDoubleListIteratorImp TIDoubleListIteratorImp #endif /*------------------------------------------------------------------------*/ /* */ /* template class TMISDoubleListImp */ /* template class TMISDoubleListIteratorImp */ /* */ /* Implements a managed sorted double-linked list of pointers to */ /* objects of type T. This is implemented through the template */ /* TMInternalIDoubleListImp. Since pointers always have meaningful */ /* copy semantics, this class can handle any type of object. */ /* */ /*------------------------------------------------------------------------*/ template class TMISDoubleListIteratorImp; template class TMISDoubleListImp : private TMInternalIDoubleListImp,Alloc> { typedef TMInternalIDoubleListImp, Alloc > Parent; public: friend TMISDoubleListIteratorImp; Parent::IterFunc; Parent::CondFunc; Parent::PeekHead; Parent::PeekTail; Parent::Add; Parent::Detach; Parent::DetachAtHead; Parent::DetachAtTail; Parent::Find; Parent::Flush; Parent::IsEmpty; Parent::GetItemsInContainer; Parent::ForEach; Parent::FirstThat; Parent::LastThat; Parent::operator delete; Parent::operator delete []; protected: Parent::Head; Parent::Tail; Parent::ItemsInContainer; virtual TMDoubleListElement *FindDetach(const TVoidPointer&); virtual TMDoubleListElement *FindPred(const TVoidPointer&); }; template class TMISDoubleListIteratorImp : public TMInternalIDoubleListIteratorImp,Alloc> { public: TMISDoubleListIteratorImp( const TMISDoubleListImp& l ) : TMInternalIDoubleListIteratorImp,Alloc>( l ) {} }; template TMDoubleListElement *TMISDoubleListImp::FindDetach( const TVoidPointer& t ) { TMDoubleListElement *res = FindPred(t); if( res == 0 || res->Next == &Tail ) return &Tail; else if( *STATIC_CAST(T *,STATIC_CAST(void *,res->Next->Data)) == *STATIC_CAST(T *,STATIC_CAST(void *,t)) ) return res; else return &Tail; } template TMDoubleListElement *TMISDoubleListImp::FindPred( const TVoidPointer& t ) { Tail.Data = t; TMDoubleListElement *cursor = &Head; while( *STATIC_CAST(T *,STATIC_CAST(void *,cursor->Next->Data)) < *STATIC_CAST(T *,STATIC_CAST(void *,t)) ) cursor = cursor->Next; Tail.Data = TVoidPointer(); return cursor; } #if defined( BI_OLDNAMES ) #define BI_MISDoubleListImp TMISDoubleListImp #define BI_MISDoubleListIteratorImp TMISDoubleListIteratorImp #endif /*------------------------------------------------------------------------*/ /* */ /* template class TISDoubleListImp */ /* template class TISDoubleListIteratorImp */ /* */ /* Implements a managed sorted double-linked list of pointers to */ /* objects of type T using TStandardAllocator as its memory manager. */ /* This is implemented through the template */ /* TMInternalIDoubleListImp. Since pointers always have meaningful */ /* copy semantics, this class can handle any type of object. */ /* */ /*------------------------------------------------------------------------*/ template class TISDoubleListImp : public TMISDoubleListImp { }; template class TISDoubleListIteratorImp : public TMISDoubleListIteratorImp { public: TISDoubleListIteratorImp( const TISDoubleListImp& l ) : TMISDoubleListIteratorImp( l ) {} }; #if defined( BI_OLDNAMES ) #define BI_ISDoubleListImp TISDoubleListImp #define BI_ISDoubleListIteratorImp TISDoubleListIteratorImp #endif #if defined( BI_CLASSLIB_NO_po ) #pragma option -po. #endif #pragma option -Vo. #endif // CLASSLIB_DLISTIMP_H