[serializer] Accept exact type in serialize_subset/copy()

This commit is contained in:
Behdad Esfahbod 2019-05-02 14:22:31 -07:00
parent 88fdeeecc0
commit 88a4147240
4 changed files with 20 additions and 37 deletions

View File

@ -284,11 +284,11 @@ struct OffsetTo : Offset<OffsetType, has_null>
return * (Type *) Offset<OffsetType>::serialize (c, base); return * (Type *) Offset<OffsetType>::serialize (c, base);
} }
template <typename T, typename ...Ts> template <typename ...Ts>
bool serialize_subset (hb_subset_context_t *c, const T &src, const void *base, Ts &&...ds) bool serialize_subset (hb_subset_context_t *c, const Type &src, const void *base, Ts &&...ds)
{ {
*this = 0; *this = 0;
if (has_null && &src == &Null (T)) if (has_null && &src == &Null (Type))
return false; return false;
auto *s = c->serializer; auto *s = c->serializer;
@ -305,11 +305,11 @@ struct OffsetTo : Offset<OffsetType, has_null>
return ret; return ret;
} }
template <typename T, typename ...Ts> template <typename ...Ts>
bool serialize_copy (hb_serialize_context_t *c, const T &src, const void *base, Ts &&...ds) bool serialize_copy (hb_serialize_context_t *c, const Type &src, const void *base, Ts &&...ds)
{ {
*this = 0; *this = 0;
if (has_null && &src == &Null (T)) if (has_null && &src == &Null (Type))
return false; return false;
c->push (); c->push ();

View File

@ -715,23 +715,6 @@ struct Lookup
return_trace (true); return_trace (true);
} }
/* Older compilers need this to NOT be locally defined in a function. */
template <typename TSubTable>
struct SubTableSubsetWrapper
{
SubTableSubsetWrapper (const TSubTable &subtable_,
unsigned int lookup_type_) :
subtable (subtable_),
lookup_type (lookup_type_) {}
bool subset (hb_subset_context_t *c) const
{ return subtable.dispatch (c, lookup_type); }
private:
const TSubTable &subtable;
unsigned int lookup_type;
};
template <typename TSubTable> template <typename TSubTable>
bool subset (hb_subset_context_t *c) const bool subset (hb_subset_context_t *c) const
{ {
@ -746,23 +729,11 @@ struct Lookup
OffsetArrayOf<TSubTable>& out_subtables = out->get_subtables<TSubTable> (); OffsetArrayOf<TSubTable>& out_subtables = out->get_subtables<TSubTable> ();
unsigned int count = subTable.len; unsigned int count = subTable.len;
for (unsigned int i = 0; i < count; i++) for (unsigned int i = 0; i < count; i++)
{ out_subtables[i].serialize_subset (c, this+subtables[i], out, get_type ());
SubTableSubsetWrapper<TSubTable> wrapper (this+subtables[i], get_type ());
out_subtables[i].serialize_subset (c, wrapper, out);
}
return_trace (true); return_trace (true);
} }
/* Older compilers need this to NOT be locally defined in a function. */
template <typename TSubTable>
struct SubTableSanitizeWrapper : TSubTable
{
bool sanitize (hb_sanitize_context_t *c, unsigned int lookup_type) const
{ return this->dispatch (c, lookup_type); }
};
template <typename TSubTable> template <typename TSubTable>
bool sanitize (hb_sanitize_context_t *c) const bool sanitize (hb_sanitize_context_t *c) const
{ {
@ -774,7 +745,7 @@ struct Lookup
if (!markFilteringSet.sanitize (c)) return_trace (false); if (!markFilteringSet.sanitize (c)) return_trace (false);
} }
if (unlikely (!CastR<OffsetArrayOf<SubTableSanitizeWrapper<TSubTable>>> (subTable) if (unlikely (!CastR<OffsetArrayOf<TSubTable>> (subTable)
.sanitize (c, this, get_type ()))) .sanitize (c, this, get_type ())))
return_trace (false); return_trace (false);

View File

@ -1525,6 +1525,12 @@ struct PosLookupSubTable
} }
} }
/* XXX Remove? */
bool subset (hb_subset_context_t *c, unsigned lookup_type) const
{ return dispatch (c, lookup_type); }
bool sanitize (hb_sanitize_context_t *c, unsigned lookup_type) const
{ return dispatch (c, lookup_type); }
protected: protected:
union { union {
SinglePos single; SinglePos single;

View File

@ -1170,6 +1170,12 @@ struct SubstLookupSubTable
} }
} }
/* XXX Remove? */
bool subset (hb_subset_context_t *c, unsigned lookup_type) const
{ return dispatch (c, lookup_type); }
bool sanitize (hb_sanitize_context_t *c, unsigned lookup_type) const
{ return dispatch (c, lookup_type); }
protected: protected:
union { union {
SingleSubst single; SingleSubst single;