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

Side by Side Diff: src/core/SkFreeList.h

Issue 187233002: Fast implementation of QuadTree (Closed) Base URL: https://skia.googlesource.com/skia.git@bbh_select
Patch Set: Split the new list classes out, and make them more general. Other review fixes. Created 6 years, 9 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
(Empty)
1 /*
2 * Copyright 2014 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 */
7
8 #ifndef SkFreeList_DEFINED
9 #define SkFreeList_DEFINED
10
11 #include "SkTInternalSList.h"
robertphillips 2014/03/07 16:01:35 Is this needed?
iancottrell 2014/03/07 16:11:14 Yes.
12 #include "SkRect.h"
robertphillips 2014/03/07 16:01:35 Is this needed?
iancottrell 2014/03/07 16:11:14 Done.
13 #include "SkTDArray.h"
robertphillips 2014/03/07 16:01:35 Do we need to include SkBBoxHierarchy.h?
iancottrell 2014/03/07 16:11:14 Done.
14 #include "SkBBoxHierarchy.h"
15
16
17 /**
18 * An implementation of a self growing free list of objects.
reed1 2014/03/07 15:18:38 I still don't grok what this class does. Is it eff
robertphillips 2014/03/07 16:01:35 Apropos this comment, renaming it SkBlockMgr might
iancottrell 2014/03/07 16:02:34 I have renamed some stuff and added comments to ma
19 * Constructors and destructors will be called on the objects.
20 * All memory will be reclaimed when the free list is destroyed, so the free
21 * list must survive longer than you are using any item taken from it.
22 */
robertphillips 2014/03/07 16:01:35 growth -> numItemsPerBlock?
iancottrell 2014/03/07 16:11:14 Done.
23 template<typename T, int growth = 4096/sizeof(T)> class SkFreeList {
24 public:
25 SkFreeList() {}
26 ~SkFreeList() {
robertphillips 2014/03/07 16:01:35 Couldn't we add an assert here that all the manage
iancottrell 2014/03/07 16:11:14 There is no reason that should have to be the case
27 while(!fBlocks.isEmpty()) { SkDELETE(fBlocks.pop()); }
reed1 2014/03/07 15:18:38 style nit: while (..) { ... }
iancottrell 2014/03/07 16:02:34 Done.
28 }
29
30 /**
31 * Push an item into the free list.
32 * The item does not have to have come from the free list, but if it did not
33 * it must have a lifetime greater than the free list does.
34 * This method is *not* thread safe.
35 */
36 void push(T* entry) {
37 fAvailable.push(entry);
38 }
39
40 /**
41 * Takes all the items from another list.
reed1 2014/03/07 15:18:38 - what is the state of other after this call? - in
iancottrell 2014/03/07 16:02:34 Sorry, I fixed the docs on list, but this was copi
42 */
43 void takeAll(SkTInternalSList<T>* other) {
44 fAvailable.takeAll(other);
45 }
46
47 /**
48 * Get an item from the free list.
49 * If the free list has no items, it will grow.
50 * The free list will never shrink, it will use the maximum memory it has
51 * ever reached until destroyed.
52 * The returned item is only valid as long as the free list has not been
53 * destroyed, at that point all memory allocated by grow will have been
54 * reclaimed.
55 * This method is *not* thread safe.
56 */
57 T* pop() {
reed1 2014/03/07 15:18:38 wow, this name is really confusing, since pop() is
iancottrell 2014/03/07 16:02:34 Renamed, and comments added.
58 if (fAvailable.isEmpty()) { grow(); }
reed1 2014/03/07 15:18:38 style nit: if (...) { ... }
iancottrell 2014/03/07 16:02:34 Done.
59 return fAvailable.pop();
60 }
61 private:
62 /**
63 * The type for a new block of entries for the list.
64 */
65 struct Block {
66 T entries[growth];
67 SK_DECLARE_INTERNAL_SLIST_INTERFACE(Block);
68 };
69 SkTInternalSList<Block> fBlocks;
70 SkTInternalSList<T> fAvailable;
71
72 /**
73 * When the free list runs out of items, this method is called to allocate
74 * a new block of them.
75 * It calls the constructors and then pushes the nodes into the available
76 * list.
77 */
78 void grow() {
79 Block* block = SkNEW(Block);
80 fBlocks.push(block);
81 for(int index = 0; index < growth; ++index) {
robertphillips 2014/03/07 16:01:35 this->push
iancottrell 2014/03/07 16:11:14 Already changed.
82 push(&block->entries[index]);
83 }
84 }
85
86 };
87
88 #endif
OLDNEW
« no previous file with comments | « bench/QuadTreeBench.cpp ('k') | src/core/SkQuadTree.h » ('j') | src/core/SkTInternalSList.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698