Either.h 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #pragma once
  2. #include <functional>
  3. #include "Betriebssystem.h"
  4. namespace Framework
  5. {
  6. template<typename A, typename B> class Either
  7. {
  8. private:
  9. A aValue;
  10. B bValue;
  11. bool a;
  12. public:
  13. Either(const Either<A, B>& b)
  14. {
  15. a = b.isA();
  16. if (a)
  17. aValue = (A)b;
  18. else
  19. bValue = (B)b;
  20. }
  21. Either(A a)
  22. {
  23. aValue = a;
  24. this->a = 1;
  25. }
  26. Either(B b)
  27. {
  28. bValue = b;
  29. a = 0;
  30. }
  31. bool isA() const
  32. {
  33. return a;
  34. }
  35. bool isB() const
  36. {
  37. return !a;
  38. }
  39. A getA() const
  40. {
  41. assert(a);
  42. return aValue;
  43. }
  44. B getB() const
  45. {
  46. assert(!a);
  47. return bValue;
  48. }
  49. void doIfA(std::function<A> action)
  50. {
  51. if (a) action(aValue);
  52. }
  53. void doIfB(std::function<B> action)
  54. {
  55. if (!a) action(bValue);
  56. }
  57. operator A() const
  58. {
  59. assert(a);
  60. return aValue;
  61. }
  62. operator B() const
  63. {
  64. assert(!a);
  65. return bValue;
  66. }
  67. };
  68. } // namespace Framework