void NUMvector_insert (long elementSize, void **v, long lo, long *hi, long position) { try { char *result; if (! *v) { result = reinterpret_cast <char *> (NUMvector (elementSize, lo, lo)); *hi = lo; Melder_assert (position == lo); } else { result = reinterpret_cast <char *> (NUMvector (elementSize, lo, *hi + 1)); Melder_assert (position >= lo && position <= *hi + 1); NUMvector_copyElements (elementSize, *v, result, lo, position - 1); NUMvector_copyElements (elementSize, *v, result + elementSize, position, *hi); NUMvector_free (elementSize, *v, lo); (*hi) ++; } *v = result; } catch (MelderError) { Melder_throw (U"Vector: element not inserted."); } }
void * NUMvector_copy (long elementSize, void *v, long lo, long hi) { try { if (! v) return nullptr; char *result = reinterpret_cast <char *> (NUMvector (elementSize, lo, hi)); long offset = lo * elementSize; memcpy (result + offset, (char *) v + offset, (hi - lo + 1) * elementSize); return result; } catch (MelderError) { Melder_throw (U"Vector of elements not copied."); } }
void NUMvector_append (long elementSize, void **v, long lo, long *hi) { try { char *result; if (! *v) { result = reinterpret_cast <char *> (NUMvector (elementSize, lo, lo)); *hi = lo; } else { long offset = lo * elementSize; for (;;) { // not very infinite: 99.999 % of the time once, 0.001 % twice result = reinterpret_cast <char *> (Melder_realloc ((char *) *v + offset, (*hi - lo + 2) * elementSize)); if ((result -= offset) != nullptr) break; // this will normally succeed at the first try (void) Melder_realloc_f (result + offset, 1); // make "sure" that the second try will succeed } (*hi) ++; memset (result + *hi * elementSize, 0, elementSize); // initialize the new element to zeroes } *v = result; } catch (MelderError) { Melder_throw (U"Vector: element not appended."); } }
static void NUMvector_extendNumberOfElements (long elementSize, void **v, long lo, long *hi, long extraDemand) { try { char *result; if (! *v) { long newhi = lo + extraDemand - 1; result = reinterpret_cast <char *> (NUMvector (elementSize, lo, newhi)); *hi = newhi; } else { long offset = lo * elementSize; for (;;) { // not very infinite: 99.999 % of the time once, 0.001 % twice result = reinterpret_cast <char *> (Melder_realloc ((char *) *v + offset, (*hi - lo + 1 + extraDemand) * elementSize)); if ((result -= offset)) break; // this will normally succeed at the first try (void) Melder_realloc_f (result + offset, 1); // ??make "sure" that the second try will succeed } (*hi) += extraDemand; memset (result + *hi * elementSize, 0, elementSize); // initialize the new elements to zeroes } *v = result; } catch (MelderError) { Melder_throw (U"Vector: size not extended."); } }