📄 deques.h
字号:
/* */
/* Implements a dequeue of objects of type T, using a double-linked list */
/* as the underlying implementation. */
/* */
/*------------------------------------------------------------------------*/
template <class T> class _CLASSTYPE BI_DequeAsDoubleList :
public BI_DequeAsDoubleListImp<BI_DoubleListImp<T>,T>
{
public:
friend class _CLASSTYPE BI_DequeAsDoubleListIterator<T>;
void forEach( void (_FAR *f)(T _FAR &, void _FAR *), void _FAR *args )
{
data.forEach( f, args );
}
T _FAR *firstThat( int (_FAR *f)(const T _FAR &, void _FAR *),
void _FAR *args
) const
{
return data.firstThat( f, args );
}
T _FAR *lastThat( int (_FAR *f)(const T _FAR &, void _FAR *),
void _FAR *args
) const
{
return data.lastThat( f, args );
}
};
template <class T> class _CLASSTYPE BI_DequeAsDoubleListIterator :
public BI_DoubleListIteratorImp<T>
{
public:
BI_DequeAsDoubleListIterator( const BI_DequeAsDoubleList<T> _FAR & s ) :
BI_DoubleListIteratorImp<T>(s.data)
{
}
};
/*------------------------------------------------------------------------*/
/* */
/* template <class T> class BI_IDequeAsDoubleList */
/* */
/* Implements a dequeue of pointers to objects of type T, */
/* using a double-linked list as the underlying implementation. */
/* */
/*------------------------------------------------------------------------*/
template <class T>
class _CLASSTYPE BI_IDequeAsDoubleList :
public BI_DequeAsDoubleListImp<BI_IDoubleListImp<T>,T _FAR *>,
public virtual TShouldDelete
{
public:
friend class _CLASSTYPE BI_IDequeAsDoubleListIterator<T>;
T _FAR *peekLeft() const
{
PRECONDITION( !isEmpty() );
return (T _FAR *)BI_DequeAsDoubleListImp<BI_IDoubleListImp<T>,T _FAR *>::peekLeft();
}
T _FAR *peekRight() const
{
PRECONDITION( !isEmpty() );
return (T _FAR *)BI_DequeAsDoubleListImp<BI_IDoubleListImp<T>,T _FAR *>::peekRight();
}
T _FAR *getLeft()
{
return (T _FAR *)BI_DequeAsDoubleListImp<BI_IDoubleListImp<T>,T _FAR *>::getLeft();
}
T _FAR *getRight()
{
return (T _FAR *)BI_DequeAsDoubleListImp<BI_IDoubleListImp<T>,T _FAR *>::getRight();
}
void putLeft( T _FAR *t )
{
BI_DequeAsDoubleListImp<BI_IDoubleListImp<T>,T _FAR *>::putLeft( t );
}
void putRight( T _FAR *t )
{
BI_DequeAsDoubleListImp<BI_IDoubleListImp<T>,T _FAR *>::putRight( t );
}
void flush( TShouldDelete::DeleteType dt = TShouldDelete::DefDelete )
{
BI_DequeAsDoubleListImp<BI_IDoubleListImp<T>,T _FAR *>::flush( delObj(dt) );
}
void forEach( void (_FAR *f)(T _FAR &, void _FAR *), void _FAR *args )
{
data.forEach( f, args );
}
T _FAR *firstThat( int (_FAR *f)(const T _FAR &, void _FAR *),
void _FAR *args
) const
{
return data.firstThat( f, args );
}
T _FAR *lastThat( int (_FAR *f)(const T _FAR &, void _FAR *),
void _FAR *args
) const
{
return data.lastThat( f, args );
}
};
template <class T> class _CLASSTYPE BI_IDequeAsDoubleListIterator :
public BI_IDoubleListIteratorImp<T>
{
public:
BI_IDequeAsDoubleListIterator( const BI_IDequeAsDoubleList<T> _FAR& s ) :
BI_IDoubleListIteratorImp<T>(s.data)
{
}
};
/*------------------------------------------------------------------------*/
/* */
/* class BI_ODequeAsDoubleList */
/* */
/* Implements a dequeue of pointers to Object, */
/* using a double-linked list as the underlying implementation. */
/* */
/*------------------------------------------------------------------------*/
class _CLASSTYPE BI_ODequeAsDoubleList
{
public:
friend class _CLASSTYPE BI_ODequeAsDoubleListIterator;
~BI_ODequeAsDoubleList()
{
flush();
}
Object _FAR *peekLeft() const
{
return odeque.peekLeft();
}
Object _FAR *peekRight() const
{
return odeque.peekRight();
}
Object _FAR *getLeft()
{
return odeque.getLeft();
}
Object _FAR *getRight()
{
return odeque.getRight();
}
void putLeft( Object _FAR *o )
{
odeque.putLeft( o );
}
void putRight( Object _FAR *o )
{
odeque.putRight( o );
}
void flush( TShouldDelete::DeleteType dt = TShouldDelete::DefDelete )
{
odeque.flush( dt );
}
int isFull() const
{
return odeque.isFull();
}
int isEmpty() const
{
return odeque.isEmpty();
}
void forEach( void (_FAR*f)(Object _FAR &, void _FAR*), void _FAR*args )
{
odeque.forEach( f, args );
}
Object _FAR *firstThat( int (_FAR *f)(const Object _FAR &, void _FAR *),
void _FAR *args
) const
{
return odeque.firstThat( f, args );
}
Object _FAR *lastThat( int (_FAR *f)(const Object _FAR &, void _FAR *),
void _FAR *args
) const
{
return odeque.lastThat( f, args );
}
int getItemsInContainer() const { return odeque.getItemsInContainer(); }
protected:
BI_IDequeAsDoubleList<Object> odeque;
};
class _CLASSTYPE BI_ODequeAsDoubleListIterator :
public BI_IDequeAsDoubleListIterator<Object>
{
public:
BI_ODequeAsDoubleListIterator( const BI_ODequeAsDoubleList _FAR &d ) :
BI_IDequeAsDoubleListIterator<Object>(d.odeque) {}
};
/*------------------------------------------------------------------------*/
/* */
/* class BI_TCDequeAsDoubleList */
/* */
/* Implements an Object dequeue, with the full semantics of */
/* the BC 2.0 style stack, using a double-linked list as the underlying */
/* implementation. */
/* */
/*------------------------------------------------------------------------*/
class _CLASSTYPE BI_TCDequeAsDoubleList : public Container
{
public:
friend class _CLASSTYPE BI_TCDequeAsDoubleListIterator;
Object _FAR & peekLeft() const
{
return ptrToRef(deque.peekLeft());
}
Object _FAR & peekRight() const
{
return ptrToRef(deque.peekRight());
}
Object _FAR & getLeft()
{
return ptrToRef(deque.getLeft());
}
Object _FAR & getRight()
{
return ptrToRef(deque.getRight());
}
void putLeft( Object _FAR & o )
{
deque.putLeft( &o );
}
void putRight( Object _FAR & o )
{
deque.putRight( &o );
}
virtual void flush( DeleteType dt = DefDelete )
{
deque.flush( dt );
}
virtual int isEmpty() const
{
return deque.isEmpty();
}
virtual countType getItemsInContainer() const
{
return deque.getItemsInContainer();
}
void forEach( void (_FAR*f)(Object _FAR &, void _FAR*), void _FAR*args )
{
deque.forEach( f, args );
}
Object _FAR & firstThat( int (_FAR *f)(const Object _FAR &, void _FAR *),
void _FAR *args
) const
{
return ptrToRef(deque.firstThat( f, args ));
}
Object _FAR & lastThat( int (_FAR *f)(const Object _FAR &, void _FAR *),
void _FAR *args
) const
{
return ptrToRef(deque.lastThat( f, args ));
}
virtual ContainerIterator _FAR & initIterator() const;
virtual classType isA() const
{
return dequeClass;
}
virtual char _FAR *nameOf() const
{
return "BI_DequeAsDoubleList";
}
protected:
BI_ODequeAsDoubleList deque;
};
class _CLASSTYPE BI_TCDequeAsDoubleListIterator : public ContainerIterator
{
public:
BI_TCDequeAsDoubleListIterator( const BI_TCDequeAsDoubleList _FAR &o ) :
iter(o.deque)
{
}
virtual operator int()
{
return int(iter);
}
virtual Object _FAR & current()
{
return Object::ptrToRef(iter.current());
}
virtual Object _FAR & operator ++ ( int )
{
return Object::ptrToRef(iter++);
}
virtual Object _FAR & operator ++ ()
{
return Object::ptrToRef(++iter);
}
virtual void restart()
{
iter.restart();
}
private:
BI_ODequeAsDoubleListIterator iter;
};
inline ContainerIterator _FAR & BI_TCDequeAsDoubleList::initIterator() const
{
return *new BI_TCDequeAsDoubleListIterator( *this );
}
#endif // __DEQUES_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -