[Rcpp-commits] r285 - in pkg: inst inst/unitTests src src/Rcpp

noreply at r-forge.r-project.org noreply at r-forge.r-project.org
Wed Jan 6 09:17:15 CET 2010


Author: romain
Date: 2010-01-06 09:17:09 +0100 (Wed, 06 Jan 2010)
New Revision: 285

Added:
   pkg/inst/unitTests/runit.wrap.R
Modified:
   pkg/inst/ChangeLog
   pkg/inst/unitTests/runit.RObject.R
   pkg/src/Rcpp/wrap.h
   pkg/src/RcppCommon.h
   pkg/src/wrap.cpp
Log:
wrap( std::initializer_list<> )

Modified: pkg/inst/ChangeLog
===================================================================
--- pkg/inst/ChangeLog	2010-01-05 17:46:03 UTC (rev 284)
+++ pkg/inst/ChangeLog	2010-01-06 08:17:09 UTC (rev 285)
@@ -1,5 +1,12 @@
 2010-01-05  Romain Francois <francoisromain at free.fr>
 
+	* src/Rcpp/wrap.h : wrap can now use initializer lists (available 
+	on on GCC >= 4.4). 
+	* src/wrap.cpp: implementation
+	* int/unitTests/runit.wrap.R: unit tests
+
+2010-01-05  Romain Francois <francoisromain at free.fr>
+
 	* src/Rcpp/GenericVector.h : new class Rcpp::GenericVector 
 	and an alias Rcpp::List to handle lists (VECSXP), aka generic 
 	vectors

Modified: pkg/inst/unitTests/runit.RObject.R
===================================================================
--- pkg/inst/unitTests/runit.RObject.R	2010-01-05 17:46:03 UTC (rev 284)
+++ pkg/inst/unitTests/runit.RObject.R	2010-01-06 08:17:09 UTC (rev 285)
@@ -290,4 +290,3 @@
 	checkTrue( !funx(.GlobalEnv), msg = "RObject.isNULL(environment) -> false" )
 }
 
-

Added: pkg/inst/unitTests/runit.wrap.R
===================================================================
--- pkg/inst/unitTests/runit.wrap.R	                        (rev 0)
+++ pkg/inst/unitTests/runit.wrap.R	2010-01-06 08:17:09 UTC (rev 285)
@@ -0,0 +1,66 @@
+#!/usr/bin/r -t
+#
+# Copyright (C) 2009 - 2010	Romain Francois
+#
+# This file is part of Rcpp.
+#
+# Rcpp is free software: you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+#
+# Rcpp is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Rcpp.  If not, see <http://www.gnu.org/licenses/>.
+
+.setUp <- function(){
+	suppressMessages( require( inline ) )
+}
+
+if( Rcpp:::capabilities()[["initializer lists"]] ){ 
+
+	test.wrap.initializerlist.int <- function(){
+		funx <- cfunction(signature(), '
+		return Rcpp::wrap( {0,1,2} ); 
+		', Rcpp=TRUE, verbose=FALSE)
+		checkEquals( funx(), 0:2, 
+			msg = "wrap( initializer_list<int> )" )
+	}
+	
+	test.wrap.initializerlist.double <- function(){
+		funx <- cfunction(signature(), '
+		return Rcpp::wrap( {0.0,1.0,2.0} ); 
+		', Rcpp=TRUE, verbose=FALSE)
+		checkEquals( funx(), as.numeric(0:2), 
+			msg = "wrap( initializer_list<double> )" )
+	}
+	
+	test.wrap.initializerlist.bool <- function(){
+		funx <- cfunction(signature(), '
+		return Rcpp::wrap( {false, true, false} ); 
+		', Rcpp=TRUE, verbose=FALSE)
+		checkEquals( funx(), c(FALSE, TRUE, FALSE), 
+			msg = "wrap( initializer_list<bool> )" )
+	}
+	
+	test.wrap.initializerlist.Rbyte <- function(){
+		funx <- cfunction(signature(), '
+		return Rcpp::wrap( { (Rbyte)0, (Rbyte)1 } ); 
+		', Rcpp=TRUE, verbose=FALSE)
+		checkEquals( funx(), as.raw(0:1), 
+			msg = "wrap( initializer_list<Rbyte> )" )
+	}
+	
+	# test.wrap.initializerlist.RObject <- function(){
+	# 	funx <- cfunction(signature(), '
+	# 	return Rcpp::wrap( { Rcpp::wrap(1), Rcpp::wrap("foo"), Rcpp::wrap(1.0)  } ); 
+	# 	', Rcpp=TRUE, verbose=FALSE)
+	# 	checkEquals( funx(), list(1L, "foo", 1.0) , 
+	# 		msg = "wrap( initializer_list<SEXP> )" )
+	# }
+
+}

Modified: pkg/src/Rcpp/wrap.h
===================================================================
--- pkg/src/Rcpp/wrap.h	2010-01-05 17:46:03 UTC (rev 284)
+++ pkg/src/Rcpp/wrap.h	2010-01-06 08:17:09 UTC (rev 285)
@@ -22,9 +22,18 @@
 #ifndef Rcpp_wrap_h
 #define Rcpp_wrap_h
 
+#ifdef HAS_INIT_LISTS
+#include <initializer_list>
+#endif
+
 #include <RcppCommon.h>
 #include <Rcpp/RObject.h>
 #include <set>
+#include <Rcpp/IntegerVector.h>
+#include <Rcpp/RawVector.h>
+#include <Rcpp/NumericVector.h>
+#include <Rcpp/LogicalVector.h>
+#include <Rcpp/GenericVector.h>
 
 namespace Rcpp{ 
 
@@ -50,6 +59,12 @@
 RObject wrap(const std::set<std::string> & v);
 RObject wrap(const std::set<Rbyte> & v);
 
+IntegerVector wrap( std::initializer_list<int> list) ;
+NumericVector wrap( std::initializer_list<double> list) ; 
+LogicalVector wrap( std::initializer_list<bool> list) ;
+RawVector wrap(std::initializer_list<Rbyte> list) ;
+// List wrap( std::initializer_list<RObject> list) ;
+
 } // namespace Rcpp
 
 #endif

Modified: pkg/src/RcppCommon.h
===================================================================
--- pkg/src/RcppCommon.h	2010-01-05 17:46:03 UTC (rev 284)
+++ pkg/src/RcppCommon.h	2010-01-06 08:17:09 UTC (rev 285)
@@ -45,7 +45,6 @@
 
 // include R headers, but set R_NO_REMAP and access everything via Rf_ prefixes
 #define R_NO_REMAP
-
 #include <R.h>
 #include <Rinternals.h>
 #include <R_ext/Callbacks.h>

Modified: pkg/src/wrap.cpp
===================================================================
--- pkg/src/wrap.cpp	2010-01-05 17:46:03 UTC (rev 284)
+++ pkg/src/wrap.cpp	2010-01-06 08:17:09 UTC (rev 285)
@@ -19,9 +19,19 @@
 // You should have received a copy of the GNU General Public License
 // along with Rcpp.  If not, see <http://www.gnu.org/licenses/>.
 
+#include <RcppCommon.h>
 #include <Rcpp/wrap.h>
 #include <Rcpp/Symbol.h>
 #include <Rcpp/Environment.h>
+#include <algorithm>
+#ifdef HAS_INIT_LISTS
+#include <initializer_list>
+#endif
+#include <Rcpp/IntegerVector.h>
+#include <Rcpp/RawVector.h>
+#include <Rcpp/NumericVector.h>
+#include <Rcpp/LogicalVector.h>
+#include <Rcpp/GenericVector.h>
 
 namespace Rcpp{
 
@@ -175,4 +185,38 @@
     return o ;
 }
 
+#ifdef HAS_INIT_LISTS
+IntegerVector wrap( std::initializer_list<int> list) {
+	SEXP x = PROTECT( Rf_allocVector( INTSXP, list.size() ) ) ;
+	std::copy( list.begin(), list.end(), INTEGER(x) ) ;
+	UNPROTECT(1) ;
+	return IntegerVector( x ) ;
+}
+NumericVector wrap( std::initializer_list<double> list) {
+	SEXP x = PROTECT( Rf_allocVector( REALSXP, list.size() ) ) ;
+	std::copy( list.begin(), list.end(), REAL(x) ) ;
+	UNPROTECT(1) ;
+	return NumericVector( x ) ;
+}
+LogicalVector wrap( std::initializer_list<bool> list) {
+	SEXP x = PROTECT( Rf_allocVector( LGLSXP, list.size() ) ) ;
+	std::copy( list.begin(), list.end(), LOGICAL(x) ) ;
+	UNPROTECT(1) ;
+	return LogicalVector( x ) ;
+}
+RawVector wrap(std::initializer_list<Rbyte> list){
+	SEXP x = PROTECT( Rf_allocVector( RAWSXP, list.size() ) ) ;
+	std::copy( list.begin(), list.end(), RAW(x) ) ;
+	UNPROTECT(1) ;
+	return RawVector( x ) ;
+}
+// List wrap( std::initializer_list<RObject> list){
+// 	SEXP x = PROTECT( Rf_allocVector( VECSXP, list.size() ) ) ;
+// 	std::copy( list.begin(), list.end(), VECTOR_PTR(x) ) ;
+// 	UNPROTECT(1) ;
+// 	return List( x ) ;
+// }
+#endif
+
+
 } // namespace Rcpp



More information about the Rcpp-commits mailing list