15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright © 2007 Chris Wilson 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright © 2009,2010 Red Hat, Inc. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright © 2011,2012 Google, Inc. 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This is part of HarfBuzz, a text shaping library. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Permission is hereby granted, without written agreement and without 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * license or royalty fees, to use, copy, modify, and distribute this 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * software and its documentation for any purpose, provided that the 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * above copyright notice and the following two paragraphs appear in 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * all copies of this software. 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DAMAGE. 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Contributor(s): 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Chris Wilson <chris@chris-wilson.co.uk> 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Red Hat Author(s): Behdad Esfahbod 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Google Author(s): Behdad Esfahbod 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef HB_OBJECT_PRIVATE_HH 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_OBJECT_PRIVATE_HH 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "hb-private.hh" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "hb-atomic-private.hh" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "hb-mutex-private.hh" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Debug */ 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef HB_DEBUG_OBJECT 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_DEBUG_OBJECT (HB_DEBUG+0) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* reference_count */ 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_REFERENCE_COUNT_INVALID_VALUE ((hb_atomic_int_t) -1) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_REFERENCE_COUNT_INVALID {HB_REFERENCE_COUNT_INVALID_VALUE} 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct hb_reference_count_t 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_atomic_int_t ref_count; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline void init (int v) { ref_count = v; } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline int inc (void) { return hb_atomic_int_add (const_cast<hb_atomic_int_t &> (ref_count), 1); } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline int dec (void) { return hb_atomic_int_add (const_cast<hb_atomic_int_t &> (ref_count), -1); } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline void finish (void) { ref_count = HB_REFERENCE_COUNT_INVALID_VALUE; } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline bool is_invalid (void) const { return ref_count == HB_REFERENCE_COUNT_INVALID_VALUE; } 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* user_data */ 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define HB_USER_DATA_ARRAY_INIT {HB_MUTEX_INIT, HB_LOCKABLE_SET_INIT} 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct hb_user_data_array_t 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* TODO Add tracing. */ 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct hb_user_data_item_t { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_user_data_key_t *key; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *data; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_destroy_func_t destroy; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline bool operator == (hb_user_data_key_t *other_key) const { return key == other_key; } 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline bool operator == (hb_user_data_item_t &other) const { return key == other.key; } 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void finish (void) { if (destroy) destroy (data); } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) hb_mutex_t lock; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_lockable_set_t<hb_user_data_item_t, hb_mutex_t> items; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) inline void init (void) { lock.init (); items.init (); } 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HB_INTERNAL bool set (hb_user_data_key_t *key, 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * data, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_destroy_func_t destroy, 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) hb_bool_t replace); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HB_INTERNAL void *get (hb_user_data_key_t *key); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) inline void finish (void) { items.finish (lock); lock.finish (); } 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* object_header */ 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct hb_object_header_t 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_reference_count_t ref_count; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_user_data_array_t user_data; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define HB_OBJECT_HEADER_STATIC {HB_REFERENCE_COUNT_INVALID, HB_USER_DATA_ARRAY_INIT} 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline void *create (unsigned int size) { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_object_header_t *obj = (hb_object_header_t *) calloc (1, size); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (likely (obj)) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) obj->init (); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return obj; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline void init (void) { 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ref_count.init (1); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_data.init (); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline bool is_inert (void) const { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return unlikely (ref_count.is_invalid ()); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline void reference (void) { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unlikely (!this || this->is_inert ())) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ref_count.inc (); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline bool destroy (void) { 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unlikely (!this || this->is_inert ())) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ref_count.dec () != 1) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ref_count.finish (); /* Do this before user_data */ 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) user_data.finish (); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline bool set_user_data (hb_user_data_key_t *key, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * data, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_destroy_func_t destroy_func, 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_bool_t replace) { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unlikely (!this || this->is_inert ())) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return user_data.set (key, data, destroy_func, replace); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline void *get_user_data (hb_user_data_key_t *key) { 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unlikely (!this || this->is_inert ())) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return user_data.get (key); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline void trace (const char *function) const { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unlikely (!this)) return; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* TODO We cannot use DEBUG_MSG_FUNC here since that one currently only 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * prints the class name and throws away the template info. */ 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DEBUG_MSG (OBJECT, (void *) this, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "%s refcount=%d", 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this ? ref_count.ref_count : 0); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_POD (); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* object */ 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Type> 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline void hb_object_trace (const Type *obj, const char *function) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) obj->header.trace (function); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Type> 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline Type *hb_object_create (void) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Type *obj = (Type *) hb_object_header_t::create (sizeof (Type)); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_object_trace (obj, HB_FUNC); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return obj; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Type> 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline bool hb_object_is_inert (const Type *obj) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return unlikely (obj->header.is_inert ()); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Type> 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline Type *hb_object_reference (Type *obj) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_object_trace (obj, HB_FUNC); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) obj->header.reference (); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return obj; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Type> 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline bool hb_object_destroy (Type *obj) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_object_trace (obj, HB_FUNC); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return obj->header.destroy (); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Type> 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline bool hb_object_set_user_data (Type *obj, 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_user_data_key_t *key, 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * data, 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_destroy_func_t destroy, 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_bool_t replace) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return obj->header.set_user_data (key, data, destroy, replace); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Type> 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline void *hb_object_get_user_data (Type *obj, 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_user_data_key_t *key) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return obj->header.get_user_data (key); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* HB_OBJECT_PRIVATE_HH */ 228