Home | History | Annotate | Download | only in i18n
      1 // Copyright (C) 2016 and later: Unicode, Inc. and others.
      2 // License & terms of use: http://www.unicode.org/copyright.html
      3 /*
      4  * Copyright (C) 2015, International Business Machines
      5  * Corporation and others.  All Rights Reserved.
      6  *
      7  * file name: digitaffix.cpp
      8  */
      9 
     10 #include "unicode/utypes.h"
     11 
     12 #if !UCONFIG_NO_FORMATTING
     13 
     14 #include "digitaffix.h"
     15 #include "fphdlimp.h"
     16 #include "uassert.h"
     17 #include "unistrappender.h"
     18 
     19 U_NAMESPACE_BEGIN
     20 
     21 DigitAffix::DigitAffix() : fAffix(), fAnnotations() {
     22 }
     23 
     24 DigitAffix::DigitAffix(
     25         const UChar *value, int32_t charCount, int32_t fieldId)
     26         : fAffix(value, charCount),
     27           fAnnotations(charCount, (UChar) fieldId, charCount) {
     28 }
     29 
     30 void
     31 DigitAffix::remove() {
     32     fAffix.remove();
     33     fAnnotations.remove();
     34 }
     35 
     36 void
     37 DigitAffix::appendUChar(UChar value, int32_t fieldId) {
     38     fAffix.append(value);
     39     fAnnotations.append((UChar) fieldId);
     40 }
     41 
     42 void
     43 DigitAffix::append(const UnicodeString &value, int32_t fieldId) {
     44     fAffix.append(value);
     45     {
     46         UnicodeStringAppender appender(fAnnotations);
     47         int32_t len = value.length();
     48         for (int32_t i = 0; i < len; ++i) {
     49             appender.append((UChar) fieldId);
     50         }
     51     }
     52 }
     53 
     54 void
     55 DigitAffix::setTo(const UnicodeString &value, int32_t fieldId) {
     56     fAffix = value;
     57     fAnnotations.remove();
     58     {
     59         UnicodeStringAppender appender(fAnnotations);
     60         int32_t len = value.length();
     61         for (int32_t i = 0; i < len; ++i) {
     62             appender.append((UChar) fieldId);
     63         }
     64     }
     65 }
     66 
     67 void
     68 DigitAffix::append(const UChar *value, int32_t charCount, int32_t fieldId) {
     69     fAffix.append(value, charCount);
     70     {
     71         UnicodeStringAppender appender(fAnnotations);
     72         for (int32_t i = 0; i < charCount; ++i) {
     73             appender.append((UChar) fieldId);
     74         }
     75     }
     76 }
     77 
     78 UnicodeString &
     79 DigitAffix::format(FieldPositionHandler &handler, UnicodeString &appendTo) const {
     80     int32_t len = fAffix.length();
     81     if (len == 0) {
     82         return appendTo;
     83     }
     84     if (!handler.isRecording()) {
     85         return appendTo.append(fAffix);
     86     }
     87     U_ASSERT(fAffix.length() == fAnnotations.length());
     88     int32_t appendToStart = appendTo.length();
     89     int32_t lastId = (int32_t) fAnnotations.charAt(0);
     90     int32_t lastIdStart = 0;
     91     for (int32_t i = 1; i < len; ++i) {
     92         int32_t id = (int32_t) fAnnotations.charAt(i);
     93         if (id != lastId) {
     94             if (lastId != UNUM_FIELD_COUNT) {
     95                 handler.addAttribute(lastId, appendToStart + lastIdStart, appendToStart + i);
     96             }
     97             lastId = id;
     98             lastIdStart = i;
     99         }
    100     }
    101     if (lastId != UNUM_FIELD_COUNT) {
    102         handler.addAttribute(lastId, appendToStart + lastIdStart, appendToStart + len);
    103     }
    104     return appendTo.append(fAffix);
    105 }
    106 
    107 U_NAMESPACE_END
    108 
    109 #endif /* #if !UCONFIG_NO_FORMATTING */
    110