• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  ************************************************************************************
3  * Copyright (C) 2006-2012, International Business Machines Corporation and others. *
4  * All Rights Reserved.                                                             *
5  ************************************************************************************
6  */
7 
8 #ifndef BRKENG_H
9 #define BRKENG_H
10 
11 #include "unicode/utypes.h"
12 #include "unicode/uobject.h"
13 #include "unicode/utext.h"
14 #include "unicode/uscript.h"
15 
16 U_NAMESPACE_BEGIN
17 
18 class UnicodeSet;
19 class UStack;
20 class DictionaryMatcher;
21 
22 /*******************************************************************
23  * LanguageBreakEngine
24  */
25 
26 /**
27  * <p>LanguageBreakEngines implement language-specific knowledge for
28  * finding text boundaries within a run of characters belonging to a
29  * specific set. The boundaries will be of a specific kind, e.g. word,
30  * line, etc.</p>
31  *
32  * <p>LanguageBreakEngines should normally be implemented so as to
33  * be shared between threads without locking.</p>
34  */
35 class LanguageBreakEngine : public UMemory {
36  public:
37 
38   /**
39    * <p>Default constructor.</p>
40    *
41    */
42   LanguageBreakEngine();
43 
44   /**
45    * <p>Virtual destructor.</p>
46    */
47   virtual ~LanguageBreakEngine();
48 
49  /**
50   * <p>Indicate whether this engine handles a particular character for
51   * a particular kind of break.</p>
52   *
53   * @param c A character which begins a run that the engine might handle
54   * @param breakType The type of text break which the caller wants to determine
55   * @return TRUE if this engine handles the particular character and break
56   * type.
57   */
58   virtual UBool handles(UChar32 c, int32_t breakType) const = 0;
59 
60  /**
61   * <p>Find any breaks within a run in the supplied text.</p>
62   *
63   * @param text A UText representing the text. The
64   * iterator is left at the end of the run of characters which the engine
65   * is capable of handling.
66   * @param startPos The start of the run within the supplied text.
67   * @param endPos The end of the run within the supplied text.
68   * @param reverse Whether the caller is looking for breaks in a reverse
69   * direction.
70   * @param breakType The type of break desired, or -1.
71   * @param foundBreaks An allocated C array of the breaks found, if any
72   * @return The number of breaks found.
73   */
74   virtual int32_t findBreaks( UText *text,
75                               int32_t startPos,
76                               int32_t endPos,
77                               UBool reverse,
78                               int32_t breakType,
79                               UStack &foundBreaks ) const = 0;
80 
81 };
82 
83 /*******************************************************************
84  * LanguageBreakFactory
85  */
86 
87 /**
88  * <p>LanguageBreakFactorys find and return a LanguageBreakEngine
89  * that can determine breaks for characters in a specific set, if
90  * such an object can be found.</p>
91  *
92  * <p>If a LanguageBreakFactory is to be shared between threads,
93  * appropriate synchronization must be used; there is none internal
94  * to the factory.</p>
95  *
96  * <p>A LanguageBreakEngine returned by a LanguageBreakFactory can
97  * normally be shared between threads without synchronization, unless
98  * the specific subclass of LanguageBreakFactory indicates otherwise.</p>
99  *
100  * <p>A LanguageBreakFactory is responsible for deleting any LanguageBreakEngine
101  * it returns when it itself is deleted, unless the specific subclass of
102  * LanguageBreakFactory indicates otherwise. Naturally, the factory should
103  * not be deleted until the LanguageBreakEngines it has returned are no
104  * longer needed.</p>
105  */
106 class LanguageBreakFactory : public UMemory {
107  public:
108 
109   /**
110    * <p>Default constructor.</p>
111    *
112    */
113   LanguageBreakFactory();
114 
115   /**
116    * <p>Virtual destructor.</p>
117    */
118   virtual ~LanguageBreakFactory();
119 
120  /**
121   * <p>Find and return a LanguageBreakEngine that can find the desired
122   * kind of break for the set of characters to which the supplied
123   * character belongs. It is up to the set of available engines to
124   * determine what the sets of characters are.</p>
125   *
126   * @param c A character that begins a run for which a LanguageBreakEngine is
127   * sought.
128   * @param breakType The kind of text break for which a LanguageBreakEngine is
129   * sought.
130   * @return A LanguageBreakEngine with the desired characteristics, or 0.
131   */
132   virtual const LanguageBreakEngine *getEngineFor(UChar32 c, int32_t breakType) = 0;
133 
134 };
135 
136 /*******************************************************************
137  * UnhandledEngine
138  */
139 
140 /**
141  * <p>UnhandledEngine is a special subclass of LanguageBreakEngine that
142  * handles characters that no other LanguageBreakEngine is available to
143  * handle. It is told the character and the type of break; at its
144  * discretion it may handle more than the specified character (e.g.,
145  * the entire script to which that character belongs.</p>
146  *
147  * <p>UnhandledEngines may not be shared between threads without
148  * external synchronization.</p>
149  */
150 
151 class UnhandledEngine : public LanguageBreakEngine {
152  private:
153 
154     /**
155      * The sets of characters handled, for each break type
156      * @internal
157      */
158 
159   UnicodeSet    *fHandled[4];
160 
161  public:
162 
163   /**
164    * <p>Default constructor.</p>
165    *
166    */
167   UnhandledEngine(UErrorCode &status);
168 
169   /**
170    * <p>Virtual destructor.</p>
171    */
172   virtual ~UnhandledEngine();
173 
174  /**
175   * <p>Indicate whether this engine handles a particular character for
176   * a particular kind of break.</p>
177   *
178   * @param c A character which begins a run that the engine might handle
179   * @param breakType The type of text break which the caller wants to determine
180   * @return TRUE if this engine handles the particular character and break
181   * type.
182   */
183   virtual UBool handles(UChar32 c, int32_t breakType) const;
184 
185  /**
186   * <p>Find any breaks within a run in the supplied text.</p>
187   *
188   * @param text A UText representing the text (TODO: UText). The
189   * iterator is left at the end of the run of characters which the engine
190   * is capable of handling.
191   * @param startPos The start of the run within the supplied text.
192   * @param endPos The end of the run within the supplied text.
193   * @param reverse Whether the caller is looking for breaks in a reverse
194   * direction.
195   * @param breakType The type of break desired, or -1.
196   * @param foundBreaks An allocated C array of the breaks found, if any
197   * @return The number of breaks found.
198   */
199   virtual int32_t findBreaks( UText *text,
200                               int32_t startPos,
201                               int32_t endPos,
202                               UBool reverse,
203                               int32_t breakType,
204                               UStack &foundBreaks ) const;
205 
206  /**
207   * <p>Tell the engine to handle a particular character and break type.</p>
208   *
209   * @param c A character which the engine should handle
210   * @param breakType The type of text break for which the engine should handle c
211   */
212   virtual void handleCharacter(UChar32 c, int32_t breakType);
213 
214 };
215 
216 /*******************************************************************
217  * ICULanguageBreakFactory
218  */
219 
220 /**
221  * <p>ICULanguageBreakFactory is the default LanguageBreakFactory for
222  * ICU. It creates dictionary-based LanguageBreakEngines from dictionary
223  * data in the ICU data file.</p>
224  */
225 class ICULanguageBreakFactory : public LanguageBreakFactory {
226  private:
227 
228     /**
229      * The stack of break engines created by this factory
230      * @internal
231      */
232 
233   UStack    *fEngines;
234 
235  public:
236 
237   /**
238    * <p>Standard constructor.</p>
239    *
240    */
241   ICULanguageBreakFactory(UErrorCode &status);
242 
243   /**
244    * <p>Virtual destructor.</p>
245    */
246   virtual ~ICULanguageBreakFactory();
247 
248  /**
249   * <p>Find and return a LanguageBreakEngine that can find the desired
250   * kind of break for the set of characters to which the supplied
251   * character belongs. It is up to the set of available engines to
252   * determine what the sets of characters are.</p>
253   *
254   * @param c A character that begins a run for which a LanguageBreakEngine is
255   * sought.
256   * @param breakType The kind of text break for which a LanguageBreakEngine is
257   * sought.
258   * @return A LanguageBreakEngine with the desired characteristics, or 0.
259   */
260   virtual const LanguageBreakEngine *getEngineFor(UChar32 c, int32_t breakType);
261 
262 protected:
263  /**
264   * <p>Create a LanguageBreakEngine for the set of characters to which
265   * the supplied character belongs, for the specified break type.</p>
266   *
267   * @param c A character that begins a run for which a LanguageBreakEngine is
268   * sought.
269   * @param breakType The kind of text break for which a LanguageBreakEngine is
270   * sought.
271   * @return A LanguageBreakEngine with the desired characteristics, or 0.
272   */
273   virtual const LanguageBreakEngine *loadEngineFor(UChar32 c, int32_t breakType);
274 
275   /**
276    * <p>Create a DictionaryMatcher for the specified script and break type.</p>
277    * @param script An ISO 15924 script code that identifies the dictionary to be
278    * created.
279    * @param breakType The kind of text break for which a dictionary is
280    * sought.
281    * @return A DictionaryMatcher with the desired characteristics, or NULL.
282    */
283   virtual DictionaryMatcher *loadDictionaryMatcherFor(UScriptCode script, int32_t breakType);
284 };
285 
286 U_NAMESPACE_END
287 
288     /* BRKENG_H */
289 #endif
290