@@ -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
148163namespace 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