codealloc.cpp

来自「FreeFem++可以生成高质量的有限元网格。可以用于流体力学」· C++ 代码 · 共 162 行

CPP
162
字号
// -*- 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 */#include <iostream>#include <typeinfo>#include <cstddef>#include <cstdlib>#include <cassert>#include "error.hpp"using namespace std;#include "CodeAlloc.hpp"/*size_t CodeAlloc::nb=0, CodeAlloc::lg=0,CodeAlloc::nbpx=0,CodeAlloc::chunk=2048; size_t CodeAlloc::nbt,CodeAlloc::nbdl=0;CodeAlloc ** CodeAlloc::mem=0;bool CodeAlloc::sort=true;bool  CodeAlloc::cleanning=false;*/static long kerr=0;static long nbsort =0;template<class T>static void  HeapSort(T *c,long n)  {    long l,j,r,i;    T crit;    c--; // on decale de 1 pour que le tableau commence a 1    if( n <= 1) return;    l = n/2 + 1;    r = n;    while (1) { // label 2      if(l <= 1 ) { // label 20	crit = c[r];	c[r--] = c[1];	if ( r == 1 ) { c[1]=crit; return;}      } else  crit = c[--l];       j=l;      while (1) {// label 4	i=j;	j=2*j;	if  (j>r) {c[i]=crit;break;} // L8 -> G2	if ((j<r) && (c[j] < c[j+1])) j++; // L5	if (crit < c[j]) c[i]=c[j]; // L6+1 G4	else {c[i]=crit;break;} //L8 -> G2      }    }  } void CodeAlloc::resize() {  Sort_mem();  if( nbt*1.5 +10 >= nbpx )    {      nbpx = chunk;      mem=(CodeAlloc **)realloc(mem,chunk*sizeof(void*));      if(mem)  nbpx=chunk;      else ErrorExec("Alloc problem",0);      chunk *= 3;       chunk /= 2;      assert(chunk > nbpx);    }}             void CodeAlloc::Sort_mem()  {     size_t i,j;    if(nbt ==0) return;    nbsort++;     HeapSort(mem,nbt);        for( i=0,j=0;i<nbt;i++)      if ( ! isdel(i) )        mem[j++]=mem[i];    nbt=j;    if(nbt != nb)       assert(nbt==nb);  }    void CodeAlloc::clear()  {     return ;    cleanning=true;    Sort_mem();    cout << " Clear Alloc Mem: "<< nb << endl; ;    for(size_t i=0;i<nbt;i++)      {        if( ! isdel(i)) 	  delete mem[i];	      }    cout << " nb " << nb <<  " ==  " << 0 << " , nbsort: " << nbsort <<endl;    nb=0;    lg=0;    nbpx=0;    chunk=2048;     sort=true;    free(mem);    mem=0;    nbdl=0;    if(kerr)    cout << " CodeAlloc: nb err delete  " << kerr << endl;    kerr =0;      cleanning=false;  }   void CodeAlloc::ErrorDel(void *pp)  {//    cerr << " Alloc:: Sorry the pointeur " << pp << " is not allocated \n";         kerr++;    }  void CodeAlloc::operator delete(void * pp) {    //  return ; // FH     if( ! sort  &&  (nb*2 > nbt)  )  Sort_mem();    int ib=0,ie=nbt-1,im;    if(pp< mem[ib]) ErrorDel(pp);    if(pp> mem[ie]) ErrorDel(pp);    int p=-1;    while( ib < ie )      {	im = (ib + ie)/2;	  {	    if(  pp < mem[im]) ie=im-1; // in [ib , im-1] 	    else if (mem[im] == pp) { p=im;break;}	    else ib =im+1;// in [im+1 , ie]	  }      }    if( p <0 && mem[ib] == pp) p=ib;        if(p<0)       ErrorDel(pp);    else {      setdel(p); //le tableau est detruit         nbdl++;nb--;       ::operator delete(pp);    }  }

⌨️ 快捷键说明

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