Use type aliasing for meta-functions, ie. those returning a type

This commit is contained in:
Behdad Esfahbod 2019-04-16 16:45:53 -04:00
parent 1ce11b4437
commit 54ece299bc
9 changed files with 19 additions and 18 deletions

View File

@ -42,7 +42,8 @@ struct
//{ return hb_deref_pointer (v).hash (); } //{ return hb_deref_pointer (v).hash (); }
/* Instead, the following ugly soution: */ /* Instead, the following ugly soution: */
template <typename T, template <typename T,
hb_enable_if (!hb_is_integer (hb_remove_const (hb_remove_reference (T))) && !hb_is_pointer (T))> hb_enable_if (!hb_is_integer (hb_remove_const<hb_remove_reference<T> >) &&
!hb_is_pointer (T))>
uint32_t operator () (T&& v) const { return v.hash (); } uint32_t operator () (T&& v) const { return v.hash (); }
template <typename T> template <typename T>

View File

@ -47,13 +47,13 @@ struct hb_array_t : hb_iter_with_fallback_t<hb_array_t<Type>, Type&>
hb_iter_with_fallback_t<hb_array_t<Type>, Type&> (), hb_iter_with_fallback_t<hb_array_t<Type>, Type&> (),
arrayZ (o.arrayZ), length (o.length) {} arrayZ (o.arrayZ), length (o.length) {}
template <typename U = Type, hb_enable_if (hb_is_const (U))> template <typename U = Type, hb_enable_if (hb_is_const (U))>
hb_array_t (const hb_array_t<hb_remove_const (Type)> &o) : arrayZ (o.arrayZ), length (o.length) {} hb_array_t (const hb_array_t<hb_remove_const<Type> > &o) : arrayZ (o.arrayZ), length (o.length) {}
hb_array_t (Type *array_, unsigned int length_) : arrayZ (array_), length (length_) {} hb_array_t (Type *array_, unsigned int length_) : arrayZ (array_), length (length_) {}
template <unsigned int length_> hb_array_t (Type (&array_)[length_]) : arrayZ (array_), length (length_) {} template <unsigned int length_> hb_array_t (Type (&array_)[length_]) : arrayZ (array_), length (length_) {}
template <typename U = Type, hb_enable_if (hb_is_const (U))> template <typename U = Type, hb_enable_if (hb_is_const (U))>
hb_array_t& operator = (const hb_array_t<hb_remove_const (Type)> &o) hb_array_t& operator = (const hb_array_t<hb_remove_const<Type> > &o)
{ arrayZ = o.arrayZ; length = o.length; return *this; } { arrayZ = o.arrayZ; length = o.length; return *this; }
hb_array_t& operator = (const hb_array_t &o) hb_array_t& operator = (const hb_array_t &o)
{ arrayZ = o.arrayZ; length = o.length; return *this; } { arrayZ = o.arrayZ; length = o.length; return *this; }
@ -214,7 +214,7 @@ struct hb_sorted_array_t :
hb_sorted_array_t () : hb_array_t<Type> () {} hb_sorted_array_t () : hb_array_t<Type> () {}
hb_sorted_array_t (const hb_array_t<Type> &o) : hb_array_t<Type> (o) {} hb_sorted_array_t (const hb_array_t<Type> &o) : hb_array_t<Type> (o) {}
template <typename U = Type, hb_enable_if (hb_is_const (U))> template <typename U = Type, hb_enable_if (hb_is_const (U))>
hb_sorted_array_t (const hb_sorted_array_t<hb_remove_const (Type)> &o) : hb_array_t<Type> (o) {} hb_sorted_array_t (const hb_sorted_array_t<hb_remove_const<Type> > &o) : hb_array_t<Type> (o) {}
hb_sorted_array_t (Type *array_, unsigned int length_) : hb_array_t<Type> (array_, length_) {} hb_sorted_array_t (Type *array_, unsigned int length_) : hb_array_t<Type> (array_, length_) {}
template <unsigned int length_> hb_sorted_array_t (Type (&array_)[length_]) : hb_array_t<Type> (array_) {} template <unsigned int length_> hb_sorted_array_t (Type (&array_)[length_]) : hb_array_t<Type> (array_) {}

View File

@ -283,7 +283,7 @@ struct hb_atomic_int_t
template <typename P> template <typename P>
struct hb_atomic_ptr_t struct hb_atomic_ptr_t
{ {
typedef hb_remove_pointer (P) T; typedef hb_remove_pointer<P> T;
void init (T* v_ = nullptr) { set_relaxed (v_); } void init (T* v_ = nullptr) { set_relaxed (v_); }
void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); } void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }

View File

@ -81,7 +81,7 @@ struct hb_blob_t
template <typename P> template <typename P>
struct hb_blob_ptr_t struct hb_blob_ptr_t
{ {
typedef hb_remove_pointer (P) T; typedef hb_remove_pointer<P> T;
hb_blob_ptr_t (hb_blob_t *b_ = nullptr) : b (b_) {} hb_blob_ptr_t (hb_blob_t *b_ = nullptr) : b (b_) {}
hb_blob_t * operator = (hb_blob_t *b_) { return b = b_; } hb_blob_t * operator = (hb_blob_t *b_) { return b = b_; }

View File

@ -783,7 +783,7 @@ parse_uint32 (const char **pp, const char *end, uint32_t *pv)
static void free_static_C_locale (); static void free_static_C_locale ();
#endif #endif
static struct hb_C_locale_lazy_loader_t : hb_lazy_loader_t<hb_remove_pointer (HB_LOCALE_T), static struct hb_C_locale_lazy_loader_t : hb_lazy_loader_t<hb_remove_pointer<HB_LOCALE_T>,
hb_C_locale_lazy_loader_t> hb_C_locale_lazy_loader_t>
{ {
static HB_LOCALE_T create () static HB_LOCALE_T create ()

View File

@ -748,7 +748,7 @@ hb_ft_font_create_referenced (FT_Face ft_face)
static void free_static_ft_library (); static void free_static_ft_library ();
#endif #endif
static struct hb_ft_library_lazy_loader_t : hb_lazy_loader_t<hb_remove_pointer (FT_Library), static struct hb_ft_library_lazy_loader_t : hb_lazy_loader_t<hb_remove_pointer<FT_Library>,
hb_ft_library_lazy_loader_t> hb_ft_library_lazy_loader_t>
{ {
static FT_Library create () static FT_Library create ()

View File

@ -78,7 +78,7 @@ struct hb_iter_t
* it will be returning pointer to temporary rvalue. */ * it will be returning pointer to temporary rvalue. */
template <typename T = item_t, template <typename T = item_t,
hb_enable_if (hb_is_reference (T))> hb_enable_if (hb_is_reference (T))>
hb_remove_reference (item_t)* operator -> () const { return hb_addressof (**thiz()); } hb_remove_reference<item_t>* operator -> () const { return hb_addressof (**thiz()); }
item_t operator * () const { return thiz()->__item__ (); } item_t operator * () const { return thiz()->__item__ (); }
item_t operator * () { return thiz()->__item__ (); } item_t operator * () { return thiz()->__item__ (); }
item_t operator [] (unsigned i) const { return thiz()->__item_at__ (i); } item_t operator [] (unsigned i) const { return thiz()->__item_at__ (i); }

View File

@ -56,15 +56,15 @@ template <typename T> static inline T hb_declval ();
template <typename T> struct hb_match_const { typedef T type; enum { value = false }; }; template <typename T> struct hb_match_const { typedef T type; enum { value = false }; };
template <typename T> struct hb_match_const<const T> { typedef T type; enum { value = true }; }; template <typename T> struct hb_match_const<const T> { typedef T type; enum { value = true }; };
#define hb_remove_const(T) typename hb_match_const<T>::type template <typename T> using hb_remove_const = typename hb_match_const<T>::type;
#define hb_is_const(T) hb_match_const<T>::value #define hb_is_const(T) hb_match_const<T>::value
template <typename T> struct hb_match_reference { typedef T type; enum { value = false }; }; template <typename T> struct hb_match_reference { typedef T type; enum { value = false }; };
template <typename T> struct hb_match_reference<T &> { typedef T type; enum { value = true }; }; template <typename T> struct hb_match_reference<T &> { typedef T type; enum { value = true }; };
#define hb_remove_reference(T) typename hb_match_reference<T>::type template <typename T> using hb_remove_reference = typename hb_match_reference<T>::type;
#define hb_is_reference(T) hb_match_reference<T>::value #define hb_is_reference(T) hb_match_reference<T>::value
template <typename T> struct hb_match_pointer { typedef T type; enum { value = false }; }; template <typename T> struct hb_match_pointer { typedef T type; enum { value = false }; };
template <typename T> struct hb_match_pointer<T *> { typedef T type; enum { value = true }; }; template <typename T> struct hb_match_pointer<T *> { typedef T type; enum { value = true }; };
#define hb_remove_pointer(T) typename hb_match_pointer<T>::type template <typename T> using hb_remove_pointer = typename hb_match_pointer<T>::type;
#define hb_is_pointer(T) hb_match_pointer<T>::value #define hb_is_pointer(T) hb_match_pointer<T>::value
struct struct
@ -79,12 +79,12 @@ struct
/* std::move and std::forward */ /* std::move and std::forward */
template <typename T> template <typename T>
static hb_remove_reference (T)&& hb_move (T&& t) { return (hb_remove_reference (T)&&) (t); } static hb_remove_reference<T>&& hb_move (T&& t) { return (hb_remove_reference<T>&&) (t); }
template <typename T> template <typename T>
static T&& hb_forward (hb_remove_reference (T)& t) { return (T&&) t; } static T&& hb_forward (hb_remove_reference<T>& t) { return (T&&) t; }
template <typename T> template <typename T>
static T&& hb_forward (hb_remove_reference (T)&& t) { return (T&&) t; } static T&& hb_forward (hb_remove_reference<T>&& t) { return (T&&) t; }
/* Void! For when we need a expression-type of void. */ /* Void! For when we need a expression-type of void. */

View File

@ -95,7 +95,7 @@ struct Null {
template <typename QType> template <typename QType>
struct NullHelper struct NullHelper
{ {
typedef hb_remove_const (hb_remove_reference (QType)) Type; typedef hb_remove_const<hb_remove_reference<QType> > Type;
static const Type & get_null () { return Null<Type>::get_null (); } static const Type & get_null () { return Null<Type>::get_null (); }
}; };
#define Null(Type) NullHelper<Type>::get_null () #define Null(Type) NullHelper<Type>::get_null ()
@ -148,7 +148,7 @@ static inline Type& Crap () {
template <typename QType> template <typename QType>
struct CrapHelper struct CrapHelper
{ {
typedef hb_remove_const (hb_remove_reference (QType)) Type; typedef hb_remove_const<hb_remove_reference<QType> > Type;
static Type & get_crap () { return Crap<Type> (); } static Type & get_crap () { return Crap<Type> (); }
}; };
#define Crap(Type) CrapHelper<Type>::get_crap () #define Crap(Type) CrapHelper<Type>::get_crap ()
@ -171,7 +171,7 @@ struct CrapOrNullHelper<const Type> {
template <typename P> template <typename P>
struct hb_nonnull_ptr_t struct hb_nonnull_ptr_t
{ {
typedef hb_remove_pointer (P) T; typedef hb_remove_pointer<P> T;
hb_nonnull_ptr_t (T *v_ = nullptr) : v (v_) {} hb_nonnull_ptr_t (T *v_ = nullptr) : v (v_) {}
T * operator = (T *v_) { return v = v_; } T * operator = (T *v_) { return v = v_; }