unifilt.cpp revision c73f511526464f8e56c242df80552e9b0d94ae3d
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 15U_NAMESPACE_BEGIN 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 */ 21UnicodeMatcher::~UnicodeMatcher() {} 22 23UnicodeFilter::~UnicodeFilter() {} 24 25/** 26 * UnicodeFunctor API. 27 * Note that UnicodeMatcher is a base class of UnicodeFilter. 28 */ 29UnicodeMatcher* UnicodeFilter::toMatcher() const { 30 return const_cast<UnicodeFilter *>(this); 31} 32 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 */ 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 67U_NAMESPACE_END 68 69//eof 70