Skip to content

Commit 3d7078e

Browse files
committed
Merged test case to check writeonly properties
2 parents 421b477 + 8e9f905 commit 3d7078e

File tree

1 file changed

+35
-0
lines changed

1 file changed

+35
-0
lines changed

include/pybind11/pybind11.h

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1174,6 +1174,14 @@ class class_ : public detail::generic_type {
11741174
return *this;
11751175
}
11761176

1177+
template <typename C, typename D, typename... Extra>
1178+
class_ &def_writeonly(const char *name, D C::*pm, const Extra& ...extra) {
1179+
static_assert(std::is_base_of<C, type>::value, "def_writeonly() requires a class member (or base class member)");
1180+
cpp_function fset([pm](type &c, const D &value) { c.*pm = value; }, is_method(*this));
1181+
def_property_writeonly(name, fset, extra...);
1182+
return *this;
1183+
}
1184+
11771185
template <typename D, typename... Extra>
11781186
class_ &def_readwrite_static(const char *name, D *pm, const Extra& ...extra) {
11791187
cpp_function fget([pm](object) -> const D &{ return *pm; }, scope(*this)),
@@ -1189,31 +1197,58 @@ class class_ : public detail::generic_type {
11891197
return *this;
11901198
}
11911199

1200+
template <typename D, typename... Extra>
1201+
class_ &def_writeonly_static(const char *name, D *pm, const Extra& ...extra) {
1202+
cpp_function fset([pm](object, const D &value) { *pm = value; }, scope(*this));
1203+
def_property_writeonly_static(name, fset, extra...);
1204+
return *this;
1205+
}
1206+
11921207
/// Uses return_value_policy::reference_internal by default
11931208
template <typename Getter, typename... Extra>
11941209
class_ &def_property_readonly(const char *name, const Getter &fget, const Extra& ...extra) {
11951210
return def_property_readonly(name, cpp_function(method_adaptor<type>(fget)),
11961211
return_value_policy::reference_internal, extra...);
11971212
}
11981213

1214+
template <typename Setter, typename... Extra>
1215+
class_ &def_property_writeonly(const char *name, const Setter &fset, const Extra& ...extra) {
1216+
return def_property_writeonly(name, cpp_function(method_adaptor<type>(fset)),extra...);
1217+
}
1218+
11991219
/// Uses cpp_function's return_value_policy by default
12001220
template <typename... Extra>
12011221
class_ &def_property_readonly(const char *name, const cpp_function &fget, const Extra& ...extra) {
12021222
return def_property(name, fget, cpp_function(), extra...);
12031223
}
12041224

1225+
template <typename... Extra>
1226+
class_ &def_property_writeonly(const char *name, const cpp_function &fset, const Extra& ...extra) {
1227+
return def_property(name, cpp_function(), fset, extra...);
1228+
}
1229+
12051230
/// Uses return_value_policy::reference by default
12061231
template <typename Getter, typename... Extra>
12071232
class_ &def_property_readonly_static(const char *name, const Getter &fget, const Extra& ...extra) {
12081233
return def_property_readonly_static(name, cpp_function(fget), return_value_policy::reference, extra...);
12091234
}
12101235

1236+
template <typename Setter, typename... Extra>
1237+
class_ &def_property_writeonly_static(const char *name, const Setter &fset, const Extra& ...extra) {
1238+
return def_property_writeonly_static(name, cpp_function(fset), extra...);
1239+
}
1240+
12111241
/// Uses cpp_function's return_value_policy by default
12121242
template <typename... Extra>
12131243
class_ &def_property_readonly_static(const char *name, const cpp_function &fget, const Extra& ...extra) {
12141244
return def_property_static(name, fget, cpp_function(), extra...);
12151245
}
12161246

1247+
template <typename... Extra>
1248+
class_ &def_property_writeonly_static(const char *name, const cpp_function &fset, const Extra& ...extra) {
1249+
return def_property_static(name, cpp_function(), fset, extra...);
1250+
}
1251+
12171252
/// Uses return_value_policy::reference_internal by default
12181253
template <typename Getter, typename Setter, typename... Extra>
12191254
class_ &def_property(const char *name, const Getter &fget, const Setter &fset, const Extra& ...extra) {

0 commit comments

Comments
 (0)