+static size_t cx_buffer_calculate_minimum_capacity(size_t mincap) {
+ unsigned long pagesize = system_page_size();
+ // if page size is larger than 64 KB - for some reason - truncate to 64 KB
+ if (pagesize > 65536) pagesize = 65536;
+ if (mincap < pagesize) {
+ // when smaller as one page, map to the next power of two
+ mincap--;
+ mincap |= mincap >> 1;
+ mincap |= mincap >> 2;
+ mincap |= mincap >> 4;
+ // last operation only needed for pages larger 4096 bytes
+ // but if/else would be more expensive than just doing this
+ mincap |= mincap >> 8;
+ mincap++;
+ } else {
+ // otherwise, map to a multiple of the page size
+ mincap -= mincap % pagesize;
+ mincap += pagesize;
+ // note: if newcap is already page aligned,
+ // this gives a full additional page (which is good)
+ }
+ return mincap;
+}
+
+int cxBufferMinimumCapacity(CxBuffer *buffer, size_t newcap) {
+ if (newcap <= buffer->capacity) {
+ return 0;
+ }
+ newcap = cx_buffer_calculate_minimum_capacity(newcap);
+ return cxBufferReserve(buffer, newcap);
+}
+