Skip to content

Commit cfae72c

Browse files
committed
Clean up code for control block
1 parent 2831085 commit cfae72c

File tree

1 file changed

+39
-51
lines changed

1 file changed

+39
-51
lines changed

include/oup/observable_unique_ptr.hpp

Lines changed: 39 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -132,17 +132,32 @@ class basic_control_block {
132132
basic_control_block& operator=(const basic_control_block&) = delete;
133133
basic_control_block& operator=(basic_control_block&&) = delete;
134134

135-
void push_ref() noexcept { ++refcount; }
135+
void push_ref() noexcept {
136+
++refcount;
137+
}
136138

137-
void pop_ref() noexcept { --refcount; }
139+
void pop_ref() noexcept {
140+
--refcount;
141+
if (has_no_ref()) {
142+
delete this;
143+
}
144+
}
138145

139-
bool has_no_ref() const noexcept { return refcount == 0; }
146+
bool has_no_ref() const noexcept {
147+
return refcount == 0;
148+
}
140149

141-
bool expired() const noexcept { return (flags & flag_expired) != 0; }
150+
bool expired() const noexcept {
151+
return (flags & flag_expired) != 0;
152+
}
142153

143-
void set_not_expired() noexcept { flags = flags & ~flag_expired; }
154+
void set_not_expired() noexcept {
155+
flags = flags & ~flag_expired;
156+
}
144157

145-
void set_expired() noexcept { flags = flags | flag_expired; }
158+
void set_expired() noexcept {
159+
flags = flags | flag_expired;
160+
}
146161
};
147162

148163
namespace details {
@@ -172,28 +187,21 @@ namespace details {
172187
enable_observer_from_this_base& operator=(const enable_observer_from_this_base&) = delete;
173188
enable_observer_from_this_base& operator=(enable_observer_from_this_base&&) = delete;
174189

175-
virtual ~enable_observer_from_this_base() {
190+
virtual ~enable_observer_from_this_base() noexcept {
176191
if (this_control_block) {
177192
clear_control_block_();
178193
}
179194
}
180195

181196
private:
182-
void pop_ref_() noexcept {
183-
this_control_block->pop_ref();
184-
if (this_control_block->has_no_ref()) {
185-
delete this_control_block;
186-
}
187-
}
188-
189197
void set_control_block_(control_block_type* b) noexcept {
190198
this_control_block = b;
191199
this_control_block->push_ref();
192200
}
193201

194202
void clear_control_block_() noexcept {
195203
this_control_block->set_expired();
196-
pop_ref_();
204+
this_control_block->pop_ref();
197205
this_control_block = nullptr;
198206
}
199207

@@ -272,27 +280,14 @@ class basic_observable_ptr {
272280
return new control_block_type;
273281
}
274282

275-
static void pop_ref_(control_block_type* block) noexcept {
276-
block->pop_ref();
277-
if (block->has_no_ref()) {
278-
delete block;
279-
}
280-
}
281-
282-
static void delete_and_pop_ref_(control_block_type* block, T* data, Deleter& deleter) noexcept {
283+
static void delete_object_(control_block_type* block, T* data, Deleter& deleter) noexcept {
283284
deleter(data);
284-
285285
block->set_expired();
286-
287-
pop_ref_(block);
288-
}
289-
290-
void pop_ref_() noexcept {
291-
pop_ref_(block);
286+
block->pop_ref();
292287
}
293288

294-
void delete_and_pop_ref_() noexcept {
295-
delete_and_pop_ref_(block, ptr_deleter.data, ptr_deleter);
289+
void delete_object_() noexcept {
290+
delete_object_(block, ptr_deleter.data, ptr_deleter);
296291
}
297292

298293
/// Decide whether to allocate a new control block or not.
@@ -356,7 +351,7 @@ class basic_observable_ptr {
356351
/// Destructor, releases owned object if any
357352
~basic_observable_ptr() noexcept {
358353
if (ptr_deleter.data) {
359-
delete_and_pop_ref_();
354+
delete_object_();
360355
block = nullptr;
361356
ptr_deleter.data = nullptr;
362357
}
@@ -402,7 +397,7 @@ class basic_observable_ptr {
402397
basic_observable_ptr(value != nullptr ? manager.block : nullptr, value) {
403398

404399
if (manager.ptr_deleter.data != nullptr && value == nullptr) {
405-
manager.delete_and_pop_ref_();
400+
manager.delete_object_();
406401
}
407402

408403
manager.block = nullptr;
@@ -422,7 +417,7 @@ class basic_observable_ptr {
422417
basic_observable_ptr(value != nullptr ? manager.block : nullptr, value, std::move(del)) {
423418

424419
if (manager.ptr_deleter.data != nullptr && value == nullptr) {
425-
manager.delete_and_pop_ref_();
420+
manager.delete_object_();
426421
}
427422

428423
manager.block = nullptr;
@@ -459,7 +454,7 @@ class basic_observable_ptr {
459454
*/
460455
basic_observable_ptr& operator=(basic_observable_ptr&& value) noexcept {
461456
if (ptr_deleter.data) {
462-
delete_and_pop_ref_();
457+
delete_object_();
463458
}
464459

465460
block = value.block;
@@ -482,7 +477,7 @@ class basic_observable_ptr {
482477
std::enable_if_t<std::is_convertible_v<U*, T*> && std::is_convertible_v<D, Deleter>>>
483478
basic_observable_ptr& operator=(basic_observable_ptr<U,D,Policy>&& value) noexcept {
484479
if (ptr_deleter.data) {
485-
delete_and_pop_ref_();
480+
delete_object_();
486481
}
487482

488483
block = value.block;
@@ -544,7 +539,7 @@ class basic_observable_ptr {
544539
// Delete the old pointer
545540
// (this follows `std::unique_ptr` specs)
546541
if (old_ptr) {
547-
delete_and_pop_ref_(old_block, old_ptr, ptr_deleter);
542+
delete_object_(old_block, old_ptr, ptr_deleter);
548543
}
549544
}
550545

@@ -565,7 +560,7 @@ class basic_observable_ptr {
565560
// Delete the old pointer
566561
// (this follows `std::unique_ptr` specs)
567562
if (old_ptr) {
568-
delete_and_pop_ref_(old_block, old_ptr, ptr_deleter);
563+
delete_object_(old_block, old_ptr, ptr_deleter);
569564
}
570565
}
571566

@@ -588,7 +583,7 @@ class basic_observable_ptr {
588583
block->set_expired();
589584
}
590585

591-
pop_ref_();
586+
block->pop_ref();
592587
block = nullptr;
593588
ptr_deleter.data = nullptr;
594589
}
@@ -788,16 +783,9 @@ class basic_observer_ptr {
788783
control_block_type* block = nullptr;
789784
T* data = nullptr;
790785

791-
void pop_ref_() noexcept {
792-
block->pop_ref();
793-
if (block->has_no_ref()) {
794-
delete block;
795-
}
796-
}
797-
798786
void set_data_(control_block_type* b, T* d) noexcept {
799787
if (data) {
800-
pop_ref_();
788+
block->pop_ref();
801789
}
802790

803791
block = b;
@@ -821,7 +809,7 @@ class basic_observer_ptr {
821809
/// Destructor
822810
~basic_observer_ptr() noexcept {
823811
if (data) {
824-
pop_ref_();
812+
block->pop_ref();
825813
block = nullptr;
826814
data = nullptr;
827815
}
@@ -912,7 +900,7 @@ class basic_observer_ptr {
912900
basic_observer_ptr(basic_observer_ptr<U,Policy>&& manager, T* value) noexcept :
913901
block(value != nullptr ? manager.block : nullptr), data(value) {
914902
if (manager.data != nullptr && value == nullptr) {
915-
manager.pop_ref_();
903+
manager.block->pop_ref();
916904
}
917905

918906
manager.block = nullptr;
@@ -1000,7 +988,7 @@ class basic_observer_ptr {
1000988
/// Set this pointer to null.
1001989
void reset() noexcept {
1002990
if (data) {
1003-
pop_ref_();
991+
block->pop_ref();
1004992
block = nullptr;
1005993
data = nullptr;
1006994
}

0 commit comments

Comments
 (0)