Add polyfill for static_assert and nullptr
Also fix hb_assert_constant_t.
This commit is contained in:
parent
dad431e75b
commit
76dcbf8b23
|
@ -74,6 +74,38 @@ extern "C" void hb_free_impl(void *ptr);
|
||||||
/* Compiler attributes */
|
/* Compiler attributes */
|
||||||
|
|
||||||
|
|
||||||
|
#if __cplusplus < 201103L
|
||||||
|
|
||||||
|
// Null pointer literal
|
||||||
|
// Source: SC22/WG21/N2431 = J16/07-0301
|
||||||
|
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2431.pdf
|
||||||
|
|
||||||
|
const // this is a const object...
|
||||||
|
class {
|
||||||
|
public:
|
||||||
|
template<class T> // convertible to any type
|
||||||
|
operator T*() const { // of null non-member
|
||||||
|
return 0; // pointer...
|
||||||
|
}
|
||||||
|
template<class C, class T> // or any type of null
|
||||||
|
operator T C::*() const { // member pointer...
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
void operator&() const; // whose address can't be taken
|
||||||
|
} nullptr = {}; // and whose name is nullptr
|
||||||
|
|
||||||
|
// Static assertions
|
||||||
|
#ifndef static_assert
|
||||||
|
#define _PASTE1(a,b) a##b
|
||||||
|
#define _PASTE(a,b) _PASTE1(a,b)
|
||||||
|
#define static_assert(e, msg) \
|
||||||
|
HB_UNUSED typedef char _PASTE(assertion_failed_at_line_, __LINE__) [(e) ? 1 : -1]
|
||||||
|
#endif // static_assert
|
||||||
|
|
||||||
|
#endif // __cplusplus < 201103L
|
||||||
|
|
||||||
|
|
||||||
#if (defined(__GNUC__) || defined(__clang__)) && defined(__OPTIMIZE__)
|
#if (defined(__GNUC__) || defined(__clang__)) && defined(__OPTIMIZE__)
|
||||||
#define likely(expr) (__builtin_expect (!!(expr), 1))
|
#define likely(expr) (__builtin_expect (!!(expr), 1))
|
||||||
#define unlikely(expr) (__builtin_expect (!!(expr), 0))
|
#define unlikely(expr) (__builtin_expect (!!(expr), 0))
|
||||||
|
@ -239,13 +271,11 @@ static inline unsigned int ARRAY_LENGTH (const Type (&)[n]) { return n; }
|
||||||
#define _ASSERT_STATIC0(_line, _cond) _ASSERT_STATIC1 (_line, (_cond))
|
#define _ASSERT_STATIC0(_line, _cond) _ASSERT_STATIC1 (_line, (_cond))
|
||||||
#define ASSERT_STATIC(_cond) _ASSERT_STATIC0 (__LINE__, (_cond))
|
#define ASSERT_STATIC(_cond) _ASSERT_STATIC0 (__LINE__, (_cond))
|
||||||
|
|
||||||
template <unsigned int cond> class hb_assert_constant_t {};
|
template <unsigned int cond> class hb_assert_constant_t;
|
||||||
|
template <> class hb_assert_constant_t<1> {};
|
||||||
|
|
||||||
#define ASSERT_STATIC_EXPR_ZERO(_cond) (0 * (unsigned int) sizeof (hb_assert_constant_t<_cond>))
|
#define ASSERT_STATIC_EXPR_ZERO(_cond) (0 * (unsigned int) sizeof (hb_assert_constant_t<_cond>))
|
||||||
|
|
||||||
#define _PASTE1(a,b) a##b
|
|
||||||
#define PASTE(a,b) _PASTE1(a,b)
|
|
||||||
|
|
||||||
/* Lets assert int types. Saves trouble down the road. */
|
/* Lets assert int types. Saves trouble down the road. */
|
||||||
|
|
||||||
ASSERT_STATIC (sizeof (int8_t) == 1);
|
ASSERT_STATIC (sizeof (int8_t) == 1);
|
||||||
|
|
Loading…
Reference in New Issue