1 /**************************************************************************** 2 ** 3 ** DQt - D bindings for the Qt Toolkit 4 ** 5 ** GNU Lesser General Public License Usage 6 ** This file may be used under the terms of the GNU Lesser 7 ** General Public License version 3 as published by the Free Software 8 ** Foundation and appearing in the file LICENSE.LGPL3 included in the 9 ** packaging of this file. Please review the following information to 10 ** ensure the GNU Lesser General Public License version 3 requirements 11 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. 12 ** 13 ****************************************************************************/ 14 module qt.core.pair; 15 extern(C++): 16 17 import qt.config; 18 import qt.helpers; 19 20 struct QPair(T1, T2) 21 { 22 alias first_type = T1; 23 alias second_type = T2; 24 25 /+this() 26 /+ noexcept((std::is_nothrow_default_constructible<T1>::value && 27 std::is_nothrow_default_constructible<T2>::value)) +/ 28 { 29 this.first = typeof(this.first)(); 30 this.second = typeof(this.second)(); 31 }+/ 32 this(ref const(T1) t1, ref const(T2) t2) 33 /+ noexcept((std::is_nothrow_copy_constructible<T1>::value && 34 std::is_nothrow_copy_constructible<T2>::value)) +/ 35 { 36 this.first = t1; 37 this.second = t2; 38 } 39 // compiler-generated copy/move ctor/assignment operators are fine! 40 41 /+ template <typename TT1, typename TT2> +/ 42 /+ QPair(const QPair<TT1, TT2> &p) 43 noexcept((std::is_nothrow_constructible<T1, TT1&>::value && 44 std::is_nothrow_constructible<T2, TT2&>::value)) 45 : first(p.first), second(p.second) {} +/ 46 /+ template <typename TT1, typename TT2> +/ 47 /+ QPair &operator=(const QPair<TT1, TT2> &p) 48 noexcept((std::is_nothrow_assignable<T1, TT1&>::value && 49 std::is_nothrow_assignable<T2, TT2&>::value)) 50 { first = p.first; second = p.second; return *this; } +/ 51 /+ template <typename TT1, typename TT2> +/ 52 /+ QPair(QPair<TT1, TT2> &&p) 53 noexcept((std::is_nothrow_constructible<T1, TT1>::value && 54 std::is_nothrow_constructible<T2, TT2>::value)) 55 // can't use std::move here as it's not constexpr in C++11: 56 : first(static_cast<TT1 &&>(p.first)), second(static_cast<TT2 &&>(p.second)) {} +/ 57 /+ template <typename TT1, typename TT2> +/ 58 /+ QPair &operator=(QPair<TT1, TT2> &&p) 59 noexcept((std::is_nothrow_assignable<T1, TT1>::value && 60 std::is_nothrow_assignable<T2, TT2>::value)) 61 { first = std::move(p.first); second = std::move(p.second); return *this; } +/ 62 63 /+ void swap(QPair &other) 64 noexcept(noexcept(qSwap(other.first, other.first)) && noexcept(qSwap(other.second, other.second))) 65 { 66 // use qSwap() to pick up ADL swaps automatically: 67 qSwap(first, other.first); 68 qSwap(second, other.second); 69 } +/ 70 71 T1 first; 72 T2 second; 73 } 74 75 /+ #if defined(__cpp_deduction_guides) && __cpp_deduction_guides >= 201606 76 template<class T1, class T2> 77 QPair(T1, T2) -> QPair<T1, T2>; 78 #endif 79 80 template <typename T1, typename T2> 81 void swap(QPair<T1, T2> &lhs, QPair<T1, T2> &rhs) noexcept(noexcept(lhs.swap(rhs))) 82 { lhs.swap(rhs); } 83 84 // mark QPair<T1,T2> as complex/movable/primitive depending on the 85 // typeinfos of the constituents: 86 template<class T1, class T2> 87 class QTypeInfo<QPair<T1, T2> > : public QTypeInfoMerger<QPair<T1, T2>, T1, T2> {}; +/ // Q_DECLARE_TYPEINFO 88 89 /+pragma(inline, true) bool operator ==(T1, T2)(ref const(QPair!(T1, T2)) p1, ref const(QPair!(T1, T2)) p2) 90 /+ noexcept(noexcept(p1.first == p2.first && p1.second == p2.second)) +/ 91 { return p1.first == p2.first && p1.second == p2.second; }+/ 92 93 /+pragma(inline, true) bool operator !=(T1, T2)(ref const(QPair!(T1, T2)) p1, ref const(QPair!(T1, T2)) p2) 94 /+ noexcept(noexcept(!(p1 == p2))) +/ 95 { return !(p1 == p2); }+/ 96 97 /+pragma(inline, true) bool operator <(T1, T2)(ref const(QPair!(T1, T2)) p1, ref const(QPair!(T1, T2)) p2) 98 /+ noexcept(noexcept(p1.first < p2.first || (!(p2.first < p1.first) && p1.second < p2.second))) +/ 99 { 100 return p1.first < p2.first || (!(p2.first < p1.first) && p1.second < p2.second); 101 }+/ 102 103 /+pragma(inline, true) bool operator >(T1, T2)(ref const(QPair!(T1, T2)) p1, ref const(QPair!(T1, T2)) p2) 104 /+ noexcept(noexcept(p2 < p1)) +/ 105 { 106 return p2 < p1; 107 }+/ 108 109 /+pragma(inline, true) bool operator <=(T1, T2)(ref const(QPair!(T1, T2)) p1, ref const(QPair!(T1, T2)) p2) 110 /+ noexcept(noexcept(!(p2 < p1))) +/ 111 { 112 return !(p2 < p1); 113 }+/ 114 115 /+pragma(inline, true) bool operator >=(T1, T2)(ref const(QPair!(T1, T2)) p1, ref const(QPair!(T1, T2)) p2) 116 /+ noexcept(noexcept(!(p1 < p2))) +/ 117 { 118 return !(p1 < p2); 119 }+/ 120 121 QPair!(T1, T2) qMakePair(T1, T2)(ref const(T1) x, ref const(T2) y) 122 /+ noexcept(noexcept(QPair<T1, T2>(x, y))) +/ 123 { 124 return QPair!(T1, T2)(x, y); 125 } 126