George wrote:
> I would like bitfields much more if you could do:
>
> unsigned bits[1024] : 1;
Reasoning for this is that ": 1" specifies the width (in bits) of
the variable. Thus, you are saying that an array of 1024
unsigned integers should fit inside 1 bit; _not_ that it should
create an array of 1024 bit-sized unsigned integers.
Note that, using your patch, you can compile CircleMUD with g++,
and thus, you can use classes to emulate this behaviour.
class bit {
unsigned int m_bit : 1;
bit()
: m_bit(0)
{ /* empty function */ }
};
class bitfield {
public:
int sizeof_bf;
bit *bf;
private:
bitfield(int size)
: sizeof_bf(size), bf(new bit[size])
{ /* empty function */ }
int operator[](int x);
inline void set(int x) { bf[x] = 1; }
inline void rem(int x) { bf[x] = 0; }
}
int bitfield::operator[](int x)
{
if (x < 0 || x >= sizeof_bf) {
log("Bitfield array overrun!");
return -1;
} else
return bf[x].m_bit;
}
Assuming that the above mailer-code is correct (and, chances are, it
isn't), you can now access a bitfield as:
bitfield bitf(10); // construct the bitfield (dynamically)
bitf.set(5);
printf("The value of bit 5 of the bitfield is: %d\n", bitf[5]);
Note that this isn't exactly a traditional bitfield. It is more of
a "dynamic" bitfield, since it is constructed dynamically; but,
using a class-based approach can allow you to almost completely
hide the fact that you are using bitfields, not bitvectors, just by
writing enough "operator" functions. Of course, it'd probably take
a lot better design than the one I presented above.
-dak
+------------------------------------------------------------+
| Ensure that you have read the CircleMUD Mailing List FAQ: |
| http://democracy.queensu.ca/~fletcher/Circle/list-faq.html |
+------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/15/00 PST