1- // -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; tab-width: 8 -*-
1+ // -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*-
22//
33// XPtr.h: Rcpp R/C++ interface class library -- smart external pointers
44//
5- // Copyright (C) 2009 - 2013 Dirk Eddelbuettel and Romain Francois
5+ // Copyright (C) 2009 - 2017 Dirk Eddelbuettel and Romain Francois
66//
77// This file is part of Rcpp.
88//
2424
2525#include < RcppCommon.h>
2626
27- namespace Rcpp {
27+ namespace Rcpp {
2828
2929template <typename T>
30- void standard_delete_finalizer (T* obj){
31- delete obj ;
30+ void standard_delete_finalizer (T* obj) {
31+ delete obj;
3232}
3333
3434template <typename T, void Finalizer (T*) >
35- void finalizer_wrapper(SEXP p){
36- if ( TYPEOF (p) == EXTPTRSXP ) {
37- T* ptr = (T*) R_ExternalPtrAddr (p) ;
38- RCPP_DEBUG_3 ( " finalizer_wrapper<%s>(SEXP p = <%p>). ptr = %p" , DEMANGLE (T), p, ptr )
39- Finalizer (ptr) ;
35+ void finalizer_wrapper(SEXP p) {
36+ if ( TYPEOF (p) == EXTPTRSXP) {
37+ T* ptr = (T*) R_ExternalPtrAddr (p);
38+ RCPP_DEBUG_3 (" finalizer_wrapper<%s>(SEXP p = <%p>). ptr = %p" , DEMANGLE (T), p, ptr)
39+ Finalizer (ptr);
4040 }
4141}
4242
@@ -56,23 +56,23 @@ class XPtr :
5656{
5757public:
5858
59- typedef StoragePolicy<XPtr> Storage ;
59+ typedef StoragePolicy<XPtr> Storage;
6060
6161 /* *
6262 * constructs a XPtr wrapping the external pointer (EXTPTRSXP SEXP)
6363 *
6464 * @param xp external pointer to wrap
6565 */
6666 explicit XPtr (SEXP x, SEXP tag = R_NilValue, SEXP prot = R_NilValue) {
67- if ( TYPEOF (x) != EXTPTRSXP ) {
67+ if ( TYPEOF (x) != EXTPTRSXP) {
6868 const char * fmt = " Expecting an external pointer: [type=%s]." ;
6969 throw ::Rcpp::not_compatible (fmt, Rf_type2char (TYPEOF (x)));
7070 }
7171
72- Storage::set__ (x) ;
73- R_SetExternalPtrTag ( x, tag ) ;
74- R_SetExternalPtrProtected ( x, prot ) ;
75- } ;
72+ Storage::set__ (x);
73+ R_SetExternalPtrTag ( x, tag) ;
74+ R_SetExternalPtrProtected (x, prot) ;
75+ };
7676
7777 /* *
7878 * creates a new external pointer wrapping the dumb pointer p.
@@ -85,29 +85,30 @@ class XPtr :
8585 * so you need to make sure the pointer can be "delete" d
8686 * this way (has to be a C++ object)
8787 */
88- explicit XPtr (T* p, bool set_delete_finalizer = true , SEXP tag = R_NilValue, SEXP prot = R_NilValue){
89- RCPP_DEBUG_2 ( " XPtr(T* p = <%p>, bool set_delete_finalizer = %s, SEXP tag = R_NilValue, SEXP prot = R_NilValue)" , p, ( set_delete_finalizer ? " true" : " false" ) )
90- Storage::set__ ( R_MakeExternalPtr ( (void *)p , tag, prot) ) ;
91- if ( set_delete_finalizer ){
92- setDeleteFinalizer () ;
88+ explicit XPtr (T* p, bool set_delete_finalizer = true ,
89+ SEXP tag = R_NilValue, SEXP prot = R_NilValue) {
90+ RCPP_DEBUG_2 (" XPtr(T* p = <%p>, bool set_delete_finalizer = %s, SEXP tag = R_NilValue, SEXP prot = R_NilValue)" , p, (set_delete_finalizer ? " true" : " false" ))
91+ Storage::set__ (R_MakeExternalPtr ((void *)p , tag, prot));
92+ if (set_delete_finalizer) {
93+ setDeleteFinalizer ();
9394 }
9495 }
9596
96- XPtr ( const XPtr& other ) {
97- Storage::copy__ (other) ;
97+ XPtr (const XPtr& other) {
98+ Storage::copy__ (other);
9899 }
99100
100- XPtr& operator =(const XPtr& other){
101- Storage::copy__ (other) ;
102- return *this ;
101+ XPtr& operator =(const XPtr& other) {
102+ Storage::copy__ (other);
103+ return *this ;
103104 }
104105
105106 /* *
106107 * Typesafe accessor for underlying pointer (use checked_get
107108 * if you want an exception thrown if the pointer is NULL)
108109 */
109110 inline T* get () const {
110- return (T*)(R_ExternalPtrAddr ( Storage::get__ () ));
111+ return (T*)(R_ExternalPtrAddr (Storage::get__ ()));
111112 }
112113
113114 /* *
@@ -116,12 +117,10 @@ class XPtr :
116117 */
117118 typedef void (*unspecified_bool_type)();
118119 static void unspecified_bool_true () {}
119- operator unspecified_bool_type () const
120- {
120+ operator unspecified_bool_type () const {
121121 return get () == NULL ? 0 : unspecified_bool_true;
122122 }
123- bool operator !() const
124- {
123+ bool operator !() const {
125124 return get () == NULL ;
126125 }
127126
@@ -131,7 +130,7 @@ class XPtr :
131130 inline T* checked_get () const {
132131 T* ptr = get ();
133132 if (ptr == NULL )
134- throw ::Rcpp::exception (" external pointer is not valid" ) ;
133+ throw ::Rcpp::exception (" external pointer is not valid" ) ;
135134 return ptr;
136135 }
137136
@@ -140,19 +139,20 @@ class XPtr :
140139 * object to look and feel like a dumb pointer to T
141140 */
142141 T& operator *() const {
143- return *(checked_get ()) ;
142+ return *(checked_get ());
144143 }
145144
146145 /* *
147146 * Returns the dumb pointer. This allows to call the -> operator
148147 * on this as if it was the dumb pointer
149148 */
150149 T* operator ->() const {
151- return checked_get () ;
150+ return checked_get ();
152151 }
153152
154153 void setDeleteFinalizer () {
155- R_RegisterCFinalizerEx ( Storage::get__ (), finalizer_wrapper<T,Finalizer> , (Rboolean) finalizeOnExit) ;
154+ R_RegisterCFinalizerEx (Storage::get__ (), finalizer_wrapper<T,Finalizer>,
155+ (Rboolean) finalizeOnExit);
156156 }
157157
158158 /* *
@@ -166,23 +166,22 @@ class XPtr :
166166 */
167167 void release () {
168168
169- if (get () != NULL )
170- {
169+ if (get () != NULL ) {
171170 // Call the finalizer -- note that this implies that finalizers
172171 // need to be ready for a NULL external pointer value (our
173172 // default C++ finalizer is since delete NULL is a no-op).
174- finalizer_wrapper<T,Finalizer>( Storage::get__ () );
173+ finalizer_wrapper<T,Finalizer>(Storage::get__ ());
175174
176175 // Clear the external pointer
177- R_ClearExternalPtr ( Storage::get__ () );
176+ R_ClearExternalPtr (Storage::get__ ());
178177 }
179178 }
180179
181- inline operator T*(){
182- return checked_get () ;
180+ inline operator T*() {
181+ return checked_get ();
183182 }
184183
185- void update (SEXP){}
184+ void update (SEXP) {}
186185};
187186
188187} // namespace Rcpp
0 commit comments