aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/icu/common/bytesinkutil.h
blob: 01cd1dadc7f28cf5e3ff95b62b0dcd47fcb3a2a3 (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
// © 2017 and later: Unicode, Inc. and others. 
// License & terms of use: http://www.unicode.org/copyright.html 
 
// bytesinkutil.h 
// created: 2017sep14 Markus W. Scherer 
 
#include "unicode/utypes.h" 
#include "unicode/bytestream.h" 
#include "unicode/edits.h" 
#include "cmemory.h" 
#include "uassert.h" 
 
U_NAMESPACE_BEGIN 
 
class ByteSink; 
class CharString; 
class Edits; 
 
class U_COMMON_API ByteSinkUtil { 
public: 
    ByteSinkUtil() = delete;  // all static 
 
    /** (length) bytes were mapped to valid (s16, s16Length). */ 
    static UBool appendChange(int32_t length, 
                              const char16_t *s16, int32_t s16Length, 
                              ByteSink &sink, Edits *edits, UErrorCode &errorCode); 
 
    /** The bytes at [s, limit[ were mapped to valid (s16, s16Length). */ 
    static UBool appendChange(const uint8_t *s, const uint8_t *limit, 
                              const char16_t *s16, int32_t s16Length, 
                              ByteSink &sink, Edits *edits, UErrorCode &errorCode); 
 
    /** (length) bytes were mapped/changed to valid code point c. */ 
    static void appendCodePoint(int32_t length, UChar32 c, ByteSink &sink, Edits *edits = nullptr); 
 
    /** The few bytes at [src, nextSrc[ were mapped/changed to valid code point c. */ 
    static inline void appendCodePoint(const uint8_t *src, const uint8_t *nextSrc, UChar32 c, 
                                       ByteSink &sink, Edits *edits = nullptr) { 
        appendCodePoint((int32_t)(nextSrc - src), c, sink, edits); 
    } 
 
    /** Append the two-byte character (U+0080..U+07FF). */ 
    static void appendTwoBytes(UChar32 c, ByteSink &sink); 
 
    static UBool appendUnchanged(const uint8_t *s, int32_t length, 
                                 ByteSink &sink, uint32_t options, Edits *edits, 
                                 UErrorCode &errorCode) { 
        if (U_FAILURE(errorCode)) { return FALSE; } 
        if (length > 0) { appendNonEmptyUnchanged(s, length, sink, options, edits); } 
        return TRUE; 
    } 
 
    static UBool appendUnchanged(const uint8_t *s, const uint8_t *limit, 
                                 ByteSink &sink, uint32_t options, Edits *edits, 
                                 UErrorCode &errorCode); 
 
private: 
    static void appendNonEmptyUnchanged(const uint8_t *s, int32_t length, 
                                        ByteSink &sink, uint32_t options, Edits *edits); 
}; 
 
class U_COMMON_API CharStringByteSink : public ByteSink { 
public: 
    CharStringByteSink(CharString* dest); 
    ~CharStringByteSink() override; 
 
    CharStringByteSink() = delete; 
    CharStringByteSink(const CharStringByteSink&) = delete; 
    CharStringByteSink& operator=(const CharStringByteSink&) = delete; 
 
    void Append(const char* bytes, int32_t n) override; 
 
    char* GetAppendBuffer(int32_t min_capacity, 
                          int32_t desired_capacity_hint, 
                          char* scratch, 
                          int32_t scratch_capacity, 
                          int32_t* result_capacity) override; 
 
private: 
    CharString& dest_; 
}; 
 
U_NAMESPACE_END