Skip to content

Commit 9e4509a

Browse files
committed
Rename decayed_type to object_type, do not decay
1 parent ebe3d14 commit 9e4509a

File tree

1 file changed

+14
-12
lines changed

1 file changed

+14
-12
lines changed

include/oup/observable_unique_ptr.hpp

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -803,20 +803,20 @@ auto make_observable(Args&&... args) {
803803

804804
using observer_policy = typename Policy::observer_policy;
805805
using control_block_type = basic_control_block<observer_policy>;
806-
using decayed_type = std::decay_t<T>;
806+
using object_type = std::remove_cv_t<T>;
807807
using queries = policy_queries<Policy>;
808808

809809
if constexpr (!queries::make_observer_single_allocation()) {
810810
if constexpr (
811-
has_enable_observer_from_this<T, Policy> &&
811+
has_enable_observer_from_this<object_type, Policy> &&
812812
queries::eoft_base_constructor_needs_block()) {
813813
// Allocate control block first
814814
control_block_type* block = new control_block_type;
815815

816816
// Allocate object
817-
decayed_type* ptr = nullptr;
817+
object_type* ptr = nullptr;
818818
try {
819-
ptr = new T(*block, std::forward<Args>(args)...);
819+
ptr = new object_type(*block, std::forward<Args>(args)...);
820820
} catch (...) {
821821
delete block;
822822
throw;
@@ -825,36 +825,38 @@ auto make_observable(Args&&... args) {
825825
return basic_observable_ptr<T, default_delete, Policy>(block, ptr);
826826
} else {
827827
return basic_observable_ptr<T, default_delete, Policy>(
828-
new T(std::forward<Args>(args)...));
828+
new object_type(std::forward<Args>(args)...));
829829
}
830830
} else {
831831
// Pre-allocate memory
832832
constexpr std::size_t block_size = sizeof(control_block_type);
833-
constexpr std::size_t object_size = sizeof(T);
834-
std::byte* buffer = reinterpret_cast<std::byte*>(operator new(block_size + object_size));
833+
constexpr std::size_t object_size = sizeof(object_type);
834+
constexpr std::size_t obj_offset = block_size;
835+
836+
std::byte* buffer = reinterpret_cast<std::byte*>(operator new(obj_offset + object_size));
835837

836838
try {
837839
// Construct control block first
838840
static_assert(!queries::eoft_constructor_allocates(), "library bug");
839841
control_block_type* block = new (buffer) control_block_type;
840842

841843
// Construct object
842-
decayed_type* ptr = nullptr;
844+
object_type* ptr = nullptr;
843845
if constexpr (
844-
has_enable_observer_from_this<T, Policy> &&
846+
has_enable_observer_from_this<object_type, Policy> &&
845847
queries::eoft_base_constructor_needs_block()) {
846848
// The object has a constructor that can take a control block; just give it
847-
ptr = new (buffer + block_size) decayed_type(*block, std::forward<Args>(args)...);
849+
ptr = new (buffer + obj_offset) object_type(*block, std::forward<Args>(args)...);
848850

849851
// Make owner pointer
850852
return basic_observable_ptr<T, placement_delete, Policy>(block, ptr);
851853
} else {
852-
ptr = new (buffer + block_size) decayed_type(std::forward<Args>(args)...);
854+
ptr = new (buffer + obj_offset) object_type(std::forward<Args>(args)...);
853855

854856
// Make owner pointer
855857
auto sptr = basic_observable_ptr<T, placement_delete, Policy>(block, ptr);
856858

857-
if constexpr (has_enable_observer_from_this<T, Policy>) {
859+
if constexpr (has_enable_observer_from_this<object_type, Policy>) {
858860
// Notify basic_enable_observer_from_this of the control
859861
ptr->set_control_block_(block);
860862
}

0 commit comments

Comments
 (0)