@@ -685,198 +685,6 @@ [data addItems: _items count: _count]; return data; } -@end - -@implementation OFBigDataArray -- init -{ - return [self initWithItemSize: 1 - capacity: 0]; -} - -- initWithItemSize: (size_t)itemSize -{ - return [self initWithItemSize: itemSize - capacity: 0]; -} - -- initWithItemSize: (size_t)itemSize - capacity: (size_t)capacity -{ - self = [super init]; - - @try { - size_t size, lastPageByte; - - if (itemSize == 0) - @throw [OFInvalidArgumentException exception]; - - if (capacity > SIZE_MAX / itemSize) - @throw [OFOutOfRangeException exception]; - - lastPageByte = [OFSystemInfo pageSize] - 1; - size = (capacity * itemSize + lastPageByte) & ~lastPageByte; - - if (size == 0) - size = lastPageByte + 1; - - _items = [self allocMemoryWithSize: size]; - - _itemSize = itemSize; - _capacity = size / itemSize; - _size = size; - } @catch (id e) { - [self release]; - @throw e; - } - - return self; -} - -- (void)addItem: (const void*)item -{ - if (SIZE_MAX - _count < 1 || _count + 1 > SIZE_MAX / _itemSize) - @throw [OFOutOfRangeException exception]; - - if (_count + 1 > _capacity) { - size_t size, lastPageByte; - - lastPageByte = [OFSystemInfo pageSize] - 1; - size = ((_count + 1) * _itemSize + lastPageByte) & - ~lastPageByte; - - _items = [self resizeMemory: _items - size: size]; - - _capacity = size / _itemSize; - _size = size; - } - - memcpy(_items + _count * _itemSize, item, _itemSize); - - _count++; -} - -- (void)addItems: (const void*)items - count: (size_t)count -{ - if (count > SIZE_MAX - _count || _count + count > SIZE_MAX / _itemSize) - @throw [OFOutOfRangeException exception]; - - if (_count + count > _capacity) { - size_t size, lastPageByte; - - lastPageByte = [OFSystemInfo pageSize] - 1; - size = ((_count + count) * _itemSize + lastPageByte) & - ~lastPageByte; - - _items = [self resizeMemory: _items - size: size]; - - _capacity = size / _itemSize; - _size = size; - } - - memcpy(_items + _count * _itemSize, items, count * _itemSize); - - _count += count; -} - -- (void)insertItems: (const void*)items - atIndex: (size_t)index - count: (size_t)count -{ - if (count > SIZE_MAX - _count || index > _count || - _count + count > SIZE_MAX / _itemSize) - @throw [OFOutOfRangeException exception]; - - if (_count + count > _capacity) { - size_t size, lastPageByte; - - lastPageByte = [OFSystemInfo pageSize] - 1; - size = ((_count + count) * _itemSize + lastPageByte) & - ~lastPageByte; - - _items = [self resizeMemory: _items - size: size]; - - _capacity = size / _itemSize; - _size = size; - } - - memmove(_items + (index + count) * _itemSize, - _items + index * _itemSize, (_count - index) * _itemSize); - memcpy(_items + index * _itemSize, items, count * _itemSize); - - _count += count; -} - -- (void)removeItemsInRange: (of_range_t)range -{ - size_t lastPageByte, size; - - if (range.length > SIZE_MAX - range.location || - range.location + range.length > _count) - @throw [OFOutOfRangeException exception]; - - 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; - - if (_size != size && size > lastPageByte) { - @try { - _items = [self resizeMemory: _items - size: size]; - _capacity = size / _itemSize; - _size = size; - } @catch (OFOutOfMemoryException *e) { - /* We don't care, as we only made it smaller */ - } - } -} - -- (void)removeLastItem -{ - size_t lastPageByte, size; - - if (_count == 0) - return; - - _count--; - lastPageByte = [OFSystemInfo pageSize] - 1; - size = (_count * _itemSize + lastPageByte) & ~lastPageByte; - - if (_size != size && size > lastPageByte) { - @try { - _items = [self resizeMemory: _items - size: size]; - _capacity = size / _itemSize; - _size = size; - } @catch (OFOutOfMemoryException *e) { - /* We don't care, as we only made it smaller */ - } - } -} - -- (void)removeAllItems -{ - size_t pageSize = [OFSystemInfo pageSize]; - - @try { - _items = [self resizeMemory: _items - size: pageSize]; - _capacity = pageSize / _itemSize; - _size = pageSize; - } @catch (OFOutOfMemoryException *e) { - /* We don't care, as we only made it smaller */ - } - - _count = 0; -} @end