Here's a simple class that fills a common need: A BitVector.

This software, and the included source code, is FREEWARE.

You may use it as you see fit in your own projects but you may 
not re-sell the original or a derivative. If you redistribute 
it you must include this disclaimer and all original copyright
notices. 

No warranty is inferred or implied, as always seems to be the
case with software these days. Use at your own risk. Keep away
from small children. Don't exceed recommended dosage. I'm not
liable, I'm not liable, I'm not liable.

It's not complete, or *extremely* well thought out I suppose,
but it's a good starting point. You'll see some "TBD"s in the
code which indicates that it's a work in progress.

There's not much code, and I haven't done any real docs on it
yet, but it should be useful none-the-less and you can always
e-mail questions to me.

I'd love to see people improve upon this work. Please keep me 
posted if you do. If you should happen to change the behavior
in a derivative version please change the class name so as not
to cause problems with existing code.

Enjoy!

--Gregg Irwin [72450,676]

--------------------------------------------------------------

Q. What's a BitVector? 

A. It's just an array designed to store True/False values.

--------------------------------------------------------------

Q. Can't I just define an array of Boolean variables to do 
   that?

A. Yes you can.

--------------------------------------------------------------

Q. Why would I want to use a BitVector instead of an
   array of Boolean variables?

A. Size. Boolean variables are stored as 16-bit 
   (2-byte) integers. If you have a small number of 
   items to track then memory consumption may not be
   a concern to you. If, however, you had 1,000,000
   items to track then you might flinch a bit at using
   2 meg of memory to do so. A BitVector uses only 1
   bit per item, instead of 16 bits like a Boolean does.
   To track 1,000,000 items you would only use 125K of
   memory, rather than 2 meg.

   Under VB4/32 they may actually be stored as 32 bit
   (i.e. long) integers if I recall correctly. The current
   docs don't say so but it would make sense to make them
   as fast as possible on 32 bit systems. Keeping things
   aligned, etc.

--------------------------------------------------------------

Q. What's the downside?

A. Speed. Rather than referencing array variables directly
   the BitVector has to do a bit of processing to identify
   individual bits. Jim Mack has written routines in assembly
   language (which are part of Microhelp Muscle) that should
   be fast enough for *anybody*. Using a table to look up 
   values could also speed things up a bit. There's a note
   in the code about this idea.

--------------------------------------------------------------

Q. How do I use it?

A. It's easy.
   
   1. Dim a variable to hold the bit vector.

      Example: Dim BV As New BitVector

   2. Set the number of elements you want the BitVector to
      hold using the NumElements property.

      Example: BV.NumElements = 25000

   3. Set, Get, Clear, Toggle, and Test bits by referencing 
      their index.

      BV.SetBit 12345
      BitVal = BV.GetBit 12345
      BV.ClearBit 12345
      BV.ToggleBit 12345
      On = BV.IsBitSet 12345

--------------------------------------------------------------
 
Q. What's the difference between GetBit and IsBitSet?

A. GetBit returns the actual value of the bit (1 or 0) while
   IsBitSet returns a boolean value of True or False.

--------------------------------------------------------------

Q. What if I want to set, or clear, all of the bits at once?

A. Simple. Use the SetAll or ClearAll methods.

--------------------------------------------------------------

Q. Why a class module?

A. Why not? It has a defined interface. It provides 
   encapsulation. It allows you to create multiple instances
   easily. It can be used as an OLE server. It can raise
   errors effectively. 'nuff said?

--------------------------------------------------------------

Q. What if I forget how many elements are in a BitVector?

A. Use the NumElements method to find out.

   Example: ElCount = BV.NumElements

--------------------------------------------------------------

Q. What if I "grow" a BitVector (i.e. increase NumElements)?

A. It remembers the current bit states so you'll need to 
   clear them manually if that's what you want. New bits will
   be "off" initially.

--------------------------------------------------------------

Q. What if I have suggestions, requests, or improvements?

A. Send them to me and I'll get back to you as quickly as I 
   can. Hopefully we can make it a community effort and build
   up a good library of tools that we can all draw upon.

--------------------------------------------------------------

Q. What if it has a bug in it that costs me millions of 
   dollars?

A. Re-read the disclaimer and let me know about the bug 
   please.<g>

--------------------------------------------------------------
 