1// © 2016 and later: Unicode, Inc. and others.
2// License & terms of use: http://www.unicode.org/copyright.html
3/*
4**********************************************************************
5* Copyright (c) 2002-2011, International Business Machines Corporation
6* and others. All Rights Reserved.
7**********************************************************************
8* Date Name Description
9* 01/21/2002 aliu Creation.
10**********************************************************************
11*/
12
13#ifndef STRREPL_H
14#define STRREPL_H
15
16#include "unicode/utypes.h"
17
18#if !UCONFIG_NO_TRANSLITERATION
19
20#include "unicode/unifunct.h"
21#include "unicode/unirepl.h"
22#include "unicode/unistr.h"
23
24U_NAMESPACE_BEGIN
25
26class TransliterationRuleData;
27
28/**
29 * A replacer that produces static text as its output. The text may
30 * contain transliterator stand-in characters that represent nested
31 * UnicodeReplacer objects, making it possible to encode a tree of
32 * replacers in a StringReplacer. A StringReplacer that contains such
33 * stand-ins is called a <em>complex</em> StringReplacer. A complex
34 * StringReplacer has a slower processing loop than a non-complex one.
35 * @author Alan Liu
36 */
37class StringReplacer : public UnicodeFunctor, public UnicodeReplacer {
38
39 private:
40
41 /**
42 * Output text, possibly containing stand-in characters that
43 * represent nested UnicodeReplacers.
44 */
45 UnicodeString output;
46
47 /**
48 * Cursor position. Value is ignored if hasCursor is false.
49 */
50 int32_t cursorPos;
51
52 /**
53 * True if this object outputs a cursor position.
54 */
55 UBool hasCursor;
56
57 /**
58 * A complex object contains nested replacers and requires more
59 * complex processing. StringReplacers are initially assumed to
60 * be complex. If no nested replacers are seen during processing,
61 * then isComplex is set to false, and future replacements are
62 * short circuited for better performance.
63 */
64 UBool isComplex;
65
66 /**
67 * Object that translates stand-in characters in 'output' to
68 * UnicodeReplacer objects.
69 */
70 const TransliterationRuleData* data;
71
72 public:
73
74 /**
75 * Construct a StringReplacer that sets the emits the given output
76 * text and sets the cursor to the given position.
77 * @param theOutput text that will replace input text when the
78 * replace() method is called. May contain stand-in characters
79 * that represent nested replacers.
80 * @param theCursorPos cursor position that will be returned by
81 * the replace() method
82 * @param theData transliterator context object that translates
83 * stand-in characters to UnicodeReplacer objects
84 */
85 StringReplacer(const UnicodeString& theOutput,
86 int32_t theCursorPos,
87 const TransliterationRuleData* theData);
88
89 /**
90 * Construct a StringReplacer that sets the emits the given output
91 * text and does not modify the cursor.
92 * @param theOutput text that will replace input text when the
93 * replace() method is called. May contain stand-in characters
94 * that represent nested replacers.
95 * @param theData transliterator context object that translates
96 * stand-in characters to UnicodeReplacer objects
97 */
98 StringReplacer(const UnicodeString& theOutput,
99 const TransliterationRuleData* theData);
100
101 /**
102 * Copy constructor.
103 */
104 StringReplacer(const StringReplacer& other);
105
106 /**
107 * Destructor
108 */
109 virtual ~StringReplacer();
110
111 /**
112 * Implement UnicodeFunctor
113 */
114 virtual StringReplacer* clone() const;
115
116 /**
117 * UnicodeFunctor API. Cast 'this' to a UnicodeReplacer* pointer
118 * and return the pointer.
119 */
120 virtual UnicodeReplacer* toReplacer() const;
121
122 /**
123 * UnicodeReplacer API
124 */
125 virtual int32_t replace(Replaceable& text,
126 int32_t start,
127 int32_t limit,
128 int32_t& cursor);
129
130 /**
131 * UnicodeReplacer API
132 */
133 virtual UnicodeString& toReplacerPattern(UnicodeString& result,
134 UBool escapeUnprintable) const;
135
136 /**
137 * Implement UnicodeReplacer
138 */
139 virtual void addReplacementSetTo(UnicodeSet& toUnionTo) const;
140
141 /**
142 * UnicodeFunctor API
143 */
144 virtual void setData(const TransliterationRuleData*);
145
146 /**
147 * ICU "poor man's RTTI", returns a UClassID for this class.
148 */
149 static UClassID U_EXPORT2 getStaticClassID();
150
151 /**
152 * ICU "poor man's RTTI", returns a UClassID for the actual class.
153 */
154 virtual UClassID getDynamicClassID() const;
155};
156
157U_NAMESPACE_END
158
159#endif /* #if !UCONFIG_NO_TRANSLITERATION */
160
161#endif
162
163//eof
164