CyclicBuf.h
上传用户:royluo
上传日期:2007-01-05
资源大小:1584k
文件大小:3k
源码类别:

游戏

开发平台:

Visual C++

  1. /*****************************************************************************
  2. *                                                                             
  3. *   CyclicBuf.h
  4. *                                                                             
  5. *   Electrical Engineering Faculty - Software Lab                             
  6. *   Spring semester 1998                                                      
  7. *                                                                             
  8. *   Tanks game                                                                
  9. *                                                                             
  10. *   Module description: Template implementing a cyclic buffer.
  11. *                       
  12. *                                                                             
  13. *   Authors: Eran Yariv - 28484475                                           
  14. *            Moshe Zur  - 24070856                                           
  15. *                                                                            
  16. *                                                                            
  17. *   Date: 23/09/98                                                           
  18. *                                                                            
  19. ******************************************************************************/
  20. #ifndef _CYCLIC_BUFFER_H
  21. #define _CYCLIC_BUFFER_H
  22. template <class T, UINT uInitialSize> 
  23. class CCyclicBuffer
  24. {
  25. public:
  26.     CCyclicBuffer ();
  27.     CCyclicBuffer (const T val);
  28.     virtual ~CCyclicBuffer() {}
  29.     void Clear (const T val);           // Sets all elements to val
  30.     T AddHead (const T val);            // Returns previous value (removed)
  31.     T& operator[] (UINT i);             // Access the i'th element 
  32.     T  operator[] (UINT i) const;       // Access the i'th element 
  33. private:
  34.     T       m_Buff[uInitialSize];
  35.     UINT    m_uCurInd;
  36. };
  37. template <class T, UINT uInitialSize> 
  38. inline 
  39. CCyclicBuffer<T, uInitialSize>::CCyclicBuffer () :
  40.     m_uCurInd (0)
  41. {
  42.     ASSERT (uInitialSize > 1);
  43. }
  44. template <class T, UINT uInitialSize> 
  45. inline 
  46. CCyclicBuffer<T, uInitialSize>::CCyclicBuffer (const T val) :
  47.     m_uCurInd (0)
  48. {
  49.     ASSERT (uInitialSize > 1);
  50.     Clear (val);
  51. }
  52. template <class T, UINT uInitialSize> 
  53. inline 
  54. void CCyclicBuffer<T, uInitialSize>::Clear (const T val) 
  55. {
  56.     for (UINT u=0; u<uInitialSize; u++)
  57.         m_Buff[u] = val;        // Requires operator = from T
  58. }
  59. template <class T, UINT uInitialSize> 
  60. inline 
  61. T& CCyclicBuffer<T, uInitialSize>::operator [] (UINT i)
  62. {
  63.     ASSERT (i < uInitialSize);
  64.     return m_Buff[(i + m_uCurInd) % uInitialSize];
  65. }
  66. template <class T, UINT uInitialSize> 
  67. inline 
  68. T CCyclicBuffer<T, uInitialSize>::operator [] (UINT i) const
  69. {
  70.     ASSERT (i < uInitialSize);
  71.     return m_Buff[(i + m_uCurInd) % uInitialSize];
  72. }
  73. template <class T, UINT uInitialSize> 
  74. T CCyclicBuffer<T, uInitialSize>::AddHead (const T val) 
  75. {
  76.     if (0 == m_uCurInd)
  77.         m_uCurInd = uInitialSize - 1;
  78.     else
  79.         m_uCurInd--;
  80.     T prevVal = m_Buff[m_uCurInd];
  81.     m_Buff[m_uCurInd] = val;
  82.     return prevVal;
  83. }
  84. #endif // _CYCLIC_BUFFER_H