From ad799afeb1cf3b79f32b33efbe16c8b504eaa4fb Mon Sep 17 00:00:00 2001 From: Lev Kandel Date: Thu, 30 Jan 2025 22:01:26 +0000 Subject: [PATCH 1/4] std::string_view support in Rcpp::wrap() --- inst/include/Rcpp/internal/wrap.h | 6 ++++++ inst/include/Rcpp/traits/r_type_traits.h | 3 +++ inst/include/Rcpp/traits/wrap_type_traits.h | 3 +++ inst/include/RcppCommon.h | 3 +++ 4 files changed, 15 insertions(+) diff --git a/inst/include/Rcpp/internal/wrap.h b/inst/include/Rcpp/internal/wrap.h index 0c3b10fda..50faa1d86 100644 --- a/inst/include/Rcpp/internal/wrap.h +++ b/inst/include/Rcpp/internal/wrap.h @@ -66,6 +66,12 @@ namespace Rcpp { return make_charsexp__impl__cstring(st.c_str()); } +#if __cplusplus >= 201703L + inline SEXP make_charsexp__impl__cstring(std::string_view st) { + return Rf_mkCharLen(st.data(), st.size()); + } +#endif + template inline SEXP make_charsexp__impl(const T& s, Rcpp::traits::true_type) { return make_charsexp__impl__wstring(s); diff --git a/inst/include/Rcpp/traits/r_type_traits.h b/inst/include/Rcpp/traits/r_type_traits.h index 2fbe195c0..17f57340f 100644 --- a/inst/include/Rcpp/traits/r_type_traits.h +++ b/inst/include/Rcpp/traits/r_type_traits.h @@ -141,6 +141,9 @@ template<> struct r_type_traits{ typedef r_type_primitive_tag r_catego template<> struct r_type_traits{ typedef r_type_primitive_tag r_category ; } ; template<> struct r_type_traits{ typedef r_type_string_tag r_category ; } ; template<> struct r_type_traits{ typedef r_type_string_tag r_category ; } ; +#if __cplusplus >= 201703L +template<> struct r_type_traits{ typedef r_type_string_tag r_category ; } ; +#endif template<> struct r_type_traits{ typedef r_type_string_tag r_category ; } ; template<> struct r_type_traits{ typedef r_type_string_tag r_category ; } ; diff --git a/inst/include/Rcpp/traits/wrap_type_traits.h b/inst/include/Rcpp/traits/wrap_type_traits.h index 5f0b6e512..c170c8b86 100644 --- a/inst/include/Rcpp/traits/wrap_type_traits.h +++ b/inst/include/Rcpp/traits/wrap_type_traits.h @@ -82,6 +82,9 @@ template <> struct wrap_type_traits { typedef wrap_type_primitive_ template <> struct wrap_type_traits { typedef wrap_type_primitive_tag wrap_category; } ; template <> struct wrap_type_traits { typedef wrap_type_primitive_tag wrap_category; } ; template <> struct wrap_type_traits { typedef wrap_type_primitive_tag wrap_category; } ; +#if __cplusplus >= 201703L +template <> struct wrap_type_traits { typedef wrap_type_primitive_tag wrap_category; } ; +#endif template <> struct wrap_type_traits { typedef wrap_type_primitive_tag wrap_category; } ; template <> struct wrap_type_traits { typedef wrap_type_primitive_tag wrap_category; } ; template <> struct wrap_type_traits { typedef wrap_type_primitive_tag wrap_category; } ; diff --git a/inst/include/RcppCommon.h b/inst/include/RcppCommon.h index 5cbe895b5..8f28fd035 100644 --- a/inst/include/RcppCommon.h +++ b/inst/include/RcppCommon.h @@ -54,6 +54,9 @@ namespace Rcpp { #include #include #include +#if __cplusplus >= 201703L +#include +#endif #include #include #include From d1d4b8dfd5e74e4230cb6581305421ba00e9b20c Mon Sep 17 00:00:00 2001 From: Lev Kandel Date: Sat, 1 Feb 2025 02:21:25 +0000 Subject: [PATCH 2/4] Unit test for Rcpp::wrap(std::string_view) --- inst/tinytest/cpp/wrap.cpp | 7 +++++++ inst/tinytest/test_wrap.R | 3 +++ 2 files changed, 10 insertions(+) diff --git a/inst/tinytest/cpp/wrap.cpp b/inst/tinytest/cpp/wrap.cpp index 1f42f62d5..9da6e6251 100644 --- a/inst/tinytest/cpp/wrap.cpp +++ b/inst/tinytest/cpp/wrap.cpp @@ -304,3 +304,10 @@ SEXP vector_Foo(){ vec[1] = Foo( 3 ) ; return wrap(vec) ; } + +// [[Rcpp::plugins(cpp17)]] +// [[Rcpp::export]] +SEXP test_wrap_string_view(){ + std::string_view sv = "test string value"; + return wrap(sv); +} diff --git a/inst/tinytest/test_wrap.R b/inst/tinytest/test_wrap.R index cf185222f..b55cb07fc 100644 --- a/inst/tinytest/test_wrap.R +++ b/inst/tinytest/test_wrap.R @@ -132,3 +132,6 @@ expect_equal(sapply( vector_Foo(), function(.) .$get() ), c(2, 3), # test.wrap.custom.class <- function() { expect_equal(test_wrap_custom_class(), 42) + +# test.wrap.custom.string_view <- function() { +expect_equal(test_wrap_string_view(), "test string value") From 9fc7ec6da0232e1a9391d4c1dcca65f45e90e796 Mon Sep 17 00:00:00 2001 From: Lev Kandel Date: Sat, 1 Feb 2025 02:42:58 +0000 Subject: [PATCH 3/4] Update ChangeLog --- ChangeLog | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/ChangeLog b/ChangeLog index cf8ffe142..ebfa8cbfe 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2025-01-31 Lev Kandel + + * inst/include/Rcpp/internal/wrap.h: Add support for std::string_view + * inst/include/Rcpp/traits/r_type_traits.h: Idem + * inst/include/Rcpp/traits/wrap_type_traits.h: Idem + * inst/include/RcppCommon.h: Include + * inst/tinytest/cpp/wrap.cpp: Add unit test for wrap(std::string_view) + * inst/tinytest/test_wrap.R: Idem + 2025-01-26 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll micro version and date From 3516ee7420ba8eafc56764ceb8680c00c2a7bd88 Mon Sep 17 00:00:00 2001 From: Lev Kandel Date: Sat, 1 Feb 2025 14:54:25 +0000 Subject: [PATCH 4/4] Fix test name and formatting --- inst/tinytest/cpp/wrap.cpp | 4 ++-- inst/tinytest/test_wrap.R | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/inst/tinytest/cpp/wrap.cpp b/inst/tinytest/cpp/wrap.cpp index 9da6e6251..f36029649 100644 --- a/inst/tinytest/cpp/wrap.cpp +++ b/inst/tinytest/cpp/wrap.cpp @@ -308,6 +308,6 @@ SEXP vector_Foo(){ // [[Rcpp::plugins(cpp17)]] // [[Rcpp::export]] SEXP test_wrap_string_view(){ - std::string_view sv = "test string value"; - return wrap(sv); + std::string_view sv = "test string value" ; + return wrap(sv) ; } diff --git a/inst/tinytest/test_wrap.R b/inst/tinytest/test_wrap.R index b55cb07fc..d0c0498c2 100644 --- a/inst/tinytest/test_wrap.R +++ b/inst/tinytest/test_wrap.R @@ -133,5 +133,5 @@ expect_equal(sapply( vector_Foo(), function(.) .$get() ), c(2, 3), # test.wrap.custom.class <- function() { expect_equal(test_wrap_custom_class(), 42) -# test.wrap.custom.string_view <- function() { +# test.wrap.string_view <- function() { expect_equal(test_wrap_string_view(), "test string value")