NGSolve  4.9
ngstd/dynamicmem.hpp
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