Advertisement
C0BRA

Pointer defragging

Sep 28th, 2013
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.78 KB | None | 0 0
  1. #include <iostream>
  2. #include <list>
  3. #include <cstring>
  4.  
  5. using namespace std;
  6.  
  7. struct defrag_enabler
  8. {
  9.     virtual void defrag() = 0;
  10. };
  11.  
  12. std::list<defrag_enabler*> allocated_refrences;
  13.  
  14. void defrag()
  15. {
  16.     for(defrag_enabler* ref : allocated_refrences)
  17.         ref->defrag();
  18. }
  19.  
  20. template<typename T>
  21. struct pointer_ref : public defrag_enabler
  22. {
  23.     T* ptr;
  24.     size_t references;
  25.    
  26.     template<typename... Args>
  27.     pointer_ref<T>(Args... args)
  28.     {
  29.         allocated_refrences.push_back(this);
  30.         cout << "Created\n";
  31.         ptr = new T(args...);
  32.         ref();
  33.     }
  34.    
  35.     ~pointer_ref()
  36.     {
  37.         cout << "Destroyed\n";
  38.         delete ptr;
  39.     }
  40.    
  41.     void ref()
  42.     {
  43.         references++;
  44.         cout << "Made reference (" << references << " total)\n";
  45.     }
  46.    
  47.     void deref()
  48.     {
  49.         references--;
  50.         cout << "Deleted reference (" << references << " total)\n";
  51.         if(references <= 0)
  52.             delete this;
  53.     }
  54.    
  55.     void defrag()
  56.     {
  57.         size_t bytes = sizeof(T);
  58.         T* pNew = new T;
  59.         memcpy(pNew, ptr, bytes);
  60.         delete ptr;
  61.         ptr = pNew;
  62.     }
  63. };
  64.  
  65. template<typename T>
  66. struct pointer
  67. {
  68.     pointer_ref<T>* ref;
  69.    
  70.     pointer<T>(const pointer<T>& other)
  71.     {
  72.         ref = other.ref;
  73.         ref->ref();
  74.     }
  75.    
  76.     template<typename... Args>
  77.     pointer<T>(Args... args)
  78.     {
  79.         ref = new pointer_ref<T>(args...);
  80.     }
  81.    
  82.     T& operator*()
  83.     {
  84.         return *ref->ptr;
  85.     }
  86.    
  87.     ~pointer()
  88.     {
  89.         ref->deref();
  90.     }
  91. };
  92.  
  93.  
  94. int main (int argc, char *argv[])
  95. {
  96.     std::list<pointer<int>> ptrs;
  97.    
  98.     pointer<int> ptr = pointer<int>(10);
  99.    
  100.     for(int i = 0; i < 5; i++)
  101.         ptrs.push_back(ptr);
  102.    
  103.     for(pointer<int>& p : ptrs)
  104.         std::cout << "in list: " << p.ref->ptr << " = " << *p << "\n";
  105.    
  106.     cout << "Defragging...\n";
  107.     defrag();
  108.    
  109.     for(pointer<int>& p : ptrs)
  110.         std::cout << "in list: " << p.ref->ptr << " = " << *p << "\n";
  111.    
  112.     std::cout << *ptr << "\n";
  113.     return 0;
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement