1*da0073e9SAndroid Build Coastguard Worker #if !defined(C10_INTERNAL_INCLUDE_COMPLEX_REMAINING_H) 2*da0073e9SAndroid Build Coastguard Worker #error \ 3*da0073e9SAndroid Build Coastguard Worker "c10/util/complex_utils.h is not meant to be individually included. Include c10/util/complex.h instead." 4*da0073e9SAndroid Build Coastguard Worker #endif 5*da0073e9SAndroid Build Coastguard Worker 6*da0073e9SAndroid Build Coastguard Worker #include <limits> 7*da0073e9SAndroid Build Coastguard Worker 8*da0073e9SAndroid Build Coastguard Worker namespace c10 { 9*da0073e9SAndroid Build Coastguard Worker 10*da0073e9SAndroid Build Coastguard Worker template <typename T> 11*da0073e9SAndroid Build Coastguard Worker struct is_complex : public std::false_type {}; 12*da0073e9SAndroid Build Coastguard Worker 13*da0073e9SAndroid Build Coastguard Worker template <typename T> 14*da0073e9SAndroid Build Coastguard Worker struct is_complex<std::complex<T>> : public std::true_type {}; 15*da0073e9SAndroid Build Coastguard Worker 16*da0073e9SAndroid Build Coastguard Worker template <typename T> 17*da0073e9SAndroid Build Coastguard Worker struct is_complex<c10::complex<T>> : public std::true_type {}; 18*da0073e9SAndroid Build Coastguard Worker 19*da0073e9SAndroid Build Coastguard Worker // Extract double from std::complex<double>; is identity otherwise 20*da0073e9SAndroid Build Coastguard Worker // TODO: Write in more idiomatic C++17 21*da0073e9SAndroid Build Coastguard Worker template <typename T> 22*da0073e9SAndroid Build Coastguard Worker struct scalar_value_type { 23*da0073e9SAndroid Build Coastguard Worker using type = T; 24*da0073e9SAndroid Build Coastguard Worker }; 25*da0073e9SAndroid Build Coastguard Worker template <typename T> 26*da0073e9SAndroid Build Coastguard Worker struct scalar_value_type<std::complex<T>> { 27*da0073e9SAndroid Build Coastguard Worker using type = T; 28*da0073e9SAndroid Build Coastguard Worker }; 29*da0073e9SAndroid Build Coastguard Worker template <typename T> 30*da0073e9SAndroid Build Coastguard Worker struct scalar_value_type<c10::complex<T>> { 31*da0073e9SAndroid Build Coastguard Worker using type = T; 32*da0073e9SAndroid Build Coastguard Worker }; 33*da0073e9SAndroid Build Coastguard Worker 34*da0073e9SAndroid Build Coastguard Worker } // namespace c10 35*da0073e9SAndroid Build Coastguard Worker 36*da0073e9SAndroid Build Coastguard Worker namespace std { 37*da0073e9SAndroid Build Coastguard Worker 38*da0073e9SAndroid Build Coastguard Worker template <typename T> 39*da0073e9SAndroid Build Coastguard Worker class numeric_limits<c10::complex<T>> : public numeric_limits<T> {}; 40*da0073e9SAndroid Build Coastguard Worker 41*da0073e9SAndroid Build Coastguard Worker template <typename T> 42*da0073e9SAndroid Build Coastguard Worker bool isnan(const c10::complex<T>& v) { 43*da0073e9SAndroid Build Coastguard Worker return std::isnan(v.real()) || std::isnan(v.imag()); 44*da0073e9SAndroid Build Coastguard Worker } 45*da0073e9SAndroid Build Coastguard Worker 46*da0073e9SAndroid Build Coastguard Worker } // namespace std 47