Coverage Report

Created: 2025-10-14 06:41

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/harfbuzz/src/hb-map.hh
Line
Count
Source
1
/*
2
 * Copyright © 2018  Google, Inc.
3
 *
4
 *  This is part of HarfBuzz, a text shaping library.
5
 *
6
 * Permission is hereby granted, without written agreement and without
7
 * license or royalty fees, to use, copy, modify, and distribute this
8
 * software and its documentation for any purpose, provided that the
9
 * above copyright notice and the following two paragraphs appear in
10
 * all copies of this software.
11
 *
12
 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
13
 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
14
 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
15
 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
16
 * DAMAGE.
17
 *
18
 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
19
 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20
 * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
21
 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
22
 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
23
 *
24
 * Google Author(s): Behdad Esfahbod
25
 */
26
27
#ifndef HB_MAP_HH
28
#define HB_MAP_HH
29
30
#include "hb.hh"
31
32
#include "hb-set.hh"
33
34
35
/*
36
 * hb_hashmap_t
37
 */
38
39
extern HB_INTERNAL const hb_codepoint_t minus_1;
40
41
template <typename K, typename V,
42
    bool minus_one = false>
43
struct hb_hashmap_t
44
{
45
  static constexpr bool realloc_move = true;
46
47
4.28k
  hb_hashmap_t ()  { init (); }
Unexecuted instantiation: hb_hashmap_t<hb_serialize_context_t::object_t const*, unsigned int, false>::hb_hashmap_t()
hb_hashmap_t<unsigned int, unsigned int, true>::hb_hashmap_t()
Line
Count
Source
47
4.28k
  hb_hashmap_t ()  { init (); }
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_set_t, false>::hb_hashmap_t()
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb::unique_ptr<hb_set_t>, false>::hb_hashmap_t()
48
4.28k
  ~hb_hashmap_t () { fini (); }
Unexecuted instantiation: hb_hashmap_t<hb_serialize_context_t::object_t const*, unsigned int, false>::~hb_hashmap_t()
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_set_t, false>::~hb_hashmap_t()
hb_hashmap_t<unsigned int, unsigned int, true>::~hb_hashmap_t()
Line
Count
Source
48
4.28k
  ~hb_hashmap_t () { fini (); }
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb::unique_ptr<hb_set_t>, false>::~hb_hashmap_t()
49
50
  void _copy (const hb_hashmap_t& o)
51
0
  {
52
0
    if (unlikely (!o.mask)) return;
53
0
54
0
    if (hb_is_trivially_copy_assignable (item_t))
55
0
    {
56
0
      items = (item_t *) hb_malloc (sizeof (item_t) * (o.mask + 1));
57
0
      if (unlikely (!items))
58
0
      {
59
0
  successful = false;
60
0
  return;
61
0
      }
62
0
      population = o.population;
63
0
      occupancy = o.occupancy;
64
0
      mask = o.mask;
65
0
      prime = o.prime;
66
0
      max_chain_length = o.max_chain_length;
67
0
      memcpy (items, o.items, sizeof (item_t) * (mask + 1));
68
0
      return;
69
0
    }
70
0
71
0
    alloc (o.population); hb_copy (o, *this);
72
0
  }
Unexecuted instantiation: hb_hashmap_t<unsigned int, unsigned int, true>::_copy(hb_hashmap_t<unsigned int, unsigned int, true> const&)
Unexecuted instantiation: hb_hashmap_t<unsigned int, Triple, false>::_copy(hb_hashmap_t<unsigned int, Triple, false> const&)
73
74
  hb_hashmap_t (const hb_hashmap_t& o) : hb_hashmap_t () { _copy (o); }
75
  hb_hashmap_t& operator= (const hb_hashmap_t& o)
76
0
  {
77
0
    reset ();
78
0
    if (!items) { _copy (o); return *this; }
79
0
    alloc (o.population); hb_copy (o, *this); return *this;
80
0
  }
81
82
  hb_hashmap_t (hb_hashmap_t&& o)  noexcept : hb_hashmap_t () { hb_swap (*this, o); }
83
0
  hb_hashmap_t& operator= (hb_hashmap_t&& o)   noexcept { hb_swap (*this, o); return *this; }
Unexecuted instantiation: hb_hashmap_t<unsigned int, unsigned int, true>::operator=(hb_hashmap_t<unsigned int, unsigned int, true>&&)
Unexecuted instantiation: hb_hashmap_t<hb_vector_t<bool, false> const*, hb_vector_t<unsigned char, false>, false>::operator=(hb_hashmap_t<hb_vector_t<bool, false> const*, hb_vector_t<unsigned char, false>, false>&&)
Unexecuted instantiation: hb_hashmap_t<hb_vector_t<bool, false> const*, unsigned int, false>::operator=(hb_hashmap_t<hb_vector_t<bool, false> const*, unsigned int, false>&&)
84
85
  hb_hashmap_t (std::initializer_list<hb_pair_t<K, V>> lst) : hb_hashmap_t ()
86
  {
87
    for (auto&& item : lst)
88
      set (item.first, item.second);
89
  }
90
  template <typename Iterable,
91
      hb_requires (hb_is_iterable (Iterable))>
92
  hb_hashmap_t (const Iterable &o) : hb_hashmap_t ()
93
  {
94
    auto iter = hb_iter (o);
95
    if (iter.is_random_access_iterator || iter.has_fast_len)
96
      alloc (hb_len (iter));
97
    hb_copy (iter, *this);
98
  }
99
100
  struct item_t
101
  {
102
    K key;
103
    uint32_t is_real_ : 1;
104
    uint32_t is_used_ : 1;
105
    uint32_t hash : 30;
106
    V value;
107
108
    item_t () : key (),
109
0
    is_real_ (false), is_used_ (false),
110
0
    hash (0),
111
0
    value () {}
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb::unique_ptr<hb_set_t>, false>::item_t::item_t()
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_set_t, false>::item_t::item_t()
112
113
    // Needed for https://github.com/harfbuzz/harfbuzz/issues/4138
114
0
    K& get_key () { return key; }
Unexecuted instantiation: hb_hashmap_t<unsigned int, unsigned int, true>::item_t::get_key()
Unexecuted instantiation: hb_hashmap_t<unsigned int, Triple, false>::item_t::get_key()
Unexecuted instantiation: hb_hashmap_t<unsigned int, face_table_info_t, false>::item_t::get_key()
115
0
    V& get_value () { return value; }
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_vector_t<unsigned int, false>, false>::item_t::get_value()
Unexecuted instantiation: hb_hashmap_t<unsigned int, unsigned int, true>::item_t::get_value()
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_pair_t<unsigned int, int>, false>::item_t::get_value()
Unexecuted instantiation: hb_hashmap_t<unsigned int, face_table_info_t, false>::item_t::get_value()
116
117
103k
    bool is_used () const { return is_used_; }
hb_hashmap_t<unsigned int, unsigned int, true>::item_t::is_used() const
Line
Count
Source
117
103k
    bool is_used () const { return is_used_; }
Unexecuted instantiation: hb_hashmap_t<hb_serialize_context_t::object_t const*, unsigned int, false>::item_t::is_used() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_vector_t<unsigned int, false>, false>::item_t::is_used() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, OT::Feature const*, false>::item_t::is_used() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb::unique_ptr<hb_set_t>, false>::item_t::is_used() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, Triple, false>::item_t::is_used() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, TripleDistances, false>::item_t::is_used() const
Unexecuted instantiation: hb_hashmap_t<hb::shared_ptr<hb_map_t>, unsigned int, false>::item_t::is_used() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb::shared_ptr<hb_set_t>, false>::item_t::is_used() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_pair_t<void const*, void const*>, false>::item_t::is_used() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_pair_t<unsigned int, int>, false>::item_t::is_used() const
Unexecuted instantiation: hb_hashmap_t<hb_vector_t<OT::HBFixed<OT::NumType<true, short, 2u>, 14u>, false> const*, unsigned int, false>::item_t::is_used() const
Unexecuted instantiation: hb_hashmap_t<hb_hashmap_t<unsigned int, Triple, false> const*, unsigned int, false>::item_t::is_used() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_vector_t<int, false> const*, false>::item_t::is_used() const
Unexecuted instantiation: hb_hashmap_t<hb_vector_t<int, false> const*, unsigned int, false>::item_t::is_used() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, face_table_info_t, false>::item_t::is_used() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_set_t, false>::item_t::is_used() const
118
97
    void set_used (bool is_used) { is_used_ = is_used; }
hb_hashmap_t<unsigned int, unsigned int, true>::item_t::set_used(bool)
Line
Count
Source
118
97
    void set_used (bool is_used) { is_used_ = is_used; }
Unexecuted instantiation: hb_hashmap_t<hb_serialize_context_t::object_t const*, unsigned int, false>::item_t::set_used(bool)
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_vector_t<unsigned int, false>, false>::item_t::set_used(bool)
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb::unique_ptr<hb_set_t>, false>::item_t::set_used(bool)
Unexecuted instantiation: hb_hashmap_t<unsigned int, Triple, false>::item_t::set_used(bool)
Unexecuted instantiation: hb_hashmap_t<hb::shared_ptr<hb_map_t>, unsigned int, false>::item_t::set_used(bool)
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb::shared_ptr<hb_set_t>, false>::item_t::set_used(bool)
Unexecuted instantiation: hb_hashmap_t<unsigned int, OT::Feature const*, false>::item_t::set_used(bool)
Unexecuted instantiation: hb_hashmap_t<hb_hashmap_t<unsigned int, Triple, false> const*, unsigned int, false>::item_t::set_used(bool)
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_vector_t<int, false> const*, false>::item_t::set_used(bool)
Unexecuted instantiation: hb_hashmap_t<hb_vector_t<int, false> const*, unsigned int, false>::item_t::set_used(bool)
Unexecuted instantiation: hb_hashmap_t<unsigned int, face_table_info_t, false>::item_t::set_used(bool)
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_pair_t<unsigned int, int>, false>::item_t::set_used(bool)
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_set_t, false>::item_t::set_used(bool)
119
97
    void set_real (bool is_real) { is_real_ = is_real; }
hb_hashmap_t<unsigned int, unsigned int, true>::item_t::set_real(bool)
Line
Count
Source
119
97
    void set_real (bool is_real) { is_real_ = is_real; }
Unexecuted instantiation: hb_hashmap_t<hb_serialize_context_t::object_t const*, unsigned int, false>::item_t::set_real(bool)
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_vector_t<unsigned int, false>, false>::item_t::set_real(bool)
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb::unique_ptr<hb_set_t>, false>::item_t::set_real(bool)
Unexecuted instantiation: hb_hashmap_t<unsigned int, Triple, false>::item_t::set_real(bool)
Unexecuted instantiation: hb_hashmap_t<hb::shared_ptr<hb_map_t>, unsigned int, false>::item_t::set_real(bool)
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb::shared_ptr<hb_set_t>, false>::item_t::set_real(bool)
Unexecuted instantiation: hb_hashmap_t<unsigned int, OT::Feature const*, false>::item_t::set_real(bool)
Unexecuted instantiation: hb_hashmap_t<hb_hashmap_t<unsigned int, Triple, false> const*, unsigned int, false>::item_t::set_real(bool)
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_vector_t<int, false> const*, false>::item_t::set_real(bool)
Unexecuted instantiation: hb_hashmap_t<hb_vector_t<int, false> const*, unsigned int, false>::item_t::set_real(bool)
Unexecuted instantiation: hb_hashmap_t<unsigned int, face_table_info_t, false>::item_t::set_real(bool)
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_pair_t<unsigned int, int>, false>::item_t::set_real(bool)
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_set_t, false>::item_t::set_real(bool)
120
57
    bool is_real () const { return is_real_; }
hb_hashmap_t<unsigned int, unsigned int, true>::item_t::is_real() const
Line
Count
Source
120
57
    bool is_real () const { return is_real_; }
Unexecuted instantiation: hb_hashmap_t<hb_serialize_context_t::object_t const*, unsigned int, false>::item_t::is_real() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_vector_t<unsigned int, false>, false>::item_t::is_real() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, OT::Feature const*, false>::item_t::is_real() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb::unique_ptr<hb_set_t>, false>::item_t::is_real() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, Triple, false>::item_t::is_real() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, TripleDistances, false>::item_t::is_real() const
Unexecuted instantiation: hb_hashmap_t<hb::shared_ptr<hb_map_t>, unsigned int, false>::item_t::is_real() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb::shared_ptr<hb_set_t>, false>::item_t::is_real() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_pair_t<void const*, void const*>, false>::item_t::is_real() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_pair_t<unsigned int, int>, false>::item_t::is_real() const
Unexecuted instantiation: hb_hashmap_t<hb_vector_t<OT::HBFixed<OT::NumType<true, short, 2u>, 14u>, false> const*, unsigned int, false>::item_t::is_real() const
Unexecuted instantiation: hb_hashmap_t<hb_hashmap_t<unsigned int, Triple, false> const*, unsigned int, false>::item_t::is_real() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_vector_t<int, false> const*, false>::item_t::is_real() const
Unexecuted instantiation: hb_hashmap_t<hb_vector_t<int, false> const*, unsigned int, false>::item_t::is_real() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, face_table_info_t, false>::item_t::is_real() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_set_t, false>::item_t::is_real() const
121
122
    template <bool v = minus_one,
123
        hb_enable_if (v == false)>
124
0
    static inline const V& default_value () { return Null(V); };
Unexecuted instantiation: _ZN12hb_hashmap_tIPKN22hb_serialize_context_t8object_tEjLb0EE6item_t13default_valueILb0ETnPN12hb_enable_ifIXeqT_Lb0EEvE4typeELPv0EEERKjv
Unexecuted instantiation: _ZN12hb_hashmap_tIjN2hb10unique_ptrI8hb_set_tEELb0EE6item_t13default_valueILb0ETnPN12hb_enable_ifIXeqT_Lb0EEvE4typeELPv0EEERKS3_v
Unexecuted instantiation: _ZN12hb_hashmap_tIjN2hb10shared_ptrI8hb_set_tEELb0EE6item_t13default_valueILb0ETnPN12hb_enable_ifIXeqT_Lb0EEvE4typeELPv0EEERKS3_v
Unexecuted instantiation: _ZN12hb_hashmap_tIj15TripleDistancesLb0EE6item_t13default_valueILb0ETnPN12hb_enable_ifIXeqT_Lb0EEvE4typeELPv0EEERKS0_v
Unexecuted instantiation: _ZN12hb_hashmap_tIj6TripleLb0EE6item_t13default_valueILb0ETnPN12hb_enable_ifIXeqT_Lb0EEvE4typeELPv0EEERKS0_v
Unexecuted instantiation: _ZN12hb_hashmap_tIj17face_table_info_tLb0EE6item_t13default_valueILb0ETnPN12hb_enable_ifIXeqT_Lb0EEvE4typeELPv0EEERKS0_v
125
    template <bool v = minus_one,
126
        hb_enable_if (v == true)>
127
    static inline const V& default_value ()
128
0
    {
129
0
      static_assert (hb_is_same (V, hb_codepoint_t), "");
130
0
      return minus_1;
131
0
    };
132
133
463
    bool operator == (const K &o) const { return hb_deref (key) == hb_deref (o); }
hb_hashmap_t<unsigned int, unsigned int, true>::item_t::operator==(unsigned int const&) const
Line
Count
Source
133
463
    bool operator == (const K &o) const { return hb_deref (key) == hb_deref (o); }
Unexecuted instantiation: hb_hashmap_t<hb_serialize_context_t::object_t const*, unsigned int, false>::item_t::operator==(hb_serialize_context_t::object_t const* const&) const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_vector_t<unsigned int, false>, false>::item_t::operator==(unsigned int const&) const
Unexecuted instantiation: hb_hashmap_t<unsigned int, OT::Feature const*, false>::item_t::operator==(unsigned int const&) const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb::unique_ptr<hb_set_t>, false>::item_t::operator==(unsigned int const&) const
Unexecuted instantiation: hb_hashmap_t<unsigned int, Triple, false>::item_t::operator==(unsigned int const&) const
Unexecuted instantiation: hb_hashmap_t<unsigned int, TripleDistances, false>::item_t::operator==(unsigned int const&) const
Unexecuted instantiation: hb_hashmap_t<hb::shared_ptr<hb_map_t>, unsigned int, false>::item_t::operator==(hb::shared_ptr<hb_map_t> const&) const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb::shared_ptr<hb_set_t>, false>::item_t::operator==(unsigned int const&) const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_pair_t<void const*, void const*>, false>::item_t::operator==(unsigned int const&) const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_pair_t<unsigned int, int>, false>::item_t::operator==(unsigned int const&) const
Unexecuted instantiation: hb_hashmap_t<hb_vector_t<OT::HBFixed<OT::NumType<true, short, 2u>, 14u>, false> const*, unsigned int, false>::item_t::operator==(hb_vector_t<OT::HBFixed<OT::NumType<true, short, 2u>, 14u>, false> const* const&) const
Unexecuted instantiation: hb_hashmap_t<hb_hashmap_t<unsigned int, Triple, false> const*, unsigned int, false>::item_t::operator==(hb_hashmap_t<unsigned int, Triple, false> const* const&) const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_vector_t<int, false> const*, false>::item_t::operator==(unsigned int const&) const
Unexecuted instantiation: hb_hashmap_t<hb_vector_t<int, false> const*, unsigned int, false>::item_t::operator==(hb_vector_t<int, false> const* const&) const
Unexecuted instantiation: hb_hashmap_t<unsigned int, face_table_info_t, false>::item_t::operator==(unsigned int const&) const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_set_t, false>::item_t::operator==(unsigned int const&) const
134
    bool operator == (const item_t &o) const { return *this == o.key; }
135
0
    hb_pair_t<K, V> get_pair() const { return hb_pair_t<K, V> (key, value); }
Unexecuted instantiation: hb_hashmap_t<unsigned int, unsigned int, true>::item_t::get_pair() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, Triple, false>::item_t::get_pair() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_vector_t<int, false> const*, false>::item_t::get_pair() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, face_table_info_t, false>::item_t::get_pair() const
136
0
    hb_pair_t<const K &, V &> get_pair_ref() { return hb_pair_t<const K &, V &> (key, value); }
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_pair_t<unsigned int, int>, false>::item_t::get_pair_ref()
Unexecuted instantiation: hb_hashmap_t<unsigned int, unsigned int, true>::item_t::get_pair_ref()
137
138
    uint32_t total_hash () const
139
0
    { return (hash * 31u) + hb_hash (value); }
Unexecuted instantiation: hb_hashmap_t<unsigned int, unsigned int, true>::item_t::total_hash() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, Triple, false>::item_t::total_hash() const
140
141
    static constexpr bool is_trivially_constructible = (hb_is_trivially_constructible(K) && hb_is_trivially_constructible(V));
142
  };
143
144
  hb_object_header_t header;
145
  bool successful; /* Allocations successful */
146
  unsigned short max_chain_length;
147
  unsigned int population; /* Not including tombstones. */
148
  unsigned int occupancy; /* Including tombstones. */
149
  unsigned int mask;
150
  unsigned int prime;
151
  item_t *items;
152
153
  friend void swap (hb_hashmap_t& a, hb_hashmap_t& b) noexcept
154
0
  {
155
0
    if (unlikely (!a.successful || !b.successful))
156
0
      return;
157
0
    hb_swap (a.max_chain_length, b.max_chain_length);
158
0
    hb_swap (a.population, b.population);
159
0
    hb_swap (a.occupancy, b.occupancy);
160
0
    hb_swap (a.mask, b.mask);
161
0
    hb_swap (a.prime, b.prime);
162
0
    hb_swap (a.items, b.items);
163
0
  }
Unexecuted instantiation: swap(hb_hashmap_t<unsigned int, unsigned int, true>&, hb_hashmap_t<unsigned int, unsigned int, true>&)
Unexecuted instantiation: swap(hb_hashmap_t<unsigned int, Triple, false>&, hb_hashmap_t<unsigned int, Triple, false>&)
Unexecuted instantiation: swap(hb_hashmap_t<hb_vector_t<bool, false> const*, hb_vector_t<unsigned char, false>, false>&, hb_hashmap_t<hb_vector_t<bool, false> const*, hb_vector_t<unsigned char, false>, false>&)
Unexecuted instantiation: swap(hb_hashmap_t<hb_vector_t<bool, false> const*, unsigned int, false>&, hb_hashmap_t<hb_vector_t<bool, false> const*, unsigned int, false>&)
164
  void init ()
165
4.28k
  {
166
4.28k
    hb_object_init (this);
167
168
4.28k
    successful = true;
169
4.28k
    max_chain_length = 0;
170
4.28k
    population = occupancy = 0;
171
4.28k
    mask = 0;
172
4.28k
    prime = 0;
173
4.28k
    items = nullptr;
174
4.28k
  }
hb_hashmap_t<unsigned int, unsigned int, true>::init()
Line
Count
Source
165
4.28k
  {
166
4.28k
    hb_object_init (this);
167
168
4.28k
    successful = true;
169
4.28k
    max_chain_length = 0;
170
4.28k
    population = occupancy = 0;
171
4.28k
    mask = 0;
172
4.28k
    prime = 0;
173
4.28k
    items = nullptr;
174
4.28k
  }
Unexecuted instantiation: hb_hashmap_t<hb_serialize_context_t::object_t const*, unsigned int, false>::init()
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb::unique_ptr<hb_blob_t>, false>::init()
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_vector_t<unsigned int, false>, false>::init()
Unexecuted instantiation: hb_hashmap_t<unsigned int, Triple, false>::init()
Unexecuted instantiation: hb_hashmap_t<hb_vector_t<bool, false> const*, hb_vector_t<unsigned char, false>, false>::init()
Unexecuted instantiation: hb_hashmap_t<hb_vector_t<bool, false> const*, unsigned int, false>::init()
Unexecuted instantiation: hb_hashmap_t<hb_hashmap_t<unsigned int, Triple, false> const*, unsigned int, false>::init()
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_vector_t<int, false> const*, false>::init()
Unexecuted instantiation: hb_hashmap_t<hb_vector_t<int, false> const*, unsigned int, false>::init()
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb::unique_ptr<hb_set_t>, false>::init()
Unexecuted instantiation: hb_hashmap_t<unsigned int, face_table_info_t, false>::init()
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_set_t, false>::init()
175
  void fini ()
176
4.28k
  {
177
4.28k
    hb_object_fini (this);
178
179
4.28k
    if (likely (items))
180
4.28k
    {
181
4.28k
      unsigned size = mask + 1;
182
38.6k
      for (unsigned i = 0; i < size; i++)
183
34.3k
  items[i].~item_t ();
184
4.28k
      hb_free (items);
185
4.28k
      items = nullptr;
186
4.28k
    }
187
4.28k
    population = occupancy = 0;
188
4.28k
  }
hb_hashmap_t<unsigned int, unsigned int, true>::fini()
Line
Count
Source
176
4.28k
  {
177
4.28k
    hb_object_fini (this);
178
179
4.28k
    if (likely (items))
180
4.28k
    {
181
4.28k
      unsigned size = mask + 1;
182
38.6k
      for (unsigned i = 0; i < size; i++)
183
34.3k
  items[i].~item_t ();
184
4.28k
      hb_free (items);
185
4.28k
      items = nullptr;
186
4.28k
    }
187
4.28k
    population = occupancy = 0;
188
4.28k
  }
Unexecuted instantiation: hb_hashmap_t<hb_serialize_context_t::object_t const*, unsigned int, false>::fini()
Unexecuted instantiation: hb_hashmap_t<unsigned int, Triple, false>::fini()
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_vector_t<unsigned int, false>, false>::fini()
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb::unique_ptr<hb_blob_t>, false>::fini()
Unexecuted instantiation: hb_hashmap_t<hb_vector_t<bool, false> const*, hb_vector_t<unsigned char, false>, false>::fini()
Unexecuted instantiation: hb_hashmap_t<hb_vector_t<bool, false> const*, unsigned int, false>::fini()
Unexecuted instantiation: hb_hashmap_t<hb_hashmap_t<unsigned int, Triple, false> const*, unsigned int, false>::fini()
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_vector_t<int, false> const*, false>::fini()
Unexecuted instantiation: hb_hashmap_t<hb_vector_t<int, false> const*, unsigned int, false>::fini()
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb::unique_ptr<hb_set_t>, false>::fini()
Unexecuted instantiation: hb_hashmap_t<unsigned int, face_table_info_t, false>::fini()
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_set_t, false>::fini()
189
190
  hb_hashmap_t& reset ()
191
0
  {
192
0
    successful = true;
193
0
    clear ();
194
0
    return *this;
195
0
  }
Unexecuted instantiation: hb_hashmap_t<unsigned int, unsigned int, true>::reset()
Unexecuted instantiation: hb_hashmap_t<unsigned int, Triple, false>::reset()
196
197
0
  bool in_error () const { return !successful; }
Unexecuted instantiation: hb_hashmap_t<hb_serialize_context_t::object_t const*, unsigned int, false>::in_error() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, Triple, false>::in_error() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, unsigned int, true>::in_error() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_vector_t<unsigned int, false>, false>::in_error() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb::unique_ptr<hb_blob_t>, false>::in_error() const
Unexecuted instantiation: hb_hashmap_t<hb_hashmap_t<unsigned int, Triple, false> const*, unsigned int, false>::in_error() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, face_table_info_t, false>::in_error() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb::unique_ptr<hb_set_t>, false>::in_error() const
198
199
  bool alloc (unsigned new_population = 0)
200
4.28k
  {
201
4.28k
    if (unlikely (!successful)) return false;
202
203
4.28k
    if (new_population != 0 && (new_population + new_population / 2) < mask) return true;
204
205
4.28k
    unsigned int power = hb_bit_storage (hb_max (hb_max ((unsigned) population, new_population) * 2, 4u));
206
4.28k
    unsigned int new_size = 1u << power;
207
4.28k
    item_t *new_items = (item_t *) hb_malloc ((size_t) new_size * sizeof (item_t));
208
4.28k
    if (unlikely (!new_items))
209
0
    {
210
0
      successful = false;
211
0
      return false;
212
0
    }
213
4.28k
    if (!item_t::is_trivially_constructible)
214
0
      for (auto &_ : hb_iter (new_items, new_size))
215
0
  new (&_) item_t ();
216
4.28k
    else
217
4.28k
      hb_memset (new_items, 0, (size_t) new_size * sizeof (item_t));
218
219
4.28k
    unsigned int old_size = size ();
220
4.28k
    item_t *old_items = items;
221
222
    /* Switch to new, empty, array. */
223
4.28k
    population = occupancy = 0;
224
4.28k
    mask = new_size - 1;
225
4.28k
    prime = prime_for (power);
226
4.28k
    max_chain_length = power * 2;
227
4.28k
    items = new_items;
228
229
    /* Insert back old items. */
230
4.28k
    for (unsigned int i = 0; i < old_size; i++)
231
0
    {
232
0
      if (old_items[i].is_real ())
233
0
      {
234
0
  set_with_hash (std::move (old_items[i].key),
235
0
           old_items[i].hash,
236
0
           std::move (old_items[i].value));
237
0
      }
238
0
    }
239
4.28k
    for (unsigned int i = 0; i < old_size; i++)
240
0
      old_items[i].~item_t ();
241
242
4.28k
    hb_free (old_items);
243
244
4.28k
    return true;
245
4.28k
  }
Unexecuted instantiation: hb_hashmap_t<hb_serialize_context_t::object_t const*, unsigned int, false>::alloc(unsigned int)
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_vector_t<unsigned int, false>, false>::alloc(unsigned int)
hb_hashmap_t<unsigned int, unsigned int, true>::alloc(unsigned int)
Line
Count
Source
200
4.28k
  {
201
4.28k
    if (unlikely (!successful)) return false;
202
203
4.28k
    if (new_population != 0 && (new_population + new_population / 2) < mask) return true;
204
205
4.28k
    unsigned int power = hb_bit_storage (hb_max (hb_max ((unsigned) population, new_population) * 2, 4u));
206
4.28k
    unsigned int new_size = 1u << power;
207
4.28k
    item_t *new_items = (item_t *) hb_malloc ((size_t) new_size * sizeof (item_t));
208
4.28k
    if (unlikely (!new_items))
209
0
    {
210
0
      successful = false;
211
0
      return false;
212
0
    }
213
4.28k
    if (!item_t::is_trivially_constructible)
214
0
      for (auto &_ : hb_iter (new_items, new_size))
215
0
  new (&_) item_t ();
216
4.28k
    else
217
4.28k
      hb_memset (new_items, 0, (size_t) new_size * sizeof (item_t));
218
219
4.28k
    unsigned int old_size = size ();
220
4.28k
    item_t *old_items = items;
221
222
    /* Switch to new, empty, array. */
223
4.28k
    population = occupancy = 0;
224
4.28k
    mask = new_size - 1;
225
4.28k
    prime = prime_for (power);
226
4.28k
    max_chain_length = power * 2;
227
4.28k
    items = new_items;
228
229
    /* Insert back old items. */
230
4.28k
    for (unsigned int i = 0; i < old_size; i++)
231
0
    {
232
0
      if (old_items[i].is_real ())
233
0
      {
234
0
  set_with_hash (std::move (old_items[i].key),
235
0
           old_items[i].hash,
236
0
           std::move (old_items[i].value));
237
0
      }
238
0
    }
239
4.28k
    for (unsigned int i = 0; i < old_size; i++)
240
0
      old_items[i].~item_t ();
241
242
4.28k
    hb_free (old_items);
243
244
4.28k
    return true;
245
4.28k
  }
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb::unique_ptr<hb_set_t>, false>::alloc(unsigned int)
Unexecuted instantiation: hb_hashmap_t<unsigned int, Triple, false>::alloc(unsigned int)
Unexecuted instantiation: hb_hashmap_t<hb::shared_ptr<hb_map_t>, unsigned int, false>::alloc(unsigned int)
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb::shared_ptr<hb_set_t>, false>::alloc(unsigned int)
Unexecuted instantiation: hb_hashmap_t<unsigned int, OT::Feature const*, false>::alloc(unsigned int)
Unexecuted instantiation: hb_hashmap_t<hb_hashmap_t<unsigned int, Triple, false> const*, unsigned int, false>::alloc(unsigned int)
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_vector_t<int, false> const*, false>::alloc(unsigned int)
Unexecuted instantiation: hb_hashmap_t<hb_vector_t<int, false> const*, unsigned int, false>::alloc(unsigned int)
Unexecuted instantiation: hb_hashmap_t<unsigned int, face_table_info_t, false>::alloc(unsigned int)
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_pair_t<unsigned int, int>, false>::alloc(unsigned int)
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_set_t, false>::alloc(unsigned int)
246
247
  template <typename KK, typename VV>
248
  bool set_with_hash (KK&& key, uint32_t hash, VV&& value, bool overwrite = true)
249
97
  {
250
97
    if (unlikely (!successful)) return false;
251
97
    if (unlikely ((occupancy + occupancy / 2) >= mask && !alloc ())) return false;
252
253
97
    hash &= 0x3FFFFFFF; // We only store lower 30bit of hash
254
97
    unsigned int tombstone = (unsigned int) -1;
255
97
    unsigned int i = hash % prime;
256
97
    unsigned length = 0;
257
97
    unsigned step = 0;
258
111
    while (items[i].is_used ())
259
14
    {
260
14
      if ((std::is_integral<K>::value || items[i].hash == hash) &&
261
14
    items[i] == key)
262
0
      {
263
0
        if (!overwrite)
264
0
    return false;
265
0
        else
266
0
    break;
267
0
      }
268
14
      if (!items[i].is_real () && tombstone == (unsigned) -1)
269
0
        tombstone = i;
270
14
      i = (i + ++step) & mask;
271
14
      length++;
272
14
    }
273
274
97
    item_t &item = items[tombstone == (unsigned) -1 ? i : tombstone];
275
276
97
    if (item.is_used ())
277
0
    {
278
0
      occupancy--;
279
0
      population -= item.is_real ();
280
0
    }
281
282
97
    item.key = std::forward<KK> (key);
283
97
    item.value = std::forward<VV> (value);
284
97
    item.hash = hash;
285
97
    item.set_used (true);
286
97
    item.set_real (true);
287
288
97
    occupancy++;
289
97
    population++;
290
291
97
    if (unlikely (length > max_chain_length) && occupancy * 8 > mask)
292
0
      alloc (mask - 8); // This ensures we jump to next larger size
293
294
97
    return true;
295
97
  }
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, unsigned int, true>::set_with_hash<unsigned int const&, unsigned int const&>(unsigned int const&, unsigned int, unsigned int const&, bool)
Unexecuted instantiation: bool hb_hashmap_t<hb_serialize_context_t::object_t const*, unsigned int, false>::set_with_hash<hb_serialize_context_t::object_t*&, unsigned int&>(hb_serialize_context_t::object_t*&, unsigned int, unsigned int&, bool)
Unexecuted instantiation: bool hb_hashmap_t<hb_serialize_context_t::object_t const*, unsigned int, false>::set_with_hash<hb_serialize_context_t::object_t const*, unsigned int>(hb_serialize_context_t::object_t const*&&, unsigned int, unsigned int&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, hb_vector_t<unsigned int, false>, false>::set_with_hash<unsigned int const&, hb_vector_t<unsigned int, false> >(unsigned int const&, unsigned int, hb_vector_t<unsigned int, false>&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, hb_vector_t<unsigned int, false>, false>::set_with_hash<unsigned int, hb_vector_t<unsigned int, false> >(unsigned int&&, unsigned int, hb_vector_t<unsigned int, false>&&, bool)
bool hb_hashmap_t<unsigned int, unsigned int, true>::set_with_hash<unsigned int const&, unsigned int&>(unsigned int const&, unsigned int, unsigned int&, bool)
Line
Count
Source
249
97
  {
250
97
    if (unlikely (!successful)) return false;
251
97
    if (unlikely ((occupancy + occupancy / 2) >= mask && !alloc ())) return false;
252
253
97
    hash &= 0x3FFFFFFF; // We only store lower 30bit of hash
254
97
    unsigned int tombstone = (unsigned int) -1;
255
97
    unsigned int i = hash % prime;
256
97
    unsigned length = 0;
257
97
    unsigned step = 0;
258
111
    while (items[i].is_used ())
259
14
    {
260
14
      if ((std::is_integral<K>::value || items[i].hash == hash) &&
261
14
    items[i] == key)
262
0
      {
263
0
        if (!overwrite)
264
0
    return false;
265
0
        else
266
0
    break;
267
0
      }
268
14
      if (!items[i].is_real () && tombstone == (unsigned) -1)
269
0
        tombstone = i;
270
14
      i = (i + ++step) & mask;
271
14
      length++;
272
14
    }
273
274
97
    item_t &item = items[tombstone == (unsigned) -1 ? i : tombstone];
275
276
97
    if (item.is_used ())
277
0
    {
278
0
      occupancy--;
279
0
      population -= item.is_real ();
280
0
    }
281
282
97
    item.key = std::forward<KK> (key);
283
97
    item.value = std::forward<VV> (value);
284
97
    item.hash = hash;
285
97
    item.set_used (true);
286
97
    item.set_real (true);
287
288
97
    occupancy++;
289
97
    population++;
290
291
97
    if (unlikely (length > max_chain_length) && occupancy * 8 > mask)
292
0
      alloc (mask - 8); // This ensures we jump to next larger size
293
294
97
    return true;
295
97
  }
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, unsigned int, true>::set_with_hash<unsigned int, unsigned int>(unsigned int&&, unsigned int, unsigned int&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, unsigned int, true>::set_with_hash<unsigned int, unsigned int&>(unsigned int&&, unsigned int, unsigned int&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, unsigned int, true>::set_with_hash<unsigned int const&, unsigned int>(unsigned int const&, unsigned int, unsigned int&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, hb::unique_ptr<hb_set_t>, false>::set_with_hash<unsigned int const&, hb::unique_ptr<hb_set_t> >(unsigned int const&, unsigned int, hb::unique_ptr<hb_set_t>&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, hb::unique_ptr<hb_set_t>, false>::set_with_hash<unsigned int, hb::unique_ptr<hb_set_t> >(unsigned int&&, unsigned int, hb::unique_ptr<hb_set_t>&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, unsigned int, true>::set_with_hash<unsigned int, int>(unsigned int&&, unsigned int, int&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, Triple, false>::set_with_hash<unsigned int const&, Triple>(unsigned int const&, unsigned int, Triple&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, Triple, false>::set_with_hash<unsigned int, Triple>(unsigned int&&, unsigned int, Triple&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<hb::shared_ptr<hb_map_t>, unsigned int, false>::set_with_hash<hb::shared_ptr<hb_map_t> const&, int>(hb::shared_ptr<hb_map_t> const&, unsigned int, int&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<hb::shared_ptr<hb_map_t>, unsigned int, false>::set_with_hash<hb::shared_ptr<hb_map_t>, unsigned int>(hb::shared_ptr<hb_map_t>&&, unsigned int, unsigned int&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, hb::shared_ptr<hb_set_t>, false>::set_with_hash<unsigned int const&, hb::shared_ptr<hb_set_t>&>(unsigned int const&, unsigned int, hb::shared_ptr<hb_set_t>&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, hb::shared_ptr<hb_set_t>, false>::set_with_hash<unsigned int, hb::shared_ptr<hb_set_t> >(unsigned int&&, unsigned int, hb::shared_ptr<hb_set_t>&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, OT::Feature const*, false>::set_with_hash<unsigned int, OT::Feature const*>(unsigned int&&, unsigned int, OT::Feature const*&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, Triple, false>::set_with_hash<unsigned int const&, Triple const&>(unsigned int const&, unsigned int, Triple const&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, Triple, false>::set_with_hash<unsigned int const&, Triple&>(unsigned int const&, unsigned int, Triple&, bool)
Unexecuted instantiation: bool hb_hashmap_t<hb_hashmap_t<unsigned int, Triple, false> const*, unsigned int, false>::set_with_hash<hb_hashmap_t<unsigned int, Triple, false> const*, unsigned int>(hb_hashmap_t<unsigned int, Triple, false> const*&&, unsigned int, unsigned int&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<hb_hashmap_t<unsigned int, Triple, false> const*, unsigned int, false>::set_with_hash<hb_hashmap_t<unsigned int, Triple, false> const* const&, int>(hb_hashmap_t<unsigned int, Triple, false> const* const&, unsigned int, int&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<hb_hashmap_t<unsigned int, Triple, false> const*, unsigned int, false>::set_with_hash<hb_hashmap_t<unsigned int, Triple, false> const*, unsigned int&>(hb_hashmap_t<unsigned int, Triple, false> const*&&, unsigned int, unsigned int&, bool)
Unexecuted instantiation: bool hb_hashmap_t<hb_hashmap_t<unsigned int, Triple, false> const*, unsigned int, false>::set_with_hash<hb_hashmap_t<unsigned int, Triple, false> const* const&, unsigned int&>(hb_hashmap_t<unsigned int, Triple, false> const* const&, unsigned int, unsigned int&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, hb_vector_t<int, false> const*, false>::set_with_hash<unsigned int, hb_vector_t<int, false> const*>(unsigned int&&, unsigned int, hb_vector_t<int, false> const*&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<hb_vector_t<int, false> const*, unsigned int, false>::set_with_hash<hb_vector_t<int, false> const*, int>(hb_vector_t<int, false> const*&&, unsigned int, int&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<hb_vector_t<int, false> const*, unsigned int, false>::set_with_hash<hb_vector_t<int, false> const*, unsigned int>(hb_vector_t<int, false> const*&&, unsigned int, unsigned int&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<hb_vector_t<int, false> const*, unsigned int, false>::set_with_hash<hb_vector_t<int, false> const* const&, unsigned int&>(hb_vector_t<int, false> const* const&, unsigned int, unsigned int&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, face_table_info_t, false>::set_with_hash<unsigned int const&, face_table_info_t>(unsigned int const&, unsigned int, face_table_info_t&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, face_table_info_t, false>::set_with_hash<unsigned int, face_table_info_t>(unsigned int&&, unsigned int, face_table_info_t&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, hb_pair_t<unsigned int, int>, false>::set_with_hash<unsigned int&, hb_pair_t<unsigned int, int&> >(unsigned int&, unsigned int, hb_pair_t<unsigned int, int&>&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, hb_pair_t<unsigned int, int>, false>::set_with_hash<unsigned int, hb_pair_t<unsigned int, int> >(unsigned int&&, unsigned int, hb_pair_t<unsigned int, int>&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, unsigned int, true>::set_with_hash<unsigned int const&, bool&>(unsigned int const&, unsigned int, bool&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, hb_set_t, false>::set_with_hash<unsigned int const&, hb_set_t>(unsigned int const&, unsigned int, hb_set_t&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, hb_set_t, false>::set_with_hash<unsigned int, hb_set_t>(unsigned int&&, unsigned int, hb_set_t&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, unsigned int, true>::set_with_hash<unsigned int const&, OT::OffsetTo<OT::ClipBox, OT::NumType<true, unsigned int, 3u>, void, true> const&>(unsigned int const&, unsigned int, OT::OffsetTo<OT::ClipBox, OT::NumType<true, unsigned int, 3u>, void, true> const&, bool)
296
297
  template <typename VV>
298
97
  bool set (const K &key, VV&& value, bool overwrite = true) { return set_with_hash (key, hb_hash (key), std::forward<VV> (value), overwrite); }
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, unsigned int, true>::set<unsigned int const&>(unsigned int const&, unsigned int const&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, hb_vector_t<unsigned int, false>, false>::set<hb_vector_t<unsigned int, false> >(unsigned int const&, hb_vector_t<unsigned int, false>&&, bool)
bool hb_hashmap_t<unsigned int, unsigned int, true>::set<unsigned int&>(unsigned int const&, unsigned int&, bool)
Line
Count
Source
298
97
  bool set (const K &key, VV&& value, bool overwrite = true) { return set_with_hash (key, hb_hash (key), std::forward<VV> (value), overwrite); }
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, unsigned int, true>::set<unsigned int>(unsigned int const&, unsigned int&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, hb::unique_ptr<hb_set_t>, false>::set<hb::unique_ptr<hb_set_t> >(unsigned int const&, hb::unique_ptr<hb_set_t>&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, Triple, false>::set<Triple>(unsigned int const&, Triple&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<hb::shared_ptr<hb_map_t>, unsigned int, false>::set<int>(hb::shared_ptr<hb_map_t> const&, int&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, hb::shared_ptr<hb_set_t>, false>::set<hb::shared_ptr<hb_set_t>&>(unsigned int const&, hb::shared_ptr<hb_set_t>&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, Triple, false>::set<Triple const&>(unsigned int const&, Triple const&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, Triple, false>::set<Triple&>(unsigned int const&, Triple&, bool)
Unexecuted instantiation: bool hb_hashmap_t<hb_hashmap_t<unsigned int, Triple, false> const*, unsigned int, false>::set<int>(hb_hashmap_t<unsigned int, Triple, false> const* const&, int&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<hb_hashmap_t<unsigned int, Triple, false> const*, unsigned int, false>::set<unsigned int&>(hb_hashmap_t<unsigned int, Triple, false> const* const&, unsigned int&, bool)
Unexecuted instantiation: bool hb_hashmap_t<hb_vector_t<int, false> const*, unsigned int, false>::set<unsigned int&>(hb_vector_t<int, false> const* const&, unsigned int&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, face_table_info_t, false>::set<face_table_info_t>(unsigned int const&, face_table_info_t&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, unsigned int, true>::set<bool&>(unsigned int const&, bool&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, hb_set_t, false>::set<hb_set_t>(unsigned int const&, hb_set_t&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, unsigned int, true>::set<OT::OffsetTo<OT::ClipBox, OT::NumType<true, unsigned int, 3u>, void, true> const&>(unsigned int const&, OT::OffsetTo<OT::ClipBox, OT::NumType<true, unsigned int, 3u>, void, true> const&, bool)
299
  template <typename VV>
300
  bool set (K &&key, VV&& value, bool overwrite = true)
301
0
  {
302
0
    uint32_t hash = hb_hash (key);
303
0
    return set_with_hash (std::move (key), hash, std::forward<VV> (value), overwrite);
304
0
  }
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, unsigned int, true>::set<unsigned int&>(unsigned int&&, unsigned int&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, unsigned int, true>::set<int>(unsigned int&&, int&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, OT::Feature const*, false>::set<OT::Feature const*>(unsigned int&&, OT::Feature const*&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<hb_hashmap_t<unsigned int, Triple, false> const*, unsigned int, false>::set<unsigned int>(hb_hashmap_t<unsigned int, Triple, false> const*&&, unsigned int&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<hb_hashmap_t<unsigned int, Triple, false> const*, unsigned int, false>::set<unsigned int&>(hb_hashmap_t<unsigned int, Triple, false> const*&&, unsigned int&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, hb_vector_t<int, false> const*, false>::set<hb_vector_t<int, false> const*>(unsigned int&&, hb_vector_t<int, false> const*&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<hb_vector_t<int, false> const*, unsigned int, false>::set<int>(hb_vector_t<int, false> const*&&, int&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, hb::unique_ptr<hb_set_t>, false>::set<hb::unique_ptr<hb_set_t> >(unsigned int&&, hb::unique_ptr<hb_set_t>&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, unsigned int, true>::set<unsigned int>(unsigned int&&, unsigned int&&, bool)
305
  bool add (const K &key)
306
  {
307
    uint32_t hash = hb_hash (key);
308
    return set_with_hash (key, hash, item_t::default_value ());
309
  }
310
311
  const V& get_with_hash (const K &key, uint32_t hash) const
312
0
  {
313
0
    if (!items) return item_t::default_value ();
314
0
    auto *item = fetch_item (key, hash);
315
0
    if (item)
316
0
      return item->value;
317
0
    return item_t::default_value ();
318
0
  }
Unexecuted instantiation: hb_hashmap_t<hb_serialize_context_t::object_t const*, unsigned int, false>::get_with_hash(hb_serialize_context_t::object_t const* const&, unsigned int) const
Unexecuted instantiation: hb_hashmap_t<unsigned int, unsigned int, true>::get_with_hash(unsigned int const&, unsigned int) const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb::unique_ptr<hb_set_t>, false>::get_with_hash(unsigned int const&, unsigned int) const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb::shared_ptr<hb_set_t>, false>::get_with_hash(unsigned int const&, unsigned int) const
Unexecuted instantiation: hb_hashmap_t<unsigned int, TripleDistances, false>::get_with_hash(unsigned int const&, unsigned int) const
Unexecuted instantiation: hb_hashmap_t<unsigned int, Triple, false>::get_with_hash(unsigned int const&, unsigned int) const
Unexecuted instantiation: hb_hashmap_t<unsigned int, face_table_info_t, false>::get_with_hash(unsigned int const&, unsigned int) const
319
  const V& get (const K &key) const
320
0
  {
321
0
    if (!items) return item_t::default_value ();
322
0
    return get_with_hash (key, hb_hash (key));
323
0
  }
Unexecuted instantiation: hb_hashmap_t<unsigned int, unsigned int, true>::get(unsigned int const&) const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb::unique_ptr<hb_set_t>, false>::get(unsigned int const&) const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb::shared_ptr<hb_set_t>, false>::get(unsigned int const&) const
Unexecuted instantiation: hb_hashmap_t<unsigned int, TripleDistances, false>::get(unsigned int const&) const
Unexecuted instantiation: hb_hashmap_t<unsigned int, Triple, false>::get(unsigned int const&) const
Unexecuted instantiation: hb_hashmap_t<unsigned int, face_table_info_t, false>::get(unsigned int const&) const
324
325
  void del (const K &key)
326
0
  {
327
0
    if (!items) return;
328
0
    auto *item = fetch_item (key, hb_hash (key));
329
0
    if (item)
330
0
    {
331
0
      item->set_real (false);
332
0
      population--;
333
0
    }
334
0
  }
Unexecuted instantiation: hb_hashmap_t<hb_serialize_context_t::object_t const*, unsigned int, false>::del(hb_serialize_context_t::object_t const* const&)
Unexecuted instantiation: hb_hashmap_t<unsigned int, unsigned int, true>::del(unsigned int const&)
Unexecuted instantiation: hb_hashmap_t<unsigned int, Triple, false>::del(unsigned int const&)
Unexecuted instantiation: hb_hashmap_t<hb_hashmap_t<unsigned int, Triple, false> const*, unsigned int, false>::del(hb_hashmap_t<unsigned int, Triple, false> const* const&)
335
336
  /* Has interface. */
337
0
  const V& operator [] (K k) const { return get (k); }
Unexecuted instantiation: hb_hashmap_t<unsigned int, unsigned int, true>::operator[](unsigned int) const
Unexecuted instantiation: hb_hashmap_t<unsigned int, face_table_info_t, false>::operator[](unsigned int) const
338
  template <typename VV=V>
339
  bool has (const K &key, VV **vp = nullptr) const
340
103k
  {
341
103k
    if (!items) return false;
342
103k
    return has_with_hash (key, hb_hash (key), vp);
343
103k
  }
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, hb_vector_t<unsigned int, false>, false>::has<hb_vector_t<unsigned int, false> >(unsigned int const&, hb_vector_t<unsigned int, false>**) const
bool hb_hashmap_t<unsigned int, unsigned int, true>::has<unsigned int>(unsigned int const&, unsigned int**) const
Line
Count
Source
340
103k
  {
341
103k
    if (!items) return false;
342
103k
    return has_with_hash (key, hb_hash (key), vp);
343
103k
  }
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, unsigned int, true>::has<unsigned int const>(unsigned int const&, unsigned int const**) const
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, OT::Feature const*, false>::has<OT::Feature const*>(unsigned int const&, OT::Feature const***) const
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, hb::unique_ptr<hb_set_t>, false>::has<hb::unique_ptr<hb_set_t> >(unsigned int const&, hb::unique_ptr<hb_set_t>**) const
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, Triple, false>::has<Triple>(unsigned int const&, Triple**) const
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, TripleDistances, false>::has<TripleDistances>(unsigned int const&, TripleDistances**) const
Unexecuted instantiation: bool hb_hashmap_t<hb::shared_ptr<hb_map_t>, unsigned int, false>::has<unsigned int>(hb::shared_ptr<hb_map_t> const&, unsigned int**) const
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, hb_pair_t<void const*, void const*>, false>::has<hb_pair_t<void const*, void const*> >(unsigned int const&, hb_pair_t<void const*, void const*>**) const
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, hb::shared_ptr<hb_set_t>, false>::has<hb::shared_ptr<hb_set_t> >(unsigned int const&, hb::shared_ptr<hb_set_t>**) const
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, hb_pair_t<unsigned int, int>, false>::has<hb_pair_t<unsigned int, int> >(unsigned int const&, hb_pair_t<unsigned int, int>**) const
Unexecuted instantiation: bool hb_hashmap_t<hb_vector_t<OT::HBFixed<OT::NumType<true, short, 2u>, 14u>, false> const*, unsigned int, false>::has<unsigned int>(hb_vector_t<OT::HBFixed<OT::NumType<true, short, 2u>, 14u>, false> const* const&, unsigned int**) const
Unexecuted instantiation: bool hb_hashmap_t<hb_hashmap_t<unsigned int, Triple, false> const*, unsigned int, false>::has<unsigned int>(hb_hashmap_t<unsigned int, Triple, false> const* const&, unsigned int**) const
Unexecuted instantiation: bool hb_hashmap_t<hb_vector_t<int, false> const*, unsigned int, false>::has<unsigned int>(hb_vector_t<int, false> const* const&, unsigned int**) const
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, face_table_info_t, false>::has<face_table_info_t>(unsigned int const&, face_table_info_t**) const
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, hb_set_t, false>::has<hb_set_t>(unsigned int const&, hb_set_t**) const
344
  template <typename VV=V>
345
  bool has_with_hash (const K &key, uint32_t hash, VV **vp = nullptr) const
346
103k
  {
347
103k
    if (!items) return false;
348
103k
    auto *item = fetch_item (key, hash);
349
103k
    if (item)
350
43
    {
351
43
      if (vp) *vp = std::addressof (item->value);
352
43
      return true;
353
43
    }
354
103k
    return false;
355
103k
  }
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, hb_vector_t<unsigned int, false>, false>::has_with_hash<hb_vector_t<unsigned int, false> >(unsigned int const&, unsigned int, hb_vector_t<unsigned int, false>**) const
bool hb_hashmap_t<unsigned int, unsigned int, true>::has_with_hash<unsigned int>(unsigned int const&, unsigned int, unsigned int**) const
Line
Count
Source
346
103k
  {
347
103k
    if (!items) return false;
348
103k
    auto *item = fetch_item (key, hash);
349
103k
    if (item)
350
43
    {
351
43
      if (vp) *vp = std::addressof (item->value);
352
43
      return true;
353
43
    }
354
103k
    return false;
355
103k
  }
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, unsigned int, true>::has_with_hash<unsigned int const>(unsigned int const&, unsigned int, unsigned int const**) const
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, OT::Feature const*, false>::has_with_hash<OT::Feature const*>(unsigned int const&, unsigned int, OT::Feature const***) const
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, hb::unique_ptr<hb_set_t>, false>::has_with_hash<hb::unique_ptr<hb_set_t> >(unsigned int const&, unsigned int, hb::unique_ptr<hb_set_t>**) const
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, Triple, false>::has_with_hash<Triple>(unsigned int const&, unsigned int, Triple**) const
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, TripleDistances, false>::has_with_hash<TripleDistances>(unsigned int const&, unsigned int, TripleDistances**) const
Unexecuted instantiation: bool hb_hashmap_t<hb::shared_ptr<hb_map_t>, unsigned int, false>::has_with_hash<unsigned int>(hb::shared_ptr<hb_map_t> const&, unsigned int, unsigned int**) const
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, hb_pair_t<void const*, void const*>, false>::has_with_hash<hb_pair_t<void const*, void const*> >(unsigned int const&, unsigned int, hb_pair_t<void const*, void const*>**) const
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, hb::shared_ptr<hb_set_t>, false>::has_with_hash<hb::shared_ptr<hb_set_t> >(unsigned int const&, unsigned int, hb::shared_ptr<hb_set_t>**) const
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, hb_pair_t<unsigned int, int>, false>::has_with_hash<hb_pair_t<unsigned int, int> >(unsigned int const&, unsigned int, hb_pair_t<unsigned int, int>**) const
Unexecuted instantiation: bool hb_hashmap_t<hb_vector_t<OT::HBFixed<OT::NumType<true, short, 2u>, 14u>, false> const*, unsigned int, false>::has_with_hash<unsigned int>(hb_vector_t<OT::HBFixed<OT::NumType<true, short, 2u>, 14u>, false> const* const&, unsigned int, unsigned int**) const
Unexecuted instantiation: bool hb_hashmap_t<hb_hashmap_t<unsigned int, Triple, false> const*, unsigned int, false>::has_with_hash<unsigned int>(hb_hashmap_t<unsigned int, Triple, false> const* const&, unsigned int, unsigned int**) const
Unexecuted instantiation: bool hb_hashmap_t<hb_vector_t<int, false> const*, unsigned int, false>::has_with_hash<unsigned int>(hb_vector_t<int, false> const* const&, unsigned int, unsigned int**) const
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, face_table_info_t, false>::has_with_hash<face_table_info_t>(unsigned int const&, unsigned int, face_table_info_t**) const
Unexecuted instantiation: bool hb_hashmap_t<unsigned int, hb_set_t, false>::has_with_hash<hb_set_t>(unsigned int const&, unsigned int, hb_set_t**) const
356
  item_t *fetch_item (const K &key, uint32_t hash) const
357
103k
  {
358
103k
    hash &= 0x3FFFFFFF; // We only store lower 30bit of hash
359
103k
    unsigned int i = hash % prime;
360
103k
    unsigned step = 0;
361
103k
    while (items[i].is_used ())
362
449
    {
363
449
      if ((std::is_integral<K>::value || items[i].hash == hash) &&
364
449
    items[i] == key)
365
43
      {
366
43
  if (items[i].is_real ())
367
43
    return &items[i];
368
0
  else
369
0
    return nullptr;
370
43
      }
371
406
      i = (i + ++step) & mask;
372
406
    }
373
103k
    return nullptr;
374
103k
  }
Unexecuted instantiation: hb_hashmap_t<hb_serialize_context_t::object_t const*, unsigned int, false>::fetch_item(hb_serialize_context_t::object_t const* const&, unsigned int) const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_vector_t<unsigned int, false>, false>::fetch_item(unsigned int const&, unsigned int) const
hb_hashmap_t<unsigned int, unsigned int, true>::fetch_item(unsigned int const&, unsigned int) const
Line
Count
Source
357
103k
  {
358
103k
    hash &= 0x3FFFFFFF; // We only store lower 30bit of hash
359
103k
    unsigned int i = hash % prime;
360
103k
    unsigned step = 0;
361
103k
    while (items[i].is_used ())
362
449
    {
363
449
      if ((std::is_integral<K>::value || items[i].hash == hash) &&
364
449
    items[i] == key)
365
43
      {
366
43
  if (items[i].is_real ())
367
43
    return &items[i];
368
0
  else
369
0
    return nullptr;
370
43
      }
371
406
      i = (i + ++step) & mask;
372
406
    }
373
103k
    return nullptr;
374
103k
  }
Unexecuted instantiation: hb_hashmap_t<unsigned int, OT::Feature const*, false>::fetch_item(unsigned int const&, unsigned int) const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb::unique_ptr<hb_set_t>, false>::fetch_item(unsigned int const&, unsigned int) const
Unexecuted instantiation: hb_hashmap_t<unsigned int, Triple, false>::fetch_item(unsigned int const&, unsigned int) const
Unexecuted instantiation: hb_hashmap_t<unsigned int, TripleDistances, false>::fetch_item(unsigned int const&, unsigned int) const
Unexecuted instantiation: hb_hashmap_t<hb::shared_ptr<hb_map_t>, unsigned int, false>::fetch_item(hb::shared_ptr<hb_map_t> const&, unsigned int) const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb::shared_ptr<hb_set_t>, false>::fetch_item(unsigned int const&, unsigned int) const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_pair_t<void const*, void const*>, false>::fetch_item(unsigned int const&, unsigned int) const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_pair_t<unsigned int, int>, false>::fetch_item(unsigned int const&, unsigned int) const
Unexecuted instantiation: hb_hashmap_t<hb_vector_t<OT::HBFixed<OT::NumType<true, short, 2u>, 14u>, false> const*, unsigned int, false>::fetch_item(hb_vector_t<OT::HBFixed<OT::NumType<true, short, 2u>, 14u>, false> const* const&, unsigned int) const
Unexecuted instantiation: hb_hashmap_t<hb_hashmap_t<unsigned int, Triple, false> const*, unsigned int, false>::fetch_item(hb_hashmap_t<unsigned int, Triple, false> const* const&, unsigned int) const
Unexecuted instantiation: hb_hashmap_t<hb_vector_t<int, false> const*, unsigned int, false>::fetch_item(hb_vector_t<int, false> const* const&, unsigned int) const
Unexecuted instantiation: hb_hashmap_t<unsigned int, face_table_info_t, false>::fetch_item(unsigned int const&, unsigned int) const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_set_t, false>::fetch_item(unsigned int const&, unsigned int) const
375
  /* Projection. */
376
  const V& operator () (K k) const { return get (k); }
377
378
4.28k
  unsigned size () const { return mask ? mask + 1 : 0; }
Unexecuted instantiation: hb_hashmap_t<hb_serialize_context_t::object_t const*, unsigned int, false>::size() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_vector_t<unsigned int, false>, false>::size() const
hb_hashmap_t<unsigned int, unsigned int, true>::size() const
Line
Count
Source
378
4.28k
  unsigned size () const { return mask ? mask + 1 : 0; }
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb::unique_ptr<hb_set_t>, false>::size() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, Triple, false>::size() const
Unexecuted instantiation: hb_hashmap_t<hb::shared_ptr<hb_map_t>, unsigned int, false>::size() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb::shared_ptr<hb_set_t>, false>::size() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, OT::Feature const*, false>::size() const
Unexecuted instantiation: hb_hashmap_t<hb_hashmap_t<unsigned int, Triple, false> const*, unsigned int, false>::size() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_vector_t<int, false> const*, false>::size() const
Unexecuted instantiation: hb_hashmap_t<hb_vector_t<int, false> const*, unsigned int, false>::size() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_pair_t<unsigned int, int>, false>::size() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, face_table_info_t, false>::size() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_set_t, false>::size() const
379
380
  void clear ()
381
0
  {
382
0
    if (unlikely (!successful)) return;
383
0
384
0
    for (auto &_ : hb_iter (items, size ()))
385
0
    {
386
0
      /* Reconstruct items. */
387
0
      _.~item_t ();
388
0
      new (&_) item_t ();
389
0
    }
390
0
391
0
    population = occupancy = 0;
392
0
  }
Unexecuted instantiation: hb_hashmap_t<unsigned int, unsigned int, true>::clear()
Unexecuted instantiation: hb_hashmap_t<unsigned int, Triple, false>::clear()
393
394
0
  bool is_empty () const { return population == 0; }
Unexecuted instantiation: hb_hashmap_t<unsigned int, unsigned int, true>::is_empty() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, Triple, false>::is_empty() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb::shared_ptr<hb_set_t>, false>::is_empty() const
Unexecuted instantiation: hb_hashmap_t<hb_hashmap_t<unsigned int, Triple, false> const*, unsigned int, false>::is_empty() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_pair_t<unsigned int, int>, false>::is_empty() const
395
0
  explicit operator bool () const { return !is_empty (); }
Unexecuted instantiation: hb_hashmap_t<hb_hashmap_t<unsigned int, Triple, false> const*, unsigned int, false>::operator bool() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_pair_t<unsigned int, int>, false>::operator bool() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, unsigned int, true>::operator bool() const
396
397
  uint32_t hash () const
398
0
  {
399
0
    return
400
0
    + iter_items ()
401
0
    | hb_reduce ([] (uint32_t h, const item_t &_) { return h ^ _.total_hash (); }, (uint32_t) 0u)
402
0
    ;
403
0
  }
Unexecuted instantiation: hb_hashmap_t<unsigned int, unsigned int, true>::hash() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, Triple, false>::hash() const
404
405
  bool is_equal (const hb_hashmap_t &other) const
406
0
  {
407
0
    if (population != other.population) return false;
408
0
409
0
    for (auto pair : iter ())
410
0
      if (other.get (pair.first) != pair.second)
411
0
        return false;
412
0
413
0
    return true;
414
0
  }
Unexecuted instantiation: hb_hashmap_t<unsigned int, unsigned int, true>::is_equal(hb_hashmap_t<unsigned int, unsigned int, true> const&) const
Unexecuted instantiation: hb_hashmap_t<unsigned int, Triple, false>::is_equal(hb_hashmap_t<unsigned int, Triple, false> const&) const
415
0
  bool operator == (const hb_hashmap_t &other) const { return is_equal (other); }
Unexecuted instantiation: hb_hashmap_t<unsigned int, unsigned int, true>::operator==(hb_hashmap_t<unsigned int, unsigned int, true> const&) const
Unexecuted instantiation: hb_hashmap_t<unsigned int, Triple, false>::operator==(hb_hashmap_t<unsigned int, Triple, false> const&) const
416
  bool operator != (const hb_hashmap_t &other) const { return !is_equal (other); }
417
418
0
  unsigned int get_population () const { return population; }
Unexecuted instantiation: hb_hashmap_t<unsigned int, unsigned int, true>::get_population() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, Triple, false>::get_population() const
Unexecuted instantiation: hb_hashmap_t<hb_hashmap_t<unsigned int, Triple, false> const*, unsigned int, false>::get_population() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, face_table_info_t, false>::get_population() const
419
420
  void update (const hb_hashmap_t &other)
421
  {
422
    if (unlikely (!successful)) return;
423
424
    hb_copy (other, *this);
425
  }
426
427
  /*
428
   * Iterator
429
   */
430
431
  auto iter_items () const HB_AUTO_RETURN
432
  (
433
    + hb_iter (items, this->size ())
434
    | hb_filter (&item_t::is_real)
435
  )
436
  auto iter_ref () const HB_AUTO_RETURN
437
  (
438
    + this->iter_items ()
439
    | hb_map (&item_t::get_pair_ref)
440
  )
441
  auto iter () const HB_AUTO_RETURN
442
  (
443
    + this->iter_items ()
444
    | hb_map (&item_t::get_pair)
445
  )
446
  auto keys_ref () const HB_AUTO_RETURN
447
  (
448
    + this->iter_items ()
449
    | hb_map (&item_t::get_key)
450
  )
451
  auto keys () const HB_AUTO_RETURN
452
  (
453
    + this->keys_ref ()
454
    | hb_map (hb_ridentity)
455
  )
456
  auto values_ref () const HB_AUTO_RETURN
457
  (
458
    + this->iter_items ()
459
    | hb_map (&item_t::get_value)
460
  )
461
  auto values () const HB_AUTO_RETURN
462
  (
463
    + this->values_ref ()
464
    | hb_map (hb_ridentity)
465
  )
466
467
  /* C iterator. */
468
  bool next (int *idx,
469
       K *key,
470
       V *value) const
471
  {
472
    unsigned i = (unsigned) (*idx + 1);
473
474
    unsigned count = size ();
475
    while (i < count && !items[i].is_real ())
476
      i++;
477
478
    if (i >= count)
479
    {
480
      *idx = -1;
481
      return false;
482
    }
483
484
    *key = items[i].key;
485
    *value = items[i].value;
486
487
    *idx = (signed) i;
488
    return true;
489
  }
490
491
  /* Sink interface. */
492
  hb_hashmap_t& operator << (const hb_pair_t<K, V>& v)
493
0
  { set (v.first, v.second); return *this; }
Unexecuted instantiation: hb_hashmap_t<unsigned int, unsigned int, true>::operator<<(hb_pair_t<unsigned int, unsigned int> const&)
Unexecuted instantiation: hb_hashmap_t<unsigned int, Triple, false>::operator<<(hb_pair_t<unsigned int, Triple> const&)
494
  template <typename V2 = V,
495
      hb_enable_if (!std::is_trivially_copyable<V2>::value)>
496
  hb_hashmap_t& operator << (const hb_pair_t<K, V&&>& v)
497
  { set (v.first, std::move (v.second)); return *this; }
498
  template <typename K2 = K,
499
      hb_enable_if (!std::is_trivially_copyable<K2>::value)>
500
  hb_hashmap_t& operator << (const hb_pair_t<K&&, V>& v)
501
  { set (std::move (v.first), v.second); return *this; }
502
  template <typename K2 = K, typename V2 = V,
503
      hb_enable_if (!std::is_trivially_copyable<K2>::value &&
504
        !std::is_trivially_copyable<V2>::value)>
505
  hb_hashmap_t& operator << (const hb_pair_t<K&&, V&&>& v)
506
  { set (std::move (v.first), std::move (v.second)); return *this; }
507
508
  static unsigned int prime_for (unsigned int shift)
509
4.28k
  {
510
    /* Following comment and table copied from glib. */
511
    /* Each table size has an associated prime modulo (the first prime
512
     * lower than the table size) used to find the initial bucket. Probing
513
     * then works modulo 2^n. The prime modulo is necessary to get a
514
     * good distribution with poor hash functions.
515
     */
516
    /* Not declaring static to make all kinds of compilers happy... */
517
4.28k
    /*static*/ const unsigned int prime_mod [32] =
518
4.28k
    {
519
4.28k
      1,          /* For 1 << 0 */
520
4.28k
      2,
521
4.28k
      3,
522
4.28k
      7,
523
4.28k
      13,
524
4.28k
      31,
525
4.28k
      61,
526
4.28k
      127,
527
4.28k
      251,
528
4.28k
      509,
529
4.28k
      1021,
530
4.28k
      2039,
531
4.28k
      4093,
532
4.28k
      8191,
533
4.28k
      16381,
534
4.28k
      32749,
535
4.28k
      65521,      /* For 1 << 16 */
536
4.28k
      131071,
537
4.28k
      262139,
538
4.28k
      524287,
539
4.28k
      1048573,
540
4.28k
      2097143,
541
4.28k
      4194301,
542
4.28k
      8388593,
543
4.28k
      16777213,
544
4.28k
      33554393,
545
4.28k
      67108859,
546
4.28k
      134217689,
547
4.28k
      268435399,
548
4.28k
      536870909,
549
4.28k
      1073741789,
550
4.28k
      2147483647  /* For 1 << 31 */
551
4.28k
    };
552
553
4.28k
    if (unlikely (shift >= ARRAY_LENGTH (prime_mod)))
554
0
      return prime_mod[ARRAY_LENGTH (prime_mod) - 1];
555
556
4.28k
    return prime_mod[shift];
557
4.28k
  }
Unexecuted instantiation: hb_hashmap_t<hb_serialize_context_t::object_t const*, unsigned int, false>::prime_for(unsigned int)
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_vector_t<unsigned int, false>, false>::prime_for(unsigned int)
hb_hashmap_t<unsigned int, unsigned int, true>::prime_for(unsigned int)
Line
Count
Source
509
4.28k
  {
510
    /* Following comment and table copied from glib. */
511
    /* Each table size has an associated prime modulo (the first prime
512
     * lower than the table size) used to find the initial bucket. Probing
513
     * then works modulo 2^n. The prime modulo is necessary to get a
514
     * good distribution with poor hash functions.
515
     */
516
    /* Not declaring static to make all kinds of compilers happy... */
517
4.28k
    /*static*/ const unsigned int prime_mod [32] =
518
4.28k
    {
519
4.28k
      1,          /* For 1 << 0 */
520
4.28k
      2,
521
4.28k
      3,
522
4.28k
      7,
523
4.28k
      13,
524
4.28k
      31,
525
4.28k
      61,
526
4.28k
      127,
527
4.28k
      251,
528
4.28k
      509,
529
4.28k
      1021,
530
4.28k
      2039,
531
4.28k
      4093,
532
4.28k
      8191,
533
4.28k
      16381,
534
4.28k
      32749,
535
4.28k
      65521,      /* For 1 << 16 */
536
4.28k
      131071,
537
4.28k
      262139,
538
4.28k
      524287,
539
4.28k
      1048573,
540
4.28k
      2097143,
541
4.28k
      4194301,
542
4.28k
      8388593,
543
4.28k
      16777213,
544
4.28k
      33554393,
545
4.28k
      67108859,
546
4.28k
      134217689,
547
4.28k
      268435399,
548
4.28k
      536870909,
549
4.28k
      1073741789,
550
4.28k
      2147483647  /* For 1 << 31 */
551
4.28k
    };
552
553
4.28k
    if (unlikely (shift >= ARRAY_LENGTH (prime_mod)))
554
0
      return prime_mod[ARRAY_LENGTH (prime_mod) - 1];
555
556
4.28k
    return prime_mod[shift];
557
4.28k
  }
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb::unique_ptr<hb_set_t>, false>::prime_for(unsigned int)
Unexecuted instantiation: hb_hashmap_t<unsigned int, Triple, false>::prime_for(unsigned int)
Unexecuted instantiation: hb_hashmap_t<hb::shared_ptr<hb_map_t>, unsigned int, false>::prime_for(unsigned int)
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb::shared_ptr<hb_set_t>, false>::prime_for(unsigned int)
Unexecuted instantiation: hb_hashmap_t<unsigned int, OT::Feature const*, false>::prime_for(unsigned int)
Unexecuted instantiation: hb_hashmap_t<hb_hashmap_t<unsigned int, Triple, false> const*, unsigned int, false>::prime_for(unsigned int)
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_vector_t<int, false> const*, false>::prime_for(unsigned int)
Unexecuted instantiation: hb_hashmap_t<hb_vector_t<int, false> const*, unsigned int, false>::prime_for(unsigned int)
Unexecuted instantiation: hb_hashmap_t<unsigned int, face_table_info_t, false>::prime_for(unsigned int)
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_pair_t<unsigned int, int>, false>::prime_for(unsigned int)
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_set_t, false>::prime_for(unsigned int)
558
};
559
560
/*
561
 * hb_map_t
562
 */
563
564
struct hb_map_t : hb_hashmap_t<hb_codepoint_t,
565
             hb_codepoint_t,
566
             true>
567
{
568
  using hashmap = hb_hashmap_t<hb_codepoint_t,
569
             hb_codepoint_t,
570
             true>;
571
572
  ~hb_map_t () = default;
573
4.28k
  hb_map_t () : hashmap () {}
574
0
  hb_map_t (const hb_map_t &o) : hashmap ((hashmap &) o) {}
575
0
  hb_map_t (hb_map_t &&o)  noexcept : hashmap (std::move ((hashmap &) o)) {}
576
  hb_map_t& operator= (const hb_map_t&) = default;
577
  hb_map_t& operator= (hb_map_t&&) = default;
578
0
  hb_map_t (std::initializer_list<hb_codepoint_pair_t> lst) : hashmap (lst) {}
579
  template <typename Iterable,
580
      hb_requires (hb_is_iterable (Iterable))>
581
  hb_map_t (const Iterable &o) : hashmap (o) {}
582
};
583
584
585
#endif /* HB_MAP_HH */