#ifndef HB_META_HH
#define HB_META_HH
#include "hb.hh"
#include <memory>
#include <type_traits>
#include <utility>
struct hb_empty_t { … };
template<typename... Ts> struct _hb_void_t { … };
hb_void_t;
template<typename Head, typename... Ts> struct _hb_head_t { … };
hb_head_t;
template <typename T, T v> struct hb_integral_constant { … };
hb_bool_constant;
hb_true_type;
hb_false_type;
template <bool cond> struct static_assert_expr;
template <> struct static_assert_expr<true> : hb_false_type { … };
#define static_assert_expr(C) …
template <bool B, typename T = void> struct hb_enable_if { … };
hb_enable_if<true, T>;
#define hb_enable_if(Cond) …
#define hb_requires(Cond) …
template <typename T, typename T2> struct hb_is_same : hb_false_type { … };
hb_is_same<T, T>;
#define hb_is_same(T, T2) …
#define HB_RETURN(Ret, E) …
#define HB_AUTO_RETURN(E) …
#define HB_VOID_RETURN(E) …
template <unsigned Pri> struct hb_priority : hb_priority<Pri - 1> { … };
template <> struct hb_priority<0> { … };
#define hb_prioritize …
#define HB_FUNCOBJ(x) …
template <typename T> struct hb_type_identity_t { … };
hb_type_identity;
template <typename T> static inline T hb_declval ();
#define hb_declval(T) …
template <typename T> struct hb_match_const : hb_type_identity_t<T>, hb_false_type { … };
hb_match_const<const T>;
hb_remove_const;
template <typename T> struct hb_match_reference : hb_type_identity_t<T>, hb_false_type { … };
hb_match_reference<T &>;
hb_match_reference<T &&>;
hb_remove_reference;
template <typename T> auto _hb_try_add_lvalue_reference (hb_priority<1>) -> hb_type_identity<T&>;
template <typename T> auto _hb_try_add_lvalue_reference (hb_priority<0>) -> hb_type_identity<T>;
hb_add_lvalue_reference;
template <typename T> auto _hb_try_add_rvalue_reference (hb_priority<1>) -> hb_type_identity<T&&>;
template <typename T> auto _hb_try_add_rvalue_reference (hb_priority<0>) -> hb_type_identity<T>;
hb_add_rvalue_reference;
template <typename T> struct hb_match_pointer : hb_type_identity_t<T>, hb_false_type { … };
hb_match_pointer<T *>;
hb_remove_pointer;
template <typename T> auto _hb_try_add_pointer (hb_priority<1>) -> hb_type_identity<hb_remove_reference<T>*>;
template <typename T> auto _hb_try_add_pointer (hb_priority<1>) -> hb_type_identity<T>;
hb_add_pointer;
hb_decay;
#define hb_is_convertible(From,To) …
hb_is_cr_convertible;
#define hb_is_cr_convertible(From,To) …
struct
{ … }
HB_FUNCOBJ(…);
template <typename T>
struct hb_reference_wrapper
{ … };
hb_reference_wrapper<T &>;
template <typename T> struct hb_int_min;
template <> struct hb_int_min<char> : hb_integral_constant<char, CHAR_MIN> { … };
template <> struct hb_int_min<signed char> : hb_integral_constant<signed char, SCHAR_MIN> { … };
template <> struct hb_int_min<unsigned char> : hb_integral_constant<unsigned char, 0> { … };
template <> struct hb_int_min<signed short> : hb_integral_constant<signed short, SHRT_MIN> { … };
template <> struct hb_int_min<unsigned short> : hb_integral_constant<unsigned short, 0> { … };
template <> struct hb_int_min<signed int> : hb_integral_constant<signed int, INT_MIN> { … };
template <> struct hb_int_min<unsigned int> : hb_integral_constant<unsigned int, 0> { … };
template <> struct hb_int_min<signed long> : hb_integral_constant<signed long, LONG_MIN> { … };
template <> struct hb_int_min<unsigned long> : hb_integral_constant<unsigned long, 0> { … };
template <> struct hb_int_min<signed long long> : hb_integral_constant<signed long long, LLONG_MIN> { … };
template <> struct hb_int_min<unsigned long long> : hb_integral_constant<unsigned long long, 0> { … };
hb_int_min<T *>;
#define hb_int_min(T) …
template <typename T> struct hb_int_max;
template <> struct hb_int_max<char> : hb_integral_constant<char, CHAR_MAX> { … };
template <> struct hb_int_max<signed char> : hb_integral_constant<signed char, SCHAR_MAX> { … };
template <> struct hb_int_max<unsigned char> : hb_integral_constant<unsigned char, UCHAR_MAX> { … };
template <> struct hb_int_max<signed short> : hb_integral_constant<signed short, SHRT_MAX> { … };
template <> struct hb_int_max<unsigned short> : hb_integral_constant<unsigned short, USHRT_MAX> { … };
template <> struct hb_int_max<signed int> : hb_integral_constant<signed int, INT_MAX> { … };
template <> struct hb_int_max<unsigned int> : hb_integral_constant<unsigned int, UINT_MAX> { … };
template <> struct hb_int_max<signed long> : hb_integral_constant<signed long, LONG_MAX> { … };
template <> struct hb_int_max<unsigned long> : hb_integral_constant<unsigned long, ULONG_MAX> { … };
template <> struct hb_int_max<signed long long> : hb_integral_constant<signed long long, LLONG_MAX> { … };
template <> struct hb_int_max<unsigned long long> : hb_integral_constant<unsigned long long, ULLONG_MAX> { … };
#define hb_int_max(T) …
#if defined(__GNUC__) && __GNUC__ < 5 && !defined(__clang__)
#define hb_is_trivially_copyable …
#define hb_is_trivially_copy_assignable …
#define hb_is_trivially_constructible …
#define hb_is_trivially_copy_constructible …
#define hb_is_trivially_destructible …
#else
#define hb_is_trivially_copyable(T) …
#define hb_is_trivially_copy_assignable(T) …
#define hb_is_trivially_constructible(T) …
#define hb_is_trivially_copy_constructible(T) …
#define hb_is_trivially_destructible(T) …
#endif
#define HB_DELETE_COPY_ASSIGN(TypeName) …
#define HB_DELETE_CREATE_COPY_ASSIGN(TypeName) …
template <typename T, typename>
struct _hb_unwrap_type : hb_type_identity_t<T> { … };
_hb_unwrap_type<T, hb_void_t<typename T::type>>;
hb_unwrap_type;
#define hb_unwrap_type(T) …
#endif