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