#ifndef SPROUT_UTILITY_PAIR_PAIR_DECL_HPP #define SPROUT_UTILITY_PAIR_PAIR_DECL_HPP #include #include #include #include #include #include #include namespace sprout { // // pair // template struct pair { public: typedef T1 first_type; typedef T2 second_type; public: T1 first; T2 second; private: template SPROUT_CONSTEXPR pair( sprout::tuples::tuple first_args, sprout::tuples::tuple second_args, sprout::index_tuple, sprout::index_tuple ); public: SPROUT_CONSTEXPR pair(pair const&); SPROUT_CONSTEXPR pair(pair&&); SPROUT_CONSTEXPR pair(); SPROUT_CONSTEXPR pair(T1 const& x, T2 const& y); template SPROUT_CONSTEXPR pair(U&& x, V&& y); template SPROUT_CONSTEXPR pair(sprout::pair const& other); template SPROUT_CONSTEXPR pair(sprout::pair&& other); template SPROUT_CONSTEXPR pair( sprout::tuples::tuple first_args, sprout::tuples::tuple second_args ); pair& operator=(pair const& other); template pair& operator=(sprout::pair const& other); pair& operator=(pair&& other) SPROUT_NOEXCEPT_EXPR(std::is_nothrow_move_assignable::value && std::is_nothrow_move_assignable::value); template pair& operator=(sprout::pair&& other); void swap(pair& other) SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(sprout::swap(first, other.first)) && SPROUT_NOEXCEPT_EXPR(sprout::swap(second, other.second))); }; // // swap // template inline void swap(sprout::pair& lhs, sprout::pair& rhs) SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(lhs.swap(rhs))); } // namespace sprout #endif // #ifndef SPROUT_UTILITY_PAIR_PAIR_DECL_HPP