[Rcpp-commits] r311 - in pkg: inst inst/unitTests src/Rcpp
noreply at r-forge.r-project.org
noreply at r-forge.r-project.org
Fri Jan 8 09:46:47 CET 2010
Author: romain
Date: 2010-01-08 09:46:47 +0100 (Fri, 08 Jan 2010)
New Revision: 311
Modified:
pkg/inst/ChangeLog
pkg/inst/unitTests/runit.Language.R
pkg/inst/unitTests/runit.Pairlist.R
pkg/src/Rcpp/Language.h
pkg/src/Rcpp/Named.h
pkg/src/Rcpp/Pairlist.h
Log:
added Language::push_back and Pairlist::push_back to append an element at the end of a dotted pair list
Modified: pkg/inst/ChangeLog
===================================================================
--- pkg/inst/ChangeLog 2010-01-07 21:28:05 UTC (rev 310)
+++ pkg/inst/ChangeLog 2010-01-08 08:46:47 UTC (rev 311)
@@ -1,5 +1,11 @@
2010-01-07 Romain Francois <francoisromain at free.fr>
+ * src/Rcpp/Pairlist.h: Pairlist gains a push_back method
+
+ * src/Rcpp/Language.h: idem for Language
+
+2010-01-07 Romain Francois <francoisromain at free.fr>
+
* src/Rcpp/Pairlist.h: gains a push_front method
* src/Rcpp/wrap.h : now the result type of the various wrap
Modified: pkg/inst/unitTests/runit.Language.R
===================================================================
--- pkg/inst/unitTests/runit.Language.R 2010-01-07 21:28:05 UTC (rev 310)
+++ pkg/inst/unitTests/runit.Language.R 2010-01-08 08:46:47 UTC (rev 311)
@@ -50,3 +50,18 @@
}
}
+# same as about but without variadic templates
+test.Language.push.back <- function(){
+ funx <- cfunction(signature(), '
+ Language call("rnorm") ;
+ call.push_back( 10 ) ;
+ call.push_back( Named("mean", 0.0) ) ;
+ call.push_back( 2.0 ) ;
+ return call ;
+ ', Rcpp=TRUE, verbose=FALSE, includes = "using namespace Rcpp;" )
+ checkEquals( funx(),
+ call("rnorm", 10L, mean = 0.0, 2.0 ),
+ msg = "Language::push_back" )
+}
+
+
Modified: pkg/inst/unitTests/runit.Pairlist.R
===================================================================
--- pkg/inst/unitTests/runit.Pairlist.R 2010-01-07 21:28:05 UTC (rev 310)
+++ pkg/inst/unitTests/runit.Pairlist.R 2010-01-08 08:46:47 UTC (rev 311)
@@ -66,3 +66,17 @@
msg = "Pairlist::push_front" )
}
+test.Pairlist.push.back <- function(){
+ funx <- cfunction(signature(), '
+ Pairlist p ;
+ p.push_back( 1 ) ;
+ p.push_back( 10.0 ) ;
+ p.push_back( "foo" ) ;
+ p.push_back( Named( "foobar", 10) ) ;
+ return p ;
+ ', Rcpp=TRUE, verbose=FALSE, includes = "using namespace Rcpp;" )
+ checkEquals( funx(),
+ pairlist( 1L, 10.0, "foo", foobar = 10),
+ msg = "Pairlist::push_back" )
+}
+
Modified: pkg/src/Rcpp/Language.h
===================================================================
--- pkg/src/Rcpp/Language.h 2010-01-07 21:28:05 UTC (rev 310)
+++ pkg/src/Rcpp/Language.h 2010-01-08 08:46:47 UTC (rev 311)
@@ -36,7 +36,7 @@
*/
class Language : public RObject{
public:
-
+
/**
* Attempts to convert the SEXP to a call
*
@@ -44,7 +44,7 @@
* to a call using as.call
*/
Language(SEXP lang) throw(not_compatible) ;
-
+
/**
* Creates a call using the given symbol as the function name
*
@@ -55,7 +55,7 @@
* > call( "rnorm" )
*/
explicit Language( const std::string& symbol );
-
+
/**
* Creates a call using the given symbol as the function name
*
@@ -65,7 +65,7 @@
* > call( "rnorm" )
*/
explicit Language( const Symbol& symbol );
-
+
/**
* Creates a call to the given symbol using variable number of
* arguments
@@ -90,12 +90,35 @@
setSEXP( Rf_lcons( Symbol(symbol), pairlist( args... ) ) );
}
#endif
-
+
/**
+ * wraps an object and add it at the end of the pairlist
+ * (this require traversing the entire pairlist)
+ *
+ * @param object anything that can be wrapped by one
+ * of the wrap functions, or an object of class Named
+ */
+ template <typename T>
+ void push_back( const T& object){
+ if( isNULL() ){
+ setSEXP( grow( object, m_sexp ) ) ;
+ } else {
+ SEXP x = m_sexp ;
+ /* traverse the pairlist */
+ while( !Rf_isNull(CDR(x)) ){
+ x = CDR(x) ;
+ }
+ SEXP tail = PROTECT( pairlist( object ) );
+ SETCDR( x, tail ) ;
+ UNPROTECT(1) ;
+ }
+ }
+
+ /**
* sets the symbol of the call
*/
void setSymbol( const std::string& symbol);
-
+
/**
* sets the symbol of the call
*/
Modified: pkg/src/Rcpp/Named.h
===================================================================
--- pkg/src/Rcpp/Named.h 2010-01-07 21:28:05 UTC (rev 310)
+++ pkg/src/Rcpp/Named.h 2010-01-08 08:46:47 UTC (rev 311)
@@ -48,12 +48,10 @@
*/
Named( const std::string& tag ) : object(R_NilValue), tag(tag){} ;
-#ifdef HAS_VARIADIC_TEMPLATES
template<typename T>
Named( const std::string& tag, const T& value ) : object(R_NilValue), tag(tag) {
object = wrap( value ) ;
}
-#endif
SEXP getSEXP() const ;
Modified: pkg/src/Rcpp/Pairlist.h
===================================================================
--- pkg/src/Rcpp/Pairlist.h 2010-01-07 21:28:05 UTC (rev 310)
+++ pkg/src/Rcpp/Pairlist.h 2010-01-08 08:46:47 UTC (rev 311)
@@ -76,7 +76,29 @@
setSEXP( grow(object, m_sexp) ) ;
}
-
+ /**
+ * wraps an object and add it at the end of the pairlist
+ * (this require traversing the entire pairlist)
+ *
+ * @param object anything that can be wrapped by one
+ * of the wrap functions, or an object of class Named
+ */
+ template <typename T>
+ void push_back( const T& object){
+ if( isNULL() ){
+ setSEXP( grow( object, m_sexp ) ) ;
+ } else {
+ SEXP x = m_sexp ;
+ /* traverse the pairlist */
+ while( !Rf_isNull(CDR(x)) ){
+ x = CDR(x) ;
+ }
+ SEXP tail = PROTECT( pairlist( object ) );
+ SETCDR( x, tail ) ;
+ UNPROTECT(1) ;
+ }
+ }
+
};
#ifdef HAS_VARIADIC_TEMPLATES
More information about the Rcpp-commits
mailing list