53 size_t elementSize, size_t unusedCapacity, size_t alignment)
noexcept
55 size_t totalCapacity = 0;
56 if (Q_UNLIKELY(qAddOverflow(*capacity, unusedCapacity, &totalCapacity)))
59 size_t payloadSize = 0;
60 if (Q_UNLIKELY(qMulOverflow(totalCapacity, elementSize, &payloadSize)))
64 if (Q_UNLIKELY(qAddOverflow(headerSize, payloadSize, &allocSize)))
67 if (size_t fittedSize = expectedAllocSize(allocSize, alignment); fittedSize != 0) {
70 *capacity = (fittedSize - headerSize) / elementSize - unusedCapacity;
71 size_t newTotalCapacity = *capacity + unusedCapacity;
72 size_t newPayloadSize = newTotalCapacity * elementSize;
73 return headerSize + newPayloadSize;
83 size_t elementSize, size_t unusedCapacity)
noexcept
85 size_t allocSize = fittedAllocSize(headerSize, capacity,
86 elementSize, unusedCapacity,
alignof(std::max_align_t));
87 if (Q_LIKELY(allocSize != 0))
88 return malloc(allocSize);
93 size_t elementSize, size_t unusedCapacity = 0)
noexcept
95 size_t uCapacity = size_t(*capacity);
96 void *ptr = fittedMalloc(headerSize, &uCapacity, elementSize, unusedCapacity);
97 *capacity = qsizetype(uCapacity);
102 size_t elementSize, size_t unusedCapacity)
noexcept
104 size_t newCapacity = *capacity;
105 size_t allocSize = fittedAllocSize(headerSize, &newCapacity,
106 elementSize, unusedCapacity,
alignof(std::max_align_t));
107 if (Q_LIKELY(allocSize != 0)) {
108 void *newPtr = realloc(ptr, allocSize);
110 *capacity = newCapacity;
116inline void *
fittedRealloc(
void *ptr, size_t headerSize, qsizetype *capacity,
117 size_t elementSize, size_t unusedCapacity = 0)
noexcept
119 size_t uCapacity = size_t(*capacity);
120 ptr = fittedRealloc(ptr, headerSize, &uCapacity, elementSize, unusedCapacity);
121 *capacity = qsizetype(uCapacity);