bedrock/src/semantics/equivalence.cppm
2025-06-07 14:17:56 -06:00

25 lines
602 B
C++

export module bedrock.semantics:equivalence;
import :utility;
import :referenceable;
import :integral;
namespace br {
export template <typename T, typename U = T>
concept PartialEquivalence = requires(Unref<T> a, Unref<U> b) {
{ a == b } -> SameAs<bool>;
{ a != b } -> SameAs<bool>;
{ b == a } -> SameAs<bool>;
{ b != a } -> SameAs<bool>;
};
export template <PartialEquivalence T>
struct EquivalenceType {
static constexpr bool is_valid = false;
};
export template <typename T>
concept Equivalence = PartialEquivalence<T> && (EquivalenceType<T>::is_valid || Integral<T>);
} // namespace br