diff --git a/src/lib/several-builder.hpp b/src/lib/several-builder.hpp index 726292e88..5129d6858 100644 --- a/src/lib/several-builder.hpp +++ b/src/lib/several-builder.hpp @@ -145,6 +145,7 @@ namespace lib { }; }; + using std::is_trivially_copyable_v; template class ALO> struct AllocationPolicy @@ -160,8 +161,18 @@ namespace lib { bool canExpand(size_t){ return false; } Bucket* - realloc (Bucket* data, size_t demand) + realloc (Bucket* data, size_t cnt, size_t spread) { + Bucket* newBucket = Fac::create (cnt, spread); + if (data) + { + size_t elms = min (cnt, data->cnt); + for (size_t idx=0; idxdestroy(); + } + return newBucket; +/* size_t buffSiz{data? data->buffSiz : 0}; if (demand == buffSiz) return data; @@ -205,7 +216,7 @@ namespace lib { } return newBucket; } - + */ // // ensure sufficient storage or verify the ability to re-allocate // if (not (Coll::hasReserve(sizeof(TY)) // or POL::canExpand(sizeof(TY)) @@ -213,6 +224,23 @@ namespace lib { // throw err::Invalid{_Fmt{"Unable to accommodate further element of type %s "} // % util::typeStr()}; } + + void + moveElem (size_t idx, Bucket* src, Bucket* tar) + { + if constexpr (is_trivially_copyable_v) + { + void* oldPos = & src->subscript(idx); + void* newPos = & tar->subscript(idx); + size_t amount = min (src->spread, tar->spread); + std::memmove (newPos, oldPos, amount); + } + else + { + Fac::template createAt (tar, idx + ,std::move_if_noexcept (src->subscript(idx))); + } + } }; template @@ -333,7 +361,7 @@ namespace lib { adjustStorage (size_t cnt, size_t spread) { size_t demand{cnt*spread}; - Coll::data_ = POL::realloc (Coll::data_, demand); + Coll::data_ = POL::realloc (Coll::data_, cnt,spread); /////////////////OOO anpassen ENSURE (Coll::data_); if (spread != Coll::spread()) adjustSpread (spread); diff --git a/src/lib/several.hpp b/src/lib/several.hpp index e7f600652..b6a2db3eb 100644 --- a/src/lib/several.hpp +++ b/src/lib/several.hpp @@ -114,6 +114,13 @@ namespace lib { elm += off; return * std::launder (reinterpret_cast (elm)); } + + void + destroy() + { + if (deleter) + (*deleter) (this); + } }; }//(End)implementation details @@ -140,7 +147,7 @@ namespace lib { public: ~Several() noexcept - try { discardData(); } + try { if (data_) data_->destroy(); } ERROR_LOG_AND_IGNORE (progress, "clean-up Several data") /// Move-Assignment allowed... @@ -198,12 +205,6 @@ namespace lib { } private: - void - discardData() - { - if (data_ and data_->deleter) - (*data_->deleter) (data_); - } }; diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm index 5eb18afb7..59615e8ef 100644 --- a/wiki/thinkPad.ichthyo.mm +++ b/wiki/thinkPad.ichthyo.mm @@ -82651,6 +82651,9 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
+ + +