Allow non-nullable OffsetTo<> to non-Null'able objects

This commit is contained in:
Behdad Esfahbod 2018-11-22 18:07:36 -05:00
parent fa9f585ec5
commit 4d4fd64ff4

View File

@ -231,17 +231,31 @@ struct FixedVersion
* Use: (base+offset) * Use: (base+offset)
*/ */
template <typename Type, bool has_null>
struct _hb_has_null
{
static inline const Type *get_null (void) { return nullptr; }
static inline Type *get_crap (void) { return nullptr; }
};
template <typename Type>
struct _hb_has_null<Type, true>
{
static inline const Type *get_null (void) { return &Null(Type); }
static inline Type *get_crap (void) { return &Crap(Type); }
};
template <typename Type, typename OffsetType=HBUINT16, bool has_null=true> template <typename Type, typename OffsetType=HBUINT16, bool has_null=true>
struct OffsetTo : Offset<OffsetType, has_null> struct OffsetTo : Offset<OffsetType, has_null>
{ {
inline const Type& operator () (const void *base) const inline const Type& operator () (const void *base) const
{ {
if (unlikely (this->is_null ())) return Null (Type); if (unlikely (this->is_null ())) return *_hb_has_null<Type, has_null>::get_null ();
return StructAtOffset<const Type> (base, *this); return StructAtOffset<const Type> (base, *this);
} }
inline Type& operator () (void *base) const inline Type& operator () (void *base) const
{ {
if (unlikely (this->is_null ())) return Crap (Type); if (unlikely (this->is_null ())) return Crap (Type);
if (unlikely (this->is_null ())) return *_hb_has_null<Type, has_null>::get_crap ();
return StructAtOffset<Type> (base, *this); return StructAtOffset<Type> (base, *this);
} }