-
Notifications
You must be signed in to change notification settings - Fork 12
Expand file tree
/
Copy pathXPtr.h
More file actions
81 lines (63 loc) · 1.92 KB
/
Copy pathXPtr.h
File metadata and controls
81 lines (63 loc) · 1.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#ifndef Rcpp_XPtr_h
#define Rcpp_XPtr_h
namespace Rcpp{
template <typename T>
void standard_delete_finalizer(T* obj){
delete obj ;
}
template <typename T, void Finalizer(T*) >
void finalizer_wrapper(SEXP p){
if( TYPEOF(p) == EXTPTRSXP ){
Finalizer( reinterpret_cast<T*>(R_ExternalPtrAddr(p)) ) ;
}
}
template <
typename T,
typename Storage = PreserveStorage,
void Finalizer(T*) = standard_delete_finalizer<T>
>
class XPtr {
RCPP_API_IMPL(XPtr)
inline void set(SEXP x){
if( TYPEOF(x) != EXTPTRSXP )
stop( "expecting an external pointer" ) ;
data = x ;
}
explicit XPtr(SEXP x, SEXP tag, SEXP prot) {
R_SetExternalPtrTag( x, tag ) ;
R_SetExternalPtrProtected( x, prot ) ;
set(x) ;
}
explicit XPtr(T* p, bool set_delete_finalizer = true, SEXP tag = R_NilValue, SEXP prot = R_NilValue){
data = R_MakeExternalPtr( (void*)p , tag, prot) ;
if( set_delete_finalizer ){
setDeleteFinalizer() ;
}
}
T& operator*() const {
return *(reinterpret_cast<T*>(R_ExternalPtrAddr(data))) ;
}
T* operator->() const {
return reinterpret_cast<T*>(R_ExternalPtrAddr(data));
}
void setDeleteFinalizer() {
R_RegisterCFinalizerEx( data, finalizer_wrapper<T,Finalizer> , FALSE) ;
}
inline operator T*(){
return reinterpret_cast<T*>(R_ExternalPtrAddr(data)) ;
}
TagProxy<XPtr> tag(){
return TagProxy<XPtr>( *this ) ;
}
const TagProxy<XPtr> tag() const {
return TagProxy<XPtr>( const_cast<XPtr&>(*this) ) ;
}
ProtectedProxy<XPtr> prot(){
return ProtectedProxy<XPtr>(*this) ;
}
const ProtectedProxy<XPtr> prot() const {
return ProtectedProxy<XPtr>( const_cast<XPtr&>(*this) ) ;
}
};
} // namespace Rcpp
#endif