Add macros to check that types are POD
This commit is contained in:
parent
61eb60c129
commit
a00a63b5ef
|
@ -137,6 +137,7 @@ PKG_CHECK_MODULES(ICU, icu, have_icu=true, [
|
|||
AC_SUBST(ICU_LIBS)
|
||||
fi
|
||||
])
|
||||
have_icu=false
|
||||
if $have_icu; then
|
||||
AC_DEFINE(HAVE_ICU, 1, [Have ICU library])
|
||||
fi
|
||||
|
|
|
@ -80,17 +80,25 @@ inline Type& StructAfter(TObject &X)
|
|||
*/
|
||||
|
||||
/* Check _assertion in a method environment */
|
||||
#define _DEFINE_SIZE_ASSERTION(_assertion) \
|
||||
inline void _size_assertion (void) const \
|
||||
{ ASSERT_STATIC (_assertion); }
|
||||
#define _DEFINE_INSTANCE_ASSERTION1(_line, _assertion) \
|
||||
inline void _instance_assertion_on_line_##_line (void) const \
|
||||
{ \
|
||||
ASSERT_STATIC (_assertion); \
|
||||
ASSERT_INSTANCE_POD (*this); /* Make sure it's POD. */ \
|
||||
}
|
||||
# define _DEFINE_INSTANCE_ASSERTION0(_line, _assertion) _DEFINE_INSTANCE_ASSERTION1 (_line, _assertion)
|
||||
# define DEFINE_INSTANCE_ASSERTION(_assertion) _DEFINE_INSTANCE_ASSERTION0 (__LINE__, _assertion)
|
||||
|
||||
/* Check that _code compiles in a method environment */
|
||||
#define _DEFINE_COMPILES_ASSERTION(_code) \
|
||||
inline void _compiles_assertion (void) const \
|
||||
#define _DEFINE_COMPILES_ASSERTION1(_line, _code) \
|
||||
inline void _compiles_assertion_on_line_##_line (void) const \
|
||||
{ _code; }
|
||||
# define _DEFINE_COMPILES_ASSERTION0(_line, _code) _DEFINE_COMPILES_ASSERTION1 (_line, _code)
|
||||
# define DEFINE_COMPILES_ASSERTION(_code) _DEFINE_COMPILES_ASSERTION0 (__LINE__, _code)
|
||||
|
||||
|
||||
#define DEFINE_SIZE_STATIC(size) \
|
||||
_DEFINE_SIZE_ASSERTION (sizeof (*this) == (size)); \
|
||||
DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size)); \
|
||||
static const unsigned int static_size = (size); \
|
||||
static const unsigned int min_size = (size)
|
||||
|
||||
|
@ -98,21 +106,21 @@ inline Type& StructAfter(TObject &X)
|
|||
#define VAR 1
|
||||
|
||||
#define DEFINE_SIZE_UNION(size, _member) \
|
||||
_DEFINE_SIZE_ASSERTION (this->u._member.static_size == (size)); \
|
||||
DEFINE_INSTANCE_ASSERTION (this->u._member.static_size == (size)); \
|
||||
static const unsigned int min_size = (size)
|
||||
|
||||
#define DEFINE_SIZE_MIN(size) \
|
||||
_DEFINE_SIZE_ASSERTION (sizeof (*this) >= (size)); \
|
||||
DEFINE_INSTANCE_ASSERTION (sizeof (*this) >= (size)); \
|
||||
static const unsigned int min_size = (size)
|
||||
|
||||
#define DEFINE_SIZE_ARRAY(size, array) \
|
||||
_DEFINE_SIZE_ASSERTION (sizeof (*this) == (size) + sizeof (array[0])); \
|
||||
_DEFINE_COMPILES_ASSERTION ((void) array[0].static_size) \
|
||||
DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size) + sizeof (array[0])); \
|
||||
DEFINE_COMPILES_ASSERTION ((void) array[0].static_size) \
|
||||
static const unsigned int min_size = (size)
|
||||
|
||||
#define DEFINE_SIZE_ARRAY2(size, array1, array2) \
|
||||
_DEFINE_SIZE_ASSERTION (sizeof (*this) == (size) + sizeof (this->array1[0]) + sizeof (this->array2[0])); \
|
||||
_DEFINE_COMPILES_ASSERTION ((void) array1[0].static_size; (void) array2[0].static_size) \
|
||||
DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size) + sizeof (this->array1[0]) + sizeof (this->array2[0])); \
|
||||
DEFINE_COMPILES_ASSERTION ((void) array1[0].static_size; (void) array2[0].static_size) \
|
||||
static const unsigned int min_size = (size)
|
||||
|
||||
|
||||
|
|
|
@ -104,6 +104,30 @@ ASSERT_STATIC (sizeof (hb_position_t) == 4);
|
|||
ASSERT_STATIC (sizeof (hb_mask_t) == 4);
|
||||
ASSERT_STATIC (sizeof (hb_var_int_t) == 4);
|
||||
|
||||
|
||||
/* We like our types POD */
|
||||
|
||||
#define _ASSERT_TYPE_POD1(_line, _type) union _type_##_type##_on_line_##_line##_is_not_POD { _type instance; }
|
||||
#define _ASSERT_TYPE_POD0(_line, _type) _ASSERT_TYPE_POD1 (_line, _type)
|
||||
#define ASSERT_TYPE_POD(_type) _ASSERT_TYPE_POD0 (__LINE__, _type)
|
||||
|
||||
#ifdef __GNUC__
|
||||
# define _ASSERT_INSTANCE_POD1(_line, _instance) union _type_of_instance_on_line_##_line##_is_not_POD { __typeof__(_instance) instance; }
|
||||
#else
|
||||
# define _ASSERT_INSTANCE_POD1(_line, _instance) typedef int _assertion_on_line_##_line##_not_tested
|
||||
#endif
|
||||
# define _ASSERT_INSTANCE_POD0(_line, _instance) _ASSERT_INSTANCE_POD1 (_line, _instance)
|
||||
# define ASSERT_INSTANCE_POD(_instance) _ASSERT_INSTANCE_POD0 (__LINE__, _instance)
|
||||
|
||||
/* Check _assertion in a method environment */
|
||||
#define _ASSERT_POD1(_line) \
|
||||
inline void _static_assertion_on_line_##_line (void) const \
|
||||
{ _ASSERT_INSTANCE_POD1 (*this); /* Make sure it's POD. */ }
|
||||
# define _ASSERT_POD0(_line) _ASSERT_POD1 (_line)
|
||||
# define ASSERT_POD() _ASSERT_POD0 (__LINE__)
|
||||
|
||||
|
||||
|
||||
/* Misc */
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue