arithmetic.hpp 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #pragma once
  2. namespace types {
  3. template <typename Self> struct Boolean {
  4. operator bool() const { return static_cast<Self const &>(*this).get(); }
  5. };
  6. template <typename Self> struct Incrementable {
  7. friend Self operator++(Self & self, int) {
  8. Self copy = self;
  9. self = Self(self.get() + 1);
  10. return copy;
  11. }
  12. friend Self & operator++(Self & self) {
  13. return self = Self(self.get() + 1);
  14. }
  15. };
  16. template <typename Self> struct Decrementable {
  17. friend Self operator--(Self & self, int) {
  18. Self copy = self;
  19. self = Self(self.get() - 1);
  20. return copy;
  21. }
  22. friend Self & operator--(Self & self) {
  23. return self = Self(self.get() - 1);
  24. }
  25. };
  26. template <typename Self> struct Addable {
  27. friend Self operator+(Self const & lhs, Self const & rhs) {
  28. return Self(lhs.get() + rhs.get());
  29. }
  30. };
  31. template <typename Self> struct Arithmetic : Addable<Self> {
  32. friend Self operator-(Self const & self) { return Self(-self.get()); }
  33. friend Self operator-(Self const & lhs, Self const & rhs) {
  34. return Self(lhs.get() - rhs.get());
  35. }
  36. };
  37. template <typename Self> struct Numeric : Arithmetic<Self> {
  38. friend Self operator*(Self const & lhs, Self const & rhs) {
  39. return Self(lhs.get() * rhs.get());
  40. }
  41. friend Self operator/(Self const & lhs, Self const & rhs) {
  42. return Self(lhs.get() / rhs.get());
  43. }
  44. };
  45. }