123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- // © 2016 and later: Unicode, Inc. and others.
- // License & terms of use: http://www.unicode.org/copyright.html
- /*
- **********************************************************************
- * Copyright (c) 2002-2012, International Business Machines Corporation
- * and others. All Rights Reserved.
- **********************************************************************
- * Date Name Description
- * 02/04/2002 aliu Creation.
- **********************************************************************
- */
- #include "unicode/utypes.h"
- #if !UCONFIG_NO_TRANSLITERATION
- #include "unicode/translit.h"
- #include "unicode/uniset.h"
- #include "funcrepl.h"
- static const char16_t AMPERSAND = 38; // '&'
- static const char16_t OPEN[] = {40,32,0}; // "( "
- static const char16_t CLOSE[] = {32,41,0}; // " )"
- U_NAMESPACE_BEGIN
- UOBJECT_DEFINE_RTTI_IMPLEMENTATION(FunctionReplacer)
- /**
- * Construct a replacer that takes the output of the given
- * replacer, passes it through the given transliterator, and emits
- * the result as output.
- */
- FunctionReplacer::FunctionReplacer(Transliterator* adoptedTranslit,
- UnicodeFunctor* adoptedReplacer) {
- translit = adoptedTranslit;
- replacer = adoptedReplacer;
- }
- /**
- * Copy constructor.
- */
- FunctionReplacer::FunctionReplacer(const FunctionReplacer& other) :
- UnicodeFunctor(other),
- UnicodeReplacer(other)
- {
- translit = other.translit->clone();
- replacer = other.replacer->clone();
- }
- /**
- * Destructor
- */
- FunctionReplacer::~FunctionReplacer() {
- delete translit;
- delete replacer;
- }
- /**
- * Implement UnicodeFunctor
- */
- FunctionReplacer* FunctionReplacer::clone() const {
- return new FunctionReplacer(*this);
- }
- /**
- * UnicodeFunctor API. Cast 'this' to a UnicodeReplacer* pointer
- * and return the pointer.
- */
- UnicodeReplacer* FunctionReplacer::toReplacer() const {
- FunctionReplacer *nonconst_this = const_cast<FunctionReplacer *>(this);
- UnicodeReplacer *nonconst_base = static_cast<UnicodeReplacer *>(nonconst_this);
-
- return nonconst_base;
- }
- /**
- * UnicodeReplacer API
- */
- int32_t FunctionReplacer::replace(Replaceable& text,
- int32_t start,
- int32_t limit,
- int32_t& cursor)
- {
- // First delegate to subordinate replacer
- int32_t len = replacer->toReplacer()->replace(text, start, limit, cursor);
- limit = start + len;
- // Now transliterate
- limit = translit->transliterate(text, start, limit);
- return limit - start;
- }
- /**
- * UnicodeReplacer API
- */
- UnicodeString& FunctionReplacer::toReplacerPattern(UnicodeString& rule,
- UBool escapeUnprintable) const {
- UnicodeString str;
- rule.truncate(0);
- rule.append(AMPERSAND);
- rule.append(translit->getID());
- rule.append(OPEN, 2);
- rule.append(replacer->toReplacer()->toReplacerPattern(str, escapeUnprintable));
- rule.append(CLOSE, 2);
- return rule;
- }
- /**
- * Implement UnicodeReplacer
- */
- void FunctionReplacer::addReplacementSetTo(UnicodeSet& toUnionTo) const {
- UnicodeSet set;
- toUnionTo.addAll(translit->getTargetSet(set));
- }
- /**
- * UnicodeFunctor API
- */
- void FunctionReplacer::setData(const TransliterationRuleData* d) {
- replacer->setData(d);
- }
- U_NAMESPACE_END
- #endif /* #if !UCONFIG_NO_TRANSLITERATION */
- //eof
|