memory.h
上传用户:gzelex
上传日期:2007-01-07
资源大小:707k
文件大小:4k
开发平台:

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  memory.h
  6. +
  7. +  Copyright (c) 1995  by  Max-Planck-Institut fuer Informatik
  8. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  9. +  All rights reserved.
  10. *******************************************************************************/
  11. #ifndef LEDA_MEMORY_H
  12. #define LEDA_MEMORY_H
  13. /*{Mtext
  14. section{Memory Management} label{Memory Management}
  15. LEDA offers an efficient memory management system that is used internally 
  16. for all node, edge and item types. This system can easily be customized for 
  17. user defined classes by the ``LEDA_MEMORY" macro. You simply have
  18. to add the macro call ``LEDA_MEMORY($T$)" to the declaration of a class
  19. $T$. This redefines new and delete operators for type $T$, such that
  20. they allocate and deallocate memory using LEDA's internal memory manager. 
  21. {bf Attention:}
  22. There is a restriction on the size of the type $T$, however. Macro
  23. LEDA_MEMORY may only be applied to types $T$ with {bf sizeof(T) < 256}.
  24. Note that this condition is (for efficiency reasons) not checked. 
  25. We continue the example from section ref{Overloading}:
  26. medskip
  27. {bf struct} $pair$ ${$\
  28. hspace*{.5cm}$double$ $x$;\
  29. hspace*{.5cm}$double$ $y$;
  30. hspace*{.5cm}$pair()$${ x = y = 0; }$\
  31. hspace*{.5cm}$pair($const $pair& p) { x = p.x; y = p.y; }$
  32. hspace*{.5cm}friend $ostream$&  operator<<($ostream$&,const $pair$&) hspace{.7cm}${$ dots $}$\
  33. hspace*{.5cm}friend $istream$&  operator>>($istream$&,$pair$&) hspace{1.85cm}${$ dots $}$\
  34. hspace*{.5cm}friend $int$ hspace{1.3cm}compare(const $pair& p$, const $pair& q$) ${$ dots $}$
  35. hspace*{.5cm}LEDA_MEMORY($pair$)
  36. $}$;
  37. smallskip
  38. dictionary<$pair$,$int$> D;
  39. }*/
  40. //------------------------------------------------------------------------------
  41. // Memory Management
  42. //------------------------------------------------------------------------------
  43. struct  memory_elem_type { 
  44. memory_elem_type* next; 
  45. };
  46. typedef memory_elem_type* memory_elem_ptr;
  47. extern memory_elem_ptr memory_free_list[];
  48. extern memory_elem_ptr memory_allocate_block(int);
  49. extern memory_elem_ptr allocate_bytes_with_check(int);
  50. extern memory_elem_ptr allocate_words(int);
  51. extern void deallocate_bytes_with_check(void*,int);
  52. extern void deallocate_words(void*,int);
  53. extern void memory_clear();
  54. extern void memory_kill();
  55. extern void print_statistics();
  56. extern int used_memory();
  57. inline memory_elem_ptr allocate_bytes(int bytes)
  58. { memory_elem_ptr* q = memory_free_list+bytes;
  59.   if (*q==0) *q = memory_allocate_block(bytes);
  60.   memory_elem_ptr p = *q;
  61.   *q = p->next;
  62.   return p;
  63. }
  64. inline void deallocate_bytes(void* p, int bytes)
  65. { memory_elem_ptr* q = memory_free_list+bytes;
  66.   memory_elem_ptr(p)->next = *q;
  67.   *q = memory_elem_ptr(p);
  68.  }
  69. inline void deallocate_list(void* head,void* tail, int bytes)
  70. { memory_elem_ptr* q = memory_free_list+bytes;
  71.   memory_elem_ptr(tail)->next = *q;
  72.   *q = memory_elem_ptr(head);
  73.  }
  74. #define LEDA_MEMORY(type)
  75. void* operator new(size_t bytes)
  76. { memory_elem_ptr* q = memory_free_list+bytes;
  77.   if (*q==0) *q = memory_allocate_block(bytes);
  78.   memory_elem_ptr p = *q;
  79.   *q = p->next;
  80.   return p;
  81.  }
  82. void* operator new(size_t,void* p) { return p; }
  83. void  operator delete(void* p, size_t bytes)
  84. { memory_elem_ptr* q = memory_free_list+bytes;
  85.   memory_elem_ptr(p)->next = *q;
  86.   *q = memory_elem_ptr(p);
  87.  }
  88. #define LEDA_MEMORY_WITH_CHECK(type)
  89. void* operator new(size_t bytes)
  90. { return allocate_bytes_with_check(bytes); }
  91. void* operator new(size_t,void* p) { return p; }
  92. void  operator delete(void* p,size_t bytes)
  93. { deallocate_bytes_with_check(p,bytes); }
  94. #endif