1*2d1272b8SAndroid Build Coastguard Worker /* 2*2d1272b8SAndroid Build Coastguard Worker * Copyright © 2022 Behdad Esfahbod 3*2d1272b8SAndroid Build Coastguard Worker * 4*2d1272b8SAndroid Build Coastguard Worker * This is part of HarfBuzz, a text shaping library. 5*2d1272b8SAndroid Build Coastguard Worker * 6*2d1272b8SAndroid Build Coastguard Worker * Permission is hereby granted, without written agreement and without 7*2d1272b8SAndroid Build Coastguard Worker * license or royalty fees, to use, copy, modify, and distribute this 8*2d1272b8SAndroid Build Coastguard Worker * software and its documentation for any purpose, provided that the 9*2d1272b8SAndroid Build Coastguard Worker * above copyright notice and the following two paragraphs appear in 10*2d1272b8SAndroid Build Coastguard Worker * all copies of this software. 11*2d1272b8SAndroid Build Coastguard Worker * 12*2d1272b8SAndroid Build Coastguard Worker * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR 13*2d1272b8SAndroid Build Coastguard Worker * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES 14*2d1272b8SAndroid Build Coastguard Worker * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN 15*2d1272b8SAndroid Build Coastguard Worker * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 16*2d1272b8SAndroid Build Coastguard Worker * DAMAGE. 17*2d1272b8SAndroid Build Coastguard Worker * 18*2d1272b8SAndroid Build Coastguard Worker * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, 19*2d1272b8SAndroid Build Coastguard Worker * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 20*2d1272b8SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS 21*2d1272b8SAndroid Build Coastguard Worker * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO 22*2d1272b8SAndroid Build Coastguard Worker * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 23*2d1272b8SAndroid Build Coastguard Worker */ 24*2d1272b8SAndroid Build Coastguard Worker 25*2d1272b8SAndroid Build Coastguard Worker #ifndef HB_MULTIMAP_HH 26*2d1272b8SAndroid Build Coastguard Worker #define HB_MULTIMAP_HH 27*2d1272b8SAndroid Build Coastguard Worker 28*2d1272b8SAndroid Build Coastguard Worker #include "hb.hh" 29*2d1272b8SAndroid Build Coastguard Worker #include "hb-map.hh" 30*2d1272b8SAndroid Build Coastguard Worker #include "hb-vector.hh" 31*2d1272b8SAndroid Build Coastguard Worker 32*2d1272b8SAndroid Build Coastguard Worker 33*2d1272b8SAndroid Build Coastguard Worker /* 34*2d1272b8SAndroid Build Coastguard Worker * hb_multimap_t 35*2d1272b8SAndroid Build Coastguard Worker */ 36*2d1272b8SAndroid Build Coastguard Worker 37*2d1272b8SAndroid Build Coastguard Worker struct hb_multimap_t 38*2d1272b8SAndroid Build Coastguard Worker { addhb_multimap_t39*2d1272b8SAndroid Build Coastguard Worker void add (hb_codepoint_t k, hb_codepoint_t v) 40*2d1272b8SAndroid Build Coastguard Worker { 41*2d1272b8SAndroid Build Coastguard Worker hb_vector_t<hb_codepoint_t> *m; 42*2d1272b8SAndroid Build Coastguard Worker if (multiples.has (k, &m)) 43*2d1272b8SAndroid Build Coastguard Worker { 44*2d1272b8SAndroid Build Coastguard Worker m->push (v); 45*2d1272b8SAndroid Build Coastguard Worker return; 46*2d1272b8SAndroid Build Coastguard Worker } 47*2d1272b8SAndroid Build Coastguard Worker 48*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t *old_v; 49*2d1272b8SAndroid Build Coastguard Worker if (singulars.has (k, &old_v)) 50*2d1272b8SAndroid Build Coastguard Worker { 51*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t old = *old_v; 52*2d1272b8SAndroid Build Coastguard Worker singulars.del (k); 53*2d1272b8SAndroid Build Coastguard Worker 54*2d1272b8SAndroid Build Coastguard Worker multiples.set (k, hb_vector_t<hb_codepoint_t> {old, v}); 55*2d1272b8SAndroid Build Coastguard Worker return; 56*2d1272b8SAndroid Build Coastguard Worker } 57*2d1272b8SAndroid Build Coastguard Worker 58*2d1272b8SAndroid Build Coastguard Worker singulars.set (k, v); 59*2d1272b8SAndroid Build Coastguard Worker } 60*2d1272b8SAndroid Build Coastguard Worker gethb_multimap_t61*2d1272b8SAndroid Build Coastguard Worker hb_array_t<const hb_codepoint_t> get (hb_codepoint_t k) const 62*2d1272b8SAndroid Build Coastguard Worker { 63*2d1272b8SAndroid Build Coastguard Worker const hb_codepoint_t *v; 64*2d1272b8SAndroid Build Coastguard Worker if (singulars.has (k, &v)) 65*2d1272b8SAndroid Build Coastguard Worker return hb_array (v, 1); 66*2d1272b8SAndroid Build Coastguard Worker 67*2d1272b8SAndroid Build Coastguard Worker hb_vector_t<hb_codepoint_t> *m; 68*2d1272b8SAndroid Build Coastguard Worker if (multiples.has (k, &m)) 69*2d1272b8SAndroid Build Coastguard Worker return m->as_array (); 70*2d1272b8SAndroid Build Coastguard Worker 71*2d1272b8SAndroid Build Coastguard Worker return hb_array_t<const hb_codepoint_t> (); 72*2d1272b8SAndroid Build Coastguard Worker } 73*2d1272b8SAndroid Build Coastguard Worker in_errorhb_multimap_t74*2d1272b8SAndroid Build Coastguard Worker bool in_error () const 75*2d1272b8SAndroid Build Coastguard Worker { 76*2d1272b8SAndroid Build Coastguard Worker if (singulars.in_error () || multiples.in_error ()) 77*2d1272b8SAndroid Build Coastguard Worker return true; 78*2d1272b8SAndroid Build Coastguard Worker for (const auto &m : multiples.values_ref ()) 79*2d1272b8SAndroid Build Coastguard Worker if (m.in_error ()) 80*2d1272b8SAndroid Build Coastguard Worker return true; 81*2d1272b8SAndroid Build Coastguard Worker return false; 82*2d1272b8SAndroid Build Coastguard Worker } 83*2d1272b8SAndroid Build Coastguard Worker allochb_multimap_t84*2d1272b8SAndroid Build Coastguard Worker void alloc (unsigned size) 85*2d1272b8SAndroid Build Coastguard Worker { 86*2d1272b8SAndroid Build Coastguard Worker singulars.alloc (size); 87*2d1272b8SAndroid Build Coastguard Worker } 88*2d1272b8SAndroid Build Coastguard Worker 89*2d1272b8SAndroid Build Coastguard Worker protected: 90*2d1272b8SAndroid Build Coastguard Worker hb_map_t singulars; 91*2d1272b8SAndroid Build Coastguard Worker hb_hashmap_t<hb_codepoint_t, hb_vector_t<hb_codepoint_t>> multiples; 92*2d1272b8SAndroid Build Coastguard Worker }; 93*2d1272b8SAndroid Build Coastguard Worker 94*2d1272b8SAndroid Build Coastguard Worker 95*2d1272b8SAndroid Build Coastguard Worker 96*2d1272b8SAndroid Build Coastguard Worker #endif /* HB_MULTIMAP_HH */ 97