xref: /aosp_15_r20/external/icu/icu4c/source/layoutex/RunArrays.cpp (revision 0e209d3975ff4a8c132096b14b0e9364a753506e)
1*0e209d39SAndroid Build Coastguard Worker // © 2016 and later: Unicode, Inc. and others.
2*0e209d39SAndroid Build Coastguard Worker // License & terms of use: http://www.unicode.org/copyright.html
3*0e209d39SAndroid Build Coastguard Worker /*
4*0e209d39SAndroid Build Coastguard Worker  **********************************************************************
5*0e209d39SAndroid Build Coastguard Worker  *   Copyright (C) 2003, International Business Machines
6*0e209d39SAndroid Build Coastguard Worker  *   Corporation and others.  All Rights Reserved.
7*0e209d39SAndroid Build Coastguard Worker  **********************************************************************
8*0e209d39SAndroid Build Coastguard Worker  */
9*0e209d39SAndroid Build Coastguard Worker 
10*0e209d39SAndroid Build Coastguard Worker #include "layout/LETypes.h"
11*0e209d39SAndroid Build Coastguard Worker #include "layout/LEFontInstance.h"
12*0e209d39SAndroid Build Coastguard Worker 
13*0e209d39SAndroid Build Coastguard Worker #include "unicode/locid.h"
14*0e209d39SAndroid Build Coastguard Worker 
15*0e209d39SAndroid Build Coastguard Worker #include "layout/RunArrays.h"
16*0e209d39SAndroid Build Coastguard Worker 
17*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_BEGIN
18*0e209d39SAndroid Build Coastguard Worker 
19*0e209d39SAndroid Build Coastguard Worker const char RunArray::fgClassID = 0;
20*0e209d39SAndroid Build Coastguard Worker 
RunArray(le_int32 initialCapacity)21*0e209d39SAndroid Build Coastguard Worker RunArray::RunArray(le_int32 initialCapacity)
22*0e209d39SAndroid Build Coastguard Worker     : fClientArrays(false), fLimits(nullptr), fCount(0), fCapacity(initialCapacity)
23*0e209d39SAndroid Build Coastguard Worker {
24*0e209d39SAndroid Build Coastguard Worker     if (initialCapacity > 0) {
25*0e209d39SAndroid Build Coastguard Worker         fLimits = LE_NEW_ARRAY(le_int32, fCapacity);
26*0e209d39SAndroid Build Coastguard Worker     }
27*0e209d39SAndroid Build Coastguard Worker }
28*0e209d39SAndroid Build Coastguard Worker 
~RunArray()29*0e209d39SAndroid Build Coastguard Worker RunArray::~RunArray()
30*0e209d39SAndroid Build Coastguard Worker {
31*0e209d39SAndroid Build Coastguard Worker     if (! fClientArrays) {
32*0e209d39SAndroid Build Coastguard Worker         LE_DELETE_ARRAY(fLimits);
33*0e209d39SAndroid Build Coastguard Worker         fLimits = nullptr;
34*0e209d39SAndroid Build Coastguard Worker     }
35*0e209d39SAndroid Build Coastguard Worker }
36*0e209d39SAndroid Build Coastguard Worker 
ensureCapacity()37*0e209d39SAndroid Build Coastguard Worker le_int32 RunArray::ensureCapacity()
38*0e209d39SAndroid Build Coastguard Worker {
39*0e209d39SAndroid Build Coastguard Worker     if (fCount >= fCapacity) {
40*0e209d39SAndroid Build Coastguard Worker         if (fCapacity == 0) {
41*0e209d39SAndroid Build Coastguard Worker             fCapacity = INITIAL_CAPACITY;
42*0e209d39SAndroid Build Coastguard Worker             init(fCapacity);
43*0e209d39SAndroid Build Coastguard Worker         } else {
44*0e209d39SAndroid Build Coastguard Worker             fCapacity += (fCapacity < CAPACITY_GROW_LIMIT ? fCapacity : CAPACITY_GROW_LIMIT);
45*0e209d39SAndroid Build Coastguard Worker             grow(fCapacity);
46*0e209d39SAndroid Build Coastguard Worker         }
47*0e209d39SAndroid Build Coastguard Worker     }
48*0e209d39SAndroid Build Coastguard Worker 
49*0e209d39SAndroid Build Coastguard Worker     return fCount++;
50*0e209d39SAndroid Build Coastguard Worker }
51*0e209d39SAndroid Build Coastguard Worker 
init(le_int32 capacity)52*0e209d39SAndroid Build Coastguard Worker void RunArray::init(le_int32 capacity)
53*0e209d39SAndroid Build Coastguard Worker {
54*0e209d39SAndroid Build Coastguard Worker     fLimits = LE_NEW_ARRAY(le_int32, capacity);
55*0e209d39SAndroid Build Coastguard Worker }
56*0e209d39SAndroid Build Coastguard Worker 
grow(le_int32 newCapacity)57*0e209d39SAndroid Build Coastguard Worker void RunArray::grow(le_int32 newCapacity)
58*0e209d39SAndroid Build Coastguard Worker {
59*0e209d39SAndroid Build Coastguard Worker     fLimits = (le_int32 *) LE_GROW_ARRAY(fLimits, newCapacity);
60*0e209d39SAndroid Build Coastguard Worker }
61*0e209d39SAndroid Build Coastguard Worker 
add(le_int32 limit)62*0e209d39SAndroid Build Coastguard Worker le_int32 RunArray::add(le_int32 limit)
63*0e209d39SAndroid Build Coastguard Worker {
64*0e209d39SAndroid Build Coastguard Worker     if (fClientArrays) {
65*0e209d39SAndroid Build Coastguard Worker         return -1;
66*0e209d39SAndroid Build Coastguard Worker     }
67*0e209d39SAndroid Build Coastguard Worker 
68*0e209d39SAndroid Build Coastguard Worker     le_int32  index  = ensureCapacity();
69*0e209d39SAndroid Build Coastguard Worker     le_int32 *limits = (le_int32 *) fLimits;
70*0e209d39SAndroid Build Coastguard Worker 
71*0e209d39SAndroid Build Coastguard Worker     limits[index] = limit;
72*0e209d39SAndroid Build Coastguard Worker 
73*0e209d39SAndroid Build Coastguard Worker     return index;
74*0e209d39SAndroid Build Coastguard Worker }
75*0e209d39SAndroid Build Coastguard Worker 
76*0e209d39SAndroid Build Coastguard Worker const char FontRuns::fgClassID = 0;
77*0e209d39SAndroid Build Coastguard Worker 
FontRuns(le_int32 initialCapacity)78*0e209d39SAndroid Build Coastguard Worker FontRuns::FontRuns(le_int32 initialCapacity)
79*0e209d39SAndroid Build Coastguard Worker     : RunArray(initialCapacity), fFonts(nullptr)
80*0e209d39SAndroid Build Coastguard Worker {
81*0e209d39SAndroid Build Coastguard Worker     if (initialCapacity > 0) {
82*0e209d39SAndroid Build Coastguard Worker         fFonts = LE_NEW_ARRAY(const LEFontInstance *, initialCapacity);
83*0e209d39SAndroid Build Coastguard Worker     }
84*0e209d39SAndroid Build Coastguard Worker }
85*0e209d39SAndroid Build Coastguard Worker 
~FontRuns()86*0e209d39SAndroid Build Coastguard Worker FontRuns::~FontRuns()
87*0e209d39SAndroid Build Coastguard Worker {
88*0e209d39SAndroid Build Coastguard Worker     if (! fClientArrays) {
89*0e209d39SAndroid Build Coastguard Worker         LE_DELETE_ARRAY(fFonts);
90*0e209d39SAndroid Build Coastguard Worker         fFonts = nullptr;
91*0e209d39SAndroid Build Coastguard Worker     }
92*0e209d39SAndroid Build Coastguard Worker }
93*0e209d39SAndroid Build Coastguard Worker 
init(le_int32 capacity)94*0e209d39SAndroid Build Coastguard Worker void FontRuns::init(le_int32 capacity)
95*0e209d39SAndroid Build Coastguard Worker {
96*0e209d39SAndroid Build Coastguard Worker     RunArray::init(capacity);
97*0e209d39SAndroid Build Coastguard Worker     fFonts = LE_NEW_ARRAY(const LEFontInstance *, capacity);
98*0e209d39SAndroid Build Coastguard Worker }
99*0e209d39SAndroid Build Coastguard Worker 
grow(le_int32 capacity)100*0e209d39SAndroid Build Coastguard Worker void FontRuns::grow(le_int32 capacity)
101*0e209d39SAndroid Build Coastguard Worker {
102*0e209d39SAndroid Build Coastguard Worker     RunArray::grow(capacity);
103*0e209d39SAndroid Build Coastguard Worker     fFonts = (const LEFontInstance **) LE_GROW_ARRAY(fFonts, capacity);
104*0e209d39SAndroid Build Coastguard Worker }
105*0e209d39SAndroid Build Coastguard Worker 
add(const LEFontInstance * font,le_int32 limit)106*0e209d39SAndroid Build Coastguard Worker le_int32 FontRuns::add(const LEFontInstance *font, le_int32 limit)
107*0e209d39SAndroid Build Coastguard Worker {
108*0e209d39SAndroid Build Coastguard Worker     le_int32 index = RunArray::add(limit);
109*0e209d39SAndroid Build Coastguard Worker 
110*0e209d39SAndroid Build Coastguard Worker     if (index >= 0) {
111*0e209d39SAndroid Build Coastguard Worker         LEFontInstance **fonts = (LEFontInstance **) fFonts;
112*0e209d39SAndroid Build Coastguard Worker 
113*0e209d39SAndroid Build Coastguard Worker         fonts[index] = (LEFontInstance *) font;
114*0e209d39SAndroid Build Coastguard Worker     }
115*0e209d39SAndroid Build Coastguard Worker 
116*0e209d39SAndroid Build Coastguard Worker     return index;
117*0e209d39SAndroid Build Coastguard Worker }
118*0e209d39SAndroid Build Coastguard Worker 
getFont(le_int32 run) const119*0e209d39SAndroid Build Coastguard Worker const LEFontInstance *FontRuns::getFont(le_int32 run) const
120*0e209d39SAndroid Build Coastguard Worker {
121*0e209d39SAndroid Build Coastguard Worker     if (run < 0 || run >= getCount()) {
122*0e209d39SAndroid Build Coastguard Worker         return nullptr;
123*0e209d39SAndroid Build Coastguard Worker     }
124*0e209d39SAndroid Build Coastguard Worker 
125*0e209d39SAndroid Build Coastguard Worker     return fFonts[run];
126*0e209d39SAndroid Build Coastguard Worker }
127*0e209d39SAndroid Build Coastguard Worker 
128*0e209d39SAndroid Build Coastguard Worker const char LocaleRuns::fgClassID = 0;
129*0e209d39SAndroid Build Coastguard Worker 
LocaleRuns(le_int32 initialCapacity)130*0e209d39SAndroid Build Coastguard Worker LocaleRuns::LocaleRuns(le_int32 initialCapacity)
131*0e209d39SAndroid Build Coastguard Worker     : RunArray(initialCapacity), fLocales(nullptr)
132*0e209d39SAndroid Build Coastguard Worker {
133*0e209d39SAndroid Build Coastguard Worker     if (initialCapacity > 0) {
134*0e209d39SAndroid Build Coastguard Worker         fLocales = LE_NEW_ARRAY(const Locale *, initialCapacity);
135*0e209d39SAndroid Build Coastguard Worker     }
136*0e209d39SAndroid Build Coastguard Worker }
137*0e209d39SAndroid Build Coastguard Worker 
~LocaleRuns()138*0e209d39SAndroid Build Coastguard Worker LocaleRuns::~LocaleRuns()
139*0e209d39SAndroid Build Coastguard Worker {
140*0e209d39SAndroid Build Coastguard Worker     if (! fClientArrays) {
141*0e209d39SAndroid Build Coastguard Worker         LE_DELETE_ARRAY(fLocales);
142*0e209d39SAndroid Build Coastguard Worker         fLocales = nullptr;
143*0e209d39SAndroid Build Coastguard Worker     }
144*0e209d39SAndroid Build Coastguard Worker }
145*0e209d39SAndroid Build Coastguard Worker 
init(le_int32 capacity)146*0e209d39SAndroid Build Coastguard Worker void LocaleRuns::init(le_int32 capacity)
147*0e209d39SAndroid Build Coastguard Worker {
148*0e209d39SAndroid Build Coastguard Worker     RunArray::init(capacity);
149*0e209d39SAndroid Build Coastguard Worker     fLocales = LE_NEW_ARRAY(const Locale *, capacity);
150*0e209d39SAndroid Build Coastguard Worker }
151*0e209d39SAndroid Build Coastguard Worker 
grow(le_int32 capacity)152*0e209d39SAndroid Build Coastguard Worker void LocaleRuns::grow(le_int32 capacity)
153*0e209d39SAndroid Build Coastguard Worker {
154*0e209d39SAndroid Build Coastguard Worker     RunArray::grow(capacity);
155*0e209d39SAndroid Build Coastguard Worker     fLocales = (const Locale **) LE_GROW_ARRAY(fLocales, capacity);
156*0e209d39SAndroid Build Coastguard Worker }
157*0e209d39SAndroid Build Coastguard Worker 
add(const Locale * locale,le_int32 limit)158*0e209d39SAndroid Build Coastguard Worker le_int32 LocaleRuns::add(const Locale *locale, le_int32 limit)
159*0e209d39SAndroid Build Coastguard Worker {
160*0e209d39SAndroid Build Coastguard Worker     le_int32 index = RunArray::add(limit);
161*0e209d39SAndroid Build Coastguard Worker 
162*0e209d39SAndroid Build Coastguard Worker     if (index >= 0) {
163*0e209d39SAndroid Build Coastguard Worker         Locale **locales = (Locale **) fLocales;
164*0e209d39SAndroid Build Coastguard Worker 
165*0e209d39SAndroid Build Coastguard Worker         locales[index] = (Locale *) locale;
166*0e209d39SAndroid Build Coastguard Worker     }
167*0e209d39SAndroid Build Coastguard Worker 
168*0e209d39SAndroid Build Coastguard Worker     return index;
169*0e209d39SAndroid Build Coastguard Worker }
170*0e209d39SAndroid Build Coastguard Worker 
getLocale(le_int32 run) const171*0e209d39SAndroid Build Coastguard Worker const Locale *LocaleRuns::getLocale(le_int32 run) const
172*0e209d39SAndroid Build Coastguard Worker {
173*0e209d39SAndroid Build Coastguard Worker     if (run < 0 || run >= getCount()) {
174*0e209d39SAndroid Build Coastguard Worker         return nullptr;
175*0e209d39SAndroid Build Coastguard Worker     }
176*0e209d39SAndroid Build Coastguard Worker 
177*0e209d39SAndroid Build Coastguard Worker     return fLocales[run];
178*0e209d39SAndroid Build Coastguard Worker }
179*0e209d39SAndroid Build Coastguard Worker 
180*0e209d39SAndroid Build Coastguard Worker const char ValueRuns::fgClassID = 0;
181*0e209d39SAndroid Build Coastguard Worker 
ValueRuns(le_int32 initialCapacity)182*0e209d39SAndroid Build Coastguard Worker ValueRuns::ValueRuns(le_int32 initialCapacity)
183*0e209d39SAndroid Build Coastguard Worker     : RunArray(initialCapacity), fValues(nullptr)
184*0e209d39SAndroid Build Coastguard Worker {
185*0e209d39SAndroid Build Coastguard Worker     if (initialCapacity > 0) {
186*0e209d39SAndroid Build Coastguard Worker         fValues = LE_NEW_ARRAY(le_int32, initialCapacity);
187*0e209d39SAndroid Build Coastguard Worker     }
188*0e209d39SAndroid Build Coastguard Worker }
189*0e209d39SAndroid Build Coastguard Worker 
~ValueRuns()190*0e209d39SAndroid Build Coastguard Worker ValueRuns::~ValueRuns()
191*0e209d39SAndroid Build Coastguard Worker {
192*0e209d39SAndroid Build Coastguard Worker     if (! fClientArrays) {
193*0e209d39SAndroid Build Coastguard Worker         LE_DELETE_ARRAY(fValues);
194*0e209d39SAndroid Build Coastguard Worker         fValues = nullptr;
195*0e209d39SAndroid Build Coastguard Worker     }
196*0e209d39SAndroid Build Coastguard Worker }
197*0e209d39SAndroid Build Coastguard Worker 
init(le_int32 capacity)198*0e209d39SAndroid Build Coastguard Worker void ValueRuns::init(le_int32 capacity)
199*0e209d39SAndroid Build Coastguard Worker {
200*0e209d39SAndroid Build Coastguard Worker     RunArray::init(capacity);
201*0e209d39SAndroid Build Coastguard Worker     fValues = LE_NEW_ARRAY(le_int32, capacity);
202*0e209d39SAndroid Build Coastguard Worker }
203*0e209d39SAndroid Build Coastguard Worker 
grow(le_int32 capacity)204*0e209d39SAndroid Build Coastguard Worker void ValueRuns::grow(le_int32 capacity)
205*0e209d39SAndroid Build Coastguard Worker {
206*0e209d39SAndroid Build Coastguard Worker     RunArray::grow(capacity);
207*0e209d39SAndroid Build Coastguard Worker     fValues = (const le_int32 *) LE_GROW_ARRAY(fValues, capacity);
208*0e209d39SAndroid Build Coastguard Worker }
209*0e209d39SAndroid Build Coastguard Worker 
add(le_int32 value,le_int32 limit)210*0e209d39SAndroid Build Coastguard Worker le_int32 ValueRuns::add(le_int32 value, le_int32 limit)
211*0e209d39SAndroid Build Coastguard Worker {
212*0e209d39SAndroid Build Coastguard Worker     le_int32 index = RunArray::add(limit);
213*0e209d39SAndroid Build Coastguard Worker 
214*0e209d39SAndroid Build Coastguard Worker     if (index >= 0) {
215*0e209d39SAndroid Build Coastguard Worker         le_int32 *values = (le_int32 *) fValues;
216*0e209d39SAndroid Build Coastguard Worker 
217*0e209d39SAndroid Build Coastguard Worker         values[index] = value;
218*0e209d39SAndroid Build Coastguard Worker     }
219*0e209d39SAndroid Build Coastguard Worker 
220*0e209d39SAndroid Build Coastguard Worker     return index;
221*0e209d39SAndroid Build Coastguard Worker }
222*0e209d39SAndroid Build Coastguard Worker 
getValue(le_int32 run) const223*0e209d39SAndroid Build Coastguard Worker le_int32 ValueRuns::getValue(le_int32 run) const
224*0e209d39SAndroid Build Coastguard Worker {
225*0e209d39SAndroid Build Coastguard Worker     if (run < 0 || run >= getCount()) {
226*0e209d39SAndroid Build Coastguard Worker         return -1;
227*0e209d39SAndroid Build Coastguard Worker     }
228*0e209d39SAndroid Build Coastguard Worker 
229*0e209d39SAndroid Build Coastguard Worker     return fValues[run];
230*0e209d39SAndroid Build Coastguard Worker }
231*0e209d39SAndroid Build Coastguard Worker 
232*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END
233