Compile-time optimization

JS js.mdnq at gmail.com
Thu Jul 25 21:30:35 PDT 2013


Thanks.. I am working on getting the code to work with unrolling 
an array:


module main;

import std.stdio, std.traits;

template tuple(args...)
{
     alias tuple = args;
}

template tUnrollArray(args...)
{
	static if (isArray!(typeof(args)))
	{
		pragma(msg, "isarray");
		static if (args.length > 1)
		{
			pragma(msg, "unrolling");
			alias tUnrollArray = tuple!(arg[0], args[1..$]);
		}
		else
		{
			static if (args[0].length > 1)
			{
				pragma(msg, "1");
				alias tUnrollArray = tuple!(args[0][0], 
tUnrollArray!(args[0][1..$]));
			}
			else
			{
				pragma(msg, "2");
				alias tUnrollArray = tuple!(args[0][0]);
			}
		}
	}
	else
		alias tUnrollArray = args;
}

void main(string[] argv)
{
	auto z = ["a", "b"];
         writeln(tUnrollArray!(["a", "b"]));
	writeln(tUnrollArray!(z));    // fails
	readln();
}


which seems to follow along the lines of your tuple reduce.

The problem is that I would like for it to unroll compile time 
known variables. I think we talked about that already and you 
said it wasn't a good idea because of potential infinite loops 
for some types of templates(which, I still think in most cases it 
should be ok, such as above.

Making z immutable does work but I don't get why making it static 
doesn't.

In any case, if the code looks correct I'll try and add the 
ability to have tupleReduce join elements that are arrays.

The alias stuff is starting to make some sense but having to do 
recursion for simple iterations isn't very fun ;/


More information about the Digitalmars-d mailing list