Art_Uspen

Untitled

Sep 26th, 2021
839
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #pragma once
  2.  
  3. #include <type_traits>
  4. #include <utility>
  5.  
  6. // Me think, why waste time write lot code, when few code do trick.
  7. template <typename T, std::size_t I, bool = std::is_empty_v<T> && !std::is_final_v<T>>
  8. struct CompressedPairElement {
  9.     CompressedPairElement(const T& v) : value(v) {
  10.     }
  11.     CompressedPairElement(T&& v) : value(std::move(v)) {
  12.     }
  13.     const T& Get() const {
  14.         return value;
  15.     }
  16.     T& Get() {
  17.         return value;
  18.     }
  19.     T value;
  20. };
  21. template <typename T, std::size_t I>
  22. struct CompressedPairElement<T, I, true> : T {
  23.     CompressedPairElement<T, I, true>(const T& v) {
  24.     }
  25.     CompressedPairElement<T, I, true>(T&& v) {
  26.     }
  27.     const T& Get() const {
  28.         return *this;
  29.     }
  30.     T& Get() {
  31.         return *this;
  32.     }
  33. };
  34. template <typename F, typename S>
  35. class CompressedPair : CompressedPairElement<F, 1>, CompressedPairElement<S, 2> {
  36. public:
  37.     CompressedPair(const F& first, const S& second)
  38.         : CompressedPairElement<F, 1>(first), CompressedPairElement<S, 2>(second) {
  39.     }
  40.     CompressedPair() : CompressedPairElement<F, 1>(F()), CompressedPairElement<S, 2>(S()) {
  41.     }
  42.  
  43.     CompressedPair(const F& first, S&& second)
  44.         : CompressedPairElement<F, 1>(first), CompressedPairElement<S, 2>(std::move(second)) {
  45.     }
  46.     CompressedPair(F&& first, const S& second)
  47.         : CompressedPairElement<F, 1>(std::move(first)), CompressedPairElement<S, 2>(second) {
  48.     }
  49.     CompressedPair(F&& first, S&& second)
  50.         : CompressedPairElement<F, 1>(std::move(first)),
  51.           CompressedPairElement<S, 2>(std::move(second)) {
  52.     }
  53.  
  54.     const F& GetFirst() const {
  55.         return CompressedPairElement<F, 1>::Get();
  56.     }
  57.     F& GetFirst() {
  58.         return CompressedPairElement<F, 1>::Get();
  59.     }
  60.  
  61.     const S& GetSecond() const {
  62.         return CompressedPairElement<S, 2>::Get();
  63.     }
  64.     S& GetSecond() {
  65.         return CompressedPairElement<S, 2>::Get();
  66.     }
  67. };
RAW Paste Data