[Rcpp-devel] [Rcpp-commits] r347 - in pkg: inst inst/unitTests src src/Rcpp
noreply at r-forge.r-project.org
noreply at r-forge.r-project.org
Mon Jan 11 22:24:20 CET 2010
Author: romain
Date: 2010-01-11 22:24:09 +0100 (Mon, 11 Jan 2010)
New Revision: 347
Modified:
pkg/inst/ChangeLog
pkg/inst/unitTests/runit.CharacterVector.R
pkg/src/CharacterVector.cpp
pkg/src/Rcpp/CharacterVector.h
Log:
CharacterVector::StringProxy::operator+=
Modified: pkg/inst/ChangeLog
===================================================================
--- pkg/inst/ChangeLog 2010-01-11 21:03:55 UTC (rev 346)
+++ pkg/inst/ChangeLog 2010-01-11 21:24:09 UTC (rev 347)
@@ -1,5 +1,8 @@
2010-01-11 Romain Francois <francoisromain at free.fr>
+ * src/Rcpp/CharacterVector.h: StringProxy gains operator+=
+ * src/CharacterVector.cpp: implementation
+
* src/Rcpp/*Vector.h: operator[] now throws index out of bounds
exception when needed (FR#770)
* src/*Vector.cpp: same
Modified: pkg/inst/unitTests/runit.CharacterVector.R
===================================================================
--- pkg/inst/unitTests/runit.CharacterVector.R 2010-01-11 21:03:55 UTC (rev 346)
+++ pkg/inst/unitTests/runit.CharacterVector.R 2010-01-11 21:24:09 UTC (rev 347)
@@ -53,4 +53,17 @@
}
}
+test.CharacterVector.plusequals <- function(){
+ funx <- cfunction(signature(), '
+ CharacterVector x(2) ;
+ x[0] = "foo" ;
+ x[1] = "bar" ;
+ x[0] += "bar" ;
+ x[1] += "foo" ;
+ return x ;
+ ', Rcpp=TRUE, verbose=FALSE, includes = "using namespace Rcpp;" )
+ checkEquals( funx(), c("foobar", "barfoo"),
+ msg = "StringProxy::operator+=" )
+
+}
Modified: pkg/src/CharacterVector.cpp
===================================================================
--- pkg/src/CharacterVector.cpp 2010-01-11 21:03:55 UTC (rev 346)
+++ pkg/src/CharacterVector.cpp 2010-01-11 21:24:09 UTC (rev 347)
@@ -108,11 +108,26 @@
return *this ;
}
+CharacterVector::StringProxy& CharacterVector::StringProxy::operator+=( const std::string& rhs){
+ std::string full( CHAR(STRING_ELT(parent,index)) ) ;
+ full += rhs ;
+ SET_STRING_ELT( parent, index, Rf_mkChar( full.c_str() ) ) ;
+ return *this ;
+}
+
+CharacterVector::StringProxy& CharacterVector::StringProxy::operator+=( const StringProxy& rhs){
+ std::string full( CHAR(STRING_ELT(parent,index)) ) ;
+ full += CHAR(STRING_ELT( rhs.parent, rhs.index)) ;
+ SET_STRING_ELT( parent, index, Rf_mkChar(full.c_str()) ) ;
+ return *this ;
+}
+
CharacterVector::StringProxy& CharacterVector::StringProxy::operator=( const std::string& rhs){
SET_STRING_ELT( parent, index, Rf_mkChar( rhs.c_str() ) ) ;
return *this ;
}
+
const CharacterVector::StringProxy CharacterVector::operator[](int i) const throw(index_out_of_bounds){
if( i<0 || i>=length()) throw index_out_of_bounds() ;
return StringProxy(const_cast<CharacterVector&>(*this), i) ;
Modified: pkg/src/Rcpp/CharacterVector.h
===================================================================
--- pkg/src/Rcpp/CharacterVector.h 2010-01-11 21:03:55 UTC (rev 346)
+++ pkg/src/Rcpp/CharacterVector.h 2010-01-11 21:24:09 UTC (rev 347)
@@ -44,6 +44,9 @@
StringProxy& operator=(const StringProxy& rhs) ;
StringProxy& operator=(const std::string& rhs) ;
+ StringProxy& operator+=(const StringProxy& rhs) ;
+ StringProxy& operator+=(const std::string& rhs) ;
+
/* rvalue use */
operator SEXP() const ;
operator char*() const ;
_______________________________________________
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