Using arrays with functions taking ranges
    Mu 
    invalid_email at address.int
       
    Thu Dec 13 05:52:29 PST 2012
    
    
  
The code below works as is with memory mapped files' casted 
opSlice's.
However, I can't figure out how to test it with simple arrays.
Its unittest fails.
Question:
How to implement the function correctly?
Otherwise what is the correct way to test it?
Thank you.
Code:
----------------
Range2 caesarCipher(Range1, Range2)(Range1 input, Range2 output, 
int shift)
	if (isInputRange!Range1 && isOutputRange!(Range2, ubyte))
{
	auto rotAb = lowercase.dtext.dup; // rotated alphabet
	shift %= lowercase.length.to!int; // bring the shift within the 
length of the alphabet
	if (shift < 0)
		bringToFront(rotAb[0 .. $ + shift], rotAb[$ + shift .. $]);
	else
		bringToFront(rotAb[0 .. shift], rotAb[shift .. $]);
	foreach (i, ref o; output)
	{
		const char c = input[i];
		if (isAlpha(c))
			if (isUpper(c))
				o = toUpper(rotAb[lowercase.countUntil(toLower(c))]).to!ubyte;
			else
				o = rotAb[lowercase.countUntil(c)].to!ubyte;
		else
			o = c;
	}
	return output;
}
unittest
{
	ubyte[] uba;
	assert(caesarCipher("Exxego ex srgi!", uba, -56).to!string == 
"Attack at once!");
}
    
    
More information about the Digitalmars-d-learn
mailing list