Coverage Report

Created: 2026-06-09 06:08

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.65k
  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.65k
  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.65k
  ~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.65k
  ~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
114k
    bool is_used () const { return is_used_; }
hb_hashmap_t<unsigned int, unsigned int, true>::item_t::is_used() const
Line
Count
Source
117
114k
    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
Unexecuted instantiation: hb_hashmap_t<OT::SVG::svg_id_span_t, hb_pair_t<unsigned int, unsigned int>, false>::item_t::is_used() const
118
316
    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
316
    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)
Unexecuted instantiation: hb_hashmap_t<OT::SVG::svg_id_span_t, hb_pair_t<unsigned int, unsigned int>, false>::item_t::set_used(bool)
119
316
    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
316
    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)
Unexecuted instantiation: hb_hashmap_t<OT::SVG::svg_id_span_t, hb_pair_t<unsigned int, unsigned int>, false>::item_t::set_real(bool)
120
203
    bool is_real () const { return is_real_; }
hb_hashmap_t<unsigned int, unsigned int, true>::item_t::is_real() const
Line
Count
Source
120
203
    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
Unexecuted instantiation: hb_hashmap_t<OT::SVG::svg_id_span_t, hb_pair_t<unsigned int, unsigned int>, 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
1.57k
    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
1.57k
    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
Unexecuted instantiation: hb_hashmap_t<OT::SVG::svg_id_span_t, hb_pair_t<unsigned int, unsigned int>, false>::item_t::operator==(OT::SVG::svg_id_span_t 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.65k
  {
166
4.65k
    hb_object_init (this);
167
168
4.65k
    successful = true;
169
4.65k
    max_chain_length = 0;
170
4.65k
    population = occupancy = 0;
171
4.65k
    mask = 0;
172
4.65k
    prime = 0;
173
4.65k
    items = nullptr;
174
4.65k
  }
hb_hashmap_t<unsigned int, unsigned int, true>::init()
Line
Count
Source
165
4.65k
  {
166
4.65k
    hb_object_init (this);
167
168
4.65k
    successful = true;
169
4.65k
    max_chain_length = 0;
170
4.65k
    population = occupancy = 0;
171
4.65k
    mask = 0;
172
4.65k
    prime = 0;
173
4.65k
    items = nullptr;
174
4.65k
  }
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<OT::SVG::svg_id_span_t, hb_pair_t<unsigned int, unsigned int>, false>::init()
Unexecuted instantiation: hb_hashmap_t<unsigned int, hb_set_t, false>::init()
175
  void fini ()
176
4.65k
  {
177
4.65k
    hb_object_fini (this);
178
179
4.65k
    if (likely (items))
180
4.65k
    {
181
4.65k
      unsigned size = mask + 1;
182
42.1k
      for (unsigned i = 0; i < size; i++)
183
37.5k
  items[i].~item_t ();
184
4.65k
      hb_free (items);
185
4.65k
      items = nullptr;
186
4.65k
    }
187
4.65k
    population = occupancy = 0;
188
4.65k
  }
hb_hashmap_t<unsigned int, unsigned int, true>::fini()
Line
Count
Source
176
4.65k
  {
177
4.65k
    hb_object_fini (this);
178
179
4.65k
    if (likely (items))
180
4.65k
    {
181
4.65k
      unsigned size = mask + 1;
182
42.1k
      for (unsigned i = 0; i < size; i++)
183
37.5k
  items[i].~item_t ();
184
4.65k
      hb_free (items);
185
4.65k
      items = nullptr;
186
4.65k
    }
187
4.65k
    population = occupancy = 0;
188
4.65k
  }
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<OT::SVG::svg_id_span_t, hb_pair_t<unsigned int, unsigned int>, 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<hb_vector_t<int, 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.65k
  {
201
4.65k
    if (unlikely (!successful)) return false;
202
203
4.65k
    if (new_population != 0 && (new_population + new_population / 2) < mask) return true;
204
205
4.65k
    unsigned int power = hb_bit_storage (hb_max (hb_max ((unsigned) population, new_population) * 2, 4u));
206
4.65k
    unsigned int new_size = 1u << power;
207
4.65k
    item_t *new_items = (item_t *) hb_malloc ((size_t) new_size * sizeof (item_t));
208
4.65k
    if (unlikely (!new_items))
209
0
    {
210
0
      successful = false;
211
0
      return false;
212
0
    }
213
4.65k
    if (!item_t::is_trivially_constructible)
214
0
      for (auto &_ : hb_iter (new_items, new_size))
215
0
  new (&_) item_t ();
216
4.65k
    else
217
4.65k
      hb_memset (new_items, 0, (size_t) new_size * sizeof (item_t));
218
219
4.65k
    unsigned int old_size = size ();
220
4.65k
    item_t *old_items = items;
221
222
    /* Switch to new, empty, array. */
223
4.65k
    population = occupancy = 0;
224
4.65k
    mask = new_size - 1;
225
4.65k
    prime = prime_for (power);
226
4.65k
    max_chain_length = power * 2;
227
4.65k
    items = new_items;
228
229
    /* Insert back old items. */
230
4.65k
    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.65k
    for (unsigned int i = 0; i < old_size; i++)
240
0
      old_items[i].~item_t ();
241
242
4.65k
    hb_free (old_items);
243
244
4.65k
    return true;
245
4.65k
  }
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.65k
  {
201
4.65k
    if (unlikely (!successful)) return false;
202
203
4.65k
    if (new_population != 0 && (new_population + new_population / 2) < mask) return true;
204
205
4.65k
    unsigned int power = hb_bit_storage (hb_max (hb_max ((unsigned) population, new_population) * 2, 4u));
206
4.65k
    unsigned int new_size = 1u << power;
207
4.65k
    item_t *new_items = (item_t *) hb_malloc ((size_t) new_size * sizeof (item_t));
208
4.65k
    if (unlikely (!new_items))
209
0
    {
210
0
      successful = false;
211
0
      return false;
212
0
    }
213
4.65k
    if (!item_t::is_trivially_constructible)
214
0
      for (auto &_ : hb_iter (new_items, new_size))
215
0
  new (&_) item_t ();
216
4.65k
    else
217
4.65k
      hb_memset (new_items, 0, (size_t) new_size * sizeof (item_t));
218
219
4.65k
    unsigned int old_size = size ();
220
4.65k
    item_t *old_items = items;
221
222
    /* Switch to new, empty, array. */
223
4.65k
    population = occupancy = 0;
224
4.65k
    mask = new_size - 1;
225
4.65k
    prime = prime_for (power);
226
4.65k
    max_chain_length = power * 2;
227
4.65k
    items = new_items;
228
229
    /* Insert back old items. */
230
4.65k
    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.65k
    for (unsigned int i = 0; i < old_size; i++)
240
0
      old_items[i].~item_t ();
241
242
4.65k
    hb_free (old_items);
243
244
4.65k
    return true;
245
4.65k
  }
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)
Unexecuted instantiation: hb_hashmap_t<OT::SVG::svg_id_span_t, hb_pair_t<unsigned int, unsigned int>, 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
316
  {
250
316
    if (unlikely (!successful)) return false;
251
316
    if (unlikely ((occupancy + occupancy / 2) >= mask && !alloc ())) return false;
252
253
316
    hash &= 0x3FFFFFFF; // We only store lower 30bit of hash
254
316
    unsigned int tombstone = (unsigned int) -1;
255
316
    unsigned int i = hash % prime;
256
316
    unsigned length = 0;
257
316
    unsigned step = 0;
258
357
    while (items[i].is_used ())
259
41
    {
260
41
      if ((std::is_integral<K>::value || items[i].hash == hash) &&
261
41
    items[i] == key)
262
0
      {
263
0
        if (!overwrite)
264
0
    return false;
265
0
        else
266
0
    break;
267
0
      }
268
41
      if (!items[i].is_real () && tombstone == (unsigned) -1)
269
0
        tombstone = i;
270
41
      i = (i + ++step) & mask;
271
41
      length++;
272
41
    }
273
274
316
    item_t &item = items[tombstone == (unsigned) -1 ? i : tombstone];
275
276
316
    if (item.is_used ())
277
0
    {
278
0
      occupancy--;
279
0
      population -= item.is_real ();
280
0
    }
281
282
316
    item.key = std::forward<KK> (key);
283
316
    item.value = std::forward<VV> (value);
284
316
    item.hash = hash;
285
316
    item.set_used (true);
286
316
    item.set_real (true);
287
288
316
    occupancy++;
289
316
    population++;
290
291
316
    if (unlikely (length > max_chain_length) && occupancy * 8 > mask)
292
0
      alloc (mask - 8); // This ensures we jump to next larger size
293
294
316
    return true;
295
316
  }
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
316
  {
250
316
    if (unlikely (!successful)) return false;
251
316
    if (unlikely ((occupancy + occupancy / 2) >= mask && !alloc ())) return false;
252
253
316
    hash &= 0x3FFFFFFF; // We only store lower 30bit of hash
254
316
    unsigned int tombstone = (unsigned int) -1;
255
316
    unsigned int i = hash % prime;
256
316
    unsigned length = 0;
257
316
    unsigned step = 0;
258
357
    while (items[i].is_used ())
259
41
    {
260
41
      if ((std::is_integral<K>::value || items[i].hash == hash) &&
261
41
    items[i] == key)
262
0
      {
263
0
        if (!overwrite)
264
0
    return false;
265
0
        else
266
0
    break;
267
0
      }
268
41
      if (!items[i].is_real () && tombstone == (unsigned) -1)
269
0
        tombstone = i;
270
41
      i = (i + ++step) & mask;
271
41
      length++;
272
41
    }
273
274
316
    item_t &item = items[tombstone == (unsigned) -1 ? i : tombstone];
275
276
316
    if (item.is_used ())
277
0
    {
278
0
      occupancy--;
279
0
      population -= item.is_real ();
280
0
    }
281
282
316
    item.key = std::forward<KK> (key);
283
316
    item.value = std::forward<VV> (value);
284
316
    item.hash = hash;
285
316
    item.set_used (true);
286
316
    item.set_real (true);
287
288
316
    occupancy++;
289
316
    population++;
290
291
316
    if (unlikely (length > max_chain_length) && occupancy * 8 > mask)
292
0
      alloc (mask - 8); // This ensures we jump to next larger size
293
294
316
    return true;
295
316
  }
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)
Unexecuted instantiation: bool hb_hashmap_t<OT::SVG::svg_id_span_t, hb_pair_t<unsigned int, unsigned int>, false>::set_with_hash<OT::SVG::svg_id_span_t const&, hb_pair_t<unsigned int, unsigned int> >(OT::SVG::svg_id_span_t const&, unsigned int, hb_pair_t<unsigned int, unsigned int>&&, bool)
Unexecuted instantiation: bool hb_hashmap_t<OT::SVG::svg_id_span_t, hb_pair_t<unsigned int, unsigned int>, false>::set_with_hash<OT::SVG::svg_id_span_t, hb_pair_t<unsigned int, unsigned int> >(OT::SVG::svg_id_span_t&&, unsigned int, hb_pair_t<unsigned int, unsigned int>&&, bool)
296
297
  template <typename VV>
298
316
  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
316
  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)
Unexecuted instantiation: bool hb_hashmap_t<OT::SVG::svg_id_span_t, hb_pair_t<unsigned int, unsigned int>, false>::set<hb_pair_t<unsigned int, unsigned int> >(OT::SVG::svg_id_span_t const&, hb_pair_t<unsigned int, unsigned int>&&, 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
112k
  {
341
112k
    if (!items) return false;
342
112k
    return has_with_hash (key, hb_hash (key), vp);
343
112k
  }
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
112k
  {
341
112k
    if (!items) return false;
342
112k
    return has_with_hash (key, hb_hash (key), vp);
343
112k
  }
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
Unexecuted instantiation: bool hb_hashmap_t<OT::SVG::svg_id_span_t, hb_pair_t<unsigned int, unsigned int>, false>::has<hb_pair_t<unsigned int, unsigned int> >(OT::SVG::svg_id_span_t const&, hb_pair_t<unsigned int, unsigned int>**) const
344
  template <typename VV=V>
345
  bool has_with_hash (const K &key, uint32_t hash, VV **vp = nullptr) const
346
112k
  {
347
112k
    if (!items) return false;
348
112k
    auto *item = fetch_item (key, hash);
349
112k
    if (item)
350
162
    {
351
162
      if (vp) *vp = std::addressof (item->value);
352
162
      return true;
353
162
    }
354
111k
    return false;
355
112k
  }
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
112k
  {
347
112k
    if (!items) return false;
348
112k
    auto *item = fetch_item (key, hash);
349
112k
    if (item)
350
162
    {
351
162
      if (vp) *vp = std::addressof (item->value);
352
162
      return true;
353
162
    }
354
111k
    return false;
355
112k
  }
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
Unexecuted instantiation: bool hb_hashmap_t<OT::SVG::svg_id_span_t, hb_pair_t<unsigned int, unsigned int>, false>::has_with_hash<hb_pair_t<unsigned int, unsigned int> >(OT::SVG::svg_id_span_t const&, unsigned int, hb_pair_t<unsigned int, unsigned int>**) const
356
  item_t *fetch_item (const K &key, uint32_t hash) const
357
112k
  {
358
112k
    hash &= 0x3FFFFFFF; // We only store lower 30bit of hash
359
112k
    unsigned int i = hash % prime;
360
112k
    unsigned step = 0;
361
113k
    while (items[i].is_used ())
362
1.53k
    {
363
1.53k
      if ((std::is_integral<K>::value || items[i].hash == hash) &&
364
1.53k
    items[i] == key)
365
162
      {
366
162
  if (items[i].is_real ())
367
162
    return &items[i];
368
0
  else
369
0
    return nullptr;
370
162
      }
371
1.37k
      i = (i + ++step) & mask;
372
1.37k
    }
373
111k
    return nullptr;
374
112k
  }
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
112k
  {
358
112k
    hash &= 0x3FFFFFFF; // We only store lower 30bit of hash
359
112k
    unsigned int i = hash % prime;
360
112k
    unsigned step = 0;
361
113k
    while (items[i].is_used ())
362
1.53k
    {
363
1.53k
      if ((std::is_integral<K>::value || items[i].hash == hash) &&
364
1.53k
    items[i] == key)
365
162
      {
366
162
  if (items[i].is_real ())
367
162
    return &items[i];
368
0
  else
369
0
    return nullptr;
370
162
      }
371
1.37k
      i = (i + ++step) & mask;
372
1.37k
    }
373
111k
    return nullptr;
374
112k
  }
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
Unexecuted instantiation: hb_hashmap_t<OT::SVG::svg_id_span_t, hb_pair_t<unsigned int, unsigned int>, false>::fetch_item(OT::SVG::svg_id_span_t const&, unsigned int) const
375
  /* Projection. */
376
  const V& operator () (K k) const { return get (k); }
377
378
4.65k
  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.65k
  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
Unexecuted instantiation: hb_hashmap_t<OT::SVG::svg_id_span_t, hb_pair_t<unsigned int, unsigned int>, false>::size() const
379
380
  void clear ()
381
0
  {
382
0
    /* Early-out on already-empty.  Protects the Null singleton
383
0
     * (zero-initialized) from any writes.  Any non-empty hashmap
384
0
     * is a real heap instance with writable items, so clearing
385
0
     * under !successful is safe. */
386
0
    if (!population && !occupancy) return;
387
0
388
0
    for (auto &_ : hb_iter (items, size ()))
389
0
    {
390
0
      /* Reconstruct items. */
391
0
      _.~item_t ();
392
0
      new (&_) item_t ();
393
0
    }
394
0
395
0
    population = occupancy = 0;
396
0
  }
Unexecuted instantiation: hb_hashmap_t<unsigned int, unsigned int, true>::clear()
Unexecuted instantiation: hb_hashmap_t<unsigned int, Triple, false>::clear()
397
398
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
399
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
400
401
  uint32_t hash () const
402
0
  {
403
0
    return
404
0
    + iter_items ()
405
0
    | hb_reduce ([] (uint32_t h, const item_t &_) { return h ^ _.total_hash (); }, (uint32_t) 0u)
406
0
    ;
407
0
  }
Unexecuted instantiation: hb_hashmap_t<unsigned int, unsigned int, true>::hash() const
Unexecuted instantiation: hb_hashmap_t<unsigned int, Triple, false>::hash() const
408
409
  bool is_equal (const hb_hashmap_t &other) const
410
0
  {
411
0
    if (population != other.population) return false;
412
0
413
0
    for (auto pair : iter ())
414
0
      if (other.get (pair.first) != pair.second)
415
0
        return false;
416
0
417
0
    return true;
418
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
419
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
420
  bool operator != (const hb_hashmap_t &other) const { return !is_equal (other); }
421
422
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
423
424
  void update (const hb_hashmap_t &other)
425
  {
426
    if (unlikely (!successful)) return;
427
428
    hb_copy (other, *this);
429
  }
430
431
  /*
432
   * Iterator
433
   */
434
435
  auto iter_items () const HB_AUTO_RETURN
436
  (
437
    + hb_iter (items, this->size ())
438
    | hb_filter (&item_t::is_real)
439
  )
440
  auto iter_ref () const HB_AUTO_RETURN
441
  (
442
    + this->iter_items ()
443
    | hb_map (&item_t::get_pair_ref)
444
  )
445
  auto iter () const HB_AUTO_RETURN
446
  (
447
    + this->iter_items ()
448
    | hb_map (&item_t::get_pair)
449
  )
450
  auto keys_ref () const HB_AUTO_RETURN
451
  (
452
    + this->iter_items ()
453
    | hb_map (&item_t::get_key)
454
  )
455
  auto keys () const HB_AUTO_RETURN
456
  (
457
    + this->keys_ref ()
458
    | hb_map (hb_ridentity)
459
  )
460
  auto values_ref () const HB_AUTO_RETURN
461
  (
462
    + this->iter_items ()
463
    | hb_map (&item_t::get_value)
464
  )
465
  auto values () const HB_AUTO_RETURN
466
  (
467
    + this->values_ref ()
468
    | hb_map (hb_ridentity)
469
  )
470
471
  /* C iterator. */
472
  bool next (int *idx,
473
       K *key,
474
       V *value) const
475
  {
476
    unsigned i = (unsigned) (*idx + 1);
477
478
    unsigned count = size ();
479
    while (i < count && !items[i].is_real ())
480
      i++;
481
482
    if (i >= count)
483
    {
484
      *idx = -1;
485
      return false;
486
    }
487
488
    *key = items[i].key;
489
    *value = items[i].value;
490
491
    *idx = (signed) i;
492
    return true;
493
  }
494
495
  /* Sink interface. */
496
  hb_hashmap_t& operator << (const hb_pair_t<K, V>& v)
497
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&)
498
  template <typename V2 = V,
499
      hb_enable_if (!hb_is_trivially_copyable (V2))>
500
  hb_hashmap_t& operator << (const hb_pair_t<K, V&&>& v)
501
  { set (v.first, std::move (v.second)); return *this; }
502
  template <typename K2 = K,
503
      hb_enable_if (!hb_is_trivially_copyable (K2))>
504
  hb_hashmap_t& operator << (const hb_pair_t<K&&, V>& v)
505
  { set (std::move (v.first), v.second); return *this; }
506
  template <typename K2 = K, typename V2 = V,
507
      hb_enable_if (!hb_is_trivially_copyable (K2) &&
508
        !hb_is_trivially_copyable (V2))>
509
  hb_hashmap_t& operator << (const hb_pair_t<K&&, V&&>& v)
510
  { set (std::move (v.first), std::move (v.second)); return *this; }
511
512
  static unsigned int prime_for (unsigned int shift)
513
4.65k
  {
514
    /* Following comment and table copied from glib. */
515
    /* Each table size has an associated prime modulo (the first prime
516
     * lower than the table size) used to find the initial bucket. Probing
517
     * then works modulo 2^n. The prime modulo is necessary to get a
518
     * good distribution with poor hash functions.
519
     */
520
    /* Not declaring static to make all kinds of compilers happy... */
521
4.65k
    /*static*/ const unsigned int prime_mod [32] =
522
4.65k
    {
523
4.65k
      1,          /* For 1 << 0 */
524
4.65k
      2,
525
4.65k
      3,
526
4.65k
      7,
527
4.65k
      13,
528
4.65k
      31,
529
4.65k
      61,
530
4.65k
      127,
531
4.65k
      251,
532
4.65k
      509,
533
4.65k
      1021,
534
4.65k
      2039,
535
4.65k
      4093,
536
4.65k
      8191,
537
4.65k
      16381,
538
4.65k
      32749,
539
4.65k
      65521,      /* For 1 << 16 */
540
4.65k
      131071,
541
4.65k
      262139,
542
4.65k
      524287,
543
4.65k
      1048573,
544
4.65k
      2097143,
545
4.65k
      4194301,
546
4.65k
      8388593,
547
4.65k
      16777213,
548
4.65k
      33554393,
549
4.65k
      67108859,
550
4.65k
      134217689,
551
4.65k
      268435399,
552
4.65k
      536870909,
553
4.65k
      1073741789,
554
4.65k
      2147483647  /* For 1 << 31 */
555
4.65k
    };
556
557
4.65k
    if (unlikely (shift >= ARRAY_LENGTH (prime_mod)))
558
0
      return prime_mod[ARRAY_LENGTH (prime_mod) - 1];
559
560
4.65k
    return prime_mod[shift];
561
4.65k
  }
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
513
4.65k
  {
514
    /* Following comment and table copied from glib. */
515
    /* Each table size has an associated prime modulo (the first prime
516
     * lower than the table size) used to find the initial bucket. Probing
517
     * then works modulo 2^n. The prime modulo is necessary to get a
518
     * good distribution with poor hash functions.
519
     */
520
    /* Not declaring static to make all kinds of compilers happy... */
521
4.65k
    /*static*/ const unsigned int prime_mod [32] =
522
4.65k
    {
523
4.65k
      1,          /* For 1 << 0 */
524
4.65k
      2,
525
4.65k
      3,
526
4.65k
      7,
527
4.65k
      13,
528
4.65k
      31,
529
4.65k
      61,
530
4.65k
      127,
531
4.65k
      251,
532
4.65k
      509,
533
4.65k
      1021,
534
4.65k
      2039,
535
4.65k
      4093,
536
4.65k
      8191,
537
4.65k
      16381,
538
4.65k
      32749,
539
4.65k
      65521,      /* For 1 << 16 */
540
4.65k
      131071,
541
4.65k
      262139,
542
4.65k
      524287,
543
4.65k
      1048573,
544
4.65k
      2097143,
545
4.65k
      4194301,
546
4.65k
      8388593,
547
4.65k
      16777213,
548
4.65k
      33554393,
549
4.65k
      67108859,
550
4.65k
      134217689,
551
4.65k
      268435399,
552
4.65k
      536870909,
553
4.65k
      1073741789,
554
4.65k
      2147483647  /* For 1 << 31 */
555
4.65k
    };
556
557
4.65k
    if (unlikely (shift >= ARRAY_LENGTH (prime_mod)))
558
0
      return prime_mod[ARRAY_LENGTH (prime_mod) - 1];
559
560
4.65k
    return prime_mod[shift];
561
4.65k
  }
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)
Unexecuted instantiation: hb_hashmap_t<OT::SVG::svg_id_span_t, hb_pair_t<unsigned int, unsigned int>, false>::prime_for(unsigned int)
562
};
563
564
/*
565
 * hb_map_t
566
 */
567
568
struct hb_map_t : hb_hashmap_t<hb_codepoint_t,
569
             hb_codepoint_t,
570
             true>
571
{
572
  using hashmap = hb_hashmap_t<hb_codepoint_t,
573
             hb_codepoint_t,
574
             true>;
575
576
  ~hb_map_t () = default;
577
4.65k
  hb_map_t () : hashmap () {}
578
0
  hb_map_t (const hb_map_t &o) : hashmap ((hashmap &) o) {}
579
0
  hb_map_t (hb_map_t &&o)  noexcept : hashmap (std::move ((hashmap &) o)) {}
580
  hb_map_t& operator= (const hb_map_t&) = default;
581
  hb_map_t& operator= (hb_map_t&&) = default;
582
0
  hb_map_t (std::initializer_list<hb_codepoint_pair_t> lst) : hashmap (lst) {}
583
  template <typename Iterable,
584
      hb_requires (hb_is_iterable (Iterable))>
585
  hb_map_t (const Iterable &o) : hashmap (o) {}
586
};
587
588
589
#endif /* HB_MAP_HH */