#pragma once 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) {} operator bool() const { return state_ == Accept; } 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_ == Reject || rhs.state_ == Reject) { return Reject; } return Accept; } 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; } Status & operator&=(Status rhs) { return *this = *this & rhs; } Status & operator|=(Status rhs) { return *this = *this | rhs; } }; }