arithmatic.hpp 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #pragma once
  2. namespace types {
  3. template <typename Self>
  4. struct Incrementable {
  5. friend Self operator++(Self const & self, int) {
  6. Self copy = self;
  7. self = Self(self.get() + 1);
  8. return copy;
  9. }
  10. friend Self & operator++(Self const & self) {
  11. return self = Self(self.get() + 1);
  12. }
  13. };
  14. template <typename Self>
  15. struct Decrementable {
  16. friend Self operator--(Self const & self, int) {
  17. Self copy = self;
  18. self = Self(self.get() - 1);
  19. return copy;
  20. }
  21. friend Self & operator--(Self const & self) {
  22. return self = Self(self.get() - 1);
  23. }
  24. };
  25. template <typename Self>
  26. 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>
  32. struct Arithmatic : Addable<Self> {
  33. friend Self operator-(Self const & self) {
  34. return Self(-self.get());
  35. }
  36. friend Self operator-(Self const & lhs, Self const & rhs) {
  37. return Self(lhs.get() - rhs.get());
  38. }
  39. };
  40. template <typename Self>
  41. struct Numeric : Arithmatic<Self> {
  42. friend Self operator*(Self const & lhs, Self const & rhs) {
  43. return Self(lhs.get() * rhs.get());
  44. }
  45. friend Self operator/(Self const & lhs, Self const & rhs) {
  46. return Self(lhs.get() / rhs.get());
  47. }
  48. };
  49. }