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

Side by Side Diff: base/pickle.h

Issue 34413002: Pickle::Write* micro-optimizations (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase on top of latest https://codereview.chromium.org/35893002/ , fold Resize-returns-void here 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 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 } 209 }
210 210
211 // Methods for adding to the payload of the Pickle. These values are 211 // 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 212 // appended to the end of the Pickle's payload. When reading values from a
213 // Pickle, it is important to read them in the order in which they were added 213 // Pickle, it is important to read them in the order in which they were added
214 // to the Pickle. 214 // to the Pickle.
215 bool WriteBool(bool value) { 215 bool WriteBool(bool value) {
216 return WriteInt(value ? 1 : 0); 216 return WriteInt(value ? 1 : 0);
217 } 217 }
218 bool WriteInt(int value) { 218 bool WriteInt(int value) {
219 return WriteBytes(&value, sizeof(value)); 219 return WritePOD(value);
220 } 220 }
221 // WARNING: DO NOT USE THIS METHOD IF PICKLES ARE PERSISTED IN ANY WAY. 221 // WARNING: DO NOT USE THIS METHOD IF PICKLES ARE PERSISTED IN ANY WAY.
222 // It will write whatever a "long" is on this architecture. On 32-bit 222 // It will write whatever a "long" is on this architecture. On 32-bit
223 // platforms, it is 32 bits. On 64-bit platforms, it is 64 bits. If persisted 223 // platforms, it is 32 bits. On 64-bit platforms, it is 64 bits. If persisted
224 // pickles are still around after upgrading to 64-bit, or if they are copied 224 // pickles are still around after upgrading to 64-bit, or if they are copied
225 // between dissimilar systems, YOUR PICKLES WILL HAVE GONE BAD. 225 // between dissimilar systems, YOUR PICKLES WILL HAVE GONE BAD.
226 bool WriteLongUsingDangerousNonPortableLessPersistableForm(long value) { 226 bool WriteLongUsingDangerousNonPortableLessPersistableForm(long value) {
227 return WriteBytes(&value, sizeof(value)); 227 return WritePOD(value);
228 } 228 }
229 bool WriteUInt16(uint16 value) { 229 bool WriteUInt16(uint16 value) {
230 return WriteBytes(&value, sizeof(value)); 230 return WritePOD(value);
231 } 231 }
232 bool WriteUInt32(uint32 value) { 232 bool WriteUInt32(uint32 value) {
233 return WriteBytes(&value, sizeof(value)); 233 return WritePOD(value);
234 } 234 }
235 bool WriteInt64(int64 value) { 235 bool WriteInt64(int64 value) {
236 return WriteBytes(&value, sizeof(value)); 236 return WritePOD(value);
237 } 237 }
238 bool WriteUInt64(uint64 value) { 238 bool WriteUInt64(uint64 value) {
239 return WriteBytes(&value, sizeof(value)); 239 return WritePOD(value);
240 } 240 }
241 bool WriteFloat(float value) { 241 bool WriteFloat(float value) {
242 return WriteBytes(&value, sizeof(value)); 242 return WritePOD(value);
243 } 243 }
244 bool WriteString(const std::string& value); 244 bool WriteString(const std::string& value);
245 bool WriteWString(const std::wstring& value); 245 bool WriteWString(const std::wstring& value);
246 bool WriteString16(const string16& value); 246 bool WriteString16(const string16& value);
247 // "Data" is a blob with a length. When you read it out you will be given the 247 // "Data" is a blob with a length. When you read it out you will be given the
248 // length. See also WriteBytes. 248 // length. See also WriteBytes.
249 bool WriteData(const char* data, int length); 249 bool WriteData(const char* data, int length);
250 // "Bytes" is a blob with no length. The caller must specify the lenght both 250 // "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 251 // when reading and writing. It is normally used to serialize PoD types of a
252 // known size. See also WriteData. 252 // known size. See also WriteData.
253 bool WriteBytes(const void* data, int data_len); 253 bool WriteBytes(const void* data, int length);
254 254
255 // Reserves space for upcoming writes when multiple writes will be made and 255 // 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 256 // their sizes are computed in advance. It can be significantly faster to call
257 // Reserve() before calling WriteFoo() multiple times. 257 // Reserve() before calling WriteFoo() multiple times.
258 void Reserve(size_t additional_capacity); 258 void Reserve(size_t additional_capacity);
259 259
260 // Payload follows after allocation of Header (header size is customizable). 260 // Payload follows after allocation of Header (header size is customizable).
261 struct Header { 261 struct Header {
262 uint32 payload_size; // Specifies the size of the payload. 262 uint32 payload_size; // Specifies the size of the payload.
263 }; 263 };
(...skipping 28 matching lines...) Expand all
292 292
293 protected: 293 protected:
294 char* mutable_payload() { 294 char* mutable_payload() {
295 return reinterpret_cast<char*>(header_) + header_size_; 295 return reinterpret_cast<char*>(header_) + header_size_;
296 } 296 }
297 297
298 size_t capacity() const { 298 size_t capacity() const {
299 return capacity_; 299 return capacity_;
300 } 300 }
301 301
302 // Resizes the buffer for use when writing the specified amount of data. The 302 // Resize the capacity, note that the input value should not include the size
303 // location that the data should be written at is returned, or NULL if there 303 // of the header.
304 // was an error. Call EndWrite with the returned offset and the given length 304 void Resize(size_t new_capacity);
305 // to pad out for the next write.
306 char* BeginWrite(size_t length);
307
308 // Completes the write operation by padding the data with NULL bytes until it
309 // is padded. Should be paired with BeginWrite, but it does not necessarily
310 // have to be called after the data is written.
311 void EndWrite(char* dest, int length);
312
313 // Resize the capacity, note that the input value should include the size of
314 // the header: new_capacity = sizeof(Header) + desired_payload_capacity.
315 // A realloc() failure will cause a Resize failure... and caller should check
316 // the return result for true (i.e., successful resizing).
317 bool Resize(size_t new_capacity);
318 305
319 // Aligns 'i' by rounding it up to the next multiple of 'alignment' 306 // Aligns 'i' by rounding it up to the next multiple of 'alignment'
320 static size_t AlignInt(size_t i, int alignment) { 307 static size_t AlignInt(size_t i, int alignment) {
321 return i + (alignment - (i % alignment)) % alignment; 308 return i + (alignment - (i % alignment)) % alignment;
322 } 309 }
323 310
324 // Find the end of the pickled data that starts at range_start. Returns NULL 311 // Find the end of the pickled data that starts at range_start. Returns NULL
325 // if the entire Pickle is not found in the given data range. 312 // if the entire Pickle is not found in the given data range.
326 static const char* FindNext(size_t header_size, 313 static const char* FindNext(size_t header_size,
327 const char* range_start, 314 const char* range_start,
328 const char* range_end); 315 const char* range_end);
329 316
330 // The allocation granularity of the payload. 317 // The allocation granularity of the payload.
331 static const int kPayloadUnit; 318 static const int kPayloadUnit;
332 319
333 private: 320 private:
334 friend class PickleIterator; 321 friend class PickleIterator;
335 322
336 Header* header_; 323 Header* header_;
337 size_t header_size_; // Supports extra data between header and payload. 324 size_t header_size_; // Supports extra data between header and payload.
338 // Allocation size of payload (or -1 if allocation is const). 325 // Allocation size of payload (or -1 if allocation is const). Note: this
326 // doesn't count the header.
339 size_t capacity_; 327 size_t capacity_;
jar (doing other things) 2013/10/29 16:50:48 How about changing this name to: capacity_after_he
piman 2013/10/30 20:29:06 Done.
328 // The offset at which we will write the next field. Note: this doesn't count
329 // the header.
330 size_t write_offset_;
331
332 // Just like WriteBytes, but with a compile-time size, for performance.
333 template<size_t length> void WriteBytesStatic(const void* data);
334
335 // Writes a POD by copying its bytes.
336 template <typename T> bool WritePOD(const T& data) {
337 WriteBytesStatic<sizeof(data)>(&data);
338 return true;
339 }
340 inline void WriteBytesCommon(const void* data, size_t length);
340 341
341 FRIEND_TEST_ALL_PREFIXES(PickleTest, Resize); 342 FRIEND_TEST_ALL_PREFIXES(PickleTest, Resize);
342 FRIEND_TEST_ALL_PREFIXES(PickleTest, FindNext); 343 FRIEND_TEST_ALL_PREFIXES(PickleTest, FindNext);
343 FRIEND_TEST_ALL_PREFIXES(PickleTest, FindNextWithIncompleteHeader); 344 FRIEND_TEST_ALL_PREFIXES(PickleTest, FindNextWithIncompleteHeader);
344 }; 345 };
345 346
346 #endif // BASE_PICKLE_H__ 347 #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