# intrusive reference counting Refcnt is a small shared library supplying intrusive reference counting. ## Features - 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. ## Getting Started ### build + install `xo-cmake` dependency (cmake macros) see [github/Rconybea/xo-cmake](https://github.com/Rconybea/xo-cmake) Installs a few cmake ingredients, along with a build assistant for XO projects such as this one. ### build + install XO deps ``` $ xo-build --clone --configure --build --install xo-indentlog ``` ### copy `refcnt` repository locally ``` $ xo-build --clone xo-refcnt ``` or equivalently ``` $ git clone git@github.com:Rconybea/refcnt.git xo-refcnt ``` ### build + install ``` $ 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 ``` ### build for unit test coverage ``` $ cmake -DCMAKE_BUILD_TYPE=coverage -DCMAKE_PREFIX_PATH=${PREFIX} -S xo-refcnt -B xo-refcnt/.build-ccov $ cmake --build xo-refcnt/.build-ccov ``` ### LSP support ``` $ cd xo-refcnt $ ln -s build/compile_commands.json # lsp will look for compile_commands.json in the root of the source tree ``` ## Examples ### 1 ``` #include "xo/refcnt/Refcounted.hpp" using xo::ref::Refcounted; struct MyObject : public Refcounted { static rp 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 } ``` ### 2 To log reference-counting activity ``` xo::ref::intrusive_ptr_set_debug(true); ```