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

noreply at r-forge.r-project.org noreply at r-forge.r-project.org
Fri Jan 8 16:34:21 CET 2010


Author: romain
Date: 2010-01-08 16:34:21 +0100 (Fri, 08 Jan 2010)
New Revision: 317

Modified:
   pkg/inst/ChangeLog
   pkg/inst/unitTests/runit.Pairlist.R
   pkg/src/RObject.cpp
   pkg/src/Rcpp/Language.h
   pkg/src/Rcpp/Pairlist.h
   pkg/src/Rcpp/RObject.h
   pkg/src/exceptions.cpp
Log:
{Language,Pairlist}::insert

Modified: pkg/inst/ChangeLog
===================================================================
--- pkg/inst/ChangeLog	2010-01-08 13:32:56 UTC (rev 316)
+++ pkg/inst/ChangeLog	2010-01-08 15:34:21 UTC (rev 317)
@@ -1,6 +1,7 @@
 2010-01-08  Romain Francois <francoisromain at free.fr>
 
-	* src/Rcpp/Pairlist.h: Pairlist gains a push_back method
+	* src/Rcpp/Pairlist.h: Pairlist gains a push_back 
+	and insert methods
 
 	* src/Rcpp/Language.h: idem for Language
 

Modified: pkg/inst/unitTests/runit.Pairlist.R
===================================================================
--- pkg/inst/unitTests/runit.Pairlist.R	2010-01-08 13:32:56 UTC (rev 316)
+++ pkg/inst/unitTests/runit.Pairlist.R	2010-01-08 15:34:21 UTC (rev 317)
@@ -80,3 +80,28 @@
 		msg = "Pairlist::push_back" )
 }
 
+test.Pairlist.insert <- function(){
+	funx <- cfunction(signature(), '
+	Pairlist p ;
+	p.push_back( 1 ) ;
+	p.push_back( 10.0 ) ;
+	p.push_back( 20.0 ) ;
+	
+	/* insert in 2nd position */
+	p.insert( 1, Named( "bla", "bla" ) ) ;
+	
+	/* insert in front */
+	p.insert( 0, 30.0 ) ;
+	
+	/* insert in back */
+	p.insert( 5, "foobar" ) ;
+	
+	return p ;
+	', Rcpp=TRUE, verbose=FALSE, includes = "using namespace Rcpp;" )
+	checkEquals( funx(), 
+		pairlist( 30.0, 1L, bla = "bla", 10.0, 20.0, "foobar" ), 
+		msg = "Pairlist::replace" )
+}
+
+
+

Modified: pkg/src/RObject.cpp
===================================================================
--- pkg/src/RObject.cpp	2010-01-08 13:32:56 UTC (rev 316)
+++ pkg/src/RObject.cpp	2010-01-08 15:34:21 UTC (rev 317)
@@ -122,6 +122,10 @@
 const char* RObject::not_s4::what( ) const throw() {
 	return "not an S4 object" ;
 }
+const char* RObject::index_out_of_bounds::what( ) const throw() {
+	return "array or list out of bounds" ;
+}
 
+
 } // namespace Rcpp
 

Modified: pkg/src/Rcpp/Language.h
===================================================================
--- pkg/src/Rcpp/Language.h	2010-01-08 13:32:56 UTC (rev 316)
+++ pkg/src/Rcpp/Language.h	2010-01-08 15:34:21 UTC (rev 317)
@@ -115,6 +115,43 @@
 	}
 
 	/**
+	 * wraps an object and add it in front of the 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_front( const T& object){
+		setSEXP( grow(object, m_sexp) ) ;
+		SET_TAG(m_sexp, R_NilValue);
+		SET_TYPEOF(m_sexp, LANGSXP);
+	}
+
+
+	template <typename T>
+	void insert( const int& index, const T& object) throw(index_out_of_bounds) {
+		if( index == 0 ) {
+			push_front( object ) ;
+		} else{
+			if( index <  0 ) throw index_out_of_bounds() ;
+			if( isNULL( ) ) throw index_out_of_bounds() ;
+			
+			if( index < 0 || index > Rf_length(m_sexp) ) throw index_out_of_bounds() ;
+			
+			int i=1;
+			SEXP x = m_sexp ;
+			while( i < index ){
+				x = CDR(x) ;
+				i++; 
+			}
+			SEXP tail = PROTECT( grow( object, CDR(x) ) ) ; 
+			SETCDR( x, tail ) ;
+			UNPROTECT(1) ;
+		}
+	}
+	
+	
+	/**
 	 * sets the symbol of the call
 	 */
 	void setSymbol( const std::string& symbol);

Modified: pkg/src/Rcpp/Pairlist.h
===================================================================
--- pkg/src/Rcpp/Pairlist.h	2010-01-08 13:32:56 UTC (rev 316)
+++ pkg/src/Rcpp/Pairlist.h	2010-01-08 15:34:21 UTC (rev 317)
@@ -98,6 +98,29 @@
 			UNPROTECT(1) ;
 		}
 	}
+	
+	template <typename T>
+	void insert( const int& index, const T& object) throw(index_out_of_bounds) {
+		if( index == 0 ) {
+			push_front( object ) ;
+		} else{
+			if( index <  0 ) throw index_out_of_bounds() ;
+			if( isNULL( ) ) throw index_out_of_bounds() ;
+			
+			if( index < 0 || index > Rf_length(m_sexp) ) throw index_out_of_bounds() ;
+			
+			int i=1;
+			SEXP x = m_sexp ;
+			while( i < index ){
+				x = CDR(x) ;
+				i++; 
+			}
+			SEXP tail = PROTECT( grow( object, CDR(x) ) ) ; 
+			SETCDR( x, tail ) ;
+			UNPROTECT(1) ;
+		}
+	}
+	
 
 };
 

Modified: pkg/src/Rcpp/RObject.h
===================================================================
--- pkg/src/Rcpp/RObject.h	2010-01-08 13:32:56 UTC (rev 316)
+++ pkg/src/Rcpp/RObject.h	2010-01-08 15:34:21 UTC (rev 317)
@@ -51,7 +51,14 @@
    			~not_s4() throw(){} ;
    			const char* what() const throw() ; 
    	} ;
-
+   	
+   	class index_out_of_bounds: public std::exception{
+   	public:
+   		index_out_of_bounds() throw(){};
+   		~index_out_of_bounds() throw(){};
+   		const char* what() const throw() ;
+   	} ;
+   	
    /**
      * default constructor. uses R_NilValue
      */ 

Modified: pkg/src/exceptions.cpp
===================================================================
--- pkg/src/exceptions.cpp	2010-01-08 13:32:56 UTC (rev 316)
+++ pkg/src/exceptions.cpp	2010-01-08 15:34:21 UTC (rev 317)
@@ -2,7 +2,7 @@
 //
 // exceptions.cpp: R/C++ interface class library -- exception handling
 //
-// Copyright (C) 2009 - 2010 Romain Francois
+// Copyright (C) 2009 - 2010 Dirk Eddelbuettel and Romain Francois
 //
 // This file is part of Rcpp.
 //

_______________________________________________
Rcpp-commits mailing list
Rcpp-commits at lists.r-forge.r-project.org
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-commits


More information about the Rcpp-devel mailing list