Dev Essential
Loading...
Searching...
No Matches
reference_counted_object.h
Go to the documentation of this file.
1
14
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
24namespace a_util {
25namespace result {
26namespace detail {
32template <typename Interface, typename Implementation>
33class ReferenceCountedObject : public ReferenceCountedObjectInterface<Interface> {
34private:
35 ReferenceCountedObject(const ReferenceCountedObject&); //=delete;
36 ReferenceCountedObject& operator=(const ReferenceCountedObject&); //=delete;
37
38public:
44 template <typename... Args>
45 ReferenceCountedObject(Args&&... args)
47 _reference_count(0),
48 _resource(std::forward<Args>(args)...)
49 {
50 }
51
53 virtual void addReference() const
54 {
55 ++_reference_count;
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
84private:
86 {
87 }
88
89private:
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
103template <typename Interface, typename Implementation>
104class UncountedObject : public ReferenceCountedObjectInterface<Interface> {
105private:
106 UncountedObject(const UncountedObject&) = delete;
107 UncountedObject& operator=(UncountedObject&) = delete;
108 UncountedObject(UncountedObject&&) = delete;
109 UncountedObject& operator=(UncountedObject&&) = delete;
110
111public:
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
159private:
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
Definition reference_counted_object_intf.h:29
Default implementation of a reference counter.
Definition reference_counted_object.h:33
ReferenceCountedObject(Args &&... args)
Definition reference_counted_object.h:45
virtual void addReference() const
Increase the reference count by 1.
Definition reference_counted_object.h:53
virtual const Interface & getObject() const
Definition reference_counted_object.h:70
virtual void removeReference() const
Decrease the reference count by 1, deleting *this if it was the last reference.
Definition reference_counted_object.h:59
virtual Interface & getObject()
Definition reference_counted_object.h:79
Interface & getObject() override
Definition reference_counted_object.h:154
UncountedObject()=default
Default CTOR.
virtual ~UncountedObject()=default
Default DTOR, provided to be consistent with rule-of-five.
const Interface & getObject() const override
Definition reference_counted_object.h:145
UncountedObject(Args &&... args)
Definition reference_counted_object.h:121
void addReference() const override
Noop.
Definition reference_counted_object.h:130
void removeReference() const override
Noop.
Definition reference_counted_object.h:136
Serves as namespace for result implementation details.
Definition result.h:22
Serves as component for functionality handling error and return types.
Definition result.h:20
Serves as the root component, with common functionality documented in core functionality.
Definition base.h:24