| // (C) Copyright John Maddock 2010. | |
| // (C) Copyright Matt Borland 2024. | |
| // Use, modification and distribution are subject to the | |
| // Boost Software License, Version 1.0. (See accompanying file | |
| // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | |
| #ifndef BOOST_MATH_TUPLE_HPP_INCLUDED | |
| #define BOOST_MATH_TUPLE_HPP_INCLUDED | |
| #include <boost/math/tools/config.hpp> | |
| #ifdef BOOST_MATH_ENABLE_CUDA | |
| #include <boost/math/tools/type_traits.hpp> | |
| #include <cuda/std/utility> | |
| #include <cuda/std/tuple> | |
| namespace boost { | |
| namespace math { | |
| using cuda::std::pair; | |
| using cuda::std::tuple; | |
| using cuda::std::make_pair; | |
| using cuda::std::tie; | |
| using cuda::std::get; | |
| using cuda::std::tuple_size; | |
| using cuda::std::tuple_element; | |
| namespace detail { | |
| template <typename T> | |
| BOOST_MATH_GPU_ENABLED T&& forward(boost::math::remove_reference_t<T>& arg) noexcept | |
| { | |
| return static_cast<T&&>(arg); | |
| } | |
| template <typename T> | |
| BOOST_MATH_GPU_ENABLED T&& forward(boost::math::remove_reference_t<T>&& arg) noexcept | |
| { | |
| static_assert(!boost::math::is_lvalue_reference<T>::value, "Cannot forward an rvalue as an lvalue."); | |
| return static_cast<T&&>(arg); | |
| } | |
| } // namespace detail | |
| template <typename T, typename... Ts> | |
| BOOST_MATH_GPU_ENABLED auto make_tuple(T&& t, Ts&&... ts) | |
| { | |
| return cuda::std::tuple<boost::math::decay_t<T>, boost::math::decay_t<Ts>...>( | |
| boost::math::detail::forward<T>(t), boost::math::detail::forward<Ts>(ts)... | |
| ); | |
| } | |
| } // namespace math | |
| } // namespace boost | |
| #else | |
| #include <tuple> | |
| namespace boost { | |
| namespace math { | |
| using ::std::tuple; | |
| using ::std::pair; | |
| // [6.1.3.2] Tuple creation functions | |
| using ::std::ignore; | |
| using ::std::make_tuple; | |
| using ::std::tie; | |
| using ::std::get; | |
| // [6.1.3.3] Tuple helper classes | |
| using ::std::tuple_size; | |
| using ::std::tuple_element; | |
| // Pair helpers | |
| using ::std::make_pair; | |
| } // namespace math | |
| } // namespace boost | |
| #endif // BOOST_MATH_ENABLE_CUDA | |
| #endif |