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