www.pudn.com > GameEngine_src.rar > CQueue.h
#ifndef CQueue_h #define CQueue_h #include#include ///////////////////////////////////////////////////////////////////// //队列类模板 //最后修改:2007-10-23 ///////////////////////////////////////////////////////////////////// template class CQueue { private: enum STATE { FULL, EMPTY, NONE, }; public: CQueue(); CQueue( int size ); ~CQueue(); bool Init( int size ); void Free(); bool Enqueue( const T &t ); bool Dequeue( T &t ); void Clear(); bool IsFull() {return m_state == FULL; } bool IsEmpty(){return m_state == EMPTY;} private: T *m_queue; int m_front; int m_rear; int m_size; STATE m_state; }; const DEFAULT_CQ_SIZE = 4; //////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////// template CQueue ::CQueue() { m_queue = NULL; m_front = 0; m_rear = 0; m_size = 0; m_state = EMPTY; } template CQueue ::CQueue( int size ) { Init( size ); } template CQueue ::~CQueue() { Free(); } //////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////// template bool CQueue ::Init( int size ) { m_queue = NULL; m_front = 0; m_rear = 0; m_size = 0; m_state = EMPTY; if (size < DEFAULT_CQ_SIZE ) size = DEFAULT_CQ_SIZE; m_queue = (T *)malloc( size * sizeof(T) ); if ( m_queue == NULL ) return false; m_size = size; return true; } //////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////// template void CQueue ::Free() { Clear(); if ( m_queue != NULL ) { free( m_queue ); m_queue = NULL; m_size = 0; m_state = EMPTY; } } //////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////// template bool CQueue ::Enqueue( const T &t ) { if ( m_state != FULL ) { ::new (&m_queue[m_front]) T; m_queue[m_front] = t; int i = (m_front+1) % m_size; m_state = NONE; m_front = i; if ( i == m_rear ) m_state = FULL; return true; } return false; } //////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////// template bool CQueue ::Dequeue( T &t ) { if ( m_state != EMPTY ) { t = m_queue[m_rear]; m_queue[m_rear].~T(); int i = (m_rear+1) % m_size; m_state = NONE; m_rear = i; if ( i == m_front ) m_state = EMPTY; return true; } return false; } //////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////// template void CQueue ::Clear() { T temp; while ( Dequeue(temp) ); } #endif