3 * - By John Hodge (thePowersGang)
8 #ifndef _LIBCXX_UTILITY_
9 #define _LIBCXX_UTILITY_
11 #include "_libcxx_helpers.h"
12 #include "type_traits"
16 template <class T1, class T2>
20 typedef T1 first_type;
21 typedef T2 second_type;
29 template <class U, class V>
30 pair(const pair<U,V>& pr):
35 pair(const first_type& a, const second_type& b):
46 first(pr.first), second(pr.second)
49 // operator = is implicit
50 pair& operator=(const pair& x) {
57 template <class T1, class T2>
58 bool operator== (const pair<T1,T2>& lhs, const pair<T1,T2>& rhs) {
59 return lhs.first == rhs.first && lhs.second == rhs.second;
61 template <class T1, class T2>
62 bool operator!= (const pair<T1,T2>& lhs, const pair<T1,T2>& rhs) {
68 T&& forward(typename remove_reference<T>::type& arg) noexcept {
69 return static_cast<decltype(arg)&&>(arg);
72 T&& forward(typename remove_reference<T>::type&& arg) noexcept {
73 return static_cast<decltype(arg)&&>(arg);
77 typename remove_reference<T>::type&& move( T&& t) noexcept {
78 return static_cast<typename remove_reference<T>::type&&>(t);
81 //constexpr typename ::std::remove_reference<T>::type&& move( T&& t) noexcept {
82 // return static_cast<typename ::std::remove_reference<T>::type&&>(t);