Index: src/OFDataArray.h ================================================================== --- src/OFDataArray.h +++ src/OFDataArray.h @@ -88,19 +88,39 @@ * * \param item A pointer to an arbitrary item */ - addItem: (void*)item; +/** + * Adds an item to the OFDataArray at the specified index. + * + * \param item A pointer to an arbitrary item + * \param index The index where the item should be added + */ +- addItem: (void*)item + atIndex: (size_t)index; + /** * Adds items from a C array to the OFDataArray. * * \param nitems The number of items to add * \param carray A C array containing the items to add */ - addNItems: (size_t)nitems fromCArray: (void*)carray; +/** + * Adds items from a C array to the OFDataArray at the specified index. + * + * \param nitems The number of items to add + * \param carray A C array containing the items to add + * \param index The index where the items should be added + */ +- addNItems: (size_t)nitems + fromCArray: (void*)carray + atIndex: (size_t)index; + /** * Removes the item at the specified index. * * \param index The index of the item to remove */ Index: src/OFDataArray.m ================================================================== --- src/OFDataArray.m +++ src/OFDataArray.m @@ -103,14 +103,24 @@ data = [self resizeMemory: data toNItems: count + 1 withSize: itemsize]; - memcpy(data + count++ * itemsize, item, itemsize); + memcpy(data + count * itemsize, item, itemsize); + + count++; return self; } + +- addItem: (void*)item + atIndex: (size_t)index +{ + return [self addNItems: 1 + fromCArray: item + atIndex: index]; +} - addNItems: (size_t)nitems fromCArray: (void*)carray { if (nitems > SIZE_MAX - count) @@ -119,10 +129,30 @@ data = [self resizeMemory: data toNItems: count + nitems withSize: itemsize]; memcpy(data + count * itemsize, carray, nitems * itemsize); + count += nitems; + + return self; +} + +- addNItems: (size_t)nitems + fromCArray: (void*)carray + atIndex: (size_t)index +{ + if (nitems > SIZE_MAX - count) + @throw [OFOutOfRangeException newWithClass: isa]; + + data = [self resizeMemory: data + toNItems: count + nitems + withSize: itemsize]; + + memmove(data + (index + nitems) * itemsize, data + index * itemsize, + (count - index) * itemsize); + memcpy(data + index * itemsize, carray, nitems * itemsize); + count += nitems; return self; } @@ -268,11 +298,13 @@ if (size != nsize) data = [self resizeMemory: data toSize: nsize]; - memcpy(data + count++ * itemsize, item, itemsize); + memcpy(data + count * itemsize, item, itemsize); + + count++; size = nsize; return self; } @@ -289,10 +321,37 @@ if (size != nsize) data = [self resizeMemory: data toSize: nsize]; memcpy(data + count * itemsize, carray, nitems * itemsize); + + count += nitems; + size = nsize; + + return self; +} + +- addNItems: (size_t)nitems + fromCArray: (void*)carray + atIndex: (size_t)index +{ + size_t nsize; + + if (nitems > SIZE_MAX - count || count + nitems > SIZE_MAX / itemsize) + @throw [OFOutOfRangeException newWithClass: isa]; + + nsize = ((count + nitems) * itemsize + lastpagebyte) & ~lastpagebyte; + + if (size != nsize) + data = [self resizeMemory: data + toNItems: nsize + withSize: itemsize]; + + memmove(data + (index + nitems) * itemsize, data + index * itemsize, + (count - index) * itemsize); + memcpy(data + index * itemsize, carray, nitems * itemsize); + count += nitems; size = nsize; return self; } Index: tests/OFDataArray.m ================================================================== --- tests/OFDataArray.m +++ tests/OFDataArray.m @@ -84,11 +84,16 @@ TEST(@"-[removeNItems:atIndex:]", [array[0] removeNItems: 2 atIndex: 1] && [array[0] count] == 3 && !memcmp([array[0] cArray], "ade", 3)) - [array[0] addItem: ""]; + + TEST(@"-[addNItems:atIndex:]", + [array[0] addNItems: 2 + fromCArray: "bc" + atIndex: 1] && [array[0] count] == 5 && + !memcmp([array[0] cArray], "abcde", 5)) TEST(@"Building strings", (array[0] = [class dataArrayWithItemSize: 1]) && [array[0] addNItems: 6 fromCArray: (void*)str] && [array[0] addItem: ""] &&