31#if defined( _MSC_VER )
36typedef SSIZE_T ssize_t;
45 BASE_SET(
size_t size = 64 ) : m_bits( size, 0 ) {}
47 bool test(
size_t pos )
const
49 if( pos >= m_bits.size() )
52 return m_bits[pos] == 1;
55 bool any()
const {
return std::any_of( m_bits.begin(), m_bits.end(), [](
int bit ) { return bit == 1; } ); }
57 bool all()
const {
return std::all_of( m_bits.begin(), m_bits.end(), [](
int bit ) { return bit == 1; } ); }
59 bool none()
const {
return std::none_of( m_bits.begin(), m_bits.end(), [](
int bit ) { return bit == 1; } ); }
61 BASE_SET&
set(
size_t pos = std::numeric_limits<size_t>::max(),
bool value =
true )
63 if( pos == std::numeric_limits<size_t>::max() )
65 std::fill( m_bits.begin(), m_bits.end(), value ? 1 : 0 );
69 if( pos >= m_bits.size() )
70 m_bits.resize( pos + 1, 0 );
72 m_bits[pos] = value ? 1 : 0;
78 if( pos == std::numeric_limits<size_t>::max() )
80 std::fill( m_bits.begin(), m_bits.end(), 0 );
84 if( pos >= m_bits.size() )
85 m_bits.resize( pos + 1, 0 );
93 if( pos == std::numeric_limits<size_t>::max() )
95 std::transform( m_bits.begin(), m_bits.end(), m_bits.begin(), [](
int bit ) { return bit ^ 1; } );
99 if( pos >= m_bits.size() )
100 m_bits.resize( pos + 1, 0 );
106 size_t count()
const {
return std::count( m_bits.begin(), m_bits.end(), 1 ); }
108 size_t size()
const {
return m_bits.size(); }
110 void resize(
size_t newSize ) { m_bits.resize( newSize, 0 ); }
114 const int&
operator[](
size_t pos )
const {
return m_bits[pos]; }
118 auto result = std::lexicographical_compare_three_way(
119 m_bits.begin(), m_bits.end(), other.
m_bits.begin(), other.
m_bits.end() );
120 return result == std::strong_ordering::equal ? 0 : ( result == std::strong_ordering::less ? -1 : 1 );
131 std::size_t
minSize = std::min( size(), other.
size() );
132 if( !std::equal( m_bits.begin(), m_bits.begin() +
minSize, other.
m_bits.begin() ) )
135 if( std::any_of( m_bits.begin() +
minSize, m_bits.end(), [](
int bit ) { return bit != 0; } ) )
138 if( std::any_of( other.
m_bits.begin() +
minSize, other.
m_bits.end(), [](
int bit ) { return bit != 0; } ) )
147 return std::lexicographical_compare( m_bits.begin(), m_bits.end(), other.
m_bits.begin(), other.
m_bits.end() );
157 template <
typename CharT =
char>
158 std::basic_string<CharT>
to_string( CharT zero = CharT(
'0' ), CharT one = CharT(
'1' ) )
const
160 std::basic_string<CharT> result( size(), zero );
162 for(
size_t i = 0; i < size(); ++i )
166 result[size() - 1 - i] = one;
176 for(
size_t i = 0; i < m_bits.size(); ++i )
177 m_bits[i] &= rhs.
m_bits[i];
184 for(
size_t i = 0; i < m_bits.size(); ++i )
185 m_bits[i] |= rhs.
m_bits[i];
192 for(
size_t i = 0; i < m_bits.size(); ++i )
193 m_bits[i] ^= rhs.
m_bits[i];
201 for(
size_t i = 0; i < m_bits.size(); ++i )
202 result.
m_bits[i] = !m_bits[i];
218 m_baseSet( baseSet ), m_index( index )
220 advance_to_next_set_bit();
228 advance_to_next_set_bit();
239 while( m_index < m_baseSet.size() && !m_baseSet.test( m_index ) )
258 m_baseSet( baseSet ), m_index( index )
260 advance_to_previous_set_bit();
268 advance_to_previous_set_bit();
274 return m_index != other.
m_index;
279 return m_index == other.
m_index;
285 while( m_index >= 0 && !m_baseSet.test( m_index ) )
341 for(
const auto& bit : bs )
342 hashVal = hashVal * 31 + std::hash<int>()( bit );
BASE_SET operator|(const BASE_SET &lhs, const BASE_SET &rhs)
BASE_SET operator^(const BASE_SET &lhs, const BASE_SET &rhs)
BASE_SET operator&(const BASE_SET &lhs, const BASE_SET &rhs)
set_bits_iterator & operator++()
void advance_to_next_set_bit()
std::forward_iterator_tag iterator_category
bool operator!=(const set_bits_iterator &other) const
bool operator==(const set_bits_iterator &other) const
const BASE_SET & m_baseSet
std::ptrdiff_t difference_type
set_bits_iterator(const BASE_SET &baseSet, size_t index)
std::ptrdiff_t difference_type
const ssize_t & reference
void advance_to_previous_set_bit()
const BASE_SET & m_baseSet
set_bits_reverse_iterator & operator++()
set_bits_reverse_iterator(const BASE_SET &baseSet, ssize_t index)
bool operator==(const set_bits_reverse_iterator &other) const
ssize_t operator*() const
std::bidirectional_iterator_tag iterator_category
bool operator!=(const set_bits_reverse_iterator &other) const
BASE_SET & flip(size_t pos=std::numeric_limits< size_t >::max())
set_bits_reverse_iterator set_bits_rbegin() const
std::vector< int > m_bits
const_iterator end() const
bool operator<(const BASE_SET &other) const
std::basic_string< CharT > to_string(CharT zero=CharT( '0'), CharT one=CharT( '1')) const
std::vector< int >::iterator iterator
set_bits_iterator set_bits_end() const
friend std::ostream & operator<<(std::ostream &os, const BASE_SET &set)
BASE_SET & set(size_t pos=std::numeric_limits< size_t >::max(), bool value=true)
bool test(size_t pos) const
BASE_SET & reset(size_t pos=std::numeric_limits< size_t >::max())
BASE_SET operator~() const
const int & operator[](size_t pos) const
set_bits_reverse_iterator set_bits_rend() const
std::vector< int >::const_iterator const_iterator
BASE_SET & operator|=(const BASE_SET &rhs)
BASE_SET & operator&=(const BASE_SET &rhs)
int compare(const BASE_SET &other) const
bool operator==(const BASE_SET &other) const
BASE_SET & operator^=(const BASE_SET &rhs)
const_iterator begin() const
set_bits_iterator set_bits_begin() const
int & operator[](size_t pos)
void resize(size_t newSize)
const int minSize
Push and Shove router track width and via size dialog.
#define APIEXPORT
Macros which export functions from a DLL/DSO.
size_t operator()(const BASE_SET &bs) const