]>
Commit | Line | Data |
---|---|---|
1 | // © 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 */ |