11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
18PROMEKI_NAMESPACE_BEGIN
40template <
typename A,
typename B>
class Pair {
68 template <
typename A2,
typename B2,
69 typename = std::enable_if_t<std::is_constructible_v<A, A2 &&> &&
70 std::is_constructible_v<B, B2 &&>>>
71 Pair(A2 &&a, B2 &&b) : d(std::forward<A2>(a), std::forward<B2>(b)) {}
77 Pair(
const std::pair<A, B> &p) : d(p) {}
83 Pair(std::pair<A, B> &&p) : d(std::move(p)) {}
86 Pair(
const Pair &other) =
default;
89 Pair(Pair &&other)
noexcept =
default;
95 Pair &operator=(
const Pair &other) =
default;
98 Pair &operator=(Pair &&other)
noexcept =
default;
101 A &first() {
return d.first; }
104 const A &first()
const {
return d.first; }
107 B &second() {
return d.second; }
110 const B &second()
const {
return d.second; }
116 void setFirst(
const A &a) { d.first = a; }
122 void setSecond(
const B &b) { d.second = b; }
128 const std::pair<A, B> &toStdPair()
const {
return d; }
134 void swap(Pair &other)
noexcept {
145 static Pair make(A a, B b) {
return Pair(std::move(a), std::move(b)); }
148 friend bool operator==(
const Pair &lhs,
const Pair &rhs) {
return lhs.d == rhs.d; }
151 friend bool operator!=(
const Pair &lhs,
const Pair &rhs) {
return lhs.d != rhs.d; }
154 friend bool operator<(
const Pair &lhs,
const Pair &rhs) {
return lhs.d < rhs.d; }
161 template <std::
size_t I>
auto &get() & {
162 if constexpr (I == 0)
169 template <std::
size_t I>
const auto &get() const & {
170 if constexpr (I == 0)
177 template <std::
size_t I>
auto &&get() && {
178 if constexpr (I == 0)
179 return std::move(d.first);
181 return std::move(d.second);
192 template <
typename A,
typename B>
193 struct tuple_size<promeki::Pair<A, B>> : std::integral_constant<std::size_t, 2> {};
195 template <
typename A,
typename B>
struct tuple_element<0, promeki::Pair<A, B>> {
199 template <
typename A,
typename B>
struct tuple_element<1, promeki::Pair<A, B>> {