fork(2) download
  1. #include <iostream>
  2. #include <list>
  3. #include <cstring>
  4.  
  5. #define CHECK std::cout << *reinterpret_cast<int*>(array) << '|' << *array << '\n';
  6.  
  7. class bytearray
  8. {
  9. int8_t *array;
  10. size_t size;
  11.  
  12. public:
  13.  
  14. bytearray():
  15. array(0),//wegen ideone 0
  16. size(0) {}
  17.  
  18. explicit bytearray(size_t s):
  19. array(new int8_t[s]()),
  20. size(s) {}
  21.  
  22. bytearray(bytearray&& b):
  23. array(b.array),
  24. size(b.size)
  25. {}
  26.  
  27. bytearray(bytearray const& a):
  28. array(new int8_t[a.size]),
  29. size(a.size)
  30. {
  31. memcpy(array, a.array, size);
  32. }
  33.  
  34. template<class T>
  35. explicit bytearray(T const& val):
  36. array(0)//auch wegen ideone...
  37. {
  38. set<T>(val);
  39. }
  40.  
  41. template<class T>
  42. T get()
  43. {
  44. return *reinterpret_cast<T*>(array);
  45. }
  46.  
  47. template<class T>
  48. void set(T const& val)
  49. {
  50. if(array)
  51. delete array;
  52. array = new int8_t[size = sizeof val];
  53. std::memcpy(array, &val, size);
  54. }
  55.  
  56. template<class T>
  57. T* get_ptr()
  58. {
  59. return reinterpret_cast<T*>(array);
  60. }
  61.  
  62. ~bytearray()
  63. {
  64. size = 0;
  65. delete array;
  66. }
  67. };
  68.  
  69. class _memory_manager
  70. {
  71. std::list<bytearray> ARRAY;
  72.  
  73. public:
  74.  
  75. template<class type>
  76. type* allocate(type const& = type());
  77.  
  78. } memory_manager;
  79.  
  80. template<class type>
  81. type* _memory_manager::allocate(type const& val)
  82. {
  83. ARRAY.push_back(bytearray());
  84. ARRAY.back().set<type>(val);
  85. return ARRAY.back().get_ptr<type>();
  86. }
  87.  
  88. struct A
  89. {
  90. int i;
  91. double *db;
  92.  
  93. A():
  94. i(3),
  95. db(memory_manager.allocate<double>(9)) {}
  96. };
  97.  
  98. int main()
  99. {
  100. int *i = memory_manager.allocate<int>(5);
  101. A* a = memory_manager.allocate<A>();
  102. std::cout << *i << '\n';
  103. std::cout << *a->db << '\n';
  104. }
Success #stdin #stdout 0s 2960KB
stdin
Standard input is empty
stdout
5
9