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

📄 anytype.hpp

📁 FreeFem++可以生成高质量的有限元网格。可以用于流体力学
💻 HPP
字号:
// -*- Mode : c++ -*-//// SUMMARY  :      // USAGE    :        // ORG      : // AUTHOR   : Frederic Hecht// E-MAIL   : hecht@ann.jussieu.fr///*  This file is part of Freefem++  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 *///   definition of the a type to store any bacis type//   void *, long, double, complex, all bigger type //   are pointer //#define WITHCHECKclass basicForEachType;typedef const  basicForEachType * aType;ostream & operator<<(ostream & f,const basicForEachType & e);//typedef  unsigned char  AnyData[24]; //typedef  unsigned char  AnyData[2*(sizeof(void*)+2*sizeof(double))];//  change for 64 architecture must containt 2*(1 ptr + 3 long))//  and for 32    2( ptr + 2 double) //  so 2( 3ptr + double ) sims Ok FH MAI 2006typedef  unsigned char  AnyData[2*(3*sizeof(void*)+sizeof(double))];extern map<const string,basicForEachType *> map_type;template <class T,bool ok>  class CheckSize { } ;template <class T>class CheckSize<T,false> {  CheckSize() { } // private constructor to see the error} ;class AnyTypeWithCheck  {  private:      union {       AnyData data;      void * p;      double r;        long l;      bool b;//      complex<double> c;    }; public:    const basicForEachType *ktype; //    friend ostream & operator<<(ostream &f,const AnyTypeWithCheck &p);      AnyTypeWithCheck(): ktype(0){}    AnyTypeWithCheck(long ll)   {l=ll;ktype=map_type[typeid(long).name()];}    AnyTypeWithCheck(double dd) {r=dd;ktype=map_type[typeid(double).name()];}    AnyTypeWithCheck(bool bb ) {b=bb;ktype=map_type[typeid(bool).name()];}        void operator =(void *pp){p=pp;}};class AnyTypeWithOutCheck  {      public:     union {       AnyData data;      void * p;      double r;        long l;      bool b;//      complex<double> c;    }; public:    AnyTypeWithOutCheck(){}    AnyTypeWithOutCheck(long ll)   {l=ll;}    AnyTypeWithOutCheck(double dd) {r=dd;}    AnyTypeWithOutCheck(void *pp ) {p=pp;}    AnyTypeWithOutCheck(bool bb ) {b=bb;}      void operator =(void *pp){p=pp;}};#ifdef WITHCHECKtypedef   AnyTypeWithCheck AnyType; #elsetypedef   AnyTypeWithOutCheck AnyType; #endifstatic AnyType Nothing;  #ifdef WITHCHECK  template<typename T>   AnyTypeWithCheck SetAny(const T & x)  { 	AnyTypeWithCheck any;    CheckSize<T,sizeof(T)<= sizeof(AnyData) >();	throwassert( (any.ktype=map_type[typeid(T).name()]));	throwassert (sizeof(T) <= sizeof(AnyData));	//a.t=x;	memcpy(&any,&x,sizeof(x));	return any;  }  inline AnyTypeWithCheck PtrtoAny(void * p,aType r)  {	AnyTypeWithCheck any;    any=p;	throwassert(any.ktype=r);    	return any;  }  #else template<typename T>   AnyTypeWithOutCheck inline SetAny(const T & x)  {    AnyTypeWithOutCheck any;   CheckSize<T,sizeof(T)<= sizeof(AnyData) >();   // plus stable ???  F avril 2006 FH.    memcpy(&any,&x,sizeof(x));   // plante  de temps en temps sous wind32 .  FH     //any = *(  (AnyTypeWithOutCheck *) (void *) &x);    return any;  }  inline AnyTypeWithOutCheck PtrtoAny(void * p,aType )  {    return p;  } template<>  inline AnyTypeWithOutCheck SetAny<double>(const double & x)  { return x;} template<> inline  AnyTypeWithOutCheck SetAny<long>(const long & x)  { return x;} template<> inline  AnyTypeWithOutCheck SetAny<bool>(const bool & x)  { return x;} template<typename T>  inline  AnyTypeWithOutCheck SetAny( T *  x) { return reinterpret_cast<void *>( x);} template<typename T>  inline  AnyTypeWithOutCheck SetAny( const T * x) { return reinterpret_cast<void *>( x);}    #endif template<class T> inline const T& GetAny(const AnyTypeWithCheck & x);  template<class T> inline  const T& GetAny(const AnyTypeWithCheck & x){  CheckSize<T,sizeof(T)<= sizeof(AnyData) >(); if (x.ktype!=map_type[typeid(T).name()])   { cerr<< "GetAny: PB type <";   cerr <<typeid(T).name();   cerr << "> <=" << *(x.ktype) << endl;   throw(ErrorExec("exit",1));} return *static_cast<const T*>(static_cast<const void*>(&x));} template<typename T> inline  const T& GetAny(const AnyTypeWithOutCheck & x){  CheckSize<T,sizeof(T)<= sizeof(AnyData) >(); return *static_cast<const T*>(static_cast<const void*>(&x));} template<> inline const double& GetAny<double>(const AnyTypeWithOutCheck & x) { return x.r;}  template<>  inline const long& GetAny<long>(const AnyTypeWithOutCheck & x) { return x.l;}  template<>  inline const bool& GetAny<bool>(const AnyTypeWithOutCheck & x) { return x.b;}  template<class T>  inline T * PGetAny(const AnyTypeWithOutCheck & x) { return static_cast< T*>(x.p);}   //template<class T>  inline   T * const & GetAny<T*>(const AnyTypeWithOutCheck & x) //  { return  x.p;}

⌨️ 快捷键说明

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