1 /* 2 ********************************************************************** 3 * Copyright (c) 2001-2012, International Business Machines 4 * Corporation and others. All Rights Reserved. 5 ********************************************************************** 6 * Date Name Description 7 * 07/18/01 aliu Creation. 8 ********************************************************************** 9 */ 10 11 #include "unicode/unifilt.h" 12 #include "unicode/rep.h" 13 #include "unicode/utf16.h" 14 15 U_NAMESPACE_BEGIN UOBJECT_DEFINE_ABSTRACT_RTTI_IMPLEMENTATION(UnicodeFilter)16UOBJECT_DEFINE_ABSTRACT_RTTI_IMPLEMENTATION(UnicodeFilter) 17 18 19 /* Define this here due to the lack of another file. 20 It can't be defined in the header */ 21 UnicodeMatcher::~UnicodeMatcher() {} 22 ~UnicodeFilter()23UnicodeFilter::~UnicodeFilter() {} 24 25 /** 26 * UnicodeFunctor API. 27 * Note that UnicodeMatcher is a base class of UnicodeFilter. 28 */ toMatcher() const29UnicodeMatcher* UnicodeFilter::toMatcher() const { 30 return const_cast<UnicodeFilter *>(this); 31 } 32 setData(const TransliterationRuleData *)33void UnicodeFilter::setData(const TransliterationRuleData*) {} 34 35 /** 36 * Default implementation of UnicodeMatcher::matches() for Unicode 37 * filters. Matches a single code point at offset (either one or 38 * two 16-bit code units). 39 */ matches(const Replaceable & text,int32_t & offset,int32_t limit,UBool incremental)40UMatchDegree UnicodeFilter::matches(const Replaceable& text, 41 int32_t& offset, 42 int32_t limit, 43 UBool incremental) { 44 UChar32 c; 45 if (offset < limit && 46 contains(c = text.char32At(offset))) { 47 offset += U16_LENGTH(c); 48 return U_MATCH; 49 } 50 if (offset > limit && 51 contains(c = text.char32At(offset))) { 52 // Backup offset by 1, unless the preceding character is a 53 // surrogate pair -- then backup by 2 (keep offset pointing at 54 // the lead surrogate). 55 --offset; 56 if (offset >= 0) { 57 offset -= U16_LENGTH(text.char32At(offset)) - 1; 58 } 59 return U_MATCH; 60 } 61 if (incremental && offset == limit) { 62 return U_PARTIAL_MATCH; 63 } 64 return U_MISMATCH; 65 } 66 67 U_NAMESPACE_END 68 69 //eof 70