Index: src/OFArray.h ================================================================== --- src/OFArray.h +++ src/OFArray.h @@ -119,10 +119,17 @@ * \param is The size of each element in the OFBigArray * \return An initialized OFBigArray */ - initWithItemSize: (size_t)is; +/** + * Adds an item to the OFBigArray. + * + * \param item An arbitrary item + */ +- add: (void*)item; + /** * Adds items from a C array to the OFBigArray. * * \param nitems The number of items to add * \param carray A C array containing the items to add Index: src/OFArray.m ================================================================== --- src/OFArray.m +++ src/OFArray.m @@ -16,11 +16,11 @@ #import "OFArray.h" #import "OFExceptions.h" #import "OFMacros.h" -static size_t pagesize = 0; +static size_t lastpagebyte = 0; @implementation OFArray + newWithItemSize: (size_t)is { return [[OFArray alloc] initWithItemSize: is]; @@ -116,16 +116,35 @@ return [[OFBigArray alloc] initWithItemSize: is]; } - initWithItemSize: (size_t)is { - if (pagesize == 0) - pagesize = getpagesize(); + if (lastpagebyte == 0) + lastpagebyte = getpagesize() - 1; if ((self = [super initWithItemSize: is])) size = 0; + return self; +} + +- add: (void*)item +{ + size_t nsize; + + if (SIZE_MAX - items < 1 || items + 1 > SIZE_MAX / itemsize) + [[OFOutOfRangeException newWithObject: self] raise]; + + nsize = ((items + 1) * itemsize + lastpagebyte) & ~lastpagebyte; + + if (size != nsize) + data = [self resizeMem: data + toSize: nsize]; + + memcpy(data + items++ * itemsize, item, itemsize); + size = nsize; + return self; } - addNItems: (size_t)nitems fromCArray: (void*)carray @@ -133,11 +152,11 @@ size_t nsize; if (nitems > SIZE_MAX - items || items + nitems > SIZE_MAX / itemsize) [[OFOutOfRangeException newWithObject: self] raise]; - nsize = ((items + nitems) * itemsize + pagesize - 1) / pagesize; + nsize = ((items + nitems) * itemsize + lastpagebyte) & ~lastpagebyte; if (size != nsize) data = [self resizeMem: data toSize: nsize]; @@ -153,11 +172,11 @@ size_t nsize; if (nitems > items) [[OFOutOfRangeException newWithObject: self] raise]; - nsize = ((items - nitems) * itemsize + pagesize - 1) / pagesize; + nsize = ((items - nitems) * itemsize + lastpagebyte) & ~lastpagebyte; if (size != nsize) data = [self resizeMem: data toSize: nsize];