From bf74ba62929ec30310871fed816f46763f93eceb Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Thu, 6 Jun 2024 18:41:07 +0200 Subject: [PATCH] Library: sketch for a deleter trampoline for simple allocators this can be static --- src/lib/several-builder.hpp | 37 +++++++++++++++++++++++++++++++++++++ src/lib/several.hpp | 25 ++++++++++--------------- wiki/thinkPad.ichthyo.mm | 25 +++++++++++++------------ 3 files changed, 60 insertions(+), 27 deletions(-) diff --git a/src/lib/several-builder.hpp b/src/lib/several-builder.hpp index 61867a8c2..4da1e1e12 100644 --- a/src/lib/several-builder.hpp +++ b/src/lib/several-builder.hpp @@ -71,6 +71,42 @@ namespace lib { } }; + + + template + struct DeleterTrampoline + { + using Allo = std::allocator; + using AlloT = std::allocator_traits; + + template + static auto + adaptAllocator() + { + using XAllo = typename AlloT::template rebind_alloc; + if constexpr (std::is_constructible_v) + return XAllo{Allo()}; + else + return XAllo{}; + } + + static void + destroy (ArrayBucket* bucket, size_t size) + { + Allo allo{}; + for (size_t i=0; isubscript(i)); + + size_t storageBytes = sizeof(ArrayBucket) - sizeof(ArrayBucket::storage) + + size * sizeof(E); + + using BAlloT = typename AlloT::template rebind_traits; + auto bAllo = adaptAllocator(); + BAlloT::deallocate (bAllo, bucket, storageBytes); + }; + }; + + using std::is_trivially_move_constructible_v; using std::is_trivially_destructible_v; using std::has_virtual_destructor_v; @@ -125,6 +161,7 @@ namespace lib { > class SeveralBuilder : Several + , util::MoveOnly , POL { using Col = Several; diff --git a/src/lib/several.hpp b/src/lib/several.hpp index 96bc8bf72..7da706306 100644 --- a/src/lib/several.hpp +++ b/src/lib/several.hpp @@ -50,7 +50,7 @@ namespace lib { { union Manager { - typedef void (*Deleter) (void*, size_t, size_t); + typedef void (*Deleter) (ArrayBucket*, size_t); bool unmanaged :1; Deleter deleter; @@ -89,7 +89,7 @@ namespace lib { */ template class Several -// : util::MoveAssign ////////////////////////////////////////OOO fundamental design mismatch with intended builder usage! + : util::MoveAssign { protected: using Bucket = ArrayBucket*; @@ -97,11 +97,17 @@ namespace lib { size_t size_{0}; Bucket data_{nullptr}; + Several() =default; ///< may only be created through SeveralBuilder + public: ~Several() noexcept try { discardData(); } ERROR_LOG_AND_IGNORE (progress, "clean-up Several data") + /// Move-Assignment allowed... + Several (Several&&) =default; + Several& operator= (Several&&) =default; + size_t size() const { @@ -139,19 +145,8 @@ namespace lib { void discardData() { - if (data_ and not data_->manager.unmanaged) - { - if (data_->manager.deleter) - { - (*data_->manager.deleter) (data_, size_, data_->spread); - } - else - { - for (size_t i=0; imanager.deleter) + (*data_->manager.deleter) (data_, size_); } }; diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm index 944c67920..d0c69aaba 100644 --- a/wiki/thinkPad.ichthyo.mm +++ b/wiki/thinkPad.ichthyo.mm @@ -81883,8 +81883,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
heißt: er kann zwar nicht wegfallen (weil sich das dann im Typ ausdrücken würde) — aber der Pointer bleibt dann NULL und der Container fällt auf Standard-Verhalten zurück

- - + @@ -81929,8 +81928,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
Wenn dieser Test scheitert, dann muß die Allokator-Instanz erhalten bleiben.

- -
+
@@ -81973,8 +81971,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
In der Tat: siehe special-job-fun.hpp

- - + @@ -82223,8 +82220,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
 oder es ist eine selbstzerstörende Heap-Allokation

- - + @@ -82245,10 +82241,15 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
weil der Several-Container selber nur den Spread kennt, aber keine konkrete Typ-Info mehr hat

- - + + + + + + + @@ -82258,8 +82259,8 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- - + +