1 // © 2016 and later: Unicode, Inc. and others. 2 // License & terms of use: http://www.unicode.org/copyright.html 3 // Copyright (C) 2009-2012, International Business Machines 4 // Corporation and others. All Rights Reserved. 6 // Copyright 2007 Google Inc. All Rights Reserved. 7 // Author: sanjay@google.com (Sanjay Ghemawat) 9 // Abstract interface that consumes a sequence of bytes (ByteSink). 11 // Used so that we can write a single piece of code that can operate 12 // on a variety of output string types. 14 // Various implementations of this interface are provided: 16 // CheckedArrayByteSink Write to a flat array, with bounds checking 17 // StringByteSink Write to an STL string 19 // This code is a contribution of Google code, and the style used here is 20 // a compromise between the original Google code and the ICU coding guidelines. 21 // For example, data types are ICU-ified (size_t,int->int32_t), 22 // and API comments doxygen-ified, but function names and behavior are 23 // as in the original, if possible. 24 // Assertion-style error handling, not available in ICU, was changed to 25 // parameter "pinning" similar to UnicodeString. 27 // In addition, this is only a partial port of the original Google code, 28 // limited to what was needed so far. The (nearly) complete original code 29 // is in the ICU svn repository at icuhtml/trunk/design/strings/contrib 30 // (see ICU ticket 6765, r25517). 32 #ifndef __BYTESTREAM_H__ 33 #define __BYTESTREAM_H__ 42 #if U_SHOW_CPLUSPLUS_API 72 virtualvoidAppend(
constchar* bytes, int32_t n) = 0;
85 inlinevoidAppendU8(
constchar* bytes, int32_t n) {
89 #if defined(__cpp_char8_t) || defined(U_IN_DOXYGEN) 101 inlinevoidAppendU8(
const char8_t* bytes, int32_t n) {
102 Append(
reinterpret_cast<constchar*
>(bytes), n);
149 int32_t desired_capacity_hint,
150 char* scratch, int32_t scratch_capacity,
151 int32_t* result_capacity);
168 // ------------------------------------------------------------- 169 // Some standard implementations 209 virtualvoidAppend(
constchar* bytes, int32_t n)
override;
225 int32_t desired_capacity_hint,
226 char* scratch, int32_t scratch_capacity,
227 int32_t* result_capacity)
override;
251 const int32_t capacity_;
266 template<
typename StringClass>
283 if (initialAppendCapacity > 0 &&
284 static_cast<uint32_t
>(initialAppendCapacity) > dest->capacity() - dest->length()) {
285 dest->reserve(dest->length() + initialAppendCapacity);
294 virtualvoidAppend(
constchar* data, int32_t n)
override{ dest_->append(data, n); }
305 #endif/* U_SHOW_CPLUSPLUS_API */ 307 #endif// __BYTESTREAM_H__ A ByteSink can be filled with bytes.
void AppendU8(const char *bytes, int32_t n)
Appends n bytes to this.
virtual char * GetAppendBuffer(int32_t min_capacity, int32_t desired_capacity_hint, char *scratch, int32_t scratch_capacity, int32_t *result_capacity)
Returns a writable buffer for appending and writes the buffer's capacity to *result_capacity.
virtual void Append(const char *bytes, int32_t n)=0
Append "bytes[0,n-1]" to this.
ByteSink()
Default constructor.
void AppendU8(const char8_t *bytes, int32_t n)
Appends n bytes to this.
virtual void Flush()
Flush internal buffers.
virtual ~ByteSink()
Virtual destructor.
Implementation of ByteSink that writes to a flat byte array, with bounds-checking: This sink will not...
int32_t NumberOfBytesWritten() const
Returns the number of bytes actually written to the sink.
virtual char * GetAppendBuffer(int32_t min_capacity, int32_t desired_capacity_hint, char *scratch, int32_t scratch_capacity, int32_t *result_capacity) override
Returns a writable buffer for appending and writes the buffer's capacity to *result_capacity.
CheckedArrayByteSink(char *outbuf, int32_t capacity)
Constructs a ByteSink that will write to outbuf[0..capacity-1].
virtual ~CheckedArrayByteSink()
Destructor.
int32_t NumberOfBytesAppended() const
Returns the number of bytes appended to the sink.
UBool Overflowed() const
Returns true if any bytes were discarded, i.e., if there was an attempt to write more than 'capacity'...
virtual CheckedArrayByteSink & Reset()
Returns the sink to its original state, without modifying the buffer.
virtual void Append(const char *bytes, int32_t n) override
Append "bytes[0,n-1]" to this.
Implementation of ByteSink that writes to a "string".
StringByteSink(StringClass *dest, int32_t initialAppendCapacity)
Constructs a ByteSink that reserves append capacity and will append bytes to the dest string.
StringByteSink(StringClass *dest)
Constructs a ByteSink that will append bytes to the dest string.
virtual void Append(const char *data, int32_t n) override
Append "bytes[0,n-1]" to this.
UMemory is the common ICU base class.
C++ API: Central ICU header for including the C++ standard <string> header and for related definition...
int8_t UBool
The ICU boolean type, a signed-byte integer.
C++ API: Common ICU base class UObject.
Basic definitions for ICU, for both C and C++ APIs.
#define U_COMMON_API
Set to export library symbols from inside the common library, and to import them from outside.