1/* 2 * Copyright 1999-2009 Haiku, Inc. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Jeremy Friesner 7 */ 8#ifndef _BIT_FIELD_TESTERS_H 9#define _BIT_FIELD_TESTERS_H 10 11 12#include <Archivable.h> 13#include <List.h> 14#include <Message.h> 15 16 17// This file contains various BitTester classes, each of which defines a 18// sequence of bit testing logics to do on a uint32. 19 20// The abstract base class. Defines the interface. 21class _EXPORT BitFieldTester; 22class BitFieldTester : public BArchivable { 23public: 24 BitFieldTester(); 25 BitFieldTester(BMessage* from); 26 27 virtual bool IsMatching(uint32 field) = 0; 28 virtual status_t Archive(BMessage* into, 29 bool deep = true) const; 30}; 31 32 33// This version always returns the value specified in the constructor. 34class _EXPORT ConstantFieldTester; 35class ConstantFieldTester : public BitFieldTester { 36public: 37 ConstantFieldTester(bool result); 38 ConstantFieldTester(BMessage* from); 39 40 virtual status_t Archive(BMessage* into, 41 bool deep = true) const; 42 static BArchivable* Instantiate(BMessage* from); 43 virtual bool IsMatching(uint32 field); 44 45private: 46 bool fResult; 47}; 48 49 50// This version matches if all requiredBits are found in the field, 51// and no forbiddenBits are found. 52class _EXPORT HasBitsFieldTester; 53class HasBitsFieldTester : public BitFieldTester { 54public: 55 HasBitsFieldTester(uint32 requiredBits, 56 uint32 forbiddenBits = 0); 57 HasBitsFieldTester(BMessage* from); 58 59 virtual status_t Archive(BMessage* into, 60 bool deep = true) const; 61 static BArchivable* Instantiate(BMessage* from); 62 virtual bool IsMatching(uint32 field); 63 64private: 65 uint32 fRequiredBits; 66 uint32 fForbiddenBits; 67}; 68 69 70// This one negates the tester it holds. 71class _EXPORT NotFieldTester; 72class NotFieldTester : public BitFieldTester { 73public: 74 // (slave) should be allocated with new, becomes property of this object. 75 NotFieldTester(BitFieldTester* slave); 76 NotFieldTester(BMessage* from); 77 virtual ~NotFieldTester(); 78 79 virtual status_t Archive(BMessage* into, 80 bool deep = true) const; 81 static BArchivable* Instantiate(BMessage* from); 82 virtual bool IsMatching(uint32 field); 83 84private: 85 BitFieldTester* fSlave; 86}; 87 88 89// The most interesting class: This one returns true if at least (minNum) of 90// its slaves return true. It can be used for OR (i.e. minNum==1), AND 91// (i.e. minNum==numberofchildren), or anything in between! 92class _EXPORT MinMatchFieldTester; 93class MinMatchFieldTester : public BitFieldTester { 94public: 95 MinMatchFieldTester(int32 minNum, 96 bool deleteSlaves = true); 97 MinMatchFieldTester(BMessage* from); 98 virtual ~MinMatchFieldTester(); 99 100 // (slave) should be allocated with new, becomes property of this object. 101 void AddSlave(const BitFieldTester* slave); 102 103 virtual status_t Archive(BMessage* into, bool deep = true) const; 104 static BArchivable* Instantiate(BMessage* from); 105 virtual bool IsMatching(uint32 field); 106 107private: 108 BList fSlaves; 109 int32 fMinNum; 110 111 // true if we should delete all our slaves when we are deleted. 112 bool fDeleteSlaves; 113}; 114 115 116#endif // _BIT_FIELD_TESTERS_H 117