protected override Evaluator CreateEvaluator(Dictionary<Expression, Evaluator> Cache, int BufferSize, int Resolution)
{
Evaluator srceval = this.Source.GetEvaluator(Cache, BufferSize, Resolution);
bool constsrc = false;
Value srcval = 0;
ConstantEvaluator consteval = srceval as ConstantEvaluator;
if (consteval != null)
{
constsrc = true;
srcval = consteval.Value;
}
int resmag = 2 << (Resolution - 1);
double period = resmag;
double scale = (resmag - 3) * 0.5;
switch (this.Operation)
{
case UnaryOperation.Negate:
if (constsrc)
return new ConstantEvaluator(-srcval);
return new NegateEvaluator(srceval);
case UnaryOperation.Complement:
if (constsrc)
return new ConstantEvaluator(~srcval);
return new ComplementEvaluator(srceval);
case UnaryOperation.Saw:
return new SawEvaluator(srceval, period, scale);
case UnaryOperation.Sine:
return new SineEvaluator(srceval, period, scale);
case UnaryOperation.Square:
return new SquareEvaluator(srceval, period, scale);
case UnaryOperation.Triangle:
return new TriangleEvaluator(srceval, period, scale);
default:
throw new NotImplementedException();
}
}