51 size_t elementSize, size_t unusedCapacity, size_t alignment)
noexcept
53 size_t totalCapacity = 0;
54 if (Q_UNLIKELY(qAddOverflow(*capacity, unusedCapacity, &totalCapacity)))
57 size_t payloadSize = 0;
58 if (Q_UNLIKELY(qMulOverflow(totalCapacity, elementSize, &payloadSize)))
62 if (Q_UNLIKELY(qAddOverflow(headerSize, payloadSize, &allocSize)))
65 if (size_t fittedSize = expectedAllocSize(allocSize, alignment); fittedSize != 0) {
68 *capacity = (fittedSize - headerSize) / elementSize - unusedCapacity;
69 size_t newTotalCapacity = *capacity + unusedCapacity;
70 size_t newPayloadSize = newTotalCapacity * elementSize;
71 return headerSize + newPayloadSize;
81 size_t elementSize, size_t unusedCapacity)
noexcept
83 size_t allocSize = fittedAllocSize(headerSize, capacity,
84 elementSize, unusedCapacity,
alignof(std::max_align_t));
85 if (Q_LIKELY(allocSize != 0))
86 return malloc(allocSize);
91 size_t elementSize, size_t unusedCapacity = 0)
noexcept
93 size_t uCapacity = size_t(*capacity);
94 void *ptr = fittedMalloc(headerSize, &uCapacity, elementSize, unusedCapacity);
95 *capacity = qsizetype(uCapacity);
99inline void *
fittedRealloc(
void *ptr, size_t headerSize, size_t *capacity,
100 size_t elementSize, size_t unusedCapacity)
noexcept
102 size_t newCapacity = *capacity;
103 size_t allocSize = fittedAllocSize(headerSize, &newCapacity,
104 elementSize, unusedCapacity,
alignof(std::max_align_t));
105 if (Q_LIKELY(allocSize != 0)) {
106 void *newPtr = realloc(ptr, allocSize);
108 *capacity = newCapacity;
114inline void *
fittedRealloc(
void *ptr, size_t headerSize, qsizetype *capacity,
115 size_t elementSize, size_t unusedCapacity = 0)
noexcept
117 size_t uCapacity = size_t(*capacity);
118 ptr = fittedRealloc(ptr, headerSize, &uCapacity, elementSize, unusedCapacity);
119 *capacity = qsizetype(uCapacity);