comparison mupdf-source/thirdparty/harfbuzz/src/hb-multimap.hh @ 2:b50eed0cc0ef upstream

ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4. The directory name has changed: no version number in the expanded directory now.
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 15 Sep 2025 11:43:07 +0200
parents
children
comparison
equal deleted inserted replaced
1:1d09e1dec1d9 2:b50eed0cc0ef
1 /*
2 * Copyright © 2022 Behdad Esfahbod
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
25 #ifndef HB_MULTIMAP_HH
26 #define HB_MULTIMAP_HH
27
28 #include "hb.hh"
29 #include "hb-map.hh"
30 #include "hb-vector.hh"
31
32
33 /*
34 * hb_multimap_t
35 */
36
37 struct hb_multimap_t
38 {
39 void add (hb_codepoint_t k, hb_codepoint_t v)
40 {
41 hb_codepoint_t *i;
42 if (multiples_indices.has (k, &i))
43 {
44 multiples_values[*i].push (v);
45 return;
46 }
47
48 hb_codepoint_t *old_v;
49 if (singulars.has (k, &old_v))
50 {
51 hb_codepoint_t old = *old_v;
52 singulars.del (k);
53
54 multiples_indices.set (k, multiples_values.length);
55 auto *vec = multiples_values.push ();
56
57 vec->push (old);
58 vec->push (v);
59
60 return;
61 }
62
63 singulars.set (k, v);
64 }
65
66 hb_array_t<const hb_codepoint_t> get (hb_codepoint_t k) const
67 {
68 hb_codepoint_t *v;
69 if (singulars.has (k, &v))
70 return hb_array (v, 1);
71
72 hb_codepoint_t *i;
73 if (multiples_indices.has (k, &i))
74 return multiples_values[*i].as_array ();
75
76 return hb_array_t<hb_codepoint_t> ();
77 }
78
79 bool in_error () const
80 {
81 return singulars.in_error () || multiples_indices.in_error () || multiples_values.in_error ();
82 }
83
84 protected:
85 hb_map_t singulars;
86 hb_map_t multiples_indices;
87 hb_vector_t<hb_vector_t<hb_codepoint_t>> multiples_values;
88 };
89
90
91
92 #endif /* HB_MULTIMAP_HH */