#ifndef wasm_analysis_lattices_inverted_h
#define wasm_analysis_lattices_inverted_h
#include <utility>
#include "../lattice.h"
#include "bool.h"
namespace wasm::analysis {
template<FullLattice L> struct Inverted {
using Element = typename L::Element;
L lattice;
Inverted(L&& lattice) : lattice(std::move(lattice)) {}
Element getBottom() const noexcept { return lattice.getTop(); }
Element getTop() const noexcept { return lattice.getBottom(); }
LatticeComparison compare(const Element& a, const Element& b) const noexcept {
return lattice.compare(b, a);
}
template<typename Elem>
bool join(Element& joinee, const Elem& joiner) const noexcept {
return lattice.meet(joinee, joiner);
}
template<typename Elem>
bool meet(Element& meetee, const Elem& meeter) const noexcept {
return lattice.join(meetee, meeter);
}
};
template<typename L> Inverted(L&&) -> Inverted<L>;
#if __cplusplus >= 202002L
static_assert(Lattice<Inverted<Bool>>);
#endif
}
#endif