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 |