ADTF  3.18.2
reference_counted_object.h
Go to the documentation of this file.
1 
15 #ifndef A_UTIL_UTIL_RESULT_IMPL_REFERENCE_COUNTED_OBJECT_HEADER_INCLUDED
16 #define A_UTIL_UTIL_RESULT_IMPL_REFERENCE_COUNTED_OBJECT_HEADER_INCLUDED
17 
19 
20 #include <atomic> //std::atomic
21 #include <cstdint> //std::int32_t
22 #include <utility> //std::forward
23 
24 namespace a_util {
25 namespace result {
26 namespace detail {
32 template <typename Interface, typename Implementation>
34 private:
36  ReferenceCountedObject& operator=(const ReferenceCountedObject&); //=delete;
37 
38 public:
44  template <typename... Args>
45  ReferenceCountedObject(Args&&... args)
46  : ReferenceCountedObjectInterface<Interface>(),
48  _resource(std::forward<Args>(args)...)
49  {
50  }
51 
53  virtual void addReference() const
54  {
56  }
57 
59  virtual void removeReference() const
60  {
61  if (0 == (--_reference_count)) {
62  delete this;
63  }
64  }
65 
70  virtual const Interface& getObject() const
71  {
72  return _resource;
73  }
74 
79  virtual Interface& getObject()
80  {
81  return _resource;
82  }
83 
84 private:
85  virtual ~ReferenceCountedObject()
86  {
87  }
88 
89 private:
90 #ifndef __QNX__
91  mutable std::atomic<std::int32_t> _reference_count;
92 #else
93  mutable std::atomic_int_fast32_t _reference_count;
94 #endif
95  Implementation _resource;
96 };
97 
103 template <typename Interface, typename Implementation>
105 private:
106  UncountedObject(const UncountedObject&) = delete;
107  UncountedObject& operator=(UncountedObject&) = delete;
108  UncountedObject(UncountedObject&&) = delete;
109  UncountedObject& operator=(UncountedObject&&) = delete;
110 
111 public:
113  UncountedObject() = default;
114 
120  template <typename... Args>
121  UncountedObject(Args&&... args)
122  : ReferenceCountedObjectInterface<Interface>(), _resource(std::forward<Args>(args)...)
123  {
124  }
125 
127  virtual ~UncountedObject() = default;
128 
130  void addReference() const override
131  {
132  // noop
133  }
134 
136  void removeReference() const override
137  {
138  // noop
139  }
140 
145  const Interface& getObject() const override
146  {
147  return _resource;
148  }
149 
154  Interface& getObject() override
155  {
156  return _resource;
157  }
158 
159 private:
160  Implementation _resource;
161 };
162 
163 } // namespace detail
164 } // namespace result
165 } // namespace a_util
166 
167 #endif // A_UTIL_UTIL_RESULT_IMPL_REFERENCE_COUNTED_OBJECT_HEADER_INCLUDED
Default implementation of a reference counter.
virtual void removeReference() const
Decrease the reference count by 1, deleting *this if it was the last reference.
std::atomic< std::int32_t > _reference_count
Reference to count atomically.
virtual void addReference() const
Increase the reference count by 1.
virtual Interface & getObject()
Get a reference to the handled object's interface.
ReferenceCountedObject(Args &&... args)
CTOR constructing the managed resource and the reference counter to an initial value of zero.
virtual const Interface & getObject() const
Get a reference to the handled object's interface - provided for const correctness.
Default implementation of a non-counting reference counter.
const Interface & getObject() const override
Get a reference to the handled object's interface - provided for const correctness.
UncountedObject()=default
Default CTOR.
Interface & getObject() override
Get a reference to the handled object's interface.
virtual ~UncountedObject()=default
Default DTOR, provided to be consistent with rule-of-five.
UncountedObject(Args &&... args)
CTOR constructing the managed resource.
Implementation _resource
Resource to manage.
Serves as the root component, with common functionality documented in core functionality.
Definition: base.h:24
Private API for ReferenceCountedObjectInterface type.