Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(412)

Side by Side Diff: base/pickle.h

Issue 39463002: Introduce Pickle::{Read,Write}PODArray to serialize arrays of POD (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | base/pickle.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef BASE_PICKLE_H__ 5 #ifndef BASE_PICKLE_H__
6 #define BASE_PICKLE_H__ 6 #define BASE_PICKLE_H__
7 7
8 #include <string> 8 #include <string>
9 9
10 #include "base/base_export.h" 10 #include "base/base_export.h"
(...skipping 22 matching lines...) Expand all
33 bool ReadUInt16(uint16* result) WARN_UNUSED_RESULT; 33 bool ReadUInt16(uint16* result) WARN_UNUSED_RESULT;
34 bool ReadUInt32(uint32* result) WARN_UNUSED_RESULT; 34 bool ReadUInt32(uint32* result) WARN_UNUSED_RESULT;
35 bool ReadInt64(int64* result) WARN_UNUSED_RESULT; 35 bool ReadInt64(int64* result) WARN_UNUSED_RESULT;
36 bool ReadUInt64(uint64* result) WARN_UNUSED_RESULT; 36 bool ReadUInt64(uint64* result) WARN_UNUSED_RESULT;
37 bool ReadFloat(float* result) WARN_UNUSED_RESULT; 37 bool ReadFloat(float* result) WARN_UNUSED_RESULT;
38 bool ReadString(std::string* result) WARN_UNUSED_RESULT; 38 bool ReadString(std::string* result) WARN_UNUSED_RESULT;
39 bool ReadWString(std::wstring* result) WARN_UNUSED_RESULT; 39 bool ReadWString(std::wstring* result) WARN_UNUSED_RESULT;
40 bool ReadString16(string16* result) WARN_UNUSED_RESULT; 40 bool ReadString16(string16* result) WARN_UNUSED_RESULT;
41 bool ReadData(const char** data, int* length) WARN_UNUSED_RESULT; 41 bool ReadData(const char** data, int* length) WARN_UNUSED_RESULT;
42 bool ReadBytes(const char** data, int length) WARN_UNUSED_RESULT; 42 bool ReadBytes(const char** data, int length) WARN_UNUSED_RESULT;
43 template<size_t n, typename T>
44 bool ReadPODArray(const T** data) WARN_UNUSED_RESULT {
45 const char* char_data;
46 if (!ReadBytes(&char_data, sizeof(T[n])))
47 return false;
48 *data = reinterpret_cast<const T*>(char_data);
49 return true;
50 }
43 51
44 // Safer version of ReadInt() checks for the result not being negative. 52 // Safer version of ReadInt() checks for the result not being negative.
45 // Use it for reading the object sizes. 53 // Use it for reading the object sizes.
46 bool ReadLength(int* result) WARN_UNUSED_RESULT { 54 bool ReadLength(int* result) WARN_UNUSED_RESULT {
47 return ReadInt(result) && *result >= 0; 55 return ReadInt(result) && *result >= 0;
48 } 56 }
49 57
50 // Skips bytes in the read buffer and returns true if there are at least 58 // Skips bytes in the read buffer and returns true if there are at least
51 // num_bytes available. Otherwise, does nothing and returns false. 59 // num_bytes available. Otherwise, does nothing and returns false.
52 bool SkipBytes(int num_bytes) WARN_UNUSED_RESULT { 60 bool SkipBytes(int num_bytes) WARN_UNUSED_RESULT {
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
193 } 201 }
194 // A pointer to the data will be placed in *data. The caller specifies the 202 // A pointer to the data will be placed in *data. The caller specifies the
195 // number of bytes to read, and ReadBytes will validate this length. The 203 // number of bytes to read, and ReadBytes will validate this length. The
196 // returned buffer will be into the message's buffer so will be scoped to the 204 // returned buffer will be into the message's buffer so will be scoped to the
197 // lifetime of the message (or until the message data is mutated). 205 // lifetime of the message (or until the message data is mutated).
198 bool ReadBytes(PickleIterator* iter, 206 bool ReadBytes(PickleIterator* iter,
199 const char** data, 207 const char** data,
200 int length) const WARN_UNUSED_RESULT { 208 int length) const WARN_UNUSED_RESULT {
201 return iter->ReadBytes(data, length); 209 return iter->ReadBytes(data, length);
202 } 210 }
211 // A pointer to the data will be placed in *data. The caller specifies the
212 // number of objects to read as a template parameter. The returned buffer will
213 // be into the message's buffer so will be scoped to the lifetime of the
214 // message (or until the message data is mutated).
215 // Example usage:
216 // const Type* data;
217 // if (pickle.ReadPODArray<4>(&data)) {
218 // DoSomething(data[0], data[1], data[2], data[3]);
219 // }
220 template<size_t n, typename T> bool ReadPODArray(
221 PickleIterator* iter,
222 const T** data) const WARN_UNUSED_RESULT {
223 return iter->ReadPODArray<n>(data);
224 }
203 225
204 // Safer version of ReadInt() checks for the result not being negative. 226 // Safer version of ReadInt() checks for the result not being negative.
205 // Use it for reading the object sizes. 227 // Use it for reading the object sizes.
206 bool ReadLength(PickleIterator* iter, 228 bool ReadLength(PickleIterator* iter,
207 int* result) const WARN_UNUSED_RESULT { 229 int* result) const WARN_UNUSED_RESULT {
208 return iter->ReadLength(result); 230 return iter->ReadLength(result);
209 } 231 }
210 232
211 // Methods for adding to the payload of the Pickle. These values are 233 // Methods for adding to the payload of the Pickle. These values are
212 // appended to the end of the Pickle's payload. When reading values from a 234 // appended to the end of the Pickle's payload. When reading values from a
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
245 bool WriteWString(const std::wstring& value); 267 bool WriteWString(const std::wstring& value);
246 bool WriteString16(const string16& value); 268 bool WriteString16(const string16& value);
247 // "Data" is a blob with a length. When you read it out you will be given the 269 // "Data" is a blob with a length. When you read it out you will be given the
248 // length. See also WriteBytes. 270 // length. See also WriteBytes.
249 bool WriteData(const char* data, int length); 271 bool WriteData(const char* data, int length);
250 // "Bytes" is a blob with no length. The caller must specify the length both 272 // "Bytes" is a blob with no length. The caller must specify the length both
251 // when reading and writing. It is normally used to serialize PoD types of a 273 // when reading and writing. It is normally used to serialize PoD types of a
252 // known size. See also WriteData. 274 // known size. See also WriteData.
253 bool WriteBytes(const void* data, int length); 275 bool WriteBytes(const void* data, int length);
254 276
277 // Writes a fixed-size POD array by copying its bytes. Use as:
278 // Type data[4] = {...}
279 // pickle.WritePODArray<4>(data);
280 template <size_t n, typename T> void WritePODArray(const T* data) {
281 WriteBytesStatic<sizeof(T[n])>(data);
282 }
283
255 // Reserves space for upcoming writes when multiple writes will be made and 284 // Reserves space for upcoming writes when multiple writes will be made and
256 // their sizes are computed in advance. It can be significantly faster to call 285 // their sizes are computed in advance. It can be significantly faster to call
257 // Reserve() before calling WriteFoo() multiple times. 286 // Reserve() before calling WriteFoo() multiple times.
258 void Reserve(size_t additional_capacity); 287 void Reserve(size_t additional_capacity);
259 288
260 // Payload follows after allocation of Header (header size is customizable). 289 // Payload follows after allocation of Header (header size is customizable).
261 struct Header { 290 struct Header {
262 uint32 payload_size; // Specifies the size of the payload. 291 uint32 payload_size; // Specifies the size of the payload.
263 }; 292 };
264 293
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
338 return true; 367 return true;
339 } 368 }
340 inline void WriteBytesCommon(const void* data, size_t length); 369 inline void WriteBytesCommon(const void* data, size_t length);
341 370
342 FRIEND_TEST_ALL_PREFIXES(PickleTest, Resize); 371 FRIEND_TEST_ALL_PREFIXES(PickleTest, Resize);
343 FRIEND_TEST_ALL_PREFIXES(PickleTest, FindNext); 372 FRIEND_TEST_ALL_PREFIXES(PickleTest, FindNext);
344 FRIEND_TEST_ALL_PREFIXES(PickleTest, FindNextWithIncompleteHeader); 373 FRIEND_TEST_ALL_PREFIXES(PickleTest, FindNextWithIncompleteHeader);
345 }; 374 };
346 375
347 #endif // BASE_PICKLE_H__ 376 #endif // BASE_PICKLE_H__
OLDNEW
« no previous file with comments | « no previous file | base/pickle.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698