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

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: 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') | base/pickle.cc » ('J')
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 WriteBytesStatic<sizeof(value)>(&value);
220 return true;
220 } 221 }
221 // WARNING: DO NOT USE THIS METHOD IF PICKLES ARE PERSISTED IN ANY WAY. 222 // 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 223 // 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 224 // 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 225 // pickles are still around after upgrading to 64-bit, or if they are copied
225 // between dissimilar systems, YOUR PICKLES WILL HAVE GONE BAD. 226 // between dissimilar systems, YOUR PICKLES WILL HAVE GONE BAD.
226 bool WriteLongUsingDangerousNonPortableLessPersistableForm(long value) { 227 bool WriteLongUsingDangerousNonPortableLessPersistableForm(long value) {
227 return WriteBytes(&value, sizeof(value)); 228 WriteBytesStatic<sizeof(value)>(&value);
229 return true;
228 } 230 }
229 bool WriteUInt16(uint16 value) { 231 bool WriteUInt16(uint16 value) {
230 return WriteBytes(&value, sizeof(value)); 232 WriteBytesStatic<sizeof(value)>(&value);
233 return true;
231 } 234 }
232 bool WriteUInt32(uint32 value) { 235 bool WriteUInt32(uint32 value) {
233 return WriteBytes(&value, sizeof(value)); 236 WriteBytesStatic<sizeof(value)>(&value);
237 return true;
234 } 238 }
235 bool WriteInt64(int64 value) { 239 bool WriteInt64(int64 value) {
236 return WriteBytes(&value, sizeof(value)); 240 WriteBytesStatic<sizeof(value)>(&value);
241 return true;
237 } 242 }
238 bool WriteUInt64(uint64 value) { 243 bool WriteUInt64(uint64 value) {
239 return WriteBytes(&value, sizeof(value)); 244 WriteBytesStatic<sizeof(value)>(&value);
245 return true;
240 } 246 }
241 bool WriteFloat(float value) { 247 bool WriteFloat(float value) {
242 return WriteBytes(&value, sizeof(value)); 248 WriteBytesStatic<sizeof(value)>(&value);
249 return true;
243 } 250 }
244 bool WriteString(const std::string& value); 251 bool WriteString(const std::string& value);
245 bool WriteWString(const std::wstring& value); 252 bool WriteWString(const std::wstring& value);
246 bool WriteString16(const string16& value); 253 bool WriteString16(const string16& value);
247 // "Data" is a blob with a length. When you read it out you will be given the 254 // "Data" is a blob with a length. When you read it out you will be given the
248 // length. See also WriteBytes. 255 // length. See also WriteBytes.
249 bool WriteData(const char* data, int length); 256 bool WriteData(const char* data, int length);
250 // "Bytes" is a blob with no length. The caller must specify the lenght both 257 // "Bytes" is a blob with no length. The caller must specify the lenght both
251 // when reading and writing. It is normally used to serialize PoD types of a 258 // when reading and writing. It is normally used to serialize PoD types of a
252 // known size. See also WriteData. 259 // known size. See also WriteData.
(...skipping 13 matching lines...) Expand all
266 // with BeginWriteData), the Pickle can 273 // with BeginWriteData), the Pickle can
267 // be 'trimmed' if the amount of data required is less than originally 274 // be 'trimmed' if the amount of data required is less than originally
268 // requested. For example, you may have created a buffer with 10K of data, 275 // requested. For example, you may have created a buffer with 10K of data,
269 // but decided to only fill 10 bytes of that data. Use this function 276 // but decided to only fill 10 bytes of that data. Use this function
270 // to trim the buffer so that we don't send 9990 bytes of unused data. 277 // to trim the buffer so that we don't send 9990 bytes of unused data.
271 // You cannot increase the size of the variable buffer; only shrink it. 278 // You cannot increase the size of the variable buffer; only shrink it.
272 // This function assumes that the length of the variable buffer has 279 // This function assumes that the length of the variable buffer has
273 // not been changed. 280 // not been changed.
274 void TrimWriteData(int length); 281 void TrimWriteData(int length);
275 282
283 void Reserve(size_t size);
284
276 // Payload follows after allocation of Header (header size is customizable). 285 // Payload follows after allocation of Header (header size is customizable).
277 struct Header { 286 struct Header {
278 uint32 payload_size; // Specifies the size of the payload. 287 uint32 payload_size; // Specifies the size of the payload.
279 }; 288 };
280 289
281 // Returns the header, cast to a user-specified type T. The type T must be a 290 // Returns the header, cast to a user-specified type T. The type T must be a
282 // subclass of Header and its size must correspond to the header_size passed 291 // subclass of Header and its size must correspond to the header_size passed
283 // to the Pickle constructor. 292 // to the Pickle constructor.
284 template <class T> 293 template <class T>
285 T* headerT() { 294 T* headerT() {
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 static const int kPayloadUnit; 356 static const int kPayloadUnit;
348 357
349 private: 358 private:
350 friend class PickleIterator; 359 friend class PickleIterator;
351 360
352 Header* header_; 361 Header* header_;
353 size_t header_size_; // Supports extra data between header and payload. 362 size_t header_size_; // Supports extra data between header and payload.
354 // Allocation size of payload (or -1 if allocation is const). 363 // Allocation size of payload (or -1 if allocation is const).
355 size_t capacity_; 364 size_t capacity_;
356 size_t variable_buffer_offset_; // IF non-zero, then offset to a buffer. 365 size_t variable_buffer_offset_; // IF non-zero, then offset to a buffer.
366 size_t offset_;
367
368 template<size_t length> void WriteBytesStatic(const void* data);
357 369
358 FRIEND_TEST_ALL_PREFIXES(PickleTest, Resize); 370 FRIEND_TEST_ALL_PREFIXES(PickleTest, Resize);
359 FRIEND_TEST_ALL_PREFIXES(PickleTest, FindNext); 371 FRIEND_TEST_ALL_PREFIXES(PickleTest, FindNext);
360 FRIEND_TEST_ALL_PREFIXES(PickleTest, FindNextWithIncompleteHeader); 372 FRIEND_TEST_ALL_PREFIXES(PickleTest, FindNextWithIncompleteHeader);
361 }; 373 };
362 374
375 #if 0
376 template <size_t length> void Pickle::WriteBytesStatic(const void* data) {
377 //DCHECK_NE(kCapacityReadOnly, capacity_) << "oops: pickle is readonly";
378 #ifdef ARCH_CPU_64_BITS
379 DCHECK_LE(length, kuint32max);
danakj 2013/10/22 17:22:05 how come? and why ifdefed only on 64bit?
piman 2013/10/24 06:17:14 This comes from the original BeginWriteData. I ass
380 #endif
381 size_t data_len = AlignInt(length, sizeof(uint32));
382 size_t new_size = offset_ + data_len;
383 if (new_size > capacity_) {
384 Resize(std::max(capacity_ * 2, new_size));
385 }
386
387 char* write = mutable_payload() + offset_;
388 memcpy(write, data, length);
389 memset(write + length, 0, data_len - length);
390 offset_ = new_size;
391 header_->payload_size = new_size;
392 }
393 #endif
394
363 #endif // BASE_PICKLE_H__ 395 #endif // BASE_PICKLE_H__
OLDNEW
« no previous file with comments | « no previous file | base/pickle.cc » ('j') | base/pickle.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698