@@ -28,10 +28,11 @@ struct uconsumer { // unique_ptr consumer
28
28
const std::unique_ptr<atyp> &rtrn_cref () const { return held; }
29
29
};
30
30
31
+ // / Custom deleter that is default constructible.
31
32
struct custom_deleter {
32
33
std::string trace_txt;
33
34
34
- custom_deleter () = delete ;
35
+ custom_deleter () = default ;
35
36
explicit custom_deleter (const std::string &trace_txt_) : trace_txt(trace_txt_) {}
36
37
37
38
custom_deleter (const custom_deleter &other) { trace_txt = other.trace_txt + " _CpCtor" ; }
@@ -55,6 +56,14 @@ struct custom_deleter {
55
56
void operator ()(atyp *p) const { std::default_delete<atyp>()(p); }
56
57
void operator ()(const atyp *p) const { std::default_delete<const atyp>()(p); }
57
58
};
59
+ static_assert (std::is_default_constructible<custom_deleter>::value);
60
+
61
+ // / Custom deleter that is not default constructible.
62
+ struct custom_deleter_nd : custom_deleter {
63
+ custom_deleter_nd () = delete ;
64
+ explicit custom_deleter_nd (const std::string &trace_txt_) : custom_deleter(trace_txt_) {}
65
+ };
66
+ static_assert (!std::is_default_constructible<custom_deleter_nd>::value);
58
67
59
68
// clang-format off
60
69
@@ -92,13 +101,18 @@ std::unique_ptr<atyp const, sddc> rtrn_udcp() { return std::unique_ptr<atyp cons
92
101
std::string pass_udmp (std::unique_ptr<atyp, sddm> obj) { return " pass_udmp:" + obj->mtxt ; }
93
102
std::string pass_udcp (std::unique_ptr<atyp const , sddc> obj) { return " pass_udcp:" + obj->mtxt ; }
94
103
95
-
96
104
std::unique_ptr<atyp, custom_deleter> rtrn_udmp_del () { return std::unique_ptr<atyp, custom_deleter>(new atyp{" rtrn_udmp_del" }, custom_deleter{" udmp_deleter" }); }
97
105
std::unique_ptr<atyp const , custom_deleter> rtrn_udcp_del () { return std::unique_ptr<atyp const , custom_deleter>(new atyp{" rtrn_udcp_del" }, custom_deleter{" udcp_deleter" }); }
98
106
99
107
std::string pass_udmp_del (std::unique_ptr<atyp, custom_deleter> obj) { return " pass_udmp_del:" + obj->mtxt + " ," + obj.get_deleter ().trace_txt ; }
100
108
std::string pass_udcp_del (std::unique_ptr<atyp const , custom_deleter> obj) { return " pass_udcp_del:" + obj->mtxt + " ," + obj.get_deleter ().trace_txt ; }
101
109
110
+ std::unique_ptr<atyp, custom_deleter_nd> rtrn_udmp_del_nd () { return std::unique_ptr<atyp, custom_deleter_nd>(new atyp{" rtrn_udmp_del_nd" }, custom_deleter_nd{" udmp_deleter_nd" }); }
111
+ std::unique_ptr<atyp const , custom_deleter_nd> rtrn_udcp_del_nd () { return std::unique_ptr<atyp const , custom_deleter_nd>(new atyp{" rtrn_udcp_del_nd" }, custom_deleter_nd{" udcp_deleter_nd" }); }
112
+
113
+ std::string pass_udmp_del_nd (std::unique_ptr<atyp, custom_deleter_nd> obj) { return " pass_udmp_del_nd:" + obj->mtxt + " ," + obj.get_deleter ().trace_txt ; }
114
+ std::string pass_udcp_del_nd (std::unique_ptr<atyp const , custom_deleter_nd> obj) { return " pass_udcp_del_nd:" + obj->mtxt + " ," + obj.get_deleter ().trace_txt ; }
115
+
102
116
// clang-format on
103
117
104
118
// Helpers for testing.
@@ -171,6 +185,12 @@ TEST_SUBMODULE(class_sh_basic, m) {
171
185
m.def (" pass_udmp_del" , pass_udmp_del);
172
186
m.def (" pass_udcp_del" , pass_udcp_del);
173
187
188
+ m.def (" rtrn_udmp_del_nd" , rtrn_udmp_del_nd);
189
+ m.def (" rtrn_udcp_del_nd" , rtrn_udcp_del_nd);
190
+
191
+ m.def (" pass_udmp_del_nd" , pass_udmp_del_nd);
192
+ m.def (" pass_udcp_del_nd" , pass_udcp_del_nd);
193
+
174
194
py::classh<uconsumer>(m, " uconsumer" )
175
195
.def (py::init<>())
176
196
.def (" valid" , &uconsumer::valid)
0 commit comments