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

Side by Side Diff: src/record/SkRecordPattern.h

Issue 275623002: Split Star into Star (stores nothing) and List (stores matches). (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: yagni Created 6 years, 7 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
« no previous file with comments | « no previous file | tests/RecordPatternTest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #ifndef SkRecordPattern_DEFINED 1 #ifndef SkRecordPattern_DEFINED
2 #define SkRecordPattern_DEFINED 2 #define SkRecordPattern_DEFINED
3 3
4 #include "SkTLogic.h" 4 #include "SkTLogic.h"
5 5
6 namespace SkRecords { 6 namespace SkRecords {
7 7
8 // First, some matchers. These match a single command in the SkRecord, 8 // First, some matchers. These match a single command in the SkRecord,
9 // and may hang onto some data from it. If so, you can get the data by calling .get(). 9 // and may hang onto some data from it. If so, you can get the data by calling .get().
10 10
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
78 template <typename A, typename B> 78 template <typename A, typename B>
79 struct Or { 79 struct Or {
80 template <typename T> 80 template <typename T>
81 bool operator()(T* ptr) { return A()(ptr) || B()(ptr); } 81 bool operator()(T* ptr) { return A()(ptr) || B()(ptr); }
82 }; 82 };
83 83
84 // Matches if any of A, B or C does. Stores nothing. 84 // Matches if any of A, B or C does. Stores nothing.
85 template <typename A, typename B, typename C> 85 template <typename A, typename B, typename C>
86 struct Or3 : Or<A, Or<B, C> > {}; 86 struct Or3 : Or<A, Or<B, C> > {};
87 87
88 // We'll use this to choose which implementation of Star suits each Matcher. 88 // Star is a special matcher that greedily matches Matcher 0 or more times. Sto res nothing.
89 SK_CREATE_TYPE_DETECTOR(type); 89 template <typename Matcher>
90 90 struct Star {
91 // Star is a special matcher that matches Matcher 0 or more times _greedily_ in the SkRecord.
92 // This version stores nothing. It's enabled when Matcher stores nothing.
93 template <typename Matcher, typename = void>
94 class Star {
95 public:
96 void reset() {}
97
98 template <typename T> 91 template <typename T>
99 bool operator()(T* ptr) { return Matcher()(ptr); } 92 bool operator()(T* ptr) { return Matcher()(ptr); }
100 }; 93 };
101 94
102 // This version stores a list of matches. It's enabled if Matcher stores someth ing.
103 template <typename Matcher>
104 class Star<Matcher, SK_WHEN(HasType_type<Matcher>, void)> {
105 public:
106 typedef SkTDArray<typename Matcher::type*> type;
107 type* get() { return &fMatches; }
108
109 void reset() { fMatches.rewind(); }
110
111 template <typename T>
112 bool operator()(T* ptr) {
113 Matcher matcher;
114 if (matcher(ptr)) {
115 fMatches.push(matcher.get());
116 return true;
117 }
118 return false;
119 }
120
121 private:
122 type fMatches;
123 };
124
125
126 // Cons builds a list of Matchers. 95 // Cons builds a list of Matchers.
127 // It first matches Matcher (something from above), then Pattern (another Cons o r Nil). 96 // It first matches Matcher (something from above), then Pattern (another Cons o r Nil).
128 // 97 //
129 // This is the main entry point to pattern matching, and so provides a couple of extra API bits: 98 // This is the main entry point to pattern matching, and so provides a couple of extra API bits:
130 // - search scans through the record to look for matches; 99 // - search scans through the record to look for matches;
131 // - first, second, and third return the data stored by their respective matche rs in the pattern. 100 // - first, second, and third return the data stored by their respective matche rs in the pattern.
132 // 101 //
133 // These Cons build lists analogously to Lisp's "cons". See Pattern# for the "l ist" equivalent. 102 // These Cons build lists analogously to Lisp's "cons". See Pattern# for the "l ist" equivalent.
134 template <typename Matcher, typename Pattern> 103 template <typename Matcher, typename Pattern>
135 class Cons { 104 class Cons {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
168 if (record->mutate<bool>(i, fHead)) { 137 if (record->mutate<bool>(i, fHead)) {
169 return i+1; 138 return i+1;
170 } 139 }
171 } 140 }
172 return 0; 141 return 0;
173 } 142 }
174 143
175 // If head is a Star, walk i until it doesn't match. 144 // If head is a Star, walk i until it doesn't match.
176 template <typename T> 145 template <typename T>
177 unsigned matchHead(Star<T>*, SkRecord* record, unsigned i) { 146 unsigned matchHead(Star<T>*, SkRecord* record, unsigned i) {
178 fHead.reset();
179 while (i < record->count()) { 147 while (i < record->count()) {
180 if (!record->mutate<bool>(i, fHead)) { 148 if (!record->mutate<bool>(i, fHead)) {
181 return i; 149 return i;
182 } 150 }
183 i++; 151 i++;
184 } 152 }
185 return 0; 153 return 0;
186 } 154 }
187 155
188 Matcher fHead; 156 Matcher fHead;
(...skipping 17 matching lines...) Expand all
206 174
207 template <typename A, typename B> 175 template <typename A, typename B>
208 struct Pattern2 : Cons<A, Pattern1<B> > {}; 176 struct Pattern2 : Cons<A, Pattern1<B> > {};
209 177
210 template <typename A, typename B, typename C> 178 template <typename A, typename B, typename C>
211 struct Pattern3 : Cons<A, Pattern2<B, C> > {}; 179 struct Pattern3 : Cons<A, Pattern2<B, C> > {};
212 180
213 } // namespace SkRecords 181 } // namespace SkRecords
214 182
215 #endif//SkRecordPattern_DEFINED 183 #endif//SkRecordPattern_DEFINED
OLDNEW
« no previous file with comments | « no previous file | tests/RecordPatternTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698