File tree Expand file tree Collapse file tree 3 files changed +54
-0
lines changed Expand file tree Collapse file tree 3 files changed +54
-0
lines changed Original file line number Diff line number Diff line change @@ -91,6 +91,13 @@ namespace Rcpp {
91
91
return m_sexp;
92
92
}
93
93
94
+ /* *
95
+ * Boolean test for usability as a T
96
+ */
97
+ inline bool isUsable () const {
98
+ return m_set && !Rf_isNull (m_sexp);
99
+ }
100
+
94
101
/* *
95
102
* Boolean test for NULL
96
103
*
@@ -116,6 +123,16 @@ namespace Rcpp {
116
123
*/
117
124
inline bool isSet (void ) const { return m_set; }
118
125
126
+ /* *
127
+ * Returns m_sexp as a T
128
+ */
129
+ inline T as () { return get (); }
130
+
131
+ /* *
132
+ * Return a clone of m_sexp as a T
133
+ */
134
+ inline T clone () const { return Rcpp::clone (get ()); }
135
+
119
136
private:
120
137
SEXP m_sexp;
121
138
bool m_set;
Original file line number Diff line number Diff line change @@ -198,3 +198,21 @@ SEXP testNullableGet(const Nullable<NumericMatrix>& M) {
198
198
return M.get ();
199
199
}
200
200
201
+ // [[Rcpp::export]]
202
+ NumericMatrix testNullableAs (Nullable<NumericMatrix>& M) {
203
+ return M.as ();
204
+ }
205
+
206
+ // [[Rcpp::export]]
207
+ NumericMatrix testNullableClone (const Nullable<NumericMatrix>& M) {
208
+ return M.clone ();
209
+ }
210
+
211
+ // [[Rcpp::export]]
212
+ SEXP testNullableIsUsable (const Nullable<NumericMatrix>& M) {
213
+ if (M.isUsable ()) {
214
+ return M.clone ();
215
+ } else {
216
+ return R_NilValue;
217
+ }
218
+ }
Original file line number Diff line number Diff line change @@ -185,4 +185,23 @@ if (.runThisTest) {
185
185
M <- matrix (1 : 4 , 2 , 2 )
186
186
checkEquals( testNullableGet(M ), M )
187
187
}
188
+
189
+ test.NullableAccessAs <- function () {
190
+ M <- matrix (1 : 4 , 2 , 2 )
191
+ checkEquals( testNullableAs(M ), M )
192
+ }
193
+
194
+ test.NullableAccessClone <- function () {
195
+ M <- matrix (1 : 4 , 2 , 2 )
196
+ checkEquals( testNullableClone(M ), M )
197
+ }
198
+
199
+ test.NullableIsUsableTrue <- function () {
200
+ M <- matrix (1 : 4 , 2 , 2 )
201
+ checkEquals( testNullableIsUsable(M ), M )
202
+ }
203
+
204
+ test.NullableIsUsableFalse <- function () {
205
+ checkTrue(is.null(testNullableIsUsable(NULL )))
206
+ }
188
207
}
You can’t perform that action at this time.
0 commit comments