Coverage Report

Created: 2026-11-06 11:29

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/work/workdir/UnpackedTarball/harfbuzz/src/hb-bit-set-invertible.hh
Line
Count
Source
1
/*
2
 * Copyright © 2012,2017  Google, Inc.
3
 * Copyright © 2021 Behdad Esfahbod
4
 *
5
 *  This is part of HarfBuzz, a text shaping library.
6
 *
7
 * Permission is hereby granted, without written agreement and without
8
 * license or royalty fees, to use, copy, modify, and distribute this
9
 * software and its documentation for any purpose, provided that the
10
 * above copyright notice and the following two paragraphs appear in
11
 * all copies of this software.
12
 *
13
 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
14
 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
15
 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
16
 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
17
 * DAMAGE.
18
 *
19
 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
20
 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
21
 * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
22
 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
23
 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
24
 *
25
 * Google Author(s): Behdad Esfahbod
26
 */
27
28
#ifndef HB_BIT_SET_INVERTIBLE_HH
29
#define HB_BIT_SET_INVERTIBLE_HH
30
31
#include "hb.hh"
32
#include "hb-bit-set.hh"
33
34
35
struct hb_bit_set_invertible_t
36
{
37
  hb_bit_set_t s;
38
  bool inverted = false;
39
40
102M
  hb_bit_set_invertible_t () = default;
41
  hb_bit_set_invertible_t (const hb_bit_set_invertible_t& o) = default;
42
0
  hb_bit_set_invertible_t (hb_bit_set_invertible_t&& other)  noexcept : hb_bit_set_invertible_t () { hb_swap (*this, other); }
43
  hb_bit_set_invertible_t& operator= (const hb_bit_set_invertible_t& o) = default;
44
0
  hb_bit_set_invertible_t& operator= (hb_bit_set_invertible_t&& other)  noexcept { hb_swap (*this, other); return *this; }
45
  friend void swap (hb_bit_set_invertible_t &a, hb_bit_set_invertible_t &b) noexcept
46
0
  {
47
0
    if (likely (!a.s.successful || !b.s.successful))
48
0
      return;
49
0
    hb_swap (a.inverted, b.inverted);
50
0
    hb_swap (a.s, b.s);
51
0
  }
52
53
102M
  void init () { s.init (); inverted = false; }
54
102M
  void fini () { s.fini (); }
55
0
  void err () { s.err (); }
56
731k
  bool in_error () const { return s.in_error (); }
57
0
  explicit operator bool () const { return !is_empty (); }
58
59
0
  void alloc (unsigned sz) { s.alloc (sz); }
60
  void reset ()
61
0
  {
62
0
    s.reset ();
63
0
    inverted = false;
64
0
  }
65
  void clear ()
66
0
  {
67
0
    s.clear ();
68
0
    if (likely (s.successful))
69
0
      inverted = false;
70
0
  }
71
  void invert ()
72
40.6k
  {
73
40.6k
    if (likely (s.successful))
74
40.6k
      inverted = !inverted;
75
40.6k
  }
76
77
  bool is_inverted () const
78
20.3k
  {
79
20.3k
    return inverted;
80
20.3k
  }
81
82
  bool is_empty () const
83
54.2k
  {
84
54.2k
    hb_codepoint_t v = INVALID;
85
54.2k
    next (&v);
86
54.2k
    return v == INVALID;
87
54.2k
  }
88
0
  uint32_t hash () const { return s.hash () ^ (uint32_t) inverted; }
89
90
  hb_codepoint_t get_min () const
91
20.3k
  {
92
20.3k
    hb_codepoint_t v = INVALID;
93
20.3k
    next (&v);
94
20.3k
    return v;
95
20.3k
  }
96
  hb_codepoint_t get_max () const
97
20.3k
  {
98
20.3k
    hb_codepoint_t v = INVALID;
99
20.3k
    previous (&v);
100
20.3k
    return v;
101
20.3k
  }
102
  unsigned int get_population () const
103
607k
  { return inverted ? INVALID - s.get_population () : s.get_population (); }
104
  bool get_singleton (hb_codepoint_t *codepoint) const
105
0
  {
106
0
    if (likely (!inverted))
107
0
      return s.get_singleton (codepoint);
108
0
    if (s.get_population () != INVALID - 1)
109
0
      return false;
110
0
    *codepoint = get_min ();
111
0
    return *codepoint != INVALID;
112
0
  }
113
114
115
189M
  void add (hb_codepoint_t g) { unlikely (inverted) ? s.del (g) : s.add (g); }
116
  void add_bits (hb_codepoint_t g, uint64_t bits)
117
0
  { unlikely (inverted) ? s.del_bits (g, bits) : s.add_bits (g, bits); }
118
  bool add_range (hb_codepoint_t a, hb_codepoint_t b)
119
188k
  { return unlikely (inverted) ? ((void) s.del_range (a, b), true) : s.add_range (a, b); }
120
121
  template <typename T>
122
  void add_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
123
73.3k
  { inverted ? s.del_array (array, count, stride) : s.add_array (array, count, stride); }
Unexecuted instantiation: void hb_bit_set_invertible_t::add_array<OT::Index>(OT::Index const*, unsigned int, unsigned int)
Unexecuted instantiation: void hb_bit_set_invertible_t::add_array<OT::HBGlyphID16>(OT::HBGlyphID16 const*, unsigned int, unsigned int)
Unexecuted instantiation: void hb_bit_set_invertible_t::add_array<OT::HBGlyphID24>(OT::HBGlyphID24 const*, unsigned int, unsigned int)
void hb_bit_set_invertible_t::add_array<unsigned int>(unsigned int const*, unsigned int, unsigned int)
Line
Count
Source
123
73.3k
  { inverted ? s.del_array (array, count, stride) : s.add_array (array, count, stride); }
124
  template <typename T>
125
  void add_array (const hb_array_t<const T>& arr) { add_array (&arr, arr.len ()); }
126
127
  /* Might return false if array looks unsorted.
128
   * Used for faster rejection of corrupt data. */
129
  template <typename T>
130
  bool add_sorted_array (const T *array, unsigned int count, unsigned int stride=sizeof(T))
131
12.3k
  { return inverted ? s.del_sorted_array (array, count, stride) : s.add_sorted_array (array, count, stride); }
Unexecuted instantiation: bool hb_bit_set_invertible_t::add_sorted_array<OT::HBGlyphID16>(OT::HBGlyphID16 const*, unsigned int, unsigned int)
Unexecuted instantiation: bool hb_bit_set_invertible_t::add_sorted_array<OT::HBGlyphID24>(OT::HBGlyphID24 const*, unsigned int, unsigned int)
bool hb_bit_set_invertible_t::add_sorted_array<unsigned int>(unsigned int const*, unsigned int, unsigned int)
Line
Count
Source
131
12.3k
  { return inverted ? s.del_sorted_array (array, count, stride) : s.add_sorted_array (array, count, stride); }
132
  template <typename T>
133
  bool add_sorted_array (const hb_sorted_array_t<const T>& arr) { return add_sorted_array (&arr, arr.len ()); }
134
135
466k
  void del (hb_codepoint_t g) { unlikely (inverted) ? s.add (g) : s.del (g); }
136
  void del_range (hb_codepoint_t a, hb_codepoint_t b)
137
40.6k
  { unlikely (inverted) ? (void) s.add_range (a, b) : s.del_range (a, b); }
138
139
418M
  bool get (hb_codepoint_t g) const { return s.get (g) ^ inverted; }
140
0
  bool may_have (hb_codepoint_t g) const { return get (g); }
141
142
  /* Has interface. */
143
0
  bool operator [] (hb_codepoint_t k) const { return get (k); }
144
0
  bool has (hb_codepoint_t k) const { return (*this)[k]; }
145
  /* Predicate. */
146
0
  bool operator () (hb_codepoint_t k) const { return has (k); }
147
148
  /* Sink interface. */
149
  hb_bit_set_invertible_t& operator << (hb_codepoint_t v)
150
0
  { add (v); return *this; }
151
  hb_bit_set_invertible_t& operator << (const hb_codepoint_pair_t& range)
152
0
  { add_range (range.first, range.second); return *this; }
153
154
  bool may_intersect (const hb_bit_set_invertible_t &other) const
155
0
  { return inverted || other.inverted || s.intersects (other.s); }
156
157
  bool intersects (const hb_bit_set_invertible_t &other) const
158
0
  {
159
0
    if (likely (!inverted))
160
0
      return unlikely (other.inverted) ? !s.is_subset (other.s)
161
0
               : s.intersects (other.s);
162
0
    if (likely (!other.inverted))
163
0
      return !other.s.is_subset (s);
164
165
0
    unsigned population = s.get_population ();
166
0
    unsigned other_population = other.s.get_population ();
167
0
    if ((uint64_t) population + other_population < INVALID)
168
0
      return true;
169
170
0
    return population >= other_population
171
0
   ? !hb_all (iter (), other.s)
172
0
   : !hb_all (other.iter (), s);
173
0
  }
174
175
  bool intersects (hb_codepoint_t first, hb_codepoint_t last) const
176
0
  {
177
0
    hb_codepoint_t c = first - 1;
178
0
    return next (&c) && c <= last;
179
0
  }
180
181
  void set (const hb_bit_set_invertible_t &other)
182
264k
  {
183
264k
    s.set (other.s);
184
264k
    if (likely (s.successful))
185
264k
      inverted = other.inverted;
186
264k
  }
187
188
  bool is_equal (const hb_bit_set_invertible_t &other) const
189
0
  {
190
0
    if (likely (inverted == other.inverted))
191
0
      return s.is_equal (other.s);
192
0
    else
193
0
    {
194
0
      if (get_population () != other.get_population ())
195
0
  return false;
196
197
      /* TODO Add iter_ranges() and use here. */
198
0
      auto it1 = iter ();
199
0
      auto it2 = other.iter ();
200
0
      return hb_all (+ hb_zip (it1, it2)
201
0
         | hb_map ([](hb_codepoint_pair_t _) { return _.first == _.second; }));
202
0
    }
203
0
  }
204
205
  bool is_subset (const hb_bit_set_invertible_t &larger_set) const
206
0
  {
207
0
    if (unlikely (inverted != larger_set.inverted))
208
0
    {
209
0
      if (inverted)
210
0
  return hb_all (iter (), larger_set.s);
211
0
      else
212
        // larger set is inverted so larger_set.s is the set of things that are not present
213
        // in larger_set, therefore if s has any of those it can't be a subset.
214
0
  return !s.intersects (larger_set.s);
215
0
    }
216
0
    else
217
0
      return unlikely (inverted) ? larger_set.s.is_subset (s) : s.is_subset (larger_set.s);
218
0
  }
219
220
  protected:
221
  template <typename Op>
222
  void process (const Op& op,
223
    const hb_bit_set_invertible_t &other,
224
    hb_vector_t<unsigned> *workspace = nullptr)
225
775
  { s.process (op, other.s, workspace); }
Unexecuted instantiation: hb-aat-layout.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-aat-layout.cc:void hb_bit_set_invertible_t::process<$_13>($_13 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-aat-layout.cc:void hb_bit_set_invertible_t::process<$_15>($_15 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-aat-layout.cc:void hb_bit_set_invertible_t::process<$_25>($_25 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-aat-layout.cc:void hb_bit_set_invertible_t::process<$_17>($_17 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-aat-map.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-aat-map.cc:void hb_bit_set_invertible_t::process<$_13>($_13 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-aat-map.cc:void hb_bit_set_invertible_t::process<$_15>($_15 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-aat-map.cc:void hb_bit_set_invertible_t::process<$_25>($_25 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-aat-map.cc:void hb_bit_set_invertible_t::process<$_17>($_17 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-buffer.cc:void hb_bit_set_invertible_t::process<$_12>($_12 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-buffer.cc:void hb_bit_set_invertible_t::process<$_11>($_11 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-buffer.cc:void hb_bit_set_invertible_t::process<$_13>($_13 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-buffer.cc:void hb_bit_set_invertible_t::process<$_23>($_23 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-buffer.cc:void hb_bit_set_invertible_t::process<$_15>($_15 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-face.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-face.cc:void hb_bit_set_invertible_t::process<$_13>($_13 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-face.cc:void hb_bit_set_invertible_t::process<$_15>($_15 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-face.cc:void hb_bit_set_invertible_t::process<$_25>($_25 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-face.cc:void hb_bit_set_invertible_t::process<$_17>($_17 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-face-builder.cc:void hb_bit_set_invertible_t::process<$_13>($_13 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-face-builder.cc:void hb_bit_set_invertible_t::process<$_12>($_12 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-face-builder.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-face-builder.cc:void hb_bit_set_invertible_t::process<$_24>($_24 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-face-builder.cc:void hb_bit_set_invertible_t::process<$_16>($_16 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-font.cc:void hb_bit_set_invertible_t::process<$_13>($_13 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-font.cc:void hb_bit_set_invertible_t::process<$_12>($_12 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-font.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-font.cc:void hb_bit_set_invertible_t::process<$_24>($_24 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-font.cc:void hb_bit_set_invertible_t::process<$_16>($_16 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-map.cc:void hb_bit_set_invertible_t::process<$_12>($_12 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-map.cc:void hb_bit_set_invertible_t::process<$_11>($_11 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-map.cc:void hb_bit_set_invertible_t::process<$_13>($_13 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-map.cc:void hb_bit_set_invertible_t::process<$_23>($_23 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-map.cc:void hb_bit_set_invertible_t::process<$_15>($_15 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-color.cc:void hb_bit_set_invertible_t::process<$_13>($_13 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-color.cc:void hb_bit_set_invertible_t::process<$_12>($_12 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-color.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-color.cc:void hb_bit_set_invertible_t::process<$_24>($_24 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-color.cc:void hb_bit_set_invertible_t::process<$_16>($_16 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-face.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-face.cc:void hb_bit_set_invertible_t::process<$_13>($_13 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-face.cc:void hb_bit_set_invertible_t::process<$_15>($_15 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-face.cc:void hb_bit_set_invertible_t::process<$_25>($_25 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-face.cc:void hb_bit_set_invertible_t::process<$_17>($_17 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-fetch.cc:void hb_bit_set_invertible_t::process<$_13>($_13 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-fetch.cc:void hb_bit_set_invertible_t::process<$_12>($_12 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-fetch.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-fetch.cc:void hb_bit_set_invertible_t::process<$_24>($_24 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-fetch.cc:void hb_bit_set_invertible_t::process<$_16>($_16 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-font.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-font.cc:void hb_bit_set_invertible_t::process<$_13>($_13 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-font.cc:void hb_bit_set_invertible_t::process<$_15>($_15 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-font.cc:void hb_bit_set_invertible_t::process<$_25>($_25 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-font.cc:void hb_bit_set_invertible_t::process<$_17>($_17 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: VARC.cc:void hb_bit_set_invertible_t::process<$_17>($_17 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: VARC.cc:void hb_bit_set_invertible_t::process<$_16>($_16 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: VARC.cc:void hb_bit_set_invertible_t::process<$_18>($_18 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: VARC.cc:void hb_bit_set_invertible_t::process<$_27>($_27 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: VARC.cc:void hb_bit_set_invertible_t::process<$_20>($_20 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-layout.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
hb-ot-layout.cc:void hb_bit_set_invertible_t::process<$_13>($_13 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Line
Count
Source
225
775
  { s.process (op, other.s, workspace); }
Unexecuted instantiation: hb-ot-layout.cc:void hb_bit_set_invertible_t::process<$_15>($_15 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-layout.cc:void hb_bit_set_invertible_t::process<$_25>($_25 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-layout.cc:void hb_bit_set_invertible_t::process<$_17>($_17 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-math.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-math.cc:void hb_bit_set_invertible_t::process<$_13>($_13 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-math.cc:void hb_bit_set_invertible_t::process<$_15>($_15 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-math.cc:void hb_bit_set_invertible_t::process<$_25>($_25 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-math.cc:void hb_bit_set_invertible_t::process<$_17>($_17 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-metrics.cc:void hb_bit_set_invertible_t::process<$_13>($_13 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-metrics.cc:void hb_bit_set_invertible_t::process<$_12>($_12 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-metrics.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-metrics.cc:void hb_bit_set_invertible_t::process<$_24>($_24 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-metrics.cc:void hb_bit_set_invertible_t::process<$_16>($_16 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-name.cc:void hb_bit_set_invertible_t::process<$_11>($_11 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-name.cc:void hb_bit_set_invertible_t::process<$_10>($_10 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-name.cc:void hb_bit_set_invertible_t::process<$_12>($_12 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-name.cc:void hb_bit_set_invertible_t::process<$_22>($_22 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-name.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shape.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shape.cc:void hb_bit_set_invertible_t::process<$_13>($_13 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shape.cc:void hb_bit_set_invertible_t::process<$_15>($_15 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shape.cc:void hb_bit_set_invertible_t::process<$_25>($_25 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shape.cc:void hb_bit_set_invertible_t::process<$_17>($_17 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-var.cc:void hb_bit_set_invertible_t::process<$_13>($_13 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-var.cc:void hb_bit_set_invertible_t::process<$_12>($_12 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-var.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-var.cc:void hb_bit_set_invertible_t::process<$_24>($_24 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-var.cc:void hb_bit_set_invertible_t::process<$_16>($_16 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-set.cc:void hb_bit_set_invertible_t::process<$_10>($_10 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-set.cc:void hb_bit_set_invertible_t::process<$_9>($_9 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-set.cc:void hb_bit_set_invertible_t::process<$_11>($_11 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-set.cc:void hb_bit_set_invertible_t::process<$_22>($_22 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-set.cc:void hb_bit_set_invertible_t::process<$_13>($_13 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-static.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-static.cc:void hb_bit_set_invertible_t::process<$_13>($_13 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-static.cc:void hb_bit_set_invertible_t::process<$_15>($_15 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-static.cc:void hb_bit_set_invertible_t::process<$_25>($_25 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-static.cc:void hb_bit_set_invertible_t::process<$_17>($_17 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-style.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-style.cc:void hb_bit_set_invertible_t::process<$_13>($_13 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-style.cc:void hb_bit_set_invertible_t::process<$_15>($_15 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-style.cc:void hb_bit_set_invertible_t::process<$_25>($_25 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-style.cc:void hb_bit_set_invertible_t::process<$_17>($_17 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-cff1-table.cc:void hb_bit_set_invertible_t::process<$_13>($_13 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-cff1-table.cc:void hb_bit_set_invertible_t::process<$_12>($_12 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-cff1-table.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-cff1-table.cc:void hb_bit_set_invertible_t::process<$_24>($_24 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-cff1-table.cc:void hb_bit_set_invertible_t::process<$_16>($_16 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-cff2-table.cc:void hb_bit_set_invertible_t::process<$_13>($_13 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-cff2-table.cc:void hb_bit_set_invertible_t::process<$_12>($_12 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-cff2-table.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-cff2-table.cc:void hb_bit_set_invertible_t::process<$_24>($_24 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-cff2-table.cc:void hb_bit_set_invertible_t::process<$_16>($_16 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-map.cc:void hb_bit_set_invertible_t::process<$_11>($_11 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-map.cc:void hb_bit_set_invertible_t::process<$_10>($_10 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-map.cc:void hb_bit_set_invertible_t::process<$_12>($_12 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-map.cc:void hb_bit_set_invertible_t::process<$_22>($_22 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-map.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-arabic.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-arabic.cc:void hb_bit_set_invertible_t::process<$_13>($_13 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-arabic.cc:void hb_bit_set_invertible_t::process<$_15>($_15 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-arabic.cc:void hb_bit_set_invertible_t::process<$_25>($_25 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-arabic.cc:void hb_bit_set_invertible_t::process<$_17>($_17 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-default.cc:void hb_bit_set_invertible_t::process<$_11>($_11 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-default.cc:void hb_bit_set_invertible_t::process<$_10>($_10 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-default.cc:void hb_bit_set_invertible_t::process<$_12>($_12 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-default.cc:void hb_bit_set_invertible_t::process<$_22>($_22 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-default.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-hangul.cc:void hb_bit_set_invertible_t::process<$_11>($_11 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-hangul.cc:void hb_bit_set_invertible_t::process<$_10>($_10 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-hangul.cc:void hb_bit_set_invertible_t::process<$_12>($_12 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-hangul.cc:void hb_bit_set_invertible_t::process<$_22>($_22 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-hangul.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-hebrew.cc:void hb_bit_set_invertible_t::process<$_11>($_11 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-hebrew.cc:void hb_bit_set_invertible_t::process<$_10>($_10 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-hebrew.cc:void hb_bit_set_invertible_t::process<$_12>($_12 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-hebrew.cc:void hb_bit_set_invertible_t::process<$_22>($_22 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-hebrew.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-indic.cc:void hb_bit_set_invertible_t::process<$_11>($_11 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-indic.cc:void hb_bit_set_invertible_t::process<$_10>($_10 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-indic.cc:void hb_bit_set_invertible_t::process<$_12>($_12 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-indic.cc:void hb_bit_set_invertible_t::process<$_22>($_22 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-indic.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-khmer.cc:void hb_bit_set_invertible_t::process<$_11>($_11 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-khmer.cc:void hb_bit_set_invertible_t::process<$_10>($_10 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-khmer.cc:void hb_bit_set_invertible_t::process<$_12>($_12 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-khmer.cc:void hb_bit_set_invertible_t::process<$_22>($_22 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-khmer.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-myanmar.cc:void hb_bit_set_invertible_t::process<$_11>($_11 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-myanmar.cc:void hb_bit_set_invertible_t::process<$_10>($_10 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-myanmar.cc:void hb_bit_set_invertible_t::process<$_12>($_12 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-myanmar.cc:void hb_bit_set_invertible_t::process<$_22>($_22 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-myanmar.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-syllabic.cc:void hb_bit_set_invertible_t::process<$_11>($_11 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-syllabic.cc:void hb_bit_set_invertible_t::process<$_10>($_10 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-syllabic.cc:void hb_bit_set_invertible_t::process<$_12>($_12 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-syllabic.cc:void hb_bit_set_invertible_t::process<$_22>($_22 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-syllabic.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-thai.cc:void hb_bit_set_invertible_t::process<$_11>($_11 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-thai.cc:void hb_bit_set_invertible_t::process<$_10>($_10 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-thai.cc:void hb_bit_set_invertible_t::process<$_12>($_12 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-thai.cc:void hb_bit_set_invertible_t::process<$_22>($_22 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-thai.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-use.cc:void hb_bit_set_invertible_t::process<$_12>($_12 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-use.cc:void hb_bit_set_invertible_t::process<$_11>($_11 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-use.cc:void hb_bit_set_invertible_t::process<$_13>($_13 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-use.cc:void hb_bit_set_invertible_t::process<$_23>($_23 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-use.cc:void hb_bit_set_invertible_t::process<$_15>($_15 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-vowel-constraints.cc:void hb_bit_set_invertible_t::process<$_11>($_11 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-vowel-constraints.cc:void hb_bit_set_invertible_t::process<$_10>($_10 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-vowel-constraints.cc:void hb_bit_set_invertible_t::process<$_12>($_12 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-vowel-constraints.cc:void hb_bit_set_invertible_t::process<$_22>($_22 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-vowel-constraints.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shape-fallback.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shape-fallback.cc:void hb_bit_set_invertible_t::process<$_13>($_13 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shape-fallback.cc:void hb_bit_set_invertible_t::process<$_15>($_15 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shape-fallback.cc:void hb_bit_set_invertible_t::process<$_25>($_25 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shape-fallback.cc:void hb_bit_set_invertible_t::process<$_17>($_17 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shape-normalize.cc:void hb_bit_set_invertible_t::process<$_11>($_11 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shape-normalize.cc:void hb_bit_set_invertible_t::process<$_10>($_10 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shape-normalize.cc:void hb_bit_set_invertible_t::process<$_12>($_12 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shape-normalize.cc:void hb_bit_set_invertible_t::process<$_22>($_22 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shape-normalize.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-indic-table.cc:void hb_bit_set_invertible_t::process<$_11>($_11 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-indic-table.cc:void hb_bit_set_invertible_t::process<$_10>($_10 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-indic-table.cc:void hb_bit_set_invertible_t::process<$_12>($_12 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-indic-table.cc:void hb_bit_set_invertible_t::process<$_22>($_22 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-ot-shaper-indic-table.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-input.cc:void hb_bit_set_invertible_t::process<$_11>($_11 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-input.cc:void hb_bit_set_invertible_t::process<$_10>($_10 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-input.cc:void hb_bit_set_invertible_t::process<$_12>($_12 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-input.cc:void hb_bit_set_invertible_t::process<$_22>($_22 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-input.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset.cc:void hb_bit_set_invertible_t::process<$_21>($_21 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset.cc:void hb_bit_set_invertible_t::process<$_20>($_20 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset.cc:void hb_bit_set_invertible_t::process<$_22>($_22 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset.cc:void hb_bit_set_invertible_t::process<$_32>($_32 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset.cc:void hb_bit_set_invertible_t::process<$_24>($_24 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-plan.cc:void hb_bit_set_invertible_t::process<$_17>($_17 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-plan.cc:void hb_bit_set_invertible_t::process<$_16>($_16 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-plan.cc:void hb_bit_set_invertible_t::process<$_18>($_18 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-plan.cc:void hb_bit_set_invertible_t::process<$_28>($_28 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-plan.cc:void hb_bit_set_invertible_t::process<$_20>($_20 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-plan-layout.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-plan-layout.cc:void hb_bit_set_invertible_t::process<$_13>($_13 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-plan-layout.cc:void hb_bit_set_invertible_t::process<$_15>($_15 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-plan-layout.cc:void hb_bit_set_invertible_t::process<$_25>($_25 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-plan-layout.cc:void hb_bit_set_invertible_t::process<$_17>($_17 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-plan-var.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-plan-var.cc:void hb_bit_set_invertible_t::process<$_13>($_13 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-plan-var.cc:void hb_bit_set_invertible_t::process<$_15>($_15 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-plan-var.cc:void hb_bit_set_invertible_t::process<$_25>($_25 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-plan-var.cc:void hb_bit_set_invertible_t::process<$_17>($_17 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-table-layout.cc:void hb_bit_set_invertible_t::process<$_26>($_26 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-table-layout.cc:void hb_bit_set_invertible_t::process<$_16>($_16 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-table-layout.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-table-layout.cc:void hb_bit_set_invertible_t::process<$_15>($_15 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-table-layout.cc:void hb_bit_set_invertible_t::process<$_18>($_18 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-table-var.cc:void hb_bit_set_invertible_t::process<$_27>($_27 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-table-var.cc:void hb_bit_set_invertible_t::process<$_17>($_17 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-table-var.cc:void hb_bit_set_invertible_t::process<$_15>($_15 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-table-var.cc:void hb_bit_set_invertible_t::process<$_16>($_16 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-table-var.cc:void hb_bit_set_invertible_t::process<$_19>($_19 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-table-cff.cc:void hb_bit_set_invertible_t::process<$_15>($_15 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-table-cff.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-table-cff.cc:void hb_bit_set_invertible_t::process<$_16>($_16 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-table-cff.cc:void hb_bit_set_invertible_t::process<$_26>($_26 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-table-cff.cc:void hb_bit_set_invertible_t::process<$_18>($_18 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-table-color.cc:void hb_bit_set_invertible_t::process<$_15>($_15 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-table-color.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-table-color.cc:void hb_bit_set_invertible_t::process<$_16>($_16 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-table-color.cc:void hb_bit_set_invertible_t::process<$_26>($_26 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-table-color.cc:void hb_bit_set_invertible_t::process<$_18>($_18 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-table-other.cc:void hb_bit_set_invertible_t::process<$_15>($_15 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-table-other.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-table-other.cc:void hb_bit_set_invertible_t::process<$_16>($_16 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-table-other.cc:void hb_bit_set_invertible_t::process<$_26>($_26 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-table-other.cc:void hb_bit_set_invertible_t::process<$_18>($_18 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: gsubgpos-context.cc:void hb_bit_set_invertible_t::process<$_15>($_15 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: gsubgpos-context.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: gsubgpos-context.cc:void hb_bit_set_invertible_t::process<$_16>($_16 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: gsubgpos-context.cc:void hb_bit_set_invertible_t::process<$_26>($_26 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: gsubgpos-context.cc:void hb_bit_set_invertible_t::process<$_18>($_18 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-cff1.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-cff1.cc:void hb_bit_set_invertible_t::process<$_13>($_13 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-cff1.cc:void hb_bit_set_invertible_t::process<$_15>($_15 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-cff1.cc:void hb_bit_set_invertible_t::process<$_24>($_24 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-cff1.cc:void hb_bit_set_invertible_t::process<$_17>($_17 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-cff2.cc:void hb_bit_set_invertible_t::process<$_17>($_17 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-cff2.cc:void hb_bit_set_invertible_t::process<$_16>($_16 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-cff2.cc:void hb_bit_set_invertible_t::process<$_18>($_18 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-cff2.cc:void hb_bit_set_invertible_t::process<$_27>($_27 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-cff2.cc:void hb_bit_set_invertible_t::process<$_20>($_20 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-instancer-iup.cc:void hb_bit_set_invertible_t::process<$_11>($_11 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-instancer-iup.cc:void hb_bit_set_invertible_t::process<$_10>($_10 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-instancer-iup.cc:void hb_bit_set_invertible_t::process<$_12>($_12 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-instancer-iup.cc:void hb_bit_set_invertible_t::process<$_22>($_22 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-instancer-iup.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-cff-common.cc:void hb_bit_set_invertible_t::process<$_13>($_13 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-cff-common.cc:void hb_bit_set_invertible_t::process<$_12>($_12 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-cff-common.cc:void hb_bit_set_invertible_t::process<$_14>($_14 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-cff-common.cc:void hb_bit_set_invertible_t::process<$_24>($_24 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
Unexecuted instantiation: hb-subset-cff-common.cc:void hb_bit_set_invertible_t::process<$_16>($_16 const&, hb_bit_set_invertible_t const&, hb_vector_t<unsigned int, false>*)
226
  public:
227
  void union_ (const hb_bit_set_invertible_t &other)
228
775
  {
229
775
    if (likely (inverted == other.inverted))
230
775
    {
231
775
      if (unlikely (inverted))
232
0
  process (hb_bitwise_and, other);
233
775
      else
234
775
  process (hb_bitwise_or, other); /* Main branch. */
235
775
    }
236
0
    else
237
0
    {
238
0
      if (unlikely (inverted))
239
0
  process (hb_bitwise_gt, other);
240
0
      else
241
0
  process (hb_bitwise_lt, other);
242
0
    }
243
775
    if (likely (s.successful))
244
775
      inverted = inverted || other.inverted;
245
775
  }
246
  void intersect (const hb_bit_set_invertible_t &other,
247
      hb_vector_t<unsigned> *workspace = nullptr)
248
0
  {
249
0
    if (likely (inverted == other.inverted))
250
0
    {
251
0
      if (unlikely (inverted))
252
0
  process (hb_bitwise_or, other, workspace);
253
0
      else
254
0
  process (hb_bitwise_and, other, workspace); /* Main branch. */
255
0
    }
256
0
    else
257
0
    {
258
0
      if (unlikely (inverted))
259
0
  process (hb_bitwise_lt, other, workspace);
260
0
      else
261
0
  process (hb_bitwise_gt, other, workspace);
262
0
    }
263
0
    if (likely (s.successful))
264
0
      inverted = inverted && other.inverted;
265
0
  }
266
  void subtract (const hb_bit_set_invertible_t &other)
267
0
  {
268
0
    if (likely (inverted == other.inverted))
269
0
    {
270
0
      if (unlikely (inverted))
271
0
  process (hb_bitwise_lt, other);
272
0
      else
273
0
  process (hb_bitwise_gt, other); /* Main branch. */
274
0
    }
275
0
    else
276
0
    {
277
0
      if (unlikely (inverted))
278
0
  process (hb_bitwise_or, other);
279
0
      else
280
0
  process (hb_bitwise_and, other);
281
0
    }
282
0
    if (likely (s.successful))
283
0
      inverted = inverted && !other.inverted;
284
0
  }
285
  void symmetric_difference (const hb_bit_set_invertible_t &other)
286
0
  {
287
0
    process (hb_bitwise_xor, other);
288
0
    if (likely (s.successful))
289
0
      inverted = inverted ^ other.inverted;
290
0
  }
291
292
  bool next (hb_codepoint_t *codepoint) const
293
74.5k
  {
294
74.5k
    if (likely (!inverted))
295
74.5k
      return s.next (codepoint);
296
297
0
    auto old = *codepoint;
298
0
    if (unlikely (old + 1 == INVALID))
299
0
    {
300
0
      *codepoint = INVALID;
301
0
      return false;
302
0
    }
303
304
0
    auto v = old;
305
0
    s.next (&v);
306
0
    if (old + 1 < v)
307
0
    {
308
0
      *codepoint = old + 1;
309
0
      return true;
310
0
    }
311
312
0
    v = old;
313
0
    s.next_range (&old, &v);
314
315
0
    *codepoint = v + 1;
316
0
    return *codepoint != INVALID;
317
0
  }
318
  bool next_bits (hb_codepoint_t *codepoint, uint64_t *bits) const
319
748k
  {
320
748k
    if (likely (!inverted))
321
748k
      return s.next_bits (codepoint, bits);
322
323
0
    hb_codepoint_t base;
324
0
    if (unlikely (*codepoint == INVALID))
325
0
      base = 0;
326
0
    else
327
0
    {
328
0
      base = *codepoint & ~hb_bit_page_t::ELT_MASK;
329
0
      if (unlikely (base >= INVALID - hb_bit_page_t::ELT_BITS + 1))
330
0
  goto done;
331
0
      base += hb_bit_page_t::ELT_BITS;
332
0
    }
333
334
0
    while (true)
335
0
    {
336
0
      hb_codepoint_t cursor = base ? base - hb_bit_page_t::ELT_BITS : INVALID;
337
0
      uint64_t excluded = 0;
338
0
      if (!s.next_bits (&cursor, &excluded) || cursor != base)
339
0
  excluded = 0;
340
0
      *bits = ~excluded;
341
0
      bool last = unlikely (base >= INVALID - hb_bit_page_t::ELT_BITS + 1);
342
0
      if (last)
343
0
  *bits &= UINT64_MAX >> 1;
344
0
      if (*bits)
345
0
      {
346
0
  *codepoint = base;
347
0
  return true;
348
0
      }
349
0
      if (unlikely (last))
350
0
  break;
351
0
      base += hb_bit_page_t::ELT_BITS;
352
0
    }
353
354
0
  done:
355
0
    *codepoint = INVALID;
356
0
    *bits = 0;
357
0
    return false;
358
0
  }
359
  bool previous (hb_codepoint_t *codepoint) const
360
40.6k
  {
361
40.6k
    if (likely (!inverted))
362
40.6k
      return s.previous (codepoint);
363
364
0
    auto old = *codepoint;
365
0
    if (unlikely (old - 1 == INVALID))
366
0
    {
367
0
      *codepoint = INVALID;
368
0
      return false;
369
0
    }
370
371
0
    auto v = old;
372
0
    s.previous (&v);
373
374
0
    if (old - 1 > v || v == INVALID)
375
0
    {
376
0
      *codepoint = old - 1;
377
0
      return true;
378
0
    }
379
380
0
    v = old;
381
0
    s.previous_range (&v, &old);
382
383
0
    *codepoint = v - 1;
384
0
    return *codepoint != INVALID;
385
0
  }
386
  bool next_range (hb_codepoint_t *first, hb_codepoint_t *last) const
387
1.71M
  {
388
1.71M
    if (likely (!inverted))
389
1.71M
      return s.next_range (first, last);
390
391
0
    if (!next (last))
392
0
    {
393
0
      *last = *first = INVALID;
394
0
      return false;
395
0
    }
396
397
0
    *first = *last;
398
0
    s.next (last);
399
0
    --*last;
400
0
    return true;
401
0
  }
402
  bool previous_range (hb_codepoint_t *first, hb_codepoint_t *last) const
403
0
  {
404
0
    if (likely (!inverted))
405
0
      return s.previous_range (first, last);
406
407
0
    if (!previous (first))
408
0
    {
409
0
      *last = *first = INVALID;
410
0
      return false;
411
0
    }
412
413
0
    *last = *first;
414
0
    s.previous (first);
415
0
    ++*first;
416
0
    return true;
417
0
  }
418
419
  unsigned int next_many (hb_codepoint_t  codepoint,
420
        hb_codepoint_t *out,
421
        unsigned int    size) const
422
0
  {
423
0
    return inverted ? s.next_many_inverted (codepoint, out, size)
424
0
        : s.next_many (codepoint, out, size);
425
0
  }
426
427
  static constexpr hb_codepoint_t INVALID = hb_bit_set_t::INVALID;
428
429
  /*
430
   * Iterator implementation.
431
   * Mutating the set invalidates its iterators.
432
   */
433
  struct iter_t : hb_iter_with_fallback_t<iter_t, hb_codepoint_t>
434
  {
435
    static constexpr bool is_sorted_iterator = true;
436
    static constexpr bool has_fast_len = true;
437
    iter_t (const hb_bit_set_invertible_t &s_ = Null (hb_bit_set_invertible_t),
438
410k
    bool init = true) : s (&s_), v (INVALID), remaining (0),
439
410k
             have_len (!init), base (INVALID), bits (0)
440
410k
    {
441
410k
      if (init)
442
273k
  advance ();
443
410k
    }
444
445
    typedef hb_codepoint_t __item_t__;
446
9.00M
    hb_codepoint_t __item__ () const { return v; }
447
40.6k
    bool __more__ () const { return v != INVALID; }
448
    void __next__ ()
449
8.99M
    {
450
8.99M
      remaining--;
451
8.99M
      advance ();
452
8.99M
    }
453
    void __prev__ ()
454
0
    {
455
0
      if (s->previous (&v))
456
0
      {
457
0
  sync ();
458
0
  remaining++;
459
0
      }
460
0
      else
461
0
      {
462
0
  base = INVALID;
463
0
  bits = 0;
464
0
      }
465
0
    }
466
    unsigned __len__ () const
467
0
    {
468
0
      if (unlikely (!have_len))
469
0
      {
470
0
  remaining += s->get_population ();
471
0
  have_len = true;
472
0
      }
473
0
      return remaining;
474
0
    }
475
136k
    iter_t end () const { return iter_t (*s, false); }
476
    bool operator != (const iter_t& o) const
477
9.13M
    { return v != o.v; }
478
479
    protected:
480
    const hb_bit_set_invertible_t *s;
481
    hb_codepoint_t v;
482
    mutable unsigned remaining;
483
    mutable bool have_len;
484
    hb_codepoint_t base;
485
    uint64_t bits;
486
487
    void advance ()
488
9.27M
    {
489
9.27M
      if (likely (bits))
490
8.52M
      {
491
8.52M
  v = base + hb_ctz (bits);
492
8.52M
  bits &= bits - 1;
493
8.52M
      }
494
748k
      else if (s->next_bits (&base, &bits))
495
558k
      {
496
558k
  v = base + hb_ctz (bits);
497
558k
  bits &= bits - 1;
498
558k
      }
499
190k
      else
500
190k
  v = INVALID;
501
9.27M
    }
502
503
    void sync ()
504
0
    {
505
0
      base = v & ~hb_bit_page_t::ELT_MASK;
506
0
      hb_codepoint_t cursor = base ? base - hb_bit_page_t::ELT_BITS : INVALID;
507
0
      s->next_bits (&cursor, &bits);
508
0
      unsigned int bit = v & (hb_bit_page_t::ELT_BITS - 1);
509
0
      bits = bit == hb_bit_page_t::ELT_BITS - 1 ? 0 : bits >> (bit + 1) << (bit + 1);
510
0
    }
511
  };
512
0
  iter_t iter () const { return iter_t (*this); }
513
0
  operator iter_t () const { return iter (); }
514
};
515
516
517
#endif /* HB_BIT_SET_INVERTIBLE_HH */