// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /* ****************************************************************************** * 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