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

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 ARRAY_HPP
  14. #define ARRAY_HPP
  15. #include "ArrayPool.hpp"
  16. #include <pc.hpp>
  17. #include <ErrorReporter.hpp>
  18. /**
  19.  * Template class used for implementing an
  20.  *   array of object retreived from a pool
  21.  */
  22. template <class T>
  23. class Array {
  24. public:
  25.   Array(ArrayPool<T> & thePool);
  26.   /**
  27.    * Allocate an <b>n</b> objects from pool
  28.    *   These can now be addressed with 0 <= ptr.i < n
  29.    */
  30.   bool seize(Uint32 i);
  31.   /**
  32.    * Release all object from array
  33.    */
  34.   void release();
  35.   /**
  36.    * Return current size of array
  37.    */
  38.   Uint32 getSize() const;
  39.   /**
  40.    * empty
  41.    */
  42.   inline bool empty() const { return sz == 0;}
  43.   /**
  44.    *  Update i & p value according to <b>i</b>
  45.    */
  46.   void getPtr(Ptr<T> &, Uint32 i) const;
  47.   /**
  48.    * Update p value for ptr according to i value 
  49.    */
  50.   void getPtr(Ptr<T> &) const ;
  51.   
  52.   /**
  53.    * Get pointer for i value
  54.    */
  55.   T * getPtr(Uint32 i) const;
  56.   
  57. private:
  58.   Uint32 base, sz;
  59.   ArrayPool<T> & thePool;
  60. };  
  61. template<class T>
  62. inline
  63. Array<T>::Array(ArrayPool<T> & _pool)
  64.   :  thePool(_pool)
  65. {
  66.   sz = 0;
  67.   base = RNIL;
  68. }
  69. template<class T>
  70. inline
  71. bool
  72. Array<T>::seize(Uint32 n){
  73.   if(base == RNIL && n > 0){
  74.     base = thePool.seizeN(n);
  75.     if(base != RNIL){
  76.       sz = n;
  77.       return true;
  78.     }
  79.     return false;
  80.   }
  81.   ErrorReporter::handleAssert("Array<T>::seize failed", __FILE__, __LINE__);
  82.   return false;
  83. }
  84. template<class T>
  85. inline
  86. void 
  87. Array<T>::release(){
  88.   if(base != RNIL){
  89.     thePool.releaseN(base, sz);
  90.     sz = 0;
  91.     base = RNIL;
  92.     return;
  93.   }
  94. }
  95. template<class T>
  96. inline
  97. Uint32 
  98. Array<T>::getSize() const {
  99.   return sz;
  100. }
  101. template <class T>
  102. inline
  103. void 
  104. Array<T>::getPtr(Ptr<T> & p, Uint32 i) const {
  105.   p.i = i;
  106. #ifdef ARRAY_GUARD
  107.   if(i < sz && base != RNIL){
  108.     p.p = thePool.getPtr(i + base);
  109.     return;
  110.   } else {
  111.   ErrorReporter::handleAssert("Array::getPtr failed", __FILE__, __LINE__);
  112.   }
  113. #endif
  114.   p.p = thePool.getPtr(i + base);
  115. }
  116. template<class T>
  117. inline
  118. void
  119. Array<T>::getPtr(Ptr<T> & ptr) const {
  120. #ifdef ARRAY_GUARD
  121.   if(ptr.i < sz && base != RNIL){
  122.     ptr.p = thePool.getPtr(ptr.i + base);
  123.     return;
  124.   } else {
  125.     ErrorReporter::handleAssert("Array<T>::getPtr failed", __FILE__, __LINE__);
  126.   }
  127. #endif
  128.   ptr.p = thePool.getPtr(ptr.i + base);
  129. }
  130. template<class T>
  131. inline
  132. T * 
  133. Array<T>::getPtr(Uint32 i) const {
  134. #ifdef ARRAY_GUARD
  135.   if(i < sz && base != RNIL){
  136.     return thePool.getPtr(i + base);
  137.   } else {
  138.     ErrorReporter::handleAssert("Array<T>::getPtr failed", __FILE__, __LINE__);
  139.   }
  140. #endif
  141.   return thePool.getPtr(i + base);
  142. }
  143. #endif