1/////////////////////////////////////////////////////////////////////////////
2// Name:        wx/flags.h
3// Purpose:     a bitset suited for replacing the current style flags
4// Author:      Stefan Csomor
5// Modified by:
6// Created:     27/07/03
7// RCS-ID:      $Id: flags.h 35650 2005-09-23 12:56:45Z MR $
8// Copyright:   (c) 2003 Stefan Csomor
9// Licence:     wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#ifndef _WX_SETH__
13#define _WX_SETH__
14
15// wxBitset should be applied to an enum, then this can be used like
16// bitwise operators but keeps the type safety and information, the
17// enums must be in a sequence , their value determines the bit position
18// that they represent
19// The api is made as close as possible to <bitset>
20
21template <class T> class wxBitset
22{
23    friend class wxEnumData ;
24public:
25    // creates a wxBitset<> object with all flags initialized to 0
26    wxBitset() { m_data = 0; }
27
28    // created a wxBitset<> object initialized according to the bits of the
29    // integral value val
30    wxBitset(unsigned long val) { m_data = val ; }
31
32    // copies the content in the new wxBitset<> object from another one
33    wxBitset(const wxBitset &src) { m_data = src.m_data; }
34
35    // creates a wxBitset<> object that has the specific flag set
36    wxBitset(const T el) { m_data |= 1 << el; }
37
38    // returns the integral value that the bits of this object represent
39    unsigned long to_ulong() const { return m_data ; }
40
41    // assignment
42    wxBitset &operator =(const wxBitset &rhs)
43    {
44        m_data = rhs.m_data;
45        return *this;
46    }
47
48    // bitwise or operator, sets all bits that are in rhs and leaves
49    // the rest unchanged
50    wxBitset &operator |=(const wxBitset &rhs)
51    {
52        m_data |= rhs.m_data;
53        return *this;
54    }
55
56    // bitwsie exclusive-or operator, toggles the value of all bits
57    // that are set in bits and leaves all others unchanged
58    wxBitset &operator ^=(const wxBitset &rhs) // difference
59    {
60        m_data ^= rhs.m_data;
61        return *this;
62    }
63
64    // bitwise and operator, resets all bits that are not in rhs and leaves
65    // all others unchanged
66    wxBitset &operator &=(const wxBitset &rhs) // intersection
67    {
68        m_data &= rhs.m_data;
69        return *this;
70    }
71
72    // bitwise or operator, returns a new bitset that has all bits set that set are in
73    // bitset2 or in this bitset
74    wxBitset operator |(const wxBitset &bitset2) const // union
75    {
76        wxBitset<T> s;
77        s.m_data = m_data | bitset2.m_data;
78        return s;
79    }
80
81    // bitwise exclusive-or operator, returns a new bitset that has all bits set that are set either in
82    // bitset2 or in this bitset but not in both
83    wxBitset operator ^(const wxBitset &bitset2) const // difference
84    {
85        wxBitset<T> s;
86        s.m_data = m_data ^ bitset2.m_data;
87        return s;
88    }
89
90    // bitwise and operator, returns a new bitset that has all bits set that are set both in
91    // bitset2 and in this bitset
92    wxBitset operator &(const wxBitset &bitset2) const // intersection
93    {
94        wxBitset<T> s;
95        s.m_data = m_data & bitset2.m_data;
96        return s;
97    }
98
99    // sets appropriate the bit to true
100    wxBitset& set(const T el) //Add element
101    {
102        m_data |= 1 << el;
103        return *this;
104    }
105
106    // clears the appropriate flag to false
107    wxBitset& reset(const T el) //remove element
108    {
109        m_data &= ~(1 << el);
110        return *this;
111    }
112
113    // clear all flags
114    wxBitset& reset()
115    {
116        m_data = 0;
117        return *this;
118    }
119
120    // true if this flag is set
121    bool test(const T el) const
122    {
123        return (m_data & (1 << el)) ? true : false;
124    }
125
126    // true if no flag is set
127    bool none() const
128    {
129        return m_data == 0;
130    }
131
132    // true if any flag is set
133    bool any() const
134    {
135        return m_data != 0;
136    }
137
138    // true if both have the same flags
139    bool operator ==(const wxBitset &rhs) const
140    {
141        return m_data == rhs.m_data;
142    }
143
144    // true if both differ in their flags set
145    bool operator !=(const wxBitset &rhs) const
146    {
147        return !operator==(rhs);
148    }
149
150    bool operator[] (const T el) const { return test(el) ; }
151
152private :
153    unsigned long m_data;
154};
155
156#define WX_DEFINE_FLAGS( flags ) \
157    class WXDLLEXPORT flags \
158    {\
159    public : \
160        flags(long data=0) :m_data(data) {} \
161        long m_data ;\
162        bool operator ==(const flags &rhs) const { return m_data == rhs.m_data; }\
163    } ;
164
165#endif
166