| Index: third_party/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.h
|
| diff --git a/third_party/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.h b/third_party/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.h
|
| index 153f543ee4b0cb25656f86c09b3a5bc4349aba9a..a598ef2e3d196cd37c718fc87f5b543beb7ab7b2 100644
|
| --- a/third_party/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.h
|
| +++ b/third_party/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.h
|
| @@ -1,6 +1,6 @@
|
| // Protocol Buffers - Google's data interchange format
|
| // Copyright 2008 Google Inc. All rights reserved.
|
| -// http://code.google.com/p/protobuf/
|
| +// https://developers.google.com/protocol-buffers/
|
| //
|
| // Redistribution and use in source and binary forms, with or without
|
| // modification, are permitted provided that the following conditions are
|
| @@ -44,10 +44,16 @@
|
| #ifndef GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_LITE_H__
|
| #define GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_LITE_H__
|
|
|
| +#include <memory>
|
| +#ifndef _SHARED_PTR_H
|
| +#include <google/protobuf/stubs/shared_ptr.h>
|
| +#endif
|
| #include <string>
|
| #include <iosfwd>
|
| #include <google/protobuf/io/zero_copy_stream.h>
|
| #include <google/protobuf/stubs/common.h>
|
| +#include <google/protobuf/stubs/scoped_ptr.h>
|
| +#include <google/protobuf/stubs/stl_util.h>
|
|
|
|
|
| namespace google {
|
| @@ -126,8 +132,10 @@ class LIBPROTOBUF_EXPORT ArrayOutputStream : public ZeroCopyOutputStream {
|
| class LIBPROTOBUF_EXPORT StringOutputStream : public ZeroCopyOutputStream {
|
| public:
|
| // Create a StringOutputStream which appends bytes to the given string.
|
| - // The string remains property of the caller, but it MUST NOT be accessed
|
| - // in any way until the stream is destroyed.
|
| + // The string remains property of the caller, but it is mutated in arbitrary
|
| + // ways and MUST NOT be accessed in any way until you're done with the
|
| + // stream. Either be sure there's no further usage, or (safest) destroy the
|
| + // stream before using the contents.
|
| //
|
| // Hint: If you call target->reserve(n) before creating the stream,
|
| // the first call to Next() will return at least n bytes of buffer
|
| @@ -231,7 +239,7 @@ class LIBPROTOBUF_EXPORT CopyingInputStreamAdaptor : public ZeroCopyInputStream
|
|
|
| // Data is read into this buffer. It may be NULL if no buffer is currently
|
| // in use. Otherwise, it points to an array of size buffer_size_.
|
| - scoped_array<uint8> buffer_;
|
| + google::protobuf::scoped_array<uint8> buffer_;
|
| const int buffer_size_;
|
|
|
| // Number of valid bytes currently in the buffer (i.e. the size last
|
| @@ -320,7 +328,7 @@ class LIBPROTOBUF_EXPORT CopyingOutputStreamAdaptor : public ZeroCopyOutputStrea
|
|
|
| // Data is written from this buffer. It may be NULL if no buffer is
|
| // currently in use. Otherwise, it points to an array of size buffer_size_.
|
| - scoped_array<uint8> buffer_;
|
| + google::protobuf::scoped_array<uint8> buffer_;
|
| const int buffer_size_;
|
|
|
| // Number of valid bytes currently in the buffer (i.e. the size last
|
| @@ -333,6 +341,44 @@ class LIBPROTOBUF_EXPORT CopyingOutputStreamAdaptor : public ZeroCopyOutputStrea
|
|
|
| // ===================================================================
|
|
|
| +// mutable_string_data() and as_string_data() are workarounds to improve
|
| +// the performance of writing new data to an existing string. Unfortunately
|
| +// the methods provided by the string class are suboptimal, and using memcpy()
|
| +// is mildly annoying because it requires its pointer args to be non-NULL even
|
| +// if we ask it to copy 0 bytes. Furthermore, string_as_array() has the
|
| +// property that it always returns NULL if its arg is the empty string, exactly
|
| +// what we want to avoid if we're using it in conjunction with memcpy()!
|
| +// With C++11, the desired memcpy() boils down to memcpy(..., &(*s)[0], size),
|
| +// where s is a string*. Without C++11, &(*s)[0] is not guaranteed to be safe,
|
| +// so we use string_as_array(), and live with the extra logic that tests whether
|
| +// *s is empty.
|
| +
|
| +// Return a pointer to mutable characters underlying the given string. The
|
| +// return value is valid until the next time the string is resized. We
|
| +// trust the caller to treat the return value as an array of length s->size().
|
| +inline char* mutable_string_data(string* s) {
|
| +#ifdef LANG_CXX11
|
| + // This should be simpler & faster than string_as_array() because the latter
|
| + // is guaranteed to return NULL when *s is empty, so it has to check for that.
|
| + return &(*s)[0];
|
| +#else
|
| + return string_as_array(s);
|
| +#endif
|
| +}
|
| +
|
| +// as_string_data(s) is equivalent to
|
| +// ({ char* p = mutable_string_data(s); make_pair(p, p != NULL); })
|
| +// Sometimes it's faster: in some scenarios p cannot be NULL, and then the
|
| +// code can avoid that check.
|
| +inline std::pair<char*, bool> as_string_data(string* s) {
|
| + char *p = mutable_string_data(s);
|
| +#ifdef LANG_CXX11
|
| + return std::make_pair(p, true);
|
| +#else
|
| + return make_pair(p, p != NULL);
|
| +#endif
|
| +}
|
| +
|
| } // namespace io
|
| } // namespace protobuf
|
|
|
|
|