[Article Submission] Have Your Efficiency, and Flexibility Too

Ary Manzana ary at esperanto.org.ar
Tue May 31 05:07:59 PDT 2011


On 5/31/11 6:05 PM, bearophile wrote:
> 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

Why you need a type tuple? Can't you do:

foreach(np; [1, 2, 3, 5, 10])


More information about the Digitalmars-d mailing list