C/C++ code#include
#include
#include
typedef int V_INT32;
typedef unsigned int V_UINT32;
struct VQueueIdx
{
VQueueIdx(): idx_new( 0 ), idx_old( 0 )
{}
void resetInfo()
{
idx_new = 0;
idx_old = 0;
}
bool isEmpty() const
{
return ( idx_new == idx_old );
}
V_INT32 idx_new;
V_INT32 idx_old;
};
template
class VQueueTemp
{
public:
//从队列中取出
bool pickFromQueue( Type & save_item );
//存入队列
bool sendToQueue( const Type & new_item );
void resetQueue()
{
queue_idx.resetInfo();
}
//查询队列
const Type * lookupQueue( int idx ) const;
bool isQueueEmpty() const
{
return queue_idx.isEmpty();
}
bool isQueueFull() const
{
return ( queue_idx.idx_new + 1 ) % QLen == queue_idx.idx_old;
}
private:
void decQueue();
void incQueue();
bool readQueueItem( Type & save_item ) const;
bool writeQueueItem( const Type & new_item );
int queueItems() const
{
return (queue_idx.idx_new - queue_idx.idx_old + QLen)%QLen;
}
Type msg_queue[QLen];
VQueueIdx queue_idx;
};
template
inline void VQueueTemp::decQueue()
{
int idx = queue_idx.idx_old;
if ( ++idx >= QLen )
{
idx = 0;
}
queue_idx.idx_old = idx;
}
template
inline void VQueueTemp::incQueue()
{
int idx = queue_idx.idx_new;
if ( ++idx >= QLen )
{
idx = 0;
}
queue_idx.idx_new = idx;
}
template
inline bool VQueueTemp::sendToQueue( const Type & new_item )
{
if ( writeQueueItem(new_item) )
{
incQueue();
return true;
}
return false;
}
template
inline bool VQueueTemp::pickFromQueue( Type & save_item )
{
if ( readQueueItem( save_item ) )
{
decQueue();
return true;
}
return false;
}
template
inline bool VQueueTemp::readQueueItem( Type & save_item ) const
{
if( !isQueueEmpty() )
{
save_item = msg_queue[queue_idx.idx_old];
return true;
}
return false;
}
template
inline bool VQueueTemp::writeQueueItem( const Type & new_item )
{
if ( !isQueueFull() )
{
msg_queue[queue_idx.idx_new] = new_item;
return true;
}
return false;
}
template
inline const Type * VQueueTemp::lookupQueue( int idx ) const
{
if ( queueItems() > idx )
{
return &msg_queue[(queue_idx.idx_old+idx)%QLen];
}
return NULL;
} }
Type msg_queue[QLen];
VQueueIdx queue_idx;
};
template
inline void VQueueTemp::decQueue()
{
int idx = queue_idx.idx_old;
if ( ++idx >= QLen )
{
idx = 0;
}
queue_idx.idx_old = idx;
}
template
inline void VQueueTemp::incQueue()
{
int idx = queue_idx.idx_new;
if ( ++idx >= QLen )
{
idx = 0;
}
queue_idx.idx_new = idx;
}
template
inline bool VQueueTemp::sendToQueue( const Type & new_item )
{
if ( writeQueueItem(new_item) )
{
incQueue();
return true;
}
return false;
}
template
inline bool VQueueTemp::pickFromQueue( Type & save_item )
{
if ( readQueueItem( save_item ) )
{
decQueue();
return true;
}
return false;
}
template
inline bool VQueueTemp::readQueueItem( Type & save_item ) const
{
if( !isQueueEmpty() )
{
save_item = msg_queue[queue_idx.idx_old];
return true;
}
return false;
}
template
inline bool VQueueTemp::writeQueueItem( const Type & new_item )
{
if ( !isQueueFull() )
{
msg_queue[queue_idx.idx_new] = new_item;
return true;
}
return false;
}
template
inline const Type * VQueueTemp::lookupQueue( int idx ) const
{
if ( queueItems() > idx )
{
return &msg_queue[(queue_idx.idx_old+idx)%QLen];
}
return NULL;
}