From ec1b6173d9dfc1d78e1737d37d12c36dbf8e57cb Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Thu, 26 Mar 2026 14:58:14 -0400 Subject: [PATCH] xo-gc stack: + contains() method --- include/xo/alloc2/gc/ACollector.hpp | 6 ++++++ include/xo/alloc2/gc/ICollector_Any.hpp | 1 + include/xo/alloc2/gc/ICollector_Xfer.hpp | 3 +++ include/xo/alloc2/gc/RCollector.hpp | 1 + 4 files changed, 11 insertions(+) diff --git a/include/xo/alloc2/gc/ACollector.hpp b/include/xo/alloc2/gc/ACollector.hpp index 63004b7..6793f49 100644 --- a/include/xo/alloc2/gc/ACollector.hpp +++ b/include/xo/alloc2/gc/ACollector.hpp @@ -43,6 +43,12 @@ namespace xo { Generation g, role r) const noexcept = 0; virtual size_type committed(Copaque d, Generation g, role r) const noexcept = 0; + + /** true if gc responsible for address @p addr with role @p r + **/ + virtual bool contains(Copaque d, + role r, const void * addr) const noexcept = 0; + virtual bool is_type_installed(Copaque d, typeseq tseq) const noexcept = 0; diff --git a/include/xo/alloc2/gc/ICollector_Any.hpp b/include/xo/alloc2/gc/ICollector_Any.hpp index 049978a..ecc8cfc 100644 --- a/include/xo/alloc2/gc/ICollector_Any.hpp +++ b/include/xo/alloc2/gc/ICollector_Any.hpp @@ -34,6 +34,7 @@ namespace xo { [[noreturn]] size_type allocated(Copaque, Generation, role) const noexcept override { _fatal(); } [[noreturn]] size_type reserved(Copaque, Generation, role) const noexcept override { _fatal(); } [[noreturn]] size_type committed(Copaque, Generation, role) const noexcept override { _fatal(); } + [[noreturn]] bool contains(Copaque, role, const void *) const noexcept override { _fatal(); } [[noreturn]] bool is_type_installed(Copaque, typeseq) const noexcept override { _fatal(); } // non-const methods diff --git a/include/xo/alloc2/gc/ICollector_Xfer.hpp b/include/xo/alloc2/gc/ICollector_Xfer.hpp index 6482508..dd21804 100644 --- a/include/xo/alloc2/gc/ICollector_Xfer.hpp +++ b/include/xo/alloc2/gc/ICollector_Xfer.hpp @@ -44,6 +44,9 @@ namespace xo { bool is_type_installed(Copaque d, typeseq tseq) const noexcept override { return I::is_type_installed(_dcast(d), tseq); } + bool contains(Copaque d, role r, const void * addr) const noexcept override { + return I::contains(_dcast(d), r, addr); + } // non-const methods diff --git a/include/xo/alloc2/gc/RCollector.hpp b/include/xo/alloc2/gc/RCollector.hpp index 9dc313b..f63fb4a 100644 --- a/include/xo/alloc2/gc/RCollector.hpp +++ b/include/xo/alloc2/gc/RCollector.hpp @@ -45,6 +45,7 @@ namespace xo { 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 contains(role r, const void * addr) const noexcept { return O::iface()->contains(O::data(), r, addr); } 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); }