#ifndef wasm_analysis_lattice_impl_h
#define wasm_analysis_lattice_impl_h
#include "lattice.h"
namespace wasm::analysis {
template<size_t N>
inline BitsetPowersetLattice<N> BitsetPowersetLattice<N>::getBottom() {
BitsetPowersetLattice<N> result{0};
return result;
}
template<size_t N>
inline bool
BitsetPowersetLattice<N>::isTop(const BitsetPowersetLattice<N>& element) {
return element.value.all();
}
template<size_t N>
inline bool
BitsetPowersetLattice<N>::isBottom(const BitsetPowersetLattice<N>& element) {
return element.value.none();
}
template<size_t N>
inline LatticeComparison
BitsetPowersetLattice<N>::compare(const BitsetPowersetLattice<N>& left,
const BitsetPowersetLattice<N>& right) {
size_t leftCount = left.value.count();
size_t rightCount = right.value.count();
if (leftCount > rightCount) {
if ((left.value | right.value) == left.value) {
return GREATER;
}
} else if (leftCount < rightCount) {
if ((left.value | right.value) == right.value) {
return LESS;
}
} else if (left.value == right.value) {
return EQUAL;
}
return NO_RELATION;
}
template<size_t N>
inline void BitsetPowersetLattice<N>::getLeastUpperBound(
const BitsetPowersetLattice<N>& right) {
value |= right.value;
}
template<size_t N>
inline void BitsetPowersetLattice<N>::print(std::ostream& os) {
os << value;
}
};
#endif