Multi switch statement with single variable?

Community Forums/General Help/Multi switch statement with single variable?

(tu) ENAY(Posted 2012) [#1]
Hi guys,

Quick programming question (in C#) but how do you do a multi switch argument statement with a single variable? I used to know how to do it but I've forgotten and I can't seem to get the syntax correct.

I know what you do is have a parameter and use the single | statement to grab each bit.
For example.

Psuedo Code

MOO = 1
POO = 2
PLOP = 4
MOOSE = 8

myparam = MOO + PLOP;

switch (myparam)
{
 case | MOO
   // Code
   break; 
 case | POO
   // Code
   break; 
 case | PLOP
   // Code
   break; 
 case | MOOSE
   // Code
   break; 
}


Or something like this
Can anyone point out where I am going wrong? :)


Yasha(Posted 2012) [#2]
I honestly don't get what you're trying to do with that | operator. That's not valid C# syntax and ...that doesn't look like the switch statement's intended use, either. You can find an example of using switch here: http://en.wikipedia.org/wiki/Switch_statement#C.23

...but perhaps a BlitzMax translation of what you want the code to do is in order, because you're clearly going for something more involved?

I have the feeling what you want won't work with switch, because switch needs to be able to compile to a jump table (may be implemented as If behind the scenes, but that's unrelated) and therefore can't have dynamic expressions as the case arguments: everything needs to be constant. If you want each arm to take apart a runtime value, you probably need to use a chain of if statements each with their own expression test.


(tu) ENAY(Posted 2012) [#3]
That was merely Psuedo Code.
It is like when you do an AND operation on a 8 bit.

if (myparam | MOO)
{
}
if (myparam | POO)
{
}

Blitz3D uses on LoadImage when you pass a flag in there, you have COLOR + BITMAP
which is if I recall 1 + 8.

I want the opposite of that.


Yasha(Posted 2012) [#4]
...I don't think you can use switch for that, unless there's some extra switch syntax C# added on top of what it inherited. I think you have to do it with ordered operations. Simplest:

if (myparam & MOO != 0) {
    ...
} else if (myparam & POO != 0) {
    ...
}


Or, more needlessly complicated but possibly closer to the idiom you want:

var actions = new Dictionary<int, Func<int, int>>
{
    { MOO, x => { return doSomething(x); } }
    { POO, x => { return doSomething(x); } }
    ...
};
foreach(KeyValuePair<int, Func<int, int>> act in actions) {
    if (myparam & act.Key != 0) return act.Value(act.Key);
}



(tu) ENAY(Posted 2012) [#5]
Thanks for your help Yasha, I appreciate it. :)

I finally figured out what I was trying to do. It was a bitmask switch statement I needed. Something like this.

http://stackoverflow.com/questions/6607627/bitmask-switch-statement

I suck at explaining my problems! Sorry about that. I could lie but sadly English is my first language so I have no excuses ;)