inline void operator() (ustring name, Dual2<R> &result,
                         const Dual2<S> &s, const Dual2<T> &t,
                         const S &sp, const T &tp,
                         ShaderGlobals *sg, const NoiseParams *opt) const {
     if (name == Strings::uperlin || name == Strings::noise) {
         PeriodicNoise noise;
         noise(result, s, t, sp, tp);
     } else if (name == Strings::perlin || name == Strings::snoise) {
         PeriodicSNoise snoise;
         snoise(result, s, t, sp, tp);
     } else if (name == Strings::cell) {
         PeriodicCellNoise cellnoise;
         cellnoise(result.val(), s.val(), t.val(), sp, tp);
         result.clear_d();
     } else if (name == Strings::gabor) {
         GaborPNoise gnoise;
         gnoise (name, result, s, t, sp, tp, sg, opt);
     } else if (name == Strings::hash) {
         PeriodicHashNoise hashnoise;
         hashnoise(result.val(), s.val(), t.val(), sp, tp);
         result.clear_d();
     } else {
         ((ShadingContext *)sg->context)->error ("Unknown noise type \"%s\"", name.c_str());
     }
 }
 inline void operator() (ustring name, Dual2<R> &result,
                         const Dual2<S> &s, const Dual2<T> &t,
                         ShaderGlobals *sg, const NoiseParams *opt) const {
     if (name == Strings::uperlin || name == Strings::noise) {
         Noise noise;
         noise(result, s, t);
     } else if (name == Strings::perlin || name == Strings::snoise) {
         SNoise snoise;
         snoise(result, s, t);
     } else if (name == Strings::simplexnoise || name == Strings::simplex) {
         SimplexNoise simplexnoise;
         simplexnoise(result, s, t);
     } else if (name == Strings::usimplexnoise || name == Strings::usimplex) {
         USimplexNoise usimplexnoise;
         usimplexnoise(result, s, t);
     } else if (name == Strings::cell) {
         CellNoise cellnoise;
         cellnoise(result.val(), s.val(), t.val());
         result.clear_d();
     } else if (name == Strings::gabor) {
         GaborNoise gnoise;
         gnoise (name, result, s, t, sg, opt);
     } else if (name == Strings::null) {
         NullNoise noise; noise(result, s, t);
     } else if (name == Strings::unull) {
         UNullNoise noise; noise(result, s, t);
     } else if (name == Strings::hash) {
         HashNoise hashnoise;
         hashnoise(result.val(), s.val(), t.val());
         result.clear_d();
     } else {
         ((ShadingContext *)sg->context)->error ("Unknown noise type \"%s\"", name.c_str());
     }
 }