From e7151abdc1750b63015ddddc7c316303bf54024e Mon Sep 17 00:00:00 2001 From: Jim Hester Date: Mon, 28 Jun 2021 10:48:30 -0400 Subject: [PATCH] Workaround issue constructing logical vectors of length 1 from 'false' Fixes #187 --- cpp11test/src/test-logicals.cpp | 10 ++++++++++ cpp11test/src/test-strings.cpp | 13 +++++++++++++ inst/include/cpp11/logicals.hpp | 1 + inst/include/cpp11/r_vector.hpp | 6 ++---- inst/include/cpp11/strings.hpp | 8 -------- 5 files changed, 26 insertions(+), 12 deletions(-) diff --git a/cpp11test/src/test-logicals.cpp b/cpp11test/src/test-logicals.cpp index f1c874ef..22d4e14c 100644 --- a/cpp11test/src/test-logicals.cpp +++ b/cpp11test/src/test-logicals.cpp @@ -134,6 +134,16 @@ context("logicals-C++") { expect_true(cpp11::is_na(y)); } + test_that("FALSE and false") { + cpp11::writable::logicals x{FALSE}; + expect_true(x.size() == 1); + expect_true(x[0] == FALSE); + + cpp11::writable::logicals y{false}; + expect_true(y.size() == 1); + expect_true(y[0] == FALSE); + } + // test_that("writable::logicals(ALTREP_SEXP)") { // SEXP x = PROTECT(R_compact_intrange(1, 5)); //// Need to find (or create) an altrep class that implements duplicate. diff --git a/cpp11test/src/test-strings.cpp b/cpp11test/src/test-strings.cpp index 0002b01b..9eac1114 100644 --- a/cpp11test/src/test-strings.cpp +++ b/cpp11test/src/test-strings.cpp @@ -132,6 +132,19 @@ context("strings-C++") { UNPROTECT(1); } + test_that("std::initializer_list") { + cpp11::writable::strings x{"foo"}; + expect_true(x.size() == 1); + expect_true(x[0] == "foo"); + } + + test_that("std::initializer_list") { + std::string str("foo"); + cpp11::writable::strings x{str}; + expect_true(x.size() == 1); + expect_true(x[0] == "foo"); + } + test_that("NA_STRING constructor") { cpp11::writable::strings x({NA_STRING}); diff --git a/inst/include/cpp11/logicals.hpp b/inst/include/cpp11/logicals.hpp index 44c11a7f..4797fdf5 100644 --- a/inst/include/cpp11/logicals.hpp +++ b/inst/include/cpp11/logicals.hpp @@ -138,4 +138,5 @@ inline void r_vector::push_back(r_bool value) { typedef r_vector logicals; } // namespace writable + } // namespace cpp11 diff --git a/inst/include/cpp11/r_vector.hpp b/inst/include/cpp11/r_vector.hpp index 430cf25c..4b8b8a29 100644 --- a/inst/include/cpp11/r_vector.hpp +++ b/inst/include/cpp11/r_vector.hpp @@ -285,8 +285,6 @@ class r_vector : public cpp11::r_vector { r_vector(SEXP&& data, bool is_altrep); r_vector(std::initializer_list il); r_vector(std::initializer_list il); - r_vector(std::initializer_list il); - r_vector(std::initializer_list il); template r_vector(Iter first, Iter last); @@ -294,7 +292,7 @@ class r_vector : public cpp11::r_vector { template > r_vector(const V& obj); - r_vector(const R_xlen_t size); + explicit r_vector(const R_xlen_t size); ~r_vector(); @@ -688,7 +686,7 @@ inline r_vector::r_vector(const V& obj) : r_vector() { } template -inline r_vector::r_vector(R_xlen_t size) : r_vector() { +inline r_vector::r_vector(const R_xlen_t size) : r_vector() { resize(size); } diff --git a/inst/include/cpp11/strings.hpp b/inst/include/cpp11/strings.hpp index bf5b1b27..6550950a 100644 --- a/inst/include/cpp11/strings.hpp +++ b/inst/include/cpp11/strings.hpp @@ -112,14 +112,6 @@ template <> inline r_vector::r_vector(std::initializer_list il) : cpp11::r_vector(as_sexp(il)), capacity_(il.size()) {} -template <> -inline r_vector::r_vector(std::initializer_list il) - : cpp11::r_vector(as_sexp(il)), capacity_(il.size()) {} - -template <> -inline r_vector::r_vector(std::initializer_list il) - : cpp11::r_vector(as_sexp(il)), capacity_(il.size()) {} - template <> inline r_vector::r_vector(std::initializer_list il) : cpp11::r_vector(safe[Rf_allocVector](STRSXP, il.size())),