Index: source/common/unistrappender.h |
diff --git a/source/common/unistrappender.h b/source/common/unistrappender.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4a459c8ddd5ec082a62f0236d16e8d4d1c581fcf |
--- /dev/null |
+++ b/source/common/unistrappender.h |
@@ -0,0 +1,88 @@ |
+/* |
+****************************************************************************** |
+* Copyright (C) 2015, International Business Machines Corporation and |
+* others. All Rights Reserved. |
+****************************************************************************** |
+* |
+* File unistrappender.h |
+****************************************************************************** |
+*/ |
+ |
+#ifndef __UNISTRAPPENDER_H__ |
+#define __UNISTRAPPENDER_H__ |
+ |
+#include "unicode/unistr.h" |
+#include "unicode/uobject.h" |
+#include "unicode/utf16.h" |
+#include "unicode/utypes.h" |
+#include "cmemory.h" |
+ |
+U_NAMESPACE_BEGIN |
+ |
+/** |
+ * An optimization for the slowness of calling UnicodeString::append() |
+ * one character at a time in a loop. It stores appends in a buffer while |
+ * never actually calling append on the unicode string unless the buffer |
+ * fills up or is flushed. |
+ * |
+ * proper usage: |
+ * { |
+ * UnicodeStringAppender appender(astring); |
+ * for (int32_t i = 0; i < 100; ++i) { |
+ * appender.append((UChar) i); |
+ * } |
+ * // appender flushed automatically when it goes out of scope. |
+ * } |
+ */ |
+class UnicodeStringAppender : public UMemory { |
+public: |
+ |
+ /** |
+ * dest is the UnicodeString being appended to. It must always |
+ * exist while this instance exists. |
+ */ |
+ UnicodeStringAppender(UnicodeString &dest) : fDest(&dest), fIdx(0) { } |
+ |
+ inline void append(UChar x) { |
+ if (fIdx == UPRV_LENGTHOF(fBuffer)) { |
+ fDest->append(fBuffer, 0, fIdx); |
+ fIdx = 0; |
+ } |
+ fBuffer[fIdx++] = x; |
+ } |
+ |
+ inline void append(UChar32 x) { |
+ if (fIdx >= UPRV_LENGTHOF(fBuffer) - 1) { |
+ fDest->append(fBuffer, 0, fIdx); |
+ fIdx = 0; |
+ } |
+ U16_APPEND_UNSAFE(fBuffer, fIdx, x); |
+ } |
+ |
+ /** |
+ * Ensures that all appended characters have been written out to dest. |
+ */ |
+ inline void flush() { |
+ if (fIdx) { |
+ fDest->append(fBuffer, 0, fIdx); |
+ } |
+ fIdx = 0; |
+ } |
+ |
+ /** |
+ * flush the buffer when we go out of scope. |
+ */ |
+ ~UnicodeStringAppender() { |
+ flush(); |
+ } |
+private: |
+ UnicodeString *fDest; |
+ int32_t fIdx; |
+ UChar fBuffer[32]; |
+ UnicodeStringAppender(const UnicodeStringAppender &other); |
+ UnicodeStringAppender &operator=(const UnicodeStringAppender &other); |
+}; |
+ |
+U_NAMESPACE_END |
+ |
+#endif |