diff --git a/src/hb-meta.hh b/src/hb-meta.hh index 88b7f2fc1..645eb5439 100644 --- a/src/hb-meta.hh +++ b/src/hb-meta.hh @@ -147,6 +147,13 @@ struct hb_is_convertible }; #define hb_is_convertible(From,To) hb_is_convertible::value +template +struct hb_is_base_of +{ + static constexpr bool value = hb_is_convertible (hb_decay *, hb_decay *); +}; +#define hb_is_base_of(Base,Derived) hb_is_base_of::value + template struct hb_is_cr_convertible { diff --git a/src/test-meta.cc b/src/test-meta.cc index 9037e9ce4..716e99cd7 100644 --- a/src/test-meta.cc +++ b/src/test-meta.cc @@ -78,5 +78,21 @@ main (int argc, char **argv) static_assert (hb_is_convertible (int *, void *), ""); static_assert (!hb_is_convertible (void *, int *), ""); + struct Y : X {}; + + static_assert (hb_is_base_of (void, void)); + static_assert (hb_is_base_of (void, int)); + static_assert (!hb_is_base_of (int, void)); + + static_assert (hb_is_base_of (int, int)); + static_assert (hb_is_base_of (const int, int)); + static_assert (hb_is_base_of (int, const int)); + + static_assert (hb_is_base_of (X, X)); + static_assert (hb_is_base_of (X, Y)); + static_assert (hb_is_base_of (const X, Y)); + static_assert (hb_is_base_of (X, const Y)); + static_assert (!hb_is_base_of (Y, X)); + return 0; }