25 lines
602 B
C++
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
|