Coverage Report

Created: 2023-09-25 06:24

/src/harfbuzz/src/hb-atomic.hh
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright © 2007  Chris Wilson
3
 * Copyright © 2009,2010  Red Hat, Inc.
4
 * Copyright © 2011,2012  Google, Inc.
5
 *
6
 *  This is part of HarfBuzz, a text shaping library.
7
 *
8
 * Permission is hereby granted, without written agreement and without
9
 * license or royalty fees, to use, copy, modify, and distribute this
10
 * software and its documentation for any purpose, provided that the
11
 * above copyright notice and the following two paragraphs appear in
12
 * all copies of this software.
13
 *
14
 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
15
 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
16
 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
17
 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
18
 * DAMAGE.
19
 *
20
 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
21
 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
22
 * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
23
 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
24
 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
25
 *
26
 * Contributor(s):
27
 *  Chris Wilson <chris@chris-wilson.co.uk>
28
 * Red Hat Author(s): Behdad Esfahbod
29
 * Google Author(s): Behdad Esfahbod
30
 */
31
32
#ifndef HB_ATOMIC_HH
33
#define HB_ATOMIC_HH
34
35
#include "hb.hh"
36
#include "hb-meta.hh"
37
38
39
/*
40
 * Atomic integers and pointers.
41
 */
42
43
44
/* We need external help for these */
45
46
#if defined(hb_atomic_int_impl_add) \
47
 && defined(hb_atomic_ptr_impl_get) \
48
 && defined(hb_atomic_ptr_impl_cmpexch)
49
50
/* Defined externally, i.e. in config.h. */
51
52
53
#elif !defined(HB_NO_MT) && defined(__ATOMIC_ACQUIRE)
54
55
/* C++11-style GCC primitives. We prefer these as they don't require linking to libstdc++ / libc++. */
56
57
#define _hb_memory_barrier()      __sync_synchronize ()
58
59
2.25M
#define hb_atomic_int_impl_add(AI, V)   __atomic_fetch_add ((AI), (V), __ATOMIC_ACQ_REL)
60
620k
#define hb_atomic_int_impl_set_relaxed(AI, V) __atomic_store_n ((AI), (V), __ATOMIC_RELAXED)
61
0
#define hb_atomic_int_impl_set(AI, V)   __atomic_store_n ((AI), (V), __ATOMIC_RELEASE)
62
11.5M
#define hb_atomic_int_impl_get_relaxed(AI)  __atomic_load_n ((AI), __ATOMIC_RELAXED)
63
0
#define hb_atomic_int_impl_get(AI)    __atomic_load_n ((AI), __ATOMIC_ACQUIRE)
64
65
205k
#define hb_atomic_ptr_impl_set_relaxed(P, V)  __atomic_store_n ((P), (V), __ATOMIC_RELAXED)
66
11
#define hb_atomic_ptr_impl_get_relaxed(P) __atomic_load_n ((P), __ATOMIC_RELAXED)
67
3.68M
#define hb_atomic_ptr_impl_get(P)   __atomic_load_n ((P), __ATOMIC_ACQUIRE)
68
static inline bool
69
_hb_atomic_ptr_impl_cmplexch (const void **P, const void *O_, const void *N)
70
159
{
71
159
  const void *O = O_; // Need lvalue
72
159
  return __atomic_compare_exchange_n ((void **) P, (void **) &O, (void *) N, true, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED);
73
159
}
Unexecuted instantiation: hb-blob.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Unexecuted instantiation: hb-buffer.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
hb-common.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Line
Count
Source
70
4
{
71
4
  const void *O = O_; // Need lvalue
72
4
  return __atomic_compare_exchange_n ((void **) P, (void **) &O, (void *) N, true, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED);
73
4
}
hb-face.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Line
Count
Source
70
11
{
71
11
  const void *O = O_; // Need lvalue
72
11
  return __atomic_compare_exchange_n ((void **) P, (void **) &O, (void *) N, true, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED);
73
11
}
Unexecuted instantiation: hb-fallback-shape.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Unexecuted instantiation: hb-font.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Unexecuted instantiation: hb-number.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Unexecuted instantiation: hb-ot-face.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
hb-ot-font.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Line
Count
Source
70
13
{
71
13
  const void *O = O_; // Need lvalue
72
13
  return __atomic_compare_exchange_n ((void **) P, (void **) &O, (void *) N, true, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED);
73
13
}
Unexecuted instantiation: hb-outline.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Unexecuted instantiation: hb-ot-metrics.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Unexecuted instantiation: hb-ot-shape.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Unexecuted instantiation: hb-ot-var.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Unexecuted instantiation: hb-set.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
hb-shape-plan.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Line
Count
Source
70
35
{
71
35
  const void *O = O_; // Need lvalue
72
35
  return __atomic_compare_exchange_n ((void **) P, (void **) &O, (void *) N, true, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED);
73
35
}
Unexecuted instantiation: hb-shape.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
hb-shaper.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Line
Count
Source
70
1
{
71
1
  const void *O = O_; // Need lvalue
72
1
  return __atomic_compare_exchange_n ((void **) P, (void **) &O, (void *) N, true, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED);
73
1
}
Unexecuted instantiation: hb-static.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Unexecuted instantiation: hb-unicode.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
hb-aat-layout.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Line
Count
Source
70
55
{
71
55
  const void *O = O_; // Need lvalue
72
55
  return __atomic_compare_exchange_n ((void **) P, (void **) &O, (void *) N, true, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED);
73
55
}
Unexecuted instantiation: hb-aat-map.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Unexecuted instantiation: hb-buffer-verify.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Unexecuted instantiation: hb-draw.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Unexecuted instantiation: hb-paint-extents.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Unexecuted instantiation: hb-ot-cff1-table.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Unexecuted instantiation: hb-ot-cff2-table.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Unexecuted instantiation: hb-ot-color.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
hb-ot-layout.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Line
Count
Source
70
38
{
71
38
  const void *O = O_; // Need lvalue
72
38
  return __atomic_compare_exchange_n ((void **) P, (void **) &O, (void *) N, true, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED);
73
38
}
Unexecuted instantiation: hb-ot-map.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Unexecuted instantiation: hb-ot-shaper-arabic.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Unexecuted instantiation: hb-ot-shaper-default.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Unexecuted instantiation: hb-ot-shaper-hangul.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Unexecuted instantiation: hb-ot-shaper-hebrew.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Unexecuted instantiation: hb-ot-shaper-indic.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Unexecuted instantiation: hb-ot-shaper-khmer.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Unexecuted instantiation: hb-ot-shaper-myanmar.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Unexecuted instantiation: hb-ot-shaper-syllabic.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Unexecuted instantiation: hb-ot-shaper-thai.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Unexecuted instantiation: hb-ot-shaper-use.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Unexecuted instantiation: hb-ot-shaper-vowel-constraints.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Unexecuted instantiation: hb-ot-shape-fallback.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Unexecuted instantiation: hb-ot-shape-normalize.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Unexecuted instantiation: hb-ot-tag.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
hb-ucd.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Line
Count
Source
70
2
{
71
2
  const void *O = O_; // Need lvalue
72
2
  return __atomic_compare_exchange_n ((void **) P, (void **) &O, (void *) N, true, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED);
73
2
}
Unexecuted instantiation: hb-buffer-serialize.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Unexecuted instantiation: hb-paint.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
Unexecuted instantiation: hb-ot-shaper-indic-table.cc:_hb_atomic_ptr_impl_cmplexch(void const**, void const*, void const*)
74
159
#define hb_atomic_ptr_impl_cmpexch(P,O,N) _hb_atomic_ptr_impl_cmplexch ((const void **) (P), (O), (N))
75
76
77
#elif !defined(HB_NO_MT)
78
79
/* C++11 atomics. */
80
81
#include <atomic>
82
83
#define _hb_memory_barrier()      std::atomic_thread_fence(std::memory_order_ack_rel)
84
#define _hb_memory_r_barrier()      std::atomic_thread_fence(std::memory_order_acquire)
85
#define _hb_memory_w_barrier()      std::atomic_thread_fence(std::memory_order_release)
86
87
#define hb_atomic_int_impl_add(AI, V)   (reinterpret_cast<std::atomic<std::decay<decltype (*(AI))>::type> *> (AI)->fetch_add ((V), std::memory_order_acq_rel))
88
#define hb_atomic_int_impl_set_relaxed(AI, V) (reinterpret_cast<std::atomic<std::decay<decltype (*(AI))>::type> *> (AI)->store ((V), std::memory_order_relaxed))
89
#define hb_atomic_int_impl_set(AI, V)   (reinterpret_cast<std::atomic<std::decay<decltype (*(AI))>::type> *> (AI)->store ((V), std::memory_order_release))
90
#define hb_atomic_int_impl_get_relaxed(AI)  (reinterpret_cast<std::atomic<std::decay<decltype (*(AI))>::type> const *> (AI)->load (std::memory_order_relaxed))
91
#define hb_atomic_int_impl_get(AI)    (reinterpret_cast<std::atomic<std::decay<decltype (*(AI))>::type> const *> (AI)->load (std::memory_order_acquire))
92
93
#define hb_atomic_ptr_impl_set_relaxed(P, V)  (reinterpret_cast<std::atomic<void*> *> (P)->store ((V), std::memory_order_relaxed))
94
#define hb_atomic_ptr_impl_get_relaxed(P) (reinterpret_cast<std::atomic<void*> const *> (P)->load (std::memory_order_relaxed))
95
#define hb_atomic_ptr_impl_get(P)   (reinterpret_cast<std::atomic<void*> *> (P)->load (std::memory_order_acquire))
96
static inline bool
97
_hb_atomic_ptr_impl_cmplexch (const void **P, const void *O_, const void *N)
98
{
99
  const void *O = O_; // Need lvalue
100
  return reinterpret_cast<std::atomic<const void*> *> (P)->compare_exchange_weak (O, N, std::memory_order_acq_rel, std::memory_order_relaxed);
101
}
102
#define hb_atomic_ptr_impl_cmpexch(P,O,N) _hb_atomic_ptr_impl_cmplexch ((const void **) (P), (O), (N))
103
104
105
#else /* defined(HB_NO_MT) */
106
107
#define hb_atomic_int_impl_add(AI, V)   ((*(AI) += (V)) - (V))
108
#define _hb_memory_barrier()      do {} while (0)
109
#define hb_atomic_ptr_impl_cmpexch(P,O,N) (* (void **) (P) == (void *) (O) ? (* (void **) (P) = (void *) (N), true) : false)
110
111
#endif
112
113
114
/* This should never be disabled, even under HB_NO_MT.
115
 * except that MSVC gives me an internal compiler error, so disabled there.
116
 *
117
 * https://github.com/harfbuzz/harfbuzz/pull/4119
118
 */
119
#ifndef _hb_compiler_memory_r_barrier
120
#if defined(__ATOMIC_ACQUIRE) // gcc-like
121
31
#define _hb_compiler_memory_r_barrier() asm volatile("": : :"memory")
122
#elif !defined(_MSC_VER)
123
#include <atomic>
124
#define _hb_compiler_memory_r_barrier() std::atomic_signal_fence (std::memory_order_acquire)
125
#else
126
#define _hb_compiler_memory_r_barrier() do {} while (0)
127
#endif
128
#endif
129
130
131
132
#ifndef _hb_memory_r_barrier
133
#define _hb_memory_r_barrier()      _hb_memory_barrier ()
134
#endif
135
#ifndef _hb_memory_w_barrier
136
#define _hb_memory_w_barrier()      _hb_memory_barrier ()
137
#endif
138
#ifndef hb_atomic_int_impl_set_relaxed
139
#define hb_atomic_int_impl_set_relaxed(AI, V) (*(AI) = (V))
140
#endif
141
#ifndef hb_atomic_int_impl_get_relaxed
142
#define hb_atomic_int_impl_get_relaxed(AI)  (*(AI))
143
#endif
144
145
#ifndef hb_atomic_ptr_impl_set_relaxed
146
#define hb_atomic_ptr_impl_set_relaxed(P, V)  (*(P) = (V))
147
#endif
148
#ifndef hb_atomic_ptr_impl_get_relaxed
149
#define hb_atomic_ptr_impl_get_relaxed(P) (*(P))
150
#endif
151
#ifndef hb_atomic_int_impl_set
152
inline void hb_atomic_int_impl_set (int *AI, int v) { _hb_memory_w_barrier (); *AI = v; }
153
inline void hb_atomic_int_impl_set (short *AI, short v) { _hb_memory_w_barrier (); *AI = v; }
154
#endif
155
#ifndef hb_atomic_int_impl_get
156
inline int hb_atomic_int_impl_get (const int *AI) { int v = *AI; _hb_memory_r_barrier (); return v; }
157
inline short hb_atomic_int_impl_get (const short *AI) { short v = *AI; _hb_memory_r_barrier (); return v; }
158
#endif
159
#ifndef hb_atomic_ptr_impl_get
160
inline void *hb_atomic_ptr_impl_get (void ** const P) { void *v = *P; _hb_memory_r_barrier (); return v; }
161
#endif
162
163
164
struct hb_atomic_short_t
165
{
166
2.81k
  hb_atomic_short_t () = default;
167
0
  constexpr hb_atomic_short_t (short v) : v (v) {}
168
169
2.99k
  hb_atomic_short_t& operator = (short v_) { set_relaxed (v_); return *this; }
170
2.93M
  operator short () const { return get_relaxed (); }
171
172
2.99k
  void set_relaxed (short v_) { hb_atomic_int_impl_set_relaxed (&v, v_); }
173
0
  void set_release (short v_) { hb_atomic_int_impl_set (&v, v_); }
174
2.93M
  short get_relaxed () const { return hb_atomic_int_impl_get_relaxed (&v); }
175
0
  short get_acquire () const { return hb_atomic_int_impl_get (&v); }
176
0
  short inc () { return hb_atomic_int_impl_add (&v,  1); }
177
0
  short dec () { return hb_atomic_int_impl_add (&v, -1); }
178
179
  short v = 0;
180
};
181
182
struct hb_atomic_int_t
183
{
184
207k
  hb_atomic_int_t () = default;
185
204k
  constexpr hb_atomic_int_t (int v) : v (v) {}
186
187
617k
  hb_atomic_int_t& operator = (int v_) { set_relaxed (v_); return *this; }
188
8.60M
  operator int () const { return get_relaxed (); }
189
190
617k
  void set_relaxed (int v_) { hb_atomic_int_impl_set_relaxed (&v, v_); }
191
0
  void set_release (int v_) { hb_atomic_int_impl_set (&v, v_); }
192
8.60M
  int get_relaxed () const { return hb_atomic_int_impl_get_relaxed (&v); }
193
0
  int get_acquire () const { return hb_atomic_int_impl_get (&v); }
194
1.02M
  int inc () { return hb_atomic_int_impl_add (&v,  1); }
195
1.22M
  int dec () { return hb_atomic_int_impl_add (&v, -1); }
196
197
  int v = 0;
198
};
199
200
template <typename P>
201
struct hb_atomic_ptr_t
202
{
203
  typedef hb_remove_pointer<P> T;
204
205
205k
  hb_atomic_ptr_t () = default;
hb_atomic_ptr_t<hb_user_data_array_t>::hb_atomic_ptr_t()
Line
Count
Source
205
204k
  hb_atomic_ptr_t () = default;
hb_atomic_ptr_t<hb_ot_face_data_t*>::hb_atomic_ptr_t()
Line
Count
Source
205
11
  hb_atomic_ptr_t () = default;
hb_atomic_ptr_t<hb_fallback_face_data_t*>::hb_atomic_ptr_t()
Line
Count
Source
205
11
  hb_atomic_ptr_t () = default;
hb_atomic_ptr_t<hb_blob_t*>::hb_atomic_ptr_t()
Line
Count
Source
205
264
  hb_atomic_ptr_t () = default;
hb_atomic_ptr_t<OT::cmap_accelerator_t*>::hb_atomic_ptr_t()
Line
Count
Source
205
11
  hb_atomic_ptr_t () = default;
hb_atomic_ptr_t<OT::hmtx_accelerator_t*>::hb_atomic_ptr_t()
Line
Count
Source
205
11
  hb_atomic_ptr_t () = default;
hb_atomic_ptr_t<OT::post_accelerator_t*>::hb_atomic_ptr_t()
Line
Count
Source
205
11
  hb_atomic_ptr_t () = default;
hb_atomic_ptr_t<OT::name_accelerator_t*>::hb_atomic_ptr_t()
Line
Count
Source
205
11
  hb_atomic_ptr_t () = default;
hb_atomic_ptr_t<OT::meta_accelerator_t*>::hb_atomic_ptr_t()
Line
Count
Source
205
11
  hb_atomic_ptr_t () = default;
hb_atomic_ptr_t<OT::vmtx_accelerator_t*>::hb_atomic_ptr_t()
Line
Count
Source
205
11
  hb_atomic_ptr_t () = default;
hb_atomic_ptr_t<OT::glyf_accelerator_t*>::hb_atomic_ptr_t()
Line
Count
Source
205
11
  hb_atomic_ptr_t () = default;
hb_atomic_ptr_t<OT::cff1_accelerator_t*>::hb_atomic_ptr_t()
Line
Count
Source
205
11
  hb_atomic_ptr_t () = default;
hb_atomic_ptr_t<OT::cff2_accelerator_t*>::hb_atomic_ptr_t()
Line
Count
Source
205
11
  hb_atomic_ptr_t () = default;
hb_atomic_ptr_t<OT::gvar_accelerator_t*>::hb_atomic_ptr_t()
Line
Count
Source
205
11
  hb_atomic_ptr_t () = default;
hb_atomic_ptr_t<OT::GDEF_accelerator_t*>::hb_atomic_ptr_t()
Line
Count
Source
205
11
  hb_atomic_ptr_t () = default;
hb_atomic_ptr_t<OT::GSUB_accelerator_t*>::hb_atomic_ptr_t()
Line
Count
Source
205
11
  hb_atomic_ptr_t () = default;
hb_atomic_ptr_t<OT::GPOS_accelerator_t*>::hb_atomic_ptr_t()
Line
Count
Source
205
11
  hb_atomic_ptr_t () = default;
hb_atomic_ptr_t<OT::CBDT_accelerator_t*>::hb_atomic_ptr_t()
Line
Count
Source
205
11
  hb_atomic_ptr_t () = default;
hb_atomic_ptr_t<OT::sbix_accelerator_t*>::hb_atomic_ptr_t()
Line
Count
Source
205
11
  hb_atomic_ptr_t () = default;
hb_atomic_ptr_t<OT::SVG_accelerator_t*>::hb_atomic_ptr_t()
Line
Count
Source
205
11
  hb_atomic_ptr_t () = default;
hb_atomic_ptr_t<hb_face_t::plan_node_t>::hb_atomic_ptr_t()
Line
Count
Source
205
11
  hb_atomic_ptr_t () = default;
hb_atomic_ptr_t<hb_ot_font_data_t*>::hb_atomic_ptr_t()
Line
Count
Source
205
11
  hb_atomic_ptr_t () = default;
hb_atomic_ptr_t<hb_fallback_font_data_t*>::hb_atomic_ptr_t()
Line
Count
Source
205
11
  hb_atomic_ptr_t () = default;
Unexecuted instantiation: hb_atomic_ptr_t<hb_vector_t<OT::cff1::accelerator_t::gname_t, true> >::hb_atomic_ptr_t()
Unexecuted instantiation: hb_atomic_ptr_t<unsigned short*>::hb_atomic_ptr_t()
206
  constexpr hb_atomic_ptr_t (T* v) : v (v) {}
207
  hb_atomic_ptr_t (const hb_atomic_ptr_t &other) = delete;
208
209
204k
  void init (T* v_ = nullptr) { set_relaxed (v_); }
210
205k
  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
hb_atomic_ptr_t<hb_user_data_array_t>::set_relaxed(hb_user_data_array_t*)
Line
Count
Source
210
204k
  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
hb_atomic_ptr_t<hb_ot_font_data_t*>::set_relaxed(hb_ot_font_data_t*)
Line
Count
Source
210
32
  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
hb_atomic_ptr_t<hb_fallback_font_data_t*>::set_relaxed(hb_fallback_font_data_t*)
Line
Count
Source
210
32
  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
hb_atomic_ptr_t<hb_ot_face_data_t*>::set_relaxed(hb_ot_face_data_t*)
Line
Count
Source
210
11
  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
hb_atomic_ptr_t<hb_fallback_face_data_t*>::set_relaxed(hb_fallback_face_data_t*)
Line
Count
Source
210
11
  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
hb_atomic_ptr_t<hb_blob_t*>::set_relaxed(hb_blob_t*)
Line
Count
Source
210
264
  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
hb_atomic_ptr_t<OT::cmap_accelerator_t*>::set_relaxed(OT::cmap_accelerator_t*)
Line
Count
Source
210
11
  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
hb_atomic_ptr_t<OT::hmtx_accelerator_t*>::set_relaxed(OT::hmtx_accelerator_t*)
Line
Count
Source
210
11
  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
hb_atomic_ptr_t<OT::post_accelerator_t*>::set_relaxed(OT::post_accelerator_t*)
Line
Count
Source
210
11
  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
hb_atomic_ptr_t<OT::name_accelerator_t*>::set_relaxed(OT::name_accelerator_t*)
Line
Count
Source
210
11
  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
hb_atomic_ptr_t<OT::meta_accelerator_t*>::set_relaxed(OT::meta_accelerator_t*)
Line
Count
Source
210
11
  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
hb_atomic_ptr_t<OT::vmtx_accelerator_t*>::set_relaxed(OT::vmtx_accelerator_t*)
Line
Count
Source
210
11
  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
hb_atomic_ptr_t<OT::glyf_accelerator_t*>::set_relaxed(OT::glyf_accelerator_t*)
Line
Count
Source
210
11
  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
hb_atomic_ptr_t<OT::cff1_accelerator_t*>::set_relaxed(OT::cff1_accelerator_t*)
Line
Count
Source
210
11
  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
hb_atomic_ptr_t<OT::cff2_accelerator_t*>::set_relaxed(OT::cff2_accelerator_t*)
Line
Count
Source
210
11
  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
hb_atomic_ptr_t<OT::gvar_accelerator_t*>::set_relaxed(OT::gvar_accelerator_t*)
Line
Count
Source
210
11
  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
hb_atomic_ptr_t<OT::GDEF_accelerator_t*>::set_relaxed(OT::GDEF_accelerator_t*)
Line
Count
Source
210
11
  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
hb_atomic_ptr_t<OT::GSUB_accelerator_t*>::set_relaxed(OT::GSUB_accelerator_t*)
Line
Count
Source
210
11
  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
hb_atomic_ptr_t<OT::GPOS_accelerator_t*>::set_relaxed(OT::GPOS_accelerator_t*)
Line
Count
Source
210
11
  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
hb_atomic_ptr_t<OT::CBDT_accelerator_t*>::set_relaxed(OT::CBDT_accelerator_t*)
Line
Count
Source
210
11
  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
hb_atomic_ptr_t<OT::sbix_accelerator_t*>::set_relaxed(OT::sbix_accelerator_t*)
Line
Count
Source
210
11
  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
hb_atomic_ptr_t<OT::SVG_accelerator_t*>::set_relaxed(OT::SVG_accelerator_t*)
Line
Count
Source
210
11
  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
Unexecuted instantiation: hb_atomic_ptr_t<hb_vector_t<OT::cff1::accelerator_t::gname_t, true> >::set_relaxed(hb_vector_t<OT::cff1::accelerator_t::gname_t, true>*)
211
11
  T *get_relaxed () const { return (T *) hb_atomic_ptr_impl_get_relaxed (&v); }
Unexecuted instantiation: hb_atomic_ptr_t<hb_vector_t<OT::cff1::accelerator_t::gname_t, true> >::get_relaxed() const
Unexecuted instantiation: hb_atomic_ptr_t<hb_vector_t<CFF::code_pair_t, false> >::get_relaxed() const
Unexecuted instantiation: hb_atomic_ptr_t<OT::GPOS_accelerator_t*>::get_relaxed() const
Unexecuted instantiation: hb_atomic_ptr_t<OT::GSUB_accelerator_t*>::get_relaxed() const
hb_atomic_ptr_t<hb_cache_t<24u, 16u, 8u, true> >::get_relaxed() const
Line
Count
Source
211
11
  T *get_relaxed () const { return (T *) hb_atomic_ptr_impl_get_relaxed (&v); }
212
3.68M
  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
hb_atomic_ptr_t<hb_user_data_array_t>::get_acquire() const
Line
Count
Source
212
204k
  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
hb_atomic_ptr_t<hb_ot_font_data_t*>::get_acquire() const
Line
Count
Source
212
204k
  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
hb_atomic_ptr_t<hb_fallback_font_data_t*>::get_acquire() const
Line
Count
Source
212
32
  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
hb_atomic_ptr_t<hb_language_item_t>::get_acquire() const
Line
Count
Source
212
102k
  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
Unexecuted instantiation: hb_atomic_ptr_t<__locale_struct*>::get_acquire() const
hb_atomic_ptr_t<hb_language_impl_t const*>::get_acquire() const
Line
Count
Source
212
102k
  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
hb_atomic_ptr_t<hb_face_t::plan_node_t>::get_acquire() const
Line
Count
Source
212
204k
  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
hb_atomic_ptr_t<hb_ot_face_data_t*>::get_acquire() const
Line
Count
Source
212
204k
  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
hb_atomic_ptr_t<hb_fallback_face_data_t*>::get_acquire() const
Line
Count
Source
212
11
  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
hb_atomic_ptr_t<OT::cmap_accelerator_t*>::get_acquire() const
Line
Count
Source
212
11
  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
hb_atomic_ptr_t<hb_blob_t*>::get_acquire() const
Line
Count
Source
212
350
  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
hb_atomic_ptr_t<OT::hmtx_accelerator_t*>::get_acquire() const
Line
Count
Source
212
11
  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
Unexecuted instantiation: hb_atomic_ptr_t<unsigned short*>::get_acquire() const
hb_atomic_ptr_t<OT::post_accelerator_t*>::get_acquire() const
Line
Count
Source
212
11
  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
hb_atomic_ptr_t<OT::name_accelerator_t*>::get_acquire() const
Line
Count
Source
212
11
  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
hb_atomic_ptr_t<OT::meta_accelerator_t*>::get_acquire() const
Line
Count
Source
212
11
  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
hb_atomic_ptr_t<OT::vmtx_accelerator_t*>::get_acquire() const
Line
Count
Source
212
11
  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
hb_atomic_ptr_t<OT::glyf_accelerator_t*>::get_acquire() const
Line
Count
Source
212
11
  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
hb_atomic_ptr_t<OT::cff1_accelerator_t*>::get_acquire() const
Line
Count
Source
212
11
  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
hb_atomic_ptr_t<OT::cff2_accelerator_t*>::get_acquire() const
Line
Count
Source
212
11
  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
hb_atomic_ptr_t<OT::gvar_accelerator_t*>::get_acquire() const
Line
Count
Source
212
11
  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
hb_atomic_ptr_t<OT::GDEF_accelerator_t*>::get_acquire() const
Line
Count
Source
212
1.02M
  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
hb_atomic_ptr_t<OT::hb_ot_layout_lookup_accelerator_t>::get_acquire() const
Line
Count
Source
212
87
  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
hb_atomic_ptr_t<OT::GSUB_accelerator_t*>::get_acquire() const
Line
Count
Source
212
409k
  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
hb_atomic_ptr_t<OT::GPOS_accelerator_t*>::get_acquire() const
Line
Count
Source
212
409k
  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
hb_atomic_ptr_t<OT::CBDT_accelerator_t*>::get_acquire() const
Line
Count
Source
212
11
  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
hb_atomic_ptr_t<OT::sbix_accelerator_t*>::get_acquire() const
Line
Count
Source
212
11
  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
hb_atomic_ptr_t<OT::SVG_accelerator_t*>::get_acquire() const
Line
Count
Source
212
11
  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
Unexecuted instantiation: hb_atomic_ptr_t<hb_vector_t<OT::cff1::accelerator_t::gname_t, true> >::get_acquire() const
hb_atomic_ptr_t<hb_font_funcs_t*>::get_acquire() const
Line
Count
Source
212
12
  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
Unexecuted instantiation: hb_atomic_ptr_t<hb_cache_t<24u, 16u, 8u, true> >::get_acquire() const
Unexecuted instantiation: hb_atomic_ptr_t<hb_draw_funcs_t*>::get_acquire() const
Unexecuted instantiation: hb_atomic_ptr_t<char const**>::get_acquire() const
hb_atomic_ptr_t<hb_shaper_entry_t*>::get_acquire() const
Line
Count
Source
212
204k
  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
Unexecuted instantiation: hb_atomic_ptr_t<hb_paint_funcs_t*>::get_acquire() const
Unexecuted instantiation: hb_atomic_ptr_t<arabic_fallback_plan_t>::get_acquire() const
hb_atomic_ptr_t<hb_unicode_funcs_t*>::get_acquire() const
Line
Count
Source
212
614k
  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
213
159
  bool cmpexch (const T *old, T *new_) const { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); }
hb_atomic_ptr_t<hb_user_data_array_t>::cmpexch(hb_user_data_array_t const*, hb_user_data_array_t*) const
Line
Count
Source
213
11
  bool cmpexch (const T *old, T *new_) const { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); }
hb_atomic_ptr_t<hb_language_item_t>::cmpexch(hb_language_item_t const*, hb_language_item_t*) const
Line
Count
Source
213
3
  bool cmpexch (const T *old, T *new_) const { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); }
Unexecuted instantiation: hb_atomic_ptr_t<__locale_struct*>::cmpexch(__locale_struct const*, __locale_struct*) const
hb_atomic_ptr_t<hb_language_impl_t const*>::cmpexch(hb_language_impl_t const*, hb_language_impl_t const*) const
Line
Count
Source
213
1
  bool cmpexch (const T *old, T *new_) const { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); }
hb_atomic_ptr_t<hb_blob_t*>::cmpexch(hb_blob_t const*, hb_blob_t*) const
Line
Count
Source
213
66
  bool cmpexch (const T *old, T *new_) const { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); }
Unexecuted instantiation: hb_atomic_ptr_t<OT::cmap_accelerator_t*>::cmpexch(OT::cmap_accelerator_t const*, OT::cmap_accelerator_t*) const
Unexecuted instantiation: hb_atomic_ptr_t<OT::hmtx_accelerator_t*>::cmpexch(OT::hmtx_accelerator_t const*, OT::hmtx_accelerator_t*) const
Unexecuted instantiation: hb_atomic_ptr_t<OT::vmtx_accelerator_t*>::cmpexch(OT::vmtx_accelerator_t const*, OT::vmtx_accelerator_t*) const
Unexecuted instantiation: hb_atomic_ptr_t<OT::gvar_accelerator_t*>::cmpexch(OT::gvar_accelerator_t const*, OT::gvar_accelerator_t*) const
Unexecuted instantiation: hb_atomic_ptr_t<hb_vector_t<OT::cff1::accelerator_t::gname_t, true> >::cmpexch(hb_vector_t<OT::cff1::accelerator_t::gname_t, true> const*, hb_vector_t<OT::cff1::accelerator_t::gname_t, true>*) const
hb_atomic_ptr_t<OT::GDEF_accelerator_t*>::cmpexch(OT::GDEF_accelerator_t const*, OT::GDEF_accelerator_t*) const
Line
Count
Source
213
11
  bool cmpexch (const T *old, T *new_) const { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); }
hb_atomic_ptr_t<OT::hb_ot_layout_lookup_accelerator_t>::cmpexch(OT::hb_ot_layout_lookup_accelerator_t const*, OT::hb_ot_layout_lookup_accelerator_t*) const
Line
Count
Source
213
5
  bool cmpexch (const T *old, T *new_) const { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); }
Unexecuted instantiation: hb_atomic_ptr_t<unsigned short*>::cmpexch(unsigned short const*, unsigned short*) const
Unexecuted instantiation: hb_atomic_ptr_t<hb_cache_t<24u, 16u, 8u, true> >::cmpexch(hb_cache_t<24u, 16u, 8u, true> const*, hb_cache_t<24u, 16u, 8u, true>*) const
Unexecuted instantiation: hb_atomic_ptr_t<OT::glyf_accelerator_t*>::cmpexch(OT::glyf_accelerator_t const*, OT::glyf_accelerator_t*) const
Unexecuted instantiation: hb_atomic_ptr_t<OT::cff2_accelerator_t*>::cmpexch(OT::cff2_accelerator_t const*, OT::cff2_accelerator_t*) const
Unexecuted instantiation: hb_atomic_ptr_t<OT::cff1_accelerator_t*>::cmpexch(OT::cff1_accelerator_t const*, OT::cff1_accelerator_t*) const
Unexecuted instantiation: hb_atomic_ptr_t<OT::SVG_accelerator_t*>::cmpexch(OT::SVG_accelerator_t const*, OT::SVG_accelerator_t*) const
Unexecuted instantiation: hb_atomic_ptr_t<OT::CBDT_accelerator_t*>::cmpexch(OT::CBDT_accelerator_t const*, OT::CBDT_accelerator_t*) const
Unexecuted instantiation: hb_atomic_ptr_t<OT::sbix_accelerator_t*>::cmpexch(OT::sbix_accelerator_t const*, OT::sbix_accelerator_t*) const
Unexecuted instantiation: hb_atomic_ptr_t<OT::post_accelerator_t*>::cmpexch(OT::post_accelerator_t const*, OT::post_accelerator_t*) const
hb_atomic_ptr_t<hb_font_funcs_t*>::cmpexch(hb_font_funcs_t const*, hb_font_funcs_t*) const
Line
Count
Source
213
2
  bool cmpexch (const T *old, T *new_) const { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); }
Unexecuted instantiation: hb_atomic_ptr_t<hb_draw_funcs_t*>::cmpexch(hb_draw_funcs_t const*, hb_draw_funcs_t*) const
hb_atomic_ptr_t<hb_ot_font_data_t*>::cmpexch(hb_ot_font_data_t const*, hb_ot_font_data_t*) const
Line
Count
Source
213
11
  bool cmpexch (const T *old, T *new_) const { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); }
Unexecuted instantiation: hb_atomic_ptr_t<hb_fallback_font_data_t*>::cmpexch(hb_fallback_font_data_t const*, hb_fallback_font_data_t*) const
hb_atomic_ptr_t<hb_ot_face_data_t*>::cmpexch(hb_ot_face_data_t const*, hb_ot_face_data_t*) const
Line
Count
Source
213
11
  bool cmpexch (const T *old, T *new_) const { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); }
Unexecuted instantiation: hb_atomic_ptr_t<hb_fallback_face_data_t*>::cmpexch(hb_fallback_face_data_t const*, hb_fallback_face_data_t*) const
hb_atomic_ptr_t<hb_face_t::plan_node_t>::cmpexch(hb_face_t::plan_node_t const*, hb_face_t::plan_node_t*) const
Line
Count
Source
213
13
  bool cmpexch (const T *old, T *new_) const { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); }
Unexecuted instantiation: hb_atomic_ptr_t<char const**>::cmpexch(char const* const*, char const**) const
hb_atomic_ptr_t<hb_shaper_entry_t*>::cmpexch(hb_shaper_entry_t const*, hb_shaper_entry_t*) const
Line
Count
Source
213
1
  bool cmpexch (const T *old, T *new_) const { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); }
Unexecuted instantiation: hb_atomic_ptr_t<hb_paint_funcs_t*>::cmpexch(hb_paint_funcs_t const*, hb_paint_funcs_t*) const
hb_atomic_ptr_t<OT::GSUB_accelerator_t*>::cmpexch(OT::GSUB_accelerator_t const*, OT::GSUB_accelerator_t*) const
Line
Count
Source
213
11
  bool cmpexch (const T *old, T *new_) const { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); }
hb_atomic_ptr_t<OT::GPOS_accelerator_t*>::cmpexch(OT::GPOS_accelerator_t const*, OT::GPOS_accelerator_t*) const
Line
Count
Source
213
11
  bool cmpexch (const T *old, T *new_) const { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); }
Unexecuted instantiation: hb_atomic_ptr_t<arabic_fallback_plan_t>::cmpexch(arabic_fallback_plan_t const*, arabic_fallback_plan_t*) const
hb_atomic_ptr_t<hb_unicode_funcs_t*>::cmpexch(hb_unicode_funcs_t const*, hb_unicode_funcs_t*) const
Line
Count
Source
213
2
  bool cmpexch (const T *old, T *new_) const { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); }
214
215
0
  T * operator -> () const                    { return get_acquire (); }
216
409k
  template <typename C> operator C * () const { return get_acquire (); }
hb_atomic_ptr_t<hb_language_item_t>::operator hb_language_item_t*<hb_language_item_t>() const
Line
Count
Source
216
102k
  template <typename C> operator C * () const { return get_acquire (); }
hb_atomic_ptr_t<hb_language_impl_t const*>::operator hb_language_impl_t const*<hb_language_impl_t const>() const
Line
Count
Source
216
102k
  template <typename C> operator C * () const { return get_acquire (); }
hb_atomic_ptr_t<hb_face_t::plan_node_t>::operator hb_face_t::plan_node_t*<hb_face_t::plan_node_t>() const
Line
Count
Source
216
204k
  template <typename C> operator C * () const { return get_acquire (); }
hb_atomic_ptr_t<OT::hb_ot_layout_lookup_accelerator_t>::operator void*<void>() const
Line
Count
Source
216
42
  template <typename C> operator C * () const { return get_acquire (); }
Unexecuted instantiation: hb_atomic_ptr_t<arabic_fallback_plan_t>::operator arabic_fallback_plan_t*<arabic_fallback_plan_t>() const
217
218
  T *v = nullptr;
219
};
220
221
222
#endif /* HB_ATOMIC_HH */