[serializer] Accept pointer & reference in more methods

This commit is contained in:
Behdad Esfahbod 2019-05-07 17:23:46 -07:00
parent 839618de3b
commit 5c0f62adc9

View File

@ -324,14 +324,11 @@ struct hb_serialize_context_t
}
template <typename Type>
Type *start_embed (const Type &_ HB_UNUSED) const
{ return start_embed<Type> (); }
Type *start_embed (const Type *obj HB_UNUSED = nullptr) const
{ return reinterpret_cast<Type *> (this->head); }
template <typename Type>
Type *start_embed (const Type *_ HB_UNUSED = nullptr) const
{
Type *ret = reinterpret_cast<Type *> (this->head);
return ret;
}
Type *start_embed (const Type &obj) const
{ return start_embed (hb_addressof (obj)); }
/* Following two functions exist to allow setting breakpoint on. */
void err_ran_out_of_room () { this->ran_out_of_room = true; }
@ -391,25 +388,37 @@ struct hb_serialize_context_t
template <typename Type, typename ...Ts>
Type *copy (const Type &src, Ts &&...ds)
{ return _copy (src, hb_prioritize, hb_forward<Ts> (ds)...); }
template <typename Type, typename ...Ts>
Type *copy (const Type *src, Ts &&...ds)
{ return copy (*src, hb_forward<Ts> (ds)...); }
template <typename Type>
hb_serialize_context_t& operator << (const Type &obj) & { embed (obj); return *this; }
template <typename Type>
Type *extend_size (Type &obj, unsigned int size)
Type *extend_size (Type *obj, unsigned int size)
{
assert (this->start <= (char *) &obj);
assert ((char *) &obj <= this->head);
assert ((char *) &obj + size >= this->head);
if (unlikely (!this->allocate_size<Type> (((char *) &obj) + size - this->head))) return nullptr;
return reinterpret_cast<Type *> (&obj);
assert (this->start <= (char *) obj);
assert ((char *) obj <= this->head);
assert ((char *) obj + size >= this->head);
if (unlikely (!this->allocate_size<Type> (((char *) obj) + size - this->head))) return nullptr;
return reinterpret_cast<Type *> (obj);
}
template <typename Type>
Type *extend_size (Type &obj, unsigned int size)
{ return extend_size (hb_addressof (obj), size); }
template <typename Type>
Type *extend_min (Type &obj) { return extend_size (obj, obj.min_size); }
Type *extend_min (Type *obj) { return extend_size (obj, obj->min_size); }
template <typename Type>
Type *extend_min (Type &obj) { return extend_min (hb_addressof (obj)); }
template <typename Type, typename ...Ts>
Type *extend (Type &obj, Ts &&...ds) { return extend_size (obj, obj.get_size (hb_forward<Ts> (ds)...)); }
Type *extend (Type *obj, Ts &&...ds)
{ return extend_size (obj, obj->get_size (hb_forward<Ts> (ds)...)); }
template <typename Type, typename ...Ts>
Type *extend (Type &obj, Ts &&...ds)
{ return extend (hb_addressof (obj), hb_forward<Ts> (ds)...); }
/* Output routines. */
hb_bytes_t copy_bytes () const