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