How to initialize static array member variable?

Simen kjaeraas simen.kjaras at gmail.com
Fri Oct 29 04:48:51 PDT 2010


Trass3r <un at known.com> wrote:

>> I also wanted to allow for swizzled setters, but apparently that's
>> currently not possible[1].
>>
>> [1]: http://d.puremagic.com/issues/show_bug.cgi?id=620
>
> What a pity!

Actually, after a bit of hacking, I have found a way:


// new helper function
static private bool noCharsRepeated( string s )
{
	foreach ( i, e1; s[0..$-1])
		foreach ( e2; s[i+1..$] )
			if ( e1 == e2 )
				return false;
	return true;
}

/// swizzling
template opDispatch( string n ) {
	@property Vector!(T,n.length) opDispatch( U... )( U args )
	if (allCharsValid(n,"xyzw"[0..dim]) && (U.length == 0 || (U.length == 1  
&& is(U[0] == Vector!(T,n.length)) && noCharsRepeated(n))))
	{
		static if ( U.length == 1 ) {
			static if ( n.length >= 1 )
				cell[n[0]-'x'] = args[0].cell[0];
			static if ( n.length >= 2 )
				cell[n[1]-'x'] = args[0].cell[1];
			static if ( n.length >= 3 )
				cell[n[2]-'x'] = args[0].cell[2];
			static if ( n.length >= 4 )
				cell[n[3]-'x'] = args[0].cell[3];
			
		}
		static if (n.length == 2) return
			Vector!(T,n.length)(cell[n[0]-'x'], cell[n[1]-'x']);
		static if (n.length == 3) return
			Vector!(T,n.length)(cell[n[0]-'x'], cell[n[1]-'x'], cell[n[2]-'x']);
		static if (n.length == 4) return
			Vector!(T,n.length)(cell[n[0]-'x'], cell[n[1]-'x'], cell[n[2]-'x'],  
cell[n[3]-'x']);
	}
}


The signature might not exactly be clean, but it works.

-- 
Simen


More information about the Digitalmars-d-learn mailing list