Releases: r-lib/cpp11
cpp11 0.5.1
-
cpp11 now requires R >=4.0.0, in line with the
tidyverse version policy (#411). -
Because cpp11 now requires R >=4.0.0, a number of previously optional tools
are now always available, allowing us to remove some dead code. In
particular:-
R_UnwindProtect()
is always available, so the definesHAS_UNWIND_PROTECT
andCPP11_UNWIND
are no longer useful. -
ALTREP is always available, so the file
cpp11/altrep.hpp
and the define
HAS_ALTREP
are no longer useful.
We would like to remove the dead code regarding these tools in the future, so
we ask that you please remove usage of them from your own packages (#411). -
-
R_NO_REMAP
andSTRICT_R_HEADERS
are now conditionally defined only if they
have not already been defined elsewhere. This is motivated by the fact that
R_NO_REMAP
is becoming the default for C++ code in R 4.5.0 (#410). -
Fixed a small protection issue flagged by rchk (#408).
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 usepush_back()
.
The removal of these non-API functions means that cpp11 writable vectors that
have been pushed to withpush_back()
will likely force 1 extra allocation
when the conversion fromcpp11::writable::r_vector<T>
toSEXP
occurs
(typically when you return a result back to R). This does not affect the
performance ofpush_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 newR_existsVarInFrame()
function. -
The
SEXP
conversion operator now uses the newR_getVar()
function. Note
that this is stricter thanRf_findVarInFrame3()
in 3 ways. The object
must exist in the environment (i.e.R_UnboundValue
is no longer returned),
the object cannot beR_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 thatx[i] = y[i]
now works when bothx
andy
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
orx.push_back(elt)
is now more performant, at the tradeoff
of slightly less safety (as long aselt
is actually aCHARSXP
andi
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 thatnamed_arg
contains a length 1 object of the correct type, and
throws either acpp11::type_error
orstd::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 equivalentwritable::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
throughprotect.hpp
no longer exists. We don't believe that anyone was using
this. This also means you should no longer see "unused variable" warnings
aboutpreserved
(#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
tobool
,size_t
, anddouble
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 usecpp11::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).
cpp11 0.4.7
- Internal changes requested by CRAN to fix invalid format string tokens
(@paleolimbot, #345).
cpp11 0.4.6
-
R >=3.5.0 is now required to use cpp11. This is in line with (and even goes
beyond) the tidyverse standard of supporting the previous 5 minor releases of
R. It also ensures thatR_UnwindProtect()
is available to avoid C++ memory
leaks (#332). -
cpp11::preserved.release_all()
has been removed. This was intended to
support expert developers on R <3.5.0 when cpp11 used a global protection
list. Since cpp11 no longer uses a global protection list and requires R=3.5.0, it is no longer needed. As far as we can tell, no package was
actively using this (#332). -
cpp11 now creates one protection list per compilation unit, rather than one
global protection list shared across compilation units and across packages.
This greatly reduces the complexity of managing the protection list state and
should make it easier to make changes to the protection list structure in the
future without breaking packages compiled with older versions of cpp11 (#330). -
Nested calls to
cpp11::unwind_protect()
are no longer supported or
encouraged. Previously, this was something that could be done for performance
improvements, but ultimately this feature has proven to cause more problems
than it is worth and is very hard to use safely. For more information, see the
newvignette("FAQ")
section titled "Should I callcpp11::unwind_protect()
manually?" (#327). -
The features and bug fixes from cpp11 0.4.4 have been added back in.
cpp11 0.4.5
- On 2023-07-20, cpp11 was temporarily rolled back to 0.4.3 manually by CRAN due
to a bug in 0.4.4 which we could not immediately fix due to the cpp11
maintainer being on vacation.
cpp11 0.4.4
-
Davis Vaughan is now the maintainer.
-
as_doubles()
andas_integers()
now propagate missing values correctly
(#265, #319). -
Fixed a performance issue related to nested
unwind_protect()
calls (#298). -
Minor performance improvements to the cpp11 protect code. (@kevinushey)
-
Silenced an unknown attribute warning specific to the Intel compiler
(r-lib/systemfonts#98). -
cpp_register()
gains an argumentextension=
governing the file extension of
thesrc/cpp11
file. By default it's.cpp
, but.cc
is now supported
as well (#292, @MichaelChirico)
cpp11 0.4.3
-
Modernized the GitHub Actions workflows and updated some internal tests to
better align with changes in those workflows and the latest version of R
(#279). -
cpp_source()
errors on non-existent file (#261). -
cpp_register()
is quiet by default when R is non interactive (#289). -
updated test to adapt to changes in R 4.2.1 (#290).
cpp11 0.4.2
- Romain François is now the maintainer.
cpp11 0.4.1
- Fix crash related to unwind protect optimization (#244)
cpp11 0.4.0
New Features
- New opt-in message formatting with the {fmt} C++ library for
cpp11::messages()
cpp11::stop()
andcpp11::warning()
.
Set theCPP11_USE_FMT
macro to use this feature in your package. (@sbearrows, #169, #208) - New
as_double()
andas_integer()
methods to coerce integers to doubles and doubles to integers to doubles (@sbearrows, #46) cpp11::matrix
iterators can now be used either row-wise or column-wise (the default) depending on the user's choice (@alyst, #229)
Improvements and fixes
- Read-only matrix accessors are now marked const (#234)
writable::r_vector
default constructors now return a 0 length vector when converted toSEXP
(#166)- Read-only
r_vector
constructors now disallow implicit construction with named arguments (#237) - Read-only
r_vector.attr()
methods now return const objects, so it is a compile time error to try to assign to them (#237) - Fixed
+
and+=
operators ofr_vector::[const_]iterator
to conform the iterators concept:
+=
updates the iterator, and+
returns the updated copy, while keeping the original unchanged (@alyst, #231) - Remove undefined behavior when constructing global
cpp11::sexp
s (#224) - Removed redundant
.Call calls
in cpp11.cpp file (@sbearrows, #170) - Error messages now output original file name rather than the temporary file name (@sbearrows, #194)
cpp_register()
now includesattribute_visible
in the init function, so packages compiled withC_VISIBILITY
will find the init function.- Fixed bug when running
cpp_source()
on the same file more than once (@sbearrows, #202) - Allow cpp11 decorators of the form
cpp11::linking_to
(@sbearrows, #193) - Removed internal instances of
cpp11::stop()
and replaced with C++ exceptions (@sbearrows, #203) - Names of named lists are now resized along with the list elements (@sbearrows, #206)