#include "BitFieldTesters.h"
#include <stdio.h>
#define NOTE "NotFieldTester : "
#define MINI "MinMatchFieldTester : "
BitFieldTester::BitFieldTester()
{
}
BitFieldTester::BitFieldTester(BMessage* from)
:
BArchivable(from)
{
}
status_t
BitFieldTester::Archive(BMessage* into, bool deep) const
{
return BArchivable::Archive(into, deep);
}
ConstantFieldTester::ConstantFieldTester(bool result)
:
fResult(result)
{
}
ConstantFieldTester::ConstantFieldTester(BMessage* from)
:
BitFieldTester(from)
{
if (from->FindBool("ctRes", &fResult) != B_OK)
printf("ConstantFieldTester: Error, no ctRes!\n");
}
status_t
ConstantFieldTester::Archive(BMessage* into, bool deep) const
{
status_t result = BitFieldTester::Archive(into, deep);
into->AddBool("ctRes", fResult);
return result;
}
BArchivable*
ConstantFieldTester::Instantiate(BMessage* from)
{
if (validate_instantiation(from, "ConstantFieldTester"))
return new ConstantFieldTester(from);
else
return NULL;
}
bool
ConstantFieldTester::IsMatching(uint32 field)
{
return fResult;
}
HasBitsFieldTester::HasBitsFieldTester(uint32 requiredBits,
uint32 forbiddenBits)
:
fRequiredBits(requiredBits),
fForbiddenBits(forbiddenBits)
{
}
HasBitsFieldTester::HasBitsFieldTester(BMessage* from)
:
BitFieldTester(from)
{
if (from->FindInt32("rqBits", (int32*) &fRequiredBits) != B_OK)
printf("HasBitsFieldTester: Error, no rqBits!\n");
if (from->FindInt32("fbBits", (int32*) &fForbiddenBits) != B_OK)
printf("HasBitsFieldTester: Error, no fbBits!\n");
}
status_t
HasBitsFieldTester::Archive(BMessage* into, bool deep) const
{
status_t result = BitFieldTester::Archive(into, deep);
into->AddInt32("rqBits", fRequiredBits);
into->AddInt32("fbBits", fForbiddenBits);
return result;
}
BArchivable*
HasBitsFieldTester::Instantiate(BMessage* from)
{
if (validate_instantiation(from, "HasBitsFieldTester"))
return new HasBitsFieldTester(from);
else
return NULL;
}
bool
HasBitsFieldTester::IsMatching(uint32 field)
{
return ((((fRequiredBits & (~field)) == 0))
&& ((fForbiddenBits & (~field)) == fForbiddenBits));
}
NotFieldTester::NotFieldTester(BitFieldTester* slave)
:
fSlave(slave)
{
}
NotFieldTester::~NotFieldTester()
{
delete fSlave;
}
NotFieldTester::NotFieldTester(BMessage* from)
:
BitFieldTester(from),
fSlave(NULL)
{
BMessage slaveMessage;
if (from->FindMessage("nSlave", &slaveMessage) == B_OK) {
BArchivable* slaveObject = instantiate_object(&slaveMessage);
if (slaveObject != NULL) {
fSlave = dynamic_cast<BitFieldTester*>(slaveObject);
if (fSlave == NULL) {
printf(NOTE "Error casting slaveObject to BitFieldTester!\n");
delete slaveObject;
}
} else
printf(NOTE "instantiate_object returned NULL!\n");
} else
printf(NOTE "Couldn't unarchive NotFieldTester slave!\n");
}
status_t
NotFieldTester::Archive(BMessage* into, bool deep) const
{
if (fSlave == NULL)
return B_ERROR;
status_t result = BitFieldTester::Archive(into, deep);
if (result == B_OK) {
BMessage message;
result = fSlave->Archive(&message, deep);
into->AddMessage("nSlave", &message);
}
return result;
}
BArchivable*
NotFieldTester::Instantiate(BMessage* from)
{
if (validate_instantiation(from, "NotFieldTester"))
return new NotFieldTester(from);
else
return NULL;
}
bool
NotFieldTester::IsMatching(uint32 field)
{
return fSlave ? (!fSlave->IsMatching(field)) : false;
}
MinMatchFieldTester::MinMatchFieldTester(int32 minNum, bool deleteSlaves)
:
fMinNum(minNum),
fDeleteSlaves(deleteSlaves)
{
}
MinMatchFieldTester::~MinMatchFieldTester()
{
if (fDeleteSlaves) {
int32 last = fSlaves.CountItems();
for (int32 i = 0; i < last; i++)
delete ((BitFieldTester*) fSlaves.ItemAt(i));
}
}
MinMatchFieldTester::MinMatchFieldTester(BMessage* from)
:
BitFieldTester(from),
fDeleteSlaves(true)
{
int32 i = 0;
BMessage slaveMessage;
while (from->FindMessage("mSlave", i++, &slaveMessage) == B_OK) {
BArchivable* slaveObject = instantiate_object(&slaveMessage);
if (slaveObject) {
BitFieldTester* nextSlave = dynamic_cast<BitFieldTester*>(slaveObject);
if (nextSlave)
fSlaves.AddItem(nextSlave);
else {
printf(MINI "Error casting slaveObject to BitFieldTester!\n");
delete slaveObject;
}
} else
printf(MINI "instantiate_object returned NULL!\n");
}
if (from->FindInt32("mMin", (int32*)&fMinNum) != B_OK)
puts(MINI "Error getting mMin!");
}
void
MinMatchFieldTester::AddSlave(const BitFieldTester* slave)
{
fSlaves.AddItem((void*) slave);
}
status_t
MinMatchFieldTester::Archive(BMessage* into, bool deep) const
{
status_t result = BitFieldTester::Archive(into, deep);
if (result == B_OK) {
int32 last = fSlaves.CountItems();
for (int32 i = 0; i < last; i++) {
BMessage msg;
result = ((BitFieldTester*)fSlaves.ItemAt(i))->Archive(&msg, deep);
if (result != B_OK)
return result;
into->AddMessage("mSlave", &msg);
}
}
into->AddInt32("mMin", fMinNum);
return result;
}
BArchivable*
MinMatchFieldTester::Instantiate(BMessage* from)
{
if (validate_instantiation(from, "MinMatchFieldTester"))
return new MinMatchFieldTester(from);
else
return NULL;
}
bool
MinMatchFieldTester::IsMatching(uint32 field)
{
int32 last = fSlaves.CountItems();
if (fMinNum == 0 && last == 0) {
return true;
}
int32 count = 0;
for (int32 i = 0; i < last; i++) {
if ((((BitFieldTester*)fSlaves.ItemAt(i))->IsMatching(field))
&& (++count >= fMinNum)) {
return true;
}
}
return false;
}