knowL: Knowledge Libraries
Loading...
Searching...
No Matches
ReusableResource.h
1#include <QExplicitlySharedDataPointer>
2#include <QMutex>
3
4#include "Logging.h"
5
6namespace knowCore
7{
13 template<typename _T_>
15 {
16 public:
17 struct Handle_ : public QSharedData
18 {
19 friend ReusableResource;
20 ~Handle_()
21 {
22 QMutexLocker l(&m_owner->m_mutex);
23 m_owner->m_available.append(m_t);
24 }
25 _T_* ressource() const { return m_t; }
26 private:
27 _T_* m_t;
28 ReusableResource<_T_>* m_owner;
29 };
30 using Handle = QExplicitlySharedDataPointer<Handle_>;
31 public:
32 ReusableResource(bool _free_resources = true) : m_free_resources(false) {}
34 QMutexLocker l(&m_mutex);
35 KNOWCORE_ASSERT(m_available.size() == m_resources.size());
36 if(m_free_resources)
37 {
38 qDeleteAll(m_resources);
39 }
40 }
41 Handle get()
42 {
43 Handle h(new Handle_);
44 h->m_owner = this;
45 QMutexLocker l(&m_mutex);
46 if(m_available.isEmpty())
47 {
48 h->m_t = new _T_;
49 m_resources.append(h->m_t);
50 } else {
51 h->m_t = m_available.takeFirst();
52 }
53 return h;
54 }
55 public:
56 bool m_free_resources;
57 QMutex m_mutex;
58 QList<_T_*> m_available;
59 QList<_T_*> m_resources;
60 };
61}
Definition Forward.h:12
Definition ReusableResource.h:15
Definition ReusableResource.h:18