Manolete
Manolete

Reputation: 3517

Better alternatives for switch statements

I know that this has been already discussed, and there are multiple answers to it. See Performance of array of functions over if and switch statements for instance, however I would like to get some other ideas.

I've got a function with a large switch statement. This is 26 case and each with a "left" or "right" option. This function returns a pointer based on two given parameters (plane and direction):

double* getPointer(int plane, int direction) {
  switch (plane)
  {
  case 0:
    if (direction == 0)
      return  p_YZ_L; // Left
    else if (dir == 1)
      return p_YZ_R;  //Right
    else {
      return 0;
    }

    break;
    ...
  case 25:
    ...
  }
}

with

planes -> [0-25]
direction -> [0,1] 

I have been thinking on an array of functions, but this could also be tedious and I am not sure if it is the best option. Also it is not clear to me how to do it properly. Any ideas?

Upvotes: 6

Views: 4246

Answers (4)

dbush
dbush

Reputation: 223689

You can create a lookup table like this:

double *pointers[26][2] = {
    { p_YZ_L, p_YZ_R },
    ...
};

Then your function becomes much simpler:

double* getPointer(int plane, int direction) {
    if ((plane >= 0) && (plane < 26) && (direction >= 0) && (direction < 2)) {
        return pointers[plane][direction];
    } else {
        return NULL;
    }
}

Upvotes: 10

Jabberwocky
Jabberwocky

Reputation: 50778

Not quite sure, but maybe you want this:

struct
{
  double dir[2];
} directions[26] =
{
  { p_YZ_L, p_YZ_R},
  { ..., ... },           // 25 pairs of options here
  ...            
};

double* getPointer(int plane, int direction) {
  return  &directions[plane].dir[direction];
}

More tests need to be added to be sure that plane and direction are within required bounds.

Upvotes: 2

Paul Ogilvie
Paul Ogilvie

Reputation: 25266

If you are just tired of typing, yu can use the preprocessor, e.g.:

#define PLZ(dir) if(!dir)return(p_YZ_L);else if(dir==1)return(p_YZ_R);else return 0;

Upvotes: 3

ReshaD
ReshaD

Reputation: 946

You can use while with an iterator as follows:

double* getPointer(int plane, int direction){
  int i=0;
  while (i<26){
    if (plane == i){
       if (direction == 0)
          return  p_YZ_L; //Left
       else if(dir==1)
          return p_YZ_R; //Right
       else 
          return 0;
    }
    i++;
  }
}

It is not optimized but it is less code with respect to your version.

Upvotes: 1

Related Questions