| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- #pragma once
- #include <compare>
- namespace jvalidate {
- class Status {
- public:
- enum Enum { Accept, Reject, Noop };
- private:
- Enum state_;
- public:
- Status(bool state) : state_(state ? Accept : Reject) {}
- Status(Enum state) : state_(state) {}
- explicit operator bool() const { return state_ != Reject; }
- friend Status operator!(Status val) {
- if (val.state_ == Noop) {
- return Status::Noop;
- }
- return val.state_ == Reject ? Accept : Reject;
- }
- friend Status operator|(Status lhs, Status rhs) {
- if (lhs.state_ == Noop && rhs.state_ == Noop) {
- return Noop;
- }
- if (lhs.state_ == Accept || rhs.state_ == Accept) {
- return Accept;
- }
- return Reject;
- }
- friend Status operator&(Status lhs, Status rhs) {
- if (lhs.state_ == Noop && rhs.state_ == Noop) {
- return Noop;
- }
- if (lhs.state_ == Reject || rhs.state_ == Reject) {
- return Reject;
- }
- return Accept;
- }
- Status & operator&=(Status rhs) { return *this = *this & rhs; }
- Status & operator|=(Status rhs) { return *this = *this | rhs; }
- friend auto operator==(Status lhs, Status::Enum rhs) {
- return static_cast<int>(lhs.state_) == static_cast<int>(rhs);
- }
- friend auto operator!=(Status lhs, Status::Enum rhs) {
- return static_cast<int>(lhs.state_) != static_cast<int>(rhs);
- }
- friend auto operator<=>(Status lhs, Status rhs) {
- return static_cast<int>(lhs.state_) <=> static_cast<int>(rhs.state_);
- }
- };
- }
|