status.h 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #pragma once
  2. #include <compare>
  3. namespace jvalidate {
  4. class Status {
  5. public:
  6. enum Enum { Accept, Reject, Noop };
  7. private:
  8. Enum state_;
  9. public:
  10. Status(bool state) : state_(state ? Accept : Reject) {}
  11. Status(Enum state) : state_(state) {}
  12. explicit operator bool() const { return state_ != Reject; }
  13. friend Status operator!(Status val) {
  14. if (val.state_ == Noop) {
  15. return Status::Noop;
  16. }
  17. return val.state_ == Reject ? Accept : Reject;
  18. }
  19. friend Status operator|(Status lhs, Status rhs) {
  20. if (lhs.state_ == Noop && rhs.state_ == Noop) {
  21. return Noop;
  22. }
  23. if (lhs.state_ == Accept || rhs.state_ == Accept) {
  24. return Accept;
  25. }
  26. return Reject;
  27. }
  28. friend Status operator&(Status lhs, Status rhs) {
  29. if (lhs.state_ == Noop && rhs.state_ == Noop) {
  30. return Noop;
  31. }
  32. if (lhs.state_ == Reject || rhs.state_ == Reject) {
  33. return Reject;
  34. }
  35. return Accept;
  36. }
  37. Status & operator&=(Status rhs) { return *this = *this & rhs; }
  38. Status & operator|=(Status rhs) { return *this = *this | rhs; }
  39. friend auto operator==(Status lhs, Status::Enum rhs) {
  40. return static_cast<int>(lhs.state_) == static_cast<int>(rhs);
  41. }
  42. friend auto operator!=(Status lhs, Status::Enum rhs) {
  43. return static_cast<int>(lhs.state_) != static_cast<int>(rhs);
  44. }
  45. friend auto operator<=>(Status lhs, Status rhs) {
  46. return static_cast<int>(lhs.state_) <=> static_cast<int>(rhs.state_);
  47. }
  48. };
  49. }