No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

83 líneas
2.0 KiB

  1. #pragma once
  2. #include "../core.h"
  3. namespace utl {
  4. namespace mp {
  5. namespace intern {
  6. template<typename Key, typename Value, bool = is_empty<Value>::value && !is_final<Value>::value>
  7. struct ebo;
  8. template<typename Key, typename Value>
  9. constexpr const Value& ebo_get(const ebo<Key, Value, true>& x)
  10. { return x; }
  11. template<typename Key, typename Value>
  12. constexpr Value& ebo_get(ebo<Key, Value, true>& x)
  13. { return x; }
  14. template<typename Key, typename Value>
  15. constexpr Value&& ebo_get(ebo<Key, Value, true>&& x)
  16. { return x; }
  17. template<typename Key, typename Value>
  18. constexpr const Value& ebo_get(const ebo<Key, Value, false>& x)
  19. { return x._data; }
  20. template<typename Key, typename Value>
  21. constexpr Value& ebo_get(ebo<Key, Value, false>& x)
  22. { return x._data; }
  23. template<typename Key, typename Value>
  24. constexpr Value&& ebo_get(ebo<Key, Value, false>&& x)
  25. { return static_cast<Value&&>(x._data); }
  26. template<typename Key, typename Value>
  27. struct ebo<Key, Value, true> :
  28. public Value
  29. {
  30. constexpr ebo()
  31. { }
  32. template<typename T>
  33. explicit constexpr ebo(T&& t) :
  34. Value(std::forward<T>(t))
  35. { }
  36. constexpr auto get() const&
  37. { return ebo_get(*this); }
  38. constexpr auto get() &
  39. { return ebo_get(*this); }
  40. constexpr auto get() &&
  41. { return ebo_get(std::move(*this)); }
  42. };
  43. template<typename Key, typename Value>
  44. struct ebo<Key, Value, false>
  45. {
  46. Value _data;
  47. constexpr ebo()
  48. { }
  49. template<typename T>
  50. explicit constexpr ebo(T&& t) :
  51. _data(std::forward<T>(t))
  52. { }
  53. constexpr auto get() const&
  54. { return ebo_get(*this); }
  55. constexpr auto get() &
  56. { return ebo_get(*this); }
  57. constexpr auto get() &&
  58. { return ebo_get(std::move(*this)); }
  59. };
  60. }
  61. }
  62. }