Add HB_RETURN

This commit is contained in:
Behdad Esfahbod 2019-04-17 10:20:02 -04:00
parent 6745a600bf
commit c67a0d581f
2 changed files with 26 additions and 21 deletions

View File

@ -50,7 +50,7 @@ struct
{ {
private: private:
template <typename T> auto template <typename T> auto
impl (const T& v, hb_priority<1>) const HB_AUTO_RETURN (hb_deref_pointer (v).hash ()) impl (const T& v, hb_priority<1>) const HB_RETURN (uint32_t, hb_deref_pointer (v).hash ())
template <typename T, template <typename T,
hb_enable_if (hb_is_integer (T))> auto hb_enable_if (hb_is_integer (T))> auto
@ -63,7 +63,7 @@ struct
public: public:
template <typename T> auto template <typename T> auto
operator () (const T& v) const HB_AUTO_RETURN ((uint32_t) impl (v, hb_prioritize)) operator () (const T& v) const HB_RETURN (uint32_t, impl (v, hb_prioritize))
} HB_FUNCOBJ (hb_hash); } HB_FUNCOBJ (hb_hash);
struct struct
@ -114,11 +114,10 @@ struct
public: public:
template <typename Pred, typename Val> auto template <typename Pred, typename Val> auto
operator () (Pred&& p, Val &&v) const HB_AUTO_RETURN operator () (Pred&& p, Val &&v) const HB_RETURN (bool,
( impl (hb_forward<Pred> (p),
(bool) impl (hb_forward<Pred> (p), hb_forward<Val> (v),
hb_forward<Val> (v), hb_prioritize)
hb_prioritize)
) )
} HB_FUNCOBJ (hb_has); } HB_FUNCOBJ (hb_has);

View File

@ -34,8 +34,27 @@
* C++ template meta-programming & fundamentals used with them. * C++ template meta-programming & fundamentals used with them.
*/ */
/* Void! For when we need a expression-type of void. */
struct hb_void_t { typedef void value; };
/* Void meta-function ala std::void_t
* https://en.cppreference.com/w/cpp/types/void_t */
template<typename... Ts> struct _hb_void_tt { typedef void type; };
template<typename... Ts> using hb_void_tt = typename _hb_void_tt<Ts...>::type;
template<typename Head, typename... Ts> struct _hb_head_tt { typedef Head type; };
template<typename... Ts> using hb_head_tt = typename _hb_head_tt<Ts...>::type;
/* Bool! For when we need to evaluate type-dependent expressions
* in a template argument. */
template <bool b> struct hb_bool_tt { enum { value = b }; };
typedef hb_bool_tt<true> hb_true_t;
typedef hb_bool_tt<false> hb_false_t;
/* Function overloading SFINAE and priority. */ /* Function overloading SFINAE and priority. */
#define HB_RETURN(Ret, E) -> hb_head_tt<Ret, decltype ((E))> { return (E); }
#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); } #define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
#define HB_VOID_RETURN(E) -> hb_void_tt<decltype ((E))> { (E); } #define HB_VOID_RETURN(E) -> hb_void_tt<decltype ((E))> { (E); }
@ -45,6 +64,7 @@ template <> struct hb_priority<0> {};
#define HB_FUNCOBJ(x) static_const x HB_UNUSED #define HB_FUNCOBJ(x) static_const x HB_UNUSED
struct struct
{ {
template <typename T> template <typename T>
@ -98,20 +118,6 @@ struct
} HB_FUNCOBJ (hb_deref_pointer); } HB_FUNCOBJ (hb_deref_pointer);
/* Void! For when we need a expression-type of void. */
struct hb_void_t { typedef void value; };
/* Void meta-function ala std::void_t
* https://en.cppreference.com/w/cpp/types/void_t */
template<typename... Ts> struct _hb_void_tt { typedef void type; };
template<typename... Ts> using hb_void_tt = typename _hb_void_tt<Ts...>::type;
/* Bool! For when we need to evaluate type-dependent expressions
* in a template argument. */
template <bool b> struct hb_bool_tt { enum { value = b }; };
typedef hb_bool_tt<true> hb_true_t;
typedef hb_bool_tt<false> hb_false_t;
template<bool B, typename T = void> struct hb_enable_if {}; template<bool B, typename T = void> struct hb_enable_if {};
template<typename T> struct hb_enable_if<true, T> { typedef T type; }; template<typename T> struct hb_enable_if<true, T> { typedef T type; };
#define hb_enable_if(Cond) typename hb_enable_if<(Cond)>::type* = nullptr #define hb_enable_if(Cond) typename hb_enable_if<(Cond)>::type* = nullptr