⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sllist.hpp

📁 mysql-5.0.22.tar.gz源码包
💻 HPP
字号:
/* Copyright (C) 2003 MySQL AB   This program is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation; either version 2 of the License, or   (at your option) any later version.   This program is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.   You should have received a copy of the GNU General Public License   along with this program; if not, write to the Free Software   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#ifndef SLLIST_HPP#define SLLIST_HPP#include "ArrayPool.hpp"#include <NdbOut.hpp>/** * Template class used for implementing an *   list of object retreived from a pool */template <class T>class SLList {public:  /**   * List head   */  struct Head {    Head();    Uint32 firstItem;  };    SLList(ArrayPool<T> & thePool);    /**   * Allocate an object from pool - update Ptr   *   * Return i   */  bool seize(Ptr<T> &);  /**   * Allocate object <b>i</b> from pool - update Ptr   *   * Return i   */  bool seizeId(Ptr<T> &, Uint32 i);  /**   * Allocate <b>n</b>objects from pool   *   * Return i value of first object allocated or RNIL if fails   */  bool seizeN(Ptr<T> &, Uint32 n);    /**   * Return all objects to the pool   */  void release();  /**   *  Update i & p value according to <b>i</b>   */  void getPtr(Ptr<T> &, Uint32 i) const;    /**   * Update p value for ptr according to i value    */  void getPtr(Ptr<T> &) const ;    /**   * Get pointer for i value   */  T * getPtr(Uint32 i) const ;  /**   * Update ptr to first element in list   *   * Return i   */  bool first(Ptr<T> &) const ;  /**   * Get next element   *   * NOTE ptr must be both p & i   */  bool next(Ptr<T> &) const ;    /**   * Check if next exists   *   * NOTE ptr must be both p & i   */  bool hasNext(const Ptr<T> &) const;  Uint32 noOfElements() const {    Uint32 c = 0;    Uint32 i = head.firstItem;    while(i != RNIL){      c++;      const T * t = thePool.getPtr(i);      i = t->nextList;    }    return c;  }  /**   * Print   * (Run operator NdbOut<< on every element)   */  void print(NdbOut & out) {    out << "firstItem = " << head.firstItem << endl;    Uint32 i = head.firstItem;    while(i != RNIL){      T * t = thePool.getPtr(i);      t->print(out); out << " ";      i = t->next;    }  }  inline bool empty() const { return head.firstItem == RNIL;}protected:  Head head;  ArrayPool<T> & thePool;};template<class T>class LocalSLList : public SLList<T> {public:  LocalSLList(ArrayPool<T> & thePool, typename SLList<T>::Head & _src)    : SLList<T>(thePool), src(_src)  {    this->head = src;  }    ~LocalSLList(){    src = this->head;  }private:  typename SLList<T>::Head & src;};template <class T>inlineSLList<T>::SLList(ArrayPool<T> & _pool):  thePool(_pool){}template<class T>inlineSLList<T>::Head::Head(){  firstItem = RNIL;}template <class T>inlineboolSLList<T>::seize(Ptr<T> & p){  thePool.seize(p);  T * t = p.p;  Uint32 ff = head.firstItem;  if(p.i != RNIL){    t->nextList = ff;    head.firstItem = p.i;    return true;  }  return false;}template <class T>inlineboolSLList<T>::seizeId(Ptr<T> & p, Uint32 ir){  thePool.seizeId(p, ir);  T * t = p.p;  Uint32 ff = head.firstItem;  if(p.i != RNIL){    t->nextList = ff;    head.firstItem = p.i;    return true;  }  return false;}template <class T>inlineboolSLList<T>::seizeN(Ptr<T> & p, Uint32 n){  for(Uint32 i = 0; i < n; i++){    if(seize(p) == RNIL){      /**       * Failure       */      for(; i > 0; i--){	const Uint32 tmp = head.firstItem;	const T * t = thePool.getPtr(tmp);	head.firstItem = t->nextList;	thePool.release(tmp);      }      return false;    }  }      /**   * Success   */  p.i = head.firstItem;  p.p = thePool.getPtr(head.firstItem);    return true;}template <class T>inlinevoid SLList<T>::release(){  while(head.firstItem != RNIL){    const T * t = thePool.getPtr(head.firstItem);    const Uint32 i = head.firstItem;    head.firstItem = t->nextList;    thePool.release(i);  }}  template <class T>inlinevoid SLList<T>::getPtr(Ptr<T> & p, Uint32 i) const {  p.i = i;  p.p = thePool.getPtr(i);}template <class T>inlinevoid SLList<T>::getPtr(Ptr<T> & p) const {  thePool.getPtr(p);}  template <class T>inlineT * SLList<T>::getPtr(Uint32 i) const {  return thePool.getPtr(i);}/** * Update ptr to first element in list * * Return i */template <class T>inlineboolSLList<T>::first(Ptr<T> & p) const {  Uint32 i = head.firstItem;  p.i = i;  if(i != RNIL){    p.p = thePool.getPtr(i);    return true;  }  p.p = NULL;  return false;}template <class T>inlineboolSLList<T>::next(Ptr<T> & p) const {  Uint32 i = p.p->nextList;  p.i = i;  if(i != RNIL){    p.p = thePool.getPtr(i);    return true;  }  p.p = NULL;  return false;}template <class T>inlineboolSLList<T>::hasNext(const Ptr<T> & p) const {  return p.p->nextList != RNIL;}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -