stub_analytics_plugin  1.6
Network Optix Video Analytics SDK
ref_countable.h
1 #pragma once
2 
3 #include <atomic>
4 
5 #include <nx/sdk/interface.h>
6 
7 namespace nx {
8 namespace sdk {
9 
22 {
23 public:
24  RefCountableHolder(const RefCountableHolder&) = delete;
25  RefCountableHolder& operator=(const RefCountableHolder&) = delete;
27  RefCountableHolder& operator=(RefCountableHolder&&) = delete;
28  ~RefCountableHolder() = default;
29 
36  RefCountableHolder(const IRefCountable* refCountable): m_refCountable(refCountable) {}
37 
41  RefCountableHolder(const RefCountableHolder* delegate): m_refCountHolderDelegate(delegate) {}
42 
43  int addRef() const
44  {
45  return m_refCountHolderDelegate ? m_refCountHolderDelegate->addRef() : ++m_refCount;
46  }
47 
51  int releaseRef() const
52  {
53  if (m_refCountHolderDelegate)
54  return m_refCountHolderDelegate->releaseRef();
55 
56  const int newRefCounter = --m_refCount;
57  if (newRefCounter == 0)
58  delete m_refCountable;
59  return newRefCounter;
60  }
61 
62  int refCount() const
63  {
64  if (m_refCountHolderDelegate)
65  return m_refCountHolderDelegate->refCount();
66  return m_refCount;
67  }
68 
69 private:
70  mutable std::atomic<int> m_refCount{1};
71  const IRefCountable* const m_refCountable = nullptr;
72  const RefCountableHolder* const m_refCountHolderDelegate = nullptr;
73 };
74 
78 template <class RefCountableInterface>
79 class RefCountable: public RefCountableInterface
80 {
81 public:
82  RefCountable(const RefCountable&) = delete;
83  RefCountable& operator=(const RefCountable&) = delete;
84  RefCountable(RefCountable&&) = delete;
85  RefCountable& operator=(RefCountable&&) = delete;
86  virtual ~RefCountable() = default;
87 
88  using IRefCountable::queryInterface; //< Enable const overload.
89 
90  virtual int addRef() const override { return m_refCountableHolder.addRef(); }
91  virtual int releaseRef() const override { return m_refCountableHolder.releaseRef(); }
92 
93  int refCount() const { return m_refCountableHolder.refCount(); }
94 
95 protected:
96  RefCountable(): m_refCountableHolder(static_cast<const RefCountableInterface*>(this)) {}
97 
98 private:
99  const RefCountableHolder m_refCountableHolder;
100 };
101 
106 inline int refCount(const IRefCountable* refCountable)
107 {
108  if (!refCountable)
109  return 0;
110 
111  /*unused*/ (void) refCountable->addRef();
112  return refCountable->releaseRef();
113 }
114 
115 } // namespace sdk
116 } // namespace nx
RefCountableHolder(const RefCountableHolder *delegate)
Definition: ref_countable.h:41
RefCountableHolder(const IRefCountable *refCountable)
Definition: ref_countable.h:36
int releaseRef() const
Definition: ref_countable.h:51
virtual int releaseRef() const =0
Definition: debug.cpp:13
virtual int addRef() const =0
Definition: ref_countable.h:21
Definition: i_ref_countable.h:43
Definition: ref_countable.h:79