Library: rearrange into standard allocation factory
- code spelled out as intended, according to generic scheme - can now encode the »unmanaged« case directly as `null`-deleter, because in all other cases a deleter function is mandatory now - add default constructor to `ArrayBucket`, detailing the default spread
This commit is contained in:
parent
0e2ca6ee1c
commit
c5d1a7d0df
3 changed files with 63 additions and 22 deletions
|
|
@ -74,11 +74,12 @@ namespace lib {
|
|||
|
||||
|
||||
template<class I, template<typename> class ALO>
|
||||
struct ElementFactory
|
||||
class ElementFactory
|
||||
: private ALO<std::byte>
|
||||
{
|
||||
using Allo = ALO<std::byte>;
|
||||
using AlloT = std::allocator_traits<Allo>;
|
||||
using Bucket = ArrayBucket<I>;
|
||||
|
||||
Allo& baseAllocator() { return *this; }
|
||||
|
||||
|
|
@ -93,10 +94,48 @@ namespace lib {
|
|||
return XAllo{};
|
||||
}
|
||||
|
||||
static size_t
|
||||
calcSize (size_t cnt, size_t spread)
|
||||
{
|
||||
return sizeof(Bucket) - sizeof(Bucket::storage)
|
||||
+ cnt * spread;
|
||||
}
|
||||
|
||||
public:
|
||||
ElementFactory (Allo allo = Allo{})
|
||||
: Allo{std::move (allo)}
|
||||
{ }
|
||||
|
||||
Bucket*
|
||||
create (size_t cnt, size_t spread)
|
||||
{
|
||||
size_t storageBytes = calcSize (cnt, spread);
|
||||
std::byte* loc = AlloT::allocate (baseAllocator(), storageBytes);
|
||||
|
||||
using BucketAlloT = typename AlloT::template rebind_traits<Bucket>;
|
||||
auto bucketAllo = adaptAllocator<Bucket>();
|
||||
try { BucketAlloT::construct (bucketAllo, loc, spread); }
|
||||
catch(...)
|
||||
{
|
||||
AlloT::deallocate (baseAllocator(), loc, storageBytes);
|
||||
throw;
|
||||
}
|
||||
return static_cast<Bucket*> (loc);
|
||||
};
|
||||
|
||||
template<class E, typename...ARGS>
|
||||
E&
|
||||
createAt (Bucket* bucket, size_t idx, ARGS&& ...args)
|
||||
{
|
||||
REQUIRE (bucket);
|
||||
using ElmAlloT = typename AlloT::template rebind_traits<E>;
|
||||
auto elmAllo = adaptAllocator<E>();
|
||||
E* loc = & bucket->subscript (idx);
|
||||
ElmAlloT::construct (elmAllo, loc, forward<ARGS> (args)...);
|
||||
ENSURE (loc);
|
||||
return *loc;
|
||||
};
|
||||
|
||||
template<class E>
|
||||
void
|
||||
destroy (ArrayBucket<I>* bucket, size_t size)
|
||||
|
|
@ -107,9 +146,7 @@ namespace lib {
|
|||
for (size_t i=0; i<size; ++i)
|
||||
ElmAlloT::destroy (elmAllo, & bucket->subscript(i));
|
||||
|
||||
size_t storageBytes = sizeof(ArrayBucket<I>) - sizeof(ArrayBucket<I>::storage)
|
||||
+ size * bucket->spread;
|
||||
|
||||
size_t storageBytes = calcSize (size, bucket->spread);
|
||||
AlloT::deallocate (baseAllocator(), bucket, storageBytes);
|
||||
};
|
||||
};
|
||||
|
|
|
|||
|
|
@ -48,15 +48,14 @@ namespace lib {
|
|||
template<class I>
|
||||
struct ArrayBucket
|
||||
{
|
||||
union Manager
|
||||
{
|
||||
typedef void (*Deleter) (ArrayBucket*, size_t);
|
||||
|
||||
bool unmanaged :1;
|
||||
Deleter deleter;
|
||||
};
|
||||
ArrayBucket (size_t elmSize = sizeof(I))
|
||||
: deleter{nullptr}
|
||||
, spread{elmSize}
|
||||
{ }
|
||||
|
||||
Manager manager;
|
||||
typedef void (*Deleter) (ArrayBucket*, size_t);
|
||||
|
||||
Deleter deleter;
|
||||
size_t spread;
|
||||
|
||||
/** mark start of the storage area */
|
||||
|
|
@ -145,8 +144,8 @@ namespace lib {
|
|||
void
|
||||
discardData()
|
||||
{
|
||||
if (data_ and data_->manager.deleter)
|
||||
(*data_->manager.deleter) (data_, size_);
|
||||
if (data_ and data_->deleter)
|
||||
(*data_->deleter) (data_, size_);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -81952,9 +81952,9 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1717596235650" ID="ID_608819565" MODIFIED="1717596532860" TEXT="Implementierung">
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1717596235650" ID="ID_608819565" MODIFIED="1717717682157" TEXT="Implementierung">
|
||||
<linktarget COLOR="#549cbc" DESTINATION="ID_608819565" ENDARROW="Default" ENDINCLINATION="152;866;" ID="Arrow_ID_190880203" SOURCE="ID_492608922" STARTARROW="None" STARTINCLINATION="-139;-10;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1717596241009" ID="ID_770727824" MODIFIED="1717596250200" TEXT="Erkennungs-Mechanismus">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
|
|
@ -81975,10 +81975,14 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1717710799094" ID="ID_310099304" MODIFIED="1717710881440" TEXT="ObjectFactory">
|
||||
<linktarget COLOR="#867587" DESTINATION="ID_310099304" ENDARROW="Default" ENDINCLINATION="-927;146;" ID="Arrow_ID_1881268863" SOURCE="ID_342640598" STARTARROW="None" STARTINCLINATION="-107;-6;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#338800" CREATED="1717710799094" ID="ID_310099304" MODIFIED="1717717678921" TEXT="ObjectFactory">
|
||||
<linktarget COLOR="#687a8b" DESTINATION="ID_310099304" ENDARROW="Default" ENDINCLINATION="-927;146;" ID="Arrow_ID_1881268863" SOURCE="ID_342640598" STARTARROW="None" STARTINCLINATION="-107;-6;"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1717710834678" ID="ID_16117383" MODIFIED="1717710852024" TEXT="eine Variation der generischen StdFactory"/>
|
||||
<node CREATED="1717710923482" ID="ID_1281147725" MODIFIED="1717710954590" TEXT="nur daß hier die Instanzen speziell gemäß Spread und Offset platziert werden müssen"/>
|
||||
<node COLOR="#338800" CREATED="1717717650107" ID="ID_1819990017" MODIFIED="1717717676691" TEXT="bindet Kenntnis über das Layout des ArrayBucket implizit ein">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -82256,10 +82260,11 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1717710755310" ID="ID_342640598" MODIFIED="1717710895137" TEXT="sinnvollerweise mit einer Allocator-Factory hinterlegen">
|
||||
<arrowlink COLOR="#867587" DESTINATION="ID_310099304" ENDARROW="Default" ENDINCLINATION="-927;146;" ID="Arrow_ID_1881268863" STARTARROW="None" STARTINCLINATION="-107;-6;"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1717710755310" ID="ID_342640598" MODIFIED="1717717695572" TEXT="sinnvollerweise mit einer Allocator-Factory hinterlegen">
|
||||
<arrowlink COLOR="#687a8b" DESTINATION="ID_310099304" ENDARROW="Default" ENDINCLINATION="-927;146;" ID="Arrow_ID_1881268863" STARTARROW="None" STARTINCLINATION="-107;-6;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1717710901355" ID="ID_718524980" MODIFIED="1717710916991" TEXT="das Meiste ist nämlich generische boilerplate"/>
|
||||
<node CREATED="1717710901355" ID="ID_718524980" MODIFIED="1717715225349" TEXT="das Meiste ist nämlich generische Boilerplate"/>
|
||||
<node CREATED="1717715255933" ID="ID_261113900" MODIFIED="1717715273774" TEXT="damit könnte auch das Thema »durchreichen des Basis-Allokators« generisch gelöst werden"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1717543083078" ID="ID_530261806" MODIFIED="1717543114805" TEXT="getMover()"/>
|
||||
|
|
|
|||
Loading…
Reference in a new issue