[array] Optimize serializing copy()
This commit is contained in:
parent
22990fca1d
commit
e333223f26
|
@ -262,7 +262,9 @@ struct hb_array_t : hb_iter_with_fallback_t<hb_array_t<Type>, Type&>
|
||||||
void fini ()
|
void fini ()
|
||||||
{ hb_free ((void *) arrayZ); arrayZ = nullptr; length = 0; }
|
{ hb_free ((void *) arrayZ); arrayZ = nullptr; length = 0; }
|
||||||
|
|
||||||
template <typename hb_serialize_context_t>
|
template <typename hb_serialize_context_t,
|
||||||
|
typename U = Type,
|
||||||
|
hb_enable_if (!(sizeof (U) < sizeof (long long) && hb_is_trivially_copy_assignable(Type)))>
|
||||||
hb_array_t copy (hb_serialize_context_t *c) const
|
hb_array_t copy (hb_serialize_context_t *c) const
|
||||||
{
|
{
|
||||||
TRACE_SERIALIZE (this);
|
TRACE_SERIALIZE (this);
|
||||||
|
@ -273,6 +275,18 @@ struct hb_array_t : hb_iter_with_fallback_t<hb_array_t<Type>, Type&>
|
||||||
return_trace (hb_array_t (out, length));
|
return_trace (hb_array_t (out, length));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename hb_serialize_context_t,
|
||||||
|
typename U = Type,
|
||||||
|
hb_enable_if (sizeof (U) < sizeof (long long) && hb_is_trivially_copy_assignable(Type))>
|
||||||
|
hb_array_t copy (hb_serialize_context_t *c) const
|
||||||
|
{
|
||||||
|
TRACE_SERIALIZE (this);
|
||||||
|
auto* out = c->start_embed (arrayZ);
|
||||||
|
if (unlikely (!c->extend_size (out, get_size ()))) return_trace (hb_array_t ());
|
||||||
|
hb_memcpy (out, arrayZ, length);
|
||||||
|
return_trace (hb_array_t (out, length));
|
||||||
|
}
|
||||||
|
|
||||||
template <typename hb_sanitize_context_t>
|
template <typename hb_sanitize_context_t>
|
||||||
bool sanitize (hb_sanitize_context_t *c) const
|
bool sanitize (hb_sanitize_context_t *c) const
|
||||||
{ return c->check_array (arrayZ, length); }
|
{ return c->check_array (arrayZ, length); }
|
||||||
|
|
|
@ -268,12 +268,13 @@ struct hb_vector_t
|
||||||
{
|
{
|
||||||
length = other.length;
|
length = other.length;
|
||||||
#ifndef HB_OPTIMIZE_SIZE
|
#ifndef HB_OPTIMIZE_SIZE
|
||||||
/* This runs faster because of alignment. */
|
if (sizeof (T) >= sizeof (long long))
|
||||||
for (unsigned i = 0; i < length; i++)
|
/* This runs faster because of alignment. */
|
||||||
arrayZ[i] = other.arrayZ[i];
|
for (unsigned i = 0; i < length; i++)
|
||||||
#else
|
arrayZ[i] = other.arrayZ[i];
|
||||||
hb_memcpy ((void *) arrayZ, (const void *) other.arrayZ, length * item_size);
|
else
|
||||||
#endif
|
#endif
|
||||||
|
hb_memcpy ((void *) arrayZ, (const void *) other.arrayZ, length * item_size);
|
||||||
}
|
}
|
||||||
template <typename T = Type,
|
template <typename T = Type,
|
||||||
hb_enable_if (!hb_is_trivially_copyable (T) &&
|
hb_enable_if (!hb_is_trivially_copyable (T) &&
|
||||||
|
|
Loading…
Reference in New Issue