AnySet Documentation
CompressedPair.h
1 #ifndef COMPRESSED_PAIR_H
2 #define COMPRESSED_PAIR_H
3 
4 #ifdef _MSC_VER
5 # include <iso646.h>
6 #endif
7 
8 #include "ValueHolder.h"
9 
10 namespace te {
11 
12 namespace detail {
13 
14 
15 template <class T>
17  private ValueHolder<T>
18 {
19  template <class ... Args>
20  CompressedPairBase(Args&& ... args):
21  ValueHolder<T>(std::forward<Args>(args)...)
22  {
23 
24  }
25 
26  const T& first() const &
27  { return get_value(static_cast<const ValueHolder<T>&>(*this)); }
28 
29  const T&& first() const &&
30  { return std::move(get_value(std::move(static_cast<const ValueHolder<T>&&>(*this)))); }
31 
32  T& first() &
33  { return get_value(static_cast<ValueHolder<T>&>(*this)); }
34 
35  T&& first() &&
36  { return std::move(get_value(static_cast<ValueHolder<T>&&>(*this).value())); }
37 
38 };
39 
40 } /* namespace detail */
41 
42 
46 template <class T, class U>
49  private ValueHolder<U>
50 {
51 private:
53  using right_base = ValueHolder<U>;
55 public:
56  constexpr CompressedPair() = default;
57 
58  template <
59  class Left,
60  class Right,
61  class = std::enable_if_t<std::is_same_v<std::decay_t<Left>, T>>,
62  class = std::enable_if_t<std::is_same_v<std::decay_t<Right>, U>>
63  >
64  CompressedPair(Left&& left, Right&& right):
65  left_base(std::forward<Left>(left)), right_base(std::forward<Right>(right))
66  {
67 
68  }
69 
70  using left_base::first;
71 
72  const U& second() const &
73  { return get_value(static_cast<const ValueHolder<U>&>(*this)); }
74 
75  const U&& second() const &&
76  { return std::move(get_value(static_cast<const ValueHolder<U>&&>(*this))); }
77 
78  U& second() &
79  { return get_value(static_cast<ValueHolder<U>&>(*this)); }
80 
81  U&& second() &&
82  { return std::move(get_value(static_cast<ValueHolder<U>&&>(*this))); }
83 
84  void swap(CompressedPair& other)
85  noexcept(std::is_nothrow_swappable_v<T> and std::is_nothrow_swappable_v<U>)
86  {
87  using std::swap;
88  swap(first(), other.first());
89  swap(second(), other.second());
90  }
91 };
92 
93 template <class T, class U>
94 CompressedPair<std::decay_t<T>, std::decay_t<U>> make_compressed_pair(T&& left, U&& right)
95 {
96  return CompressedPair<std::decay_t<T>, std::decay_t<U>>(
97  std::forward<T>(left), std::forward<U>(right)
98  );
99 }
100 
101 template <class T, class U>
102 void swap(CompressedPair<T, U>& left, CompressedPair<T, U>& right) noexcept(noexcept(left.swap(right)))
103 { left.swap(right); }
104 
105 } /* namespace te */
106 
107 #endif /* COMPRESSED_PAIR_H */
T swap(T... args)
Primary classes and utility functions for AnySet.
Definition: SetOperations.h:21
Definition: CompressedPair.h:47
T move(T... args)
Definition: ValueHolder.h:76
Definition: CompressedPair.h:16