Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
(lang/R-cpp11) Updated 0.4.7 to 0.5.0
# cpp11 0.5.0 ## R non-API related changes * Removed usage of the following R non-API functions: * `SETLENGTH()` * `SET_TRUELENGTH()` * `SET_GROWABLE_BIT()` These functions were used as part of the efficient growable vectors that cpp11 offered, i.e. what happens under the hood when you use `push_back()`. The removal of these non-API functions means that cpp11 writable vectors that have been pushed to with `push_back()` will likely force 1 extra allocation when the conversion from `cpp11::writable::r_vector<T>` to `SEXP` occurs (typically when you return a result back to R). This does not affect the performance of `push_back()` itself, and in general these growable vectors are still quite efficient (#362). * The `environment` class no longer uses the non-API function `Rf_findVarInFrame3()` (#367). * The `exists()` method now uses the new `R_existsVarInFrame()` function. * The `SEXP` conversion operator now uses the new `R_getVar()` function. Note that this is stricter than `Rf_findVarInFrame3()` in 3 ways. The object must exist in the environment (i.e. `R_UnboundValue` is no longer returned), the object cannot be `R_MissingArg`, and if the object was a promise, that promise is now evaluated. We have backported this new strictness to older versions of R as well. ## New features * `cpp11::writable::r_vector<T>::proxy` now implements copy assignment. Practically this means that `x[i] = y[i]` now works when both `x` and `y` are writable vectors (#300, #339). * New `writable::data_frame` constructor that also takes the number of rows as input. This accounts for the edge case where the input list has 0 columns but you'd still like to specify a known number of rows (#272). * `std::max_element()` can now be used with writable vectors (#334). * Read only `r_vector`s now have a move constructor and move assignment operator (#365). ## Improvements and fixes * Repeated assignment to a `cpp11::writable::strings` vector through either `x[i] = elt` or `x.push_back(elt)` is now more performant, at the tradeoff of slightly less safety (as long as `elt` is actually a `CHARSXP` and `i` is within bounds, there is no chance of failure, which are the same kind of invariants placed on the other vector types) (#378). * Constructors for writable vectors from `initializer_list<named_arg>` now check that `named_arg` contains a length 1 object of the correct type, and throws either a `cpp11::type_error` or `std::length_error` if that is not the case (#382). * `cpp11::package` now errors if given a package name that hasn't been loaded yet. Previously it would cause R to hang indefinitely (#317). * `cpp11::function` now protects its underlying function, for maximum safety (#294). * `cpp11::writable::r_vector<T>::iterator` no longer implicitly deletes its copy assignment operator (#360). * Added the missing implementation for `x.at("name")` for read only vectors (#370). * Fixed an issue with the `writable::matrix` copy constructor where the underlying SEXP should have been copied but was not. It is now consistent with the behavior of the equivalent `writable::r_vector` copy constructor. * Fixed a memory leak with the `cpp11::writable::r_vector` move assignment operator (#338). * Fixed an issue where writable vectors were being protected twice (#365). * The approach for the protection list managed by cpp11 has been tweaked slightly. In 0.4.6, we changed to an approach that creates one protection list per compilation unit, but we now believe we've found an approach that is guaranteed by the C++ standard to create one protection list per package, which makes slightly more sense and still has all the benefits of the reduced maintanence burden mentioned in the 0.4.6 news bullet (#364). A side effect of this new approach is that the `preserved` object exposed through `protect.hpp` no longer exists. We don't believe that anyone was using this. This also means you should no longer see "unused variable" warnings about `preserved` (#249). ## Breaking changes * R >=3.6.0 is now required. This is in line with (and even goes beyond) the tidyverse standard of supporting the previous 5 minor releases of R. * Implicit conversion from `sexp` to `bool`, `size_t`, and `double` has been marked as deprecated and will be removed in the next version of cpp11. The 3 packages that were using this have been notified and sent PRs. The recommended approach is to instead use `cpp11::as_cpp<T>`, which performs type and length checking, making it much safer to use. * Dropped support for gcc 4.8, mainly an issue for extremely old CentOS 7 systems which used that as their default compiler. As of June 2024, CentOS 7 is past its vendor end of support date and therefore also out of scope for Posit at this time (#359).
- Loading branch information