windows-nt/Source/XPSP1/NT/drivers/wdm/capture/mini/bt848/queue.h
2020-09-26 16:20:57 +08:00

160 lines
3 KiB
C++

// $Header: G:/SwDev/WDM/Video/bt848/rcs/Queue.h 1.5 1998/05/08 18:18:52 tomz Exp $
#ifndef __QUEUE_H
#define __QUEUE_h
const QueSize = 200;
/* Class: VidBufQueue
* Purpose: Queue of buffers to be sent to BtPisces
*/
template <class T> class Queue
{
private:
T Data [QueSize];
T Dummy;
unsigned items;
unsigned left;
unsigned right;
unsigned size;
public:
bool IsFull();
bool IsEmpty();
unsigned Prev( unsigned index ) const;
unsigned Next( unsigned index ) const;
T Get();
T GetRight();
void Put( const T& t );
T PeekLeft();
T PeekRight();
void Flush();
int GetNumOfItems();
Queue();
~Queue();
};
template <class T> bool Queue<T>::IsFull()
{
return right == Prev( left );
}
template <class T> bool Queue<T>::IsEmpty()
{
return !items;
}
template <class T> int Queue<T>::GetNumOfItems()
{
return items;
}
template <class T> unsigned Queue<T>::Prev( unsigned index ) const
{
if ( index == 0 )
index = size;
return --index;
}
template <class T> unsigned Queue<T>::Next( unsigned index ) const
{
index++;
if ( index == size )
index = 0;
return index;
}
template <class T> T Queue<T>::Get()
{
if(!items){
DebugOut((0, "Queue::Get called on empty queue!!!\n"));
// DEBUG_BREAKPOINT();
return Dummy;
}
T t = Data [left];
Data [left] = T();
left = Next( left );
items--;
return t;
}
/* Method: Queue::GetRight
* Purpose: Gets the next element
* Note: Extreme caution must be used when calling this function. The caller must
* make sure the queue is not empty before calling it. Otherwise bogus data
* will be returned
*/
template <class T> T Queue<T>::GetRight()
{
if(!items){
DebugOut((0, "Queue::GetRight called on empty queue!!!\n"));
// DEBUG_BREAKPOINT();
return Dummy;
}
right = Prev( right );
T t = Data [right];
Data[right] = T();
items--;
return t;
}
template <class T> void Queue<T>::Flush()
{
if(items){
DebugOut((0, "Queue::Flush called on non-empty queue, %d items lost!!!\n", items));
// DEBUG_BREAKPOINT();
}
items = left = right = 0;
}
template <class T> void Queue<T>::Put( const T& t )
{
if ( items >= size ){
DebugOut((0, "Queue::Put called on Full queue!!!\n"));
// DEBUG_BREAKPOINT();
return;
}
Data [right] = t;
right = Next( right );
items++;
}
template <class T> Queue<T>::Queue()
: Data(), Dummy(), items( 0 ), left( 0 ), right( 0 ), size( QueSize )
{
}
template <class T> T Queue<T>::PeekLeft()
{
if(!items){
DebugOut((0, "Queue::PeekLeft called on empty queue!!!\n"));
// DEBUG_BREAKPOINT();
return Dummy;
}
return Data [left];
}
template <class T> T Queue<T>::PeekRight()
{
if(!items){
DebugOut((0, "Queue::PeekRight called on empty queue!!!\n"));
// DEBUG_BREAKPOINT();
return Dummy;
}
return Data [Prev( right )];
}
template <class T> Queue<T>::~Queue()
{
}
typedef Queue<PHW_STREAM_REQUEST_BLOCK> SRBQueue;
#endif