70 using OWNER_TYPE = std::remove_cv_t<PTR_TYPE>;
74 using ELEM_TYPE = std::remove_cv_t<std::remove_pointer_t<typename std::unique_ptr<PTR_TYPE, DELETER>::pointer>>;
78 const auto opts = SerOption::is_set(opt, SerOption::as_ptr_elem) ? SerOption::as_ptr : SerOption::none;
79 const auto mode = ser.mode();
81 if ( mode == serializer::MAP ) {
82 auto* ptr_value = ptr.ptr.get();
83 if constexpr ( is_unbounded_array_v<PTR_TYPE> )
84 SST_SER_NAME(SST::Core::Serialization::array(ptr_value, ptr.size), ser.getMapName());
86 SST_SER_NAME(ptr_value, ser.getMapName());
91 if ( mode == serializer::UNPACK ) ptr.ptr.~unique_ptr();
94 if constexpr ( is_unbounded_array_v<PTR_TYPE> ) {
98 if ( mode != serializer::UNPACK )
100 size = get_array_size(ptr.size,
101 "Serialization Error: Array size in SST::Core::Serialization::unique_ptr() cannot fit "
102 "inside size_t. size_t should be used for array sizes.\n");
106 if ( mode == serializer::UNPACK ) ptr.size =
static_cast<SIZE_T
>(size);
110 uintptr_t ptr_stored =
reinterpret_cast<uintptr_t
>(ptr.ptr.get());
111 ser.primitive(ptr_stored);
113 uintptr_t real_ptr = ptr_stored;
114 bool serialize_obj =
false;
117 case serializer::SIZER:
118 serialize_obj = ptr_stored && !ser.sizer().check_pointer_sizer(ptr_stored);
121 case serializer::PACK:
122 serialize_obj = ptr_stored && !ser.packer().check_pointer_pack(ptr_stored);
125 case serializer::UNPACK:
128 real_ptr = ser.unpacker().check_pointer_unpack(ptr_stored);
132 if constexpr ( is_unbounded_array_v<PTR_TYPE> )
133 real_ptr =
reinterpret_cast<uintptr_t
>(
new ELEM_TYPE[size]());
134 else if constexpr ( std::is_array_v<PTR_TYPE> )
135 real_ptr =
reinterpret_cast<uintptr_t
>(
new ELEM_TYPE[std::extent_v<PTR_TYPE>]());
137 real_ptr =
reinterpret_cast<uintptr_t
>(
new OWNER_TYPE());
138 ser.unpacker().report_real_pointer(ptr_stored, real_ptr);
139 serialize_obj =
true;
143 new (&ptr.ptr) std::unique_ptr<PTR_TYPE, DELETER>(
144 reinterpret_cast<ELEM_TYPE*
>(real_ptr), std::forward<
decltype(ptr.del)>(ptr.del));
152 if ( serialize_obj ) {
153 if constexpr ( !is_unbounded_array_v<PTR_TYPE> )
154 SST_SER(*
reinterpret_cast<OWNER_TYPE*
>(real_ptr));
155 else if constexpr ( is_trivially_serializable_v<ELEM_TYPE> )
156 ser.raw(
reinterpret_cast<ELEM_TYPE*
>(real_ptr), size *
sizeof(ELEM_TYPE));
158 pvt::serialize_array(
159 ser,
reinterpret_cast<ELEM_TYPE*
>(real_ptr), opts, size, pvt::serialize_array_element<ELEM_TYPE>);
166 SST_FRIEND_SERIALIZE();
190unique_ptr(std::unique_ptr<ELEM_TYPE[], DELETER>& ptr, SIZE_T& size, DEL&& del)