79 #define elemSize(thisArray) (thisArray->m_descriptor->itemSize)
80 #define elemAtX(b, i, thisArray) ((void*)(((char*) (b))+((i)*elemSize(thisArray))))
81 #define elemAt(b, i) elemAtX(b, i, thisArray)
91 void XsArray_constructDerived(
void* thisPtr,
XsSize count,
void const* src);
106 *((
XsSize*) &thisArray->m_size) = count;
108 if (thisArray->m_size)
111 *((
void**) &thisArray->m_data) = malloc(thisArray->m_size * elemSize(thisArray));
117 if (thisArray->m_descriptor->rawCopy)
118 thisArray->m_descriptor->rawCopy(thisArray->m_data, src, thisArray->m_size, thisArray->m_descriptor->itemSize);
122 assert(thisArray->m_descriptor->itemCopyConstruct);
123 for (i = 0; i < thisArray->m_size; ++i)
124 thisArray->m_descriptor->itemCopyConstruct(elemAt(thisArray->m_data, i), elemAt(src, i));
127 else if (thisArray->m_descriptor->itemConstruct)
130 for (i = 0; i < thisArray->m_size; ++i)
131 thisArray->m_descriptor->itemConstruct(elemAt(thisArray->m_data, i));
135 *((
void**) &thisArray->m_data) = 0;
136 *((
XsSize*) &thisArray->m_reserved) = thisArray->m_size;
149 XsArray_construct(thisArray, srcArray->m_descriptor, srcArray->m_size, srcArray->m_data);
160 if (thisArray->m_data && (thisArray->m_flags &
XSDF_Managed))
164 if (thisArray->m_descriptor->itemDestruct)
165 for (i = 0; i < thisArray->m_reserved; ++i)
166 thisArray->m_descriptor->itemDestruct(elemAt(thisArray->m_data, i));
167 free((
void*) thisArray->m_data);
171 *((
void**) &thisArray->m_data) = 0;
172 *((
XsSize*) &thisArray->m_size) = 0;
173 *((
XsSize*) &thisArray->m_reserved) = 0;
192 if (count > thisArray->m_reserved)
196 if (thisArray->m_data)
203 if (thisArray->m_descriptor->itemDestruct)
204 for (i = count; i < thisArray->m_size; ++i)
205 thisArray->m_descriptor->itemDestruct(elemAt(thisArray->m_data, i));
209 if (thisArray->m_descriptor->rawCopy)
210 thisArray->m_descriptor->rawCopy(thisArray->m_data, src, count, thisArray->m_descriptor->itemSize);
213 for (i = 0; i < count; ++i)
214 thisArray->m_descriptor->itemCopy(elemAt(thisArray->m_data, i), elemAt(src, i));
218 *((
XsSize*) &thisArray->m_size) = count;
230 if (thisArray->m_size == count)
232 if (thisArray->m_size == 0)
237 if (count < thisArray->m_size)
242 if (count > thisArray->m_reserved)
244 *((
XsSize*) &thisArray->m_size) = count;
262 if (count && count <= thisArray->m_reserved)
265 if (count < thisArray->m_size)
266 count = thisArray->m_size;
268 if (count == thisArray->m_reserved)
283 *((
XsSize*) &tmp.m_reserved) = count;
286 *((
void**) &tmp.m_data) = malloc(tmp.m_reserved * elemSize(thisArray));
292 if (thisArray->m_descriptor->itemConstruct)
293 for (i = 0; i < tmp.m_reserved; ++i)
294 thisArray->m_descriptor->itemConstruct(elemAt(tmp.m_data, i));
296 for (i = 0; i < thisArray->m_size; ++i)
297 thisArray->m_descriptor->itemSwap(elemAt(thisArray->m_data, i), elemAt(tmp.m_data, i));
310 if (srcArray == thisArray)
325 if (otherArray->m_size == 0)
328 if (otherArray == thisArray)
330 if (thisArray->m_size + thisArray->m_size > thisArray->m_reserved)
333 if (thisArray->m_descriptor->rawCopy)
334 thisArray->m_descriptor->rawCopy(elemAt(thisArray->m_data, thisArray->m_size), thisArray->m_data, thisArray->m_size, thisArray->m_descriptor->itemSize);
337 for (i = 0; i < thisArray->m_size; ++i)
338 thisArray->m_descriptor->itemCopy(elemAt(thisArray->m_data, i + thisArray->m_size), elemAt(thisArray->m_data, i));
341 *((
XsSize*) &thisArray->m_size) = thisArray->m_size + thisArray->m_size;
345 if (thisArray->m_size == 0)
351 if (thisArray->m_size + otherArray->m_size > thisArray->m_reserved)
354 if (thisArray->m_descriptor->rawCopy)
355 thisArray->m_descriptor->rawCopy(elemAt(thisArray->m_data, thisArray->m_size), otherArray->m_data, otherArray->m_size, thisArray->m_descriptor->itemSize);
358 for (i = 0; i < otherArray->m_size; ++i)
359 thisArray->m_descriptor->itemCopy(elemAt(thisArray->m_data, i + thisArray->m_size), elemAt(otherArray->m_data, i));
362 *((
XsSize*) &thisArray->m_size) = thisArray->m_size + otherArray->m_size;
377 if (thisArray->m_size + count > thisArray->m_reserved)
381 if (index > thisArray->m_size)
382 index = thisArray->m_size;
385 for (i = thisArray->m_size - 1; i >= index && i < thisArray->m_size; --i)
386 thisArray->m_descriptor->itemSwap(elemAt(thisArray->m_data, i), elemAt(thisArray->m_data, i +
d));
389 if (thisArray->m_descriptor->rawCopy)
390 thisArray->m_descriptor->rawCopy(elemAt(thisArray->m_data, index), src, count, thisArray->m_descriptor->itemSize);
393 for (
s = 0;
s < count; ++
s)
394 thisArray->m_descriptor->itemCopy(elemAt(thisArray->m_data,
s + index), elemAt(src,
s));
398 *((
XsSize*) &thisArray->m_size) = thisArray->m_size + count;
413 if (!aArray->m_data && !bArray->m_data)
419 *((
void**) &tmp.m_data) = aArray->m_data;
420 *((
void**) &aArray->m_data) = bArray->m_data;
421 *((
void**) &bArray->m_data) = tmp.m_data;
423 *((
XsSize*) &tmp.m_size) = aArray->m_size;
424 *((
XsSize*) &aArray->m_size) = bArray->m_size;
425 *((
XsSize*) &bArray->m_size) = tmp.m_size;
427 *((
XsSize*) &tmp.m_reserved) = aArray->m_reserved;
428 *((
XsSize*) &aArray->m_reserved) = bArray->m_reserved;
429 *((
XsSize*) &bArray->m_reserved) = tmp.m_reserved;
431 *((
XsSize*) &tmp.m_flags) = aArray->m_flags;
432 *((
XsSize*) &aArray->m_flags) = bArray->m_flags;
433 *((
XsSize*) &bArray->m_flags) = tmp.m_flags;
439 assert(aArray->m_size == bArray->m_size);
440 for (i = 0; i < aArray->m_size; ++i)
441 aArray->m_descriptor->itemSwap(elemAtX(aArray->m_data, i, aArray), elemAtX(bArray->m_data, i, bArray));
453 if (count == 0 || index >= thisArray->m_size)
456 if (count + index > thisArray->m_size)
457 count = thisArray->m_size - index;
459 newCount = thisArray->m_size - count;
462 for (i = index; i < newCount; ++i)
463 thisArray->m_descriptor->itemSwap(elemAt(thisArray->m_data, i), elemAt(thisArray->m_data, i + count));
465 *((
XsSize*) &thisArray->m_size) = newCount;
485 if (aArray == bArray)
488 if (aArray->m_size != bArray->m_size)
489 return (aArray->m_size < bArray->m_size) ? -1 : 1;
491 assert(aArray->m_descriptor->itemCompare);
493 for (i = 0; i < aArray->m_size; ++i)
495 int r = aArray->m_descriptor->itemCompare(elemAtX(aArray->m_data, i, aArray), elemAtX(bArray->m_data, i, bArray));
520 if (aArray == bArray)
523 if (aArray->m_size != bArray->m_size)
524 return (aArray->m_size < bArray->m_size) ? -1 : 1;
528 for (i = 0; i < aArray->m_size; ++i)
530 int r = predicate(elemAtX(aArray->m_data, i, aArray), elemAtX(bArray->m_data, i, bArray));
555 if (aArray == bArray)
558 if (aArray->m_size != bArray->m_size)
559 return (aArray->m_size < bArray->m_size) ? -1 : 1;
561 for (n = 0; n < aArray->m_size; ++n)
564 for (m = 0; m < bArray->m_size; ++m)
566 if (aArray->m_descriptor->itemCompare(elemAtX(aArray->m_data, n, aArray), elemAtX(bArray->m_data, m, bArray)) == 0)
590 assert(thisArray->m_descriptor->itemCompare);
592 for (i = 0; i < thisArray->m_size; ++i)
593 if (!thisArray->m_descriptor->itemCompare(elemAt(thisArray->m_data, i), needle))
594 return (ptrdiff_t) i;
614 for (i = 0; i < thisArray->m_size; ++i)
615 if (!predicate(elemAt(thisArray->m_data, i), needle))
616 return (ptrdiff_t) i;
628 if (index >= thisArray->m_size)
630 return elemAt(thisArray->m_data, index);
641 if (index >= thisArray->m_size)
643 return elemAt(thisArray->m_data, index);
653 if (thisArray->m_size > 1)
655 for (i = 0; i < thisArray->m_size - 1; ++i)
657 for (j = thisArray->m_size - 1; j > i; --j)
659 if (!thisArray->m_descriptor->itemCompare(elemAt(thisArray->m_data, i), elemAt(thisArray->m_data, j)))
674 if (thisArray->m_size > 1)
676 for (i = 0; i < thisArray->m_size - 1; ++i)
678 for (j = thisArray->m_size - 1; j > i; --j)
680 if (!predicate(elemAt(thisArray->m_data, i), elemAt(thisArray->m_data, j)))
696 return (thisArray->m_size == 0) || (thisArray->m_data == 0) || (thisArray->m_flags &
XSDF_Empty);
709 memcpy(to, from, count * iSize);
719 qsort(thisArray->m_data, thisArray->m_size, thisArray->m_descriptor->itemSize, thisArray->m_descriptor->itemCompare);
730 half = thisArray->m_size >> 1;
731 for (i = 0; i < half; ++i)
732 thisArray->m_descriptor->itemSwap(elemAt(thisArray->m_data, i), elemAt(thisArray->m_data, (thisArray->m_size - 1) - i));