home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Devil's Doorknob BBS Capture (1996-2003)
/
devilsdoorknobbbscapture1996-2003.iso
/
Dloads
/
OTHERUTI
/
TCPP30-1.ZIP
/
CLASSINC.ZIP
/
DLISTIMP.H
< prev
next >
Wrap
C/C++ Source or Header
|
1992-02-18
|
19KB
|
599 lines
/*------------------------------------------------------------------------*/
/* */
/* DLISTIMP.H */
/* */
/* Copyright Borland International 1991 */
/* All Rights Reserved */
/* */
/*------------------------------------------------------------------------*/
#if !defined( __DLISTIMP_H )
#define __DLISTIMP_H
#if !defined( __MEMMGR_H )
#include <MemMgr.h>
#endif // __MEMMGR_H
/*------------------------------------------------------------------------*/
/* */
/* template <class T> class BI_DoubleListElement */
/* */
/* Node for templates BI_DoubleListImp<T> and BI_IDoubleListImp<T> */
/* */
/*------------------------------------------------------------------------*/
template <class T> class _CLASSTYPE BI_DoubleListImp;
template <class T> class _CLASSTYPE BI_DoubleListBlockInitializer
{
protected:
BI_DoubleListBlockInitializer()
{
PRECONDITION( count != UINT_MAX );
if( count++ == 0 )
BI_DoubleListElement<T>::mgr =
new MemBlocks( sizeof(BI_DoubleListElement<T>), 20 );
}
~BI_DoubleListBlockInitializer()
{
PRECONDITION( count != 0 );
if( --count == 0 )
{
delete BI_DoubleListElement<T>::mgr;
BI_DoubleListElement<T>::mgr = 0;
}
}
static unsigned count;
};
template <class T> unsigned BI_DoubleListBlockInitializer<T>::count = 0;
template <class T> class _CLASSTYPE BI_DoubleListElement
{
public:
BI_DoubleListElement( T t, BI_DoubleListElement<T> _FAR *p ) :
data(t)
{
next = p->next;
prev = p;
p->next = this;
next->prev = this;
}
BI_DoubleListElement();
BI_DoubleListElement<T> _FAR *next;
BI_DoubleListElement<T> _FAR *prev;
T data;
void _FAR *operator new( size_t sz );
void operator delete( void _FAR * );
private:
friend class BI_DoubleListBlockInitializer<T>;
static MemBlocks _FAR *mgr;
};
template <class T> MemBlocks _FAR *BI_DoubleListElement<T>::mgr = 0;
template <class T> inline BI_DoubleListElement<T>::BI_DoubleListElement()
{
next = prev = 0;
}
template <class T>
void _FAR *BI_DoubleListElement<T>::operator new( size_t sz )
{
PRECONDITION( mgr != 0 );
return mgr->allocate( sz );
}
template <class T>
void BI_DoubleListElement<T>::operator delete( void _FAR *b )
{
PRECONDITION( mgr != 0 );
mgr->free( b );
}
inline BI_DoubleListElement<void _FAR *>::BI_DoubleListElement()
{
next = prev = 0;
data = 0;
}
/*------------------------------------------------------------------------*/
/* */
/* template <class T> class BI_DoubleListImp */
/* */
/* Implements a double-linked list of objects of type T. Assumes that */
/* T has meaningful copy semantics and a default constructor. */
/* */
/*------------------------------------------------------------------------*/
template <class T> class _CLASSTYPE BI_DoubleListIteratorImp;
template <class T> class _CLASSTYPE BI_DoubleListImp :
private BI_DoubleListBlockInitializer<T>
{
public:
friend class BI_DoubleListIteratorImp<T>;
BI_DoubleListImp()
{
initList();
}
~BI_DoubleListImp()
{
flush();
}
T peekHead() const
{
return head.next->data;
}
T peekTail() const
{
return tail.prev->data;
}
void add( T );
void addAtTail( T );
void detach( T, int = 0 );
void flush( int = 0 );
int isEmpty() const
{
return head.next == &tail;
}
void forEach( void (_FAR *)(T _FAR &, void _FAR *), void _FAR * );
T _FAR *firstThat( int (_FAR *)(const T _FAR &, void _FAR *),
void _FAR *
) const;
T _FAR *lastThat( int (_FAR *)(const T _FAR &, void _FAR *),
void _FAR *
) const;
protected:
BI_DoubleListElement<T> head, tail;
virtual BI_DoubleListElement<T> _FAR *findDetach( T t )
{
return findPred(t);
}
virtual BI_DoubleListElement<T> _FAR *findPred( T );
private:
virtual void removeData( BI_DoubleListElement<T> _FAR * )
{
}
void initList();
};
template <class T> void BI_DoubleListImp<T>::initList()
{
head.next = &tail;
head.prev = &head;
tail.prev = &head;
tail.next = &tail;
}
template <class T> void BI_DoubleListImp<T>::add( T toAdd )
{
new BI_DoubleListElement<T>( toAdd, &head );
}
template <class T>
BI_DoubleListElement<T> _FAR *BI_DoubleListImp<T>::findPred( T t )
{
tail.data = t;
BI_DoubleListElement<T> _FAR *cursor = &head;
while( t != cursor->next->data )
cursor = cursor->next;
return cursor;
}
template <class T> void BI_DoubleListImp<T>::addAtTail( T toAdd )
{
new BI_DoubleListElement<T>( toAdd, tail.prev );
}
template <class T> void BI_DoubleListImp<T>::detach( T toDetach, int del )
{
BI_DoubleListElement<T> _FAR *pred = findDetach( toDetach );
BI_DoubleListElement<T> _FAR *item = pred->next;
if( item != &tail )
{
pred->next = pred->next->next;
pred->next->prev = pred;
if( del != 0 )
removeData( item );
delete item;
}
}
template <class T> void BI_DoubleListImp<T>::flush( int del )
{
BI_DoubleListElement<T> _FAR *current = head.next;
while( current != &tail )
{
BI_DoubleListElement<T> _FAR *temp = current;
current = current->next;
if( del != 0 )
removeData( temp );
delete temp;
}
initList();
}
template <class T>
void BI_DoubleListImp<T>::forEach( void (_FAR *f)(T _FAR &, void _FAR *),
void _FAR *args
)
{
BI_DoubleListElement<T> _FAR *cur = head.next;
while( cur->next != cur )
{
f( cur->data, args );
cur = cur->next;
}
}
template <class T>
T _FAR *BI_DoubleListImp<T>::firstThat( int (_FAR *cond)(const T _FAR &, void _FAR *),
void _FAR *args
) const
{
BI_DoubleListElement<T> _FAR *cur = head.next;
while( cur->next != cur )
if( cond( cur->data, args ) != 0 )
return &(cur->data);
else
cur = cur->next;
return 0;
}
template <class T>
T _FAR *BI_DoubleListImp<T>::lastThat( int (_FAR *cond)(const T _FAR &, void _FAR *),
void _FAR *args
) const
{
T _FAR *res = 0;
BI_DoubleListElement<T> _FAR *cur = head.next;
while( cur->next != cur )
{
if( cond( cur->data, args ) != 0 )
res = &(cur->data);
cur = cur->next;
}
return res;
}
/*------------------------------------------------------------------------*/
/* */
/* template <class T> class BI_SDoubleListImp */
/* */
/* Implements a 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 T> class _CLASSTYPE BI_SDoubleListImp :
public BI_DoubleListImp<T>
{
public:
void add( T );
protected:
virtual BI_DoubleListElement<T> _FAR *findDetach( T );
virtual BI_DoubleListElement<T> _FAR *findPred( T );
};
template <class T> void BI_SDoubleListImp<T>::add( T t )
{
new BI_DoubleListElement<T>( t, findPred(t) );
}
template <class T>
BI_DoubleListElement<T> _FAR *BI_SDoubleListImp<T>::findDetach( T t )
{
BI_DoubleListElement<T> _FAR *res = findPred(t);
if( res->next->data == t )
return res;
else
return &tail;
}
template <class T>
BI_DoubleListElement<T> _FAR *BI_SDoubleListImp<T>::findPred( T t )
{
tail.data = t;
BI_DoubleListElement<T> _FAR *cursor = &head;
while( cursor->next->data < t )
cursor = cursor->next;
return cursor;
}
/*------------------------------------------------------------------------*/
/* */
/* template <class T> class BI_DoubleListIteratorImp */
/* */
/* Implements a double list iterator. This iterator works with any */
/* direct double list. For indirect lists, see */
/* BI_IDoubleListIteratorImp. */
/* */
/*------------------------------------------------------------------------*/
template <class T> class _CLASSTYPE BI_DoubleListIteratorImp
{
public:
BI_DoubleListIteratorImp( const BI_DoubleListImp<T> _FAR &l )
{
list = &l;
cur = list->head.next;
}
operator int()
{
return cur != &(list->tail);
}
T current()
{
return cur->data;
}
T operator ++ ( int )
{
BI_DoubleListElement<T> _FAR *temp = cur;
cur = cur->next;
return temp->data;
}
T operator ++ ()
{
cur = cur->next;
return cur->data;
}
void restart()
{
cur = list->head.next;
}
private:
const BI_DoubleListImp<T> _FAR *list;
BI_DoubleListElement<T> _FAR *cur;
};
/*------------------------------------------------------------------------*/
/* */
/* template <class T> class BI_InternalIDoubleListImp */
/* */
/* Implements a double-linked list of pointers to objects of type T. */
/* This is implemented through the form of BI_DoubleListImp specified by */
/* List. Since pointers always have meaningful copy semantics, */
/* this class can handle any type of object. */
/* */
/*------------------------------------------------------------------------*/
template <class T, class List> class _CLASSTYPE BI_InternalIDoubleListImp :
public List
{
public:
T _FAR *peekHead() const { return (T _FAR *)head.next->data; }
T _FAR *peekTail() const { return (T _FAR *)tail.prev->data; }
void add( T _FAR *t ) { List::add( t ); }
void addAtTail( T _FAR *t ) { List::addAtTail( t ); }
void detach( T _FAR *t, int del = 0 ) { List::detach( t, del ); }
void forEach( void (_FAR *)(T _FAR &, void _FAR *), void _FAR * );
T _FAR *firstThat( int (_FAR *)(const T _FAR &, void _FAR *),
void _FAR *
) const;
T _FAR *lastThat( int (_FAR *)(const T _FAR &, void _FAR *),
void _FAR *
) const;
protected:
virtual BI_DoubleListElement<void _FAR*> _FAR*findPred( void _FAR* ) = 0;
private:
virtual void removeData( BI_DoubleListElement<void _FAR *> _FAR *block )
{
delete (T _FAR *)(block->data);
}
};
template <class T, class List>
void BI_InternalIDoubleListImp<T,List>::forEach( void (_FAR *f)(T _FAR &, void _FAR *),
void _FAR *args
)
{
BI_DoubleListElement<void _FAR *> _FAR *cur = head.next;
while( cur->next != cur )
{
f( *(T _FAR *)cur->data, args );
cur = cur->next;
}
}
template <class T, class List>
T _FAR *BI_InternalIDoubleListImp<T,List>::firstThat( int (_FAR *cond)(const T _FAR &, void _FAR *),
void _FAR *args
) const
{
BI_DoubleListElement<void _FAR *> _FAR *cur = head.next;
while( cur->next != cur )
if( cond( *(T _FAR *)(cur->data), args ) != 0 )
return (T _FAR *)cur->data;
else
cur = cur->next;
return 0;
}
template <class T, class List>
T _FAR *BI_InternalIDoubleListImp<T,List>::lastThat( int (_FAR *cond)(const T _FAR &, void _FAR *),
void _FAR *args
) const
{
T _FAR *res = 0;
BI_DoubleListElement<void _FAR *> _FAR *cur = head.next;
while( cur->next != cur )
{
if( cond( *(T _FAR *)(cur->data), args ) != 0 )
res = (T _FAR *)(cur->data);
cur = cur->next;
}
return res;
}
/*------------------------------------------------------------------------*/
/* */
/* template <class T> class BI_IDoubleListImp */
/* */
/* Implements a double-linked list of pointers to objects of */
/* type T. This is implemented through the template */
/* BI_InternalIDoubleListImp. Since pointers always have meaningful */
/* copy semantics, this class can handle any type of object. */
/* */
/*------------------------------------------------------------------------*/
template <class T> class _CLASSTYPE BI_IDoubleListImp :
public BI_InternalIDoubleListImp<T, BI_DoubleListImp<void _FAR *> >
{
protected:
virtual BI_DoubleListElement<void _FAR *> _FAR *findPred( void _FAR * );
};
template <class T>
BI_DoubleListElement<void _FAR *> _FAR *BI_IDoubleListImp<T>::findPred( void _FAR *t )
{
tail.data = t;
BI_DoubleListElement<void _FAR *> _FAR *cursor = &head;
while( !(*(T _FAR *)t == *(T _FAR *)(cursor->next->data)) )
cursor = cursor->next;
return cursor;
}
/*------------------------------------------------------------------------*/
/* */
/* template <class T> class BI_ISDoubleListImp */
/* */
/* Implements a sorted double-linked list of pointers to objects of */
/* type T. This is implemented through the template */
/* BI_InternalIDoubleListImp. Since pointers always have meaningful */
/* copy semantics, this class can handle any type of object. */
/* */
/*------------------------------------------------------------------------*/
template <class T> class _CLASSTYPE BI_ISDoubleListImp :
public BI_InternalIDoubleListImp<T, BI_SDoubleListImp<void _FAR *> >
{
protected:
virtual BI_DoubleListElement<void _FAR *> _FAR *findDetach( void _FAR * );
virtual BI_DoubleListElement<void _FAR *> _FAR *findPred( void _FAR * );
};
template <class T>
BI_DoubleListElement<void _FAR *> _FAR *BI_ISDoubleListImp<T>::findDetach( void _FAR *t )
{
BI_DoubleListElement<void _FAR *> _FAR *res = findPred(t);
if( *(T _FAR *)(res->next->data) == *(T _FAR *)t )
return res;
else
return &tail;
}
template <class T>
BI_DoubleListElement<void _FAR *> _FAR *BI_ISDoubleListImp<T>::findPred( void _FAR *t )
{
tail.data = t;
BI_DoubleListElement<void _FAR *> _FAR *cursor = &head;
while( *(T _FAR *)(cursor->next->data) < *(T _FAR *)t )
cursor = cursor->next;
return cursor;
}
/*------------------------------------------------------------------------*/
/* */
/* template <class T> class BI_IDoubleListIteratorImp */
/* */
/* Implements a double list iterator. This iterator works with any */
/* indirect double list. For direct lists, see BI_DoubleListIteratorImp.*/
/* */
/*------------------------------------------------------------------------*/
template <class T>
class _CLASSTYPE BI_IDoubleListIteratorImp :
public BI_DoubleListIteratorImp<void _FAR *>
{
public:
BI_IDoubleListIteratorImp( const BI_DoubleListImp<void _FAR*> _FAR &l ) :
BI_DoubleListIteratorImp<void _FAR *>(l) {}
T _FAR *current()
{
return (T _FAR *)BI_DoubleListIteratorImp<void _FAR *>::current();
}
T _FAR *operator ++ (int)
{
return (T _FAR *)BI_DoubleListIteratorImp<void _FAR *>::operator ++ (1);
}
T _FAR *operator ++ ()
{
return (T _FAR *)BI_DoubleListIteratorImp<void _FAR *>::operator ++ ();
}
};
#endif // __DLISTIMP_H