GENEIAL  0.2=/
 All Classes Pages
ResourcePool.h
1 #pragma once
2 
3 #include <geneial/namespaces.h>
4 #include <geneial/core/population/builder/BaseChromosomeFactory.h>
5 #include <geneial/core/population/builder/MultiValueBuilderSettings.h>
6 #include <mutex>
7 
8 
9 geneial_private_namespace(geneial)
10 {
11 geneial_private_namespace(population)
12 {
13 geneial_private_namespace(management)
14 {
15 
16 geneial_export_namespace
17 {
18 
28 template<typename RESOURCE>
29 class ResourcePool
30 {
31  std::mutex _poolMutex;
32 
33  std::vector<RESOURCE*> _freePool;
34  //TODO (bewo): Think about pruning when having large amounts of resources.
35 
36 public:
37 
44  bool inline retrieve(RESOURCE* &raw_ptr)
45  {
46  std::lock_guard<std::mutex> lock(_poolMutex);
47  if (_freePool.size() > 0)
48  {
49  raw_ptr = _freePool.back();
50  _freePool.pop_back();
51  return true;
52  }
53  else
54  {
55  return false;
56  }
57  }
58 
63  void inline free(RESOURCE*&& raw_ptr)
64  {
65 #ifndef NALLOCREUSE
66  std::lock_guard<std::mutex> lock(_poolMutex);
67  _freePool.emplace_back(raw_ptr);
68 #else
69  delete raw_ptr;
70 #endif
71  }
72 
73  size_t inline size()
74  {
75  return _freePool.size();
76  }
77 
78  virtual ~ResourcePool()
79  {
80  //The used pool is out in the wild should be guarded by some sharedptr.
81  for (auto & ptr : _freePool)
82  {
83  delete ptr;
84  }
85  }
86 };
87 
88 
89 } /* geneial_export_namespace */
90 } /* private namespace management */
91 } /* private namespace population */
92 } /* private namespace geneial */