diff --git a/.Rbuildignore b/.Rbuildignore index 383b0ee..8040b3c 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -12,3 +12,4 @@ ^vignettes/future_promise/.*\.key$ ^vignettes/future_promise/.*\.R$ ^CRAN-RELEASE$ +^\.vscode$ diff --git a/.gitignore b/.gitignore index 3d3d3c6..9dd7437 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ inst/doc doc Meta docs +.vscode diff --git a/DESCRIPTION b/DESCRIPTION index 1fc352c..3190462 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,9 +1,11 @@ Type: Package Package: promises Title: Abstractions for Promise-Based Asynchronous Programming -Version: 1.2.1.9001 +Version: 1.2.1.9002 Authors@R: c( person("Joe", "Cheng", , "joe@posit.co", role = c("aut", "cre")), + person("Mauricio", "Vargas Sepulveda", role = "ctb", + comment = c(ORCID = "0000-0003-1017-7574")), person("Posit Software, PBC", role = c("cph", "fnd")) ) Description: Provides fundamental abstractions for doing asynchronous @@ -17,11 +19,11 @@ URL: https://rstudio.github.io/promises/, https://github.com/rstudio/promises BugReports: https://github.com/rstudio/promises/issues Imports: + cpp11, fastmap (>= 1.1.0), later, magrittr (>= 1.5), R6, - Rcpp, rlang, stats Suggests: @@ -33,12 +35,12 @@ Suggests: testthat, vembedr LinkingTo: - later, - Rcpp + cpp11, + later VignetteBuilder: knitr Config/Needs/website: rsconnect Encoding: UTF-8 Language: en-US Roxygen: list(markdown = TRUE) -RoxygenNote: 7.3.1 +RoxygenNote: 7.3.2 diff --git a/NAMESPACE b/NAMESPACE index d262bcd..d21f2ec 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -33,7 +33,7 @@ export(then) export(with_promise_domain) import(R6) import(later) -importFrom(Rcpp,evalCpp) +importFrom(cpp11,cpp_eval) importFrom(magrittr,"%>%") importFrom(magrittr,"%T>%") -useDynLib(promises) +useDynLib(promises, .registration = TRUE) diff --git a/NEWS.md b/NEWS.md index 6b6aaca..ec5ac38 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,7 +1,7 @@ # promises (development version) * `is.promising` is now an S3 method. (#104) - +* Refactored to use the "cpp11" package for C++ code instead of "Rcpp". (@pachadotdev, #109) # promises 1.2.1 diff --git a/R/RcppExports.R b/R/RcppExports.R deleted file mode 100644 index 9ec0601..0000000 --- a/R/RcppExports.R +++ /dev/null @@ -1,7 +0,0 @@ -# Generated by using Rcpp::compileAttributes() -> do not edit by hand -# Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 - -asyncFib <- function(resolve, reject, x) { - invisible(.Call('_promises_asyncFib', PACKAGE = 'promises', resolve, reject, x)) -} - diff --git a/R/cpp11.R b/R/cpp11.R new file mode 100644 index 0000000..8e91254 --- /dev/null +++ b/R/cpp11.R @@ -0,0 +1,5 @@ +# Generated by cpp11: do not edit by hand + +asyncFib <- function(resolve, reject, x) { + invisible(.Call(`_promises_asyncFib`, resolve, reject, x)) +} diff --git a/R/promise.R b/R/promise.R index 7f2a452..3335793 100644 --- a/R/promise.R +++ b/R/promise.R @@ -1,5 +1,4 @@ -#' @useDynLib promises -#' @importFrom Rcpp evalCpp +#' @importFrom cpp11 cpp_eval #' @import later NULL diff --git a/R/promises-package.R b/R/promises-package.R index aa68764..adae393 100644 --- a/R/promises-package.R +++ b/R/promises-package.R @@ -1,10 +1,6 @@ -#' @keywords internal +#' @useDynLib promises, .registration = TRUE "_PACKAGE" -## usethis namespace: start -## usethis namespace: end -NULL - ignore_unused_imports <- function() { fastmap::fastqueue } diff --git a/inst/WORDLIST b/inst/WORDLIST index aec40da..63c2018 100644 --- a/inst/WORDLIST +++ b/inst/WORDLIST @@ -10,17 +10,20 @@ Lopp Multisession NSE OpenCPU +ORCID PBC RServe RStudio Shiny's ShinyApps +Sepulveda UI anonymized async backoff cloneable conf +cpp cranwhales deserialization deserialized @@ -58,6 +61,7 @@ reactives renderers rstudio runtime’s +Rcpp scalability scalable shinydashboard diff --git a/man/promises-package.Rd b/man/promises-package.Rd index 94ba3a4..649e785 100644 --- a/man/promises-package.Rd +++ b/man/promises-package.Rd @@ -22,8 +22,8 @@ Useful links: Other contributors: \itemize{ + \item Mauricio Vargas Sepulveda (\href{https://orcid.org/0000-0003-1017-7574}{ORCID}) [contributor] \item Posit Software, PBC [copyright holder, funder] } } -\keyword{internal} diff --git a/src/.gitignore b/src/.gitignore new file mode 100644 index 0000000..22034c4 --- /dev/null +++ b/src/.gitignore @@ -0,0 +1,3 @@ +*.o +*.so +*.dll diff --git a/src/RcppExports.cpp b/src/RcppExports.cpp deleted file mode 100644 index cb7c374..0000000 --- a/src/RcppExports.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// Generated by using Rcpp::compileAttributes() -> do not edit by hand -// Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 - -#include - -using namespace Rcpp; - -#ifdef RCPP_USE_GLOBAL_ROSTREAM -Rcpp::Rostream& Rcpp::Rcout = Rcpp::Rcpp_cout_get(); -Rcpp::Rostream& Rcpp::Rcerr = Rcpp::Rcpp_cerr_get(); -#endif - -// asyncFib -void asyncFib(Rcpp::Function resolve, Rcpp::Function reject, double x); -RcppExport SEXP _promises_asyncFib(SEXP resolveSEXP, SEXP rejectSEXP, SEXP xSEXP) { -BEGIN_RCPP - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< Rcpp::Function >::type resolve(resolveSEXP); - Rcpp::traits::input_parameter< Rcpp::Function >::type reject(rejectSEXP); - Rcpp::traits::input_parameter< double >::type x(xSEXP); - asyncFib(resolve, reject, x); - return R_NilValue; -END_RCPP -} - -static const R_CallMethodDef CallEntries[] = { - {"_promises_asyncFib", (DL_FUNC) &_promises_asyncFib, 3}, - {NULL, NULL, 0} -}; - -RcppExport void R_init_promises(DllInfo *dll) { - R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); - R_useDynamicSymbols(dll, FALSE); -} diff --git a/src/cpp11.cpp b/src/cpp11.cpp new file mode 100644 index 0000000..84928bb --- /dev/null +++ b/src/cpp11.cpp @@ -0,0 +1,28 @@ +// Generated by cpp11: do not edit by hand +// clang-format off + + +#include "cpp11/declarations.hpp" +#include + +// promise_task.cpp +void asyncFib(cpp11::function resolve, cpp11::function reject, double x); +extern "C" SEXP _promises_asyncFib(SEXP resolve, SEXP reject, SEXP x) { + BEGIN_CPP11 + asyncFib(cpp11::as_cpp>(resolve), cpp11::as_cpp>(reject), cpp11::as_cpp>(x)); + return R_NilValue; + END_CPP11 +} + +extern "C" { +static const R_CallMethodDef CallEntries[] = { + {"_promises_asyncFib", (DL_FUNC) &_promises_asyncFib, 3}, + {NULL, NULL, 0} +}; +} + +extern "C" attribute_visible void R_init_promises(DllInfo* dll){ + R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); + R_useDynamicSymbols(dll, FALSE); + R_forceSymbols(dll, TRUE); +} diff --git a/src/promise_task.cpp b/src/promise_task.cpp index 9356dce..952ff77 100644 --- a/src/promise_task.cpp +++ b/src/promise_task.cpp @@ -1,55 +1,53 @@ -#include #include +#include + class PromiseTask : public later::BackgroundTask { -public: - PromiseTask(Rcpp::Function resolve, Rcpp::Function reject) : - resolve(resolve), reject(reject) { - } + public: + PromiseTask(cpp11::function resolve, cpp11::function reject) + : resolve(resolve), reject(reject) {} -protected: + protected: virtual void execute() = 0; - virtual Rcpp::RObject get_result() = 0; + virtual cpp11::sexp get_result() = 0; void complete() { - Rcpp::RObject result = get_result(); + cpp11::sexp result = get_result(); resolve(result); } -private: - Rcpp::Function resolve; - Rcpp::Function reject; + + private: + cpp11::function resolve; + cpp11::function reject; }; long fib(long x) { if (x <= 2) { return 1; } - return fib(x-1) + fib(x-2); + return fib(x - 1) + fib(x - 2); } class FibonacciTask : public PromiseTask { -public: - FibonacciTask(Rcpp::Function resolve, Rcpp::Function reject, double x) : - PromiseTask(resolve, reject), x(x) { - } + public: + FibonacciTask(cpp11::function resolve, cpp11::function reject, double x) + : PromiseTask(resolve, reject), x(x) {} - void execute() { - result = fib((long)x); - } + void execute() { result = fib((long)x); } - Rcpp::RObject get_result() { - Rcpp::NumericVector res(1); + cpp11::sexp get_result() { + cpp11::writable::doubles res(1); res[0] = (double)result; return res; } -private: + private: double x; long result; }; -// [[Rcpp::export]] -void asyncFib(Rcpp::Function resolve, Rcpp::Function reject, double x) { +[[cpp11::register]] void asyncFib(cpp11::function resolve, + cpp11::function reject, double x) { FibonacciTask* fib = new FibonacciTask(resolve, reject, x); fib->begin(); } @@ -57,10 +55,9 @@ void asyncFib(Rcpp::Function resolve, Rcpp::Function reject, double x) { /*** R library(promises) library(later) -library(Rcpp) +library(cpp11) promise(function(resolve, reject) { - promise:::asyncFib(resolve, reject, 45) + cpp11::package("your_package_name")$asyncFib(resolve, reject, 45) }) %...>% print() - - */ +*/