Index: src/OFBigDataArray.m ================================================================== --- src/OFBigDataArray.m +++ src/OFBigDataArray.m @@ -22,10 +22,12 @@ #import "OFSystemInfo.h" #import "OFInvalidArgumentException.h" #import "OFOutOfMemoryException.h" #import "OFOutOfRangeException.h" + +#import "macros.h" @implementation OFBigDataArray - init { return [self initWithItemSize: 1 @@ -42,23 +44,23 @@ capacity: (size_t)capacity { self = [super init]; @try { - size_t size, lastPageByte; + size_t size, pageSize; if (itemSize == 0) @throw [OFInvalidArgumentException exception]; if (capacity > SIZE_MAX / itemSize) @throw [OFOutOfRangeException exception]; - lastPageByte = [OFSystemInfo pageSize] - 1; - size = (capacity * itemSize + lastPageByte) & ~lastPageByte; + pageSize = [OFSystemInfo pageSize]; + size = OF_ROUND_UP_POW2(pageSize, capacity * itemSize); if (size == 0) - size = lastPageByte + 1; + size = pageSize; _items = [self allocMemoryWithSize: size]; _itemSize = itemSize; _capacity = size / itemSize; @@ -75,15 +77,14 @@ { if (SIZE_MAX - _count < 1 || _count + 1 > SIZE_MAX / _itemSize) @throw [OFOutOfRangeException exception]; if (_count + 1 > _capacity) { - size_t size, lastPageByte; + size_t size, pageSize; - lastPageByte = [OFSystemInfo pageSize] - 1; - size = ((_count + 1) * _itemSize + lastPageByte) & - ~lastPageByte; + pageSize = [OFSystemInfo pageSize]; + size = OF_ROUND_UP_POW2(pageSize, (_count + 1) * _itemSize); _items = [self resizeMemory: _items size: size]; _capacity = size / _itemSize; @@ -100,15 +101,14 @@ { if (count > SIZE_MAX - _count || _count + count > SIZE_MAX / _itemSize) @throw [OFOutOfRangeException exception]; if (_count + count > _capacity) { - size_t size, lastPageByte; + size_t size, pageSize; - lastPageByte = [OFSystemInfo pageSize] - 1; - size = ((_count + count) * _itemSize + lastPageByte) & - ~lastPageByte; + pageSize = [OFSystemInfo pageSize]; + size = OF_ROUND_UP_POW2(pageSize, (_count + count) * _itemSize); _items = [self resizeMemory: _items size: size]; _capacity = size / _itemSize; @@ -127,15 +127,14 @@ if (count > SIZE_MAX - _count || index > _count || _count + count > SIZE_MAX / _itemSize) @throw [OFOutOfRangeException exception]; if (_count + count > _capacity) { - size_t size, lastPageByte; + size_t size, pageSize; - lastPageByte = [OFSystemInfo pageSize] - 1; - size = ((_count + count) * _itemSize + lastPageByte) & - ~lastPageByte; + pageSize = [OFSystemInfo pageSize]; + size = OF_ROUND_UP_POW2(pageSize, (_count + count) * _itemSize); _items = [self resizeMemory: _items size: size]; _capacity = size / _itemSize; @@ -149,11 +148,11 @@ _count += count; } - (void)removeItemsInRange: (of_range_t)range { - size_t lastPageByte, size; + size_t pageSize, size; if (range.length > SIZE_MAX - range.location || range.location + range.length > _count) @throw [OFOutOfRangeException exception]; @@ -160,14 +159,14 @@ memmove(_items + range.location * _itemSize, _items + (range.location + range.length) * _itemSize, (_count - range.location - range.length) * _itemSize); _count -= range.length; - lastPageByte = [OFSystemInfo pageSize] - 1; - size = (_count * _itemSize + lastPageByte) & ~lastPageByte; + pageSize = [OFSystemInfo pageSize]; + size = OF_ROUND_UP_POW2(pageSize, _count * _itemSize); - if (_size != size && size > lastPageByte) { + if (_size != size && size >= pageSize) { @try { _items = [self resizeMemory: _items size: size]; _capacity = size / _itemSize; _size = size; @@ -177,20 +176,20 @@ } } - (void)removeLastItem { - size_t lastPageByte, size; + size_t pageSize, size; if (_count == 0) return; _count--; - lastPageByte = [OFSystemInfo pageSize] - 1; - size = (_count * _itemSize + lastPageByte) & ~lastPageByte; + pageSize = [OFSystemInfo pageSize]; + size = OF_ROUND_UP_POW2(pageSize, _count * _itemSize); - if (_size != size && size > lastPageByte) { + if (_size != size && size >= pageSize) { @try { _items = [self resizeMemory: _items size: size]; _capacity = size / _itemSize; _size = size; Index: src/macros.h ================================================================== --- src/macros.h +++ src/macros.h @@ -355,10 +355,12 @@ (((value) << ((bits) % (sizeof(value) * 8))) | \ ((value) >> (sizeof(value) * 8 - ((bits) % (sizeof(value) * 8))))) #define OF_ROR(value, bits) \ (((value) >> ((bits) % (sizeof(value) * 8))) | \ ((value) << (sizeof(value) * 8 - ((bits) % (sizeof(value) * 8))))) + +#define OF_ROUND_UP_POW2(pow2, value) (((value) + (pow2) - 1) & ~((pow2) - 1)) #define OF_HASH_INIT(hash) hash = of_hash_seed; #define OF_HASH_ADD(hash, byte) \ { \ hash += (uint8_t)(byte); \