ffstack.hpp
来自「FreeFem++可以生成高质量的有限元网格。可以用于流体力学」· HPP 代码 · 共 373 行
HPP
373 行
// -*- 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 *///----------------------------------- // to manage the freefem stack // in the stack we save all the variable // a adresse 0 we have the MeshPointStack to defineP,N, ....// a adresse sizeof(void *) // //// Offset in (void *)const int MeshPointStackOffset =0;const int ParamPtrOffset = 1;const int ElemMatPtrOffset = 2;const int ExprPtrs = 4;const int NbPtrs = 5;const int BeginOffset = 6;// 0 : MeshPoint pointeur // 1 : ParamPtrOffset// 2 : Truc les matrice elementaire#define NEWFFSTACKxxx#ifndef NEWFFSTACKtypedef void *Stack; const Stack NullStack=0;//typedef StackType& Stack;template<class T>T * Stack_offset (Stack stack,size_t offset) { //cout << "Stack_offset" << stack << " " << offset << endl; return (T *) (void *) (((char *) stack)+offset);}template<class T>T * & Stack_Ptr (Stack stack,size_t offset) {return (T * &) (((void **) stack)[offset]);}void ShowType(ostream & f);struct VOIDPtrType { virtual ~VOIDPtrType();};template<class T> struct PtrType: public VOIDPtrType { T * p; PtrType(T* pp):p(pp) {} ~PtrType() {delete p;}};template<class T> struct PtrArrayType: public VOIDPtrType { T * p; PtrArrayType(T* pp):p(pp) {} PtrArrayType() {delete [] p;}};#elsestruct StackType;//typedef void *Stack;typedef StackType & Stack;struct StackType { size_t lg; char * stack; char * MeshPointStack; operator char *() { return stack;} operator void *() { return stack;} operator long *() { return (long *)(void *)stack;} operator void **() {return (void **) (void *) stack;} template<class T> T * Offset(size_t offset){ return (T*) (void*) (stack+offset);} template<class T> T *& ptr(size_t offset){ return (T* &) ((void**) (void *) stack)[offset];} StackType(size_t ll) :lg(ll),stack(new char[ll]),MeshPointStack(new char[1000]) { long * p= ptr<long>(0); long l4=lg/sizeof(long); for (int i = 0;i< l4;i++) p[i]=0; ptr<char>(MeshPointStackOffset)=MeshPointStack; } void clean() { delete []stack; delete [] MeshPointStack; }};StackType * NullStackPtr= 0;StackType & NullStack(*NullStackPtr);//typedef StackType& Stack;template<class T>T * Stack_offset (Stack stack,size_t offset) {return stack.Offset<T>(offset);}template<class T>T * & Stack_Ptr (Stack stack,size_t offset) {return (T * &) (((void **) (void *) stack.stack)[offset]);}void ShowType(ostream & f);struct VOIDPtrType { virtual ~VOIDPtrType();};template<class T> struct PtrType: public VOIDPtrType { T * p; PtrType(T* pp):p(pp) {} ~PtrType() {delete p;}};template<class T> struct PtrArrayType: public VOIDPtrType { T * p; PtrArrayType(T* pp):p(pp) {} PtrArrayType() {delete [] p;}};#endif//------------------------------------ // Add FH mars 2006 // clean pointeur ceated by the language // ---- struct BaseNewInStack { virtual ~BaseNewInStack() {};}; struct BaseNewInStack ; struct StackOfPtr2Free;inline StackOfPtr2Free * & WhereStackOfPtr2Free(Stack s) { return Stack_Ptr<StackOfPtr2Free>(s,ExprPtrs) ;} // fait struct StackOfPtr2Free { typedef vector<BaseNewInStack *>::iterator iterator; StackOfPtr2Free ** where; // where is store the ptr to the stack StackOfPtr2Free *prev; // previous stack vector<BaseNewInStack *> stackptr; static const int sizeofmemory4tmp=1024; int topmemory4tmp; char *memory4tmp ; // void add(BaseNewInStack *p) { // cout << "\n\t\t ### ptr/lg add " << p << " at " << stackptr.size() << " \n"; stackptr.push_back(p);} public: StackOfPtr2Free(Stack s): where(&WhereStackOfPtr2Free(s)), prev(*where), topmemory4tmp(0), // add FH oct 2008 of tmp allocation clean after each instruction memory4tmp(new char[sizeofmemory4tmp]) // add FH oct 2008 of tmp allocation clean after each instruction { stackptr.reserve(20); if(prev) Add2StackOfPtr2Free(s,this); } bool clean() { bool ret= !stackptr.empty(); if(ret) { topmemory4tmp=0;// clean the tmp allocation if(stackptr.size()>=20 && verbosity>2) cout << "\n\t\t ### big?? ptr/lg clean " << stackptr.size() << " ptr's\n "; for (iterator i=stackptr.end(); i != stackptr.begin();) { delete (* (--i) ); //cout << "StackOfPtr2Free: clean " << (* (i) ) << endl; } stackptr.resize(0);// clean the } return ret; } void * alloc(int lg) { int lg8=lg%8; if(lg8) lg += 8-lg8; if(topmemory4tmp + lg>= sizeofmemory4tmp) {ffassert(0);} void * p=static_cast<void*> (memory4tmp+lg); topmemory4tmp+= lg; return p; } ~StackOfPtr2Free() {clean();delete [] memory4tmp; *where=prev;} // restore the previous stackprivate:// no copy .... StackOfPtr2Free(const StackOfPtr2Free&); void operator =(const StackOfPtr2Free&); template<class T> friend T * NewTmp(Stack s); template<class T> friend T * Add2StackOfPtr2Free(Stack s,T * p); }; inline void * NewAllocTmp(Stack s,size_t l){ return WhereStackOfPtr2Free(s)->alloc(l);}template<class T>struct NewInStack: public BaseNewInStack { T * p; bool array; ~NewInStack() { // cout << "~NewInStack " << typeid(T).name() << " " << p << " array " << array << " " << this << "\n"; if(p) delete p;} private: NewInStack(T * pp,bool aa=false) : p(pp),array(aa) { // cout << "NewInStack " << typeid(T).name() << " " << p << " array " << aa << " " << this << "\n"; } template<class TT> friend TT * Add2StackOfPtr2FreeA(Stack s,TT * p); template<class TT> friend TT * Add2StackOfPtr2Free(Stack s,TT * p); };// ajout of 2 class NewRefCountInStack and NewArrayInStack// for clean of meshes template<class T>struct NewRefCountInStack: public BaseNewInStack { T * p; bool array; ~NewRefCountInStack() { // cout << "~NewInStack " << typeid(T).name() << " " << p << " array " << array << " " << this << "\n"; if(p) p->destroy();} private: NewRefCountInStack(T * pp,bool aa=false) : p(pp),array(aa) { // cout << "NewInStack " << typeid(T).name() << " " << p << " array " << aa << " " << this << "\n"; } template<class TT> friend TT * Add2StackOfPtr2FreeRC(Stack s,TT * p); };template<class T>struct NewArrayInStack: public BaseNewInStack { T * p; bool array; ~NewArrayInStack() { // cout << "~NewInStack " << typeid(T).name() << " " << p << " array " << array << " " << this << "\n"; if(p) delete [] p; } private: NewArrayInStack(T * pp,bool aa=false) : p(pp),array(aa) { // cout << "NewInStack " << typeid(T).name() << " " << p << " array " << aa << " " << this << "\n"; } template<class TT> friend TT * Add2StackOfPtr2FreeA(Stack s,TT * p); template<class TT> friend TT * Add2StackOfPtr2Free(Stack s,TT * p); };template<class T>T * Add2StackOfPtr2FreeRC(Stack s,T * p){ if(p) WhereStackOfPtr2Free(s)->add(new NewRefCountInStack<T>(p)); return p;} template<class T>T * Add2StackOfPtr2Free(Stack s,T * p){ if(p) WhereStackOfPtr2Free(s)->add(new NewInStack<T>(p)); return p;} template<class T>T * Add2StackOfPtr2FreeA(Stack s,T * p){ if(p) WhereStackOfPtr2Free(s)->add(new NewArrayInStack<T>(p)); return p;} // fin modif gestion of allocation of Ptr in Language // ---------------------------------------------------#ifndef NEWFFSTACKinline Stack newStack(size_t l) { char * mps; Stack thestack = new char[l]; for (size_t i = 0;i< l/sizeof(long);i++) ((long*) thestack)[i]=0; ((char **) thestack)[MeshPointStackOffset] = mps = new char [1000]; for(int i=0;i<1000;++i) mps[i]=0; WhereStackOfPtr2Free(thestack)=new StackOfPtr2Free(thestack); return thestack; // return *new StackType(l);}}inline void deleteStack(Stack s) { delete WhereStackOfPtr2Free(s); // add gestion of the Ptr delete [] (((char **) s)[MeshPointStackOffset]); delete [] (char *) s; // s.clean(); }#else a faire ....inline Stack newStack(size_t l) {/* Stack thestack = new char[l]; for (int i = 0;i< l/sizeof(long);i++) ((long*) thestack)[i]=0; ((char **) thestack)[MeshPointStackOffset] = new char [1000]; return thestack;*/ return *new StackType(l); }inline void deleteStack(Stack s) { // delete [] (((char **) s)[MeshPointStackOffset]); // delete [] (char *) s; s.clean(); } #endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?