NGSolve
4.9
|
00001 #ifndef FILE_DYNAMICMEM 00002 #define FILE_DYNAMICMEM 00003 00004 /**************************************************************************/ 00005 /* File: dynamicmem.hpp */ 00006 /* Author: Joachim Schoeberl */ 00007 /* Date: 12. Feb. 2003 */ 00008 /**************************************************************************/ 00009 00010 00011 namespace netgen 00012 { 00013 00014 class BaseDynamicMem; 00015 00016 class BaseDynamicMem 00017 { 00018 private: 00019 static BaseDynamicMem *first; 00020 static BaseDynamicMem *last; 00021 00022 BaseDynamicMem *prev, *next; 00023 size_t size; 00024 char * ptr; 00025 char * name; 00026 00027 protected: 00028 NGS_DLL_HEADER BaseDynamicMem (); 00029 NGS_DLL_HEADER ~BaseDynamicMem (); 00030 NGS_DLL_HEADER void Alloc (size_t s); 00031 NGS_DLL_HEADER void ReAlloc (size_t s); 00032 NGS_DLL_HEADER void Free (); 00033 char * Ptr() const { return ptr; } 00034 // const char * Ptr() const { return ptr; } 00035 NGS_DLL_HEADER void Swap (BaseDynamicMem & m2); 00036 public: 00037 NGS_DLL_HEADER void SetName (const char * aname); 00038 NGS_DLL_HEADER static void Print (); 00039 NGS_DLL_HEADER static void GetUsed (int nr, char * ch); 00040 }; 00041 00042 00043 template <typename T> 00044 class DynamicMem : public BaseDynamicMem 00045 { 00046 public: 00047 DynamicMem () 00048 : BaseDynamicMem () 00049 { 00050 ; 00051 } 00052 DynamicMem (size_t s) 00053 : BaseDynamicMem () 00054 { 00055 Alloc (s); 00056 } 00057 void Alloc (size_t s) 00058 { 00059 BaseDynamicMem::Alloc (sizeof(T) * s); 00060 } 00061 void ReAlloc (size_t s) 00062 { 00063 BaseDynamicMem::ReAlloc (sizeof(T) * s); 00064 } 00065 void Free () 00066 { 00067 BaseDynamicMem::Free (); 00068 } 00069 00070 /* 00071 const T * Ptr() const 00072 { 00073 return reinterpret_cast<const T*> (BaseDynamicMem::Ptr()); 00074 } 00075 */ 00076 T * Ptr() const 00077 { 00078 return reinterpret_cast<T*> (BaseDynamicMem::Ptr()); 00079 } 00080 00081 /* 00082 operator const T* () const 00083 { 00084 return reinterpret_cast<const T*> (BaseDynamicMem::Ptr()); 00085 } 00086 */ 00087 operator T* () const 00088 { 00089 return reinterpret_cast<T*> (BaseDynamicMem::Ptr()); 00090 } 00091 00092 void Swap (DynamicMem<T> & m2) 00093 { 00094 BaseDynamicMem::Swap (m2); 00095 } 00096 protected: 00097 DynamicMem (const DynamicMem & m); 00098 DynamicMem & operator= (const DynamicMem & m); 00099 }; 00100 } 00101 00102 00103 00104 #endif