Code generation tricks

John Colvin john.loughran.colvin at gmail.com
Mon Jul 22 14:04:40 PDT 2013


On Sunday, 21 July 2013 at 17:24:11 UTC, JS wrote:
> This seems to be a somewhat efficient string splitter
>
> http://dpaste.dzfl.pl/4307aa5f
>
> The basic idea is
>
> for(int j = 0; j < s.length; j++)
> 	{
> 		mixin(ExpandVariadicIf!("??Cs[j]??s[j..min(s.length-1, j + 
> %%L)]::", "d", "
> 			if (r.length <= i) r.length += 5;
> 			if (j != 0)
> 			{
> 				r[i++] = s[oldj..j];
> 				oldj = j + %%L;
> 			}
> 			else
> 				oldj = %%L;
> 		 j += %%L; continue;", T));
> 		
> 	}
>
> ExpandVariadicIf creates a series of if's for each variadic 
> argument. There is some strange formatting(just some crap I 
> threw together to get something working) but it boils down to 
> generating compile time code that minimizes computations and 
> lookups by directly using the known compile time literals 
> passed.
>
> IMO these types of functions seem useful but ATM are just 
> hacks. Hopefully there is a better way to do these sorts of 
> things as I find them pretty useful.
>
> One of the big issues not being able to pass a variadic 
> variable to a template directly which is why the formatting 
> string is necessary(You can pass the typetuple to get the types 
> and size but not the compile time values if they exist.
>
> I think int this case a variadic alias would be very useful.
>
> alias T... => alias T0, alias T1, etc....
> (e.g. T[0] is an alias, T.length is number of aliases, etc...)
>
> In any case, maybe someone has a good way to make these things 
> easier and more useful. Being able to handle variadic types and 
> values in a consistent and simple way will make them moreful.

How does this perform compared to naive/phobos splitting?


More information about the Digitalmars-d-learn mailing list