52 size_t elementSize, size_t unusedCapacity, size_t alignment)
noexcept
54 size_t totalCapacity = 0;
55 if (Q_UNLIKELY(qAddOverflow(*capacity, unusedCapacity, &totalCapacity)))
58 size_t payloadSize = 0;
59 if (Q_UNLIKELY(qMulOverflow(totalCapacity, elementSize, &payloadSize)))
63 if (Q_UNLIKELY(qAddOverflow(headerSize, payloadSize, &allocSize)))
66 if (size_t fittedSize = expectedAllocSize(allocSize, alignment); fittedSize != 0) {
69 *capacity = (fittedSize - headerSize) / elementSize - unusedCapacity;
70 size_t newTotalCapacity = *capacity + unusedCapacity;
71 size_t newPayloadSize = newTotalCapacity * elementSize;
72 return headerSize + newPayloadSize;
82 size_t elementSize, size_t unusedCapacity)
noexcept
84 size_t allocSize = fittedAllocSize(headerSize, capacity,
85 elementSize, unusedCapacity,
alignof(std::max_align_t));
86 if (Q_LIKELY(allocSize != 0))
87 return malloc(allocSize);
92 size_t elementSize, size_t unusedCapacity = 0)
noexcept
94 size_t uCapacity = size_t(*capacity);
95 void *ptr = fittedMalloc(headerSize, &uCapacity, elementSize, unusedCapacity);
96 *capacity = qsizetype(uCapacity);
101 size_t elementSize, size_t unusedCapacity)
noexcept
103 size_t newCapacity = *capacity;
104 size_t allocSize = fittedAllocSize(headerSize, &newCapacity,
105 elementSize, unusedCapacity,
alignof(std::max_align_t));
106 if (Q_LIKELY(allocSize != 0)) {
107 void *newPtr = realloc(ptr, allocSize);
109 *capacity = newCapacity;
115inline void *
fittedRealloc(
void *ptr, size_t headerSize, qsizetype *capacity,
116 size_t elementSize, size_t unusedCapacity = 0)
noexcept
118 size_t uCapacity = size_t(*capacity);
119 ptr = fittedRealloc(ptr, headerSize, &uCapacity, elementSize, unusedCapacity);
120 *capacity = qsizetype(uCapacity);