Sat, 03 Jan 2015 20:18:00 +0100
Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.
1 /*
2 * Copyright 2010 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
8 #ifndef GrAllocator_DEFINED
9 #define GrAllocator_DEFINED
11 #include "GrConfig.h"
12 #include "GrTypes.h"
13 #include "SkTArray.h"
14 #include "SkTypes.h"
16 class GrAllocator : public SkNoncopyable {
17 public:
18 ~GrAllocator() {
19 reset();
20 }
22 /**
23 * Create an allocator
24 *
25 * @param itemSize the size of each item to allocate
26 * @param itemsPerBlock the number of items to allocate at once
27 * @param initialBlock optional memory to use for the first block.
28 * Must be at least itemSize*itemsPerBlock sized.
29 * Caller is responsible for freeing this memory.
30 */
31 GrAllocator(size_t itemSize, int itemsPerBlock, void* initialBlock) :
32 fItemSize(itemSize),
33 fItemsPerBlock(itemsPerBlock),
34 fOwnFirstBlock(NULL == initialBlock),
35 fCount(0) {
36 SkASSERT(itemsPerBlock > 0);
37 fBlockSize = fItemSize * fItemsPerBlock;
38 fBlocks.push_back() = initialBlock;
39 SkDEBUGCODE(if (!fOwnFirstBlock) {*((char*)initialBlock+fBlockSize-1)='a';} );
40 }
42 /*
43 * Set first block of memory to write into. Must be called before any other methods.
44 * This requires that you have passed NULL in the constructor.
45 *
46 * @param initialBlock optional memory to use for the first block.
47 * Must be at least itemSize*itemsPerBlock sized.
48 * Caller is responsible for freeing this memory.
49 */
50 void setInitialBlock(void* initialBlock) {
51 SkASSERT(0 == fCount);
52 SkASSERT(1 == fBlocks.count());
53 SkASSERT(NULL == fBlocks.back());
54 fOwnFirstBlock = false;
55 fBlocks.back() = initialBlock;
56 }
58 /**
59 * Adds an item and returns pointer to it.
60 *
61 * @return pointer to the added item.
62 */
63 void* push_back() {
64 int indexInBlock = fCount % fItemsPerBlock;
65 // we always have at least one block
66 if (0 == indexInBlock) {
67 if (0 != fCount) {
68 fBlocks.push_back() = sk_malloc_throw(fBlockSize);
69 } else if (fOwnFirstBlock) {
70 fBlocks[0] = sk_malloc_throw(fBlockSize);
71 }
72 }
73 void* ret = (char*)fBlocks[fCount/fItemsPerBlock] +
74 fItemSize * indexInBlock;
75 ++fCount;
76 return ret;
77 }
79 /**
80 * removes all added items
81 */
82 void reset() {
83 int blockCount = GrMax((unsigned)1,
84 GrUIDivRoundUp(fCount, fItemsPerBlock));
85 for (int i = 1; i < blockCount; ++i) {
86 sk_free(fBlocks[i]);
87 }
88 if (fOwnFirstBlock) {
89 sk_free(fBlocks[0]);
90 fBlocks[0] = NULL;
91 }
92 fBlocks.pop_back_n(blockCount-1);
93 fCount = 0;
94 }
96 /**
97 * count of items
98 */
99 int count() const {
100 return fCount;
101 }
103 /**
104 * is the count 0
105 */
106 bool empty() const { return fCount == 0; }
108 /**
109 * access last item, only call if count() != 0
110 */
111 void* back() {
112 SkASSERT(fCount);
113 return (*this)[fCount-1];
114 }
116 /**
117 * access last item, only call if count() != 0
118 */
119 const void* back() const {
120 SkASSERT(fCount);
121 return (*this)[fCount-1];
122 }
124 /**
125 * access item by index.
126 */
127 void* operator[] (int i) {
128 SkASSERT(i >= 0 && i < fCount);
129 return (char*)fBlocks[i / fItemsPerBlock] +
130 fItemSize * (i % fItemsPerBlock);
131 }
133 /**
134 * access item by index.
135 */
136 const void* operator[] (int i) const {
137 SkASSERT(i >= 0 && i < fCount);
138 return (const char*)fBlocks[i / fItemsPerBlock] +
139 fItemSize * (i % fItemsPerBlock);
140 }
142 private:
143 static const int NUM_INIT_BLOCK_PTRS = 8;
145 SkSTArray<NUM_INIT_BLOCK_PTRS, void*> fBlocks;
146 size_t fBlockSize;
147 size_t fItemSize;
148 int fItemsPerBlock;
149 bool fOwnFirstBlock;
150 int fCount;
152 typedef SkNoncopyable INHERITED;
153 };
155 template <typename T>
156 class GrTAllocator : public SkNoncopyable {
157 public:
158 virtual ~GrTAllocator() { this->reset(); };
160 /**
161 * Create an allocator
162 *
163 * @param itemsPerBlock the number of items to allocate at once
164 */
165 explicit GrTAllocator(int itemsPerBlock)
166 : fAllocator(sizeof(T), itemsPerBlock, NULL) {}
168 /**
169 * Adds an item and returns it.
170 *
171 * @return the added item.
172 */
173 T& push_back() {
174 void* item = fAllocator.push_back();
175 SkASSERT(NULL != item);
176 SkNEW_PLACEMENT(item, T);
177 return *(T*)item;
178 }
180 T& push_back(const T& t) {
181 void* item = fAllocator.push_back();
182 SkASSERT(NULL != item);
183 SkNEW_PLACEMENT_ARGS(item, T, (t));
184 return *(T*)item;
185 }
187 /**
188 * removes all added items
189 */
190 void reset() {
191 int c = fAllocator.count();
192 for (int i = 0; i < c; ++i) {
193 ((T*)fAllocator[i])->~T();
194 }
195 fAllocator.reset();
196 }
198 /**
199 * count of items
200 */
201 int count() const {
202 return fAllocator.count();
203 }
205 /**
206 * is the count 0
207 */
208 bool empty() const { return fAllocator.empty(); }
210 /**
211 * access last item, only call if count() != 0
212 */
213 T& back() {
214 return *(T*)fAllocator.back();
215 }
217 /**
218 * access last item, only call if count() != 0
219 */
220 const T& back() const {
221 return *(const T*)fAllocator.back();
222 }
224 /**
225 * access item by index.
226 */
227 T& operator[] (int i) {
228 return *(T*)(fAllocator[i]);
229 }
231 /**
232 * access item by index.
233 */
234 const T& operator[] (int i) const {
235 return *(const T*)(fAllocator[i]);
236 }
238 protected:
239 /*
240 * Set first block of memory to write into. Must be called before any other methods.
241 *
242 * @param initialBlock optional memory to use for the first block.
243 * Must be at least size(T)*itemsPerBlock sized.
244 * Caller is responsible for freeing this memory.
245 */
246 void setInitialBlock(void* initialBlock) {
247 fAllocator.setInitialBlock(initialBlock);
248 }
250 private:
251 GrAllocator fAllocator;
252 typedef SkNoncopyable INHERITED;
253 };
255 template <int N, typename T> class GrSTAllocator : public GrTAllocator<T> {
256 private:
257 typedef GrTAllocator<T> INHERITED;
259 public:
260 GrSTAllocator() : INHERITED(N) {
261 this->setInitialBlock(fStorage.get());
262 }
264 private:
265 SkAlignedSTStorage<N, T> fStorage;
266 };
268 #endif