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

📄 refcounter.hpp

📁 FreeFem++可以生成高质量的有限元网格。可以用于流体力学
💻 HPP
字号:
// ********** DO NOT REMOVE THIS BANNER **********// ORIG-DATE:    29 fev 2005  // -*- Mode : c++ -*-//// SUMMARY  : array modelisation // USAGE    : LGPL      // ORG      : LJLL Universite Pierre et Marie Curie, Paris,  FRANCE // AUTHOR   : Frederic Hecht// E-MAIL   : frederic.hecht@ann.jussieu.fr///*    Freefem++ is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.  Freefem++  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 Lesser General Public License for more details.  You should have received a copy of the GNU Lesser General Public License along with Freefem++; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA   */#ifndef REFCOUNTER_HPP#define REFCOUNTER_HPP#include "showverb.hpp" #include "error.hpp" class RefCounter; class baseCountPointer;// ruse pour utiliser le prive c RefCounter de //  pas de syntaxe pour des friends template class baseCountPointer { protected: void  add(const  RefCounter * c)  const;  void  destroyPtr(const RefCounter *  c)  const;};class RefCounter {  mutable int count;  protected:  virtual ~RefCounter() {}  RefCounter() : count(0) {}  public:  int destroy() const {    if(this) {throwassert(count>=0);        if ( count--==0) {	            SHOWVERB( cout << "True  destruction of " << this <<  endl);             delete this;             return true;}         else{ SHOWVERB(cout << " no destruction count=" << count+1 << " " << this <<  endl);              return false;}}   else return false;}    void increment() const {count++;}    void decrement() const {count--;} friend   class baseCountPointer;// private:  RefCounter(const RefCounter &) : count(0) {}   void operator=(const RefCounter &) { count=0;} };inline void baseCountPointer::add(const RefCounter * c)  const    { if (c) c->count++;}    inline void baseCountPointer::destroyPtr(const RefCounter *   c)  const    { if (c) c->destroy();}     template<class T>class CountPointer: private baseCountPointer { T * c; public:  CountPointer() : c(0) {} CountPointer( T * a,bool master=false) :c(a) { if(!master) add(c);}  CountPointer(  T & a) :c(&a) { add(c);} CountPointer(const CountPointer & a) :c(a.c) { add(c);} ~CountPointer()  { destroyPtr(c);c=0;} //void destroy() const { destroyPtr(c);} void destroy()  { destroyPtr(c);c=0;} operator  T * ()   const { return c;} operator   T & () const  {return *c;}  T& operator*() const {return *c;}  T* operator->() const {return c;} bool operator==(const  CountPointer & n) const {return  n.c ==c;} bool operator!=(const  CountPointer & n) const {return  n.c !=c;} bool operator!() const { return !c;} void operator=(const  CountPointer & n) {  if(*this != n) { destroyPtr(c);                 c=n.c;                add(c);                             }}                            void operator=( T * t) {  if( c != t) { if(c) destroyPtr(c);                 c=t;                add(c);                             }} //  for the compile time                void init() {c=0;} //  void master(T *t) {     destroyPtr(c);      c=t;}};#endif

⌨️ 快捷键说明

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