Replace simple macros with inline functions for better type safety
Now that we use C++ for all source code, lets benefit from it! The hb_be_int16/32_get/put/eq() macros grow code size if replaced with inline functions, so leave them as is.
This commit is contained in:
parent
40a9b8154f
commit
153142dac8
|
@ -371,7 +371,7 @@ class BEInt<Type, 2>
|
||||||
public:
|
public:
|
||||||
inline void set (Type i) { hb_be_uint16_put (v,i); }
|
inline void set (Type i) { hb_be_uint16_put (v,i); }
|
||||||
inline operator Type (void) const { return hb_be_uint16_get (v); }
|
inline operator Type (void) const { return hb_be_uint16_get (v); }
|
||||||
inline bool operator == (const BEInt<Type, 2>& o) const { return hb_be_uint16_cmp (v, o.v); }
|
inline bool operator == (const BEInt<Type, 2>& o) const { return hb_be_uint16_eq (v, o.v); }
|
||||||
inline bool operator != (const BEInt<Type, 2>& o) const { return !(*this == o); }
|
inline bool operator != (const BEInt<Type, 2>& o) const { return !(*this == o); }
|
||||||
private: uint8_t v[2];
|
private: uint8_t v[2];
|
||||||
};
|
};
|
||||||
|
@ -381,7 +381,7 @@ class BEInt<Type, 4>
|
||||||
public:
|
public:
|
||||||
inline void set (Type i) { hb_be_uint32_put (v,i); }
|
inline void set (Type i) { hb_be_uint32_put (v,i); }
|
||||||
inline operator Type (void) const { return hb_be_uint32_get (v); }
|
inline operator Type (void) const { return hb_be_uint32_get (v); }
|
||||||
inline bool operator == (const BEInt<Type, 4>& o) const { return hb_be_uint32_cmp (v, o.v); }
|
inline bool operator == (const BEInt<Type, 4>& o) const { return hb_be_uint32_eq (v, o.v); }
|
||||||
inline bool operator != (const BEInt<Type, 4>& o) const { return !(*this == o); }
|
inline bool operator != (const BEInt<Type, 4>& o) const { return !(*this == o); }
|
||||||
private: uint8_t v[4];
|
private: uint8_t v[4];
|
||||||
};
|
};
|
||||||
|
|
|
@ -64,11 +64,15 @@ HB_BEGIN_DECLS
|
||||||
|
|
||||||
/* Basics */
|
/* Basics */
|
||||||
|
|
||||||
|
HB_END_DECLS
|
||||||
|
|
||||||
#undef MIN
|
#undef MIN
|
||||||
#define MIN(a,b) ((a) < (b) ? (a) : (b))
|
template <typename Type> static inline Type MIN (const Type &a, const Type &b) { return a < b ? a : b; }
|
||||||
|
|
||||||
#undef MAX
|
#undef MAX
|
||||||
#define MAX(a,b) ((a) > (b) ? (a) : (b))
|
template <typename Type> static inline Type MAX (const Type &a, const Type &b) { return a > b ? a : b; }
|
||||||
|
|
||||||
|
HB_BEGIN_DECLS
|
||||||
|
|
||||||
#undef ARRAY_LENGTH
|
#undef ARRAY_LENGTH
|
||||||
#define ARRAY_LENGTH(__array) ((signed int) (sizeof (__array) / sizeof (__array[0])))
|
#define ARRAY_LENGTH(__array) ((signed int) (sizeof (__array) / sizeof (__array[0])))
|
||||||
|
@ -275,23 +279,31 @@ typedef struct {
|
||||||
|
|
||||||
/* Big-endian handling */
|
/* Big-endian handling */
|
||||||
|
|
||||||
#define hb_be_uint16(v) ((uint16_t) ((((const uint8_t *)&(v))[0] << 8) + (((const uint8_t *)&(v))[1])))
|
static inline uint16_t hb_be_uint16 (const uint16_t v)
|
||||||
|
{
|
||||||
|
const uint8_t *V = (const uint8_t *) &v;
|
||||||
|
return (uint16_t) (V[0] << 8) + V[1];
|
||||||
|
}
|
||||||
|
|
||||||
#define hb_be_uint16_put(v,V) HB_STMT_START { v[0] = (V>>8); v[1] = (V); } HB_STMT_END
|
#define hb_be_uint16_put(v,V) HB_STMT_START { v[0] = (V>>8); v[1] = (V); } HB_STMT_END
|
||||||
#define hb_be_uint16_get(v) (uint16_t) ((v[0] << 8) + v[1])
|
#define hb_be_uint16_get(v) (uint16_t) ((v[0] << 8) + v[1])
|
||||||
#define hb_be_uint16_cmp(a,b) (a[0] == b[0] && a[1] == b[1])
|
#define hb_be_uint16_eq(a,b) (a[0] == b[0] && a[1] == b[1])
|
||||||
|
|
||||||
#define hb_be_uint32_put(v,V) HB_STMT_START { v[0] = (V>>24); v[1] = (V>>16); v[2] = (V>>8); v[3] = (V); } HB_STMT_END
|
#define hb_be_uint32_put(v,V) HB_STMT_START { v[0] = (V>>24); v[1] = (V>>16); v[2] = (V>>8); v[3] = (V); } HB_STMT_END
|
||||||
#define hb_be_uint32_get(v) (uint32_t) ((v[0] << 24) + (v[1] << 16) + (v[2] << 8) + v[3])
|
#define hb_be_uint32_get(v) (uint32_t) ((v[0] << 24) + (v[1] << 16) + (v[2] << 8) + v[3])
|
||||||
#define hb_be_uint32_cmp(a,b) (a[0] == b[0] && a[1] == b[1] && a[2] == b[2] && a[3] == b[3])
|
#define hb_be_uint32_eq(a,b) (a[0] == b[0] && a[1] == b[1] && a[2] == b[2] && a[3] == b[3])
|
||||||
|
|
||||||
|
|
||||||
/* ASCII tag/character handling */
|
/* ASCII tag/character handling */
|
||||||
|
|
||||||
#define ISALPHA(c) (((c) >= 'a' && (c) <= 'z') || ((c) >= 'A' && (c) <= 'Z'))
|
static inline unsigned char ISALPHA (unsigned char c)
|
||||||
#define ISALNUM(c) (((c) >= 'a' && (c) <= 'z') || ((c) >= 'A' && (c) <= 'Z') || ((c) >= '0' && (c) <= '9'))
|
{ return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); }
|
||||||
#define TOUPPER(c) (((c) >= 'a' && (c) <= 'z') ? (c) - 'a' + 'A' : (c))
|
static inline unsigned char ISALNUM (unsigned char c)
|
||||||
#define TOLOWER(c) (((c) >= 'A' && (c) <= 'Z') ? (c) - 'A' + 'a' : (c))
|
{ return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9'); }
|
||||||
|
static inline unsigned char TOUPPER (unsigned char c)
|
||||||
|
{ return (c >= 'a' && c <= 'z') ? c - 'a' + 'A' : c; }
|
||||||
|
static inline unsigned char TOLOWER (unsigned char c)
|
||||||
|
{ return (c >= 'A' && c <= 'Z') ? c - 'A' + 'a' : c; }
|
||||||
|
|
||||||
#define HB_TAG_CHAR4(s) (HB_TAG(((const char *) s)[0], \
|
#define HB_TAG_CHAR4(s) (HB_TAG(((const char *) s)[0], \
|
||||||
((const char *) s)[1], \
|
((const char *) s)[1], \
|
||||||
|
|
Loading…
Reference in New Issue