1 // Protocol Buffers - Google's data interchange format 2 // Copyright 2008 Google Inc. All rights reserved. 3 // 4 // Use of this source code is governed by a BSD-style 5 // license that can be found in the LICENSE file or at 6 // https://developers.google.com/open-source/licenses/bsd 7 8 #ifndef GOOGLE_PROTOBUF_UTIL_ZERO_COPY_SINK_H__ 9 #define GOOGLE_PROTOBUF_UTIL_ZERO_COPY_SINK_H__ 10 11 #include <cstddef> 12 13 #include "google/protobuf/io/zero_copy_stream.h" 14 #include "google/protobuf/port.h" 15 16 // Must be included last. 17 #include "google/protobuf/port_def.inc" 18 19 namespace google { 20 namespace protobuf { 21 namespace io { 22 namespace zc_sink_internal { 23 24 // Internal helper class, for turning a ZeroCopyOutputStream into a sink. 25 class PROTOBUF_EXPORT ZeroCopyStreamByteSink { 26 public: ZeroCopyStreamByteSink(io::ZeroCopyOutputStream * stream)27 explicit ZeroCopyStreamByteSink(io::ZeroCopyOutputStream* stream) 28 : stream_(stream) {} 29 ZeroCopyStreamByteSink(const ZeroCopyStreamByteSink&) = delete; 30 ZeroCopyStreamByteSink& operator=(const ZeroCopyStreamByteSink&) = delete; 31 ~ZeroCopyStreamByteSink()32 ~ZeroCopyStreamByteSink() { 33 if (buffer_size_ > 0) { 34 stream_->BackUp(buffer_size_); 35 } 36 } 37 38 void Append(const char* bytes, size_t len); Write(absl::string_view str)39 void Write(absl::string_view str) { Append(str.data(), str.size()); } 40 bytes_written()41 size_t bytes_written() { return bytes_written_; } failed()42 bool failed() { return failed_; } 43 44 private: 45 io::ZeroCopyOutputStream* stream_; 46 void* buffer_ = nullptr; 47 size_t buffer_size_ = 0; 48 size_t bytes_written_ = 0; 49 bool failed_ = false; 50 }; 51 } // namespace zc_sink_internal 52 } // namespace io 53 } // namespace protobuf 54 } // namespace google 55 56 #include "google/protobuf/port_undef.inc" 57 #endif // GOOGLE_PROTOBUF_UTIL_ZERO_COPY_SINK_H__ 58