MsgCircleEx.h 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. using namespace std;
  2. template<typename T> class MsgCircleEx
  3. {
  4. size_t m_MaxThreshold;
  5. INT m_CurPos;
  6. T *m_pDataQueue;
  7. public:
  8. MsgCircleEx(void)
  9. {
  10. m_CurPos = -1;
  11. m_MaxThreshold = 0;
  12. m_pDataQueue = NULL;
  13. };
  14. ~MsgCircleEx(void)
  15. {
  16. Clear();
  17. if(m_pDataQueue)
  18. {
  19. delete []m_pDataQueue;
  20. m_pDataQueue = NULL;
  21. }
  22. };
  23. bool Clear()
  24. {
  25. if(m_pDataQueue)
  26. {
  27. memset(m_pDataQueue,0,sizeof(T)*m_MaxThreshold);
  28. m_CurPos = -1;
  29. }
  30. return true;
  31. };
  32. void init(size_t LoopThreshold)
  33. {
  34. m_MaxThreshold = LoopThreshold*2;
  35. m_pDataQueue = new T[m_MaxThreshold];
  36. memset(m_pDataQueue,0,sizeof(T)*m_MaxThreshold);
  37. m_CurPos = -1;
  38. };
  39. bool DeQueue(T &rMsg)
  40. {
  41. bool ret = false;
  42. //DebugPrint("before deQue size:%d\n",m_DataQueue.size());
  43. if(m_CurPos >= 0)
  44. {
  45. memcpy(&rMsg,&(m_pDataQueue[m_CurPos]),sizeof(T));
  46. --m_CurPos;
  47. ret = true;
  48. }
  49. return ret;
  50. };
  51. T* PeekLatest()
  52. {
  53. if(m_CurPos >= 0)
  54. {
  55. return &(m_pDataQueue[m_CurPos]);
  56. }
  57. return NULL;
  58. };
  59. void DeQueueLatest()
  60. {
  61. if(m_CurPos >= 0)
  62. {
  63. --m_CurPos;
  64. }
  65. };
  66. bool InQueue(T &rMsg)
  67. {
  68. bool ret = false;
  69. if (m_CurPos == -1 || m_CurPos < (INT)m_MaxThreshold)
  70. {
  71. memcpy(&(m_pDataQueue[++m_CurPos]),&rMsg,sizeof(T));
  72. ret = true;
  73. }
  74. return ret;
  75. };
  76. size_t size()
  77. {
  78. if ((m_MaxThreshold / 2) < (size_t)(m_CurPos + 1))
  79. {
  80. return (m_MaxThreshold / 2);
  81. }
  82. return (size_t)(m_CurPos + 1);
  83. };
  84. T& operator [] (size_t idx)
  85. {
  86. if ((INT)idx > m_CurPos)
  87. {
  88. assert(0);
  89. }
  90. return m_pDataQueue[m_CurPos - idx];
  91. };
  92. };