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