CircularIndex.hpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:4k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #ifndef CircularIndex_H
  14. #define CircularIndex_H
  15. //===========================================================================
  16. //
  17. // .DESCRIPTION
  18. //              Building block for circular buffers. It increment as a normal index.
  19. //              untill it it becomes the maximum size then it becomes zero. 
  20. //
  21. // .TYPICAL USE:
  22. //              to implement a circular buffer.
  23. //
  24. // .EXAMPLE:
  25. //              See MemoryChannel.C
  26. //===========================================================================
  27. ///////////////////////////////////////////////////////////////////////////////
  28. // CircularIndex(  int start= 0,int size=256 );
  29. //   Constuctor
  30. // Parameters:
  31. //      start: where to start to index
  32. //      size : range of the index, will be from 0 to size-1
  33. ///////////////////////////////////////////////////////////////////////////////
  34. // operator int ();
  35. //   returns the index
  36. ///////////////////////////////////////////////////////////////////////////////
  37. // void operator ++ ();
  38. //   increments the index with one, of size is reached it is set to zero
  39. ///////////////////////////////////////////////////////////////////////////////
  40. // friend int full( const CircularIndex& write, const CircularIndex& read );
  41. //   Taken the write index and the read index from a buffer it is calculated
  42. //              if the buffer is full
  43. // Parameters:
  44. //      write: index used a write index for the buffer
  45. //      read : index used a read index for the buffer
  46. // return
  47. //      0 : not full
  48. //      1 : full
  49. ///////////////////////////////////////////////////////////////////////////////
  50. // friend int empty( const CircularIndex& write, const CircularIndex& read );
  51. //   Taken the write index and the read index from a buffer it is calculated
  52. //              if the buffer is empty
  53. // Parameters:
  54. //      write: index used a write index for the buffer
  55. //      read : index used a read index for the buffer
  56. // return
  57. //      0 : not empty
  58. //      1 : empty
  59. ///////////////////////////////////////////////////////////////////////////////
  60. class CircularIndex
  61. {
  62. public:
  63.   inline CircularIndex(  int start= 0,int size=256 );
  64.   operator int ();
  65.   CircularIndex& operator ++ ();
  66.   friend int full( const CircularIndex& write, const CircularIndex& read );
  67.   friend int empty( const CircularIndex& write, const CircularIndex& read );
  68. private:
  69.   int theSize;
  70.   int theIndex;
  71. };
  72. inline CircularIndex::operator int ()
  73. {
  74.   return theIndex;
  75. }
  76. inline CircularIndex& CircularIndex::operator ++ ()
  77. {
  78.   ++theIndex;
  79.   if( theIndex >= theSize ){
  80.     theIndex= 0;
  81.   }
  82.   return *this;
  83. }
  84. inline int full( const CircularIndex& write, const CircularIndex& read )
  85. {
  86.   int readTmp= read.theIndex;
  87.   if( read.theIndex < write.theIndex  )
  88.     readTmp += read.theSize;
  89.   return ( readTmp - write.theIndex) == 1;
  90. }
  91. inline int empty( const CircularIndex& write, const CircularIndex& read )
  92. {
  93.   return read.theIndex == write.theIndex;
  94. }
  95. inline CircularIndex::CircularIndex(  int start,int size ):
  96.   theSize(size),
  97.   theIndex(start)
  98. {
  99. }
  100. #endif