Makes way for adding arbitrary user_data support.
#include "hb-private.hh"
#include "hb-blob.h"
+#include "hb-object-private.hh"
HB_BEGIN_DECLS
struct _hb_blob_t {
- hb_reference_count_t ref_count;
+ hb_object_header_t header;
unsigned int length;
#endif
hb_blob_t _hb_blob_nil = {
- HB_REFERENCE_COUNT_INVALID, /* ref_count */
+ HB_OBJECT_HEADER_STATIC,
0, /* length */
#include "hb-private.hh"
#include "hb-buffer.h"
+#include "hb-object-private.hh"
#include "hb-unicode-private.hh"
HB_BEGIN_DECLS
struct _hb_buffer_t {
- hb_reference_count_t ref_count;
+ hb_object_header_t header;
/* Information about how the text in the buffer should be treated */
/* Buffer contents */
- hb_bool_t have_output; /* Whether we have an output buffer going on */
- hb_bool_t have_positions; /* Whether we have positions */
- hb_bool_t in_error; /* Allocation failed */
+ bool have_output; /* Whether we have an output buffer going on */
+ bool have_positions; /* Whether we have positions */
+ bool in_error; /* Allocation failed */
unsigned int i; /* Cursor into ->info and ->pos arrays */
unsigned int len; /* Length of ->info and ->pos arrays */
static hb_buffer_t _hb_buffer_nil = {
- HB_REFERENCE_COUNT_INVALID, /* ref_count */
+ HB_OBJECT_HEADER_STATIC,
&_hb_unicode_funcs_nil, /* unicode */
{
#include "hb-private.hh"
#include "hb-font.h"
+#include "hb-object-private.hh"
HB_BEGIN_DECLS
*/
struct _hb_font_funcs_t {
- hb_reference_count_t ref_count;
+ hb_object_header_t header;
hb_bool_t immutable;
*/
struct _hb_face_t {
- hb_reference_count_t ref_count;
+ hb_object_header_t header;
hb_get_table_func_t get_table;
void *user_data;
*/
struct _hb_font_t {
- hb_reference_count_t ref_count;
+ hb_object_header_t header;
unsigned int x_scale;
unsigned int y_scale;
{ return 0; }
hb_font_funcs_t _hb_font_funcs_nil = {
- HB_REFERENCE_COUNT_INVALID, /* ref_count */
+ HB_OBJECT_HEADER_STATIC,
+
TRUE, /* immutable */
{
hb_font_get_glyph_nil,
*/
static hb_face_t _hb_face_nil = {
- HB_REFERENCE_COUNT_INVALID, /* ref_count */
+ HB_OBJECT_HEADER_STATIC,
NULL, /* get_table */
NULL, /* user_data */
*/
static hb_font_t _hb_font_nil = {
- HB_REFERENCE_COUNT_INVALID, /* ref_count */
+ HB_OBJECT_HEADER_STATIC,
0, /* x_scale */
0, /* y_scale */
}
static hb_font_funcs_t ft_ffuncs = {
- HB_REFERENCE_COUNT_INVALID, /* ref_count */
+ HB_OBJECT_HEADER_STATIC,
+
TRUE, /* immutable */
{
hb_ft_get_glyph,
}
static hb_unicode_funcs_t glib_ufuncs = {
- HB_REFERENCE_COUNT_INVALID, /* ref_count */
+ HB_OBJECT_HEADER_STATIC,
+
NULL, /* parent */
TRUE, /* immutable */
{
}
static hb_unicode_funcs_t icu_ufuncs = {
- HB_REFERENCE_COUNT_INVALID, /* ref_count */
+ HB_OBJECT_HEADER_STATIC,
+
NULL, /* parent */
TRUE, /* immutable */
{
HB_BEGIN_DECLS
-
/* Debug */
#ifndef HB_DEBUG_OBJECT
#define HB_DEBUG_OBJECT (HB_DEBUG+0)
#endif
-static inline void
-_hb_trace_object (const void *obj,
- hb_reference_count_t *ref_count,
- const char *function)
-{
- (void) (HB_DEBUG_OBJECT &&
- fprintf (stderr, "OBJECT(%p) refcount=%d %s\n",
- obj,
- ref_count->get (),
- function));
-}
-#define TRACE_OBJECT(obj) _hb_trace_object (obj, &obj->ref_count, __FUNCTION__)
+typedef struct _hb_object_header_t hb_object_header_t;
+struct _hb_object_header_t {
+ hb_reference_count_t ref_count;
+#define HB_OBJECT_HEADER_STATIC {HB_REFERENCE_COUNT_INVALID}
-/* Object allocation and lifecycle manamgement macros */
+ static inline void *create (unsigned int size) {
+ hb_object_header_t *obj = (hb_object_header_t *) calloc (1, size);
-#define HB_OBJECT_IS_INERT(obj) \
- (unlikely ((obj)->ref_count.is_invalid ()))
+ if (likely (obj))
+ obj->init ();
-#define HB_OBJECT_DO_INIT_EXPR(obj) \
- obj->ref_count.init (1)
+ return obj;
+ }
-#define HB_OBJECT_DO_INIT(obj) \
- HB_STMT_START { \
- HB_OBJECT_DO_INIT_EXPR (obj); \
- } HB_STMT_END
+ inline void init (void) {
+ ref_count.init (1);
+ }
+
+ inline bool is_inert (void) const { return unlikely (ref_count.is_invalid ()); }
+
+ inline void reference (void) {
+ if (unlikely (!this || this->is_inert ()))
+ return;
+ ref_count.inc ();
+ }
+
+ inline bool destroy (void) {
+ if (unlikely (!this || this->is_inert ()))
+ return false;
+ return ref_count.dec () == 1;
+ }
+
+ inline void trace (const char *function) const {
+ (void) (HB_DEBUG_OBJECT &&
+ fprintf (stderr, "OBJECT(%p) refcount=%d %s\n",
+ this,
+ this ? ref_count.get () : 0,
+ function));
+ }
+
+};
+
+
+/* Object allocation and lifecycle manamgement macros */
+
+#define TRACE_OBJECT(obj) \
+ obj->header.trace (__FUNCTION__)
+
+#define HB_OBJECT_IS_INERT(obj) \
+ (unlikely ((obj)->header.is_inert ()))
#define HB_OBJECT_DO_CREATE(Type, obj) \
likely (( \
- (void) ( \
- ((obj) = (Type *) calloc (1, sizeof (Type))) && \
- ( \
- HB_OBJECT_DO_INIT_EXPR (obj), \
- TRACE_OBJECT (obj), \
- TRUE \
- ) \
- ), \
- (obj) \
- ))
+ ((obj) = (Type *) hb_object_header_t::create (sizeof (Type))), \
+ TRACE_OBJECT (obj), \
+ (obj) \
+ ))
#define HB_OBJECT_DO_REFERENCE(obj) \
HB_STMT_START { \
- int old_count; \
- if (unlikely (!(obj) || HB_OBJECT_IS_INERT (obj))) \
- return obj; \
TRACE_OBJECT (obj); \
- old_count = obj->ref_count.inc (); \
- assert (old_count > 0); \
+ obj->header.reference (); \
return obj; \
} HB_STMT_END
#define HB_OBJECT_DO_DESTROY(obj) \
HB_STMT_START { \
- int old_count; \
- if (unlikely (!(obj) || HB_OBJECT_IS_INERT (obj))) \
- return; \
TRACE_OBJECT (obj); \
- old_count = obj->ref_count.dec (); \
- assert (old_count > 0); \
- if (old_count != 1) \
+ if (!obj->header.destroy ()) \
return; \
} HB_STMT_END
#define HB_DEBUG 0
#endif
-static inline hb_bool_t /* always returns TRUE */
+static inline bool /* always returns TRUE */
_hb_trace (const char *what,
const char *function,
const void *obj,
}
-#include "hb-object-private.hh"
-
-
HB_END_DECLS
#endif /* HB_PRIVATE_HH */
#include "hb-private.hh"
#include "hb-unicode.h"
+#include "hb-object-private.hh"
HB_BEGIN_DECLS
*/
struct _hb_unicode_funcs_t {
- hb_reference_count_t ref_count;
+ hb_object_header_t header;
+
hb_unicode_funcs_t *parent;
- hb_bool_t immutable;
+ bool immutable;
#define IMPLEMENT(return_type, name) \
inline return_type \
hb_unicode_funcs_t _hb_unicode_funcs_nil = {
- HB_REFERENCE_COUNT_INVALID, /* ref_count */
+ HB_OBJECT_HEADER_STATIC,
+
NULL, /* parent */
TRUE, /* immutable */
{