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

📄 refcount.h

📁 很多二维 三维几何计算算法 C++ 类库
💻 H
字号:
/**************************************************************************** * Core Library Version 1.7, August 2004 * Copyright (c) 1995-2004 Exact Computation Project * All rights reserved. * * This file is part of CORE (http://cs.nyu.edu/exact/core/); you may * redistribute it under the terms of the Q Public License version 1.0. * See the file LICENSE.QPL distributed with CORE. * * Licensees holding a valid commercial license may use this file in * accordance with the commercial license agreement provided with the * software. * * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * * * File: RefCount.h * Synopsis:  *     1. This file defines two templated classes: *               RCRepImpl<class N> *     to create Reps of the class N.  The basic functions provided by *     this class is reference counting.   The other class is *               RCImpl<class T> *     for implementing the envelop-letter paradigm for a class whose Rep *     is the class T.  So, T is the "letter", and RCImpl<T> the "envelop". * *     2. All Rep classes (BigIntRep, BigFloatRep, BigRatRep, ExprRep, etc) *     are derived from RCRepImpl<N>.  E.g., * *         class BigRatRep : public RCRepImp<BigRatRep> { *         ... *         } *     (Note the recursive use of "BigRatRep"). * *     3. All Number classes (BigInt, BigFloat, BigRat, Expr, etc) *     are derived from RCImpl<T>.  E.g. * *         typedef RCImpl<BigRatRep> RCBigRat; *         class BigRat : public RCBigRat { *         ... *         } *  * Written by  *       Zilin Du <zilin@cs.nyu.edu> *       Chee Yap <yap@cs.nyu.edu> * * WWW URL: http://cs.nyu.edu/exact/ * Email: exact@cs.nyu.edu * * $URL: svn+ssh://scm.gforge.inria.fr/svn/cgal/branches/CGAL-3.3-branch/Core/include/CGAL/CORE/RefCount.h $ * $Id: RefCount.h 28567 2006-02-16 14:30:13Z lsaboret $ ***************************************************************************/#ifndef _CORE_REFCOUNT_H_#define _CORE_REFCOUNT_H_CORE_BEGIN_NAMESPACEtemplate<class Deriving>class RCRepImpl {public:  RCRepImpl() : refCount(1) {}  void incRef() {    ++refCount;  }  // Without static_cast this to Deriving*,  // the destructor of Deriving class will never been called.  // this is an example of simulating dynamic binding from ATL.  void decRef() {    if (--refCount == 0)      delete static_cast<Deriving*>(this);  }  int getRefCount() const {    return refCount;  }private:  int refCount;};template<class T>class RCImpl {protected:  RCImpl(T* p) : rep(p) {}  RCImpl(const RCImpl& x) : rep(x.rep) {}  T* rep; ///<= rep is the actual representationpublic:  /// get rep (const)  const T& getRep() const {    return *rep;  }  /// get rep (non-const)  T& getRep() {    return *rep;  }  /// clone data  void makeCopy() {    if (rep->getRefCount() > 1) {      T* oldValue = rep;      rep->decRef(); // safe since rep has been referred at least once.      rep = oldValue ? new T(*oldValue) : 0;    }  }#ifdef CORE_RC_DEBUG  /// get counter  int getRefCount() const {    return rep->getRefCount();  }#endif};CORE_END_NAMESPACE#endif // _CORE_REFCOUNT_H_

⌨️ 快捷键说明

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