1f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod/*
22409d5f8d7dd8b535ce5ea29e933f7db27d33793Behdad Esfahbod * Copyright © 2007  Chris Wilson
32409d5f8d7dd8b535ce5ea29e933f7db27d33793Behdad Esfahbod * Copyright © 2009,2010  Red Hat, Inc.
4cdafe3a7d8483ac586e2c16487e2a09164e0f65cBehdad Esfahbod * Copyright © 2011,2012  Google, Inc.
5f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod *
6c755cb3e3ac55156d0d2ec05adea7a650b97cc41Behdad Esfahbod *  This is part of HarfBuzz, a text shaping library.
7f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod *
8f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * Permission is hereby granted, without written agreement and without
9f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * license or royalty fees, to use, copy, modify, and distribute this
10f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * software and its documentation for any purpose, provided that the
11f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * above copyright notice and the following two paragraphs appear in
12f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * all copies of this software.
13f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod *
14f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
15f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
16f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
17f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
18f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * DAMAGE.
19f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod *
20f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
21f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
22f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
23f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
24f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
25f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod *
26f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod * Contributor(s):
27f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod *	Chris Wilson <chris@chris-wilson.co.uk>
2835a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod * Red Hat Author(s): Behdad Esfahbod
292409d5f8d7dd8b535ce5ea29e933f7db27d33793Behdad Esfahbod * Google Author(s): Behdad Esfahbod
30f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod */
31f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod
32c57d454accff66e5f2c58006e8fb40bc020b6182Behdad Esfahbod#ifndef HB_OBJECT_PRIVATE_HH
33c57d454accff66e5f2c58006e8fb40bc020b6182Behdad Esfahbod#define HB_OBJECT_PRIVATE_HH
34f0954d1e08ae288eda9904e17108fc73f48c0b98Behdad Esfahbod
35c57d454accff66e5f2c58006e8fb40bc020b6182Behdad Esfahbod#include "hb-private.hh"
3623c86aa0009324433e78fcd0c47f2c0ff14b1949Behdad Esfahbod
37ec3ba4b96fc4f262db1ff9f906628c32f26c9b7dBehdad Esfahbod#include "hb-atomic-private.hh"
3845bfa99034512e886d75b1d45a5a649647f4711fBehdad Esfahbod#include "hb-mutex-private.hh"
3945bfa99034512e886d75b1d45a5a649647f4711fBehdad Esfahbod
40799b3c375ad0e1293fd37a0e3a0d422a3166dcd8Behdad Esfahbod
41863df68e894b7644dcd12da88aa22f73edf829dcBehdad Esfahbod/* Debug */
42863df68e894b7644dcd12da88aa22f73edf829dcBehdad Esfahbod
43863df68e894b7644dcd12da88aa22f73edf829dcBehdad Esfahbod#ifndef HB_DEBUG_OBJECT
4411e3ec444a85fc72541823c2e98cc92c4ceb19afBehdad Esfahbod#define HB_DEBUG_OBJECT (HB_DEBUG+0)
45863df68e894b7644dcd12da88aa22f73edf829dcBehdad Esfahbod#endif
46863df68e894b7644dcd12da88aa22f73edf829dcBehdad Esfahbod
47863df68e894b7644dcd12da88aa22f73edf829dcBehdad Esfahbod
48852e08ec8fbfbce1d50e571d0bb0b52ef4d4cc58Behdad Esfahbod/* reference_count */
4929c67d3f70b081766a6c01353980f457f38aeb12Behdad Esfahbod
500e253e97af71e2a7ead153589f61fd579a247502Behdad Esfahbod#define HB_REFERENCE_COUNT_INVALID_VALUE ((hb_atomic_int_t) -1)
510e253e97af71e2a7ead153589f61fd579a247502Behdad Esfahbod#define HB_REFERENCE_COUNT_INVALID {HB_REFERENCE_COUNT_INVALID_VALUE}
5270600dbf626808a30fb0fd8b7ae860e64d9ffe87Behdad Esfahbodstruct hb_reference_count_t
5370600dbf626808a30fb0fd8b7ae860e64d9ffe87Behdad Esfahbod{
543b8fd9c48f4bde368bf2d465c148b9743a9216eeBehdad Esfahbod  hb_atomic_int_t ref_count;
5529c67d3f70b081766a6c01353980f457f38aeb12Behdad Esfahbod
560e253e97af71e2a7ead153589f61fd579a247502Behdad Esfahbod  inline void init (int v) { ref_count = v; }
570558d55bac7fb9279aac859b465e7c0e3ad97492Behdad Esfahbod  inline int inc (void) { return hb_atomic_int_add (const_cast<hb_atomic_int_t &> (ref_count),  1); }
580558d55bac7fb9279aac859b465e7c0e3ad97492Behdad Esfahbod  inline int dec (void) { return hb_atomic_int_add (const_cast<hb_atomic_int_t &> (ref_count), -1); }
590e253e97af71e2a7ead153589f61fd579a247502Behdad Esfahbod  inline void finish (void) { ref_count = HB_REFERENCE_COUNT_INVALID_VALUE; }
6029c67d3f70b081766a6c01353980f457f38aeb12Behdad Esfahbod
61a1970d9afc15b2c6b7513b923019bb223bd95154Behdad Esfahbod  inline bool is_invalid (void) const { return ref_count == HB_REFERENCE_COUNT_INVALID_VALUE; }
6229c67d3f70b081766a6c01353980f457f38aeb12Behdad Esfahbod
6370600dbf626808a30fb0fd8b7ae860e64d9ffe87Behdad Esfahbod};
6429c67d3f70b081766a6c01353980f457f38aeb12Behdad Esfahbod
6529c67d3f70b081766a6c01353980f457f38aeb12Behdad Esfahbod
66852e08ec8fbfbce1d50e571d0bb0b52ef4d4cc58Behdad Esfahbod/* user_data */
6729c67d3f70b081766a6c01353980f457f38aeb12Behdad Esfahbod
687babfe5a7904c26060c5b8441ca1bf23e1444f35Behdad Esfahbod#define HB_USER_DATA_ARRAY_INIT {HB_MUTEX_INIT, HB_LOCKABLE_SET_INIT}
6970600dbf626808a30fb0fd8b7ae860e64d9ffe87Behdad Esfahbodstruct hb_user_data_array_t
7070600dbf626808a30fb0fd8b7ae860e64d9ffe87Behdad Esfahbod{
71cdafe3a7d8483ac586e2c16487e2a09164e0f65cBehdad Esfahbod  /* TODO Add tracing. */
72cdafe3a7d8483ac586e2c16487e2a09164e0f65cBehdad Esfahbod
7321d2c92fdf7307c7117f8948021f0dd7d5a5d2a3Behdad Esfahbod  struct hb_user_data_item_t {
7421d2c92fdf7307c7117f8948021f0dd7d5a5d2a3Behdad Esfahbod    hb_user_data_key_t *key;
7521d2c92fdf7307c7117f8948021f0dd7d5a5d2a3Behdad Esfahbod    void *data;
7621d2c92fdf7307c7117f8948021f0dd7d5a5d2a3Behdad Esfahbod    hb_destroy_func_t destroy;
77811482bd650fb5652a9835471ae8ecf0fb185611Behdad Esfahbod
7821d2c92fdf7307c7117f8948021f0dd7d5a5d2a3Behdad Esfahbod    inline bool operator == (hb_user_data_key_t *other_key) const { return key == other_key; }
7921d2c92fdf7307c7117f8948021f0dd7d5a5d2a3Behdad Esfahbod    inline bool operator == (hb_user_data_item_t &other) const { return key == other.key; }
8029c67d3f70b081766a6c01353980f457f38aeb12Behdad Esfahbod
8121d2c92fdf7307c7117f8948021f0dd7d5a5d2a3Behdad Esfahbod    void finish (void) { if (destroy) destroy (data); }
8221d2c92fdf7307c7117f8948021f0dd7d5a5d2a3Behdad Esfahbod  };
8329c67d3f70b081766a6c01353980f457f38aeb12Behdad Esfahbod
847babfe5a7904c26060c5b8441ca1bf23e1444f35Behdad Esfahbod  hb_mutex_t lock;
850e253e97af71e2a7ead153589f61fd579a247502Behdad Esfahbod  hb_lockable_set_t<hb_user_data_item_t, hb_mutex_t> items;
8629c67d3f70b081766a6c01353980f457f38aeb12Behdad Esfahbod
877babfe5a7904c26060c5b8441ca1bf23e1444f35Behdad Esfahbod  inline void init (void) { lock.init (); items.init (); }
88bf93b636c4963cbc32d5fba7ace1053db6719192Behdad Esfahbod
89218e67b9eefa26e2e4fe43f99a84d082b185b1b0Behdad Esfahbod  HB_INTERNAL bool set (hb_user_data_key_t *key,
90218e67b9eefa26e2e4fe43f99a84d082b185b1b0Behdad Esfahbod			void *              data,
9133ccc77902660ed4b49184e5ec99f4fd0ef63175Behdad Esfahbod			hb_destroy_func_t   destroy,
927babfe5a7904c26060c5b8441ca1bf23e1444f35Behdad Esfahbod			hb_bool_t           replace);
9329c67d3f70b081766a6c01353980f457f38aeb12Behdad Esfahbod
947babfe5a7904c26060c5b8441ca1bf23e1444f35Behdad Esfahbod  HB_INTERNAL void *get (hb_user_data_key_t *key);
9529c67d3f70b081766a6c01353980f457f38aeb12Behdad Esfahbod
967babfe5a7904c26060c5b8441ca1bf23e1444f35Behdad Esfahbod  inline void finish (void) { items.finish (lock); lock.finish (); }
9729c67d3f70b081766a6c01353980f457f38aeb12Behdad Esfahbod};
9829c67d3f70b081766a6c01353980f457f38aeb12Behdad Esfahbod
9929c67d3f70b081766a6c01353980f457f38aeb12Behdad Esfahbod
100852e08ec8fbfbce1d50e571d0bb0b52ef4d4cc58Behdad Esfahbod/* object_header */
10129c67d3f70b081766a6c01353980f457f38aeb12Behdad Esfahbod
10270600dbf626808a30fb0fd8b7ae860e64d9ffe87Behdad Esfahbodstruct hb_object_header_t
10370600dbf626808a30fb0fd8b7ae860e64d9ffe87Behdad Esfahbod{
104fca368c4682624346a0aaee690e1ad6ed4c0b337Behdad Esfahbod  hb_reference_count_t ref_count;
10529c67d3f70b081766a6c01353980f457f38aeb12Behdad Esfahbod  hb_user_data_array_t user_data;
106863df68e894b7644dcd12da88aa22f73edf829dcBehdad Esfahbod
1077babfe5a7904c26060c5b8441ca1bf23e1444f35Behdad Esfahbod#define HB_OBJECT_HEADER_STATIC {HB_REFERENCE_COUNT_INVALID, HB_USER_DATA_ARRAY_INIT}
108863df68e894b7644dcd12da88aa22f73edf829dcBehdad Esfahbod
109fca368c4682624346a0aaee690e1ad6ed4c0b337Behdad Esfahbod  static inline void *create (unsigned int size) {
110fca368c4682624346a0aaee690e1ad6ed4c0b337Behdad Esfahbod    hb_object_header_t *obj = (hb_object_header_t *) calloc (1, size);
11135a7383c6138fd705560f0d4bb30659cbd1ab64cBehdad Esfahbod
112fca368c4682624346a0aaee690e1ad6ed4c0b337Behdad Esfahbod    if (likely (obj))
113fca368c4682624346a0aaee690e1ad6ed4c0b337Behdad Esfahbod      obj->init ();
114c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod
115fca368c4682624346a0aaee690e1ad6ed4c0b337Behdad Esfahbod    return obj;
116fca368c4682624346a0aaee690e1ad6ed4c0b337Behdad Esfahbod  }
117ba8d94ce3360bfaf2c530d01f2af69237018a531Behdad Esfahbod
118fca368c4682624346a0aaee690e1ad6ed4c0b337Behdad Esfahbod  inline void init (void) {
119fca368c4682624346a0aaee690e1ad6ed4c0b337Behdad Esfahbod    ref_count.init (1);
120bf93b636c4963cbc32d5fba7ace1053db6719192Behdad Esfahbod    user_data.init ();
121fca368c4682624346a0aaee690e1ad6ed4c0b337Behdad Esfahbod  }
122fca368c4682624346a0aaee690e1ad6ed4c0b337Behdad Esfahbod
12329c67d3f70b081766a6c01353980f457f38aeb12Behdad Esfahbod  inline bool is_inert (void) const {
12429c67d3f70b081766a6c01353980f457f38aeb12Behdad Esfahbod    return unlikely (ref_count.is_invalid ());
12529c67d3f70b081766a6c01353980f457f38aeb12Behdad Esfahbod  }
126fca368c4682624346a0aaee690e1ad6ed4c0b337Behdad Esfahbod
127fca368c4682624346a0aaee690e1ad6ed4c0b337Behdad Esfahbod  inline void reference (void) {
128fca368c4682624346a0aaee690e1ad6ed4c0b337Behdad Esfahbod    if (unlikely (!this || this->is_inert ()))
129fca368c4682624346a0aaee690e1ad6ed4c0b337Behdad Esfahbod      return;
130fca368c4682624346a0aaee690e1ad6ed4c0b337Behdad Esfahbod    ref_count.inc ();
131fca368c4682624346a0aaee690e1ad6ed4c0b337Behdad Esfahbod  }
132fca368c4682624346a0aaee690e1ad6ed4c0b337Behdad Esfahbod
133fca368c4682624346a0aaee690e1ad6ed4c0b337Behdad Esfahbod  inline bool destroy (void) {
134fca368c4682624346a0aaee690e1ad6ed4c0b337Behdad Esfahbod    if (unlikely (!this || this->is_inert ()))
135fca368c4682624346a0aaee690e1ad6ed4c0b337Behdad Esfahbod      return false;
13629c67d3f70b081766a6c01353980f457f38aeb12Behdad Esfahbod    if (ref_count.dec () != 1)
13729c67d3f70b081766a6c01353980f457f38aeb12Behdad Esfahbod      return false;
13829c67d3f70b081766a6c01353980f457f38aeb12Behdad Esfahbod
1390e253e97af71e2a7ead153589f61fd579a247502Behdad Esfahbod    ref_count.finish (); /* Do this before user_data */
1407babfe5a7904c26060c5b8441ca1bf23e1444f35Behdad Esfahbod    user_data.finish ();
14129c67d3f70b081766a6c01353980f457f38aeb12Behdad Esfahbod
14229c67d3f70b081766a6c01353980f457f38aeb12Behdad Esfahbod    return true;
14329c67d3f70b081766a6c01353980f457f38aeb12Behdad Esfahbod  }
14429c67d3f70b081766a6c01353980f457f38aeb12Behdad Esfahbod
14529c67d3f70b081766a6c01353980f457f38aeb12Behdad Esfahbod  inline bool set_user_data (hb_user_data_key_t *key,
14629c67d3f70b081766a6c01353980f457f38aeb12Behdad Esfahbod			     void *              data,
14733ccc77902660ed4b49184e5ec99f4fd0ef63175Behdad Esfahbod			     hb_destroy_func_t   destroy_func,
14833ccc77902660ed4b49184e5ec99f4fd0ef63175Behdad Esfahbod			     hb_bool_t           replace) {
14929c67d3f70b081766a6c01353980f457f38aeb12Behdad Esfahbod    if (unlikely (!this || this->is_inert ()))
15029c67d3f70b081766a6c01353980f457f38aeb12Behdad Esfahbod      return false;
15129c67d3f70b081766a6c01353980f457f38aeb12Behdad Esfahbod
1527babfe5a7904c26060c5b8441ca1bf23e1444f35Behdad Esfahbod    return user_data.set (key, data, destroy_func, replace);
15329c67d3f70b081766a6c01353980f457f38aeb12Behdad Esfahbod  }
15429c67d3f70b081766a6c01353980f457f38aeb12Behdad Esfahbod
15529c67d3f70b081766a6c01353980f457f38aeb12Behdad Esfahbod  inline void *get_user_data (hb_user_data_key_t *key) {
1560e253e97af71e2a7ead153589f61fd579a247502Behdad Esfahbod    if (unlikely (!this || this->is_inert ()))
1570e253e97af71e2a7ead153589f61fd579a247502Behdad Esfahbod      return NULL;
1580e253e97af71e2a7ead153589f61fd579a247502Behdad Esfahbod
1597babfe5a7904c26060c5b8441ca1bf23e1444f35Behdad Esfahbod    return user_data.get (key);
160fca368c4682624346a0aaee690e1ad6ed4c0b337Behdad Esfahbod  }
161fca368c4682624346a0aaee690e1ad6ed4c0b337Behdad Esfahbod
162fca368c4682624346a0aaee690e1ad6ed4c0b337Behdad Esfahbod  inline void trace (const char *function) const {
163cf26510dbbd8d38486e6ba423800db6427ade332Behdad Esfahbod    if (unlikely (!this)) return;
164bd300df9adf955c1e69b3783c1c061876940fb8bBehdad Esfahbod    /* TODO We cannot use DEBUG_MSG_FUNC here since that one currently only
165ec3ba4b96fc4f262db1ff9f906628c32f26c9b7dBehdad Esfahbod     * prints the class name and throws away the template info. */
166cc06c243d8be3ebb1190281653d2dba504c16c0fBehdad Esfahbod    DEBUG_MSG (OBJECT, (void *) this,
1677bd2b04fea5649d77d796d58b7f4918fe0378ee5Behdad Esfahbod	       "%s refcount=%d",
1687bd2b04fea5649d77d796d58b7f4918fe0378ee5Behdad Esfahbod	       function,
1690558d55bac7fb9279aac859b465e7c0e3ad97492Behdad Esfahbod	       this ? ref_count.ref_count : 0);
170fca368c4682624346a0aaee690e1ad6ed4c0b337Behdad Esfahbod  }
171fca368c4682624346a0aaee690e1ad6ed4c0b337Behdad Esfahbod
1726220e5fc0dad728e67a92e838d3ac275d032f2c7Behdad Esfahbod  private:
1736220e5fc0dad728e67a92e838d3ac275d032f2c7Behdad Esfahbod  ASSERT_POD ();
174fca368c4682624346a0aaee690e1ad6ed4c0b337Behdad Esfahbod};
175fca368c4682624346a0aaee690e1ad6ed4c0b337Behdad Esfahbod
176fca368c4682624346a0aaee690e1ad6ed4c0b337Behdad Esfahbod
177852e08ec8fbfbce1d50e571d0bb0b52ef4d4cc58Behdad Esfahbod/* object */
178852e08ec8fbfbce1d50e571d0bb0b52ef4d4cc58Behdad Esfahbod
179ec6f9c2fd03a49d1e91cbaefa5bdbbfb35dff92eBehdad Esfahbodtemplate <typename Type>
180ae008b90cfc2028e878100f78b21d70f923a6044Behdad Esfahbodstatic inline void hb_object_trace (const Type *obj, const char *function)
181ae008b90cfc2028e878100f78b21d70f923a6044Behdad Esfahbod{
182ae008b90cfc2028e878100f78b21d70f923a6044Behdad Esfahbod  obj->header.trace (function);
183ae008b90cfc2028e878100f78b21d70f923a6044Behdad Esfahbod}
184ec6f9c2fd03a49d1e91cbaefa5bdbbfb35dff92eBehdad Esfahbodtemplate <typename Type>
1851cd5969f253528b1fc05a06c7a9f222baa29f68dBehdad Esfahbodstatic inline Type *hb_object_create (void)
186ae008b90cfc2028e878100f78b21d70f923a6044Behdad Esfahbod{
187ae008b90cfc2028e878100f78b21d70f923a6044Behdad Esfahbod  Type *obj = (Type *) hb_object_header_t::create (sizeof (Type));
188ae008b90cfc2028e878100f78b21d70f923a6044Behdad Esfahbod  hb_object_trace (obj, HB_FUNC);
189ae008b90cfc2028e878100f78b21d70f923a6044Behdad Esfahbod  return obj;
190ae008b90cfc2028e878100f78b21d70f923a6044Behdad Esfahbod}
191ec6f9c2fd03a49d1e91cbaefa5bdbbfb35dff92eBehdad Esfahbodtemplate <typename Type>
192ae008b90cfc2028e878100f78b21d70f923a6044Behdad Esfahbodstatic inline bool hb_object_is_inert (const Type *obj)
193ae008b90cfc2028e878100f78b21d70f923a6044Behdad Esfahbod{
1941cd5969f253528b1fc05a06c7a9f222baa29f68dBehdad Esfahbod  return unlikely (obj->header.is_inert ());
195ae008b90cfc2028e878100f78b21d70f923a6044Behdad Esfahbod}
196ec6f9c2fd03a49d1e91cbaefa5bdbbfb35dff92eBehdad Esfahbodtemplate <typename Type>
197ae008b90cfc2028e878100f78b21d70f923a6044Behdad Esfahbodstatic inline Type *hb_object_reference (Type *obj)
198ae008b90cfc2028e878100f78b21d70f923a6044Behdad Esfahbod{
199ae008b90cfc2028e878100f78b21d70f923a6044Behdad Esfahbod  hb_object_trace (obj, HB_FUNC);
200ae008b90cfc2028e878100f78b21d70f923a6044Behdad Esfahbod  obj->header.reference ();
201ae008b90cfc2028e878100f78b21d70f923a6044Behdad Esfahbod  return obj;
202ae008b90cfc2028e878100f78b21d70f923a6044Behdad Esfahbod}
203ec6f9c2fd03a49d1e91cbaefa5bdbbfb35dff92eBehdad Esfahbodtemplate <typename Type>
204ae008b90cfc2028e878100f78b21d70f923a6044Behdad Esfahbodstatic inline bool hb_object_destroy (Type *obj)
205ae008b90cfc2028e878100f78b21d70f923a6044Behdad Esfahbod{
206ae008b90cfc2028e878100f78b21d70f923a6044Behdad Esfahbod  hb_object_trace (obj, HB_FUNC);
207ae008b90cfc2028e878100f78b21d70f923a6044Behdad Esfahbod  return obj->header.destroy ();
208ae008b90cfc2028e878100f78b21d70f923a6044Behdad Esfahbod}
209852e08ec8fbfbce1d50e571d0bb0b52ef4d4cc58Behdad Esfahbodtemplate <typename Type>
210852e08ec8fbfbce1d50e571d0bb0b52ef4d4cc58Behdad Esfahbodstatic inline bool hb_object_set_user_data (Type               *obj,
211852e08ec8fbfbce1d50e571d0bb0b52ef4d4cc58Behdad Esfahbod					    hb_user_data_key_t *key,
212852e08ec8fbfbce1d50e571d0bb0b52ef4d4cc58Behdad Esfahbod					    void *              data,
21333ccc77902660ed4b49184e5ec99f4fd0ef63175Behdad Esfahbod					    hb_destroy_func_t   destroy,
21433ccc77902660ed4b49184e5ec99f4fd0ef63175Behdad Esfahbod					    hb_bool_t           replace)
215852e08ec8fbfbce1d50e571d0bb0b52ef4d4cc58Behdad Esfahbod{
21633ccc77902660ed4b49184e5ec99f4fd0ef63175Behdad Esfahbod  return obj->header.set_user_data (key, data, destroy, replace);
217852e08ec8fbfbce1d50e571d0bb0b52ef4d4cc58Behdad Esfahbod}
218852e08ec8fbfbce1d50e571d0bb0b52ef4d4cc58Behdad Esfahbod
219852e08ec8fbfbce1d50e571d0bb0b52ef4d4cc58Behdad Esfahbodtemplate <typename Type>
220852e08ec8fbfbce1d50e571d0bb0b52ef4d4cc58Behdad Esfahbodstatic inline void *hb_object_get_user_data (Type               *obj,
221852e08ec8fbfbce1d50e571d0bb0b52ef4d4cc58Behdad Esfahbod					     hb_user_data_key_t *key)
222852e08ec8fbfbce1d50e571d0bb0b52ef4d4cc58Behdad Esfahbod{
223852e08ec8fbfbce1d50e571d0bb0b52ef4d4cc58Behdad Esfahbod  return obj->header.get_user_data (key);
224852e08ec8fbfbce1d50e571d0bb0b52ef4d4cc58Behdad Esfahbod}
225ae008b90cfc2028e878100f78b21d70f923a6044Behdad Esfahbod
226ec6f9c2fd03a49d1e91cbaefa5bdbbfb35dff92eBehdad Esfahbod
227c57d454accff66e5f2c58006e8fb40bc020b6182Behdad Esfahbod#endif /* HB_OBJECT_PRIVATE_HH */
228