blob: 60d0a458325433f6dab174fc999d65722fb3dec8 [file] [log] [blame]
// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc. All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file or at
// https://developers.google.com/open-source/licenses/bsd
#include "google/protobuf/io/zero_copy_sink.h"
#include <algorithm>
#include <cstddef>
namespace google {
namespace protobuf {
namespace io {
namespace zc_sink_internal {
void ZeroCopyStreamByteSink::Append(const char* bytes, size_t len) {
while (!failed_ && len > 0) {
if (buffer_size_ == 0) {
int size;
if (!stream_->Next(&buffer_, &size)) {
// There isn't a way for ByteSink to report errors.
buffer_size_ = 0;
failed_ = true;
return;
}
buffer_size_ = static_cast<unsigned int>(size);
}
auto to_write = std::min(len, buffer_size_);
memcpy(buffer_, bytes, to_write);
buffer_ = static_cast<char*>(buffer_) + to_write;
buffer_size_ -= to_write;
bytes += to_write;
len -= to_write;
bytes_written_ += to_write;
}
}
} // namespace zc_sink_internal
} // namespace io
} // namespace protobuf
} // namespace google