1// Copyright (C) 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 UnicodeFunctor* 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