| // Copyright John Maddock 2018. |
| // 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) |
| |
| // |
| // Tools for operator on complex as well as scalar types. |
| // |
| |
| #ifndef BOOST_MATH_TOOLS_COMPLEX_HPP |
| #define BOOST_MATH_TOOLS_COMPLEX_HPP |
| |
| #include <boost/math/tools/config.hpp> |
| #include <boost/math/tools/is_detected.hpp> |
| |
| #ifdef BOOST_MATH_ENABLE_CUDA |
| |
| #include <cuda/std/utility> |
| #include <cuda/std/complex> |
| |
| namespace boost { |
| namespace math { |
| |
| template <typename T> |
| using complex = cuda::std::complex<T>; |
| |
| } // namespace math |
| } // namespace boost |
| |
| #else |
| |
| #include <utility> |
| #include <complex> |
| |
| namespace boost { |
| namespace math { |
| |
| template <typename T> |
| using complex = std::complex<T>; |
| |
| } // namespace math |
| } // namespace boost |
| |
| #endif |
| |
| namespace boost { |
| namespace math { |
| namespace tools { |
| |
| namespace detail { |
| template <typename T, typename = void> |
| struct is_complex_type_impl |
| { |
| static constexpr bool value = false; |
| }; |
| |
| #ifndef BOOST_MATH_ENABLE_CUDA |
| template <typename T> |
| struct is_complex_type_impl<T, void_t<decltype(std::declval<T>().real()), |
| decltype(std::declval<T>().imag())>> |
| { |
| static constexpr bool value = true; |
| }; |
| #else |
| template <typename T> |
| struct is_complex_type_impl<T, void_t<decltype(cuda::std::declval<T>().real()), |
| decltype(cuda::std::declval<T>().imag())>> |
| { |
| static constexpr bool value = true; |
| }; |
| #endif |
| } // Namespace detail |
| |
| template <typename T> |
| struct is_complex_type : public detail::is_complex_type_impl<T> {}; |
| |
| // |
| // Use this trait to typecast integer literals to something |
| // that will interoperate with T: |
| // |
| template <class T, bool = is_complex_type<T>::value> |
| struct integer_scalar_type |
| { |
| typedef int type; |
| }; |
| template <class T> |
| struct integer_scalar_type<T, true> |
| { |
| typedef typename T::value_type type; |
| }; |
| template <class T, bool = is_complex_type<T>::value> |
| struct unsigned_scalar_type |
| { |
| typedef unsigned type; |
| }; |
| template <class T> |
| struct unsigned_scalar_type<T, true> |
| { |
| typedef typename T::value_type type; |
| }; |
| template <class T, bool = is_complex_type<T>::value> |
| struct scalar_type |
| { |
| typedef T type; |
| }; |
| template <class T> |
| struct scalar_type<T, true> |
| { |
| typedef typename T::value_type type; |
| }; |
| |
| |
| } } } |
| |
| #endif // BOOST_MATH_TOOLS_COMPLEX_HPP |