1 /*
2  **********************************************************************
3  *   Copyright (C) 1998-2014, International Business Machines
4  *   Corporation and others.  All Rights Reserved.
5  **********************************************************************
6  */
7 
8 #ifndef __LEINSERTIONLIST_H
9 #define __LEINSERTIONLIST_H
10 
11 #include "LETypes.h"
12 
13 U_NAMESPACE_BEGIN
14 
15 struct InsertionRecord;
16 
17 #ifndef U_HIDE_INTERNAL_API
18 /**
19  * This class encapsulates the callback used by <code>LEInsertionList</code>
20  * to apply an insertion from the insertion list.
21  *
22  * @internal
23  */
24 class U_LAYOUT_API LEInsertionCallback
25 {
26 public:
27     /**
28      * This method will be called by <code>LEInsertionList::applyInsertions</code> for each
29      * entry on the insertion list.
30      *
31      * @param atPosition the position of the insertion
32      * @param count the number of glyphs to insert
33      * @param newGlyphs the address of the glyphs to insert
34      *
35      * @return <code>TRUE</code> if <code>LEInsertions::applyInsertions</code> should
36      *         stop after applying this insertion.
37      *
38      * @internal
39      */
40     virtual le_bool applyInsertion(le_int32 atPosition, le_int32 count, LEGlyphID newGlyphs[]) = 0;
41 
42     /**
43      * The destructor
44      */
45      virtual ~LEInsertionCallback();
46 };
47 
48 /**
49  * This class is used to keep track of insertions to an array of
50  * <code>LEGlyphIDs</code>. The insertions are kept on a linked
51  * list of <code>InsertionRecords</code> so that the glyph array
52  * doesn't have to be grown for each insertion. The insertions are
53  * stored on the list from leftmost to rightmost to make it easier
54  * to do the insertions.
55  *
56  * The insertions are applied to the array by calling the
57  * <code>applyInsertions</code> method, which calls a client
58  * supplied <code>LEInsertionCallback</code> object to actually
59  * apply the individual insertions.
60  *
61  * @internal
62  */
63 class LEInsertionList : public UObject
64 {
65 public:
66     /**
67      * Construct an empty insertion list.
68      *
69      * @param rightToLeft <code>TRUE</code> if the glyphs are stored
70      *                    in the array in right to left order.
71      *
72      * @internal
73      */
74     LEInsertionList(le_bool rightToLeft);
75 
76     /**
77      * The destructor.
78      */
79     ~LEInsertionList();
80 
81     /**
82      * Add an entry to the insertion list.
83      *
84      * @param position the glyph at this position in the array will be
85      *                 replaced by the new glyphs.
86      * @param count the number of new glyphs
87      * @param success set to an error code if the auxillary data cannot be retrieved.
88      *
89      * @return the address of an array in which to store the new glyphs. This will
90      *         <em>not</em> be in the glyph array.
91      *
92      * @internal
93      */
94     LEGlyphID *insert(le_int32 position, le_int32 count, LEErrorCode &success);
95 
96     /**
97      * Return the number of new glyphs that have been inserted.
98      *
99      * @return the number of new glyphs which have been inserted
100      *
101      * @internal
102      */
103     le_int32 getGrowAmount();
104 
105     /**
106      * Call the <code>LEInsertionCallback</code> once for each
107      * entry on the insertion list.
108      *
109      * @param callback the <code>LEInsertionCallback</code> to call for each insertion.
110      *
111      * @return <code>TRUE</code> if <code>callback</code> returned <code>TRUE</code> to
112      *         terminate the insertion list processing.
113      *
114      * @internal
115      */
116     le_bool applyInsertions(LEInsertionCallback *callback);
117 
118     /**
119      * Empty the insertion list and free all associated
120      * storage.
121      *
122      * @internal
123      */
124     void reset();
125 
126     /**
127      * ICU "poor man's RTTI", returns a UClassID for the actual class.
128      *
129      * @deprecated ICU 54. See {@link icu::LayoutEngine}
130      */
131     virtual UClassID getDynamicClassID() const;
132 
133     /**
134      * ICU "poor man's RTTI", returns a UClassID for this class.
135      *
136      * @deprecated ICU 54. See {@link icu::LayoutEngine}
137      */
138     static UClassID getStaticClassID();
139 
140 private:
141 
142     /**
143      * The head of the insertion list.
144      *
145      * @internal
146      */
147     InsertionRecord *head;
148 
149     /**
150      * The tail of the insertion list.
151      *
152      * @internal
153      */
154     InsertionRecord *tail;
155 
156     /**
157      * The total number of new glyphs on the insertion list.
158      *
159      * @internal
160      */
161     le_int32 growAmount;
162 
163     /**
164      * Set to <code>TRUE</code> if the glyphs are in right
165      * to left order. Since we want the rightmost insertion
166      * to be first on the list, we need to append the
167      * insertions in this case. Otherwise they're prepended.
168      *
169      * @internal
170      */
171     le_bool  append;
172 };
173 #endif  /* U_HIDE_INTERNAL_API */
174 
175 U_NAMESPACE_END
176 #endif
177 
178