ICU-13417 Add the internal helper class CharStringByteSink.

This is an implementation of the public ICU ByteSink interface that
writes to the ICU internal class CharString.
This commit is contained in:
Fredrik Roubert 2018-09-12 20:40:14 -07:00 committed by Shane Carr
parent f779761bff
commit 3e8fb05f7c
No known key found for this signature in database
GPG Key ID: FCED3B24AAB18B5C
2 changed files with 60 additions and 0 deletions

View File

@ -11,6 +11,7 @@
#include "unicode/utf8.h" #include "unicode/utf8.h"
#include "unicode/utf16.h" #include "unicode/utf16.h"
#include "bytesinkutil.h" #include "bytesinkutil.h"
#include "charstr.h"
#include "cmemory.h" #include "cmemory.h"
#include "uassert.h" #include "uassert.h"
@ -120,4 +121,41 @@ ByteSinkUtil::appendUnchanged(const uint8_t *s, const uint8_t *limit,
return TRUE; return TRUE;
} }
CharStringByteSink::CharStringByteSink(CharString* dest) : dest_(*dest) {
}
CharStringByteSink::~CharStringByteSink() = default;
void
CharStringByteSink::Append(const char* bytes, int32_t n) {
UErrorCode status = U_ZERO_ERROR;
dest_.append(bytes, n, status);
// Any errors are silently ignored.
}
char*
CharStringByteSink::GetAppendBuffer(int32_t min_capacity,
int32_t desired_capacity_hint,
char* scratch,
int32_t scratch_capacity,
int32_t* result_capacity) {
if (min_capacity < 1 || scratch_capacity < min_capacity) {
*result_capacity = 0;
return nullptr;
}
UErrorCode status = U_ZERO_ERROR;
char* result = dest_.getAppendBuffer(
min_capacity,
desired_capacity_hint,
*result_capacity,
status);
if (U_SUCCESS(status)) {
return result;
}
*result_capacity = scratch_capacity;
return scratch;
}
U_NAMESPACE_END U_NAMESPACE_END

View File

@ -13,6 +13,7 @@
U_NAMESPACE_BEGIN U_NAMESPACE_BEGIN
class ByteSink; class ByteSink;
class CharString;
class Edits; class Edits;
class U_COMMON_API ByteSinkUtil { class U_COMMON_API ByteSinkUtil {
@ -58,4 +59,25 @@ private:
ByteSink &sink, uint32_t options, Edits *edits); ByteSink &sink, uint32_t options, Edits *edits);
}; };
class 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 U_NAMESPACE_END