Skip to content

Commit 5e00318

Browse files
committed
Improve prelexer by using variadic templates
1 parent bc010c9 commit 5e00318

File tree

1 file changed

+12
-128
lines changed

1 file changed

+12
-128
lines changed

prelexer.hpp

Lines changed: 12 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ namespace Sass {
2323
// there is a small chance that the search prefix
2424
// is longer than the rest of the string to look at
2525
while (*pre && *src == *pre) {
26-
++src, ++pre;
26+
++src, ++pre;
2727
}
2828
return *pre ? 0 : src;
2929
}
@@ -202,142 +202,26 @@ namespace Sass {
202202
return src;
203203
}
204204

205-
// Tries the matchers in sequence and returns the first match (or none)
206-
template <prelexer mx1, prelexer mx2>
207-
const char* alternatives(const char* src) {
208-
const char* rslt;
209-
(rslt = mx1(src)) || (rslt = mx2(src));
210-
return rslt;
211-
}
212-
213-
// Same as above, but with 3 arguments.
214-
template <prelexer mx1, prelexer mx2, prelexer mx3>
215-
const char* alternatives(const char* src) {
216-
const char* rslt;
217-
(rslt = mx1(src)) || (rslt = mx2(src)) || (rslt = mx3(src));
218-
return rslt;
219-
}
220-
221-
// Same as above, but with 4 arguments.
222-
template <prelexer mx1, prelexer mx2, prelexer mx3, prelexer mx4>
223-
const char* alternatives(const char* src) {
224-
const char* rslt;
225-
(rslt = mx1(src)) || (rslt = mx2(src)) ||
226-
(rslt = mx3(src)) || (rslt = mx4(src));
227-
return rslt;
228-
}
229-
230-
// Same as above, but with 5 arguments.
231-
template <prelexer mx1, prelexer mx2, prelexer mx3,
232-
prelexer mx4, prelexer mx5>
233-
const char* alternatives(const char* src) {
234-
const char* rslt;
235-
(rslt = mx1(src)) || (rslt = mx2(src)) || (rslt = mx3(src)) ||
236-
(rslt = mx4(src)) || (rslt = mx5(src));
237-
return rslt;
238-
}
239-
240-
// Same as above, but with 6 arguments.
241-
template <prelexer mx1, prelexer mx2, prelexer mx3,
242-
prelexer mx4, prelexer mx5, prelexer mx6>
243-
const char* alternatives(const char* src) {
244-
const char* rslt;
245-
(rslt = mx1(src)) || (rslt = mx2(src)) || (rslt = mx3(src)) ||
246-
(rslt = mx4(src)) || (rslt = mx5(src)) || (rslt = mx6(src));
247-
return rslt;
248-
}
249-
250-
// Same as above, but with 7 arguments.
251-
template <prelexer mx1, prelexer mx2,
252-
prelexer mx3, prelexer mx4,
253-
prelexer mx5, prelexer mx6,
254-
prelexer mx7>
255-
const char* alternatives(const char* src) {
256-
const char* rslt;
257-
(rslt = mx1(src)) || (rslt = mx2(src)) ||
258-
(rslt = mx3(src)) || (rslt = mx4(src)) ||
259-
(rslt = mx5(src)) || (rslt = mx6(src)) ||
260-
(rslt = mx7(src));
261-
return rslt;
262-
}
263-
264-
// Same as above, but with 8 arguments.
265-
template <prelexer mx1, prelexer mx2,
266-
prelexer mx3, prelexer mx4,
267-
prelexer mx5, prelexer mx6,
268-
prelexer mx7, prelexer mx8>
205+
// Tries the matchers in sequence and succeeds if they all succeed.
206+
template <prelexer... mxs>
269207
const char* alternatives(const char* src) {
270208
const char* rslt;
271-
(rslt = mx1(src)) || (rslt = mx2(src)) ||
272-
(rslt = mx3(src)) || (rslt = mx4(src)) ||
273-
(rslt = mx5(src)) || (rslt = mx6(src)) ||
274-
(rslt = mx7(src)) || (rslt = mx8(src));
275-
return rslt;
209+
for (prelexer mx : { mxs... }) {
210+
if ((rslt = mx(src))) return rslt;
211+
}
212+
return 0;
276213
}
277214

278215
// Tries the matchers in sequence and succeeds if they all succeed.
279-
template <prelexer mx1, prelexer mx2>
280-
const char* sequence(const char* src) {
281-
const char* rslt = src;
282-
(rslt = mx1(rslt)) && (rslt = mx2(rslt));
283-
return rslt;
284-
}
285-
286-
// Same as above, but with 3 arguments.
287-
template <prelexer mx1, prelexer mx2, prelexer mx3>
288-
const char* sequence(const char* src) {
289-
const char* rslt = src;
290-
(rslt = mx1(rslt)) && (rslt = mx2(rslt)) && (rslt = mx3(rslt));
291-
return rslt;
292-
}
293-
294-
// Same as above, but with 4 arguments.
295-
template <prelexer mx1, prelexer mx2, prelexer mx3, prelexer mx4>
296-
const char* sequence(const char* src) {
297-
const char* rslt = src;
298-
(rslt = mx1(rslt)) && (rslt = mx2(rslt)) &&
299-
(rslt = mx3(rslt)) && (rslt = mx4(rslt));
300-
return rslt;
301-
}
302-
303-
// Same as above, but with 5 arguments.
304-
template <prelexer mx1, prelexer mx2,
305-
prelexer mx3, prelexer mx4,
306-
prelexer mx5>
307-
const char* sequence(const char* src) {
308-
const char* rslt = src;
309-
(rslt = mx1(rslt)) && (rslt = mx2(rslt)) &&
310-
(rslt = mx3(rslt)) && (rslt = mx4(rslt)) &&
311-
(rslt = mx5(rslt));
312-
return rslt;
313-
}
314-
315-
// Same as above, but with 6 arguments.
316-
template <prelexer mx1, prelexer mx2,
317-
prelexer mx3, prelexer mx4,
318-
prelexer mx5, prelexer mx6>
216+
template <prelexer... mxs>
319217
const char* sequence(const char* src) {
320218
const char* rslt = src;
321-
(rslt = mx1(rslt)) && (rslt = mx2(rslt)) &&
322-
(rslt = mx3(rslt)) && (rslt = mx4(rslt)) &&
323-
(rslt = mx5(rslt)) && (rslt = mx6(rslt));
324-
return rslt;
325-
}
326-
327-
// Same as above, but with 7 arguments.
328-
template <prelexer mx1, prelexer mx2,
329-
prelexer mx3, prelexer mx4,
330-
prelexer mx5, prelexer mx6,
331-
prelexer mx7>
332-
const char* sequence(const char* src) {
333-
const char* rslt = src;
334-
(rslt = mx1(rslt)) && (rslt = mx2(rslt)) &&
335-
(rslt = mx3(rslt)) && (rslt = mx4(rslt)) &&
336-
(rslt = mx5(rslt)) && (rslt = mx6(rslt)) &&
337-
(rslt = mx7(rslt));
219+
for (prelexer mx : { mxs... }) {
220+
if (!(rslt = mx(rslt))) return 0;
221+
}
338222
return rslt;
339223
}
340-
224+
341225
// Match a pattern or not. Always succeeds.
342226
template <prelexer mx>
343227
const char* optional(const char* src) {

0 commit comments

Comments
 (0)