Free Electron
DynamicBitset.h
Go to the documentation of this file.
1 /* Copyright (C) 2003-2021 Free Electron Organization
2  Any use of this software requires a license. If a valid license
3  was not distributed with this file, visit freeelectron.org. */
4 
5 /** @file */
6 
7 #ifndef __data_DynamicBitset_h__
8 #define __data_DynamicBitset_h__
9 
10 //#define FE_BOOST_BITSET
11 #ifdef FE_BOOST_BITSET
12 #include "boost/dynamic_bitset.hpp"
13 typedef boost::dynamic_bitset<> t_bitset;
14 #else
15 // this is minmally implemented to replace boost::dynamic_bitset<> in FE's use
16 // do not use it in new code.
17 class VeryCrudeDynamicBitset
18 {
19  public:
20 
21  VeryCrudeDynamicBitset(void) {}
22 
23  VeryCrudeDynamicBitset(size_t a_size)
24  {
25  m_vec.resize(a_size);
26  for(unsigned int i = 0 ; i < m_vec.size(); i++)
27  {
28  m_vec[i] = 0;
29  }
30  }
31 
32  bool is_subset_of(const VeryCrudeDynamicBitset &a_bitset) const
33  {
34  unsigned int other_size_minus_one =
35  (unsigned int)(a_bitset.m_vec.size()-1);
36  for(unsigned int i = 0 ; i < m_vec.size(); i++)
37  {
38  if(m_vec[i])
39  {
40  if(i > other_size_minus_one) { return false; }
41  if(!a_bitset.m_vec[i]) { return false; }
42  }
43  }
44  return true;
45  }
46 
47  bool operator==(const VeryCrudeDynamicBitset &a_bitset) const
48  {
49  if(m_vec.size() != a_bitset.m_vec.size())
50  {
51  return false;
52  }
53  for(unsigned int i = 0 ; i < m_vec.size(); i++)
54  {
55  if(m_vec != a_bitset.m_vec)
56  {
57  return false;
58  }
59  }
60  return true;
61  }
62  bool operator<(const VeryCrudeDynamicBitset &a_bitset) const
63  {
64  if(m_vec.size() < a_bitset.m_vec.size())
65  {
66  return true;
67  }
68  if(m_vec.size() > a_bitset.m_vec.size())
69  {
70  return false;
71  }
72  for(unsigned int i = 0 ; i < m_vec.size(); i++)
73  {
74  if(m_vec > a_bitset.m_vec)
75  {
76  return false;
77  }
78  if(m_vec < a_bitset.m_vec)
79  {
80  return true;
81  }
82  }
83  return false;
84  }
85  void resize(unsigned int a_size)
86  {
87  m_vec.resize(a_size);
88  }
89 
90  void set(unsigned int a_index)
91  {
92  m_vec[a_index] = U8(true);
93  }
94 
95  bool operator [] (unsigned int a_index) const
96  {
97  return bool(m_vec[a_index]) == true;
98  }
99 
100  VeryCrudeDynamicBitset
101  operator & (const VeryCrudeDynamicBitset &a_other) const
102  {
103  VeryCrudeDynamicBitset result(m_vec.size());
104  for(unsigned int i = 0; i < m_vec.size(); i++)
105  {
106  if(a_other.m_vec[i] && m_vec[i])
107  {
108  result.m_vec[i] = true;
109  }
110  else
111  {
112  result.m_vec[i] = false;
113  }
114  }
115  return result;
116  }
117 
118  VeryCrudeDynamicBitset
119  operator | (const VeryCrudeDynamicBitset &a_other) const
120  {
121  VeryCrudeDynamicBitset result(m_vec.size());
122  for(unsigned int i = 0; i < m_vec.size(); i++)
123  {
124  if(a_other.m_vec[i] || m_vec[i])
125  {
126  result.m_vec[i] = true;
127  }
128  else
129  {
130  result.m_vec[i] = false;
131  }
132  }
133  return result;
134  }
135 
136  unsigned int size(void) const { return m_vec.size(); }
137 
138  private:
139 
140  std::vector<U8> m_vec;
141 
142 };
143 typedef VeryCrudeDynamicBitset t_bitset;
144 #endif
145 
146 inline bool partial_is_subset(const t_bitset &a_sub, const t_bitset &a_set)
147 {
148  if(a_sub.size() != a_set.size())
149  {
150  t_bitset a_fit = a_sub;
151  a_fit.resize(a_set.size());
152  return a_fit.is_subset_of(a_set);
153  }
154  return a_sub.is_subset_of(a_set);
155 }
156 
157 #endif /* __data_DynamicBitset_h__ */