Lots of booleans

Discussion in 'Javascript' started by Christopher Benson-Manica, Apr 28, 2005.

  1. 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.

    --
    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.
    Christopher Benson-Manica, Apr 28, 2005
    #1
    1. Advertising

  2. Christopher Benson-Manica

    RobG Guest

    Christopher Benson-Manica wrote:
    > 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');">


    --
    Rob
    RobG, Apr 29, 2005
    #2
    1. Advertising

  3. RobG <> wrote:

    > 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!

    --
    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.
    Christopher Benson-Manica, Apr 29, 2005
    #3
  4. Christopher Benson-Manica

    RobG Guest

    Christopher Benson-Manica wrote:
    > RobG <> wrote:
    >
    >
    >> 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!
    >



    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
    }


    --
    Rob
    RobG, Apr 29, 2005
    #4
  5. JRS: In article <d4rckb$n29$>, dated Thu, 28 Apr 2005
    19:13:15, seen in news:comp.lang.javascript, Christopher Benson-Manica
    <> posted :
    >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.

    --
    © 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.
    Dr John Stockton, Apr 29, 2005
    #5
  6. Christopher Benson-Manica <> wrote in message
    news:d4rckb$n29$...
    > 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.
    >
    > --
    > 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, 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
    Stephen Chalmers, Apr 30, 2005
    #6
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. array of booleans

    , Oct 1, 2005, in forum: Java
    Replies:
    4
    Views:
    532
  2. Martin Herbert Dietze

    g++: integers as booleans, no warning?

    Martin Herbert Dietze, Feb 17, 2005, in forum: C++
    Replies:
    9
    Views:
    462
    Karl Heinz Buchegger
    Feb 18, 2005
  3. Roman Suzi

    Booleans and comparison results

    Roman Suzi, Jun 24, 2003, in forum: Python
    Replies:
    0
    Views:
    694
    Roman Suzi
    Jun 24, 2003
  4. brad
    Replies:
    9
    Views:
    351
    Bruno Desthuilliers
    Jun 19, 2008
  5. coolneo
    Replies:
    9
    Views:
    176
    coolneo
    Jan 30, 2007
Loading...

Share This Page