Advertisement
Art_Uspen

compressed_pair

Oct 9th, 2021
845
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.34 KB | None | 0 0
  1. template <typename T, std::size_t I, bool = std::is_empty_v<T> && !std::is_final_v<T>>
  2. struct CompressedPairElement {
  3.     CompressedPairElement(){}
  4.     CompressedPairElement(T v) : value(std::forward<T>(v)) {
  5.     }
  6.     const auto Get() const {
  7.         return value;
  8.     }
  9.     auto Get() {
  10.         return value;
  11.     }
  12.     T value;
  13. };
  14. template <typename T, std::size_t I>
  15. struct CompressedPairElement<T, I, true> : T {
  16.     CompressedPairElement() {
  17.     }
  18.     CompressedPairElement<T, I, true>(const T& v) {
  19.     }
  20.     CompressedPairElement<T, I, true>(T&& v) {
  21.     }
  22.     const T& Get() const {
  23.         return static_cast<const T&>(this);
  24.     }
  25.     T& Get() {
  26.         return static_cast<T&>(this);
  27.     }
  28. };
  29. template <typename F, typename S>
  30. class CompressedPair : CompressedPairElement<F, 1>, CompressedPairElement<S, 2> {
  31. public:
  32.     CompressedPair(F first, S second):CompressedPairElement<F, 1>(std::forward<F>(first)),
  33.           CompressedPairElement<S, 2>(std::forward<S>(second)){}
  34.  
  35.  
  36.     const F& GetFirst() const {
  37.         return CompressedPairElement<F, 1>::Get();
  38.     }
  39.     F& GetFirst() {
  40.         return CompressedPairElement<F, 1>::Get();
  41.     }
  42.  
  43.     const S& GetSecond() const {
  44.         return CompressedPairElement<S, 2>::Get();
  45.     }
  46.     S& GetSecond() {
  47.         return CompressedPairElement<S, 2>::Get();
  48.     }
  49. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement