OpenZWave Library 1.2
Bitfield.h
Go to the documentation of this file.
1//-----------------------------------------------------------------------------
2//
3// Bitfield.h
4//
5// Variable length bitfield implementation
6//
7// Copyright (c) 2011 Mal Lansell <openzwave@lansell.org>
8//
9// SOFTWARE NOTICE AND LICENSE
10//
11// This file is part of OpenZWave.
12//
13// OpenZWave is free software: you can redistribute it and/or modify
14// it under the terms of the GNU Lesser General Public License as published
15// by the Free Software Foundation, either version 3 of the License,
16// or (at your option) any later version.
17//
18// OpenZWave is distributed in the hope that it will be useful,
19// but WITHOUT ANY WARRANTY; without even the implied warranty of
20// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21// GNU Lesser General Public License for more details.
22//
23// You should have received a copy of the GNU Lesser General Public License
24// along with OpenZWave. If not, see <http://www.gnu.org/licenses/>.
25//
26//-----------------------------------------------------------------------------
27
28#ifndef _Bitfield_H
29#define _Bitfield_H
30
31#include <vector>
32#include "Defs.h"
33
34namespace OpenZWave
35{
37 {
38 friend class Iterator;
39
40 public:
41 Bitfield():m_numSetBits(0){}
43
44 void Set( uint32 _idx )
45 {
46 if( !IsSet(_idx) )
47 {
48 uint32 newSize = (_idx>>5)+1;
49 if( newSize > m_bits.size() )
50 {
51 m_bits.resize( newSize, 0 );
52 }
53 m_bits[_idx>>5] |= (1<<(_idx&0x1f));
54 ++m_numSetBits;
55 }
56 }
57
58 void Clear( uint32 _idx )
59 {
60 if( IsSet(_idx) )
61 {
62 m_bits[_idx>>5] &= ~(1<<(_idx&0x1f));
63 --m_numSetBits;
64 }
65 }
66
67 bool IsSet( uint32 _idx )const
68 {
69 if( (_idx>>5) < m_bits.size() )
70 {
71 return( ( m_bits[_idx>>5] & (1<<(_idx&0x1f)) ) !=0 );
72 }
73 return false;
74 }
75
76 uint32 GetNumSetBits()const{ return m_numSetBits; }
77
79 {
80 friend class Bitfield;
81
82 public:
83 uint32 operator *() const
84 {
85 return m_idx;
86 }
87
89 {
90 // Search forward to next set bit
91 NextSetBit();
92 return *this;
93 }
94
96 {
97 Iterator tmp = *this;
98 ++tmp;
99 return tmp;
100 }
101
102 bool operator ==(const Iterator &rhs)
103 {
104 return m_idx == rhs.m_idx;
105 }
106
107 bool operator !=(const Iterator &rhs)
108 {
109 return m_idx != rhs.m_idx;
110 }
111
112 private:
113 Iterator( Bitfield const* _bitfield, uint32 _idx ): m_idx( _idx ), m_bitfield( _bitfield )
114 {
115 // If this is a begin iterator, move it to the first set bit
116 if( ( _idx == 0 ) && ( !m_bitfield->IsSet(0) ) )
117 {
118 NextSetBit();
119 }
120 }
121
122 void NextSetBit()
123 {
124 while( ((++m_idx)>>5)<m_bitfield->m_bits.size() )
125 {
126 // See if there are any bits left to find in the current uint32
127 if( ( m_bitfield->m_bits[m_idx>>5] & ~((1<<(m_idx&0x1f))-1) ) == 0 )
128 {
129 // No more bits - move on to next uint32 (or rather one less than
130 // the next uint32 because of the preincrement in the while statement)
131 m_idx = (m_idx&0xffffffe0)+31;
132 }
133 else
134 {
135 if( (m_bitfield->m_bits[m_idx>>5] & (1<<(m_idx&0x1f))) !=0 )
136 {
137 // This bit is set
138 return;
139 }
140 }
141 }
142 }
143
144 uint32 m_idx;
145 Bitfield const* m_bitfield;
146 };
147
148 Iterator Begin()const{ return Iterator( this, 0 ); }
149 Iterator End()const{ return Iterator( this, (uint32) m_bits.size()<<5 ); }
150
151 private:
153 vector<uint32> m_bits;
155 uint32 m_numSetBits;
156 };
157} // namespace OpenZWave
158
159#endif
160
161
162
unsigned int uint32
Definition: Defs.h:69
#define OPENZWAVE_EXPORT_WARNINGS_ON
Definition: Defs.h:53
#define OPENZWAVE_EXPORT
Definition: Defs.h:51
#define OPENZWAVE_EXPORT_WARNINGS_OFF
Definition: Defs.h:52
Definition: Bitfield.h:79
Iterator & operator++()
Definition: Bitfield.h:88
Iterator operator++(int)
Definition: Bitfield.h:95
Definition: Bitfield.h:37
Bitfield()
Definition: Bitfield.h:41
bool IsSet(uint32 _idx) const
Definition: Bitfield.h:67
~Bitfield()
Definition: Bitfield.h:42
Iterator End() const
Definition: Bitfield.h:149
void Set(uint32 _idx)
Definition: Bitfield.h:44
void Clear(uint32 _idx)
Definition: Bitfield.h:58
Iterator Begin() const
Definition: Bitfield.h:148
uint32 GetNumSetBits() const
Definition: Bitfield.h:76
Definition: Bitfield.h:35