/** @file RCollector.hpp * * @author Roland Conybeare, Dec 2025 **/ #include "ACollector.hpp" #include namespace xo { namespace mm { /** @class RCollector **/ template struct RCollector : public Object { private: using O = Object; public: using ObjectType = Object; using DataPtr = Object::DataPtr; using size_type = std::size_t; using typeseq = ACollector::typeseq; //using value_type = std::byte *; RCollector() = default; RCollector(DataPtr data) : Object{std::move(data)} {} RCollector(const ACollector * iface, void * data) requires std::is_same_v : Object(iface, data) {} /** forward op in place. Defined in GCObject.hpp to avoid #include cycle **/ template void forward_inplace(obj * p_obj); /** another convenience template for forwarding. * Defined in RGCObject.hpp to avoid #include cycle. **/ template void forward_inplace(DRepr ** pp_repr); /** convenience template where pointer requires pivot **/ template requires (!std::is_same_v) void forward_pivot_inplace(obj * p_obj); int32_t _typeseq() const noexcept { return O::iface()->_typeseq(); } size_type allocated(generation g, role r) const noexcept { return O::iface()->allocated(O::data(), g, r); } size_type reserved(generation g, role r) const noexcept { return O::iface()->reserved(O::data(), g, r); } size_type committed(generation g, role r) const noexcept { return O::iface()->committed(O::data(), g, r); } bool is_type_installed(typeseq tseq) const noexcept { return O::iface()->is_type_installed(O::data(), tseq); } bool install_type(const AGCObject & iface) { return O::iface()->install_type(O::data(), iface); } void add_gc_root_poly(obj * p_root) { O::iface()->add_gc_root_poly(O::data(), p_root); } void remove_gc_root_poly(obj * p_root) { O::iface()->remove_gc_root_poly(O::data(), p_root); } void request_gc(generation g) { O::iface()->request_gc(O::data(), g); } void forward_inplace(AGCObject * lhs_iface, void ** lhs_data) { O::iface()->forward_inplace(O::data(), lhs_iface, lhs_data); } /** add root @p p_root **/ template void add_gc_root(obj * p_root) { O::iface()->add_gc_root_poly(O::data(), (obj *)p_root); } /** remove root @p p_root **/ template void remove_gc_root(obj * p_root) { O::iface()->remove_gc_root_poly(O::data(), (obj *)p_root); } static bool _valid; }; template bool RCollector::_valid = facet::valid_object_router(); } /*namespace mm*/ namespace facet { template struct RoutingFor { using RoutingType = xo::mm::RCollector; }; } } /*namespace xo*/ /* end RCollector.hpp */