Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
Home
Discussion GroupsGeneralPHPASPPerlColdFusionFlashHTML, CSS, ScriptsBrowsers

Webmaster Forum / HTML, CSS, Scripts / JavaScript / April 2005



Tip: Looking for answers? Try searching our database.

Lots of booleans

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
Christopher Benson-Manica - 28 Apr 2005 20:13 GMT
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.

Signature

Christopher Benson-Manica  | I *should* know what I'm talking about - if I
ataru(at)cyberspace.org    | don't, I need to know.  Flames welcome.

RobG - 29 Apr 2005 00:21 GMT
> I have a situation where I have many (more than 32) boolean flags:
>
[quoted text clipped - 11 lines]
> 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');">

Signature

Rob

Christopher Benson-Manica - 29 Apr 2005 13:22 GMT
>   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!

Signature

Christopher Benson-Manica  | I *should* know what I'm talking about - if I
ataru(at)cyberspace.org    | don't, I need to know.  Flames welcome.

RobG - 29 Apr 2005 16:38 GMT
>>  Have you considered an array, if element index is sufficient for
>>  locating the correct value, or an object if you need name:value
[quoted text clipped - 3 lines]
> 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
    }

Signature

Rob

Dr John Stockton - 29 Apr 2005 17:27 GMT
JRS:  In article <d4rckb$n29$1@chessie.cirr.com>, dated Thu, 28 Apr 2005
19:13:15, seen in news:comp.lang.javascript, Christopher Benson-Manica
<ataru@nospam.cyberspace.org> posted :
>I have a situation where I have many (more than 32) boolean flags:
>
[quoted text clipped - 11 lines]
>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.

Signature

© John Stockton, Surrey, UK.  ?@merlyn.demon.co.uk   Turnpike v4.00   IE 4 ©
<URL:http://www.jibbering.com/faq/>  JL/RC: FAQ of news:comp.lang.javascript
<URL:http://www.merlyn.demon.co.uk/js-index.htm> jscr maths, dates, sources.
<URL:http://www.merlyn.demon.co.uk/> TP/BP/Delphi/jscr/&c, FAQ items, links.

Stephen Chalmers - 30 Apr 2005 06:53 GMT
> I have a situation where I have many (more than 32) boolean flags:
>
[quoted text clipped - 15 lines]
> Christopher Benson-Manica  | I *should* know what I'm talking about - if I
> ataru(at)cyberspace.org    | don't, I need to know.  Flames welcome.

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[i], 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>

--
Stephen Chalmers        http://makeashorterlink.com/?H3E82245A
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2009 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.