#ifndef LIBCXX_TEST_SUPPORT_BOOLEAN_TESTABLE_H
#define LIBCXX_TEST_SUPPORT_BOOLEAN_TESTABLE_H
#include "test_macros.h"
#if TEST_STD_VER > 17
class BooleanTestable {
public:
constexpr operator bool() const {
return value_;
}
friend constexpr BooleanTestable operator==(const BooleanTestable& lhs, const BooleanTestable& rhs) {
return lhs.value_ == rhs.value_;
}
friend constexpr BooleanTestable operator!=(const BooleanTestable& lhs, const BooleanTestable& rhs) {
return !(lhs == rhs);
}
constexpr BooleanTestable operator!() {
return BooleanTestable{!value_};
}
constexpr BooleanTestable(bool value) : value_{value} {}
constexpr BooleanTestable(const BooleanTestable&) = delete;
constexpr BooleanTestable(BooleanTestable&&) = delete;
private:
bool value_;
};
template <class T>
class StrictComparable {
public:
constexpr StrictComparable(T value) : value_{value} {}
friend constexpr BooleanTestable operator==(const StrictComparable& lhs, const StrictComparable& rhs) {
return (lhs.value_ == rhs.value_);
}
friend constexpr BooleanTestable operator!=(const StrictComparable& lhs, const StrictComparable& rhs) {
return !(lhs == rhs);
}
private:
T value_;
};
#endif
#endif