• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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