]> git.saurik.com Git - apple/icu.git/blame - icuSources/i18n/number_stringbuilder.h
ICU-62107.0.1.tar.gz
[apple/icu.git] / icuSources / i18n / number_stringbuilder.h
CommitLineData
0f5d89e8
A
1// © 2017 and later: Unicode, Inc. and others.
2// License & terms of use: http://www.unicode.org/copyright.html
3
4#include "unicode/utypes.h"
5
6#if !UCONFIG_NO_FORMATTING
7#ifndef __NUMBER_STRINGBUILDER_H__
8#define __NUMBER_STRINGBUILDER_H__
9
10
11#include <cstdint>
12#include "unicode/numfmt.h"
13#include "unicode/ustring.h"
14#include "cstring.h"
15#include "uassert.h"
16#include "number_types.h"
17#include "fphdlimp.h"
18
19U_NAMESPACE_BEGIN namespace number {
20namespace impl {
21
22class U_I18N_API NumberStringBuilder : public UMemory {
23 private:
24 static const int32_t DEFAULT_CAPACITY = 40;
25
26 template<typename T>
27 union ValueOrHeapArray {
28 T value[DEFAULT_CAPACITY];
29 struct {
30 T *ptr;
31 int32_t capacity;
32 } heap;
33 };
34
35 public:
36 NumberStringBuilder();
37
38 ~NumberStringBuilder();
39
40 NumberStringBuilder(const NumberStringBuilder &other);
41
42 NumberStringBuilder &operator=(const NumberStringBuilder &other);
43
44 int32_t length() const;
45
46 int32_t codePointCount() const;
47
48 inline char16_t charAt(int32_t index) const {
49 U_ASSERT(index >= 0);
50 U_ASSERT(index < fLength);
51 return getCharPtr()[fZero + index];
52 }
53
54 inline Field fieldAt(int32_t index) const {
55 U_ASSERT(index >= 0);
56 U_ASSERT(index < fLength);
57 return getFieldPtr()[fZero + index];
58 }
59
60 UChar32 getFirstCodePoint() const;
61
62 UChar32 getLastCodePoint() const;
63
64 UChar32 codePointAt(int32_t index) const;
65
66 UChar32 codePointBefore(int32_t index) const;
67
68 NumberStringBuilder &clear();
69
70 int32_t appendCodePoint(UChar32 codePoint, Field field, UErrorCode &status);
71
72 int32_t insertCodePoint(int32_t index, UChar32 codePoint, Field field, UErrorCode &status);
73
74 int32_t append(const UnicodeString &unistr, Field field, UErrorCode &status);
75
76 int32_t insert(int32_t index, const UnicodeString &unistr, Field field, UErrorCode &status);
77
78 int32_t insert(int32_t index, const UnicodeString &unistr, int32_t start, int32_t end, Field field,
79 UErrorCode &status);
80
81 int32_t splice(int32_t startThis, int32_t endThis, const UnicodeString &unistr,
82 int32_t startOther, int32_t endOther, Field field, UErrorCode& status);
83
84 int32_t append(const NumberStringBuilder &other, UErrorCode &status);
85
86 int32_t insert(int32_t index, const NumberStringBuilder &other, UErrorCode &status);
87
88 /**
89 * Gets a "safe" UnicodeString that can be used even after the NumberStringBuilder is destructed.
90 * */
91 UnicodeString toUnicodeString() const;
92
93 /**
94 * Gets an "unsafe" UnicodeString that is valid only as long as the NumberStringBuilder is alive and
95 * unchanged. Slightly faster than toUnicodeString().
96 */
97 const UnicodeString toTempUnicodeString() const;
98
99 UnicodeString toDebugString() const;
100
101 const char16_t *chars() const;
102
103 bool contentEquals(const NumberStringBuilder &other) const;
104
105 bool nextFieldPosition(FieldPosition& fp, UErrorCode& status) const;
106
107 void getAllFieldPositions(FieldPositionIteratorHandler& fpih, UErrorCode& status) const;
108
109 private:
110 bool fUsingHeap = false;
111 ValueOrHeapArray<char16_t> fChars;
112 ValueOrHeapArray<Field> fFields;
113 int32_t fZero = DEFAULT_CAPACITY / 2;
114 int32_t fLength = 0;
115
116 inline char16_t *getCharPtr() {
117 return fUsingHeap ? fChars.heap.ptr : fChars.value;
118 }
119
120 inline const char16_t *getCharPtr() const {
121 return fUsingHeap ? fChars.heap.ptr : fChars.value;
122 }
123
124 inline Field *getFieldPtr() {
125 return fUsingHeap ? fFields.heap.ptr : fFields.value;
126 }
127
128 inline const Field *getFieldPtr() const {
129 return fUsingHeap ? fFields.heap.ptr : fFields.value;
130 }
131
132 inline int32_t getCapacity() const {
133 return fUsingHeap ? fChars.heap.capacity : DEFAULT_CAPACITY;
134 }
135
136 int32_t prepareForInsert(int32_t index, int32_t count, UErrorCode &status);
137
138 int32_t prepareForInsertHelper(int32_t index, int32_t count, UErrorCode &status);
139
140 int32_t remove(int32_t index, int32_t count);
141};
142
143} // namespace impl
144} // namespace number
145U_NAMESPACE_END
146
147
148#endif //__NUMBER_STRINGBUILDER_H__
149
150#endif /* #if !UCONFIG_NO_FORMATTING */