[Rprotobuf-commits] r401 - / patches
noreply at r-forge.r-project.org
noreply at r-forge.r-project.org
Mon Oct 18 16:57:42 CEST 2010
Author: edd
Date: 2010-10-18 16:57:42 +0200 (Mon, 18 Oct 2010)
New Revision: 401
Added:
patches/patch_by_Koert_rprotobuf_r392.diff
Removed:
patch_by_Kort_rprotobuf_r392.diff
Log:
move patch to new patches/ directory
Deleted: patch_by_Kort_rprotobuf_r392.diff
===================================================================
--- patch_by_Kort_rprotobuf_r392.diff 2010-10-18 14:56:13 UTC (rev 400)
+++ patch_by_Kort_rprotobuf_r392.diff 2010-10-18 14:57:42 UTC (rev 401)
@@ -1,347 +0,0 @@
-Index: pkg/src/extractors.cpp
-===================================================================
---- pkg/src/extractors.cpp (revision 392)
-+++ pkg/src/extractors.cpp (working copy)
-@@ -51,7 +51,7 @@
- case TYPE : \
- return Rcpp::wrap( RepeatedFieldImporter<DATATYPE>(ref, *message, fieldDesc) ) ; \
-
-- HANDLE_REPEATED_FIELD(CPPTYPE_INT32, GPB::int32) ;
-+ HANDLE_REPEATED_FIELD(CPPTYPE_INT32, GPB::int32) ;
- HANDLE_REPEATED_FIELD(CPPTYPE_INT64, GPB::int64) ;
- HANDLE_REPEATED_FIELD(CPPTYPE_UINT32 , GPB::uint32) ;
- HANDLE_REPEATED_FIELD(CPPTYPE_UINT64 , GPB::uint64) ;
-@@ -59,10 +59,24 @@
- HANDLE_REPEATED_FIELD(CPPTYPE_FLOAT, float) ;
- HANDLE_REPEATED_FIELD(CPPTYPE_BOOL, bool) ;
- HANDLE_REPEATED_FIELD(CPPTYPE_ENUM, enum_field ) ;
-- HANDLE_REPEATED_FIELD(CPPTYPE_STRING, std::string ) ;
- HANDLE_REPEATED_FIELD(CPPTYPE_MESSAGE, message_field ) ;
- #undef HANDLE_REPEATED_FIELD
-
-+ case CPPTYPE_STRING:
-+ if (fieldDesc->type() == TYPE_STRING) {
-+ return Rcpp::wrap( RepeatedFieldImporter<std::string>(ref, *message, fieldDesc) ) ;
-+ } else if (fieldDesc->type() == TYPE_BYTES) {
-+ int field_size = ref->FieldSize( *message, fieldDesc ) ;
-+ Rcpp::List res(field_size);
-+ for (int i=0; i<field_size; i++) {
-+ std::string s = ref->GetRepeatedString(*message, fieldDesc, i);
-+ res[i] = Rcpp::wrap(std::vector<Rbyte>(s.begin(), s.end()));
-+ }
-+ return res;
-+ } else {
-+ throwException( "unknown field type with CPP_TYPE STRING", "ConversionException" ) ;
-+ }
-+
- }
-
- } else {
-@@ -81,14 +95,22 @@
- HANDLE_SINGLE_FIELD( CPPTYPE_DOUBLE, Double );
- HANDLE_SINGLE_FIELD( CPPTYPE_FLOAT, Float );
- HANDLE_SINGLE_FIELD( CPPTYPE_BOOL, Bool );
-- HANDLE_SINGLE_FIELD( CPPTYPE_STRING, String );
- #undef HANDLE_SINGLE_FIELD
-
-+ case CPPTYPE_STRING:
-+ if (fieldDesc->type() == TYPE_STRING) {
-+ return Rcpp::wrap( ref->GetString(*message, fieldDesc) );
-+ } else if (fieldDesc->type() == TYPE_BYTES) {
-+ std::string s = ref->GetString(*message, fieldDesc);
-+ return Rcpp::wrap(std::vector<Rbyte>(s.begin(), s.end()));
-+ } else {
-+ throwException( "unknown field type with CPP_TYPE STRING", "ConversionException" ) ;
-+ }
- case CPPTYPE_ENUM :
-- return Rcpp::wrap( ref->GetEnum( *message, fieldDesc )->number() ) ;
-+ return Rcpp::wrap( ref->GetEnum( *message, fieldDesc )->number() ) ;
-
-- case CPPTYPE_MESSAGE:
-- return S4_Message( CLONE( &ref->GetMessage( *message, fieldDesc ) ) ) ;
-+ case CPPTYPE_MESSAGE:
-+ return S4_Message( CLONE( &ref->GetMessage( *message, fieldDesc ) ) ) ;
- break ;
- }
- }
-Index: pkg/src/mutators.cpp
-===================================================================
---- pkg/src/mutators.cpp (revision 392)
-+++ pkg/src/mutators.cpp (working copy)
-@@ -152,18 +152,24 @@
- return "" ; // -Wall, should not happen since we only call this when we know it works
- }
-
--/**
-- * calls the R function charToRaw to convert raw into a string
-- *
-- * @param raw raw vector
-- * @return a string (STRSXP)
-- */
--/* FIXME: maybe we don't need to go back to R for this */
--SEXP rawToString( SEXP raw){
-- SEXP call = PROTECT( Rf_lang2( Rf_install("charToRaw"), raw ) ) ;
-- SEXP res = PROTECT( Rf_eval( call, R_GlobalEnv ) );
-- UNPROTECT( 2 ) ; /* res, call */
-- return res ;
-+std::string GET_bytes( SEXP x, int index ){
-+ switch( TYPEOF(x)) {
-+ case RAWSXP:
-+ if (index == 0) {
-+ return(std::string((const char *) RAW(x), (size_t) LENGTH(x)));
-+ } else {
-+ throwException( "cannot cast SEXP to bytes", "CastException" ) ;
-+ }
-+ case VECSXP:
-+ if (TYPEOF(VECTOR_ELT(x, index)) == RAWSXP) {
-+ return(std::string((const char *) RAW(VECTOR_ELT(x, index)), (size_t) LENGTH(VECTOR_ELT(x, index))));
-+ } else {
-+ throwException( "cannot cast SEXP to bytes", "CastException" ) ;
-+ }
-+ default:
-+ throwException( "cannot cast SEXP to bytes", "CastException" ) ;
-+ }
-+ return "" ; // -Wall, should not happen since we only call this when we know it works
- }
-
- /**
-@@ -189,6 +195,25 @@
- return _TRUE_ ;
- }
-
-+/**
-+ * indicates if this is a list of raws
-+ *
-+ * @param x a list (VECSXP)
-+ * @return TRUE if all objects are instances of RAWSXP
-+ */
-+Rboolean allAreRaws( SEXP x) {
-+
-+ if( TYPEOF(x) != VECSXP ) return _FALSE_ ;
-+
-+ int n = LENGTH(x) ;
-+ SEXP current ;
-+ for( int i=0; i<n; i++){
-+ current = VECTOR_ELT( x, i) ;
-+ /* not a RAWSXP */
-+ if( TYPEOF(current) != RAWSXP ) return _FALSE_ ;
-+ }
-+ return _TRUE_ ;
-+}
-
- /**
- * check that all the values contained in value are suitable for the
-@@ -345,7 +370,9 @@
- value_size = 1 ; /* we will store the message payload */
- } else if( TYPEOF(value) == VECSXP && allAreMessages( value ) ){
- value_size = LENGTH(value) ;
-- } else{
-+ } else if( TYPEOF(value) == VECSXP && allAreRaws( value ) ){
-+ value_size = LENGTH(value) ;
-+ } else {
- throwException( "cannot convert to string", "ConversionException" ) ;
- }
- }
-@@ -744,8 +771,20 @@
- }
- case RAWSXP:
- {
-- ref->SetRepeatedString( message, field_desc, 0, COPYSTRING( CHAR(STRING_ELT(rawToString(value),0 )) ) ) ;
-- }
-+ /* in any case, fill the values up to field_size */
-+ int i = 0;
-+ for ( ; i<field_size; i++) {
-+ ref->SetRepeatedString( message, field_desc, i, GET_bytes(value, 0)) ;
-+ }
-+
-+ /* then add some if needed */
-+ if( value_size > field_size ){
-+ for( ; i<value_size; i++) {
-+ ref->AddString( message, field_desc, GET_bytes(value, 0)) ;
-+ }
-+ }
-+ break;
-+ }
- case S4SXP:
- {
- /* check if value is a message */
-@@ -759,28 +798,43 @@
- }
- case VECSXP:
- {
-- // we know it is a list of messages because it
-+ // we know it is a list of messages or raws because it
- // has been tested above
--
-- // FIXME: we should probably use SerializeToString
-- // as indicated in the protobuf api documentation
-- // http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.message_lite.html#MessageLite.SerializeAsString.details
-- GPB::Message* __mess ;
--
-- /* in any case, fill the values up to field_size */
-- int i = 0;
-- for( ; i<field_size; i++){
-- __mess = GET_MESSAGE_POINTER_FROM_S4( VECTOR_ELT( value, i ) );
-- ref->SetRepeatedString( message, field_desc, i, __mess->SerializeAsString() ) ;
-- }
--
-- /* then add some if needed */
-- if( value_size > field_size ){
-- for( ; i<value_size; i++){
-- __mess = GET_MESSAGE_POINTER_FROM_S4( VECTOR_ELT( value, i ) );
-- ref->AddString( message, field_desc, __mess->SerializeAsString() ) ;
-- }
-- }
-+ if (LENGTH(value) > 0 && TYPEOF(VECTOR_ELT(value, 0)) == RAWSXP ) {
-+ /* in any case, fill the values up to field_size */
-+ int i = 0;
-+ for( ; i<field_size; i++) {
-+ ref->SetRepeatedString( message, field_desc, i, GET_bytes(value,i )) ;
-+ }
-+
-+ /* then add some if needed */
-+ if( value_size > field_size ) {
-+ for( ; i<value_size; i++){
-+ ref->AddString( message, field_desc, GET_bytes(value,i )) ;
-+ }
-+ }
-+ } else {
-+ // FIXME: we should probably use SerializeToString
-+ // as indicated in the protobuf api documentation
-+ // http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.message_lite.html#MessageLite.SerializeAsString.details
-+ GPB::Message* __mess ;
-+
-+ /* in any case, fill the values up to field_size */
-+ int i = 0;
-+ for( ; i<field_size; i++){
-+ __mess = GET_MESSAGE_POINTER_FROM_S4( VECTOR_ELT( value, i ) );
-+ ref->SetRepeatedString( message, field_desc, i, __mess->SerializeAsString() ) ;
-+ }
-+
-+ /* then add some if needed */
-+ if( value_size > field_size ){
-+ for( ; i<value_size; i++){
-+ __mess = GET_MESSAGE_POINTER_FROM_S4( VECTOR_ELT( value, i ) );
-+ ref->AddString( message, field_desc, __mess->SerializeAsString() ) ;
-+ }
-+ }
-+
-+ }
- break ;
-
- }
-@@ -936,7 +990,7 @@
- }
- case RAWSXP:
- {
-- ref->SetString(message, field_desc, COPYSTRING( CHAR(STRING_ELT( rawToString( value ) ,0 )) ) ) ;
-+ ref->SetString(message, field_desc, GET_bytes(value, 0)) ;
- break ;
- }
- case S4SXP:
-Index: pkg/src/rprotobuf.h
-===================================================================
---- pkg/src/rprotobuf.h (revision 392)
-+++ pkg/src/rprotobuf.h (working copy)
-@@ -59,7 +59,7 @@
-
-
- /* uncomment for debugging */
--// #define RPB_DEBUG
-+#define RPB_DEBUG
-
- #ifdef RPB_DEBUG
- #define RPB_DEBUG_BEGIN(__WHAT__) Rprintf( "<" #__WHAT__ ">\n" ) ;
-@@ -138,6 +138,7 @@
- RcppExport uint64 GET_uint64( SEXP, int ) ;
- RcppExport bool GET_bool( SEXP, int) ;
- RcppExport std::string GET_stdstring( SEXP, int ) ;
-+RcppExport std::string GET_bytes( SEXP, int ) ;
- RcppExport void CHECK_values_for_enum( GPB::FieldDescriptor*, SEXP) ;
- RcppExport void CHECK_messages( GPB::FieldDescriptor*, SEXP) ;
-
-Index: pkg/src/wrapper_Message.cpp
-===================================================================
---- pkg/src/wrapper_Message.cpp (revision 392)
-+++ pkg/src/wrapper_Message.cpp (working copy)
-@@ -840,7 +840,6 @@
-
- // {{{ string
- case TYPE_STRING:
-- case TYPE_BYTES:
- {
- if( TYPEOF(values) == STRSXP ){
- for( int i=0 ; i<value_size; i++){
-@@ -852,6 +851,22 @@
- break ;
- }
- // }}}
-+
-+ // {{{ bytes
-+ case TYPE_BYTES:
-+ {
-+ if( TYPEOF(values) == RAWSXP ){
-+ ref->AddString( message, field_desc, GET_bytes(values,0 )) ;
-+ } else if( TYPEOF(values) == VECSXP ){
-+ for( int i=0 ; i<value_size; i++) {
-+ ref->AddString( message, field_desc, GET_bytes(values,i )) ;
-+ }
-+ } else{
-+ throwException( "Cannot convert to bytes", "ConversionException" ) ;
-+ }
-+ break ;
-+ }
-+ // }}}
-
- // {{{ message
- case TYPE_MESSAGE:
-@@ -983,7 +998,6 @@
- return res;
- }
- case TYPE_STRING:
-- case TYPE_BYTES:
- {
- const GPB::Reflection* ref = message->GetReflection() ;
- Rcpp::CharacterVector res(n) ;
-@@ -992,6 +1006,16 @@
- }
- return res ;
- }
-+ case TYPE_BYTES:
-+ {
-+ const GPB::Reflection* ref = message->GetReflection() ;
-+ Rcpp::List res(n) ;
-+ for( int i=0; i<n; i++){
-+ std::string s = ref->GetRepeatedString( *message, field_desc, index[i] );
-+ res[i] = std::vector<Rbyte>(s.begin(), s.end());
-+ }
-+ return res ;
-+ }
- case TYPE_MESSAGE:
- case TYPE_GROUP:
- {
-@@ -1101,7 +1125,6 @@
- break ;
- }
- case TYPE_STRING:
-- case TYPE_BYTES:
- {
-
- for( int i=0; i<n; i++){
-@@ -1111,6 +1134,16 @@
- }
- break ;
- }
-+ case TYPE_BYTES:
-+ {
-+
-+ for( int i=0; i<n; i++){
-+ ref->SetRepeatedString( message, field_desc,
-+ index[i],
-+ GET_bytes( values, i ) ) ;
-+ }
-+ break ;
-+ }
- case TYPE_ENUM :
- {
- CHECK_values_for_enum( field_desc, values ) ;
Copied: patches/patch_by_Koert_rprotobuf_r392.diff (from rev 393, patch_by_Kort_rprotobuf_r392.diff)
===================================================================
--- patches/patch_by_Koert_rprotobuf_r392.diff (rev 0)
+++ patches/patch_by_Koert_rprotobuf_r392.diff 2010-10-18 14:57:42 UTC (rev 401)
@@ -0,0 +1,347 @@
+Index: pkg/src/extractors.cpp
+===================================================================
+--- pkg/src/extractors.cpp (revision 392)
++++ pkg/src/extractors.cpp (working copy)
+@@ -51,7 +51,7 @@
+ case TYPE : \
+ return Rcpp::wrap( RepeatedFieldImporter<DATATYPE>(ref, *message, fieldDesc) ) ; \
+
+- HANDLE_REPEATED_FIELD(CPPTYPE_INT32, GPB::int32) ;
++ HANDLE_REPEATED_FIELD(CPPTYPE_INT32, GPB::int32) ;
+ HANDLE_REPEATED_FIELD(CPPTYPE_INT64, GPB::int64) ;
+ HANDLE_REPEATED_FIELD(CPPTYPE_UINT32 , GPB::uint32) ;
+ HANDLE_REPEATED_FIELD(CPPTYPE_UINT64 , GPB::uint64) ;
+@@ -59,10 +59,24 @@
+ HANDLE_REPEATED_FIELD(CPPTYPE_FLOAT, float) ;
+ HANDLE_REPEATED_FIELD(CPPTYPE_BOOL, bool) ;
+ HANDLE_REPEATED_FIELD(CPPTYPE_ENUM, enum_field ) ;
+- HANDLE_REPEATED_FIELD(CPPTYPE_STRING, std::string ) ;
+ HANDLE_REPEATED_FIELD(CPPTYPE_MESSAGE, message_field ) ;
+ #undef HANDLE_REPEATED_FIELD
+
++ case CPPTYPE_STRING:
++ if (fieldDesc->type() == TYPE_STRING) {
++ return Rcpp::wrap( RepeatedFieldImporter<std::string>(ref, *message, fieldDesc) ) ;
++ } else if (fieldDesc->type() == TYPE_BYTES) {
++ int field_size = ref->FieldSize( *message, fieldDesc ) ;
++ Rcpp::List res(field_size);
++ for (int i=0; i<field_size; i++) {
++ std::string s = ref->GetRepeatedString(*message, fieldDesc, i);
++ res[i] = Rcpp::wrap(std::vector<Rbyte>(s.begin(), s.end()));
++ }
++ return res;
++ } else {
++ throwException( "unknown field type with CPP_TYPE STRING", "ConversionException" ) ;
++ }
++
+ }
+
+ } else {
+@@ -81,14 +95,22 @@
+ HANDLE_SINGLE_FIELD( CPPTYPE_DOUBLE, Double );
+ HANDLE_SINGLE_FIELD( CPPTYPE_FLOAT, Float );
+ HANDLE_SINGLE_FIELD( CPPTYPE_BOOL, Bool );
+- HANDLE_SINGLE_FIELD( CPPTYPE_STRING, String );
+ #undef HANDLE_SINGLE_FIELD
+
++ case CPPTYPE_STRING:
++ if (fieldDesc->type() == TYPE_STRING) {
++ return Rcpp::wrap( ref->GetString(*message, fieldDesc) );
++ } else if (fieldDesc->type() == TYPE_BYTES) {
++ std::string s = ref->GetString(*message, fieldDesc);
++ return Rcpp::wrap(std::vector<Rbyte>(s.begin(), s.end()));
++ } else {
++ throwException( "unknown field type with CPP_TYPE STRING", "ConversionException" ) ;
++ }
+ case CPPTYPE_ENUM :
+- return Rcpp::wrap( ref->GetEnum( *message, fieldDesc )->number() ) ;
++ return Rcpp::wrap( ref->GetEnum( *message, fieldDesc )->number() ) ;
+
+- case CPPTYPE_MESSAGE:
+- return S4_Message( CLONE( &ref->GetMessage( *message, fieldDesc ) ) ) ;
++ case CPPTYPE_MESSAGE:
++ return S4_Message( CLONE( &ref->GetMessage( *message, fieldDesc ) ) ) ;
+ break ;
+ }
+ }
+Index: pkg/src/mutators.cpp
+===================================================================
+--- pkg/src/mutators.cpp (revision 392)
++++ pkg/src/mutators.cpp (working copy)
+@@ -152,18 +152,24 @@
+ return "" ; // -Wall, should not happen since we only call this when we know it works
+ }
+
+-/**
+- * calls the R function charToRaw to convert raw into a string
+- *
+- * @param raw raw vector
+- * @return a string (STRSXP)
+- */
+-/* FIXME: maybe we don't need to go back to R for this */
+-SEXP rawToString( SEXP raw){
+- SEXP call = PROTECT( Rf_lang2( Rf_install("charToRaw"), raw ) ) ;
+- SEXP res = PROTECT( Rf_eval( call, R_GlobalEnv ) );
+- UNPROTECT( 2 ) ; /* res, call */
+- return res ;
++std::string GET_bytes( SEXP x, int index ){
++ switch( TYPEOF(x)) {
++ case RAWSXP:
++ if (index == 0) {
++ return(std::string((const char *) RAW(x), (size_t) LENGTH(x)));
++ } else {
++ throwException( "cannot cast SEXP to bytes", "CastException" ) ;
++ }
++ case VECSXP:
++ if (TYPEOF(VECTOR_ELT(x, index)) == RAWSXP) {
++ return(std::string((const char *) RAW(VECTOR_ELT(x, index)), (size_t) LENGTH(VECTOR_ELT(x, index))));
++ } else {
++ throwException( "cannot cast SEXP to bytes", "CastException" ) ;
++ }
++ default:
++ throwException( "cannot cast SEXP to bytes", "CastException" ) ;
++ }
++ return "" ; // -Wall, should not happen since we only call this when we know it works
+ }
+
+ /**
+@@ -189,6 +195,25 @@
+ return _TRUE_ ;
+ }
+
++/**
++ * indicates if this is a list of raws
++ *
++ * @param x a list (VECSXP)
++ * @return TRUE if all objects are instances of RAWSXP
++ */
++Rboolean allAreRaws( SEXP x) {
++
++ if( TYPEOF(x) != VECSXP ) return _FALSE_ ;
++
++ int n = LENGTH(x) ;
++ SEXP current ;
++ for( int i=0; i<n; i++){
++ current = VECTOR_ELT( x, i) ;
++ /* not a RAWSXP */
++ if( TYPEOF(current) != RAWSXP ) return _FALSE_ ;
++ }
++ return _TRUE_ ;
++}
+
+ /**
+ * check that all the values contained in value are suitable for the
+@@ -345,7 +370,9 @@
+ value_size = 1 ; /* we will store the message payload */
+ } else if( TYPEOF(value) == VECSXP && allAreMessages( value ) ){
+ value_size = LENGTH(value) ;
+- } else{
++ } else if( TYPEOF(value) == VECSXP && allAreRaws( value ) ){
++ value_size = LENGTH(value) ;
++ } else {
+ throwException( "cannot convert to string", "ConversionException" ) ;
+ }
+ }
+@@ -744,8 +771,20 @@
+ }
+ case RAWSXP:
+ {
+- ref->SetRepeatedString( message, field_desc, 0, COPYSTRING( CHAR(STRING_ELT(rawToString(value),0 )) ) ) ;
+- }
++ /* in any case, fill the values up to field_size */
++ int i = 0;
++ for ( ; i<field_size; i++) {
++ ref->SetRepeatedString( message, field_desc, i, GET_bytes(value, 0)) ;
++ }
++
++ /* then add some if needed */
++ if( value_size > field_size ){
++ for( ; i<value_size; i++) {
++ ref->AddString( message, field_desc, GET_bytes(value, 0)) ;
++ }
++ }
++ break;
++ }
+ case S4SXP:
+ {
+ /* check if value is a message */
+@@ -759,28 +798,43 @@
+ }
+ case VECSXP:
+ {
+- // we know it is a list of messages because it
++ // we know it is a list of messages or raws because it
+ // has been tested above
+-
+- // FIXME: we should probably use SerializeToString
+- // as indicated in the protobuf api documentation
+- // http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.message_lite.html#MessageLite.SerializeAsString.details
+- GPB::Message* __mess ;
+-
+- /* in any case, fill the values up to field_size */
+- int i = 0;
+- for( ; i<field_size; i++){
+- __mess = GET_MESSAGE_POINTER_FROM_S4( VECTOR_ELT( value, i ) );
+- ref->SetRepeatedString( message, field_desc, i, __mess->SerializeAsString() ) ;
+- }
+-
+- /* then add some if needed */
+- if( value_size > field_size ){
+- for( ; i<value_size; i++){
+- __mess = GET_MESSAGE_POINTER_FROM_S4( VECTOR_ELT( value, i ) );
+- ref->AddString( message, field_desc, __mess->SerializeAsString() ) ;
+- }
+- }
++ if (LENGTH(value) > 0 && TYPEOF(VECTOR_ELT(value, 0)) == RAWSXP ) {
++ /* in any case, fill the values up to field_size */
++ int i = 0;
++ for( ; i<field_size; i++) {
++ ref->SetRepeatedString( message, field_desc, i, GET_bytes(value,i )) ;
++ }
++
++ /* then add some if needed */
++ if( value_size > field_size ) {
++ for( ; i<value_size; i++){
++ ref->AddString( message, field_desc, GET_bytes(value,i )) ;
++ }
++ }
++ } else {
++ // FIXME: we should probably use SerializeToString
++ // as indicated in the protobuf api documentation
++ // http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.message_lite.html#MessageLite.SerializeAsString.details
++ GPB::Message* __mess ;
++
++ /* in any case, fill the values up to field_size */
++ int i = 0;
++ for( ; i<field_size; i++){
++ __mess = GET_MESSAGE_POINTER_FROM_S4( VECTOR_ELT( value, i ) );
++ ref->SetRepeatedString( message, field_desc, i, __mess->SerializeAsString() ) ;
++ }
++
++ /* then add some if needed */
++ if( value_size > field_size ){
++ for( ; i<value_size; i++){
++ __mess = GET_MESSAGE_POINTER_FROM_S4( VECTOR_ELT( value, i ) );
++ ref->AddString( message, field_desc, __mess->SerializeAsString() ) ;
++ }
++ }
++
++ }
+ break ;
+
+ }
+@@ -936,7 +990,7 @@
+ }
+ case RAWSXP:
+ {
+- ref->SetString(message, field_desc, COPYSTRING( CHAR(STRING_ELT( rawToString( value ) ,0 )) ) ) ;
++ ref->SetString(message, field_desc, GET_bytes(value, 0)) ;
+ break ;
+ }
+ case S4SXP:
+Index: pkg/src/rprotobuf.h
+===================================================================
+--- pkg/src/rprotobuf.h (revision 392)
++++ pkg/src/rprotobuf.h (working copy)
+@@ -59,7 +59,7 @@
+
+
+ /* uncomment for debugging */
+-// #define RPB_DEBUG
++#define RPB_DEBUG
+
+ #ifdef RPB_DEBUG
+ #define RPB_DEBUG_BEGIN(__WHAT__) Rprintf( "<" #__WHAT__ ">\n" ) ;
+@@ -138,6 +138,7 @@
+ RcppExport uint64 GET_uint64( SEXP, int ) ;
+ RcppExport bool GET_bool( SEXP, int) ;
+ RcppExport std::string GET_stdstring( SEXP, int ) ;
++RcppExport std::string GET_bytes( SEXP, int ) ;
+ RcppExport void CHECK_values_for_enum( GPB::FieldDescriptor*, SEXP) ;
+ RcppExport void CHECK_messages( GPB::FieldDescriptor*, SEXP) ;
+
+Index: pkg/src/wrapper_Message.cpp
+===================================================================
+--- pkg/src/wrapper_Message.cpp (revision 392)
++++ pkg/src/wrapper_Message.cpp (working copy)
+@@ -840,7 +840,6 @@
+
+ // {{{ string
+ case TYPE_STRING:
+- case TYPE_BYTES:
+ {
+ if( TYPEOF(values) == STRSXP ){
+ for( int i=0 ; i<value_size; i++){
+@@ -852,6 +851,22 @@
+ break ;
+ }
+ // }}}
++
++ // {{{ bytes
++ case TYPE_BYTES:
++ {
++ if( TYPEOF(values) == RAWSXP ){
++ ref->AddString( message, field_desc, GET_bytes(values,0 )) ;
++ } else if( TYPEOF(values) == VECSXP ){
++ for( int i=0 ; i<value_size; i++) {
++ ref->AddString( message, field_desc, GET_bytes(values,i )) ;
++ }
++ } else{
++ throwException( "Cannot convert to bytes", "ConversionException" ) ;
++ }
++ break ;
++ }
++ // }}}
+
+ // {{{ message
+ case TYPE_MESSAGE:
+@@ -983,7 +998,6 @@
+ return res;
+ }
+ case TYPE_STRING:
+- case TYPE_BYTES:
+ {
+ const GPB::Reflection* ref = message->GetReflection() ;
+ Rcpp::CharacterVector res(n) ;
+@@ -992,6 +1006,16 @@
+ }
+ return res ;
+ }
++ case TYPE_BYTES:
++ {
++ const GPB::Reflection* ref = message->GetReflection() ;
++ Rcpp::List res(n) ;
++ for( int i=0; i<n; i++){
++ std::string s = ref->GetRepeatedString( *message, field_desc, index[i] );
++ res[i] = std::vector<Rbyte>(s.begin(), s.end());
++ }
++ return res ;
++ }
+ case TYPE_MESSAGE:
+ case TYPE_GROUP:
+ {
+@@ -1101,7 +1125,6 @@
+ break ;
+ }
+ case TYPE_STRING:
+- case TYPE_BYTES:
+ {
+
+ for( int i=0; i<n; i++){
+@@ -1111,6 +1134,16 @@
+ }
+ break ;
+ }
++ case TYPE_BYTES:
++ {
++
++ for( int i=0; i<n; i++){
++ ref->SetRepeatedString( message, field_desc,
++ index[i],
++ GET_bytes( values, i ) ) ;
++ }
++ break ;
++ }
+ case TYPE_ENUM :
+ {
+ CHECK_values_for_enum( field_desc, values ) ;
More information about the Rprotobuf-commits
mailing list