From fb0f30f55a5d654b2f1f9b99efa9b8abc51dbf34 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 3 Nov 2018 15:24:14 -0400 Subject: [PATCH] Add hb_nonnull_ptr_t Towards fixing https://github.com/harfbuzz/harfbuzz/issues/1146 --- src/hb-null.hh | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/hb-null.hh b/src/hb-null.hh index d5b74bf56..151277ca7 100644 --- a/src/hb-null.hh +++ b/src/hb-null.hh @@ -103,4 +103,32 @@ struct CrapOrNull { #define CrapOrNull(Type) CrapOrNull::get () +/* + * hb_nonnull_ptr_t + */ + +template +struct hb_nonnull_ptr_t +{ + typedef typename hb_remove_pointer

::value T; + + inline hb_nonnull_ptr_t (T *v_ = nullptr) : v (v_) {} + inline T * operator = (T *v_) { return v = v_; } + inline T * operator -> (void) { return get (); } + inline const T * operator -> (void) const { return get (); } + inline T & operator * (void) { return *get (); } + inline const T & operator * (void) const { return *get (); } + inline T ** operator & (void) { return &v; } + inline const T ** operator & (void) const { return &v; } + inline operator T * (void) { return get (); } + inline operator const T * (void) const { return get (); } + inline T * get (void) { return v ? v : const_cast (&Null(T)); } + inline const T * get (void) const { return v ? v : const_cast (&Null(T)); } + inline T * get_raw (void) { return v; } + inline const T * get_raw (void) const { return v; } + + T *v; +}; + + #endif /* HB_NULL_HH */