Index: base/pickle.h |
diff --git a/base/pickle.h b/base/pickle.h |
index 952ef0dae539f9df1b90bdcea96216c703832e9e..60c97bc2e879e3d9329e4d83eb516494b2a6657a 100644 |
--- a/base/pickle.h |
+++ b/base/pickle.h |
@@ -40,6 +40,14 @@ class BASE_EXPORT PickleIterator { |
bool ReadString16(string16* result) WARN_UNUSED_RESULT; |
bool ReadData(const char** data, int* length) WARN_UNUSED_RESULT; |
bool ReadBytes(const char** data, int length) WARN_UNUSED_RESULT; |
+ template<size_t n, typename T> |
+ bool ReadPODArray(const T** data) WARN_UNUSED_RESULT { |
+ const char* char_data; |
+ if (!ReadBytes(&char_data, sizeof(T[n]))) |
+ return false; |
+ *data = reinterpret_cast<const T*>(char_data); |
+ return true; |
+ } |
// Safer version of ReadInt() checks for the result not being negative. |
// Use it for reading the object sizes. |
@@ -200,6 +208,20 @@ class BASE_EXPORT Pickle { |
int length) const WARN_UNUSED_RESULT { |
return iter->ReadBytes(data, length); |
} |
+ // A pointer to the data will be placed in *data. The caller specifies the |
+ // number of objects to read as a template parameter. The returned buffer will |
+ // be into the message's buffer so will be scoped to the lifetime of the |
+ // message (or until the message data is mutated). |
+ // Example usage: |
+ // const Type* data; |
+ // if (pickle.ReadPODArray<4>(&data)) { |
+ // DoSomething(data[0], data[1], data[2], data[3]); |
+ // } |
+ template<size_t n, typename T> bool ReadPODArray( |
+ PickleIterator* iter, |
+ const T** data) const WARN_UNUSED_RESULT { |
+ return iter->ReadPODArray<n>(data); |
+ } |
// Safer version of ReadInt() checks for the result not being negative. |
// Use it for reading the object sizes. |
@@ -252,6 +274,13 @@ class BASE_EXPORT Pickle { |
// known size. See also WriteData. |
bool WriteBytes(const void* data, int length); |
+ // Writes a fixed-size POD array by copying its bytes. Use as: |
+ // Type data[4] = {...} |
+ // pickle.WritePODArray<4>(data); |
+ template <size_t n, typename T> void WritePODArray(const T* data) { |
+ WriteBytesStatic<sizeof(T[n])>(data); |
+ } |
+ |
// Reserves space for upcoming writes when multiple writes will be made and |
// their sizes are computed in advance. It can be significantly faster to call |
// Reserve() before calling WriteFoo() multiple times. |