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

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 DLFIFOLIST_HPP
  14. #define DLFIFOLIST_HPP
  15. #include "ArrayPool.hpp"
  16. #include <NdbOut.hpp>
  17. /**
  18.  * Template class used for implementing an
  19.  *   list of object retreived from a pool
  20.  */
  21. template <class T>
  22. class DLFifoList {
  23. public:
  24.   /**
  25.    * List head
  26.    */
  27.   struct Head {
  28.     Head();
  29.     Uint32 firstItem;
  30.     Uint32 lastItem;
  31.   };
  32.   
  33.   DLFifoList(ArrayPool<T> & thePool);
  34.   
  35.   /**
  36.    * Allocate an object from pool - update Ptr
  37.    *
  38.    * Return i
  39.    */
  40.   bool seize(Ptr<T> &);
  41.   /**
  42.    * Allocate object <b>i</b> from pool - update Ptr
  43.    *
  44.    * Return i
  45.    */
  46.   bool seizeId(Ptr<T> &, Uint32 i);
  47.   
  48.   /**
  49.    * Add object to list 
  50.    * 
  51.    * @NOTE MUST be seized from correct pool
  52.    */
  53.   void add(Ptr<T> &);
  54.   /**
  55.    * Remove from list 
  56.    */
  57.   void remove(Ptr<T> &);
  58.   /**
  59.    * Return an object to pool
  60.    */
  61.   void release(Uint32 i);
  62.   
  63.   /**
  64.    * Return an object to pool
  65.    */
  66.   void release(Ptr<T> &);
  67.   /**
  68.    * Return all objects to the pool
  69.    */
  70.   void release();
  71.   /**
  72.    *  Update i & p value according to <b>i</b>
  73.    */
  74.   void getPtr(Ptr<T> &, Uint32 i) const;
  75.   
  76.   /**
  77.    * Update p value for ptr according to i value 
  78.    */
  79.   void getPtr(Ptr<T> &) const ;
  80.   
  81.   /**
  82.    * Get pointer for i value
  83.    */
  84.   T * getPtr(Uint32 i) const ;
  85.   /**
  86.    * Update ptr to first element in list
  87.    *
  88.    * Return i
  89.    */
  90.   bool first(Ptr<T> &) const ;
  91.   /**
  92.    * Get next element
  93.    *
  94.    * NOTE ptr must be both p & i
  95.    */
  96.   bool next(Ptr<T> &) const ;
  97.   
  98.   /**
  99.    * Check if next exists
  100.    *
  101.    * NOTE ptr must be both p & i
  102.    */
  103.   bool hasNext(const Ptr<T> &) const;
  104.   Uint32 noOfElements() const {
  105.     Uint32 c = 0;
  106.     Uint32 i = head.firstItem;
  107.     while(i != RNIL){
  108.       c++;
  109.       const T * t = thePool.getPtr(i);
  110.       i = t->nextList;
  111.     }
  112.     return c;
  113.   }
  114.   /**
  115.    * Print
  116.    * (Run operator NdbOut<< on every element)
  117.    */
  118.   void print(NdbOut & out) {
  119.     Uint32 i = head.firstItem;
  120.     while(i != RNIL){
  121.       T * t = thePool.getPtr(i);
  122.       out << (unsigned int) t << "[" << i << "]:"; 
  123.       t->print(out); out << " ";
  124.       i = t->nextList;
  125.     }
  126.   }
  127.   inline bool isEmpty() const { return head.firstItem == RNIL;}
  128. protected:
  129.   Head head;
  130.   ArrayPool<T> & thePool;
  131. };
  132. template<class T>
  133. class LocalDLFifoList : public DLFifoList<T> {
  134. public:
  135.   LocalDLFifoList(ArrayPool<T> & thePool, typename DLFifoList<T>::Head & _src)
  136.     : DLFifoList<T>(thePool), src(_src)
  137.   {
  138.     this->head = src;
  139.   }
  140.   
  141.   ~LocalDLFifoList(){
  142.     src = this->head;
  143.   }
  144. private:
  145.   typename DLFifoList<T>::Head & src;
  146. };
  147. template <class T>
  148. inline
  149. DLFifoList<T>::DLFifoList(ArrayPool<T> & _pool):
  150.   thePool(_pool){
  151. }
  152. template<class T>
  153. inline
  154. DLFifoList<T>::Head::Head(){
  155.   firstItem = RNIL;
  156.   lastItem = RNIL;
  157. }
  158. /**
  159.  * Allocate an object from pool - update Ptr
  160.  *
  161.  * Return i
  162.  */
  163. template <class T>
  164. inline
  165. bool
  166. DLFifoList<T>::seize(Ptr<T> & p){
  167.   thePool.seize(p);
  168.   if (p.i != RNIL) {
  169.     add(p);
  170.     return true;
  171.   }
  172.   p.p = NULL;
  173.   return false;
  174. }
  175. /**
  176.  * Allocate an object from pool - update Ptr
  177.  *
  178.  * Return i
  179.  */
  180. template <class T>
  181. inline
  182. bool
  183. DLFifoList<T>::seizeId(Ptr<T> & p, Uint32 ir){
  184.   thePool.seizeId(p, ir);
  185.   if(p.i != RNIL){
  186.     add(p);
  187.     return true;
  188.   }
  189.   p.p = NULL;
  190.   return false;
  191. }
  192. template <class T>
  193. inline
  194. void
  195. DLFifoList<T>::add(Ptr<T> & p){
  196.   T * t = p.p;
  197.   Uint32 last = head.lastItem;
  198.   if(p.i == RNIL)
  199.     ErrorReporter::handleAssert("DLFifoList<T>::add", __FILE__, __LINE__);
  200.   
  201.   t->nextList = RNIL;
  202.   t->prevList = last;
  203.   if (head.firstItem == RNIL)
  204.     head.firstItem = p.i;
  205.   head.lastItem = p.i;    
  206.   
  207.   if(last != RNIL){
  208.     T * t2 = thePool.getPtr(last);
  209.     t2->nextList = p.i;
  210.   }
  211. }
  212. /**
  213.  * Return an object to pool
  214.  */
  215. template <class T>
  216. inline
  217. void 
  218. DLFifoList<T>::release(Uint32 i){
  219.   Ptr<T> p;
  220.   p.i = i;
  221.   p.p = thePool.getPtr(i);
  222.   release(p);
  223. }
  224. template <class T>
  225. inline
  226. void 
  227. DLFifoList<T>::remove(Ptr<T> & p){
  228.   T * t = p.p;
  229.   Uint32 ni = t->nextList;
  230.   Uint32 pi = t->prevList;
  231.   if(ni != RNIL){
  232.     T * t = thePool.getPtr(ni);
  233.     t->prevList = pi;
  234.   } else {
  235.     // We are releasing last
  236.     head.lastItem = pi;
  237.   }
  238.   
  239.   if(pi != RNIL){
  240.     T * t = thePool.getPtr(pi);
  241.     t->nextList = ni;
  242.   } else {
  243.     // We are releasing first
  244.     head.firstItem = ni;
  245.   }
  246. }
  247.   
  248. /**
  249.  * Return an object to pool
  250.  */
  251. template <class T>
  252. inline
  253. void 
  254. DLFifoList<T>::release(Ptr<T> & p){
  255.   remove(p);
  256.   thePool.release(p.i);
  257. }  
  258. template <class T>
  259. inline
  260. void 
  261. DLFifoList<T>::release(){
  262.   Ptr<T> p;
  263.   while(head.firstItem != RNIL){
  264.     p.i = head.firstItem;  
  265.     p.p = thePool.getPtr(head.firstItem);    
  266.     T * t = p.p;
  267.     head.firstItem = t->nextList;
  268.     release(p);
  269.   }
  270. }  
  271. template <class T>
  272. inline
  273. void 
  274. DLFifoList<T>::getPtr(Ptr<T> & p, Uint32 i) const {
  275.   p.i = i;
  276.   p.p = thePool.getPtr(i);
  277. }
  278. template <class T>
  279. inline
  280. void 
  281. DLFifoList<T>::getPtr(Ptr<T> & p) const {
  282.   thePool.getPtr(p);
  283. }
  284.   
  285. template <class T>
  286. inline
  287. T * 
  288. DLFifoList<T>::getPtr(Uint32 i) const {
  289.   return thePool.getPtr(i);
  290. }
  291. /**
  292.  * Update ptr to first element in list
  293.  *
  294.  * Return i
  295.  */
  296. template <class T>
  297. inline
  298. bool
  299. DLFifoList<T>::first(Ptr<T> & p) const {
  300.   p.i = head.firstItem;
  301.   if(p.i != RNIL){
  302.     p.p = thePool.getPtr(p.i);
  303.     return true;
  304.   }
  305.   p.p = NULL;
  306.   return false;
  307. }
  308. template <class T>
  309. inline
  310. bool
  311. DLFifoList<T>::next(Ptr<T> & p) const {
  312.   p.i = p.p->nextList;
  313.   if(p.i != RNIL){
  314.     p.p = thePool.getPtr(p.i);
  315.     return true;
  316.   }
  317.   p.p = NULL;
  318.   return false;
  319. }
  320. template <class T>
  321. inline
  322. bool
  323. DLFifoList<T>::hasNext(const Ptr<T> & p) const {
  324.   return p.p->nextList != RNIL;
  325. }
  326. #endif