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 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 diff --git a/inst/tinytest/cpp/wrap.cpp b/inst/tinytest/cpp/wrap.cpp index 1f42f62d5..f36029649 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..d0c0498c2 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.string_view <- function() { +expect_equal(test_wrap_string_view(), "test string value")