1*2d1272b8SAndroid Build Coastguard Worker /*
2*2d1272b8SAndroid Build Coastguard Worker * Copyright © 2022 Google, Inc.
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 * Google Author(s): Garret Rieger
25*2d1272b8SAndroid Build Coastguard Worker */
26*2d1272b8SAndroid Build Coastguard Worker
27*2d1272b8SAndroid Build Coastguard Worker #include "gsubgpos-context.hh"
28*2d1272b8SAndroid Build Coastguard Worker #include "classdef-graph.hh"
29*2d1272b8SAndroid Build Coastguard Worker #include "hb-iter.hh"
30*2d1272b8SAndroid Build Coastguard Worker #include "hb-serialize.hh"
31*2d1272b8SAndroid Build Coastguard Worker
32*2d1272b8SAndroid Build Coastguard Worker typedef hb_codepoint_pair_t gid_and_class_t;
33*2d1272b8SAndroid Build Coastguard Worker typedef hb_vector_t<gid_and_class_t> gid_and_class_list_t;
34*2d1272b8SAndroid Build Coastguard Worker
35*2d1272b8SAndroid Build Coastguard Worker template<typename It>
actual_class_def_size(It glyph_and_class)36*2d1272b8SAndroid Build Coastguard Worker static unsigned actual_class_def_size(It glyph_and_class) {
37*2d1272b8SAndroid Build Coastguard Worker char buffer[100];
38*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t serializer(buffer, 100);
39*2d1272b8SAndroid Build Coastguard Worker OT::ClassDef_serialize (&serializer, glyph_and_class);
40*2d1272b8SAndroid Build Coastguard Worker serializer.end_serialize ();
41*2d1272b8SAndroid Build Coastguard Worker assert(!serializer.in_error());
42*2d1272b8SAndroid Build Coastguard Worker
43*2d1272b8SAndroid Build Coastguard Worker hb_blob_t* blob = serializer.copy_blob();
44*2d1272b8SAndroid Build Coastguard Worker unsigned size = hb_blob_get_length(blob);
45*2d1272b8SAndroid Build Coastguard Worker hb_blob_destroy(blob);
46*2d1272b8SAndroid Build Coastguard Worker return size;
47*2d1272b8SAndroid Build Coastguard Worker }
48*2d1272b8SAndroid Build Coastguard Worker
actual_class_def_size(gid_and_class_list_t consecutive_map,hb_vector_t<unsigned> classes)49*2d1272b8SAndroid Build Coastguard Worker static unsigned actual_class_def_size(gid_and_class_list_t consecutive_map, hb_vector_t<unsigned> classes) {
50*2d1272b8SAndroid Build Coastguard Worker auto filtered_it =
51*2d1272b8SAndroid Build Coastguard Worker + consecutive_map.as_sorted_array().iter()
52*2d1272b8SAndroid Build Coastguard Worker | hb_filter([&] (unsigned c) {
53*2d1272b8SAndroid Build Coastguard Worker for (unsigned klass : classes) {
54*2d1272b8SAndroid Build Coastguard Worker if (c == klass) {
55*2d1272b8SAndroid Build Coastguard Worker return true;
56*2d1272b8SAndroid Build Coastguard Worker }
57*2d1272b8SAndroid Build Coastguard Worker }
58*2d1272b8SAndroid Build Coastguard Worker return false;
59*2d1272b8SAndroid Build Coastguard Worker }, hb_second);
60*2d1272b8SAndroid Build Coastguard Worker return actual_class_def_size(+ filtered_it);
61*2d1272b8SAndroid Build Coastguard Worker }
62*2d1272b8SAndroid Build Coastguard Worker
63*2d1272b8SAndroid Build Coastguard Worker template<typename It>
actual_coverage_size(It glyphs)64*2d1272b8SAndroid Build Coastguard Worker static unsigned actual_coverage_size(It glyphs) {
65*2d1272b8SAndroid Build Coastguard Worker char buffer[100];
66*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t serializer(buffer, 100);
67*2d1272b8SAndroid Build Coastguard Worker OT::Layout::Common::Coverage_serialize (&serializer, glyphs);
68*2d1272b8SAndroid Build Coastguard Worker serializer.end_serialize ();
69*2d1272b8SAndroid Build Coastguard Worker assert(!serializer.in_error());
70*2d1272b8SAndroid Build Coastguard Worker
71*2d1272b8SAndroid Build Coastguard Worker hb_blob_t* blob = serializer.copy_blob();
72*2d1272b8SAndroid Build Coastguard Worker unsigned size = hb_blob_get_length(blob);
73*2d1272b8SAndroid Build Coastguard Worker hb_blob_destroy(blob);
74*2d1272b8SAndroid Build Coastguard Worker return size;
75*2d1272b8SAndroid Build Coastguard Worker }
76*2d1272b8SAndroid Build Coastguard Worker
actual_coverage_size(gid_and_class_list_t consecutive_map,hb_vector_t<unsigned> classes)77*2d1272b8SAndroid Build Coastguard Worker static unsigned actual_coverage_size(gid_and_class_list_t consecutive_map, hb_vector_t<unsigned> classes) {
78*2d1272b8SAndroid Build Coastguard Worker auto filtered_it =
79*2d1272b8SAndroid Build Coastguard Worker + consecutive_map.as_sorted_array().iter()
80*2d1272b8SAndroid Build Coastguard Worker | hb_filter([&] (unsigned c) {
81*2d1272b8SAndroid Build Coastguard Worker for (unsigned klass : classes) {
82*2d1272b8SAndroid Build Coastguard Worker if (c == klass) {
83*2d1272b8SAndroid Build Coastguard Worker return true;
84*2d1272b8SAndroid Build Coastguard Worker }
85*2d1272b8SAndroid Build Coastguard Worker }
86*2d1272b8SAndroid Build Coastguard Worker return false;
87*2d1272b8SAndroid Build Coastguard Worker }, hb_second);
88*2d1272b8SAndroid Build Coastguard Worker return actual_coverage_size(+ filtered_it | hb_map_retains_sorting(hb_first));
89*2d1272b8SAndroid Build Coastguard Worker }
90*2d1272b8SAndroid Build Coastguard Worker
check_coverage_size(graph::class_def_size_estimator_t & estimator,const gid_and_class_list_t & map,hb_vector_t<unsigned> klasses)91*2d1272b8SAndroid Build Coastguard Worker static bool check_coverage_size(graph::class_def_size_estimator_t& estimator,
92*2d1272b8SAndroid Build Coastguard Worker const gid_and_class_list_t& map,
93*2d1272b8SAndroid Build Coastguard Worker hb_vector_t<unsigned> klasses)
94*2d1272b8SAndroid Build Coastguard Worker {
95*2d1272b8SAndroid Build Coastguard Worker unsigned result = estimator.coverage_size();
96*2d1272b8SAndroid Build Coastguard Worker unsigned expected = actual_coverage_size(map, klasses);
97*2d1272b8SAndroid Build Coastguard Worker if (result != expected) {
98*2d1272b8SAndroid Build Coastguard Worker printf ("FAIL: estimated coverage expected size %u but was %u\n", expected, result);
99*2d1272b8SAndroid Build Coastguard Worker return false;
100*2d1272b8SAndroid Build Coastguard Worker }
101*2d1272b8SAndroid Build Coastguard Worker return true;
102*2d1272b8SAndroid Build Coastguard Worker }
103*2d1272b8SAndroid Build Coastguard Worker
check_add_class_def_size(graph::class_def_size_estimator_t & estimator,const gid_and_class_list_t & map,unsigned klass,hb_vector_t<unsigned> klasses)104*2d1272b8SAndroid Build Coastguard Worker static bool check_add_class_def_size(graph::class_def_size_estimator_t& estimator,
105*2d1272b8SAndroid Build Coastguard Worker const gid_and_class_list_t& map,
106*2d1272b8SAndroid Build Coastguard Worker unsigned klass, hb_vector_t<unsigned> klasses)
107*2d1272b8SAndroid Build Coastguard Worker {
108*2d1272b8SAndroid Build Coastguard Worker unsigned result = estimator.add_class_def_size(klass);
109*2d1272b8SAndroid Build Coastguard Worker unsigned expected = actual_class_def_size(map, klasses);
110*2d1272b8SAndroid Build Coastguard Worker if (result != expected) {
111*2d1272b8SAndroid Build Coastguard Worker printf ("FAIL: estimated class def expected size %u but was %u\n", expected, result);
112*2d1272b8SAndroid Build Coastguard Worker return false;
113*2d1272b8SAndroid Build Coastguard Worker }
114*2d1272b8SAndroid Build Coastguard Worker
115*2d1272b8SAndroid Build Coastguard Worker return check_coverage_size(estimator, map, klasses);
116*2d1272b8SAndroid Build Coastguard Worker }
117*2d1272b8SAndroid Build Coastguard Worker
check_add_class_def_size(const gid_and_class_list_t & list,unsigned klass)118*2d1272b8SAndroid Build Coastguard Worker static bool check_add_class_def_size (const gid_and_class_list_t& list, unsigned klass)
119*2d1272b8SAndroid Build Coastguard Worker {
120*2d1272b8SAndroid Build Coastguard Worker graph::class_def_size_estimator_t estimator (list.iter ());
121*2d1272b8SAndroid Build Coastguard Worker
122*2d1272b8SAndroid Build Coastguard Worker unsigned result = estimator.add_class_def_size (klass);
123*2d1272b8SAndroid Build Coastguard Worker auto filtered_it =
124*2d1272b8SAndroid Build Coastguard Worker + list.as_sorted_array().iter()
125*2d1272b8SAndroid Build Coastguard Worker | hb_filter([&] (unsigned c) {
126*2d1272b8SAndroid Build Coastguard Worker return c == klass;
127*2d1272b8SAndroid Build Coastguard Worker }, hb_second);
128*2d1272b8SAndroid Build Coastguard Worker
129*2d1272b8SAndroid Build Coastguard Worker unsigned expected = actual_class_def_size(filtered_it);
130*2d1272b8SAndroid Build Coastguard Worker if (result != expected)
131*2d1272b8SAndroid Build Coastguard Worker {
132*2d1272b8SAndroid Build Coastguard Worker printf ("FAIL: class def expected size %u but was %u\n", expected, result);
133*2d1272b8SAndroid Build Coastguard Worker return false;
134*2d1272b8SAndroid Build Coastguard Worker }
135*2d1272b8SAndroid Build Coastguard Worker
136*2d1272b8SAndroid Build Coastguard Worker auto cov_it = + filtered_it | hb_map_retains_sorting(hb_first);
137*2d1272b8SAndroid Build Coastguard Worker result = estimator.coverage_size ();
138*2d1272b8SAndroid Build Coastguard Worker expected = actual_coverage_size(cov_it);
139*2d1272b8SAndroid Build Coastguard Worker if (result != expected)
140*2d1272b8SAndroid Build Coastguard Worker {
141*2d1272b8SAndroid Build Coastguard Worker printf ("FAIL: coverage expected size %u but was %u\n", expected, result);
142*2d1272b8SAndroid Build Coastguard Worker return false;
143*2d1272b8SAndroid Build Coastguard Worker }
144*2d1272b8SAndroid Build Coastguard Worker
145*2d1272b8SAndroid Build Coastguard Worker return true;
146*2d1272b8SAndroid Build Coastguard Worker }
147*2d1272b8SAndroid Build Coastguard Worker
test_class_and_coverage_size_estimates()148*2d1272b8SAndroid Build Coastguard Worker static void test_class_and_coverage_size_estimates ()
149*2d1272b8SAndroid Build Coastguard Worker {
150*2d1272b8SAndroid Build Coastguard Worker gid_and_class_list_t empty = {
151*2d1272b8SAndroid Build Coastguard Worker };
152*2d1272b8SAndroid Build Coastguard Worker assert (check_add_class_def_size (empty, 0));
153*2d1272b8SAndroid Build Coastguard Worker assert (check_add_class_def_size (empty, 1));
154*2d1272b8SAndroid Build Coastguard Worker
155*2d1272b8SAndroid Build Coastguard Worker gid_and_class_list_t class_zero = {
156*2d1272b8SAndroid Build Coastguard Worker {5, 0},
157*2d1272b8SAndroid Build Coastguard Worker };
158*2d1272b8SAndroid Build Coastguard Worker assert (check_add_class_def_size (class_zero, 0));
159*2d1272b8SAndroid Build Coastguard Worker
160*2d1272b8SAndroid Build Coastguard Worker gid_and_class_list_t consecutive = {
161*2d1272b8SAndroid Build Coastguard Worker {4, 0},
162*2d1272b8SAndroid Build Coastguard Worker {5, 0},
163*2d1272b8SAndroid Build Coastguard Worker
164*2d1272b8SAndroid Build Coastguard Worker {6, 1},
165*2d1272b8SAndroid Build Coastguard Worker {7, 1},
166*2d1272b8SAndroid Build Coastguard Worker
167*2d1272b8SAndroid Build Coastguard Worker {8, 2},
168*2d1272b8SAndroid Build Coastguard Worker {9, 2},
169*2d1272b8SAndroid Build Coastguard Worker {10, 2},
170*2d1272b8SAndroid Build Coastguard Worker {11, 2},
171*2d1272b8SAndroid Build Coastguard Worker };
172*2d1272b8SAndroid Build Coastguard Worker assert (check_add_class_def_size (consecutive, 0));
173*2d1272b8SAndroid Build Coastguard Worker assert (check_add_class_def_size (consecutive, 1));
174*2d1272b8SAndroid Build Coastguard Worker assert (check_add_class_def_size (consecutive, 2));
175*2d1272b8SAndroid Build Coastguard Worker
176*2d1272b8SAndroid Build Coastguard Worker gid_and_class_list_t non_consecutive = {
177*2d1272b8SAndroid Build Coastguard Worker {4, 0},
178*2d1272b8SAndroid Build Coastguard Worker {6, 0},
179*2d1272b8SAndroid Build Coastguard Worker
180*2d1272b8SAndroid Build Coastguard Worker {8, 1},
181*2d1272b8SAndroid Build Coastguard Worker {10, 1},
182*2d1272b8SAndroid Build Coastguard Worker
183*2d1272b8SAndroid Build Coastguard Worker {9, 2},
184*2d1272b8SAndroid Build Coastguard Worker {10, 2},
185*2d1272b8SAndroid Build Coastguard Worker {11, 2},
186*2d1272b8SAndroid Build Coastguard Worker {13, 2},
187*2d1272b8SAndroid Build Coastguard Worker };
188*2d1272b8SAndroid Build Coastguard Worker assert (check_add_class_def_size (non_consecutive, 0));
189*2d1272b8SAndroid Build Coastguard Worker assert (check_add_class_def_size (non_consecutive, 1));
190*2d1272b8SAndroid Build Coastguard Worker assert (check_add_class_def_size (non_consecutive, 2));
191*2d1272b8SAndroid Build Coastguard Worker
192*2d1272b8SAndroid Build Coastguard Worker gid_and_class_list_t multiple_ranges = {
193*2d1272b8SAndroid Build Coastguard Worker {4, 0},
194*2d1272b8SAndroid Build Coastguard Worker {5, 0},
195*2d1272b8SAndroid Build Coastguard Worker
196*2d1272b8SAndroid Build Coastguard Worker {6, 1},
197*2d1272b8SAndroid Build Coastguard Worker {7, 1},
198*2d1272b8SAndroid Build Coastguard Worker
199*2d1272b8SAndroid Build Coastguard Worker {9, 1},
200*2d1272b8SAndroid Build Coastguard Worker
201*2d1272b8SAndroid Build Coastguard Worker {11, 1},
202*2d1272b8SAndroid Build Coastguard Worker {12, 1},
203*2d1272b8SAndroid Build Coastguard Worker {13, 1},
204*2d1272b8SAndroid Build Coastguard Worker };
205*2d1272b8SAndroid Build Coastguard Worker assert (check_add_class_def_size (multiple_ranges, 0));
206*2d1272b8SAndroid Build Coastguard Worker assert (check_add_class_def_size (multiple_ranges, 1));
207*2d1272b8SAndroid Build Coastguard Worker }
208*2d1272b8SAndroid Build Coastguard Worker
test_running_class_and_coverage_size_estimates()209*2d1272b8SAndroid Build Coastguard Worker static void test_running_class_and_coverage_size_estimates () {
210*2d1272b8SAndroid Build Coastguard Worker // #### With consecutive gids: switches formats ###
211*2d1272b8SAndroid Build Coastguard Worker gid_and_class_list_t consecutive_map = {
212*2d1272b8SAndroid Build Coastguard Worker // range 1-4 (f1: 8 bytes), (f2: 6 bytes)
213*2d1272b8SAndroid Build Coastguard Worker {1, 1},
214*2d1272b8SAndroid Build Coastguard Worker {2, 1},
215*2d1272b8SAndroid Build Coastguard Worker {3, 1},
216*2d1272b8SAndroid Build Coastguard Worker {4, 1},
217*2d1272b8SAndroid Build Coastguard Worker
218*2d1272b8SAndroid Build Coastguard Worker // (f1: 2 bytes), (f2: 6 bytes)
219*2d1272b8SAndroid Build Coastguard Worker {5, 2},
220*2d1272b8SAndroid Build Coastguard Worker
221*2d1272b8SAndroid Build Coastguard Worker // (f1: 14 bytes), (f2: 6 bytes)
222*2d1272b8SAndroid Build Coastguard Worker {6, 3},
223*2d1272b8SAndroid Build Coastguard Worker {7, 3},
224*2d1272b8SAndroid Build Coastguard Worker {8, 3},
225*2d1272b8SAndroid Build Coastguard Worker {9, 3},
226*2d1272b8SAndroid Build Coastguard Worker {10, 3},
227*2d1272b8SAndroid Build Coastguard Worker {11, 3},
228*2d1272b8SAndroid Build Coastguard Worker {12, 3},
229*2d1272b8SAndroid Build Coastguard Worker };
230*2d1272b8SAndroid Build Coastguard Worker
231*2d1272b8SAndroid Build Coastguard Worker graph::class_def_size_estimator_t estimator1(consecutive_map.iter());
232*2d1272b8SAndroid Build Coastguard Worker assert(check_add_class_def_size(estimator1, consecutive_map, 1, {1}));
233*2d1272b8SAndroid Build Coastguard Worker assert(check_add_class_def_size(estimator1, consecutive_map, 2, {1, 2}));
234*2d1272b8SAndroid Build Coastguard Worker assert(check_add_class_def_size(estimator1, consecutive_map, 2, {1, 2})); // check that adding the same class again works
235*2d1272b8SAndroid Build Coastguard Worker assert(check_add_class_def_size(estimator1, consecutive_map, 3, {1, 2, 3}));
236*2d1272b8SAndroid Build Coastguard Worker
237*2d1272b8SAndroid Build Coastguard Worker estimator1.reset();
238*2d1272b8SAndroid Build Coastguard Worker assert(check_add_class_def_size(estimator1, consecutive_map, 2, {2}));
239*2d1272b8SAndroid Build Coastguard Worker assert(check_add_class_def_size(estimator1, consecutive_map, 3, {2, 3}));
240*2d1272b8SAndroid Build Coastguard Worker
241*2d1272b8SAndroid Build Coastguard Worker // #### With non-consecutive gids: always uses format 2 ###
242*2d1272b8SAndroid Build Coastguard Worker gid_and_class_list_t non_consecutive_map = {
243*2d1272b8SAndroid Build Coastguard Worker // range 1-4 (f1: 8 bytes), (f2: 6 bytes)
244*2d1272b8SAndroid Build Coastguard Worker {1, 1},
245*2d1272b8SAndroid Build Coastguard Worker {2, 1},
246*2d1272b8SAndroid Build Coastguard Worker {3, 1},
247*2d1272b8SAndroid Build Coastguard Worker {4, 1},
248*2d1272b8SAndroid Build Coastguard Worker
249*2d1272b8SAndroid Build Coastguard Worker // (f1: 2 bytes), (f2: 12 bytes)
250*2d1272b8SAndroid Build Coastguard Worker {6, 2},
251*2d1272b8SAndroid Build Coastguard Worker {8, 2},
252*2d1272b8SAndroid Build Coastguard Worker
253*2d1272b8SAndroid Build Coastguard Worker // (f1: 14 bytes), (f2: 6 bytes)
254*2d1272b8SAndroid Build Coastguard Worker {9, 3},
255*2d1272b8SAndroid Build Coastguard Worker {10, 3},
256*2d1272b8SAndroid Build Coastguard Worker {11, 3},
257*2d1272b8SAndroid Build Coastguard Worker {12, 3},
258*2d1272b8SAndroid Build Coastguard Worker {13, 3},
259*2d1272b8SAndroid Build Coastguard Worker {14, 3},
260*2d1272b8SAndroid Build Coastguard Worker {15, 3},
261*2d1272b8SAndroid Build Coastguard Worker };
262*2d1272b8SAndroid Build Coastguard Worker
263*2d1272b8SAndroid Build Coastguard Worker graph::class_def_size_estimator_t estimator2(non_consecutive_map.iter());
264*2d1272b8SAndroid Build Coastguard Worker assert(check_add_class_def_size(estimator2, non_consecutive_map, 1, {1}));
265*2d1272b8SAndroid Build Coastguard Worker assert(check_add_class_def_size(estimator2, non_consecutive_map, 2, {1, 2}));
266*2d1272b8SAndroid Build Coastguard Worker assert(check_add_class_def_size(estimator2, non_consecutive_map, 3, {1, 2, 3}));
267*2d1272b8SAndroid Build Coastguard Worker
268*2d1272b8SAndroid Build Coastguard Worker estimator2.reset();
269*2d1272b8SAndroid Build Coastguard Worker assert(check_add_class_def_size(estimator2, non_consecutive_map, 2, {2}));
270*2d1272b8SAndroid Build Coastguard Worker assert(check_add_class_def_size(estimator2, non_consecutive_map, 3, {2, 3}));
271*2d1272b8SAndroid Build Coastguard Worker }
272*2d1272b8SAndroid Build Coastguard Worker
test_running_class_size_estimates_with_locally_consecutive_glyphs()273*2d1272b8SAndroid Build Coastguard Worker static void test_running_class_size_estimates_with_locally_consecutive_glyphs () {
274*2d1272b8SAndroid Build Coastguard Worker gid_and_class_list_t map = {
275*2d1272b8SAndroid Build Coastguard Worker {1, 1},
276*2d1272b8SAndroid Build Coastguard Worker {6, 2},
277*2d1272b8SAndroid Build Coastguard Worker {7, 3},
278*2d1272b8SAndroid Build Coastguard Worker };
279*2d1272b8SAndroid Build Coastguard Worker
280*2d1272b8SAndroid Build Coastguard Worker graph::class_def_size_estimator_t estimator(map.iter());
281*2d1272b8SAndroid Build Coastguard Worker assert(check_add_class_def_size(estimator, map, 1, {1}));
282*2d1272b8SAndroid Build Coastguard Worker assert(check_add_class_def_size(estimator, map, 2, {1, 2}));
283*2d1272b8SAndroid Build Coastguard Worker assert(check_add_class_def_size(estimator, map, 3, {1, 2, 3}));
284*2d1272b8SAndroid Build Coastguard Worker
285*2d1272b8SAndroid Build Coastguard Worker estimator.reset();
286*2d1272b8SAndroid Build Coastguard Worker assert(check_add_class_def_size(estimator, map, 2, {2}));
287*2d1272b8SAndroid Build Coastguard Worker assert(check_add_class_def_size(estimator, map, 3, {2, 3}));
288*2d1272b8SAndroid Build Coastguard Worker }
289*2d1272b8SAndroid Build Coastguard Worker
290*2d1272b8SAndroid Build Coastguard Worker int
main(int argc,char ** argv)291*2d1272b8SAndroid Build Coastguard Worker main (int argc, char **argv)
292*2d1272b8SAndroid Build Coastguard Worker {
293*2d1272b8SAndroid Build Coastguard Worker test_class_and_coverage_size_estimates ();
294*2d1272b8SAndroid Build Coastguard Worker test_running_class_and_coverage_size_estimates ();
295*2d1272b8SAndroid Build Coastguard Worker test_running_class_size_estimates_with_locally_consecutive_glyphs ();
296*2d1272b8SAndroid Build Coastguard Worker }
297