aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/icu/common/unistrappender.h
blob: 0890406d7a241da0b6a116600a59b73947f57e31 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// © 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