]>
Commit | Line | Data |
---|---|---|
2ca993e8 A |
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, appendToStart + 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 */ |