]> git.saurik.com Git - apple/icu.git/blame - icuSources/layoutex/layout/RunArrays.h
ICU-57166.0.1.tar.gz
[apple/icu.git] / icuSources / layoutex / layout / RunArrays.h
CommitLineData
b75a7d8f
A
1/*
2 **********************************************************************
46f4442e 3 * Copyright (C) 2003-2008, International Business Machines
b75a7d8f
A
4 * Corporation and others. All Rights Reserved.
5 **********************************************************************
6 */
7
8#ifndef __RUNARRAYS_H
9
10#define __RUNARRAYS_H
11
12#include "layout/LETypes.h"
13#include "layout/LEFontInstance.h"
14
15#include "unicode/utypes.h"
16#include "unicode/locid.h"
17
73c04bcf
A
18/**
19 * \file
20 * \brief C++ API: base class for building classes which represent data that is associated with runs of text.
21 */
22
b75a7d8f
A
23U_NAMESPACE_BEGIN
24
25/**
26 * The initial size of an array if it is unspecified.
27 *
73c04bcf 28 * @stable ICU 3.2
b75a7d8f
A
29 */
30#define INITIAL_CAPACITY 16
31
32/**
33 * When an array needs to grow, it will double in size until
34 * it becomes this large, then it will grow by this amount.
35 *
73c04bcf 36 * @stable ICU 3.2
b75a7d8f
A
37 */
38#define CAPACITY_GROW_LIMIT 128
39
40/**
41 * The <code>RunArray</code> class is a base class for building classes
42 * which represent data that is associated with runs of text. This class
43 * maintains an array of limit indices into the text, subclasses
44 * provide one or more arrays of data.
45 *
73c04bcf 46 * @stable ICU 3.2
b75a7d8f
A
47 */
48class U_LAYOUTEX_API RunArray : public UObject
49{
50public:
51 /**
52 * Construct a <code>RunArray</code> object from a pre-existing
53 * array of limit indices.
54 *
374ca955
A
55 * @param limits is an array of limit indices. This array must remain
56 * valid until the <code>RunArray</code> object is destroyed.
b75a7d8f
A
57 *
58 * @param count is the number of entries in the limit array.
59 *
73c04bcf 60 * @stable ICU 3.2
b75a7d8f 61 */
73c04bcf 62 inline RunArray(const le_int32 *limits, le_int32 count);
b75a7d8f
A
63
64 /**
65 * Construct an empty <code>RunArray</code> object. Clients can add limit
66 * indices array using the <code>add</code> method.
67 *
68 * @param initialCapacity is the initial size of the limit indices array. If
69 * this value is zero, no array will be allocated.
70 *
71 * @see add
72 *
73c04bcf 73 * @stable ICU 3.2
b75a7d8f 74 */
374ca955 75 RunArray(le_int32 initialCapacity);
b75a7d8f
A
76
77 /**
78 * The destructor; virtual so that subclass destructors are invoked as well.
79 *
73c04bcf 80 * @stable ICU 3.2
b75a7d8f
A
81 */
82 virtual ~RunArray();
83
84 /**
85 * Get the number of entries in the limit indices array.
86 *
87 * @return the number of entries in the limit indices array.
88 *
73c04bcf 89 * @stable ICU 3.2
b75a7d8f 90 */
73c04bcf
A
91 inline le_int32 getCount() const;
92
93 /**
94 * Reset the limit indices array. This method sets the number of entries in the
95 * limit indices array to zero. It does not delete the array.
96 *
97 * Note: Subclass arrays will also be reset and not deleted.
98 *
46f4442e 99 * @stable ICU 3.6
73c04bcf
A
100 */
101 inline void reset();
b75a7d8f
A
102
103 /**
104 * Get the last limit index. This is the number of characters in
105 * the text.
106 *
107 * @return the last limit index.
108 *
73c04bcf 109 * @stable ICU 3.2
b75a7d8f 110 */
73c04bcf 111 inline le_int32 getLimit() const;
b75a7d8f
A
112
113 /**
114 * Get the limit index for a particular run of text.
115 *
116 * @param run is the run. This is an index into the limit index array.
117 *
118 * @return the limit index for the run, or -1 if <code>run</code> is out of bounds.
119 *
73c04bcf 120 * @stable ICU 3.2
b75a7d8f 121 */
73c04bcf 122 inline le_int32 getLimit(le_int32 run) const;
b75a7d8f
A
123
124 /**
125 * Add a limit index to the limit indices array and return the run index
126 * where it was stored. If the array does not exist, it will be created by
127 * calling the <code>init</code> method. If it is full, it will be grown by
128 * calling the <code>grow</code> method.
129 *
130 * If the <code>RunArray</code> object was created with a client-supplied
131 * limit indices array, this method will return a run index of -1.
132 *
133 * Subclasses should not override this method. Rather they should provide
134 * a new <code>add</code> method which takes a limit index along with whatever
135 * other data they implement. The new <code>add</code> method should
136 * first call this method to grow the data arrays, and use the return value
137 * to store the data in their own arrays.
138 *
139 * @param limit is the limit index to add to the array.
140 *
141 * @return the run index where the limit index was stored, or -1 if the limit index cannt be stored.
142 *
143 * @see init
144 * @see grow
145 *
73c04bcf 146 * @stable ICU 3.2
b75a7d8f
A
147 */
148 le_int32 add(le_int32 limit);
149
150 /**
73c04bcf 151 * ICU "poor man's RTTI", returns a UClassID for this class.
b75a7d8f 152 *
73c04bcf 153 * @stable ICU 3.2
b75a7d8f 154 */
73c04bcf 155 static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; }
b75a7d8f
A
156
157 /**
73c04bcf 158 * ICU "poor man's RTTI", returns a UClassID for the actual class.
b75a7d8f 159 *
73c04bcf 160 * @stable ICU 3.2
b75a7d8f 161 */
73c04bcf 162 virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); }
b75a7d8f
A
163
164protected:
165 /**
166 * Create a data array with the given initial size. This method will be
167 * called by the <code>add</code> method if there is no limit indices
168 * array. Subclasses which override this method must also call it from
169 * the overriding method to create the limit indices array.
170 *
171 * @param capacity is the initial size of the data array.
172 *
173 * @see add
174 *
73c04bcf 175 * @stable ICU 3.2
b75a7d8f
A
176 */
177 virtual void init(le_int32 capacity);
178
179 /**
180 * Grow a data array to the given initial size. This method will be
181 * called by the <code>add</code> method if the limit indices
182 * array is full. Subclasses which override this method must also call it from
183 * the overriding method to grow the limit indices array.
184 *
185 * @param capacity is the initial size of the data array.
186 *
187 * @see add
188 *
73c04bcf 189 * @stable ICU 3.2
b75a7d8f
A
190 */
191 virtual void grow(le_int32 capacity);
192
193 /**
194 * Set by the constructors to indicate whether
195 * or not the client supplied the data arrays.
196 * If they were supplied by the client, the
197 * <code>add</code> method won't change the arrays
198 * and the destructor won't delete them.
199 *
73c04bcf 200 * @stable ICU 3.2
b75a7d8f
A
201 */
202 le_bool fClientArrays;
203
204private:
205 /**
206 * The address of this static class variable serves as this class's ID
207 * for ICU "poor man's RTTI".
208 */
209 static const char fgClassID;
210
211 le_int32 ensureCapacity();
212
73c04bcf
A
213 inline RunArray();
214 inline RunArray(const RunArray & /*other*/);
215 inline RunArray &operator=(const RunArray & /*other*/) { return *this; };
b75a7d8f
A
216
217 const le_int32 *fLimits;
218 le_int32 fCount;
219 le_int32 fCapacity;
220};
221
222inline RunArray::RunArray()
374ca955 223 : UObject(), fClientArrays(FALSE), fLimits(NULL), fCount(0), fCapacity(0)
b75a7d8f 224{
374ca955 225 // nothing else to do...
b75a7d8f
A
226}
227
228inline RunArray::RunArray(const RunArray & /*other*/)
374ca955 229 : UObject(), fClientArrays(FALSE), fLimits(NULL), fCount(0), fCapacity(0)
b75a7d8f 230{
374ca955 231 // nothing else to do...
b75a7d8f
A
232}
233
234inline RunArray::RunArray(const le_int32 *limits, le_int32 count)
374ca955 235 : UObject(), fClientArrays(TRUE), fLimits(limits), fCount(count), fCapacity(count)
b75a7d8f
A
236{
237 // nothing else to do...
238}
239
b75a7d8f
A
240inline le_int32 RunArray::getCount() const
241{
242 return fCount;
243}
244
73c04bcf
A
245inline void RunArray::reset()
246{
247 fCount = 0;
248}
249
b75a7d8f
A
250inline le_int32 RunArray::getLimit(le_int32 run) const
251{
252 if (run < 0 || run >= fCount) {
253 return -1;
254 }
255
256 return fLimits[run];
257}
258
259inline le_int32 RunArray::getLimit() const
260{
261 return getLimit(fCount - 1);
262}
263
264/**
265 * The <code>FontRuns</code> class associates pointers to <code>LEFontInstance</code>
266 * objects with runs of text.
267 *
73c04bcf 268 * @stable ICU 3.2
b75a7d8f
A
269 */
270class U_LAYOUTEX_API FontRuns : public RunArray
271{
272public:
273 /**
274 * Construct a <code>FontRuns</code> object from pre-existing arrays of fonts
275 * and limit indices.
276 *
374ca955
A
277 * @param fonts is the address of an array of pointers to <code>LEFontInstance</code> objects. This
278 * array, and the <code>LEFontInstance</code> objects to which it points must remain
279 * valid until the <code>FontRuns</code> object is destroyed.
b75a7d8f 280 *
374ca955
A
281 * @param limits is the address of an array of limit indices. This array must remain valid until
282 * the <code>FontRuns</code> object is destroyed.
b75a7d8f
A
283 *
284 * @param count is the number of entries in the two arrays.
285 *
73c04bcf 286 * @stable ICU 3.2
b75a7d8f 287 */
73c04bcf 288 inline FontRuns(const LEFontInstance **fonts, const le_int32 *limits, le_int32 count);
b75a7d8f
A
289
290 /**
291 * Construct an empty <code>FontRuns</code> object. Clients can add font and limit
292 * indices arrays using the <code>add</code> method.
293 *
294 * @param initialCapacity is the initial size of the font and limit indices arrays. If
295 * this value is zero, no arrays will be allocated.
296 *
297 * @see add
298 *
73c04bcf 299 * @stable ICU 3.2
b75a7d8f
A
300 */
301 FontRuns(le_int32 initialCapacity);
302
303 /**
304 * The destructor; virtual so that subclass destructors are invoked as well.
305 *
73c04bcf 306 * @stable ICU 3.2
b75a7d8f
A
307 */
308 virtual ~FontRuns();
309
310 /**
311 * Get the <code>LEFontInstance</code> object assoicated with the given run
312 * of text. Use <code>RunArray::getLimit(run)</code> to get the corresponding
313 * limit index.
314 *
315 * @param run is the index into the font and limit indices arrays.
316 *
317 * @return the <code>LEFontInstance</code> associated with the given text run.
318 *
319 * @see RunArray::getLimit
320 *
73c04bcf 321 * @stable ICU 3.2
b75a7d8f
A
322 */
323 const LEFontInstance *getFont(le_int32 run) const;
324
325
326 /**
327 * Add an <code>LEFontInstance</code> and limit index pair to the data arrays and return
328 * the run index where the data was stored. This method calls
329 * <code>RunArray::add(limit)</code> which will create or grow the arrays as needed.
330 *
331 * If the <code>FontRuns</code> object was created with a client-supplied
332 * font and limit indices arrays, this method will return a run index of -1.
333 *
334 * Subclasses should not override this method. Rather they should provide a new <code>add</code>
335 * method which takes a font and a limit index along with whatever other data they implement.
336 * The new <code>add</code> method should first call this method to grow the font and limit indices
337 * arrays, and use the returned run index to store data their own arrays.
338 *
374ca955
A
339 * @param font is the address of the <code>LEFontInstance</code> to add. This object must
340 * remain valid until the <code>FontRuns</code> object is destroyed.
b75a7d8f
A
341 *
342 * @param limit is the limit index to add
343 *
344 * @return the run index where the font and limit index were stored, or -1 if the data cannot be stored.
345 *
73c04bcf 346 * @stable ICU 3.2
b75a7d8f
A
347 */
348 le_int32 add(const LEFontInstance *font, le_int32 limit);
349
350 /**
73c04bcf 351 * ICU "poor man's RTTI", returns a UClassID for this class.
b75a7d8f 352 *
73c04bcf 353 * @stable ICU 3.2
b75a7d8f 354 */
73c04bcf 355 static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; }
b75a7d8f
A
356
357 /**
73c04bcf 358 * ICU "poor man's RTTI", returns a UClassID for the actual class.
b75a7d8f 359 *
73c04bcf 360 * @stable ICU 3.2
b75a7d8f 361 */
73c04bcf 362 virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); }
b75a7d8f
A
363
364protected:
365 virtual void init(le_int32 capacity);
366 virtual void grow(le_int32 capacity);
367
368private:
369
73c04bcf
A
370 inline FontRuns();
371 inline FontRuns(const FontRuns &other);
372 inline FontRuns &operator=(const FontRuns & /*other*/) { return *this; };
b75a7d8f
A
373
374 /**
375 * The address of this static class variable serves as this class's ID
376 * for ICU "poor man's RTTI".
377 */
378 static const char fgClassID;
379
380 const LEFontInstance **fFonts;
381};
382
383inline FontRuns::FontRuns()
374ca955 384 : RunArray(0), fFonts(NULL)
b75a7d8f 385{
374ca955 386 // nothing else to do...
b75a7d8f
A
387}
388
389inline FontRuns::FontRuns(const FontRuns & /*other*/)
374ca955 390 : RunArray(0), fFonts(NULL)
b75a7d8f 391{
374ca955 392 // nothing else to do...
b75a7d8f
A
393}
394
395inline FontRuns::FontRuns(const LEFontInstance **fonts, const le_int32 *limits, le_int32 count)
396 : RunArray(limits, count), fFonts(fonts)
397{
398 // nothing else to do...
399}
400
b75a7d8f
A
401/**
402 * The <code>LocaleRuns</code> class associates pointers to <code>Locale</code>
403 * objects with runs of text.
404 *
73c04bcf 405 * @stable ICU 3.2
b75a7d8f
A
406 */
407class U_LAYOUTEX_API LocaleRuns : public RunArray
408{
409public:
410 /**
411 * Construct a <code>LocaleRuns</code> object from pre-existing arrays of locales
412 * and limit indices.
413 *
374ca955
A
414 * @param locales is the address of an array of pointers to <code>Locale</code> objects. This array,
415 * and the <code>Locale</code> objects to which it points, must remain valid until
416 * the <code>LocaleRuns</code> object is destroyed.
b75a7d8f 417 *
374ca955
A
418 * @param limits is the address of an array of limit indices. This array must remain valid until the
419 * <code>LocaleRuns</code> object is destroyed.
b75a7d8f
A
420 *
421 * @param count is the number of entries in the two arrays.
422 *
73c04bcf 423 * @stable ICU 3.2
b75a7d8f 424 */
73c04bcf 425 inline LocaleRuns(const Locale **locales, const le_int32 *limits, le_int32 count);
b75a7d8f
A
426
427 /**
428 * Construct an empty <code>LocaleRuns</code> object. Clients can add locale and limit
429 * indices arrays using the <code>add</code> method.
430 *
431 * @param initialCapacity is the initial size of the locale and limit indices arrays. If
432 * this value is zero, no arrays will be allocated.
433 *
434 * @see add
435 *
73c04bcf 436 * @stable ICU 3.2
b75a7d8f
A
437 */
438 LocaleRuns(le_int32 initialCapacity);
439
440 /**
441 * The destructor; virtual so that subclass destructors are invoked as well.
442 *
73c04bcf 443 * @stable ICU 3.2
b75a7d8f
A
444 */
445 virtual ~LocaleRuns();
446
447 /**
448 * Get the <code>Locale</code> object assoicated with the given run
449 * of text. Use <code>RunArray::getLimit(run)</code> to get the corresponding
450 * limit index.
451 *
452 * @param run is the index into the font and limit indices arrays.
453 *
454 * @return the <code>Locale</code> associated with the given text run.
455 *
456 * @see RunArray::getLimit
457 *
73c04bcf 458 * @stable ICU 3.2
b75a7d8f
A
459 */
460 const Locale *getLocale(le_int32 run) const;
461
462
463 /**
464 * Add a <code>Locale</code> and limit index pair to the data arrays and return
465 * the run index where the data was stored. This method calls
466 * <code>RunArray::add(limit)</code> which will create or grow the arrays as needed.
467 *
468 * If the <code>LocaleRuns</code> object was created with a client-supplied
469 * locale and limit indices arrays, this method will return a run index of -1.
470 *
471 * Subclasses should not override this method. Rather they should provide a new <code>add</code>
472 * method which takes a locale and a limit index along with whatever other data they implement.
473 * The new <code>add</code> method should first call this method to grow the font and limit indices
474 * arrays, and use the returned run index to store data their own arrays.
475 *
374ca955
A
476 * @param locale is the address of the <code>Locale</code> to add. This object must remain valid
477 * until the <code>LocaleRuns</code> object is destroyed.
b75a7d8f
A
478 *
479 * @param limit is the limit index to add
480 *
481 * @return the run index where the locale and limit index were stored, or -1 if the data cannot be stored.
482 *
73c04bcf 483 * @stable ICU 3.2
b75a7d8f
A
484 */
485 le_int32 add(const Locale *locale, le_int32 limit);
486
487 /**
73c04bcf 488 * ICU "poor man's RTTI", returns a UClassID for this class.
b75a7d8f 489 *
73c04bcf 490 * @stable ICU 3.2
b75a7d8f 491 */
73c04bcf 492 static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; }
b75a7d8f
A
493
494 /**
73c04bcf 495 * ICU "poor man's RTTI", returns a UClassID for the actual class.
b75a7d8f 496 *
73c04bcf 497 * @stable ICU 3.2
b75a7d8f 498 */
73c04bcf 499 virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); }
b75a7d8f
A
500
501protected:
502 virtual void init(le_int32 capacity);
503 virtual void grow(le_int32 capacity);
504
46f4442e
A
505 /**
506 * @internal
507 */
508 const Locale **fLocales;
509
b75a7d8f
A
510private:
511
73c04bcf
A
512 inline LocaleRuns();
513 inline LocaleRuns(const LocaleRuns &other);
514 inline LocaleRuns &operator=(const LocaleRuns & /*other*/) { return *this; };
b75a7d8f
A
515
516 /**
517 * The address of this static class variable serves as this class's ID
518 * for ICU "poor man's RTTI".
519 */
520 static const char fgClassID;
b75a7d8f
A
521};
522
523inline LocaleRuns::LocaleRuns()
374ca955 524 : RunArray(0), fLocales(NULL)
b75a7d8f 525{
374ca955 526 // nothing else to do...
b75a7d8f
A
527}
528
529inline LocaleRuns::LocaleRuns(const LocaleRuns & /*other*/)
374ca955 530 : RunArray(0), fLocales(NULL)
b75a7d8f 531{
374ca955 532 // nothing else to do...
b75a7d8f
A
533}
534
535inline LocaleRuns::LocaleRuns(const Locale **locales, const le_int32 *limits, le_int32 count)
536 : RunArray(limits, count), fLocales(locales)
537{
538 // nothing else to do...
539}
540
b75a7d8f
A
541/**
542 * The <code>ValueRuns</code> class associates integer values with runs of text.
543 *
73c04bcf 544 * @stable ICU 3.2
b75a7d8f
A
545 */
546class U_LAYOUTEX_API ValueRuns : public RunArray
547{
548public:
549 /**
550 * Construct a <code>ValueRuns</code> object from pre-existing arrays of values
551 * and limit indices.
552 *
374ca955
A
553 * @param values is the address of an array of integer. This array must remain valid until
554 * the <code>ValueRuns</code> object is destroyed.
b75a7d8f 555 *
374ca955
A
556 * @param limits is the address of an array of limit indices. This array must remain valid until
557 * the <code>ValueRuns</code> object is destroyed.
b75a7d8f
A
558 *
559 * @param count is the number of entries in the two arrays.
560 *
73c04bcf 561 * @stable ICU 3.2
b75a7d8f 562 */
73c04bcf 563 inline ValueRuns(const le_int32 *values, const le_int32 *limits, le_int32 count);
b75a7d8f
A
564
565 /**
566 * Construct an empty <code>ValueRuns</code> object. Clients can add value and limit
567 * indices arrays using the <code>add</code> method.
568 *
569 * @param initialCapacity is the initial size of the value and limit indices arrays. If
570 * this value is zero, no arrays will be allocated.
571 *
572 * @see add
573 *
73c04bcf 574 * @stable ICU 3.2
b75a7d8f
A
575 */
576 ValueRuns(le_int32 initialCapacity);
577
578 /**
579 * The destructor; virtual so that subclass destructors are invoked as well.
580 *
73c04bcf 581 * @stable ICU 3.2
b75a7d8f
A
582 */
583 virtual ~ValueRuns();
584
585 /**
586 * Get the integer value assoicated with the given run
587 * of text. Use <code>RunArray::getLimit(run)</code> to get the corresponding
588 * limit index.
589 *
590 * @param run is the index into the font and limit indices arrays.
591 *
592 * @return the integer value associated with the given text run.
593 *
594 * @see RunArray::getLimit
595 *
73c04bcf 596 * @stable ICU 3.2
b75a7d8f
A
597 */
598 le_int32 getValue(le_int32 run) const;
599
600
601 /**
602 * Add an integer value and limit index pair to the data arrays and return
603 * the run index where the data was stored. This method calls
604 * <code>RunArray::add(limit)</code> which will create or grow the arrays as needed.
605 *
606 * If the <code>ValueRuns</code> object was created with a client-supplied
607 * font and limit indices arrays, this method will return a run index of -1.
608 *
609 * Subclasses should not override this method. Rather they should provide a new <code>add</code>
610 * method which takes an integer value and a limit index along with whatever other data they implement.
611 * The new <code>add</code> method should first call this method to grow the font and limit indices
612 * arrays, and use the returned run index to store data their own arrays.
613 *
614 * @param value is the integer value to add
615 *
616 * @param limit is the limit index to add
617 *
618 * @return the run index where the value and limit index were stored, or -1 if the data cannot be stored.
619 *
73c04bcf 620 * @stable ICU 3.2
b75a7d8f
A
621 */
622 le_int32 add(le_int32 value, le_int32 limit);
623
624 /**
73c04bcf 625 * ICU "poor man's RTTI", returns a UClassID for this class.
b75a7d8f 626 *
73c04bcf 627 * @stable ICU 3.2
b75a7d8f 628 */
73c04bcf 629 static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; }
b75a7d8f
A
630
631 /**
73c04bcf 632 * ICU "poor man's RTTI", returns a UClassID for the actual class.
b75a7d8f 633 *
73c04bcf 634 * @stable ICU 3.2
b75a7d8f 635 */
73c04bcf 636 virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); }
b75a7d8f
A
637
638protected:
639 virtual void init(le_int32 capacity);
640 virtual void grow(le_int32 capacity);
641
642private:
643
73c04bcf
A
644 inline ValueRuns();
645 inline ValueRuns(const ValueRuns &other);
646 inline ValueRuns &operator=(const ValueRuns & /*other*/) { return *this; };
b75a7d8f
A
647
648 /**
649 * The address of this static class variable serves as this class's ID
650 * for ICU "poor man's RTTI".
651 */
652 static const char fgClassID;
653
654 const le_int32 *fValues;
655};
656
657inline ValueRuns::ValueRuns()
374ca955 658 : RunArray(0), fValues(NULL)
b75a7d8f 659{
374ca955 660 // nothing else to do...
b75a7d8f
A
661}
662
663inline ValueRuns::ValueRuns(const ValueRuns & /*other*/)
374ca955 664 : RunArray(0), fValues(NULL)
b75a7d8f 665{
374ca955 666 // nothing else to do...
b75a7d8f
A
667}
668
669inline ValueRuns::ValueRuns(const le_int32 *values, const le_int32 *limits, le_int32 count)
670 : RunArray(limits, count), fValues(values)
671{
672 // nothing else to do...
673}
674
b75a7d8f
A
675U_NAMESPACE_END
676#endif