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

Side by Side Diff: third_party/WebKit/Source/core/fetch/CachedMetadata.h

Issue 2258743002: Reserve Vector's capacity manually in CachedMetadata (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix Created 4 years, 3 months 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2010 Google Inc. All rights reserved. 2 * Copyright (C) 2010 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 13 matching lines...) Expand all
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */ 29 */
30 30
31 #ifndef CachedMetadata_h 31 #ifndef CachedMetadata_h
32 #define CachedMetadata_h 32 #define CachedMetadata_h
33 33
34 #include "wtf/Forward.h" 34 #include "core/CoreExport.h"
35 #include "wtf/Assertions.h"
36 #include "wtf/PassRefPtr.h"
35 #include "wtf/RefCounted.h" 37 #include "wtf/RefCounted.h"
38 #include "wtf/RefPtr.h"
36 #include "wtf/Vector.h" 39 #include "wtf/Vector.h"
40 #include <stdint.h>
37 41
38 namespace blink { 42 namespace blink {
39 43
40 // Metadata retrieved from the embedding application's cache. 44 // Metadata retrieved from the embedding application's cache.
41 // 45 //
42 // Serialized data is NOT portable across architectures. However, reading the 46 // Serialized data is NOT portable across architectures. However, reading the
43 // data type ID will reject data generated with a different byte-order. 47 // data type ID will reject data generated with a different byte-order.
44 class CachedMetadata : public RefCounted<CachedMetadata> { 48 class CORE_EXPORT CachedMetadata : public RefCounted<CachedMetadata> {
45 public: 49 public:
46 static PassRefPtr<CachedMetadata> create(unsigned dataTypeID, const char* da ta, size_t size) 50 static PassRefPtr<CachedMetadata> create(uint32_t dataTypeID, const char* da ta, size_t size)
47 { 51 {
48 return adoptRef(new CachedMetadata(dataTypeID, data, size)); 52 return adoptRef(new CachedMetadata(dataTypeID, data, size));
49 } 53 }
50 54
51 static PassRefPtr<CachedMetadata> deserialize(const char* data, size_t size) 55 static PassRefPtr<CachedMetadata> createFromSerializedData(const char* data, size_t size)
52 { 56 {
53 return adoptRef(new CachedMetadata(data, size)); 57 return adoptRef(new CachedMetadata(data, size));
54 } 58 }
55 59
56 const Vector<char>& serialize() const
57 {
58 return m_serializedData;
59 }
60
61 ~CachedMetadata() { } 60 ~CachedMetadata() { }
62 61
63 unsigned dataTypeID() const 62 const Vector<char>& serializedData() const { return m_serializedData; }
63
64 uint32_t dataTypeID() const
64 { 65 {
65 return readUnsigned(dataTypeIDStart); 66 // We need to define a local variable to use the constant in DCHECK.
67 constexpr auto kDataStart = CachedMetadata::kDataStart;
68 DCHECK_GE(m_serializedData.size(), kDataStart);
69 return *reinterpret_cast_ptr<uint32_t*>(const_cast<char*>(m_serializedDa ta.data()));
66 } 70 }
67 71
68 const char* data() const 72 const char* data() const
69 { 73 {
70 if (m_serializedData.size() < dataStart) 74 constexpr auto kDataStart = CachedMetadata::kDataStart;
71 return 0; 75 DCHECK_GE(m_serializedData.size(), kDataStart);
72 return m_serializedData.data() + dataStart; 76 return m_serializedData.data() + kDataStart;
73 } 77 }
74 78
75 size_t size() const 79 size_t size() const
76 { 80 {
77 if (m_serializedData.size() < dataStart) 81 constexpr auto kDataStart = CachedMetadata::kDataStart;
78 return 0; 82 DCHECK_GE(m_serializedData.size(), kDataStart);
79 return m_serializedData.size() - dataStart; 83 return m_serializedData.size() - kDataStart;
80 } 84 }
81 85
82 private: 86 private:
83 // Reads an unsigned value at position. Returns 0 on error. 87 CachedMetadata(const char* data, size_t);
84 unsigned readUnsigned(size_t position) const 88 CachedMetadata(uint32_t dataTypeID, const char* data, size_t);
85 {
86 if (m_serializedData.size() < position + sizeof(unsigned))
87 return 0;
88 return *reinterpret_cast_ptr<unsigned*>(const_cast<char*>(m_serializedDa ta.data() + position));
89 }
90
91 // Appends an unsigned value to the end of the serialized data.
92 void appendUnsigned(unsigned value)
93 {
94 m_serializedData.append(reinterpret_cast<const char*>(&value), sizeof(un signed));
95 }
96
97 CachedMetadata(const char* data, size_t size)
98 {
99 // Serialized metadata should have non-empty data.
100 ASSERT(size > dataStart);
101
102 m_serializedData.append(data, size);
103 }
104
105 CachedMetadata(unsigned dataTypeID, const char* data, size_t size)
106 {
107 // Don't allow an ID of 0, it is used internally to indicate errors.
108 ASSERT(dataTypeID);
109 ASSERT(data);
110
111 appendUnsigned(dataTypeID);
112 m_serializedData.append(data, size);
113 }
114
115 // Serialization offsets. Format: [DATA_TYPE_ID][DATA].
116 static const size_t dataTypeIDStart = 0;
117 static const size_t dataStart = sizeof(unsigned);
118 89
119 // Since the serialization format supports random access, storing it in 90 // Since the serialization format supports random access, storing it in
120 // serialized form avoids need for a copy during serialization. 91 // serialized form avoids need for a copy during serialization.
121 Vector<char> m_serializedData; 92 Vector<char> m_serializedData;
93
94 // |m_serializedData| consists of 32 bits type ID and and actual data.
95 static constexpr size_t kDataStart = sizeof(uint32_t);
122 }; 96 };
123 97
124 } // namespace blink 98 } // namespace blink
125 99
126 #endif 100 #endif
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/core.gypi ('k') | third_party/WebKit/Source/core/fetch/CachedMetadata.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698