Guest User

Untitled

a guest
Apr 19th, 2018
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.09 KB | None | 0 0
  1. #include <thread>
  2. #include <mutex>
  3. #include <tuple>
  4. #include <list>
  5. #include <memory>
  6.  
  7. namespace pool{
  8.  
  9. namespace internal {
  10. template<typename T>
  11. struct PoolObjectWrapper{
  12. /*PoolObjectWrapper(bool f, T& obj):
  13. free(f), object(obj)
  14. {}*/
  15.  
  16. bool free = false;
  17. T object;
  18. };
  19.  
  20. template<typename T>
  21. struct Deleter
  22. {
  23. Deleter() {}
  24.  
  25. static void deleter(internal::PoolObjectWrapper<T>* t) {
  26. t->free = true;
  27. }
  28.  
  29. void operator () (internal::PoolObjectWrapper<T>* t) {
  30. deleter(t);
  31. }
  32. };
  33. }
  34.  
  35. template<typename T>
  36. struct PooledObjectTrait{
  37. static T make(){ return T(); }
  38. };
  39.  
  40. template<typename T, typename PtrType>
  41. class PooledObject{
  42. public:
  43. PooledObject(internal::PoolObjectWrapper<T>* object):
  44. _ptr(object)
  45. {}
  46.  
  47. PooledObject(internal::PoolObjectWrapper<T>* object, void(*deleter)(internal::PoolObjectWrapper<T>*)):
  48. _ptr(object, deleter)
  49. {}
  50.  
  51. inline T& operator* () { return (*_ptr).object; }
  52. inline T* operator->() { return _ptr->object; }
  53. inline operator bool() const { return _ptr; }
  54.  
  55. private:
  56. PtrType _ptr;
  57. };
  58.  
  59. template<typename T>
  60. using UniquePooledObject = PooledObject<T, std::unique_ptr<internal::PoolObjectWrapper<T>, internal::Deleter<T>>>;
  61.  
  62. template<typename T>
  63. using SharedPooledObject = PooledObject<T, std::shared_ptr<internal::PoolObjectWrapper<T>>>;
  64.  
  65. template<typename T>
  66. class DynamicPool{
  67. public:
  68. DynamicPool(std::size_t initial_size){
  69. //_pool.reserve(initial_size);
  70.  
  71. for(std::size_t i = 0; i < initial_size; ++i){
  72. _pool.push_back({true, PooledObjectTrait<T>::make()});
  73. }
  74. }
  75.  
  76. UniquePooledObject<T> get_unique(){
  77. return UniquePooledObject<T>(get_free_or_make());
  78. }
  79.  
  80. SharedPooledObject<T> get_shared(){
  81. void(*deleter)(internal::PoolObjectWrapper<T>*) = &internal::Deleter<T>::deleter;
  82. return SharedPooledObject<T>(get_free_or_make(), deleter);
  83. }
  84.  
  85. std::size_t size() const { return _pool.size(); }
  86.  
  87. private:
  88. internal::PoolObjectWrapper<T>* get_free_or_make(){
  89. std::lock_guard<std::mutex> lock(_mutex);
  90.  
  91. for(auto& elem: _pool){
  92. if (elem.free){
  93. elem.free = false;
  94. return &elem;
  95. }
  96. }
  97.  
  98. _pool.push_back({false, PooledObjectTrait<T>::make()});
  99. return &_pool.back();
  100. }
  101.  
  102. private:
  103. std::list<internal::PoolObjectWrapper<T>> _pool;
  104. std::mutex _mutex;
  105. };
  106.  
  107. }
  108.  
  109. #include <iostream>
  110.  
  111. int main(){
  112.  
  113. pool::DynamicPool<int> pool(20);
  114.  
  115. {
  116. auto a = pool.get_unique();
  117. auto b = pool.get_shared();
  118. (*a) = 10;
  119. (*b) = 20;
  120. }
  121.  
  122. {
  123. auto a = pool.get_unique();
  124. auto b = pool.get_shared();
  125.  
  126. std::cout << (*a) << std::endl;
  127. std::cout << (*b) << std::endl;
  128. }
  129.  
  130. auto a = pool.get_shared();
  131. std::cout << (*a) << std::endl;
  132.  
  133.  
  134. }
Add Comment
Please, Sign In to add comment