diff --git a/CMakeLists.txt b/CMakeLists.txt index 54a2cc4..b4b0319 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,7 +25,6 @@ xo_add_genfacet( INPUT idl/ResourceVisitor.json5 OUTPUT_HPP_DIR include/xo/alloc2 OUTPUT_IMPL_SUBDIR visitor - OUTPUT_CPP_DIR src/alloc2 ) # ---------------------------------------------------------------- diff --git a/idl/ResourceVisitor.json5 b/idl/ResourceVisitor.json5 index a336964..79c9d81 100644 --- a/idl/ResourceVisitor.json5 +++ b/idl/ResourceVisitor.json5 @@ -1,5 +1,6 @@ { mode: "facet", + output_cpp_dir: "src/alloc2", includes: [ "\"Allocator.hpp\"" ], diff --git a/include/xo/alloc2/visitor/AResourceVisitor.hpp b/include/xo/alloc2/visitor/AResourceVisitor.hpp index 1466474..c8ab374 100644 --- a/include/xo/alloc2/visitor/AResourceVisitor.hpp +++ b/include/xo/alloc2/visitor/AResourceVisitor.hpp @@ -48,6 +48,8 @@ public: // const methods /** RTTI: unique id# for actual runtime data representation **/ virtual typeseq _typeseq() const noexcept = 0; + /** destroy instance @p d; calls c++ dtor only for actual runtime type; does not recover memory **/ + virtual void _drop(Opaque d) const noexcept = 0; /** report memory consumption **/ virtual void on_allocator(Copaque data, obj mm) const noexcept = 0; diff --git a/include/xo/alloc2/visitor/IResourceVisitor_Any.hpp b/include/xo/alloc2/visitor/IResourceVisitor_Any.hpp index a0d3e3c..18ae11a 100644 --- a/include/xo/alloc2/visitor/IResourceVisitor_Any.hpp +++ b/include/xo/alloc2/visitor/IResourceVisitor_Any.hpp @@ -54,8 +54,11 @@ namespace mm { // from AResourceVisitor - // const methods + // builtin methods typeseq _typeseq() const noexcept override { return s_typeseq; } + [[noreturn]] void _drop(Opaque) const noexcept override { _fatal(); } + + // const methods [[noreturn]] void on_allocator(Copaque, obj) const noexcept override { _fatal(); } // nonconst methods diff --git a/include/xo/alloc2/visitor/IResourceVisitor_Xfer.hpp b/include/xo/alloc2/visitor/IResourceVisitor_Xfer.hpp index 2ff8abd..ded806e 100644 --- a/include/xo/alloc2/visitor/IResourceVisitor_Xfer.hpp +++ b/include/xo/alloc2/visitor/IResourceVisitor_Xfer.hpp @@ -39,8 +39,11 @@ namespace mm { // from AResourceVisitor - // const methods + // builtin methods typeseq _typeseq() const noexcept override { return s_typeseq; } + void _drop(Opaque d) const noexcept override { _dcast(d).~DRepr(); } + + // const methods void on_allocator(Copaque data, obj mm) const noexcept override { return I::on_allocator(_dcast(data), mm); } diff --git a/include/xo/alloc2/visitor/RResourceVisitor.hpp b/include/xo/alloc2/visitor/RResourceVisitor.hpp index 3396e6e..6fa7a63 100644 --- a/include/xo/alloc2/visitor/RResourceVisitor.hpp +++ b/include/xo/alloc2/visitor/RResourceVisitor.hpp @@ -46,8 +46,13 @@ public: /** @defgroup mm-resourcevisitor-router-methods **/ ///@{ - // const methods + // explicit injected content + + // builtin methods typeseq _typeseq() const noexcept { return O::iface()->_typeseq(); } + void _drop() const noexcept { O::iface()->_drop(O::data()); } + + // const methods void on_allocator(obj mm) const noexcept { return O::iface()->on_allocator(O::data(), mm); }