Romain Francois, Professional R Enthusiast - Tag - stl
Independant statistical/R consultant
2013-03-24T15:53:22+01:00
Romain Francois
urn:md5:2cdb21a695f56bfe2b31ee2133c51b42
Dotclear
External pointers with Rcpp
urn:md5:fa6368e0bab4d4bb3f47336ed443fba1
2010-01-08T18:29:00+01:00
romain francois
Rcpp
cplusplusRRcppstl
<style>
pre{
border: 1px solid black ;
font-size: x-small;
}
</style>
<p>One of the new features of Rcpp is the <code>XPtr</code> class template, which lets you treat an R external pointer as a regular pointer. For more information on external pointers, see <a href="http://cran.r-project.org/doc/manuals/R-exts.html#External-pointers-and-weak-references">Writing R extensions</a>. </p>
<p>To use them, first we need a pointer to some C++ data structure, we'll use a pointer to a <code>vector<int></code> : </p>
<pre><font color="#000000"><font color="#a19d9d">/*</font><font color="#a19d9d"> </font><font color="#a19d9d">creating</font><font color="#a19d9d"> </font><font color="#a19d9d">a</font><font color="#a19d9d"> </font><font color="#a19d9d">pointer</font><font color="#a19d9d"> </font><font color="#a19d9d">to</font><font color="#a19d9d"> </font><font color="#a19d9d">a</font><font color="#a19d9d"> </font><font color="#a19d9d">vector<int></font><font color="#a19d9d"> </font><font color="#a19d9d">*/</font>
std<font color="#000000"><strong>::</strong></font>vector<font color="#000000"><strong><</strong></font><font color="#33cc00"><strong>int</strong></font><font color="#000000"><strong>></strong></font><font color="#000000"><strong>*</strong></font> v <font color="#000000"><strong>=</strong></font> <font color="#006699"><strong>new</strong></font> std<font color="#000000"><strong>::</strong></font>vector<font color="#000000"><strong><</strong></font><font color="#33cc00"><strong>int</strong></font><font color="#000000"><strong>></strong></font> <font color="#000000"><strong>;</strong></font>
v<font color="#000000"><strong>-</strong></font><font color="#000000"><strong>></strong></font><font color="#ff0000">push_back</font><font color="#000000"><strong>(</strong></font> <font color="#ff0000">1</font> <font color="#000000"><strong>)</strong></font> <font color="#000000"><strong>;</strong></font>
v<font color="#000000"><strong>-</strong></font><font color="#000000"><strong>></strong></font><font color="#ff0000">push_back</font><font color="#000000"><strong>(</strong></font> <font color="#ff0000">2</font> <font color="#000000"><strong>)</strong></font> <font color="#000000"><strong>;</strong></font>
</font></pre>
<p>Then, using the <code>XPtr</code> template class we wrap the pointer in an R external pointer</p>
<pre><font color="#000000"><font color="#a19d9d">/*</font><font color="#a19d9d"> </font><font color="#a19d9d">wrap</font><font color="#a19d9d"> </font><font color="#a19d9d">the</font><font color="#a19d9d"> </font><font color="#a19d9d">pointer</font><font color="#a19d9d"> </font><font color="#a19d9d">as</font><font color="#a19d9d"> </font><font color="#a19d9d">an</font><font color="#a19d9d"> </font><font color="#a19d9d">external</font><font color="#a19d9d"> </font><font color="#a19d9d">pointer</font><font color="#a19d9d"> </font><font color="#a19d9d">*/</font>
<font color="#a19d9d">/*</font><font color="#a19d9d"> </font><font color="#a19d9d">this</font><font color="#a19d9d"> </font><font color="#a19d9d">automatically</font><font color="#a19d9d"> </font><font color="#a19d9d">protected</font><font color="#a19d9d"> </font><font color="#a19d9d">the</font><font color="#a19d9d"> </font><font color="#a19d9d">external</font><font color="#a19d9d"> </font><font color="#a19d9d">pointer</font><font color="#a19d9d"> </font><font color="#a19d9d">from</font><font color="#a19d9d"> </font><font color="#a19d9d">R</font><font color="#a19d9d"> </font><font color="#a19d9d">garbage</font><font color="#a19d9d"> </font>
<font color="#a19d9d"> </font><font color="#a19d9d"> </font><font color="#a19d9d"> </font><font color="#a19d9d">collection</font><font color="#a19d9d"> </font><font color="#a19d9d">until</font><font color="#a19d9d"> </font><font color="#a19d9d">p</font><font color="#a19d9d"> </font><font color="#a19d9d">goes</font><font color="#a19d9d"> </font><font color="#a19d9d">out</font><font color="#a19d9d"> </font><font color="#a19d9d">of</font><font color="#a19d9d"> </font><font color="#a19d9d">scope.</font><font color="#a19d9d"> </font><font color="#a19d9d">*/</font>
Rcpp<font color="#000000"><strong>::</strong></font>XPtr<font color="#000000"><strong><</strong></font> std<font color="#000000"><strong>::</strong></font>vector<font color="#000000"><strong><</strong></font><font color="#33cc00"><strong>int</strong></font><font color="#000000"><strong>></strong></font> <font color="#000000"><strong>></strong></font> <font color="#ff0000">p</font><font color="#000000"><strong>(</strong></font>v<font color="#000000"><strong>,</strong></font> <font color="#cc00cc">true</font><font color="#000000"><strong>)</strong></font> <font color="#000000"><strong>;</strong></font>
</font></pre>
<p>The first parameter of the constructor is the actual (sometimes called dumb) pointer, and the second parameter is a flag indicating that we need to register a delete finalizer with the external pointer. When the external pointer goes out of scope, it becomes subject to garbage collection, and when it is garbage collected, the finalizer is called, which then calls delete on the dumb pointer. </p>
<p>Wrapping it all together thanks to the inline package, here's a function that creates an external pointer to a vector<int> and return it to R</p>
<pre><font color="#000000"> funx <font color="#000000"><strong><-</strong></font> <font color="#ff0000">cfunction</font><font color="#000000"><strong>(</strong></font><font color="#ff0000">signature</font><font color="#000000"><strong>(</strong></font><font color="#000000"><strong>)</strong></font>, <font color="#6666ff">'</font>
<font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff">/*</font><font color="#6666ff"> </font><font color="#6666ff">creating</font><font color="#6666ff"> </font><font color="#6666ff">a</font><font color="#6666ff"> </font><font color="#6666ff">pointer</font><font color="#6666ff"> </font><font color="#6666ff">to</font><font color="#6666ff"> </font><font color="#6666ff">a</font><font color="#6666ff"> </font><font color="#6666ff">vector<int></font><font color="#6666ff"> </font><font color="#6666ff">*/</font>
<font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff">std::vector<int>*</font><font color="#6666ff"> </font><font color="#6666ff">v</font><font color="#6666ff"> </font><font color="#6666ff">=</font><font color="#6666ff"> </font><font color="#6666ff">new</font><font color="#6666ff"> </font><font color="#6666ff">std::vector<int></font><font color="#6666ff"> </font><font color="#6666ff">;</font>
<font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff">v->push_back(</font><font color="#6666ff"> </font><font color="#6666ff">1</font><font color="#6666ff"> </font><font color="#6666ff">)</font><font color="#6666ff"> </font><font color="#6666ff">;</font>
<font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff">v->push_back(</font><font color="#6666ff"> </font><font color="#6666ff">2</font><font color="#6666ff"> </font><font color="#6666ff">)</font><font color="#6666ff"> </font><font color="#6666ff">;</font>
<font color="#6666ff"> </font><font color="#6666ff"> </font>
<font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff">/*</font><font color="#6666ff"> </font><font color="#6666ff">wrap</font><font color="#6666ff"> </font><font color="#6666ff">the</font><font color="#6666ff"> </font><font color="#6666ff">pointer</font><font color="#6666ff"> </font><font color="#6666ff">as</font><font color="#6666ff"> </font><font color="#6666ff">an</font><font color="#6666ff"> </font><font color="#6666ff">external</font><font color="#6666ff"> </font><font color="#6666ff">pointer</font><font color="#6666ff"> </font><font color="#6666ff">*/</font>
<font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff">/*</font><font color="#6666ff"> </font><font color="#6666ff">this</font><font color="#6666ff"> </font><font color="#6666ff">automatically</font><font color="#6666ff"> </font><font color="#6666ff">protected</font><font color="#6666ff"> </font><font color="#6666ff">the</font><font color="#6666ff"> </font><font color="#6666ff">external</font><font color="#6666ff"> </font><font color="#6666ff">pointer</font><font color="#6666ff"> </font><font color="#6666ff">from</font><font color="#6666ff"> </font><font color="#6666ff">R</font><font color="#6666ff"> </font><font color="#6666ff">garbage</font><font color="#6666ff"> </font>
<font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff">collection</font><font color="#6666ff"> </font><font color="#6666ff">until</font><font color="#6666ff"> </font><font color="#6666ff">p</font><font color="#6666ff"> </font><font color="#6666ff">goes</font><font color="#6666ff"> </font><font color="#6666ff">out</font><font color="#6666ff"> </font><font color="#6666ff">of</font><font color="#6666ff"> </font><font color="#6666ff">scope.</font><font color="#6666ff"> </font><font color="#6666ff">*/</font>
<font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff">Rcpp::XPtr<</font><font color="#6666ff"> </font><font color="#6666ff">std::vector<int></font><font color="#6666ff"> </font><font color="#6666ff">></font><font color="#6666ff"> </font><font color="#6666ff">p(v,</font><font color="#6666ff"> </font><font color="#6666ff">true)</font><font color="#6666ff"> </font><font color="#6666ff">;</font>
<font color="#6666ff"> </font><font color="#6666ff"> </font>
<font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff">/*</font><font color="#6666ff"> </font><font color="#6666ff">return</font><font color="#6666ff"> </font><font color="#6666ff">it</font><font color="#6666ff"> </font><font color="#6666ff">back</font><font color="#6666ff"> </font><font color="#6666ff">to</font><font color="#6666ff"> </font><font color="#6666ff">R,</font><font color="#6666ff"> </font><font color="#6666ff">since</font><font color="#6666ff"> </font><font color="#6666ff">p</font><font color="#6666ff"> </font><font color="#6666ff">goes</font><font color="#6666ff"> </font><font color="#6666ff">out</font><font color="#6666ff"> </font><font color="#6666ff">of</font><font color="#6666ff"> </font><font color="#6666ff">scope</font><font color="#6666ff"> </font><font color="#6666ff">after</font><font color="#6666ff"> </font><font color="#6666ff">the</font><font color="#6666ff"> </font><font color="#6666ff">return</font><font color="#6666ff"> </font>
<font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff">the</font><font color="#6666ff"> </font><font color="#6666ff">external</font><font color="#6666ff"> </font><font color="#6666ff">pointer</font><font color="#6666ff"> </font><font color="#6666ff">is</font><font color="#6666ff"> </font><font color="#6666ff">no</font><font color="#6666ff"> </font><font color="#6666ff">more</font><font color="#6666ff"> </font><font color="#6666ff">protected</font><font color="#6666ff"> </font><font color="#6666ff">by</font><font color="#6666ff"> </font><font color="#6666ff">p,</font><font color="#6666ff"> </font><font color="#6666ff">but</font><font color="#6666ff"> </font><font color="#6666ff">it</font><font color="#6666ff"> </font><font color="#6666ff">gets</font><font color="#6666ff"> </font>
<font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff">protected</font><font color="#6666ff"> </font><font color="#6666ff">by</font><font color="#6666ff"> </font><font color="#6666ff">being</font><font color="#6666ff"> </font><font color="#6666ff">on</font><font color="#6666ff"> </font><font color="#6666ff">the</font><font color="#6666ff"> </font><font color="#6666ff">R</font><font color="#6666ff"> </font><font color="#6666ff">side</font><font color="#6666ff"> </font><font color="#6666ff">*/</font>
<font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff">return(</font><font color="#6666ff"> </font><font color="#6666ff">p</font><font color="#6666ff"> </font><font color="#6666ff">)</font><font color="#6666ff"> </font><font color="#6666ff">;</font>
<font color="#6666ff"> </font><font color="#6666ff">'</font>, Rcpp<font color="#000000"><strong>=</strong></font><font color="#cc00cc">TRUE</font>, verbose<font color="#000000"><strong>=</strong></font><font color="#cc00cc">FALSE</font><font color="#000000"><strong>)</strong></font>
xp <font color="#000000"><strong><-</strong></font> <font color="#ff0000">funx</font><font color="#000000"><strong>(</strong></font><font color="#000000"><strong>)</strong></font>
</font></pre>
<p>At that point, <code>xp</code> is an external pointer object</p>
<pre>
> xp
<pointer: 0x9c850c8>
> typeof( xp )
[1] "externalptr"
</pre>
<p>Then, we can pass it back to the C(++) layer, an continue to work with the wrapped stl vector of ints. For this we use the other constructor for the <code>XPtr</code> class template, that takes an R object (SEXP) of sexp type EXTPTRSXP. </p>
<pre><font color="#000000">
<font color="#a19d9d">/*</font><font color="#a19d9d"> </font><font color="#a19d9d">wrap</font><font color="#a19d9d"> </font><font color="#a19d9d">the</font><font color="#a19d9d"> </font><font color="#a19d9d">SEXP</font><font color="#a19d9d"> </font><font color="#a19d9d">as</font><font color="#a19d9d"> </font><font color="#a19d9d">a</font><font color="#a19d9d"> </font><font color="#a19d9d">smart</font><font color="#a19d9d"> </font><font color="#a19d9d">external</font><font color="#a19d9d"> </font><font color="#a19d9d">pointer</font><font color="#a19d9d"> </font><font color="#a19d9d">*/</font>
Rcpp<font color="#000000"><strong>::</strong></font>XPtr<font color="#000000"><strong><</strong></font> std<font color="#000000"><strong>::</strong></font>vector<font color="#000000"><strong><</strong></font><font color="#33cc00"><strong>int</strong></font><font color="#000000"><strong>></strong></font> <font color="#000000"><strong>></strong></font> <font color="#ff0000">p</font><font color="#000000"><strong>(</strong></font>x<font color="#000000"><strong>)</strong></font> <font color="#000000"><strong>;</strong></font>
<font color="#a19d9d">/*</font><font color="#a19d9d"> </font><font color="#a19d9d">use</font><font color="#a19d9d"> </font><font color="#a19d9d">p</font><font color="#a19d9d"> </font><font color="#a19d9d">as</font><font color="#a19d9d"> </font><font color="#a19d9d">a</font><font color="#a19d9d"> </font><font color="#a19d9d">'dumb'</font><font color="#a19d9d"> </font><font color="#a19d9d">pointer</font><font color="#a19d9d"> </font><font color="#a19d9d">*/</font>
p<font color="#000000"><strong>-</strong></font><font color="#000000"><strong>></strong></font><font color="#ff0000">front</font><font color="#000000"><strong>(</strong></font><font color="#000000"><strong>)</strong></font> <font color="#000000"><strong>;</strong></font>
</font></pre>
<p>Again, we can wrap this up for quick prototyping using the inline package :</p>
<pre><font color="#000000"> <font color="#a19d9d">#</font><font color="#a19d9d"> </font><font color="#a19d9d">passing</font><font color="#a19d9d"> </font><font color="#a19d9d">the</font><font color="#a19d9d"> </font><font color="#a19d9d">pointer</font><font color="#a19d9d"> </font><font color="#a19d9d">back</font><font color="#a19d9d"> </font><font color="#a19d9d">to</font><font color="#a19d9d"> </font><font color="#a19d9d">C++</font>
funx <font color="#000000"><strong><-</strong></font> <font color="#ff0000">cfunction</font><font color="#000000"><strong>(</strong></font><font color="#ff0000">signature</font><font color="#000000"><strong>(</strong></font>x <font color="#000000"><strong>=</strong></font> <font color="#6666ff">"</font><font color="#6666ff">externalptr</font><font color="#6666ff">"</font> <font color="#000000"><strong>)</strong></font>, <font color="#6666ff">'</font>
<font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff">/*</font><font color="#6666ff"> </font><font color="#6666ff">wrapping</font><font color="#6666ff"> </font><font color="#6666ff">x</font><font color="#6666ff"> </font><font color="#6666ff">as</font><font color="#6666ff"> </font><font color="#6666ff">smart</font><font color="#6666ff"> </font><font color="#6666ff">external</font><font color="#6666ff"> </font><font color="#6666ff">pointer</font><font color="#6666ff"> </font><font color="#6666ff">*/</font>
<font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff">/*</font><font color="#6666ff"> </font><font color="#6666ff">The</font><font color="#6666ff"> </font><font color="#6666ff">SEXP</font><font color="#6666ff"> </font><font color="#6666ff">based</font><font color="#6666ff"> </font><font color="#6666ff">constructor</font><font color="#6666ff"> </font><font color="#6666ff">does</font><font color="#6666ff"> </font><font color="#6666ff">not</font><font color="#6666ff"> </font><font color="#6666ff">protect</font><font color="#6666ff"> </font><font color="#6666ff">the</font><font color="#6666ff"> </font><font color="#6666ff">SEXP</font><font color="#6666ff"> </font><font color="#6666ff">from</font><font color="#6666ff"> </font>
<font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff">garbage</font><font color="#6666ff"> </font><font color="#6666ff">collection</font><font color="#6666ff"> </font><font color="#6666ff">automatically,</font><font color="#6666ff"> </font><font color="#6666ff">it</font><font color="#6666ff"> </font><font color="#6666ff">is</font><font color="#6666ff"> </font><font color="#6666ff">already</font><font color="#6666ff"> </font><font color="#6666ff">protected</font><font color="#6666ff"> </font>
<font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff">because</font><font color="#6666ff"> </font><font color="#6666ff">it</font><font color="#6666ff"> </font><font color="#6666ff">comes</font><font color="#6666ff"> </font><font color="#6666ff">from</font><font color="#6666ff"> </font><font color="#6666ff">the</font><font color="#6666ff"> </font><font color="#6666ff">R</font><font color="#6666ff"> </font><font color="#6666ff">side,</font><font color="#6666ff"> </font><font color="#6666ff">however</font><font color="#6666ff"> </font><font color="#6666ff">if</font><font color="#6666ff"> </font><font color="#6666ff">you</font><font color="#6666ff"> </font><font color="#6666ff">want</font><font color="#6666ff"> </font><font color="#6666ff">to</font><font color="#6666ff"> </font><font color="#6666ff">keep</font><font color="#6666ff"> </font>
<font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff">the</font><font color="#6666ff"> </font><font color="#6666ff">Rcpp::XPtr</font><font color="#6666ff"> </font><font color="#6666ff">object</font><font color="#6666ff"> </font><font color="#6666ff">on</font><font color="#6666ff"> </font><font color="#6666ff">the</font><font color="#6666ff"> </font><font color="#6666ff">C(++)</font><font color="#6666ff"> </font><font color="#6666ff">side</font>
<font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff">and</font><font color="#6666ff"> </font><font color="#6666ff">return</font><font color="#6666ff"> </font><font color="#6666ff">something</font><font color="#6666ff"> </font><font color="#6666ff">else</font><font color="#6666ff"> </font><font color="#6666ff">to</font><font color="#6666ff"> </font><font color="#6666ff">R,</font><font color="#6666ff"> </font><font color="#6666ff">you</font><font color="#6666ff"> </font><font color="#6666ff">need</font><font color="#6666ff"> </font><font color="#6666ff">to</font><font color="#6666ff"> </font><font color="#6666ff">protect</font><font color="#6666ff"> </font><font color="#6666ff">the</font><font color="#6666ff"> </font><font color="#6666ff">external</font>
<font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff">pointer,</font><font color="#6666ff"> </font><font color="#6666ff">by</font><font color="#6666ff"> </font><font color="#6666ff">using</font><font color="#6666ff"> </font><font color="#6666ff">the</font><font color="#6666ff"> </font><font color="#6666ff">protect</font><font color="#6666ff"> </font><font color="#6666ff">member</font><font color="#6666ff"> </font><font color="#6666ff">function</font><font color="#6666ff"> </font><font color="#6666ff">*/</font>
<font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff">Rcpp::XPtr<</font><font color="#6666ff"> </font><font color="#6666ff">std::vector<int></font><font color="#6666ff"> </font><font color="#6666ff">></font><font color="#6666ff"> </font><font color="#6666ff">p(x)</font><font color="#6666ff"> </font><font color="#6666ff">;</font>
<font color="#6666ff"> </font><font color="#6666ff"> </font>
<font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff">/*</font><font color="#6666ff"> </font><font color="#6666ff">just</font><font color="#6666ff"> </font><font color="#6666ff">return</font><font color="#6666ff"> </font><font color="#6666ff">the</font><font color="#6666ff"> </font><font color="#6666ff">front</font><font color="#6666ff"> </font><font color="#6666ff">of</font><font color="#6666ff"> </font><font color="#6666ff">the</font><font color="#6666ff"> </font><font color="#6666ff">vector</font><font color="#6666ff"> </font><font color="#6666ff">as</font><font color="#6666ff"> </font><font color="#6666ff">a</font><font color="#6666ff"> </font><font color="#6666ff">SEXP</font><font color="#6666ff"> </font><font color="#6666ff">*/</font>
<font color="#6666ff"> </font><font color="#6666ff"> </font><font color="#6666ff">return(</font><font color="#6666ff"> </font><font color="#6666ff">Rcpp::wrap(</font><font color="#6666ff"> </font><font color="#6666ff">p->front()</font><font color="#6666ff"> </font><font color="#6666ff">)</font><font color="#6666ff"> </font><font color="#6666ff">)</font><font color="#6666ff"> </font><font color="#6666ff">;</font>
<font color="#6666ff"> </font><font color="#6666ff">'</font>, Rcpp<font color="#000000"><strong>=</strong></font><font color="#cc00cc">TRUE</font>, verbose<font color="#000000"><strong>=</strong></font><font color="#cc00cc">FALSE</font><font color="#000000"><strong>)</strong></font>
front <font color="#000000"><strong><-</strong></font> <font color="#ff0000">funx</font><font color="#000000"><strong>(</strong></font>xp<font color="#000000"><strong>)</strong></font>
</font></pre>
<pre>
> front
[1] 1
</pre>
<p>The example is extracted from one unit tests that we use in Rcpp, see the full example : </p>
<pre>
> system.file( "unitTests", "runit.XPTr.R", package = "Rcpp" )
[1] "/usr/local/lib/R/library/Rcpp/unitTests/runit.XPTr.R"
</pre>
<p>See also the announcement for the release of Rcpp 0.7.1 <a href="http://dirk.eddelbuettel.com/blog/2010/01/02/#rcpp_0.7.1">here</a> to get a list of new features, or wait a few days to see version 0.7.2. </p>
<p>Using the XPtr class template is the bread and butter of the CPP package I blogged about <a href="http://romainfrancois.blog.free.fr/index.php?post/2010/01/08/"http://romainfrancois.blog.free.fr/index.php?post/2009/12/22/CPP-package-%3A-exposing-C-objects>here</a></p>