1 // © 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
3 /*
4 **********************************************************************
5 * Copyright (C) 1999-2010, International Business Machines Corporation and others.
6 * All Rights Reserved.
7 **********************************************************************
8 *   Date        Name        Description
9 *   11/17/99    aliu        Creation.
10 **********************************************************************
11 */
12 #ifndef UNIFILT_H
13 #define UNIFILT_H
14 
15 #include "unicode/utypes.h"
16 
17 #if U_SHOW_CPLUSPLUS_API
18 
19 #include "unicode/unifunct.h"
20 #include "unicode/unimatch.h"
21 
22 /**
23  * \file
24  * \brief C++ API: Unicode Filter
25  */
26 
27 U_NAMESPACE_BEGIN
28 
29 /**
30  * U_ETHER is used to represent character values for positions outside
31  * a range.  For example, transliterator uses this to represent
32  * characters outside the range contextStart..contextLimit-1.  This
33  * allows explicit matching by rules and UnicodeSets of text outside a
34  * defined range.
35  * @stable ICU 3.0
36  */
37 #define U_ETHER ((char16_t)0xFFFF)
38 
39 /**
40  *
41  * <code>UnicodeFilter</code> defines a protocol for selecting a
42  * subset of the full range (U+0000 to U+10FFFF) of Unicode characters.
43  * Currently, filters are used in conjunction with classes like
44  * {@link Transliterator} to only process selected characters through a
45  * transformation.
46  *
47  * <p>Note: UnicodeFilter currently stubs out two pure virtual methods
48  * of its base class, UnicodeMatcher.  These methods are toPattern()
49  * and matchesIndexValue().  This is done so that filter classes that
50  * are not actually used as matchers -- specifically, those in the
51  * UnicodeFilterLogic component, and those in tests -- can continue to
52  * work without defining these methods.  As long as a filter is not
53  * used in an RBT during real transliteration, these methods will not
54  * be called.  However, this breaks the UnicodeMatcher base class
55  * protocol, and it is not a correct solution.
56  *
57  * <p>In the future we may revisit the UnicodeMatcher / UnicodeFilter
58  * hierarchy and either redesign it, or simply remove the stubs in
59  * UnicodeFilter and force subclasses to implement the full
60  * UnicodeMatcher protocol.
61  *
62  * @see UnicodeFilterLogic
63  * @stable ICU 2.0
64  */
65 class U_COMMON_API UnicodeFilter : public UnicodeFunctor, public UnicodeMatcher {
66 
67 public:
68     /**
69      * Destructor
70      * @stable ICU 2.0
71      */
72     virtual ~UnicodeFilter();
73 
74     /**
75      * Clones this object polymorphically.
76      * The caller owns the result and should delete it when done.
77      * @return clone, or nullptr if an error occurred
78      * @stable ICU 2.4
79      */
80     virtual UnicodeFilter* clone() const = 0;
81 
82     /**
83      * Returns <tt>true</tt> for characters that are in the selected
84      * subset.  In other words, if a character is <b>to be
85      * filtered</b>, then <tt>contains()</tt> returns
86      * <b><tt>false</tt></b>.
87      * @stable ICU 2.0
88      */
89     virtual UBool contains(UChar32 c) const = 0;
90 
91     /**
92      * UnicodeFunctor API.  Cast 'this' to a UnicodeMatcher* pointer
93      * and return the pointer.
94      * @stable ICU 2.4
95      */
96     virtual UnicodeMatcher* toMatcher() const;
97 
98     /**
99      * Implement UnicodeMatcher API.
100      * @stable ICU 2.4
101      */
102     virtual UMatchDegree matches(const Replaceable& text,
103                                  int32_t& offset,
104                                  int32_t limit,
105                                  UBool incremental);
106 
107     /**
108      * UnicodeFunctor API.  Nothing to do.
109      * @stable ICU 2.4
110      */
111     virtual void setData(const TransliterationRuleData*);
112 
113     /**
114      * ICU "poor man's RTTI", returns a UClassID for this class.
115      *
116      * @stable ICU 2.2
117      */
118     static UClassID U_EXPORT2 getStaticClassID();
119 
120 protected:
121 
122     /*
123      * Since this class has pure virtual functions,
124      * a constructor can't be used.
125      * @stable ICU 2.0
126      */
127 /*    UnicodeFilter();*/
128 };
129 
130 /*inline UnicodeFilter::UnicodeFilter() {}*/
131 
132 U_NAMESPACE_END
133 
134 #endif /* U_SHOW_CPLUSPLUS_API */
135 
136 #endif
137