Tribool.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #include "Tribool.h"
  2. namespace Tribool {
  3. Tribool::Tribool() : m_value(TriboolValue::Indeterminate)
  4. {
  5. }
  6. Tribool::Tribool(bool value) : m_value(value? TriboolValue::True : TriboolValue::False)
  7. {
  8. }
  9. Tribool::Tribool(const Tribool::IndeterminateKeywordType&) : m_value(TriboolValue::Indeterminate)
  10. {
  11. }
  12. Tribool::operator bool() const
  13. {
  14. return m_value == TriboolValue::True? true: false;
  15. }
  16. Tribool Tribool::operator!() const
  17. {
  18. return m_value == TriboolValue::False? Tribool(true):
  19. m_value == TriboolValue::True? Tribool(false):
  20. Tribool(Indeterminate);
  21. }
  22. Tribool Tribool::operator&&(const Tribool& other) const
  23. {
  24. return (static_cast<bool>(!*this) || static_cast<bool>(!other))?
  25. Tribool(false):
  26. ((static_cast<bool>(*this) && static_cast<bool>(other))?
  27. Tribool(true) : Tribool(Indeterminate));
  28. }
  29. Tribool operator&&(const Tribool& lhs, bool rhs)
  30. {
  31. return rhs? lhs: Tribool(false);
  32. }
  33. Tribool operator&&(bool lhs, const Tribool& rhs)
  34. {
  35. return lhs? rhs: Tribool(false);
  36. }
  37. Tribool operator&&(const Tribool::IndeterminateKeywordType&, const Tribool& rhs)
  38. {
  39. return !rhs? Tribool(false) : Tribool(Tribool::Indeterminate);
  40. }
  41. Tribool operator&&(const Tribool& lhs, const Tribool::IndeterminateKeywordType&)
  42. {
  43. return !lhs? Tribool(false) : Tribool(Tribool::Indeterminate);
  44. }
  45. Tribool Tribool::operator||(const Tribool& other) const
  46. {
  47. return (static_cast<bool>(!*this) && static_cast<bool>(!other))?
  48. Tribool(false):
  49. ((static_cast<bool>(*this) || static_cast<bool>(other))?
  50. Tribool(true): Tribool(Tribool::Indeterminate));
  51. }
  52. Tribool operator||(const Tribool& lhs, bool rhs)
  53. {
  54. return rhs? Tribool(true) : lhs;
  55. }
  56. Tribool operator||(bool lhs, const Tribool& rhs)
  57. {
  58. return lhs? Tribool(true) : rhs;
  59. }
  60. Tribool operator||(const Tribool::IndeterminateKeywordType&, const Tribool& rhs)
  61. {
  62. return rhs? Tribool(true) : Tribool(Tribool::Indeterminate);
  63. }
  64. Tribool operator||(const Tribool& lhs, const Tribool::IndeterminateKeywordType&)
  65. {
  66. return lhs? Tribool(true) : Tribool(Tribool::Indeterminate);
  67. }
  68. Tribool Tribool::operator==(const Tribool& other) const
  69. {
  70. return (Tribool::Indeterminate(*this) || Tribool::Indeterminate(other))?
  71. Tribool::Indeterminate: ((*this && other) || (!*this && !other));
  72. }
  73. Tribool operator==(const Tribool& lhs, bool rhs)
  74. {
  75. return lhs == Tribool(rhs);
  76. }
  77. Tribool operator==(bool lhs, const Tribool& rhs)
  78. {
  79. return Tribool(lhs) == rhs;
  80. }
  81. Tribool operator==(const Tribool::IndeterminateKeywordType&, const Tribool& rhs)
  82. {
  83. return Tribool(Tribool::Indeterminate) == rhs;
  84. }
  85. Tribool operator==(const Tribool& lhs, const Tribool::IndeterminateKeywordType&)
  86. {
  87. return Tribool(Tribool::Indeterminate) == lhs;
  88. }
  89. Tribool Tribool::operator!=(const Tribool& other) const
  90. {
  91. return (Tribool::Indeterminate(*this) || Tribool::Indeterminate(other))?
  92. Tribool::Indeterminate: !((*this && other) || (!*this && !other));
  93. }
  94. Tribool operator!=(const Tribool& lhs, bool rhs)
  95. {
  96. return lhs != Tribool(rhs);
  97. }
  98. Tribool operator!=(bool lhs, const Tribool& rhs)
  99. {
  100. return Tribool(lhs) != rhs;
  101. }
  102. Tribool operator!=(const Tribool::IndeterminateKeywordType&, const Tribool& rhs)
  103. {
  104. return Tribool(Tribool::Indeterminate) != rhs;
  105. }
  106. Tribool operator!=(const Tribool& lhs, const Tribool::IndeterminateKeywordType&)
  107. {
  108. return Tribool(Tribool::Indeterminate) != lhs;
  109. }
  110. } // namespace Tribool