[Article Submission] Have Your Efficiency, and Flexibility Too

bearophile bearophileHUGS at lycos.com
Tue May 31 04:05:45 PDT 2011


Nick Sabalausky:

> http://www.semitwist.com/articles/EfficientAndFlexible/SinglePage/

Regarding your addGizmos() in ex6_meta_flex3_runtimeToCompileTime1.d:


void addGizmos(int numPorts, bool isSpinnable, int numGizmos) {
    // Dispatch to correct version of addGizmosTo.
    // Effectively converts a runtime value to compile-time.
    if (numPorts == 1) {
        if (isSpinnable)
            addGizmosTo!(1, true )(numGizmos);
        else
            addGizmosTo!(1, false)(numGizmos);
    } else if (numPorts == 2) {
        if (isSpinnable)
            addGizmosTo!(2, true )(numGizmos);
        else
            addGizmosTo!(2, false)(numGizmos);
    } else if (numPorts == 3) {
        if (isSpinnable)
            addGizmosTo!(3, true )(numGizmos);
        else
            addGizmosTo!(3, false)(numGizmos);
    } else if (numPorts == 5) {
        if (isSpinnable)
            addGizmosTo!(5, true )(numGizmos);
        else
            addGizmosTo!(5, false)(numGizmos);
    } else if (numPorts == 10) {
        if (isSpinnable)
            addGizmosTo!(10, true )(numGizmos);
        else
            addGizmosTo!(10, false)(numGizmos);
    } else
        throw new Exception(to!string(numPorts)~"-port Gizmo not supported.");
}


A shorter way to write it:

void addGizmos(int numPorts, bool isSpinnable, int numGizmos) {
    foreach (np; TypeTuple!(1, 2, 3, 5, 10))
        if (numPorts == np) {
            foreach (b; TypeTuple!(true, false))
                if (isSpinnable == b)
                    addGizmosTo!(np, b)(numGizmos);
            return;
        }

    throw new Exception(text(numPorts) ~ "-port Gizmo not supported.");
}

Bye,
bearophile


More information about the Digitalmars-d mailing list