src/hb-aat-layout-common.hh | 6 ++++-- src/hb-atomic.hh | 2 +- src/hb-blob.hh | 4 ++-- src/hb-common.cc | 2 +- src/hb-dsalgs.hh | 2 ++ src/hb-ft.cc | 2 +- src/hb-null.hh | 30 +++++++++++++++++++++++++----- src/hb-open-file.hh | 4 +--- src/hb-open-type.hh | 7 +++++++ src/hb-ot-cmap-table.hh | 1 + src/hb-static.cc | 4 +++- src/hb-vector.hh | 11 ++++++++--- src/hb.hh | 3 +++ 13 files changed, 59 insertions(+), 19 deletions(-)
New commits: commit bb2a2065080a3099eb0dc82d1df0891ad2601316 Author: Behdad Esfahbod <beh...@behdad.org> Date: Sat Nov 24 00:31:40 2018 -0500 Assert that item-type of arrays have static size diff --git a/src/hb-dsalgs.hh b/src/hb-dsalgs.hh index da8aad01..c133a532 100644 --- a/src/hb-dsalgs.hh +++ b/src/hb-dsalgs.hh @@ -562,6 +562,8 @@ struct hb_bytes_t template <typename Type> struct hb_array_t { + static_assert ((bool) (unsigned) hb_static_size (Type), ""); + inline hb_array_t (void) : arrayZ (nullptr), len (0) {} inline hb_array_t (Type *array_, unsigned int len_) : arrayZ (array_), len (len_) {} diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index 17bc9c5b..1c7b738b 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -345,6 +345,8 @@ static inline Type& operator + (Base &base, OffsetTo<Type, OffsetType, has_null> template <typename Type> struct UnsizedArrayOf { + static_assert ((bool) (unsigned) hb_static_size (Type), ""); + enum { item_size = Type::static_size }; HB_NO_CREATE_COPY_ASSIGN_TEMPLATE (UnsizedArrayOf, Type); @@ -449,6 +451,8 @@ struct UnsizedOffsetListOf : UnsizedOffsetArrayOf<Type, OffsetType, has_null> template <typename Type, typename LenType=HBUINT16> struct ArrayOf { + static_assert ((bool) (unsigned) hb_static_size (Type), ""); + enum { item_size = Type::static_size }; HB_NO_CREATE_COPY_ASSIGN_TEMPLATE2 (ArrayOf, Type, LenType); diff --git a/src/hb-vector.hh b/src/hb-vector.hh index 926f0054..c1d7f946 100644 --- a/src/hb-vector.hh +++ b/src/hb-vector.hh @@ -34,6 +34,8 @@ template <typename Type, unsigned int PreallocedCount=8> struct hb_vector_t { + static_assert ((bool) (unsigned) hb_static_size (Type), ""); + typedef Type ItemType; enum { item_size = sizeof (Type) }; commit 690d9eb83d3421b397b0cb824cd768d6d73cbf12 Author: Behdad Esfahbod <beh...@behdad.org> Date: Sat Nov 24 00:29:22 2018 -0500 [vector] Rename diff --git a/src/hb-vector.hh b/src/hb-vector.hh index c1f680ed..926f0054 100644 --- a/src/hb-vector.hh +++ b/src/hb-vector.hh @@ -31,13 +31,13 @@ #include "hb.hh" -template <typename Type, unsigned int StaticSize=8> +template <typename Type, unsigned int PreallocedCount=8> struct hb_vector_t { typedef Type ItemType; enum { item_size = sizeof (Type) }; - HB_NO_COPY_ASSIGN_TEMPLATE2 (hb_vector_t, Type, StaticSize); + HB_NO_COPY_ASSIGN_TEMPLATE2 (hb_vector_t, Type, PreallocedCount); inline hb_vector_t (void) { init (); } inline ~hb_vector_t (void) { fini (); } @@ -45,7 +45,7 @@ struct hb_vector_t private: unsigned int allocated; /* == 0 means allocation failed. */ Type *arrayZ_; - Type static_array[StaticSize]; + Type static_array[PreallocedCount]; public: void init (void) commit ba38378fd4374f3d44bdc9aa0de902401b60b13d Author: Behdad Esfahbod <beh...@behdad.org> Date: Sat Nov 24 00:27:57 2018 -0500 [aat] Minor diff --git a/src/hb-aat-layout-common.hh b/src/hb-aat-layout-common.hh index 7340996e..2c09a796 100644 --- a/src/hb-aat-layout-common.hh +++ b/src/hb-aat-layout-common.hh @@ -436,8 +436,10 @@ struct Entry * which ensures that data has a simple sanitize(). To be determined * if I need to remove that as well. * - * XXX Because we are a template, our DEFINE_SIZE_STATIC assertion - * wouldn't be checked. */ + * HOWEVER! Because we are a template, our DEFINE_SIZE_STATIC + * assertion wouldn't be checked, hence the line below. */ + static_assert (T::static_size, ""); + return_trace (c->check_struct (this)); } commit 39b9d63b014380d421cc9b94a49dd411c7a5aabf Author: Behdad Esfahbod <beh...@behdad.org> Date: Sat Nov 24 00:25:40 2018 -0500 Add hb_static_size(T) diff --git a/src/hb-null.hh b/src/hb-null.hh index c0cefc9a..1583d5b9 100644 --- a/src/hb-null.hh +++ b/src/hb-null.hh @@ -44,6 +44,7 @@ /* The hard way... * https://stackoverflow.com/questions/7776448/sfinae-tried-with-bool-gives-compiler-error-template-argument-tvalue-invol */ + template<bool> struct _hb_bool_type {}; template <typename T, typename B> @@ -58,6 +59,24 @@ struct hb_null_size { enum { value = _hb_null_size<T, _hb_bool_type<true> >::value }; }; #define hb_null_size(T) hb_null_size<T>::value +/* This doesn't belong here, but since is copy/paste from above, put it here. */ + +template <typename T, typename B> +struct _hb_static_size +{ enum { value = sizeof (T) }; }; +template <typename T> +struct _hb_static_size<T, _hb_bool_type<(bool) (1 + (unsigned int) T::min_size)> > +{ enum { value = T::static_size }; }; + +template <typename T> +struct hb_static_size +{ enum { value = _hb_static_size<T, _hb_bool_type<true> >::value }; }; +#define hb_static_size(T) hb_static_size<T>::value + + +/* + * Null() + */ extern HB_INTERNAL hb_vector_size_impl_t const _hb_NullPool[(HB_NULL_POOL_SIZE + sizeof (hb_vector_size_impl_t) - 1) / sizeof (hb_vector_size_impl_t)]; commit f99abcc37990a478189dda691d1fdac7b9d51386 Author: Behdad Esfahbod <beh...@behdad.org> Date: Sat Nov 24 00:22:21 2018 -0500 Add template-function convenience macros diff --git a/src/hb-atomic.hh b/src/hb-atomic.hh index 64ed257b..265de126 100644 --- a/src/hb-atomic.hh +++ b/src/hb-atomic.hh @@ -282,7 +282,7 @@ struct hb_atomic_int_t template <typename P> struct hb_atomic_ptr_t { - typedef typename hb_remove_pointer<P>::value T; + typedef typename hb_remove_pointer (P) T; inline void init (T* v_ = nullptr) { set_relaxed (v_); } inline void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); } diff --git a/src/hb-blob.hh b/src/hb-blob.hh index 4f9d8f04..bf2132bd 100644 --- a/src/hb-blob.hh +++ b/src/hb-blob.hh @@ -60,7 +60,7 @@ struct hb_blob_t template <typename Type> inline const Type* as (void) const { - return length < hb_null_size<Type>::value ? &Null(Type) : reinterpret_cast<const Type *> (data); + return length < hb_null_size (Type) ? &Null(Type) : reinterpret_cast<const Type *> (data); } inline hb_bytes_t as_bytes (void) const { @@ -86,7 +86,7 @@ struct hb_blob_t template <typename P> struct hb_blob_ptr_t { - typedef typename hb_remove_pointer<P>::value T; + typedef typename hb_remove_pointer (P) T; inline hb_blob_ptr_t (hb_blob_t *b_ = nullptr) : b (b_) {} inline hb_blob_t * operator = (hb_blob_t *b_) { return b = b_; } diff --git a/src/hb-common.cc b/src/hb-common.cc index b7f9ad68..c3cffccb 100644 --- a/src/hb-common.cc +++ b/src/hb-common.cc @@ -784,7 +784,7 @@ parse_uint32 (const char **pp, const char *end, uint32_t *pv) static void free_static_C_locale (void); #endif -static struct hb_C_locale_lazy_loader_t : hb_lazy_loader_t<hb_remove_pointer<HB_LOCALE_T>::value, +static struct hb_C_locale_lazy_loader_t : hb_lazy_loader_t<hb_remove_pointer (HB_LOCALE_T), hb_C_locale_lazy_loader_t> { static inline HB_LOCALE_T create (void) diff --git a/src/hb-ft.cc b/src/hb-ft.cc index fff0e285..633e0ecd 100644 --- a/src/hb-ft.cc +++ b/src/hb-ft.cc @@ -748,7 +748,7 @@ hb_ft_font_create_referenced (FT_Face ft_face) static void free_static_ft_library (void); #endif -static struct hb_ft_library_lazy_loader_t : hb_lazy_loader_t<hb_remove_pointer<FT_Library>::value, +static struct hb_ft_library_lazy_loader_t : hb_lazy_loader_t<hb_remove_pointer (FT_Library), hb_ft_library_lazy_loader_t> { static inline FT_Library create (void) diff --git a/src/hb-null.hh b/src/hb-null.hh index 58151d72..c0cefc9a 100644 --- a/src/hb-null.hh +++ b/src/hb-null.hh @@ -56,6 +56,7 @@ struct _hb_null_size<T, _hb_bool_type<(bool) (1 + (unsigned int) T::min_size)> > template <typename T> struct hb_null_size { enum { value = _hb_null_size<T, _hb_bool_type<true> >::value }; }; +#define hb_null_size(T) hb_null_size<T>::value extern HB_INTERNAL hb_vector_size_impl_t const _hb_NullPool[(HB_NULL_POOL_SIZE + sizeof (hb_vector_size_impl_t) - 1) / sizeof (hb_vector_size_impl_t)]; @@ -63,10 +64,10 @@ hb_vector_size_impl_t const _hb_NullPool[(HB_NULL_POOL_SIZE + sizeof (hb_vector_ /* Generic nul-content Null objects. */ template <typename Type> static inline Type const & Null (void) { - static_assert (hb_null_size<Type>::value <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE."); + static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE."); return *reinterpret_cast<Type const *> (_hb_NullPool); } -#define Null(Type) Null<typename hb_remove_const<typename hb_remove_reference<Type>::value>::value>() +#define Null(Type) Null<typename hb_remove_const (typename hb_remove_reference (Type))> () /* Specializations for arbitrary-content Null objects expressed in bytes. */ #define DECLARE_NULL_NAMESPACE_BYTES(Namespace, Type) \ @@ -104,12 +105,12 @@ extern HB_INTERNAL /* CRAP pool: Common Region for Access Protection. */ template <typename Type> static inline Type& Crap (void) { - static_assert (hb_null_size<Type>::value <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE."); + static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE."); Type *obj = reinterpret_cast<Type *> (_hb_CrapPool); memcpy (obj, &Null(Type), sizeof (*obj)); return *obj; } -#define Crap(Type) Crap<typename hb_remove_const<typename hb_remove_reference<Type>::value>::value>() +#define Crap(Type) Crap<typename hb_remove_const (typename hb_remove_reference (Type))> () template <typename Type> struct CrapOrNull { @@ -129,7 +130,7 @@ struct CrapOrNull<const Type> { template <typename P> struct hb_nonnull_ptr_t { - typedef typename hb_remove_pointer<P>::value T; + typedef typename hb_remove_pointer (P) T; inline hb_nonnull_ptr_t (T *v_ = nullptr) : v (v_) {} inline T * operator = (T *v_) { return v = v_; } diff --git a/src/hb.hh b/src/hb.hh index bc322a81..c771d1fb 100644 --- a/src/hb.hh +++ b/src/hb.hh @@ -508,10 +508,13 @@ _hb_memalign(void **memptr, size_t alignment, size_t size) /* Some really basic things everyone wants. */ template <typename T> struct hb_remove_const { typedef T value; }; template <typename T> struct hb_remove_const<const T> { typedef T value; }; +#define hb_remove_const(T) hb_remove_const<T>::value template <typename T> struct hb_remove_reference { typedef T value; }; template <typename T> struct hb_remove_reference<T &> { typedef T value; }; +#define hb_remove_reference(T) hb_remove_reference<T>::value template <typename T> struct hb_remove_pointer { typedef T value; }; template <typename T> struct hb_remove_pointer<T *> { typedef T value; }; +#define hb_remove_pointer(T) hb_remove_pointer<T>::value /* Headers we include for everyone. Keep sorted. They express dependency amongst commit ec83b2228e0bbb6df7e7b94dad49db32b041af4a Author: Behdad Esfahbod <beh...@behdad.org> Date: Fri Nov 23 19:58:49 2018 -0500 Add null bytes for CmapSubtableLongGroup diff --git a/src/hb-ot-cmap-table.hh b/src/hb-ot-cmap-table.hh index 4297550f..70373ee8 100644 --- a/src/hb-ot-cmap-table.hh +++ b/src/hb-ot-cmap-table.hh @@ -417,6 +417,7 @@ struct CmapSubtableLongGroup public: DEFINE_SIZE_STATIC (12); }; +DECLARE_NULL_NAMESPACE_BYTES (OT, CmapSubtableLongGroup); template <typename UINT> struct CmapSubtableTrimmed diff --git a/src/hb-static.cc b/src/hb-static.cc index 73d9528e..3ea64024 100644 --- a/src/hb-static.cc +++ b/src/hb-static.cc @@ -27,10 +27,11 @@ #include "hb.hh" #include "hb-open-type.hh" -#include "hb-ot-layout-common.hh" #include "hb-aat-layout-common.hh" +#include "hb-ot-layout-common.hh" #include "hb-face.hh" +#include "hb-ot-cmap-table.hh" #include "hb-ot-head-table.hh" #include "hb-ot-maxp-table.hh" @@ -42,6 +43,7 @@ hb_vector_size_impl_t const _hb_NullPool[(HB_NULL_POOL_SIZE + sizeof (hb_vector_ DEFINE_NULL_NAMESPACE_BYTES (OT, Index) = {0xFF,0xFF}; DEFINE_NULL_NAMESPACE_BYTES (OT, LangSys) = {0x00,0x00, 0xFF,0xFF, 0x00,0x00}; DEFINE_NULL_NAMESPACE_BYTES (OT, RangeRecord) = {0x00,0x01, 0x00,0x00, 0x00, 0x00}; +DEFINE_NULL_NAMESPACE_BYTES (OT, CmapSubtableLongGroup) = {0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00}; /* Hand-coded because Lookup is a template. Sad. */ const unsigned char _hb_Null_AAT_Lookup[2] = {0xFF, 0xFF}; commit e2ffb33a534a427c760dae53d0469eeced4343ba Author: Behdad Esfahbod <beh...@behdad.org> Date: Fri Nov 23 16:24:28 2018 -0500 Remove lsearch for small TableDirectorys diff --git a/src/hb-open-file.hh b/src/hb-open-file.hh index 2ef6d775..cd5f9dbc 100644 --- a/src/hb-open-file.hh +++ b/src/hb-open-file.hh @@ -111,9 +111,7 @@ typedef struct OffsetTable { Tag t; t.set (tag); - /* Linear-search for small tables to work around fonts with unsorted - * table list. */ - int i = tables.len < 64 ? tables.lsearch (t) : tables.bsearch (t); + int i = tables.bsearch (t); if (table_index) *table_index = i == -1 ? (unsigned) Index::NOT_FOUND_INDEX : (unsigned) i; return i != -1; commit 04f7e5536924e7f277d72b8cb9d878239877c331 Author: Behdad Esfahbod <beh...@behdad.org> Date: Fri Nov 23 16:07:43 2018 -0500 [arrays] Add as_array() to hb_vector_t<> diff --git a/src/hb-vector.hh b/src/hb-vector.hh index 7056a5b5..c1f680ed 100644 --- a/src/hb-vector.hh +++ b/src/hb-vector.hh @@ -89,6 +89,9 @@ struct hb_vector_t return arrayZ()[i]; } + inline hb_array_t<Type> as_array (void) { return hb_array_t<Type> (arrayZ(), len); } + inline hb_array_t<const Type> as_array (void) const { return hb_array_t<const Type> (arrayZ(), len); } + template <typename T> inline operator T * (void) { return arrayZ(); } template <typename T> inline operator const T * (void) const { return arrayZ(); } commit c514f65181390ab98b0f738632f71cda31e46b68 Author: Behdad Esfahbod <beh...@behdad.org> Date: Fri Nov 23 16:04:56 2018 -0500 [arrays] Add as_array() to ArrayOf<> diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index f4a9a5e8..17bc9c5b 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -479,6 +479,9 @@ struct ArrayOf inline unsigned int get_size (void) const { return len.static_size + len * Type::static_size; } + inline hb_array_t<Type> as_array (void) { return hb_array_t<Type> (arrayZ, len); } + inline hb_array_t<const Type> as_array (void) const { return hb_array_t<const Type> (arrayZ, len); } + inline bool serialize (hb_serialize_context_t *c, unsigned int items_len) { _______________________________________________ HarfBuzz mailing list HarfBuzz@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/harfbuzz