|
@@ -49,22 +49,25 @@ namespace protobuf {
|
|
|
namespace util {
|
|
|
|
|
|
namespace internal {
|
|
|
+ZeroCopyStreamByteSink::~ZeroCopyStreamByteSink() {
|
|
|
+ stream_->BackUp(buffer_size_);
|
|
|
+}
|
|
|
+
|
|
|
void ZeroCopyStreamByteSink::Append(const char* bytes, size_t len) {
|
|
|
- while (len > 0) {
|
|
|
- void* buffer;
|
|
|
- int length;
|
|
|
- if (!stream_->Next(&buffer, &length)) {
|
|
|
- // There isn't a way for ByteSink to report errors.
|
|
|
+ while (true) {
|
|
|
+ if (len <= buffer_size_) {
|
|
|
+ memcpy(buffer_, bytes, len);
|
|
|
+ buffer_ = static_cast<char*>(buffer_) + len;
|
|
|
+ buffer_size_ -= len;
|
|
|
return;
|
|
|
}
|
|
|
- if (len < length) {
|
|
|
- memcpy(buffer, bytes, len);
|
|
|
- stream_->BackUp(length - len);
|
|
|
- break;
|
|
|
- } else {
|
|
|
- memcpy(buffer, bytes, length);
|
|
|
- bytes += length;
|
|
|
- len -= length;
|
|
|
+ memcpy(buffer_, bytes, buffer_size_);
|
|
|
+ bytes += buffer_size_;
|
|
|
+ len -= buffer_size_;
|
|
|
+ if (!stream_->Next(&buffer_, &buffer_size_)) {
|
|
|
+ // There isn't a way for ByteSink to report errors.
|
|
|
+ buffer_size_ = 0;
|
|
|
+ return;
|
|
|
}
|
|
|
}
|
|
|
}
|