zero_copy_stream_impl_lite.cc
Go to the documentation of this file.
1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2008 Google Inc. All rights reserved.
3 // https://developers.google.com/protocol-buffers/
4 //
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are
7 // met:
8 //
9 // * Redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer.
11 // * Redistributions in binary form must reproduce the above
12 // copyright notice, this list of conditions and the following disclaimer
13 // in the documentation and/or other materials provided with the
14 // distribution.
15 // * Neither the name of Google Inc. nor the names of its
16 // contributors may be used to endorse or promote products derived from
17 // this software without specific prior written permission.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 
31 // Author: kenton@google.com (Kenton Varda)
32 // Based on original Protocol Buffers design by
33 // Sanjay Ghemawat, Jeff Dean, and others.
34 
36 
37 #include <algorithm>
38 #include <limits>
39 
44 
45 namespace google {
46 namespace protobuf {
47 namespace io {
48 
49 namespace {
50 
51 // Default block size for Copying{In,Out}putStreamAdaptor.
52 static const int kDefaultBlockSize = 8192;
53 
54 } // namespace
55 
56 // ===================================================================
57 
58 ArrayInputStream::ArrayInputStream(const void* data, int size, int block_size)
59  : data_(reinterpret_cast<const uint8*>(data)),
60  size_(size),
61  block_size_(block_size > 0 ? block_size : size),
62  position_(0),
63  last_returned_size_(0) {}
64 
65 bool ArrayInputStream::Next(const void** data, int* size) {
66  if (position_ < size_) {
68  *data = data_ + position_;
71  return true;
72  } else {
73  // We're at the end of the array.
74  last_returned_size_ = 0; // Don't let caller back up.
75  return false;
76  }
77 }
78 
81  << "BackUp() can only be called after a successful Next().";
84  position_ -= count;
85  last_returned_size_ = 0; // Don't let caller back up further.
86 }
87 
90  last_returned_size_ = 0; // Don't let caller back up.
91  if (count > size_ - position_) {
92  position_ = size_;
93  return false;
94  } else {
95  position_ += count;
96  return true;
97  }
98 }
99 
101 
102 
103 // ===================================================================
104 
105 ArrayOutputStream::ArrayOutputStream(void* data, int size, int block_size)
106  : data_(reinterpret_cast<uint8*>(data)),
107  size_(size),
108  block_size_(block_size > 0 ? block_size : size),
109  position_(0),
110  last_returned_size_(0) {}
111 
112 bool ArrayOutputStream::Next(void** data, int* size) {
113  if (position_ < size_) {
115  *data = data_ + position_;
118  return true;
119  } else {
120  // We're at the end of the array.
121  last_returned_size_ = 0; // Don't let caller back up.
122  return false;
123  }
124 }
125 
128  << "BackUp() can only be called after a successful Next().";
131  position_ -= count;
132  last_returned_size_ = 0; // Don't let caller back up further.
133 }
134 
136 
137 // ===================================================================
138 
140 
141 bool StringOutputStream::Next(void** data, int* size) {
143  int old_size = target_->size();
144 
145  // Grow the string.
146  if (old_size < target_->capacity()) {
147  // Resize the string to match its capacity, since we can get away
148  // without a memory allocation this way.
150  } else {
151  // Size has reached capacity, try to double the size.
152  if (old_size > std::numeric_limits<int>::max() / 2) {
153  // Can not double the size otherwise it is going to cause integer
154  // overflow in the expression below: old_size * 2 ";
155  GOOGLE_LOG(ERROR) << "Cannot allocate buffer larger than kint32max for "
156  << "StringOutputStream.";
157  return false;
158  }
159  // Double the size, also make sure that the new size is at least
160  // kMinimumSize.
162  target_,
163  std::max(old_size * 2,
164  kMinimumSize + 0)); // "+ 0" works around GCC4 weirdness.
165  }
166 
167  *data = mutable_string_data(target_) + old_size;
168  *size = target_->size() - old_size;
169  return true;
170 }
171 
175  GOOGLE_CHECK_LE(count, target_->size());
176  target_->resize(target_->size() - count);
177 }
178 
181  return target_->size();
182 }
183 
184 // ===================================================================
185 
187  char junk[4096];
188  int skipped = 0;
189  while (skipped < count) {
190  int bytes = Read(junk, std::min(count - skipped,
191  implicit_cast<int>(sizeof(junk))));
192  if (bytes <= 0) {
193  // EOF or read error.
194  return skipped;
195  }
196  skipped += bytes;
197  }
198  return skipped;
199 }
200 
202  CopyingInputStream* copying_stream, int block_size)
203  : copying_stream_(copying_stream),
204  owns_copying_stream_(false),
205  failed_(false),
206  position_(0),
207  buffer_size_(block_size > 0 ? block_size : kDefaultBlockSize),
208  buffer_used_(0),
209  backup_bytes_(0) {}
210 
212  if (owns_copying_stream_) {
213  delete copying_stream_;
214  }
215 }
216 
217 bool CopyingInputStreamAdaptor::Next(const void** data, int* size) {
218  if (failed_) {
219  // Already failed on a previous read.
220  return false;
221  }
222 
224 
225  if (backup_bytes_ > 0) {
226  // We have data left over from a previous BackUp(), so just return that.
227  *data = buffer_.get() + buffer_used_ - backup_bytes_;
228  *size = backup_bytes_;
229  backup_bytes_ = 0;
230  return true;
231  }
232 
233  // Read new data into the buffer.
235  if (buffer_used_ <= 0) {
236  // EOF or read error. We don't need the buffer anymore.
237  if (buffer_used_ < 0) {
238  // Read error (not EOF).
239  failed_ = true;
240  }
241  FreeBuffer();
242  return false;
243  }
245 
246  *size = buffer_used_;
247  *data = buffer_.get();
248  return true;
249 }
250 
252  GOOGLE_CHECK(backup_bytes_ == 0 && buffer_.get() != NULL)
253  << " BackUp() can only be called after Next().";
255  << " Can't back up over more bytes than were returned by the last call"
256  " to Next().";
257  GOOGLE_CHECK_GE(count, 0) << " Parameter to BackUp() can't be negative.";
258 
260 }
261 
264 
265  if (failed_) {
266  // Already failed on a previous read.
267  return false;
268  }
269 
270  // First skip any bytes left over from a previous BackUp().
271  if (backup_bytes_ >= count) {
272  // We have more data left over than we're trying to skip. Just chop it.
273  backup_bytes_ -= count;
274  return true;
275  }
276 
277  count -= backup_bytes_;
278  backup_bytes_ = 0;
279 
280  int skipped = copying_stream_->Skip(count);
281  position_ += skipped;
282  return skipped == count;
283 }
284 
286  return position_ - backup_bytes_;
287 }
288 
290  if (buffer_.get() == NULL) {
291  buffer_.reset(new uint8[buffer_size_]);
292  }
293 }
294 
297  buffer_used_ = 0;
298  buffer_.reset();
299 }
300 
301 // ===================================================================
302 
304  CopyingOutputStream* copying_stream, int block_size)
305  : copying_stream_(copying_stream),
306  owns_copying_stream_(false),
307  failed_(false),
308  position_(0),
309  buffer_size_(block_size > 0 ? block_size : kDefaultBlockSize),
310  buffer_used_(0) {}
311 
313  WriteBuffer();
314  if (owns_copying_stream_) {
315  delete copying_stream_;
316  }
317 }
318 
320 
322  if (buffer_used_ == buffer_size_) {
323  if (!WriteBuffer()) return false;
324  }
325 
327 
328  *data = buffer_.get() + buffer_used_;
331  return true;
332 }
333 
337  << " BackUp() can only be called after Next().";
339  << " Can't back up over more bytes than were returned by the last call"
340  " to Next().";
341 
342  buffer_used_ -= count;
343 }
344 
346  return position_ + buffer_used_;
347 }
348 
350  if (failed_) {
351  // Already failed on a previous write.
352  return false;
353  }
354 
355  if (buffer_used_ == 0) return true;
356 
357  if (copying_stream_->Write(buffer_.get(), buffer_used_)) {
359  buffer_used_ = 0;
360  return true;
361  } else {
362  failed_ = true;
363  FreeBuffer();
364  return false;
365  }
366 }
367 
369  if (buffer_ == NULL) {
370  buffer_.reset(new uint8[buffer_size_]);
371  }
372 }
373 
375  buffer_used_ = 0;
376  buffer_.reset();
377 }
378 
379 // ===================================================================
380 
382  int64 limit)
383  : input_(input), limit_(limit) {
385 }
386 
388  // If we overshot the limit, back up.
389  if (limit_ < 0) input_->BackUp(-limit_);
390 }
391 
392 bool LimitingInputStream::Next(const void** data, int* size) {
393  if (limit_ <= 0) return false;
394  if (!input_->Next(data, size)) return false;
395 
396  limit_ -= *size;
397  if (limit_ < 0) {
398  // We overshot the limit. Reduce *size to hide the rest of the buffer.
399  *size += limit_;
400  }
401  return true;
402 }
403 
405  if (limit_ < 0) {
407  limit_ = count;
408  } else {
409  input_->BackUp(count);
410  limit_ += count;
411  }
412 }
413 
415  if (count > limit_) {
416  if (limit_ < 0) return false;
417  input_->Skip(limit_);
418  limit_ = 0;
419  return false;
420  } else {
421  if (!input_->Skip(count)) return false;
422  limit_ -= count;
423  return true;
424  }
425 }
426 
428  if (limit_ < 0) {
430  } else {
431  return input_->ByteCount() - prior_bytes_read_;
432  }
433 }
434 
435 
436 // ===================================================================
437 
438 } // namespace io
439 } // namespace protobuf
440 } // namespace google
google::protobuf::io::CopyingInputStreamAdaptor::FreeBuffer
void FreeBuffer()
Definition: zero_copy_stream_impl_lite.cc:295
google::protobuf::io::CopyingInputStreamAdaptor::CopyingInputStreamAdaptor
CopyingInputStreamAdaptor(CopyingInputStream *copying_stream, int block_size=-1)
Definition: zero_copy_stream_impl_lite.cc:201
block_size_
int block_size_
Definition: bytestream_unittest.cc:61
google::protobuf::io::CopyingOutputStream
Definition: zero_copy_stream_impl_lite.h:269
GOOGLE_CHECK_EQ
#define GOOGLE_CHECK_EQ(A, B)
Definition: logging.h:156
google::protobuf::io::CopyingInputStream::Read
virtual int Read(void *buffer, int size)=0
data_
StringPiece data_
Definition: bytestream_unittest.cc:60
google::protobuf::io::ZeroCopyInputStream::Skip
virtual bool Skip(int count)=0
google::protobuf::io::CopyingInputStreamAdaptor::Next
bool Next(const void **data, int *size) override
Definition: zero_copy_stream_impl_lite.cc:217
google::protobuf::io::CopyingInputStreamAdaptor::buffer_
std::unique_ptr< uint8[]> buffer_
Definition: zero_copy_stream_impl_lite.h:241
google::protobuf::io::LimitingInputStream::Skip
bool Skip(int count) override
Definition: zero_copy_stream_impl_lite.cc:414
benchmarks.python.py_benchmark.const
const
Definition: py_benchmark.py:14
google::protobuf::io::CopyingOutputStreamAdaptor::CopyingOutputStreamAdaptor
CopyingOutputStreamAdaptor(CopyingOutputStream *copying_stream, int block_size=-1)
Definition: zero_copy_stream_impl_lite.cc:303
google::protobuf::io::CopyingInputStreamAdaptor::failed_
bool failed_
Definition: zero_copy_stream_impl_lite.h:233
NULL
NULL
Definition: test_security_zap.cpp:405
input_
std::unique_ptr< io::Tokenizer > input_
Definition: parser_unittest.cc:186
google::protobuf::io::ArrayInputStream::ByteCount
int64 ByteCount() const override
Definition: zero_copy_stream_impl_lite.cc:100
google::protobuf::int64
int64_t int64
Definition: protobuf/src/google/protobuf/stubs/port.h:151
google::protobuf::io::LimitingInputStream::LimitingInputStream
LimitingInputStream(ZeroCopyInputStream *input, int64 limit)
Definition: zero_copy_stream_impl_lite.cc:381
google::protobuf::io::ArrayInputStream::Skip
bool Skip(int count) override
Definition: zero_copy_stream_impl_lite.cc:88
google::protobuf::io::ArrayInputStream::position_
int position_
Definition: zero_copy_stream_impl_lite.h:89
input
std::string input
Definition: tokenizer_unittest.cc:197
google::protobuf::uint8
uint8_t uint8
Definition: protobuf/src/google/protobuf/stubs/port.h:153
google::protobuf::io::ArrayInputStream::data_
const uint8 *const data_
Definition: zero_copy_stream_impl_lite.h:85
google::protobuf::io::mutable_string_data
char * mutable_string_data(std::string *s)
Definition: zero_copy_stream_impl_lite.h:383
google::protobuf::io::LimitingInputStream::Next
bool Next(const void **data, int *size) override
Definition: zero_copy_stream_impl_lite.cc:392
google::protobuf::io::StringOutputStream::target_
std::string * target_
Definition: zero_copy_stream_impl_lite.h:153
google::protobuf::io::CopyingOutputStreamAdaptor::position_
int64 position_
Definition: zero_copy_stream_impl_lite.h:326
google::protobuf::io::LimitingInputStream::limit_
int64 limit_
Definition: zero_copy_stream_impl_lite.h:359
google::protobuf::io::ArrayInputStream::block_size_
const int block_size_
Definition: zero_copy_stream_impl_lite.h:87
google::protobuf::io::CopyingOutputStreamAdaptor::owns_copying_stream_
bool owns_copying_stream_
Definition: zero_copy_stream_impl_lite.h:319
string
GLsizei const GLchar *const * string
Definition: glcorearb.h:3083
target
GLenum target
Definition: glcorearb.h:3739
google::protobuf::io::LimitingInputStream::prior_bytes_read_
int64 prior_bytes_read_
Definition: zero_copy_stream_impl_lite.h:360
google::protobuf::io::LimitingInputStream::ByteCount
int64 ByteCount() const override
Definition: zero_copy_stream_impl_lite.cc:427
google::protobuf::io::ZeroCopyInputStream::ByteCount
virtual int64 ByteCount() const =0
bytes
uint8 bytes[10]
Definition: coded_stream_unittest.cc:153
google::protobuf::io::CopyingOutputStreamAdaptor::AllocateBufferIfNeeded
void AllocateBufferIfNeeded()
Definition: zero_copy_stream_impl_lite.cc:368
GOOGLE_CHECK_GT
#define GOOGLE_CHECK_GT(A, B)
Definition: logging.h:160
google::protobuf::io::CopyingInputStreamAdaptor::Skip
bool Skip(int count) override
Definition: zero_copy_stream_impl_lite.cc:262
google::protobuf::io::StringOutputStream::StringOutputStream
StringOutputStream(std::string *target)
Definition: zero_copy_stream_impl_lite.cc:139
google::protobuf::io::ArrayInputStream::BackUp
void BackUp(int count) override
Definition: zero_copy_stream_impl_lite.cc:79
google::protobuf::io::CopyingInputStreamAdaptor::owns_copying_stream_
bool owns_copying_stream_
Definition: zero_copy_stream_impl_lite.h:230
google::protobuf::io::ArrayOutputStream::data_
uint8 *const data_
Definition: zero_copy_stream_impl_lite.h:117
google::protobuf::io::StringOutputStream::kMinimumSize
static const int kMinimumSize
Definition: zero_copy_stream_impl_lite.h:151
google::protobuf::io::ArrayInputStream::ArrayInputStream
ArrayInputStream(const void *data, int size, int block_size=-1)
Definition: zero_copy_stream_impl_lite.cc:58
google::protobuf::io::CopyingOutputStreamAdaptor::Next
bool Next(void **data, int *size) override
Definition: zero_copy_stream_impl_lite.cc:321
google::protobuf::io::ArrayOutputStream::ByteCount
int64 ByteCount() const override
Definition: zero_copy_stream_impl_lite.cc:135
google::protobuf::io::ArrayOutputStream::position_
int position_
Definition: zero_copy_stream_impl_lite.h:121
google::protobuf::io::CopyingInputStreamAdaptor::buffer_size_
const int buffer_size_
Definition: zero_copy_stream_impl_lite.h:242
google::protobuf::io::CopyingOutputStreamAdaptor::failed_
bool failed_
Definition: zero_copy_stream_impl_lite.h:322
google::protobuf::io::ArrayOutputStream::BackUp
void BackUp(int count) override
Definition: zero_copy_stream_impl_lite.cc:126
google::protobuf::io::StringOutputStream::Next
bool Next(void **data, int *size) override
Definition: zero_copy_stream_impl_lite.cc:141
GOOGLE_LOG
#define GOOGLE_LOG(LEVEL)
Definition: logging.h:146
google::protobuf::io::ArrayOutputStream::last_returned_size_
int last_returned_size_
Definition: zero_copy_stream_impl_lite.h:122
google::protobuf::io::CopyingInputStreamAdaptor::ByteCount
int64 ByteCount() const override
Definition: zero_copy_stream_impl_lite.cc:285
size
#define size
Definition: glcorearb.h:2944
google::protobuf::io::CopyingOutputStreamAdaptor::copying_stream_
CopyingOutputStream * copying_stream_
Definition: zero_copy_stream_impl_lite.h:318
google::protobuf::io::ArrayOutputStream::Next
bool Next(void **data, int *size) override
Definition: zero_copy_stream_impl_lite.cc:112
GOOGLE_CHECK_LE
#define GOOGLE_CHECK_LE(A, B)
Definition: logging.h:159
casts.h
google::protobuf::io::CopyingInputStreamAdaptor::AllocateBufferIfNeeded
void AllocateBufferIfNeeded()
Definition: zero_copy_stream_impl_lite.cc:289
google::protobuf::ERROR
static const LogLevel ERROR
Definition: protobuf/src/google/protobuf/testing/googletest.h:70
google::protobuf::io::ArrayInputStream::size_
const int size_
Definition: zero_copy_stream_impl_lite.h:86
google::protobuf::io::ArrayOutputStream::ArrayOutputStream
ArrayOutputStream(void *data, int size, int block_size=-1)
Definition: zero_copy_stream_impl_lite.cc:105
google::protobuf::io::StringOutputStream::BackUp
void BackUp(int count) override
Definition: zero_copy_stream_impl_lite.cc:172
GOOGLE_CHECK
#define GOOGLE_CHECK(EXPRESSION)
Definition: logging.h:153
google::protobuf::io::ZeroCopyInputStream
Definition: zero_copy_stream.h:126
zero_copy_stream_impl_lite.h
google::protobuf::io::ArrayInputStream::Next
bool Next(const void **data, int *size) override
Definition: zero_copy_stream_impl_lite.cc:65
google::protobuf::io::CopyingOutputStreamAdaptor::Flush
bool Flush()
Definition: zero_copy_stream_impl_lite.cc:319
google::protobuf::io::CopyingOutputStreamAdaptor::FreeBuffer
void FreeBuffer()
Definition: zero_copy_stream_impl_lite.cc:374
google::protobuf::io::CopyingOutputStreamAdaptor::buffer_used_
int buffer_used_
Definition: zero_copy_stream_impl_lite.h:336
google::protobuf::io::CopyingOutputStreamAdaptor::BackUp
void BackUp(int count) override
Definition: zero_copy_stream_impl_lite.cc:334
common.h
size
GLsizeiptr size
Definition: glcorearb.h:2943
google::protobuf::io::ArrayOutputStream::size_
const int size_
Definition: zero_copy_stream_impl_lite.h:118
stl_util.h
google::protobuf::io::LimitingInputStream::input_
ZeroCopyInputStream * input_
Definition: zero_copy_stream_impl_lite.h:358
google::protobuf::io::CopyingInputStreamAdaptor::buffer_used_
int buffer_used_
Definition: zero_copy_stream_impl_lite.h:246
google::protobuf::io::CopyingOutputStream::Write
virtual bool Write(const void *buffer, int size)=0
google::protobuf::io::CopyingOutputStreamAdaptor::ByteCount
int64 ByteCount() const override
Definition: zero_copy_stream_impl_lite.cc:345
logging.h
GOOGLE_CHECK_GE
#define GOOGLE_CHECK_GE(A, B)
Definition: logging.h:161
google::protobuf::io::CopyingOutputStreamAdaptor::WriteBuffer
bool WriteBuffer()
Definition: zero_copy_stream_impl_lite.cc:349
google::protobuf::io::CopyingInputStreamAdaptor::copying_stream_
CopyingInputStream * copying_stream_
Definition: zero_copy_stream_impl_lite.h:229
google::protobuf::io::StringOutputStream::ByteCount
int64 ByteCount() const override
Definition: zero_copy_stream_impl_lite.cc:179
data
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: glcorearb.h:2879
google::protobuf::io::CopyingInputStream
Definition: zero_copy_stream_impl_lite.h:175
google::protobuf::io::CopyingInputStreamAdaptor::position_
int64 position_
Definition: zero_copy_stream_impl_lite.h:237
google::protobuf::io::ZeroCopyInputStream::BackUp
virtual void BackUp(int count)=0
google::protobuf::io::CopyingOutputStreamAdaptor::~CopyingOutputStreamAdaptor
~CopyingOutputStreamAdaptor() override
Definition: zero_copy_stream_impl_lite.cc:312
google::protobuf::io::CopyingOutputStreamAdaptor::buffer_
std::unique_ptr< uint8[]> buffer_
Definition: zero_copy_stream_impl_lite.h:330
google::protobuf::io::CopyingInputStreamAdaptor::BackUp
void BackUp(int count) override
Definition: zero_copy_stream_impl_lite.cc:251
google::protobuf::io::CopyingInputStream::Skip
virtual int Skip(int count)
Definition: zero_copy_stream_impl_lite.cc:186
google::protobuf::io::ZeroCopyInputStream::Next
virtual bool Next(const void **data, int *size)=0
google::protobuf::io::ArrayInputStream::last_returned_size_
int last_returned_size_
Definition: zero_copy_stream_impl_lite.h:90
google::protobuf::io::LimitingInputStream::~LimitingInputStream
~LimitingInputStream() override
Definition: zero_copy_stream_impl_lite.cc:387
count
GLint GLsizei count
Definition: glcorearb.h:2830
false
#define false
Definition: cJSON.c:70
google::protobuf::io::CopyingInputStreamAdaptor::backup_bytes_
int backup_bytes_
Definition: zero_copy_stream_impl_lite.h:251
google::protobuf::io::CopyingInputStreamAdaptor::~CopyingInputStreamAdaptor
~CopyingInputStreamAdaptor() override
Definition: zero_copy_stream_impl_lite.cc:211
google::protobuf::STLStringResizeUninitialized
void STLStringResizeUninitialized(string *s, size_t new_size)
Definition: stl_util.h:67
google::protobuf::io::CopyingOutputStreamAdaptor::buffer_size_
const int buffer_size_
Definition: zero_copy_stream_impl_lite.h:331
google
Definition: data_proto2_to_proto3_util.h:11
google::protobuf::io::ArrayOutputStream::block_size_
const int block_size_
Definition: zero_copy_stream_impl_lite.h:119
google::protobuf::io::LimitingInputStream::BackUp
void BackUp(int count) override
Definition: zero_copy_stream_impl_lite.cc:404


libaditof
Author(s):
autogenerated on Wed May 21 2025 02:07:02