@@ -34,31 +34,27 @@ class CAsyncSingleBufferSubAllocator
34
34
35
35
class DeferredFreeFunctor
36
36
{
37
- static constexpr size_t PseudoTupleByteSize = (2u *sizeof (size_type)+sizeof (core::smart_refctd_ptr<core::IReferenceCounted>));
37
+ using ref_t = core::smart_refctd_ptr<const core::IReferenceCounted>;
38
+ static constexpr size_t PseudoTupleByteSize = 2u *sizeof (size_type)+sizeof (ref_t );
38
39
static constexpr size_t AllocatorUnitsPerMetadata = PseudoTupleByteSize/sizeof (typename HostAllocator::value_type);
39
40
static_assert ((PseudoTupleByteSize%sizeof (typename HostAllocator::value_type)) == 0u , " should be divisible by HostAllocator::value_type" );
40
41
41
42
public:
42
- template <typename T>
43
+ template <typename T> requires std::is_base_of_v<core::IReferenceCounted,T>
43
44
inline DeferredFreeFunctor (Composed* _composed, size_type numAllocsToFree, const size_type* addrs, const size_type* bytes, const T*const *const objectsToHold)
44
45
: composed(_composed), rangeData(nullptr ), numAllocs(numAllocsToFree)
45
46
{
46
47
static_assert (std::is_base_of_v<core::IReferenceCounted,T>);
47
48
48
- // TODO : CMemoryPool<RobustGeneralpurposeAllocator> a-la naughty do
49
+ // TODO : CMemoryPool<RobustGeneralpurposeAllocator> a-la naughty dog
49
50
rangeData = reinterpret_cast <size_type*>(composed->getReservedAllocator ().allocate (AllocatorUnitsPerMetadata*numAllocs,sizeof (void *)));
50
51
auto out = rangeData;
51
52
memcpy (out,addrs,sizeof (size_type)*numAllocs);
52
53
out += numAllocs;
53
54
memcpy (out,bytes,sizeof (size_type)*numAllocs);
54
55
out += numAllocs;
55
- auto * const objHoldIt = reinterpret_cast <core::smart_refctd_ptr<const core::IReferenceCounted>*>(out);
56
56
for (size_t i=0u ; i<numAllocs; i++)
57
- {
58
- reinterpret_cast <const void **>(out)[i] = nullptr ; // clear it first
59
- if (objectsToHold)
60
- objHoldIt[i] = core::smart_refctd_ptr<const core::IReferenceCounted>(objectsToHold[i]);
61
- }
57
+ std::construct_at<ref_t >(reinterpret_cast <ref_t *>(out)+i,objectsToHold ? objectsToHold[i]:nullptr );
62
58
}
63
59
DeferredFreeFunctor (const DeferredFreeFunctor& other) = delete ;
64
60
inline DeferredFreeFunctor (DeferredFreeFunctor&& other) : composed(nullptr ), rangeData(nullptr ), numAllocs(0u )
@@ -105,9 +101,7 @@ class CAsyncSingleBufferSubAllocator
105
101
106
102
inline void operator ()()
107
103
{
108
- auto * const objHoldIt = reinterpret_cast <core::smart_refctd_ptr<const core::IReferenceCounted>*>(rangeData+numAllocs*2u );
109
- for (size_t i=0u ; i<numAllocs; i++)
110
- objHoldIt[i] = nullptr ;
104
+ std::destroy_n (reinterpret_cast <ref_t *>(rangeData+numAllocs*2u ),numAllocs);
111
105
#ifdef _NBL_DEBUG
112
106
assert (composed && rangeData);
113
107
#endif // _NBL_DEBUG
0 commit comments