Skip to content

Commit cdcdf0b

Browse files
committed
return *this from the free-getter, member-setter property() overload
1 parent a6f354e commit cdcdf0b

4 files changed

Lines changed: 65 additions & 0 deletions

File tree

‎ChangeLog‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
2026-10-29 Kevin Ushey <kevinushey@gmail.com>
2+
3+
* inst/include/Rcpp/module/Module_Add_Property.h: Return *this from
4+
the property() overload taking a free-function getter and a member
5+
function setter, which fell off the end and trapped at module load
6+
(#1519)
7+
* inst/tinytest/cpp/Module.cpp: Expose one property per property()
8+
overload
9+
* inst/tinytest/test_module.R: Test them
10+
111
2026-10-23 Dirk Eddelbuettel <edd@debian.org>
212

313
* DESCRIPTION (Version, Date): Roll micro version and date

‎inst/include/Rcpp/module/Module_Add_Property.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@
8383
name_,
8484
new CppProperty_GetPointer_SetMethod<Class,PROP>(GetMethod, SetMethod, docstring)
8585
) ;
86+
return *this ;
8687
}
8788

8889
template <typename PROP>

‎inst/tinytest/cpp/Module.cpp‎

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,24 @@ class ModuleNum{
8989
int y;
9090
};
9191

92+
class ModuleProperties {
93+
public:
94+
ModuleProperties() : value(0.0) {}
95+
96+
double get() { return value; }
97+
double get_const() const { return value; }
98+
void set(double value_) { value = value_; }
99+
100+
double value;
101+
};
102+
103+
double ModuleProperties_get(ModuleProperties* p) {
104+
return p->value;
105+
}
106+
void ModuleProperties_set(ModuleProperties* p, double value) {
107+
p->value = value;
108+
}
109+
92110
class ModuleNumber{
93111
public:
94112
ModuleNumber() : x(0.0), y(0) {};
@@ -193,6 +211,21 @@ RCPP_MODULE(demoModule) {
193211
.property("y", &ModuleNum::getY)
194212
;
195213

214+
// one property per class_::property() overload: getters are member,
215+
// const member or free functions, setters are member or free functions
216+
class_<ModuleProperties>("ModuleProperties")
217+
.constructor()
218+
.property("get", &ModuleProperties::get)
219+
.property("get_const", &ModuleProperties::get_const)
220+
.property("get_free", &ModuleProperties_get, "free getter")
221+
.property("get_set", &ModuleProperties::get, &ModuleProperties::set)
222+
.property("get_const_set", &ModuleProperties::get_const, &ModuleProperties::set)
223+
.property("get_set_free", &ModuleProperties::get, &ModuleProperties_set)
224+
.property("get_const_set_free", &ModuleProperties::get_const, &ModuleProperties_set)
225+
.property("get_free_set", &ModuleProperties_get, &ModuleProperties::set)
226+
.property("get_free_set_free", &ModuleProperties_get, &ModuleProperties_set)
227+
;
228+
196229
class_<ModuleNumber>("ModuleNumber")
197230

198231
.constructor()

‎inst/tinytest/test_module.R‎

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,27 @@ expect_equal( w$x, 2.0 )
8585

8686
expect_error( { w$y <- 3 } )
8787

88+
## every class_::property() overload; the free getter + member setter one
89+
## did not return *this, which aborted loading the whole module (#1519)
90+
p <- new( ModuleProperties )
91+
p$get_set <- 1.0
92+
expect_equal( p$get_set, 1.0 )
93+
p$get_const_set <- 2.0
94+
expect_equal( p$get_const_set, 2.0 )
95+
p$get_set_free <- 3.0
96+
expect_equal( p$get_set_free, 3.0 )
97+
p$get_const_set_free <- 4.0
98+
expect_equal( p$get_const_set_free, 4.0 )
99+
p$get_free_set <- 5.0
100+
expect_equal( p$get_free_set, 5.0 )
101+
p$get_free_set_free <- 6.0
102+
expect_equal( p$get_free_set_free, 6.0 )
103+
104+
expect_equal( c(p$get, p$get_const, p$get_free), c(6.0, 6.0, 6.0) )
105+
expect_error( { p$get <- 7.0 } )
106+
expect_error( { p$get_const <- 7.0 } )
107+
expect_error( { p$get_free <- 7.0 } )
108+
88109
# test.Module.member <- function(){
89110
w <- new( ModuleNumber )
90111
expect_equal( w$x, 0.0 )

0 commit comments

Comments
 (0)