#ifndef wasm_analysis_lattices_powerset_impl_h
#define wasm_analysis_lattices_powerset_impl_h
#include <iostream>
#include "powerset.h"
namespace wasm::analysis {
inline LatticeComparison FiniteIntPowersetLattice::compare(
const FiniteIntPowersetLattice::Element& left,
const FiniteIntPowersetLattice::Element& right) const noexcept {
assert(left.bitvector.size() == right.bitvector.size());
bool leftNotRight = false;
bool rightNotLeft = false;
size_t size = left.bitvector.size();
for (size_t i = 0; i < size; ++i) {
leftNotRight |= (left.bitvector[i] && !right.bitvector[i]);
rightNotLeft |= (right.bitvector[i] && !left.bitvector[i]);
if (leftNotRight && rightNotLeft) {
return NO_RELATION;
}
}
if (!leftNotRight) {
if (!rightNotLeft) {
return EQUAL;
}
return LESS;
} else if (!rightNotLeft) {
return GREATER;
}
return NO_RELATION;
}
inline FiniteIntPowersetLattice::Element
FiniteIntPowersetLattice::getBottom() const noexcept {
FiniteIntPowersetLattice::Element result(setSize);
return result;
}
inline size_t FiniteIntPowersetLattice::Element::count() const {
size_t count = 0;
for (auto it : bitvector) {
count += it;
}
return count;
}
inline bool
FiniteIntPowersetLattice::join(Element& joinee,
const Element& joiner) const noexcept {
assert(joiner.bitvector.size() == joinee.bitvector.size());
bool modified = false;
for (size_t i = 0; i < joinee.bitvector.size(); ++i) {
modified |= (!joinee.bitvector[i] && joiner.bitvector[i]);
joinee.bitvector[i] = joinee.bitvector[i] || joiner.bitvector[i];
}
return modified;
}
inline void FiniteIntPowersetLattice::Element::print(std::ostream& os) {
for (auto it : bitvector) {
os << it;
}
}
};
#endif