1 /***********************************************************************
2  * © 2016 and later: Unicode, Inc. and others.
3  * License & terms of use: http://www.unicode.org/copyright.html
4  ***********************************************************************
5  ***********************************************************************
6  * COPYRIGHT:
7  * Copyright (c) 1999-2003, International Business Machines Corporation and
8  * others. All Rights Reserved.
9  ***********************************************************************/
10 
11 #include "unicode/translit.h"
12 #include "unicode/normlzr.h"
13 
14 using namespace icu;
15 
16 class UnaccentTransliterator : public Transliterator {
17 
18  public:
19 
20     /**
21      * Constructor
22      */
23     UnaccentTransliterator();
24 
25     /**
26      * Destructor
27      */
28     virtual ~UnaccentTransliterator();
29 
30  protected:
31 
32     /**
33      * Implement Transliterator API
34      */
35     virtual void handleTransliterate(Replaceable& text,
36                                      UTransPosition& index,
37                                      UBool incremental) const;
38 
39  private:
40 
41     /**
42      * Unaccent a single character using normalizer.
43      */
44     UChar unaccent(UChar c) const;
45 
46     Normalizer normalizer;
47 
48 public:
49 
50     /**
51      * Return the class ID for this class.  This is useful only for
52      * comparing to a return value from getDynamicClassID().  For example:
53      * <pre>
54      * .      Base* polymorphic_pointer = createPolymorphicObject();
55      * .      if (polymorphic_pointer->getDynamicClassID() ==
56      * .          Derived::getStaticClassID()) ...
57      * </pre>
58      * @return          The class ID for all objects of this class.
59      * @stable ICU 2.0
60      */
getStaticClassID(void)61     static inline UClassID getStaticClassID(void) { return (UClassID)&fgClassID; };
62 
63     /**
64      * Returns a unique class ID <b>polymorphically</b>.  This method
65      * is to implement a simple version of RTTI, since not all C++
66      * compilers support genuine RTTI.  Polymorphic operator==() and
67      * clone() methods call this method.
68      *
69      * <p>Concrete subclasses of Transliterator that wish clients to
70      * be able to identify them should implement getDynamicClassID()
71      * and also a static method and data member:
72      *
73      * <pre>
74      * static UClassID getStaticClassID() { return (UClassID)&fgClassID; }
75      * static char fgClassID;
76      * </pre>
77      *
78      * Subclasses that do not implement this method will have a
79      * dynamic class ID of Transliterator::getStatisClassID().
80      *
81      * @return The class ID for this object. All objects of a given
82      * class have the same class ID.  Objects of other classes have
83      * different class IDs.
84      * @stable ICU 2.0
85      */
getDynamicClassID(void)86     virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); };
87 
88 private:
89 
90     /**
91      * Class identifier for subclasses of Transliterator that do not
92      * define their class (anonymous subclasses).
93      */
94     static const char fgClassID;
95 };
96