Lots of booleans

  • Thread starter Christopher Benson-Manica
  • Start date
C

Christopher Benson-Manica

I have a situation where I have many (more than 32) boolean flags:

var foo=true;
var bar=false;
var baz=false;
// etc.

At various points in the script, these flags may be set or unset.
There is a point where an action is to be taken only if all the flags
are false. I also need to debug this check of all flags - i.e., print
out the value of all 32+ of these flags. I'd like to find something
besides a monstrous conditional - for example, using an integer and
storing these flags as bits in it, except that since there are more
than 32 of these flags an integer will not contain all of them. Any
suggestions would be appreciated.
 
R

RobG

Christopher said:
I have a situation where I have many (more than 32) boolean flags:

var foo=true;
var bar=false;
var baz=false;
// etc.

At various points in the script, these flags may be set or unset.
There is a point where an action is to be taken only if all the flags
are false. I also need to debug this check of all flags - i.e., print
out the value of all 32+ of these flags. I'd like to find something
besides a monstrous conditional - for example, using an integer and
storing these flags as bits in it, except that since there are more
than 32 of these flags an integer will not contain all of them. Any
suggestions would be appreciated.

Have you considered an array, if element index is sufficient for
locating the correct value, or an object if you need name:value
pairs?

Checking through all the values or printing them out would only
require a small do..while or for..in loop.

Here's something to play with, you can add as many variables as you
like. No doubt some of the loops can be optimised.

<script type="text/javascript">
var glob = {
foo : true,
bar : true,
baz : true
}

function showGlob(){
var msg = '';
for ( varName in glob ){
msg += '\n' + varName + ' : ' + glob[varName];
}
alert(msg);
}

function checkTrue() {
var x = true;
for ( varName in glob ){
x = ( x && glob[varName]);
}
return x;
}

</script>

<input type="button" value="Show vars"
onclick="showGlob();">
<input type="button" value="Set foo false"
onclick="glob['foo']=false;">
<input type="button" value="Set foo true"
onclick="glob['foo']=true;">
<input type="button" value="Check if all true"
onclick="
(checkTrue())? alert('All are true'):
alert('At least one is false');">
 
C

Christopher Benson-Manica

RobG said:
Have you considered an array, if element index is sufficient for
locating the correct value, or an object if you need name:value
pairs?

I did consider that, but my thinking was that it would make the code
significantly more cluttered. I may yet do that, since dealing with
this number of boolean flags is a PITA, quite frankly :) Thanks!
 
R

RobG

Christopher said:
I did consider that, but my thinking was that it would make the code
significantly more cluttered. I may yet do that, since dealing with
this number of boolean flags is a PITA, quite frankly :) Thanks!


I don't see how it clutters your code. You can create a single
object with a single method (and add more if required). 'glob' could
hold anything, if it had only booleans then glob.allTrue is much
simpler- the for..in block needs only one statement. Initialising
the array is barely more code that initialising the same number of
variables, and it's vastly simpler to check if they're all true.

glob = {
foo : true,
bar : true,
baz : true,
dud : null,
str : '',
num : 9
}

// Method allTrue: returns true if all booleans are true
glob.allTrue = function() {
var x = true;
for ( varName in this ) {
if ( 'boolean' == typeof this[varName] ) {
x = ( x && this[varName]);
}
}
return x;
}

To set say foo to true:

glob.foo = true;

To do something if all the booleans are true:

if ( glob.allTrue() ) {
// do something
}
 
D

Dr John Stockton

JRS: In article <[email protected]>, dated Thu, 28 Apr 2005
19:13:15, seen in Christopher Benson-Manica
I have a situation where I have many (more than 32) boolean flags:

var foo=true;
var bar=false;
var baz=false;
// etc.

At various points in the script, these flags may be set or unset.
There is a point where an action is to be taken only if all the flags
are false. I also need to debug this check of all flags - i.e., print
out the value of all 32+ of these flags. I'd like to find something
besides a monstrous conditional - for example, using an integer and
storing these flags as bits in it, except that since there are more
than 32 of these flags an integer will not contain all of them. Any
suggestions would be appreciated.

Put them all in an Object, declared as B = {} or with preset contents.
Test them with a function.

function Any(b) { var j
for (j in b) if (b[j]) return true
return false }

function All(b) { var j
for (j in b) if (!b[j]) return false
return true }

function Umm(b) { var j
for (j in b) if (!b[j]) return true
return false }

function Nun(b) { var j
for (j in b) if (b[j]) return false
return true }

B = {}
B.foo = 0
B.bar = 1
B.xxx = true
x = [Any(B), All(B), Umm(B), Nun(B)]

You may need a similar but different function.
 
S

Stephen Chalmers

Christopher Benson-Manica said:
I have a situation where I have many (more than 32) boolean flags:

var foo=true;
var bar=false;
var baz=false;
// etc.

At various points in the script, these flags may be set or unset.
There is a point where an action is to be taken only if all the flags
are false. I also need to debug this check of all flags - i.e., print
out the value of all 32+ of these flags. I'd like to find something
besides a monstrous conditional - for example, using an integer and
storing these flags as bits in it, except that since there are more
than 32 of these flags an integer will not contain all of them. Any
suggestions would be appreciated.

To store your flags as bits, just use as many integers as you need in an
array to accomodate all the bits.
You can index the relevant integer containing the desired flag thus:
rray[ flagIndex / 32 ] , then just perform a suitable bitwise operation to
read/manipulate the desired bit.

<SCRIPT type='text/javascript'>

function boolManager(boolCount)
{
this.boolCount=boolCount;
this.boolStore=[ 1 + boolCount/32 ];
}

boolManager.prototype.readBool=function(ind)
{
return this.boolStore[ ind/32 ] & 1<<Math.floor(ind % 32);
}

boolManager.prototype.setBool=function(ind, state)
{
state ? ( this.boolStore[ ind/32 ] |= 1 << ind % 32 )
: ( this.boolStore[ ind/32 ] &= ~( 1 << ind % 32 ) );
}

boolManager.prototype.flipBool=function(ind)
{
this.boolStore[ ind/32 ] ^= 1 << ind % 32
}

boolManager.prototype.listBools=function()
{
for(var i=0; i<this.boolCount; i++) // read & display all flags
document.write('<BR>'+ i + " : " + (this.readBool(i)?"True":"False") );
}

boolManager.prototype.allBoolsFalse=function()
{
var rv;

for(var i=0; i<this.boolCount && !(rv=this.readBool(i)) ; i++)
;

return !rv;
}

boolManager.prototype.allBoolsTrue=function()
{
var rv;

for(var i=0; i<this.boolCount && (rv=this.readBool(i)) ; i++)
;

return rv;
}




// ========= Demonstration Code =======

var boolCount=40, // # of booleans in use
setFlags=[ 6, 13, 26, 27, 34, 38 ], // some arbitrary booleans to be
set
myBools=new boolManager(boolCount);

document.write("Set 6, 13, 26, 27, 34 & 38 <BR><BR>");

for(var i=0; i<setFlags.length; i++) // set some booleans to true
myBools.setBool(setFlags, true);

myBools.listBools(); // list results


document.write("<BR><BR>Flip all flags :<BR>");

for(var i=0; i<boolCount; i++) // invert all flags
myBools.flipBool(i);

myBools.listBools();


document.write("<BR><BR>Reset all flags :<BR>");

for(var i=0; i<boolCount; i++) // reset all flags
myBools.setBool(i, false);

myBools.listBools();


document.write("<BR><BR>Test for all false: " +
(myBools.allBoolsFalse()?"Yes":"No") );


document.write("<BR><BR>Set flag 0 true <BR>");

myBools.setBool(0, true);

document.write("<BR>Test for all false: " +
(myBools.allBoolsFalse()?"Yes":"No") );


document.write("<BR><BR>Set all flags true:<BR>");

for(var i=0; i<boolCount; i++) // Set all flags
myBools.setBool(i, true);

document.write("<BR>Test for all true: " +
(myBools.allBoolsTrue()?"Yes":"No") );


document.write("<BR><BR>Set flag 20 false <BR>");

myBools.setBool(20, false);

document.write("<BR>Test for all true: " +
(myBools.allBoolsTrue()?"Yes":"No") );


document.write("<BR><BR>Sorted.");

</SCRIPT>
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,982
Messages
2,570,185
Members
46,737
Latest member
Georgeengab

Latest Threads

Top