#pragma once #include 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(lhs.state_) == static_cast(rhs); } friend auto operator!=(Status lhs, Status::Enum rhs) { return static_cast(lhs.state_) != static_cast(rhs); } friend auto operator<=>(Status lhs, Status rhs) { return static_cast(lhs.state_) <=> static_cast(rhs.state_); } }; }