wzarray.hxx

来自「有限元学习研究用源代码(老外的),供科研人员参考」· HXX 代码 · 共 153 行

HXX
153
字号
#ifndef WZARRAY_HXX
#define WZARRAY_HXX

#include "wz.hxx"

// defines the template class wzArray<>

class wzAllocationStrategy;
class wzMultipleArrayController;
class wzMemoryAllocation;
class wzArrayBody;

class wzRange; // because the g++ compiler cannot solve things correctly.

class wzMemoryAllocation{
public:
        wzBoolean allocate(wzByte*& base,
		wzIndex& num, wzIndex min=0, wzIndex fac=1);
};

class wzArrayRangeError: public wzError{
public:
  wzInteger actual;
  wzIndex   max;
  wzArrayRangeError(wzInteger a, wzIndex m)
    :wzError("wzarraytest","RangeError"),actual(a),max(m){;}
};

class wzArrayBody: private wzMemoryAllocation{
protected:
friend class wzMultipleArrayController;
	wzByte*	Base;
	wzIndex	Shift;
	wzIndex Max;
	wzMultipleArrayController* From;
	wzIndex Index;
        void*   address(wzIndex i=0)	const
{
#ifdef wzDebug
 if(i>=Max) {throw wzArrayRangeError(i,Max);}
#endif
 return  (void*)(Base+i*Shift);
}
        wzBoolean Allocate(wzIndex i){return allocate(Base,Max,i,Shift);}
	wzBoolean require(wzIndex i);
	void reinitialize(wzMultipleArrayController&,
			wzIndex size, wzIndex max=0);
	void reinitialize(const wzMultipleArrayController&,
			wzIndex size, wzIndex max=0);
	void reinitialize(wzArrayBody& a, wzIndex off=0);
	void reinitialize();
	wzArrayBody(wzAddress r)
		:Base((wzByte*)r),Max(0),Shift(0),From(0),Index(0){;}
	wzArrayBody(wzIndex size=1, wzIndex max=0)
		:Base(0),Max(0),Shift(size),From(0),Index(0)
		{if(max) Allocate(max);}
	wzArrayBody(wzMultipleArrayController&, 
			wzIndex size, wzIndex max=0);
	wzArrayBody(const wzMultipleArrayController&,
			wzIndex size, wzIndex max=0);
	wzArrayBody(wzArrayBody& a, wzIndex off=0);
	~wzArrayBody();
};

template<class T> class wzArray: public wzArrayBody{
public:
// different array types:
  wzArray(T& t)
    :wzArrayBody((wzAddress)&t){;}
  wzArray(wzIndex multiple=1, wzIndex max=0)
    :wzArrayBody(multiple*sizeof(T),max) {;}
  wzArray(wzArray<T>& a, wzIndex off=0)
    :wzArrayBody(a,off*sizeof(T)){;}
  wzArray(wzArrayBody& a, wzIndex off=0, wzIndex size=sizeof(wzByte))
    :wzArrayBody(a,off*size){;}
  wzArray(wzMultipleArrayController& c, wzIndex mult=1, wzIndex max=0)
    :wzArrayBody(c,mult*sizeof(T),max) {;}
  wzArray(const wzMultipleArrayController& c, wzIndex mult=1,wzIndex max=0)
    :wzArrayBody(c,mult*sizeof(T),max) {;}
  wzArray(wzRange& r, wzIndex mult=1, wzIndex max=0)
    :wzArrayBody(*(wzMultipleArrayController*)&r, mult*sizeof(T),max) {;}
  wzArray(const wzRange& r, wzIndex mult=1, wzIndex max=0)
    :wzArrayBody(*(wzMultipleArrayController const*)&r, mult*sizeof(T),max) {;}
  void reinitialize(wzMultipleArrayController& c, wzIndex mult=1,wzIndex max=0)
  {wzArrayBody::reinitialize(c,mult*sizeof(T),max);}
  void reinitialize(const wzMultipleArrayController& c, wzIndex mult=1,wzIndex max=0)
  {wzArrayBody::reinitialize(c,mult*sizeof(T),max);}
  void reinitialize(wzArrayBody& a, wzIndex off=0)
  {wzArrayBody::reinitialize(a,off);}
  void reinitialize(wzArray<T>& a, wzIndex off=0)
  {wzArrayBody::reinitialize(a,sizeof(T)*off);}
  void reinitialize();
  // fast access:
  T  operator*()                      {return v();}
  T& operator*()                const {return v();}
  const T& operator[](wzIndex i)const {return v(i);}
  T& operator[](wzIndex i)            {return v(i);}
  T* operator+(wzIndex i)       const {return (T*)address(i);}
  // controlled access (allocation if required) - only for separate arrays
  T& operator()(wzIndex i)
  {if(i>=Max) require(i); return v(i);}
  wzBoolean available(wzIndex i)
  {if(i<Max)return wzTrue; return require(i);}
  wzIndex allocated()	const {return Max;}
private:
  wzArray<T>&    operator=(const wzArray<T>&);
  T& v(wzIndex i=0)   const {return *(T*)address(i);}
};

class wzMultipleArrayController{
private:
	   static const   wzIndex TypeUndefined;
	   static const   wzIndex TypeSeparate;
	   static const   wzIndex TypeComponent;
	   wzIndex        Last;
	   wzIndex        Free;
	   wzArray<wzIndex> Type;
	   wzArray<wzIndex> Base;
	   wzArray<wzIndex> Offset;
           wzArray<wzArrayBody*> Field;
protected:
friend class wzArrayBody;
           wzIndex  defineArray    (wzArrayBody *f);
	   wzIndex  defineComponent(wzArrayBody *f,wzIndex base,wzIndex off);
	   void     destroyArray(wzIndex field);
	   wzBoolean      Allocate(wzIndex i);
	   wzIndex        Max;
public:
	   wzBoolean available(wzIndex i)
		{if(i<Max) return wzTrue; return Allocate(i);}
	   void require(wzIndex i)
		{if(i>=Max) if(!Allocate(i+1)) {throw wzNotEnoughMemory();}}
	   void free()
		{Allocate(0);}
	   wzMultipleArrayController(wzIndex ini=0);
	   ~wzMultipleArrayController();
};

class wzArrayStaticInitializationManager{
	static wzIndex count;
protected:
friend class wzMemoryAllocation;
        static wzIndex AllocationCount;
public:
	wzArrayStaticInitializationManager();
	~wzArrayStaticInitializationManager();
};

static wzArrayStaticInitializationManager wzArrayStaticInitializationManager_;

#endif

⌨️ 快捷键说明

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