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

noreply at r-forge.r-project.org noreply at r-forge.r-project.org
Wed Dec 30 15:40:36 CET 2009


Author: romain
Date: 2009-12-30 15:40:36 +0100 (Wed, 30 Dec 2009)
New Revision: 236

Added:
   pkg/inst/unitTests/runit.environments.R
   pkg/src/Environment.cpp
   pkg/src/Rcpp/Environment.h
Modified:
   pkg/cleanup
   pkg/inst/ChangeLog
   pkg/src/Rcpp.h
   pkg/src/RcppCommon.h
Log:
support for environments

Modified: pkg/cleanup
===================================================================
--- pkg/cleanup	2009-12-30 13:48:14 UTC (rev 235)
+++ pkg/cleanup	2009-12-30 14:40:36 UTC (rev 236)
@@ -2,6 +2,7 @@
 rm -f confdefs.h config.log config.status \
 	src/*.o src/*.so src/*.a src/*.d src/*.dll src/*.rc \
 	RcppSrc/*.o RcppSrc/*.a inst/Rcpp-version.txt \
+	inst/lib/Rcpp/* \
 	inst/lib/libRcpp.so inst/lib/Rcpp*.h inst/lib/libRcpp.a \
 	inst/doc/*.cpp inst/doc/*.hpp \
 	inst/doc/*.Rd inst/doc/*.aux inst/doc/*.log inst/doc/*.tex \
@@ -9,6 +10,7 @@
 	inst/doc/auto \
 	src/Makedeps \
 	autom4te.cache
+test -d inst/lib/Rcpp && rmdir inst/lib/Rcpp
 test -d inst/lib && rmdir inst/lib
 find . -name \*~ -exec rm {} \;
 find . -name \*.flc -exec rm {} \;

Modified: pkg/inst/ChangeLog
===================================================================
--- pkg/inst/ChangeLog	2009-12-30 13:48:14 UTC (rev 235)
+++ pkg/inst/ChangeLog	2009-12-30 14:40:36 UTC (rev 236)
@@ -1,5 +1,16 @@
 2009-12-30  Romain Francois <francoisromain at free.fr>
 
+	* src/Rcpp/Environment.h : added minimal support for environment
+	
+	* src/Environment.cpp: idem
+	
+	* inst/unitTests/runit.environments.R: testing the above
+	
+	* src/RcppCommon.h: now includes <R_ext/Callbacks.h>, needed for the 
+	environment support
+	
+2009-12-30  Romain Francois <francoisromain at free.fr>
+
 	* src/Makevars* : adapt for allowong copy of the Rcpp directory
 	
 	* src/Rcpp_RObject.h: replace by src/Rcpp/RObject.h
@@ -7,6 +18,8 @@
 	* src/Rcpp_XPtr.h: replaced by src/Rcpp/XPtr.h
 	
 	* src/*.cpp: adapt to the Rcpp directory
+	
+	* cleanup: idem
 
 2009-12-30  Romain Francois <francoisromain at free.fr>
 

Added: pkg/inst/unitTests/runit.environments.R
===================================================================
--- pkg/inst/unitTests/runit.environments.R	                        (rev 0)
+++ pkg/inst/unitTests/runit.environments.R	2009-12-30 14:40:36 UTC (rev 236)
@@ -0,0 +1,50 @@
+#!/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 ) )
+}
+
+test.environment.ls <- function(){
+	funx <- cfunction(signature(x="environment"), '
+	Rcpp::Environment env(x) ; 
+	return env.ls(true) ;
+	', Rcpp=TRUE, verbose=FALSE)
+	
+	e <- new.env( )
+	e$a <- 1:10
+	e$b <- "foo"
+	e$.c <- "hidden"
+	checkEquals( funx(e), c("a","b", ".c"), msg = "Environment::ls(true)" )
+	checkEquals( funx(asNamespace("Rcpp")), ls(envir=asNamespace("Rcpp"), all = TRUE), 
+		msg = "Environment(namespace)::ls()" )
+	
+	funx <- cfunction(signature(x="environment"), '
+	Rcpp::Environment env(x) ; 
+	return env.ls(false) ;
+	', Rcpp=TRUE, verbose=FALSE)
+	checkEquals( funx(e), c("a","b"), msg = "Environment::ls(false)" )
+	checkEquals( funx(asNamespace("Rcpp")), ls(envir=asNamespace("Rcpp"), all = FALSE), 
+		msg = "Environment(namespace)::ls()" )
+	
+}
+
+
+
+

Added: pkg/src/Environment.cpp
===================================================================
--- pkg/src/Environment.cpp	                        (rev 0)
+++ pkg/src/Environment.cpp	2009-12-30 14:40:36 UTC (rev 236)
@@ -0,0 +1,50 @@
+// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; tab-width: 8 -*-
+//
+// Environment.cpp: Rcpp R/C++ interface class library -- Environments
+//
+// 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/>.
+
+#include <Rcpp/Environment.h>
+
+namespace Rcpp {
+
+	Environment::Environment( SEXP m_sexp = R_GlobalEnv) : RObject::RObject(m_sexp){
+		if( TYPEOF(m_sexp) != ENVSXP ){
+			throw std::runtime_error( "not an environment" ) ;
+		}
+		is_user_database = IS_USER_DATABASE(m_sexp) ;
+	}
+	
+	Environment::~Environment(){
+		logTxt( "~Environment" ) ;
+	}
+	
+	SEXP Environment::ls( bool all = true) const {
+		if( is_user_database ){
+			R_ObjectTable *tb = (R_ObjectTable*)
+				R_ExternalPtrAddr(HASHTAB(m_sexp));
+			return tb->objects(tb) ;
+		} else{
+			Rboolean get_all = all ? TRUE : FALSE ;
+			return R_lsInternal( m_sexp, get_all ) ;
+		}
+		return R_NilValue ;
+	}
+	
+} // namespace Rcpp
+

Added: pkg/src/Rcpp/Environment.h
===================================================================
--- pkg/src/Rcpp/Environment.h	                        (rev 0)
+++ pkg/src/Rcpp/Environment.h	2009-12-30 14:40:36 UTC (rev 236)
@@ -0,0 +1,67 @@
+// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; tab-width: 8 -*-
+//
+// Rcpp_RObject.h: Rcpp R/C++ interface class library -- super class of all R objects wrapped in C++ classes
+//
+// Copyright (C) 2009 - 2010	Dirk Eddelbuettel
+// 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/>.
+
+#ifndef Rcpp_Environment_h
+#define Rcpp_Environment_h
+
+#include <RcppCommon.h>
+#include <Rcpp/RObject.h>
+
+#define IS_USER_DATABASE(rho)  OBJECT((rho)) && Rf_inherits((rho), "UserDefinedDatabase")
+
+namespace Rcpp{ 
+
+class Environment: public RObject{
+public:
+	
+	/**
+	 * wraps the given environment
+	 *
+	 * if the SEXP is not an environment, and exception is thrown
+	 */
+	Environment(SEXP m_sexp) ;
+    
+	/**
+	 * Nothing specific
+	 */ 
+    ~Environment() ;
+	
+    /**
+     * The list of objects in the environment
+     * 
+     * the same as calling this from R: 
+     * > ls( envir = this, all = all )
+     */ 
+    SEXP ls(bool all) const ;
+    
+protected:
+	
+	/**
+	 * we cache whether this environment is a user defined database
+	 * or a standard environment
+	 */
+	bool is_user_database ;
+};
+
+} // namespace Rcpp
+
+#endif

Modified: pkg/src/Rcpp.h
===================================================================
--- pkg/src/Rcpp.h	2009-12-30 13:48:14 UTC (rev 235)
+++ pkg/src/Rcpp.h	2009-12-30 14:40:36 UTC (rev 236)
@@ -43,6 +43,7 @@
 
 /* new api */
 #include <Rcpp/RObject.h>
-#include <Rcpp/XPtr.h>
+#include <Rcpp/XPtr.h> 
+#include <Rcpp/Environment.h> 
 
 #endif

Modified: pkg/src/RcppCommon.h
===================================================================
--- pkg/src/RcppCommon.h	2009-12-30 13:48:14 UTC (rev 235)
+++ pkg/src/RcppCommon.h	2009-12-30 14:40:36 UTC (rev 236)
@@ -38,6 +38,7 @@
 
 #include <R.h>
 #include <Rinternals.h>
+#include <R_ext/Callbacks.h>
 
 // #ifdef BUILDING_DLL
 // #define RcppExport extern "C" __declspec(dllexport)



More information about the Rcpp-commits mailing list