[vector] Move semantics in vector remove()

This commit is contained in:
Behdad Esfahbod 2022-01-15 18:06:03 -07:00
parent 5946e945d5
commit c58bfa35fb
1 changed files with 19 additions and 4 deletions

View File

@ -271,6 +271,23 @@ struct hb_vector_t
}
}
template <typename T = Type,
hb_enable_if (std::is_trivially_copy_assignable<T>::value)>
void
shift_down_vector (unsigned i)
{
memmove (static_cast<void *> (&arrayZ[i - 1]),
static_cast<void *> (&arrayZ[i]),
(length - i) * sizeof (Type));
}
template <typename T = Type,
hb_enable_if (!std::is_trivially_copy_assignable<T>::value)>
void
shift_down_vector (unsigned i)
{
for (; i < length; i++)
arrayZ[i - 1] = std::move (arrayZ[i]);
}
/* Allocate for size but don't adjust length. */
bool alloc (unsigned int size)
@ -335,10 +352,8 @@ struct hb_vector_t
{
if (unlikely (i >= length))
return;
// XXX Swap / move / destruct.
memmove (static_cast<void *> (&arrayZ[i]),
static_cast<void *> (&arrayZ[i + 1]),
(length - i - 1) * sizeof (Type));
arrayZ[i].~Type ();
shift_down_vector (i + 1);
length--;
}