Refcnt is a small shared library supplying intrusive reference counting.
- base class
ref::Refcounted
. Application classes opt-in to reference counting by inheriting this class. - common base simplifies connecting to common-base-object applications such as python, java etc.
Installs a few cmake ingredients, along with a build assistant for XO projects such as this one.
$ xo-build --clone --configure --build --install xo-indentlog
$ xo-build --clone xo-refcnt
or equivalently
$ git clone git@github.com:Rconybea/refcnt.git xo-refcnt
$ xo-build --configure --build --install xo-refcnt
or equivalently:
$ mkdir xo-refcnt/.build
$ cmake -DCMAKE_INSTALL_PREFIX=${PREFIX} -S xo-refcnt -B xo-refcnt/.build
$ cmake --build xo-refcnt/.build
$ cmake --install xo-refcnt/.build
CMAKE_PREFIX_PATH
should point to the prefix where xo-indentlog
is installed
alternatively, if you're a nix user:
$ git clone git@github.com:rconybea/xo-nix.git
$ ls -d xo-nix
xo-nix
$ cd xo-nix
$ nix-build -A xo-refcnt
$ cmake -DCMAKE_BUILD_TYPE=coverage -DCMAKE_PREFIX_PATH=${PREFIX} -S xo-refcnt -B xo-refcnt/.build-ccov
$ cmake --build xo-refcnt/.build-ccov
$ cd xo-refcnt
$ ln -s build/compile_commands.json # lsp will look for compile_commands.json in the root of the source tree
#include "xo/refcnt/Refcounted.hpp"
using xo::ref::Refcounted;
struct MyObject : public Refcounted {
static rp<MyObject> make() { return new MyObject(); }
private:
// intrusively-reference-counted objects should only be heap-allocated
MyObject() { ... }
};
int main() {
// create reference-counted instance
auto x = MyObject::make();
auto y = x;
// x,y refer to the same instance.
x = nullptr;
// y holds last reference
y = nullptr;
// MyObject has been deleted
}
To log reference-counting activity
xo::ref::intrusive_ptr_set_debug(true);