arithmetic.hpp 1.3 KB

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