[vector] Add emplacing push implementation
This commit is contained in:
parent
25393288f0
commit
30ba9a39e2
|
@ -189,12 +189,14 @@ struct hb_vector_t : std::conditional<sorted, hb_vector_t<Type, false>, hb_empty
|
||||||
{
|
{
|
||||||
if (unlikely (!resize (length + 1)))
|
if (unlikely (!resize (length + 1)))
|
||||||
return &Crap (Type);
|
return &Crap (Type);
|
||||||
return &arrayZ[length - 1];
|
return std::addressof (arrayZ[length - 1]);
|
||||||
}
|
}
|
||||||
template <typename T>
|
template <typename T,
|
||||||
|
typename T2 = Type,
|
||||||
|
hb_enable_if (!std::is_copy_constructible<T2>::value &&
|
||||||
|
std::is_copy_assignable<T>::value)>
|
||||||
Type *push (T&& v)
|
Type *push (T&& v)
|
||||||
{
|
{
|
||||||
/* TODO Emplace? */
|
|
||||||
Type *p = push ();
|
Type *p = push ();
|
||||||
if (p == &Crap (Type))
|
if (p == &Crap (Type))
|
||||||
// If push failed to allocate then don't copy v, since this may cause
|
// If push failed to allocate then don't copy v, since this may cause
|
||||||
|
@ -204,6 +206,22 @@ struct hb_vector_t : std::conditional<sorted, hb_vector_t<Type, false>, hb_empty
|
||||||
*p = std::forward<T> (v);
|
*p = std::forward<T> (v);
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
template <typename T,
|
||||||
|
typename T2 = Type,
|
||||||
|
hb_enable_if (std::is_copy_constructible<T2>::value)>
|
||||||
|
Type *push (T&& v)
|
||||||
|
{
|
||||||
|
if (unlikely (!alloc (length + 1)))
|
||||||
|
// If push failed to allocate then don't copy v, since this may cause
|
||||||
|
// the created copy to leak memory since we won't have stored a
|
||||||
|
// reference to it.
|
||||||
|
return &Crap (Type);
|
||||||
|
|
||||||
|
/* Emplace. */
|
||||||
|
length++;
|
||||||
|
Type *p = std::addressof (arrayZ[length - 1]);
|
||||||
|
return new (p) Type (std::forward<T> (v));
|
||||||
|
}
|
||||||
|
|
||||||
bool in_error () const { return allocated < 0; }
|
bool in_error () const { return allocated < 0; }
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue