1*58b9f456SAndroid Build Coastguard Worker// -*- C++ -*- 2*58b9f456SAndroid Build Coastguard Worker//===--------------------------- complex ----------------------------------===// 3*58b9f456SAndroid Build Coastguard Worker// 4*58b9f456SAndroid Build Coastguard Worker// The LLVM Compiler Infrastructure 5*58b9f456SAndroid Build Coastguard Worker// 6*58b9f456SAndroid Build Coastguard Worker// This file is dual licensed under the MIT and the University of Illinois Open 7*58b9f456SAndroid Build Coastguard Worker// Source Licenses. See LICENSE.TXT for details. 8*58b9f456SAndroid Build Coastguard Worker// 9*58b9f456SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 10*58b9f456SAndroid Build Coastguard Worker 11*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_COMPLEX 12*58b9f456SAndroid Build Coastguard Worker#define _LIBCPP_COMPLEX 13*58b9f456SAndroid Build Coastguard Worker 14*58b9f456SAndroid Build Coastguard Worker/* 15*58b9f456SAndroid Build Coastguard Worker complex synopsis 16*58b9f456SAndroid Build Coastguard Worker 17*58b9f456SAndroid Build Coastguard Workernamespace std 18*58b9f456SAndroid Build Coastguard Worker{ 19*58b9f456SAndroid Build Coastguard Worker 20*58b9f456SAndroid Build Coastguard Workertemplate<class T> 21*58b9f456SAndroid Build Coastguard Workerclass complex 22*58b9f456SAndroid Build Coastguard Worker{ 23*58b9f456SAndroid Build Coastguard Workerpublic: 24*58b9f456SAndroid Build Coastguard Worker typedef T value_type; 25*58b9f456SAndroid Build Coastguard Worker 26*58b9f456SAndroid Build Coastguard Worker complex(const T& re = T(), const T& im = T()); // constexpr in C++14 27*58b9f456SAndroid Build Coastguard Worker complex(const complex&); // constexpr in C++14 28*58b9f456SAndroid Build Coastguard Worker template<class X> complex(const complex<X>&); // constexpr in C++14 29*58b9f456SAndroid Build Coastguard Worker 30*58b9f456SAndroid Build Coastguard Worker T real() const; // constexpr in C++14 31*58b9f456SAndroid Build Coastguard Worker T imag() const; // constexpr in C++14 32*58b9f456SAndroid Build Coastguard Worker 33*58b9f456SAndroid Build Coastguard Worker void real(T); 34*58b9f456SAndroid Build Coastguard Worker void imag(T); 35*58b9f456SAndroid Build Coastguard Worker 36*58b9f456SAndroid Build Coastguard Worker complex<T>& operator= (const T&); 37*58b9f456SAndroid Build Coastguard Worker complex<T>& operator+=(const T&); 38*58b9f456SAndroid Build Coastguard Worker complex<T>& operator-=(const T&); 39*58b9f456SAndroid Build Coastguard Worker complex<T>& operator*=(const T&); 40*58b9f456SAndroid Build Coastguard Worker complex<T>& operator/=(const T&); 41*58b9f456SAndroid Build Coastguard Worker 42*58b9f456SAndroid Build Coastguard Worker complex& operator=(const complex&); 43*58b9f456SAndroid Build Coastguard Worker template<class X> complex<T>& operator= (const complex<X>&); 44*58b9f456SAndroid Build Coastguard Worker template<class X> complex<T>& operator+=(const complex<X>&); 45*58b9f456SAndroid Build Coastguard Worker template<class X> complex<T>& operator-=(const complex<X>&); 46*58b9f456SAndroid Build Coastguard Worker template<class X> complex<T>& operator*=(const complex<X>&); 47*58b9f456SAndroid Build Coastguard Worker template<class X> complex<T>& operator/=(const complex<X>&); 48*58b9f456SAndroid Build Coastguard Worker}; 49*58b9f456SAndroid Build Coastguard Worker 50*58b9f456SAndroid Build Coastguard Workertemplate<> 51*58b9f456SAndroid Build Coastguard Workerclass complex<float> 52*58b9f456SAndroid Build Coastguard Worker{ 53*58b9f456SAndroid Build Coastguard Workerpublic: 54*58b9f456SAndroid Build Coastguard Worker typedef float value_type; 55*58b9f456SAndroid Build Coastguard Worker 56*58b9f456SAndroid Build Coastguard Worker constexpr complex(float re = 0.0f, float im = 0.0f); 57*58b9f456SAndroid Build Coastguard Worker explicit constexpr complex(const complex<double>&); 58*58b9f456SAndroid Build Coastguard Worker explicit constexpr complex(const complex<long double>&); 59*58b9f456SAndroid Build Coastguard Worker 60*58b9f456SAndroid Build Coastguard Worker constexpr float real() const; 61*58b9f456SAndroid Build Coastguard Worker void real(float); 62*58b9f456SAndroid Build Coastguard Worker constexpr float imag() const; 63*58b9f456SAndroid Build Coastguard Worker void imag(float); 64*58b9f456SAndroid Build Coastguard Worker 65*58b9f456SAndroid Build Coastguard Worker complex<float>& operator= (float); 66*58b9f456SAndroid Build Coastguard Worker complex<float>& operator+=(float); 67*58b9f456SAndroid Build Coastguard Worker complex<float>& operator-=(float); 68*58b9f456SAndroid Build Coastguard Worker complex<float>& operator*=(float); 69*58b9f456SAndroid Build Coastguard Worker complex<float>& operator/=(float); 70*58b9f456SAndroid Build Coastguard Worker 71*58b9f456SAndroid Build Coastguard Worker complex<float>& operator=(const complex<float>&); 72*58b9f456SAndroid Build Coastguard Worker template<class X> complex<float>& operator= (const complex<X>&); 73*58b9f456SAndroid Build Coastguard Worker template<class X> complex<float>& operator+=(const complex<X>&); 74*58b9f456SAndroid Build Coastguard Worker template<class X> complex<float>& operator-=(const complex<X>&); 75*58b9f456SAndroid Build Coastguard Worker template<class X> complex<float>& operator*=(const complex<X>&); 76*58b9f456SAndroid Build Coastguard Worker template<class X> complex<float>& operator/=(const complex<X>&); 77*58b9f456SAndroid Build Coastguard Worker}; 78*58b9f456SAndroid Build Coastguard Worker 79*58b9f456SAndroid Build Coastguard Workertemplate<> 80*58b9f456SAndroid Build Coastguard Workerclass complex<double> 81*58b9f456SAndroid Build Coastguard Worker{ 82*58b9f456SAndroid Build Coastguard Workerpublic: 83*58b9f456SAndroid Build Coastguard Worker typedef double value_type; 84*58b9f456SAndroid Build Coastguard Worker 85*58b9f456SAndroid Build Coastguard Worker constexpr complex(double re = 0.0, double im = 0.0); 86*58b9f456SAndroid Build Coastguard Worker constexpr complex(const complex<float>&); 87*58b9f456SAndroid Build Coastguard Worker explicit constexpr complex(const complex<long double>&); 88*58b9f456SAndroid Build Coastguard Worker 89*58b9f456SAndroid Build Coastguard Worker constexpr double real() const; 90*58b9f456SAndroid Build Coastguard Worker void real(double); 91*58b9f456SAndroid Build Coastguard Worker constexpr double imag() const; 92*58b9f456SAndroid Build Coastguard Worker void imag(double); 93*58b9f456SAndroid Build Coastguard Worker 94*58b9f456SAndroid Build Coastguard Worker complex<double>& operator= (double); 95*58b9f456SAndroid Build Coastguard Worker complex<double>& operator+=(double); 96*58b9f456SAndroid Build Coastguard Worker complex<double>& operator-=(double); 97*58b9f456SAndroid Build Coastguard Worker complex<double>& operator*=(double); 98*58b9f456SAndroid Build Coastguard Worker complex<double>& operator/=(double); 99*58b9f456SAndroid Build Coastguard Worker complex<double>& operator=(const complex<double>&); 100*58b9f456SAndroid Build Coastguard Worker 101*58b9f456SAndroid Build Coastguard Worker template<class X> complex<double>& operator= (const complex<X>&); 102*58b9f456SAndroid Build Coastguard Worker template<class X> complex<double>& operator+=(const complex<X>&); 103*58b9f456SAndroid Build Coastguard Worker template<class X> complex<double>& operator-=(const complex<X>&); 104*58b9f456SAndroid Build Coastguard Worker template<class X> complex<double>& operator*=(const complex<X>&); 105*58b9f456SAndroid Build Coastguard Worker template<class X> complex<double>& operator/=(const complex<X>&); 106*58b9f456SAndroid Build Coastguard Worker}; 107*58b9f456SAndroid Build Coastguard Worker 108*58b9f456SAndroid Build Coastguard Workertemplate<> 109*58b9f456SAndroid Build Coastguard Workerclass complex<long double> 110*58b9f456SAndroid Build Coastguard Worker{ 111*58b9f456SAndroid Build Coastguard Workerpublic: 112*58b9f456SAndroid Build Coastguard Worker typedef long double value_type; 113*58b9f456SAndroid Build Coastguard Worker 114*58b9f456SAndroid Build Coastguard Worker constexpr complex(long double re = 0.0L, long double im = 0.0L); 115*58b9f456SAndroid Build Coastguard Worker constexpr complex(const complex<float>&); 116*58b9f456SAndroid Build Coastguard Worker constexpr complex(const complex<double>&); 117*58b9f456SAndroid Build Coastguard Worker 118*58b9f456SAndroid Build Coastguard Worker constexpr long double real() const; 119*58b9f456SAndroid Build Coastguard Worker void real(long double); 120*58b9f456SAndroid Build Coastguard Worker constexpr long double imag() const; 121*58b9f456SAndroid Build Coastguard Worker void imag(long double); 122*58b9f456SAndroid Build Coastguard Worker 123*58b9f456SAndroid Build Coastguard Worker complex<long double>& operator=(const complex<long double>&); 124*58b9f456SAndroid Build Coastguard Worker complex<long double>& operator= (long double); 125*58b9f456SAndroid Build Coastguard Worker complex<long double>& operator+=(long double); 126*58b9f456SAndroid Build Coastguard Worker complex<long double>& operator-=(long double); 127*58b9f456SAndroid Build Coastguard Worker complex<long double>& operator*=(long double); 128*58b9f456SAndroid Build Coastguard Worker complex<long double>& operator/=(long double); 129*58b9f456SAndroid Build Coastguard Worker 130*58b9f456SAndroid Build Coastguard Worker template<class X> complex<long double>& operator= (const complex<X>&); 131*58b9f456SAndroid Build Coastguard Worker template<class X> complex<long double>& operator+=(const complex<X>&); 132*58b9f456SAndroid Build Coastguard Worker template<class X> complex<long double>& operator-=(const complex<X>&); 133*58b9f456SAndroid Build Coastguard Worker template<class X> complex<long double>& operator*=(const complex<X>&); 134*58b9f456SAndroid Build Coastguard Worker template<class X> complex<long double>& operator/=(const complex<X>&); 135*58b9f456SAndroid Build Coastguard Worker}; 136*58b9f456SAndroid Build Coastguard Worker 137*58b9f456SAndroid Build Coastguard Worker// 26.3.6 operators: 138*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> operator+(const complex<T>&, const complex<T>&); 139*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> operator+(const complex<T>&, const T&); 140*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> operator+(const T&, const complex<T>&); 141*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> operator-(const complex<T>&, const complex<T>&); 142*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> operator-(const complex<T>&, const T&); 143*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> operator-(const T&, const complex<T>&); 144*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> operator*(const complex<T>&, const complex<T>&); 145*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> operator*(const complex<T>&, const T&); 146*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> operator*(const T&, const complex<T>&); 147*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> operator/(const complex<T>&, const complex<T>&); 148*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> operator/(const complex<T>&, const T&); 149*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> operator/(const T&, const complex<T>&); 150*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> operator+(const complex<T>&); 151*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> operator-(const complex<T>&); 152*58b9f456SAndroid Build Coastguard Workertemplate<class T> bool operator==(const complex<T>&, const complex<T>&); // constexpr in C++14 153*58b9f456SAndroid Build Coastguard Workertemplate<class T> bool operator==(const complex<T>&, const T&); // constexpr in C++14 154*58b9f456SAndroid Build Coastguard Workertemplate<class T> bool operator==(const T&, const complex<T>&); // constexpr in C++14 155*58b9f456SAndroid Build Coastguard Workertemplate<class T> bool operator!=(const complex<T>&, const complex<T>&); // constexpr in C++14 156*58b9f456SAndroid Build Coastguard Workertemplate<class T> bool operator!=(const complex<T>&, const T&); // constexpr in C++14 157*58b9f456SAndroid Build Coastguard Workertemplate<class T> bool operator!=(const T&, const complex<T>&); // constexpr in C++14 158*58b9f456SAndroid Build Coastguard Worker 159*58b9f456SAndroid Build Coastguard Workertemplate<class T, class charT, class traits> 160*58b9f456SAndroid Build Coastguard Worker basic_istream<charT, traits>& 161*58b9f456SAndroid Build Coastguard Worker operator>>(basic_istream<charT, traits>&, complex<T>&); 162*58b9f456SAndroid Build Coastguard Workertemplate<class T, class charT, class traits> 163*58b9f456SAndroid Build Coastguard Worker basic_ostream<charT, traits>& 164*58b9f456SAndroid Build Coastguard Worker operator<<(basic_ostream<charT, traits>&, const complex<T>&); 165*58b9f456SAndroid Build Coastguard Worker 166*58b9f456SAndroid Build Coastguard Worker// 26.3.7 values: 167*58b9f456SAndroid Build Coastguard Worker 168*58b9f456SAndroid Build Coastguard Workertemplate<class T> T real(const complex<T>&); // constexpr in C++14 169*58b9f456SAndroid Build Coastguard Worker long double real(long double); // constexpr in C++14 170*58b9f456SAndroid Build Coastguard Worker double real(double); // constexpr in C++14 171*58b9f456SAndroid Build Coastguard Workertemplate<Integral T> double real(T); // constexpr in C++14 172*58b9f456SAndroid Build Coastguard Worker float real(float); // constexpr in C++14 173*58b9f456SAndroid Build Coastguard Worker 174*58b9f456SAndroid Build Coastguard Workertemplate<class T> T imag(const complex<T>&); // constexpr in C++14 175*58b9f456SAndroid Build Coastguard Worker long double imag(long double); // constexpr in C++14 176*58b9f456SAndroid Build Coastguard Worker double imag(double); // constexpr in C++14 177*58b9f456SAndroid Build Coastguard Workertemplate<Integral T> double imag(T); // constexpr in C++14 178*58b9f456SAndroid Build Coastguard Worker float imag(float); // constexpr in C++14 179*58b9f456SAndroid Build Coastguard Worker 180*58b9f456SAndroid Build Coastguard Workertemplate<class T> T abs(const complex<T>&); 181*58b9f456SAndroid Build Coastguard Worker 182*58b9f456SAndroid Build Coastguard Workertemplate<class T> T arg(const complex<T>&); 183*58b9f456SAndroid Build Coastguard Worker long double arg(long double); 184*58b9f456SAndroid Build Coastguard Worker double arg(double); 185*58b9f456SAndroid Build Coastguard Workertemplate<Integral T> double arg(T); 186*58b9f456SAndroid Build Coastguard Worker float arg(float); 187*58b9f456SAndroid Build Coastguard Worker 188*58b9f456SAndroid Build Coastguard Workertemplate<class T> T norm(const complex<T>&); 189*58b9f456SAndroid Build Coastguard Worker long double norm(long double); 190*58b9f456SAndroid Build Coastguard Worker double norm(double); 191*58b9f456SAndroid Build Coastguard Workertemplate<Integral T> double norm(T); 192*58b9f456SAndroid Build Coastguard Worker float norm(float); 193*58b9f456SAndroid Build Coastguard Worker 194*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> conj(const complex<T>&); 195*58b9f456SAndroid Build Coastguard Worker complex<long double> conj(long double); 196*58b9f456SAndroid Build Coastguard Worker complex<double> conj(double); 197*58b9f456SAndroid Build Coastguard Workertemplate<Integral T> complex<double> conj(T); 198*58b9f456SAndroid Build Coastguard Worker complex<float> conj(float); 199*58b9f456SAndroid Build Coastguard Worker 200*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> proj(const complex<T>&); 201*58b9f456SAndroid Build Coastguard Worker complex<long double> proj(long double); 202*58b9f456SAndroid Build Coastguard Worker complex<double> proj(double); 203*58b9f456SAndroid Build Coastguard Workertemplate<Integral T> complex<double> proj(T); 204*58b9f456SAndroid Build Coastguard Worker complex<float> proj(float); 205*58b9f456SAndroid Build Coastguard Worker 206*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> polar(const T&, const T& = T()); 207*58b9f456SAndroid Build Coastguard Worker 208*58b9f456SAndroid Build Coastguard Worker// 26.3.8 transcendentals: 209*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> acos(const complex<T>&); 210*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> asin(const complex<T>&); 211*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> atan(const complex<T>&); 212*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> acosh(const complex<T>&); 213*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> asinh(const complex<T>&); 214*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> atanh(const complex<T>&); 215*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> cos (const complex<T>&); 216*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> cosh (const complex<T>&); 217*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> exp (const complex<T>&); 218*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> log (const complex<T>&); 219*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> log10(const complex<T>&); 220*58b9f456SAndroid Build Coastguard Worker 221*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> pow(const complex<T>&, const T&); 222*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> pow(const complex<T>&, const complex<T>&); 223*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> pow(const T&, const complex<T>&); 224*58b9f456SAndroid Build Coastguard Worker 225*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> sin (const complex<T>&); 226*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> sinh (const complex<T>&); 227*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> sqrt (const complex<T>&); 228*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> tan (const complex<T>&); 229*58b9f456SAndroid Build Coastguard Workertemplate<class T> complex<T> tanh (const complex<T>&); 230*58b9f456SAndroid Build Coastguard Worker 231*58b9f456SAndroid Build Coastguard Workertemplate<class T, class charT, class traits> 232*58b9f456SAndroid Build Coastguard Worker basic_istream<charT, traits>& 233*58b9f456SAndroid Build Coastguard Worker operator>>(basic_istream<charT, traits>& is, complex<T>& x); 234*58b9f456SAndroid Build Coastguard Worker 235*58b9f456SAndroid Build Coastguard Workertemplate<class T, class charT, class traits> 236*58b9f456SAndroid Build Coastguard Worker basic_ostream<charT, traits>& 237*58b9f456SAndroid Build Coastguard Worker operator<<(basic_ostream<charT, traits>& o, const complex<T>& x); 238*58b9f456SAndroid Build Coastguard Worker 239*58b9f456SAndroid Build Coastguard Worker} // std 240*58b9f456SAndroid Build Coastguard Worker 241*58b9f456SAndroid Build Coastguard Worker*/ 242*58b9f456SAndroid Build Coastguard Worker 243*58b9f456SAndroid Build Coastguard Worker#include <__config> 244*58b9f456SAndroid Build Coastguard Worker#include <type_traits> 245*58b9f456SAndroid Build Coastguard Worker#include <stdexcept> 246*58b9f456SAndroid Build Coastguard Worker#include <cmath> 247*58b9f456SAndroid Build Coastguard Worker#include <sstream> 248*58b9f456SAndroid Build Coastguard Worker#include <version> 249*58b9f456SAndroid Build Coastguard Worker 250*58b9f456SAndroid Build Coastguard Worker#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 251*58b9f456SAndroid Build Coastguard Worker#pragma GCC system_header 252*58b9f456SAndroid Build Coastguard Worker#endif 253*58b9f456SAndroid Build Coastguard Worker 254*58b9f456SAndroid Build Coastguard Worker_LIBCPP_BEGIN_NAMESPACE_STD 255*58b9f456SAndroid Build Coastguard Worker 256*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> class _LIBCPP_TEMPLATE_VIS complex; 257*58b9f456SAndroid Build Coastguard Worker 258*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> complex<_Tp> operator*(const complex<_Tp>& __z, const complex<_Tp>& __w); 259*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> complex<_Tp> operator/(const complex<_Tp>& __x, const complex<_Tp>& __y); 260*58b9f456SAndroid Build Coastguard Worker 261*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 262*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS complex 263*58b9f456SAndroid Build Coastguard Worker{ 264*58b9f456SAndroid Build Coastguard Workerpublic: 265*58b9f456SAndroid Build Coastguard Worker typedef _Tp value_type; 266*58b9f456SAndroid Build Coastguard Workerprivate: 267*58b9f456SAndroid Build Coastguard Worker value_type __re_; 268*58b9f456SAndroid Build Coastguard Worker value_type __im_; 269*58b9f456SAndroid Build Coastguard Workerpublic: 270*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 271*58b9f456SAndroid Build Coastguard Worker complex(const value_type& __re = value_type(), const value_type& __im = value_type()) 272*58b9f456SAndroid Build Coastguard Worker : __re_(__re), __im_(__im) {} 273*58b9f456SAndroid Build Coastguard Worker template<class _Xp> _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 274*58b9f456SAndroid Build Coastguard Worker complex(const complex<_Xp>& __c) 275*58b9f456SAndroid Build Coastguard Worker : __re_(__c.real()), __im_(__c.imag()) {} 276*58b9f456SAndroid Build Coastguard Worker 277*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 value_type real() const {return __re_;} 278*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 value_type imag() const {return __im_;} 279*58b9f456SAndroid Build Coastguard Worker 280*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;} 281*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;} 282*58b9f456SAndroid Build Coastguard Worker 283*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY complex& operator= (const value_type& __re) 284*58b9f456SAndroid Build Coastguard Worker {__re_ = __re; __im_ = value_type(); return *this;} 285*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY complex& operator+=(const value_type& __re) {__re_ += __re; return *this;} 286*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY complex& operator-=(const value_type& __re) {__re_ -= __re; return *this;} 287*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY complex& operator*=(const value_type& __re) {__re_ *= __re; __im_ *= __re; return *this;} 288*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY complex& operator/=(const value_type& __re) {__re_ /= __re; __im_ /= __re; return *this;} 289*58b9f456SAndroid Build Coastguard Worker 290*58b9f456SAndroid Build Coastguard Worker template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c) 291*58b9f456SAndroid Build Coastguard Worker { 292*58b9f456SAndroid Build Coastguard Worker __re_ = __c.real(); 293*58b9f456SAndroid Build Coastguard Worker __im_ = __c.imag(); 294*58b9f456SAndroid Build Coastguard Worker return *this; 295*58b9f456SAndroid Build Coastguard Worker } 296*58b9f456SAndroid Build Coastguard Worker template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c) 297*58b9f456SAndroid Build Coastguard Worker { 298*58b9f456SAndroid Build Coastguard Worker __re_ += __c.real(); 299*58b9f456SAndroid Build Coastguard Worker __im_ += __c.imag(); 300*58b9f456SAndroid Build Coastguard Worker return *this; 301*58b9f456SAndroid Build Coastguard Worker } 302*58b9f456SAndroid Build Coastguard Worker template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c) 303*58b9f456SAndroid Build Coastguard Worker { 304*58b9f456SAndroid Build Coastguard Worker __re_ -= __c.real(); 305*58b9f456SAndroid Build Coastguard Worker __im_ -= __c.imag(); 306*58b9f456SAndroid Build Coastguard Worker return *this; 307*58b9f456SAndroid Build Coastguard Worker } 308*58b9f456SAndroid Build Coastguard Worker template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c) 309*58b9f456SAndroid Build Coastguard Worker { 310*58b9f456SAndroid Build Coastguard Worker *this = *this * complex(__c.real(), __c.imag()); 311*58b9f456SAndroid Build Coastguard Worker return *this; 312*58b9f456SAndroid Build Coastguard Worker } 313*58b9f456SAndroid Build Coastguard Worker template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c) 314*58b9f456SAndroid Build Coastguard Worker { 315*58b9f456SAndroid Build Coastguard Worker *this = *this / complex(__c.real(), __c.imag()); 316*58b9f456SAndroid Build Coastguard Worker return *this; 317*58b9f456SAndroid Build Coastguard Worker } 318*58b9f456SAndroid Build Coastguard Worker}; 319*58b9f456SAndroid Build Coastguard Worker 320*58b9f456SAndroid Build Coastguard Workertemplate<> class _LIBCPP_TEMPLATE_VIS complex<double>; 321*58b9f456SAndroid Build Coastguard Workertemplate<> class _LIBCPP_TEMPLATE_VIS complex<long double>; 322*58b9f456SAndroid Build Coastguard Worker 323*58b9f456SAndroid Build Coastguard Workertemplate<> 324*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS complex<float> 325*58b9f456SAndroid Build Coastguard Worker{ 326*58b9f456SAndroid Build Coastguard Worker float __re_; 327*58b9f456SAndroid Build Coastguard Worker float __im_; 328*58b9f456SAndroid Build Coastguard Workerpublic: 329*58b9f456SAndroid Build Coastguard Worker typedef float value_type; 330*58b9f456SAndroid Build Coastguard Worker 331*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(float __re = 0.0f, float __im = 0.0f) 332*58b9f456SAndroid Build Coastguard Worker : __re_(__re), __im_(__im) {} 333*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 334*58b9f456SAndroid Build Coastguard Worker explicit _LIBCPP_CONSTEXPR complex(const complex<double>& __c); 335*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 336*58b9f456SAndroid Build Coastguard Worker explicit _LIBCPP_CONSTEXPR complex(const complex<long double>& __c); 337*58b9f456SAndroid Build Coastguard Worker 338*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR float real() const {return __re_;} 339*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR float imag() const {return __im_;} 340*58b9f456SAndroid Build Coastguard Worker 341*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;} 342*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;} 343*58b9f456SAndroid Build Coastguard Worker 344*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY complex& operator= (float __re) 345*58b9f456SAndroid Build Coastguard Worker {__re_ = __re; __im_ = value_type(); return *this;} 346*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY complex& operator+=(float __re) {__re_ += __re; return *this;} 347*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY complex& operator-=(float __re) {__re_ -= __re; return *this;} 348*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY complex& operator*=(float __re) {__re_ *= __re; __im_ *= __re; return *this;} 349*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY complex& operator/=(float __re) {__re_ /= __re; __im_ /= __re; return *this;} 350*58b9f456SAndroid Build Coastguard Worker 351*58b9f456SAndroid Build Coastguard Worker template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c) 352*58b9f456SAndroid Build Coastguard Worker { 353*58b9f456SAndroid Build Coastguard Worker __re_ = __c.real(); 354*58b9f456SAndroid Build Coastguard Worker __im_ = __c.imag(); 355*58b9f456SAndroid Build Coastguard Worker return *this; 356*58b9f456SAndroid Build Coastguard Worker } 357*58b9f456SAndroid Build Coastguard Worker template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c) 358*58b9f456SAndroid Build Coastguard Worker { 359*58b9f456SAndroid Build Coastguard Worker __re_ += __c.real(); 360*58b9f456SAndroid Build Coastguard Worker __im_ += __c.imag(); 361*58b9f456SAndroid Build Coastguard Worker return *this; 362*58b9f456SAndroid Build Coastguard Worker } 363*58b9f456SAndroid Build Coastguard Worker template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c) 364*58b9f456SAndroid Build Coastguard Worker { 365*58b9f456SAndroid Build Coastguard Worker __re_ -= __c.real(); 366*58b9f456SAndroid Build Coastguard Worker __im_ -= __c.imag(); 367*58b9f456SAndroid Build Coastguard Worker return *this; 368*58b9f456SAndroid Build Coastguard Worker } 369*58b9f456SAndroid Build Coastguard Worker template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c) 370*58b9f456SAndroid Build Coastguard Worker { 371*58b9f456SAndroid Build Coastguard Worker *this = *this * complex(__c.real(), __c.imag()); 372*58b9f456SAndroid Build Coastguard Worker return *this; 373*58b9f456SAndroid Build Coastguard Worker } 374*58b9f456SAndroid Build Coastguard Worker template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c) 375*58b9f456SAndroid Build Coastguard Worker { 376*58b9f456SAndroid Build Coastguard Worker *this = *this / complex(__c.real(), __c.imag()); 377*58b9f456SAndroid Build Coastguard Worker return *this; 378*58b9f456SAndroid Build Coastguard Worker } 379*58b9f456SAndroid Build Coastguard Worker}; 380*58b9f456SAndroid Build Coastguard Worker 381*58b9f456SAndroid Build Coastguard Workertemplate<> 382*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS complex<double> 383*58b9f456SAndroid Build Coastguard Worker{ 384*58b9f456SAndroid Build Coastguard Worker double __re_; 385*58b9f456SAndroid Build Coastguard Worker double __im_; 386*58b9f456SAndroid Build Coastguard Workerpublic: 387*58b9f456SAndroid Build Coastguard Worker typedef double value_type; 388*58b9f456SAndroid Build Coastguard Worker 389*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(double __re = 0.0, double __im = 0.0) 390*58b9f456SAndroid Build Coastguard Worker : __re_(__re), __im_(__im) {} 391*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 392*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR complex(const complex<float>& __c); 393*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 394*58b9f456SAndroid Build Coastguard Worker explicit _LIBCPP_CONSTEXPR complex(const complex<long double>& __c); 395*58b9f456SAndroid Build Coastguard Worker 396*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR double real() const {return __re_;} 397*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR double imag() const {return __im_;} 398*58b9f456SAndroid Build Coastguard Worker 399*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;} 400*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;} 401*58b9f456SAndroid Build Coastguard Worker 402*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY complex& operator= (double __re) 403*58b9f456SAndroid Build Coastguard Worker {__re_ = __re; __im_ = value_type(); return *this;} 404*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY complex& operator+=(double __re) {__re_ += __re; return *this;} 405*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY complex& operator-=(double __re) {__re_ -= __re; return *this;} 406*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY complex& operator*=(double __re) {__re_ *= __re; __im_ *= __re; return *this;} 407*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY complex& operator/=(double __re) {__re_ /= __re; __im_ /= __re; return *this;} 408*58b9f456SAndroid Build Coastguard Worker 409*58b9f456SAndroid Build Coastguard Worker template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c) 410*58b9f456SAndroid Build Coastguard Worker { 411*58b9f456SAndroid Build Coastguard Worker __re_ = __c.real(); 412*58b9f456SAndroid Build Coastguard Worker __im_ = __c.imag(); 413*58b9f456SAndroid Build Coastguard Worker return *this; 414*58b9f456SAndroid Build Coastguard Worker } 415*58b9f456SAndroid Build Coastguard Worker template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c) 416*58b9f456SAndroid Build Coastguard Worker { 417*58b9f456SAndroid Build Coastguard Worker __re_ += __c.real(); 418*58b9f456SAndroid Build Coastguard Worker __im_ += __c.imag(); 419*58b9f456SAndroid Build Coastguard Worker return *this; 420*58b9f456SAndroid Build Coastguard Worker } 421*58b9f456SAndroid Build Coastguard Worker template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c) 422*58b9f456SAndroid Build Coastguard Worker { 423*58b9f456SAndroid Build Coastguard Worker __re_ -= __c.real(); 424*58b9f456SAndroid Build Coastguard Worker __im_ -= __c.imag(); 425*58b9f456SAndroid Build Coastguard Worker return *this; 426*58b9f456SAndroid Build Coastguard Worker } 427*58b9f456SAndroid Build Coastguard Worker template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c) 428*58b9f456SAndroid Build Coastguard Worker { 429*58b9f456SAndroid Build Coastguard Worker *this = *this * complex(__c.real(), __c.imag()); 430*58b9f456SAndroid Build Coastguard Worker return *this; 431*58b9f456SAndroid Build Coastguard Worker } 432*58b9f456SAndroid Build Coastguard Worker template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c) 433*58b9f456SAndroid Build Coastguard Worker { 434*58b9f456SAndroid Build Coastguard Worker *this = *this / complex(__c.real(), __c.imag()); 435*58b9f456SAndroid Build Coastguard Worker return *this; 436*58b9f456SAndroid Build Coastguard Worker } 437*58b9f456SAndroid Build Coastguard Worker}; 438*58b9f456SAndroid Build Coastguard Worker 439*58b9f456SAndroid Build Coastguard Workertemplate<> 440*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS complex<long double> 441*58b9f456SAndroid Build Coastguard Worker{ 442*58b9f456SAndroid Build Coastguard Worker long double __re_; 443*58b9f456SAndroid Build Coastguard Worker long double __im_; 444*58b9f456SAndroid Build Coastguard Workerpublic: 445*58b9f456SAndroid Build Coastguard Worker typedef long double value_type; 446*58b9f456SAndroid Build Coastguard Worker 447*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(long double __re = 0.0L, long double __im = 0.0L) 448*58b9f456SAndroid Build Coastguard Worker : __re_(__re), __im_(__im) {} 449*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 450*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR complex(const complex<float>& __c); 451*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 452*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR complex(const complex<double>& __c); 453*58b9f456SAndroid Build Coastguard Worker 454*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR long double real() const {return __re_;} 455*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR long double imag() const {return __im_;} 456*58b9f456SAndroid Build Coastguard Worker 457*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;} 458*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;} 459*58b9f456SAndroid Build Coastguard Worker 460*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY complex& operator= (long double __re) 461*58b9f456SAndroid Build Coastguard Worker {__re_ = __re; __im_ = value_type(); return *this;} 462*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY complex& operator+=(long double __re) {__re_ += __re; return *this;} 463*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY complex& operator-=(long double __re) {__re_ -= __re; return *this;} 464*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY complex& operator*=(long double __re) {__re_ *= __re; __im_ *= __re; return *this;} 465*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY complex& operator/=(long double __re) {__re_ /= __re; __im_ /= __re; return *this;} 466*58b9f456SAndroid Build Coastguard Worker 467*58b9f456SAndroid Build Coastguard Worker template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c) 468*58b9f456SAndroid Build Coastguard Worker { 469*58b9f456SAndroid Build Coastguard Worker __re_ = __c.real(); 470*58b9f456SAndroid Build Coastguard Worker __im_ = __c.imag(); 471*58b9f456SAndroid Build Coastguard Worker return *this; 472*58b9f456SAndroid Build Coastguard Worker } 473*58b9f456SAndroid Build Coastguard Worker template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c) 474*58b9f456SAndroid Build Coastguard Worker { 475*58b9f456SAndroid Build Coastguard Worker __re_ += __c.real(); 476*58b9f456SAndroid Build Coastguard Worker __im_ += __c.imag(); 477*58b9f456SAndroid Build Coastguard Worker return *this; 478*58b9f456SAndroid Build Coastguard Worker } 479*58b9f456SAndroid Build Coastguard Worker template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c) 480*58b9f456SAndroid Build Coastguard Worker { 481*58b9f456SAndroid Build Coastguard Worker __re_ -= __c.real(); 482*58b9f456SAndroid Build Coastguard Worker __im_ -= __c.imag(); 483*58b9f456SAndroid Build Coastguard Worker return *this; 484*58b9f456SAndroid Build Coastguard Worker } 485*58b9f456SAndroid Build Coastguard Worker template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c) 486*58b9f456SAndroid Build Coastguard Worker { 487*58b9f456SAndroid Build Coastguard Worker *this = *this * complex(__c.real(), __c.imag()); 488*58b9f456SAndroid Build Coastguard Worker return *this; 489*58b9f456SAndroid Build Coastguard Worker } 490*58b9f456SAndroid Build Coastguard Worker template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c) 491*58b9f456SAndroid Build Coastguard Worker { 492*58b9f456SAndroid Build Coastguard Worker *this = *this / complex(__c.real(), __c.imag()); 493*58b9f456SAndroid Build Coastguard Worker return *this; 494*58b9f456SAndroid Build Coastguard Worker } 495*58b9f456SAndroid Build Coastguard Worker}; 496*58b9f456SAndroid Build Coastguard Worker 497*58b9f456SAndroid Build Coastguard Workerinline 498*58b9f456SAndroid Build Coastguard Worker_LIBCPP_CONSTEXPR 499*58b9f456SAndroid Build Coastguard Workercomplex<float>::complex(const complex<double>& __c) 500*58b9f456SAndroid Build Coastguard Worker : __re_(__c.real()), __im_(__c.imag()) {} 501*58b9f456SAndroid Build Coastguard Worker 502*58b9f456SAndroid Build Coastguard Workerinline 503*58b9f456SAndroid Build Coastguard Worker_LIBCPP_CONSTEXPR 504*58b9f456SAndroid Build Coastguard Workercomplex<float>::complex(const complex<long double>& __c) 505*58b9f456SAndroid Build Coastguard Worker : __re_(__c.real()), __im_(__c.imag()) {} 506*58b9f456SAndroid Build Coastguard Worker 507*58b9f456SAndroid Build Coastguard Workerinline 508*58b9f456SAndroid Build Coastguard Worker_LIBCPP_CONSTEXPR 509*58b9f456SAndroid Build Coastguard Workercomplex<double>::complex(const complex<float>& __c) 510*58b9f456SAndroid Build Coastguard Worker : __re_(__c.real()), __im_(__c.imag()) {} 511*58b9f456SAndroid Build Coastguard Worker 512*58b9f456SAndroid Build Coastguard Workerinline 513*58b9f456SAndroid Build Coastguard Worker_LIBCPP_CONSTEXPR 514*58b9f456SAndroid Build Coastguard Workercomplex<double>::complex(const complex<long double>& __c) 515*58b9f456SAndroid Build Coastguard Worker : __re_(__c.real()), __im_(__c.imag()) {} 516*58b9f456SAndroid Build Coastguard Worker 517*58b9f456SAndroid Build Coastguard Workerinline 518*58b9f456SAndroid Build Coastguard Worker_LIBCPP_CONSTEXPR 519*58b9f456SAndroid Build Coastguard Workercomplex<long double>::complex(const complex<float>& __c) 520*58b9f456SAndroid Build Coastguard Worker : __re_(__c.real()), __im_(__c.imag()) {} 521*58b9f456SAndroid Build Coastguard Worker 522*58b9f456SAndroid Build Coastguard Workerinline 523*58b9f456SAndroid Build Coastguard Worker_LIBCPP_CONSTEXPR 524*58b9f456SAndroid Build Coastguard Workercomplex<long double>::complex(const complex<double>& __c) 525*58b9f456SAndroid Build Coastguard Worker : __re_(__c.real()), __im_(__c.imag()) {} 526*58b9f456SAndroid Build Coastguard Worker 527*58b9f456SAndroid Build Coastguard Worker// 26.3.6 operators: 528*58b9f456SAndroid Build Coastguard Worker 529*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 530*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 531*58b9f456SAndroid Build Coastguard Workercomplex<_Tp> 532*58b9f456SAndroid Build Coastguard Workeroperator+(const complex<_Tp>& __x, const complex<_Tp>& __y) 533*58b9f456SAndroid Build Coastguard Worker{ 534*58b9f456SAndroid Build Coastguard Worker complex<_Tp> __t(__x); 535*58b9f456SAndroid Build Coastguard Worker __t += __y; 536*58b9f456SAndroid Build Coastguard Worker return __t; 537*58b9f456SAndroid Build Coastguard Worker} 538*58b9f456SAndroid Build Coastguard Worker 539*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 540*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 541*58b9f456SAndroid Build Coastguard Workercomplex<_Tp> 542*58b9f456SAndroid Build Coastguard Workeroperator+(const complex<_Tp>& __x, const _Tp& __y) 543*58b9f456SAndroid Build Coastguard Worker{ 544*58b9f456SAndroid Build Coastguard Worker complex<_Tp> __t(__x); 545*58b9f456SAndroid Build Coastguard Worker __t += __y; 546*58b9f456SAndroid Build Coastguard Worker return __t; 547*58b9f456SAndroid Build Coastguard Worker} 548*58b9f456SAndroid Build Coastguard Worker 549*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 550*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 551*58b9f456SAndroid Build Coastguard Workercomplex<_Tp> 552*58b9f456SAndroid Build Coastguard Workeroperator+(const _Tp& __x, const complex<_Tp>& __y) 553*58b9f456SAndroid Build Coastguard Worker{ 554*58b9f456SAndroid Build Coastguard Worker complex<_Tp> __t(__y); 555*58b9f456SAndroid Build Coastguard Worker __t += __x; 556*58b9f456SAndroid Build Coastguard Worker return __t; 557*58b9f456SAndroid Build Coastguard Worker} 558*58b9f456SAndroid Build Coastguard Worker 559*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 560*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 561*58b9f456SAndroid Build Coastguard Workercomplex<_Tp> 562*58b9f456SAndroid Build Coastguard Workeroperator-(const complex<_Tp>& __x, const complex<_Tp>& __y) 563*58b9f456SAndroid Build Coastguard Worker{ 564*58b9f456SAndroid Build Coastguard Worker complex<_Tp> __t(__x); 565*58b9f456SAndroid Build Coastguard Worker __t -= __y; 566*58b9f456SAndroid Build Coastguard Worker return __t; 567*58b9f456SAndroid Build Coastguard Worker} 568*58b9f456SAndroid Build Coastguard Worker 569*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 570*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 571*58b9f456SAndroid Build Coastguard Workercomplex<_Tp> 572*58b9f456SAndroid Build Coastguard Workeroperator-(const complex<_Tp>& __x, const _Tp& __y) 573*58b9f456SAndroid Build Coastguard Worker{ 574*58b9f456SAndroid Build Coastguard Worker complex<_Tp> __t(__x); 575*58b9f456SAndroid Build Coastguard Worker __t -= __y; 576*58b9f456SAndroid Build Coastguard Worker return __t; 577*58b9f456SAndroid Build Coastguard Worker} 578*58b9f456SAndroid Build Coastguard Worker 579*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 580*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 581*58b9f456SAndroid Build Coastguard Workercomplex<_Tp> 582*58b9f456SAndroid Build Coastguard Workeroperator-(const _Tp& __x, const complex<_Tp>& __y) 583*58b9f456SAndroid Build Coastguard Worker{ 584*58b9f456SAndroid Build Coastguard Worker complex<_Tp> __t(-__y); 585*58b9f456SAndroid Build Coastguard Worker __t += __x; 586*58b9f456SAndroid Build Coastguard Worker return __t; 587*58b9f456SAndroid Build Coastguard Worker} 588*58b9f456SAndroid Build Coastguard Worker 589*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 590*58b9f456SAndroid Build Coastguard Workercomplex<_Tp> 591*58b9f456SAndroid Build Coastguard Workeroperator*(const complex<_Tp>& __z, const complex<_Tp>& __w) 592*58b9f456SAndroid Build Coastguard Worker{ 593*58b9f456SAndroid Build Coastguard Worker _Tp __a = __z.real(); 594*58b9f456SAndroid Build Coastguard Worker _Tp __b = __z.imag(); 595*58b9f456SAndroid Build Coastguard Worker _Tp __c = __w.real(); 596*58b9f456SAndroid Build Coastguard Worker _Tp __d = __w.imag(); 597*58b9f456SAndroid Build Coastguard Worker _Tp __ac = __a * __c; 598*58b9f456SAndroid Build Coastguard Worker _Tp __bd = __b * __d; 599*58b9f456SAndroid Build Coastguard Worker _Tp __ad = __a * __d; 600*58b9f456SAndroid Build Coastguard Worker _Tp __bc = __b * __c; 601*58b9f456SAndroid Build Coastguard Worker _Tp __x = __ac - __bd; 602*58b9f456SAndroid Build Coastguard Worker _Tp __y = __ad + __bc; 603*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isnan_or_builtin(__x) && __libcpp_isnan_or_builtin(__y)) 604*58b9f456SAndroid Build Coastguard Worker { 605*58b9f456SAndroid Build Coastguard Worker bool __recalc = false; 606*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isinf_or_builtin(__a) || __libcpp_isinf_or_builtin(__b)) 607*58b9f456SAndroid Build Coastguard Worker { 608*58b9f456SAndroid Build Coastguard Worker __a = copysign(__libcpp_isinf_or_builtin(__a) ? _Tp(1) : _Tp(0), __a); 609*58b9f456SAndroid Build Coastguard Worker __b = copysign(__libcpp_isinf_or_builtin(__b) ? _Tp(1) : _Tp(0), __b); 610*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isnan_or_builtin(__c)) 611*58b9f456SAndroid Build Coastguard Worker __c = copysign(_Tp(0), __c); 612*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isnan_or_builtin(__d)) 613*58b9f456SAndroid Build Coastguard Worker __d = copysign(_Tp(0), __d); 614*58b9f456SAndroid Build Coastguard Worker __recalc = true; 615*58b9f456SAndroid Build Coastguard Worker } 616*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isinf_or_builtin(__c) || __libcpp_isinf_or_builtin(__d)) 617*58b9f456SAndroid Build Coastguard Worker { 618*58b9f456SAndroid Build Coastguard Worker __c = copysign(__libcpp_isinf_or_builtin(__c) ? _Tp(1) : _Tp(0), __c); 619*58b9f456SAndroid Build Coastguard Worker __d = copysign(__libcpp_isinf_or_builtin(__d) ? _Tp(1) : _Tp(0), __d); 620*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isnan_or_builtin(__a)) 621*58b9f456SAndroid Build Coastguard Worker __a = copysign(_Tp(0), __a); 622*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isnan_or_builtin(__b)) 623*58b9f456SAndroid Build Coastguard Worker __b = copysign(_Tp(0), __b); 624*58b9f456SAndroid Build Coastguard Worker __recalc = true; 625*58b9f456SAndroid Build Coastguard Worker } 626*58b9f456SAndroid Build Coastguard Worker if (!__recalc && (__libcpp_isinf_or_builtin(__ac) || __libcpp_isinf_or_builtin(__bd) || 627*58b9f456SAndroid Build Coastguard Worker __libcpp_isinf_or_builtin(__ad) || __libcpp_isinf_or_builtin(__bc))) 628*58b9f456SAndroid Build Coastguard Worker { 629*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isnan_or_builtin(__a)) 630*58b9f456SAndroid Build Coastguard Worker __a = copysign(_Tp(0), __a); 631*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isnan_or_builtin(__b)) 632*58b9f456SAndroid Build Coastguard Worker __b = copysign(_Tp(0), __b); 633*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isnan_or_builtin(__c)) 634*58b9f456SAndroid Build Coastguard Worker __c = copysign(_Tp(0), __c); 635*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isnan_or_builtin(__d)) 636*58b9f456SAndroid Build Coastguard Worker __d = copysign(_Tp(0), __d); 637*58b9f456SAndroid Build Coastguard Worker __recalc = true; 638*58b9f456SAndroid Build Coastguard Worker } 639*58b9f456SAndroid Build Coastguard Worker if (__recalc) 640*58b9f456SAndroid Build Coastguard Worker { 641*58b9f456SAndroid Build Coastguard Worker __x = _Tp(INFINITY) * (__a * __c - __b * __d); 642*58b9f456SAndroid Build Coastguard Worker __y = _Tp(INFINITY) * (__a * __d + __b * __c); 643*58b9f456SAndroid Build Coastguard Worker } 644*58b9f456SAndroid Build Coastguard Worker } 645*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__x, __y); 646*58b9f456SAndroid Build Coastguard Worker} 647*58b9f456SAndroid Build Coastguard Worker 648*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 649*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 650*58b9f456SAndroid Build Coastguard Workercomplex<_Tp> 651*58b9f456SAndroid Build Coastguard Workeroperator*(const complex<_Tp>& __x, const _Tp& __y) 652*58b9f456SAndroid Build Coastguard Worker{ 653*58b9f456SAndroid Build Coastguard Worker complex<_Tp> __t(__x); 654*58b9f456SAndroid Build Coastguard Worker __t *= __y; 655*58b9f456SAndroid Build Coastguard Worker return __t; 656*58b9f456SAndroid Build Coastguard Worker} 657*58b9f456SAndroid Build Coastguard Worker 658*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 659*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 660*58b9f456SAndroid Build Coastguard Workercomplex<_Tp> 661*58b9f456SAndroid Build Coastguard Workeroperator*(const _Tp& __x, const complex<_Tp>& __y) 662*58b9f456SAndroid Build Coastguard Worker{ 663*58b9f456SAndroid Build Coastguard Worker complex<_Tp> __t(__y); 664*58b9f456SAndroid Build Coastguard Worker __t *= __x; 665*58b9f456SAndroid Build Coastguard Worker return __t; 666*58b9f456SAndroid Build Coastguard Worker} 667*58b9f456SAndroid Build Coastguard Worker 668*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 669*58b9f456SAndroid Build Coastguard Workercomplex<_Tp> 670*58b9f456SAndroid Build Coastguard Workeroperator/(const complex<_Tp>& __z, const complex<_Tp>& __w) 671*58b9f456SAndroid Build Coastguard Worker{ 672*58b9f456SAndroid Build Coastguard Worker int __ilogbw = 0; 673*58b9f456SAndroid Build Coastguard Worker _Tp __a = __z.real(); 674*58b9f456SAndroid Build Coastguard Worker _Tp __b = __z.imag(); 675*58b9f456SAndroid Build Coastguard Worker _Tp __c = __w.real(); 676*58b9f456SAndroid Build Coastguard Worker _Tp __d = __w.imag(); 677*58b9f456SAndroid Build Coastguard Worker _Tp __logbw = logb(fmax(fabs(__c), fabs(__d))); 678*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isfinite_or_builtin(__logbw)) 679*58b9f456SAndroid Build Coastguard Worker { 680*58b9f456SAndroid Build Coastguard Worker __ilogbw = static_cast<int>(__logbw); 681*58b9f456SAndroid Build Coastguard Worker __c = scalbn(__c, -__ilogbw); 682*58b9f456SAndroid Build Coastguard Worker __d = scalbn(__d, -__ilogbw); 683*58b9f456SAndroid Build Coastguard Worker } 684*58b9f456SAndroid Build Coastguard Worker _Tp __denom = __c * __c + __d * __d; 685*58b9f456SAndroid Build Coastguard Worker _Tp __x = scalbn((__a * __c + __b * __d) / __denom, -__ilogbw); 686*58b9f456SAndroid Build Coastguard Worker _Tp __y = scalbn((__b * __c - __a * __d) / __denom, -__ilogbw); 687*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isnan_or_builtin(__x) && __libcpp_isnan_or_builtin(__y)) 688*58b9f456SAndroid Build Coastguard Worker { 689*58b9f456SAndroid Build Coastguard Worker if ((__denom == _Tp(0)) && (!__libcpp_isnan_or_builtin(__a) || !__libcpp_isnan_or_builtin(__b))) 690*58b9f456SAndroid Build Coastguard Worker { 691*58b9f456SAndroid Build Coastguard Worker __x = copysign(_Tp(INFINITY), __c) * __a; 692*58b9f456SAndroid Build Coastguard Worker __y = copysign(_Tp(INFINITY), __c) * __b; 693*58b9f456SAndroid Build Coastguard Worker } 694*58b9f456SAndroid Build Coastguard Worker else if ((__libcpp_isinf_or_builtin(__a) || __libcpp_isinf_or_builtin(__b)) && __libcpp_isfinite_or_builtin(__c) && __libcpp_isfinite_or_builtin(__d)) 695*58b9f456SAndroid Build Coastguard Worker { 696*58b9f456SAndroid Build Coastguard Worker __a = copysign(__libcpp_isinf_or_builtin(__a) ? _Tp(1) : _Tp(0), __a); 697*58b9f456SAndroid Build Coastguard Worker __b = copysign(__libcpp_isinf_or_builtin(__b) ? _Tp(1) : _Tp(0), __b); 698*58b9f456SAndroid Build Coastguard Worker __x = _Tp(INFINITY) * (__a * __c + __b * __d); 699*58b9f456SAndroid Build Coastguard Worker __y = _Tp(INFINITY) * (__b * __c - __a * __d); 700*58b9f456SAndroid Build Coastguard Worker } 701*58b9f456SAndroid Build Coastguard Worker else if (__libcpp_isinf_or_builtin(__logbw) && __logbw > _Tp(0) && __libcpp_isfinite_or_builtin(__a) && __libcpp_isfinite_or_builtin(__b)) 702*58b9f456SAndroid Build Coastguard Worker { 703*58b9f456SAndroid Build Coastguard Worker __c = copysign(__libcpp_isinf_or_builtin(__c) ? _Tp(1) : _Tp(0), __c); 704*58b9f456SAndroid Build Coastguard Worker __d = copysign(__libcpp_isinf_or_builtin(__d) ? _Tp(1) : _Tp(0), __d); 705*58b9f456SAndroid Build Coastguard Worker __x = _Tp(0) * (__a * __c + __b * __d); 706*58b9f456SAndroid Build Coastguard Worker __y = _Tp(0) * (__b * __c - __a * __d); 707*58b9f456SAndroid Build Coastguard Worker } 708*58b9f456SAndroid Build Coastguard Worker } 709*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__x, __y); 710*58b9f456SAndroid Build Coastguard Worker} 711*58b9f456SAndroid Build Coastguard Worker 712*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 713*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 714*58b9f456SAndroid Build Coastguard Workercomplex<_Tp> 715*58b9f456SAndroid Build Coastguard Workeroperator/(const complex<_Tp>& __x, const _Tp& __y) 716*58b9f456SAndroid Build Coastguard Worker{ 717*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__x.real() / __y, __x.imag() / __y); 718*58b9f456SAndroid Build Coastguard Worker} 719*58b9f456SAndroid Build Coastguard Worker 720*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 721*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 722*58b9f456SAndroid Build Coastguard Workercomplex<_Tp> 723*58b9f456SAndroid Build Coastguard Workeroperator/(const _Tp& __x, const complex<_Tp>& __y) 724*58b9f456SAndroid Build Coastguard Worker{ 725*58b9f456SAndroid Build Coastguard Worker complex<_Tp> __t(__x); 726*58b9f456SAndroid Build Coastguard Worker __t /= __y; 727*58b9f456SAndroid Build Coastguard Worker return __t; 728*58b9f456SAndroid Build Coastguard Worker} 729*58b9f456SAndroid Build Coastguard Worker 730*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 731*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 732*58b9f456SAndroid Build Coastguard Workercomplex<_Tp> 733*58b9f456SAndroid Build Coastguard Workeroperator+(const complex<_Tp>& __x) 734*58b9f456SAndroid Build Coastguard Worker{ 735*58b9f456SAndroid Build Coastguard Worker return __x; 736*58b9f456SAndroid Build Coastguard Worker} 737*58b9f456SAndroid Build Coastguard Worker 738*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 739*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 740*58b9f456SAndroid Build Coastguard Workercomplex<_Tp> 741*58b9f456SAndroid Build Coastguard Workeroperator-(const complex<_Tp>& __x) 742*58b9f456SAndroid Build Coastguard Worker{ 743*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(-__x.real(), -__x.imag()); 744*58b9f456SAndroid Build Coastguard Worker} 745*58b9f456SAndroid Build Coastguard Worker 746*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 747*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 748*58b9f456SAndroid Build Coastguard Workerbool 749*58b9f456SAndroid Build Coastguard Workeroperator==(const complex<_Tp>& __x, const complex<_Tp>& __y) 750*58b9f456SAndroid Build Coastguard Worker{ 751*58b9f456SAndroid Build Coastguard Worker return __x.real() == __y.real() && __x.imag() == __y.imag(); 752*58b9f456SAndroid Build Coastguard Worker} 753*58b9f456SAndroid Build Coastguard Worker 754*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 755*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 756*58b9f456SAndroid Build Coastguard Workerbool 757*58b9f456SAndroid Build Coastguard Workeroperator==(const complex<_Tp>& __x, const _Tp& __y) 758*58b9f456SAndroid Build Coastguard Worker{ 759*58b9f456SAndroid Build Coastguard Worker return __x.real() == __y && __x.imag() == 0; 760*58b9f456SAndroid Build Coastguard Worker} 761*58b9f456SAndroid Build Coastguard Worker 762*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 763*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 764*58b9f456SAndroid Build Coastguard Workerbool 765*58b9f456SAndroid Build Coastguard Workeroperator==(const _Tp& __x, const complex<_Tp>& __y) 766*58b9f456SAndroid Build Coastguard Worker{ 767*58b9f456SAndroid Build Coastguard Worker return __x == __y.real() && 0 == __y.imag(); 768*58b9f456SAndroid Build Coastguard Worker} 769*58b9f456SAndroid Build Coastguard Worker 770*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 771*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 772*58b9f456SAndroid Build Coastguard Workerbool 773*58b9f456SAndroid Build Coastguard Workeroperator!=(const complex<_Tp>& __x, const complex<_Tp>& __y) 774*58b9f456SAndroid Build Coastguard Worker{ 775*58b9f456SAndroid Build Coastguard Worker return !(__x == __y); 776*58b9f456SAndroid Build Coastguard Worker} 777*58b9f456SAndroid Build Coastguard Worker 778*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 779*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 780*58b9f456SAndroid Build Coastguard Workerbool 781*58b9f456SAndroid Build Coastguard Workeroperator!=(const complex<_Tp>& __x, const _Tp& __y) 782*58b9f456SAndroid Build Coastguard Worker{ 783*58b9f456SAndroid Build Coastguard Worker return !(__x == __y); 784*58b9f456SAndroid Build Coastguard Worker} 785*58b9f456SAndroid Build Coastguard Worker 786*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 787*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 788*58b9f456SAndroid Build Coastguard Workerbool 789*58b9f456SAndroid Build Coastguard Workeroperator!=(const _Tp& __x, const complex<_Tp>& __y) 790*58b9f456SAndroid Build Coastguard Worker{ 791*58b9f456SAndroid Build Coastguard Worker return !(__x == __y); 792*58b9f456SAndroid Build Coastguard Worker} 793*58b9f456SAndroid Build Coastguard Worker 794*58b9f456SAndroid Build Coastguard Worker// 26.3.7 values: 795*58b9f456SAndroid Build Coastguard Worker 796*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, bool = is_integral<_Tp>::value, 797*58b9f456SAndroid Build Coastguard Worker bool = is_floating_point<_Tp>::value 798*58b9f456SAndroid Build Coastguard Worker > 799*58b9f456SAndroid Build Coastguard Workerstruct __libcpp_complex_overload_traits {}; 800*58b9f456SAndroid Build Coastguard Worker 801*58b9f456SAndroid Build Coastguard Worker// Integral Types 802*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 803*58b9f456SAndroid Build Coastguard Workerstruct __libcpp_complex_overload_traits<_Tp, true, false> 804*58b9f456SAndroid Build Coastguard Worker{ 805*58b9f456SAndroid Build Coastguard Worker typedef double _ValueType; 806*58b9f456SAndroid Build Coastguard Worker typedef complex<double> _ComplexType; 807*58b9f456SAndroid Build Coastguard Worker}; 808*58b9f456SAndroid Build Coastguard Worker 809*58b9f456SAndroid Build Coastguard Worker// Floating point types 810*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 811*58b9f456SAndroid Build Coastguard Workerstruct __libcpp_complex_overload_traits<_Tp, false, true> 812*58b9f456SAndroid Build Coastguard Worker{ 813*58b9f456SAndroid Build Coastguard Worker typedef _Tp _ValueType; 814*58b9f456SAndroid Build Coastguard Worker typedef complex<_Tp> _ComplexType; 815*58b9f456SAndroid Build Coastguard Worker}; 816*58b9f456SAndroid Build Coastguard Worker 817*58b9f456SAndroid Build Coastguard Worker// real 818*58b9f456SAndroid Build Coastguard Worker 819*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 820*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 821*58b9f456SAndroid Build Coastguard Worker_Tp 822*58b9f456SAndroid Build Coastguard Workerreal(const complex<_Tp>& __c) 823*58b9f456SAndroid Build Coastguard Worker{ 824*58b9f456SAndroid Build Coastguard Worker return __c.real(); 825*58b9f456SAndroid Build Coastguard Worker} 826*58b9f456SAndroid Build Coastguard Worker 827*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 828*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 829*58b9f456SAndroid Build Coastguard Workertypename __libcpp_complex_overload_traits<_Tp>::_ValueType 830*58b9f456SAndroid Build Coastguard Workerreal(_Tp __re) 831*58b9f456SAndroid Build Coastguard Worker{ 832*58b9f456SAndroid Build Coastguard Worker return __re; 833*58b9f456SAndroid Build Coastguard Worker} 834*58b9f456SAndroid Build Coastguard Worker 835*58b9f456SAndroid Build Coastguard Worker// imag 836*58b9f456SAndroid Build Coastguard Worker 837*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 838*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 839*58b9f456SAndroid Build Coastguard Worker_Tp 840*58b9f456SAndroid Build Coastguard Workerimag(const complex<_Tp>& __c) 841*58b9f456SAndroid Build Coastguard Worker{ 842*58b9f456SAndroid Build Coastguard Worker return __c.imag(); 843*58b9f456SAndroid Build Coastguard Worker} 844*58b9f456SAndroid Build Coastguard Worker 845*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 846*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 847*58b9f456SAndroid Build Coastguard Workertypename __libcpp_complex_overload_traits<_Tp>::_ValueType 848*58b9f456SAndroid Build Coastguard Workerimag(_Tp) 849*58b9f456SAndroid Build Coastguard Worker{ 850*58b9f456SAndroid Build Coastguard Worker return 0; 851*58b9f456SAndroid Build Coastguard Worker} 852*58b9f456SAndroid Build Coastguard Worker 853*58b9f456SAndroid Build Coastguard Worker// abs 854*58b9f456SAndroid Build Coastguard Worker 855*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 856*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 857*58b9f456SAndroid Build Coastguard Worker_Tp 858*58b9f456SAndroid Build Coastguard Workerabs(const complex<_Tp>& __c) 859*58b9f456SAndroid Build Coastguard Worker{ 860*58b9f456SAndroid Build Coastguard Worker return hypot(__c.real(), __c.imag()); 861*58b9f456SAndroid Build Coastguard Worker} 862*58b9f456SAndroid Build Coastguard Worker 863*58b9f456SAndroid Build Coastguard Worker// arg 864*58b9f456SAndroid Build Coastguard Worker 865*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 866*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 867*58b9f456SAndroid Build Coastguard Worker_Tp 868*58b9f456SAndroid Build Coastguard Workerarg(const complex<_Tp>& __c) 869*58b9f456SAndroid Build Coastguard Worker{ 870*58b9f456SAndroid Build Coastguard Worker return atan2(__c.imag(), __c.real()); 871*58b9f456SAndroid Build Coastguard Worker} 872*58b9f456SAndroid Build Coastguard Worker 873*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 874*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 875*58b9f456SAndroid Build Coastguard Workertypename enable_if< 876*58b9f456SAndroid Build Coastguard Worker is_same<_Tp, long double>::value, 877*58b9f456SAndroid Build Coastguard Worker long double 878*58b9f456SAndroid Build Coastguard Worker>::type 879*58b9f456SAndroid Build Coastguard Workerarg(_Tp __re) 880*58b9f456SAndroid Build Coastguard Worker{ 881*58b9f456SAndroid Build Coastguard Worker return atan2l(0.L, __re); 882*58b9f456SAndroid Build Coastguard Worker} 883*58b9f456SAndroid Build Coastguard Worker 884*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 885*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 886*58b9f456SAndroid Build Coastguard Workertypename enable_if 887*58b9f456SAndroid Build Coastguard Worker< 888*58b9f456SAndroid Build Coastguard Worker is_integral<_Tp>::value || is_same<_Tp, double>::value, 889*58b9f456SAndroid Build Coastguard Worker double 890*58b9f456SAndroid Build Coastguard Worker>::type 891*58b9f456SAndroid Build Coastguard Workerarg(_Tp __re) 892*58b9f456SAndroid Build Coastguard Worker{ 893*58b9f456SAndroid Build Coastguard Worker return atan2(0., __re); 894*58b9f456SAndroid Build Coastguard Worker} 895*58b9f456SAndroid Build Coastguard Worker 896*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 897*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 898*58b9f456SAndroid Build Coastguard Workertypename enable_if< 899*58b9f456SAndroid Build Coastguard Worker is_same<_Tp, float>::value, 900*58b9f456SAndroid Build Coastguard Worker float 901*58b9f456SAndroid Build Coastguard Worker>::type 902*58b9f456SAndroid Build Coastguard Workerarg(_Tp __re) 903*58b9f456SAndroid Build Coastguard Worker{ 904*58b9f456SAndroid Build Coastguard Worker return atan2f(0.F, __re); 905*58b9f456SAndroid Build Coastguard Worker} 906*58b9f456SAndroid Build Coastguard Worker 907*58b9f456SAndroid Build Coastguard Worker// norm 908*58b9f456SAndroid Build Coastguard Worker 909*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 910*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 911*58b9f456SAndroid Build Coastguard Worker_Tp 912*58b9f456SAndroid Build Coastguard Workernorm(const complex<_Tp>& __c) 913*58b9f456SAndroid Build Coastguard Worker{ 914*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isinf_or_builtin(__c.real())) 915*58b9f456SAndroid Build Coastguard Worker return abs(__c.real()); 916*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isinf_or_builtin(__c.imag())) 917*58b9f456SAndroid Build Coastguard Worker return abs(__c.imag()); 918*58b9f456SAndroid Build Coastguard Worker return __c.real() * __c.real() + __c.imag() * __c.imag(); 919*58b9f456SAndroid Build Coastguard Worker} 920*58b9f456SAndroid Build Coastguard Worker 921*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 922*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 923*58b9f456SAndroid Build Coastguard Workertypename __libcpp_complex_overload_traits<_Tp>::_ValueType 924*58b9f456SAndroid Build Coastguard Workernorm(_Tp __re) 925*58b9f456SAndroid Build Coastguard Worker{ 926*58b9f456SAndroid Build Coastguard Worker typedef typename __libcpp_complex_overload_traits<_Tp>::_ValueType _ValueType; 927*58b9f456SAndroid Build Coastguard Worker return static_cast<_ValueType>(__re) * __re; 928*58b9f456SAndroid Build Coastguard Worker} 929*58b9f456SAndroid Build Coastguard Worker 930*58b9f456SAndroid Build Coastguard Worker// conj 931*58b9f456SAndroid Build Coastguard Worker 932*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 933*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 934*58b9f456SAndroid Build Coastguard Workercomplex<_Tp> 935*58b9f456SAndroid Build Coastguard Workerconj(const complex<_Tp>& __c) 936*58b9f456SAndroid Build Coastguard Worker{ 937*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__c.real(), -__c.imag()); 938*58b9f456SAndroid Build Coastguard Worker} 939*58b9f456SAndroid Build Coastguard Worker 940*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 941*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 942*58b9f456SAndroid Build Coastguard Workertypename __libcpp_complex_overload_traits<_Tp>::_ComplexType 943*58b9f456SAndroid Build Coastguard Workerconj(_Tp __re) 944*58b9f456SAndroid Build Coastguard Worker{ 945*58b9f456SAndroid Build Coastguard Worker typedef typename __libcpp_complex_overload_traits<_Tp>::_ComplexType _ComplexType; 946*58b9f456SAndroid Build Coastguard Worker return _ComplexType(__re); 947*58b9f456SAndroid Build Coastguard Worker} 948*58b9f456SAndroid Build Coastguard Worker 949*58b9f456SAndroid Build Coastguard Worker 950*58b9f456SAndroid Build Coastguard Worker 951*58b9f456SAndroid Build Coastguard Worker// proj 952*58b9f456SAndroid Build Coastguard Worker 953*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 954*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 955*58b9f456SAndroid Build Coastguard Workercomplex<_Tp> 956*58b9f456SAndroid Build Coastguard Workerproj(const complex<_Tp>& __c) 957*58b9f456SAndroid Build Coastguard Worker{ 958*58b9f456SAndroid Build Coastguard Worker std::complex<_Tp> __r = __c; 959*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isinf_or_builtin(__c.real()) || __libcpp_isinf_or_builtin(__c.imag())) 960*58b9f456SAndroid Build Coastguard Worker __r = complex<_Tp>(INFINITY, copysign(_Tp(0), __c.imag())); 961*58b9f456SAndroid Build Coastguard Worker return __r; 962*58b9f456SAndroid Build Coastguard Worker} 963*58b9f456SAndroid Build Coastguard Worker 964*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 965*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 966*58b9f456SAndroid Build Coastguard Workertypename enable_if 967*58b9f456SAndroid Build Coastguard Worker< 968*58b9f456SAndroid Build Coastguard Worker is_floating_point<_Tp>::value, 969*58b9f456SAndroid Build Coastguard Worker typename __libcpp_complex_overload_traits<_Tp>::_ComplexType 970*58b9f456SAndroid Build Coastguard Worker>::type 971*58b9f456SAndroid Build Coastguard Workerproj(_Tp __re) 972*58b9f456SAndroid Build Coastguard Worker{ 973*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isinf_or_builtin(__re)) 974*58b9f456SAndroid Build Coastguard Worker __re = abs(__re); 975*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__re); 976*58b9f456SAndroid Build Coastguard Worker} 977*58b9f456SAndroid Build Coastguard Worker 978*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp> 979*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 980*58b9f456SAndroid Build Coastguard Workertypename enable_if 981*58b9f456SAndroid Build Coastguard Worker< 982*58b9f456SAndroid Build Coastguard Worker is_integral<_Tp>::value, 983*58b9f456SAndroid Build Coastguard Worker typename __libcpp_complex_overload_traits<_Tp>::_ComplexType 984*58b9f456SAndroid Build Coastguard Worker>::type 985*58b9f456SAndroid Build Coastguard Workerproj(_Tp __re) 986*58b9f456SAndroid Build Coastguard Worker{ 987*58b9f456SAndroid Build Coastguard Worker typedef typename __libcpp_complex_overload_traits<_Tp>::_ComplexType _ComplexType; 988*58b9f456SAndroid Build Coastguard Worker return _ComplexType(__re); 989*58b9f456SAndroid Build Coastguard Worker} 990*58b9f456SAndroid Build Coastguard Worker 991*58b9f456SAndroid Build Coastguard Worker// polar 992*58b9f456SAndroid Build Coastguard Worker 993*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 994*58b9f456SAndroid Build Coastguard Workercomplex<_Tp> 995*58b9f456SAndroid Build Coastguard Workerpolar(const _Tp& __rho, const _Tp& __theta = _Tp()) 996*58b9f456SAndroid Build Coastguard Worker{ 997*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isnan_or_builtin(__rho) || signbit(__rho)) 998*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(_Tp(NAN), _Tp(NAN)); 999*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isnan_or_builtin(__theta)) 1000*58b9f456SAndroid Build Coastguard Worker { 1001*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isinf_or_builtin(__rho)) 1002*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__rho, __theta); 1003*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__theta, __theta); 1004*58b9f456SAndroid Build Coastguard Worker } 1005*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isinf_or_builtin(__theta)) 1006*58b9f456SAndroid Build Coastguard Worker { 1007*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isinf_or_builtin(__rho)) 1008*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__rho, _Tp(NAN)); 1009*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(_Tp(NAN), _Tp(NAN)); 1010*58b9f456SAndroid Build Coastguard Worker } 1011*58b9f456SAndroid Build Coastguard Worker _Tp __x = __rho * cos(__theta); 1012*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isnan_or_builtin(__x)) 1013*58b9f456SAndroid Build Coastguard Worker __x = 0; 1014*58b9f456SAndroid Build Coastguard Worker _Tp __y = __rho * sin(__theta); 1015*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isnan_or_builtin(__y)) 1016*58b9f456SAndroid Build Coastguard Worker __y = 0; 1017*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__x, __y); 1018*58b9f456SAndroid Build Coastguard Worker} 1019*58b9f456SAndroid Build Coastguard Worker 1020*58b9f456SAndroid Build Coastguard Worker// log 1021*58b9f456SAndroid Build Coastguard Worker 1022*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 1023*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 1024*58b9f456SAndroid Build Coastguard Workercomplex<_Tp> 1025*58b9f456SAndroid Build Coastguard Workerlog(const complex<_Tp>& __x) 1026*58b9f456SAndroid Build Coastguard Worker{ 1027*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(log(abs(__x)), arg(__x)); 1028*58b9f456SAndroid Build Coastguard Worker} 1029*58b9f456SAndroid Build Coastguard Worker 1030*58b9f456SAndroid Build Coastguard Worker// log10 1031*58b9f456SAndroid Build Coastguard Worker 1032*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 1033*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 1034*58b9f456SAndroid Build Coastguard Workercomplex<_Tp> 1035*58b9f456SAndroid Build Coastguard Workerlog10(const complex<_Tp>& __x) 1036*58b9f456SAndroid Build Coastguard Worker{ 1037*58b9f456SAndroid Build Coastguard Worker return log(__x) / log(_Tp(10)); 1038*58b9f456SAndroid Build Coastguard Worker} 1039*58b9f456SAndroid Build Coastguard Worker 1040*58b9f456SAndroid Build Coastguard Worker// sqrt 1041*58b9f456SAndroid Build Coastguard Worker 1042*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 1043*58b9f456SAndroid Build Coastguard Workercomplex<_Tp> 1044*58b9f456SAndroid Build Coastguard Workersqrt(const complex<_Tp>& __x) 1045*58b9f456SAndroid Build Coastguard Worker{ 1046*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isinf_or_builtin(__x.imag())) 1047*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(_Tp(INFINITY), __x.imag()); 1048*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isinf_or_builtin(__x.real())) 1049*58b9f456SAndroid Build Coastguard Worker { 1050*58b9f456SAndroid Build Coastguard Worker if (__x.real() > _Tp(0)) 1051*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__x.real(), __libcpp_isnan_or_builtin(__x.imag()) ? __x.imag() : copysign(_Tp(0), __x.imag())); 1052*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__libcpp_isnan_or_builtin(__x.imag()) ? __x.imag() : _Tp(0), copysign(__x.real(), __x.imag())); 1053*58b9f456SAndroid Build Coastguard Worker } 1054*58b9f456SAndroid Build Coastguard Worker return polar(sqrt(abs(__x)), arg(__x) / _Tp(2)); 1055*58b9f456SAndroid Build Coastguard Worker} 1056*58b9f456SAndroid Build Coastguard Worker 1057*58b9f456SAndroid Build Coastguard Worker// exp 1058*58b9f456SAndroid Build Coastguard Worker 1059*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 1060*58b9f456SAndroid Build Coastguard Workercomplex<_Tp> 1061*58b9f456SAndroid Build Coastguard Workerexp(const complex<_Tp>& __x) 1062*58b9f456SAndroid Build Coastguard Worker{ 1063*58b9f456SAndroid Build Coastguard Worker _Tp __i = __x.imag(); 1064*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isinf_or_builtin(__x.real())) 1065*58b9f456SAndroid Build Coastguard Worker { 1066*58b9f456SAndroid Build Coastguard Worker if (__x.real() < _Tp(0)) 1067*58b9f456SAndroid Build Coastguard Worker { 1068*58b9f456SAndroid Build Coastguard Worker if (!__libcpp_isfinite_or_builtin(__i)) 1069*58b9f456SAndroid Build Coastguard Worker __i = _Tp(1); 1070*58b9f456SAndroid Build Coastguard Worker } 1071*58b9f456SAndroid Build Coastguard Worker else if (__i == 0 || !__libcpp_isfinite_or_builtin(__i)) 1072*58b9f456SAndroid Build Coastguard Worker { 1073*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isinf_or_builtin(__i)) 1074*58b9f456SAndroid Build Coastguard Worker __i = _Tp(NAN); 1075*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__x.real(), __i); 1076*58b9f456SAndroid Build Coastguard Worker } 1077*58b9f456SAndroid Build Coastguard Worker } 1078*58b9f456SAndroid Build Coastguard Worker else if (__libcpp_isnan_or_builtin(__x.real()) && __x.imag() == 0) 1079*58b9f456SAndroid Build Coastguard Worker return __x; 1080*58b9f456SAndroid Build Coastguard Worker _Tp __e = exp(__x.real()); 1081*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__e * cos(__i), __e * sin(__i)); 1082*58b9f456SAndroid Build Coastguard Worker} 1083*58b9f456SAndroid Build Coastguard Worker 1084*58b9f456SAndroid Build Coastguard Worker// pow 1085*58b9f456SAndroid Build Coastguard Worker 1086*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 1087*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 1088*58b9f456SAndroid Build Coastguard Workercomplex<_Tp> 1089*58b9f456SAndroid Build Coastguard Workerpow(const complex<_Tp>& __x, const complex<_Tp>& __y) 1090*58b9f456SAndroid Build Coastguard Worker{ 1091*58b9f456SAndroid Build Coastguard Worker return exp(__y * log(__x)); 1092*58b9f456SAndroid Build Coastguard Worker} 1093*58b9f456SAndroid Build Coastguard Worker 1094*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp, class _Up> 1095*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 1096*58b9f456SAndroid Build Coastguard Workercomplex<typename __promote<_Tp, _Up>::type> 1097*58b9f456SAndroid Build Coastguard Workerpow(const complex<_Tp>& __x, const complex<_Up>& __y) 1098*58b9f456SAndroid Build Coastguard Worker{ 1099*58b9f456SAndroid Build Coastguard Worker typedef complex<typename __promote<_Tp, _Up>::type> result_type; 1100*58b9f456SAndroid Build Coastguard Worker return _VSTD::pow(result_type(__x), result_type(__y)); 1101*58b9f456SAndroid Build Coastguard Worker} 1102*58b9f456SAndroid Build Coastguard Worker 1103*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp, class _Up> 1104*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 1105*58b9f456SAndroid Build Coastguard Workertypename enable_if 1106*58b9f456SAndroid Build Coastguard Worker< 1107*58b9f456SAndroid Build Coastguard Worker is_arithmetic<_Up>::value, 1108*58b9f456SAndroid Build Coastguard Worker complex<typename __promote<_Tp, _Up>::type> 1109*58b9f456SAndroid Build Coastguard Worker>::type 1110*58b9f456SAndroid Build Coastguard Workerpow(const complex<_Tp>& __x, const _Up& __y) 1111*58b9f456SAndroid Build Coastguard Worker{ 1112*58b9f456SAndroid Build Coastguard Worker typedef complex<typename __promote<_Tp, _Up>::type> result_type; 1113*58b9f456SAndroid Build Coastguard Worker return _VSTD::pow(result_type(__x), result_type(__y)); 1114*58b9f456SAndroid Build Coastguard Worker} 1115*58b9f456SAndroid Build Coastguard Worker 1116*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp, class _Up> 1117*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 1118*58b9f456SAndroid Build Coastguard Workertypename enable_if 1119*58b9f456SAndroid Build Coastguard Worker< 1120*58b9f456SAndroid Build Coastguard Worker is_arithmetic<_Tp>::value, 1121*58b9f456SAndroid Build Coastguard Worker complex<typename __promote<_Tp, _Up>::type> 1122*58b9f456SAndroid Build Coastguard Worker>::type 1123*58b9f456SAndroid Build Coastguard Workerpow(const _Tp& __x, const complex<_Up>& __y) 1124*58b9f456SAndroid Build Coastguard Worker{ 1125*58b9f456SAndroid Build Coastguard Worker typedef complex<typename __promote<_Tp, _Up>::type> result_type; 1126*58b9f456SAndroid Build Coastguard Worker return _VSTD::pow(result_type(__x), result_type(__y)); 1127*58b9f456SAndroid Build Coastguard Worker} 1128*58b9f456SAndroid Build Coastguard Worker 1129*58b9f456SAndroid Build Coastguard Worker// __sqr, computes pow(x, 2) 1130*58b9f456SAndroid Build Coastguard Worker 1131*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 1132*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 1133*58b9f456SAndroid Build Coastguard Workercomplex<_Tp> 1134*58b9f456SAndroid Build Coastguard Worker__sqr(const complex<_Tp>& __x) 1135*58b9f456SAndroid Build Coastguard Worker{ 1136*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>((__x.real() - __x.imag()) * (__x.real() + __x.imag()), 1137*58b9f456SAndroid Build Coastguard Worker _Tp(2) * __x.real() * __x.imag()); 1138*58b9f456SAndroid Build Coastguard Worker} 1139*58b9f456SAndroid Build Coastguard Worker 1140*58b9f456SAndroid Build Coastguard Worker// asinh 1141*58b9f456SAndroid Build Coastguard Worker 1142*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 1143*58b9f456SAndroid Build Coastguard Workercomplex<_Tp> 1144*58b9f456SAndroid Build Coastguard Workerasinh(const complex<_Tp>& __x) 1145*58b9f456SAndroid Build Coastguard Worker{ 1146*58b9f456SAndroid Build Coastguard Worker const _Tp __pi(atan2(+0., -0.)); 1147*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isinf_or_builtin(__x.real())) 1148*58b9f456SAndroid Build Coastguard Worker { 1149*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isnan_or_builtin(__x.imag())) 1150*58b9f456SAndroid Build Coastguard Worker return __x; 1151*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isinf_or_builtin(__x.imag())) 1152*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__x.real(), copysign(__pi * _Tp(0.25), __x.imag())); 1153*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__x.real(), copysign(_Tp(0), __x.imag())); 1154*58b9f456SAndroid Build Coastguard Worker } 1155*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isnan_or_builtin(__x.real())) 1156*58b9f456SAndroid Build Coastguard Worker { 1157*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isinf_or_builtin(__x.imag())) 1158*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__x.imag(), __x.real()); 1159*58b9f456SAndroid Build Coastguard Worker if (__x.imag() == 0) 1160*58b9f456SAndroid Build Coastguard Worker return __x; 1161*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__x.real(), __x.real()); 1162*58b9f456SAndroid Build Coastguard Worker } 1163*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isinf_or_builtin(__x.imag())) 1164*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(copysign(__x.imag(), __x.real()), copysign(__pi/_Tp(2), __x.imag())); 1165*58b9f456SAndroid Build Coastguard Worker complex<_Tp> __z = log(__x + sqrt(__sqr(__x) + _Tp(1))); 1166*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(copysign(__z.real(), __x.real()), copysign(__z.imag(), __x.imag())); 1167*58b9f456SAndroid Build Coastguard Worker} 1168*58b9f456SAndroid Build Coastguard Worker 1169*58b9f456SAndroid Build Coastguard Worker// acosh 1170*58b9f456SAndroid Build Coastguard Worker 1171*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 1172*58b9f456SAndroid Build Coastguard Workercomplex<_Tp> 1173*58b9f456SAndroid Build Coastguard Workeracosh(const complex<_Tp>& __x) 1174*58b9f456SAndroid Build Coastguard Worker{ 1175*58b9f456SAndroid Build Coastguard Worker const _Tp __pi(atan2(+0., -0.)); 1176*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isinf_or_builtin(__x.real())) 1177*58b9f456SAndroid Build Coastguard Worker { 1178*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isnan_or_builtin(__x.imag())) 1179*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(abs(__x.real()), __x.imag()); 1180*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isinf_or_builtin(__x.imag())) 1181*58b9f456SAndroid Build Coastguard Worker { 1182*58b9f456SAndroid Build Coastguard Worker if (__x.real() > 0) 1183*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__x.real(), copysign(__pi * _Tp(0.25), __x.imag())); 1184*58b9f456SAndroid Build Coastguard Worker else 1185*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(-__x.real(), copysign(__pi * _Tp(0.75), __x.imag())); 1186*58b9f456SAndroid Build Coastguard Worker } 1187*58b9f456SAndroid Build Coastguard Worker if (__x.real() < 0) 1188*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(-__x.real(), copysign(__pi, __x.imag())); 1189*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__x.real(), copysign(_Tp(0), __x.imag())); 1190*58b9f456SAndroid Build Coastguard Worker } 1191*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isnan_or_builtin(__x.real())) 1192*58b9f456SAndroid Build Coastguard Worker { 1193*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isinf_or_builtin(__x.imag())) 1194*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(abs(__x.imag()), __x.real()); 1195*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__x.real(), __x.real()); 1196*58b9f456SAndroid Build Coastguard Worker } 1197*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isinf_or_builtin(__x.imag())) 1198*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(abs(__x.imag()), copysign(__pi/_Tp(2), __x.imag())); 1199*58b9f456SAndroid Build Coastguard Worker complex<_Tp> __z = log(__x + sqrt(__sqr(__x) - _Tp(1))); 1200*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(copysign(__z.real(), _Tp(0)), copysign(__z.imag(), __x.imag())); 1201*58b9f456SAndroid Build Coastguard Worker} 1202*58b9f456SAndroid Build Coastguard Worker 1203*58b9f456SAndroid Build Coastguard Worker// atanh 1204*58b9f456SAndroid Build Coastguard Worker 1205*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 1206*58b9f456SAndroid Build Coastguard Workercomplex<_Tp> 1207*58b9f456SAndroid Build Coastguard Workeratanh(const complex<_Tp>& __x) 1208*58b9f456SAndroid Build Coastguard Worker{ 1209*58b9f456SAndroid Build Coastguard Worker const _Tp __pi(atan2(+0., -0.)); 1210*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isinf_or_builtin(__x.imag())) 1211*58b9f456SAndroid Build Coastguard Worker { 1212*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(copysign(_Tp(0), __x.real()), copysign(__pi/_Tp(2), __x.imag())); 1213*58b9f456SAndroid Build Coastguard Worker } 1214*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isnan_or_builtin(__x.imag())) 1215*58b9f456SAndroid Build Coastguard Worker { 1216*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isinf_or_builtin(__x.real()) || __x.real() == 0) 1217*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(copysign(_Tp(0), __x.real()), __x.imag()); 1218*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__x.imag(), __x.imag()); 1219*58b9f456SAndroid Build Coastguard Worker } 1220*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isnan_or_builtin(__x.real())) 1221*58b9f456SAndroid Build Coastguard Worker { 1222*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__x.real(), __x.real()); 1223*58b9f456SAndroid Build Coastguard Worker } 1224*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isinf_or_builtin(__x.real())) 1225*58b9f456SAndroid Build Coastguard Worker { 1226*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(copysign(_Tp(0), __x.real()), copysign(__pi/_Tp(2), __x.imag())); 1227*58b9f456SAndroid Build Coastguard Worker } 1228*58b9f456SAndroid Build Coastguard Worker if (abs(__x.real()) == _Tp(1) && __x.imag() == _Tp(0)) 1229*58b9f456SAndroid Build Coastguard Worker { 1230*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(copysign(_Tp(INFINITY), __x.real()), copysign(_Tp(0), __x.imag())); 1231*58b9f456SAndroid Build Coastguard Worker } 1232*58b9f456SAndroid Build Coastguard Worker complex<_Tp> __z = log((_Tp(1) + __x) / (_Tp(1) - __x)) / _Tp(2); 1233*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(copysign(__z.real(), __x.real()), copysign(__z.imag(), __x.imag())); 1234*58b9f456SAndroid Build Coastguard Worker} 1235*58b9f456SAndroid Build Coastguard Worker 1236*58b9f456SAndroid Build Coastguard Worker// sinh 1237*58b9f456SAndroid Build Coastguard Worker 1238*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 1239*58b9f456SAndroid Build Coastguard Workercomplex<_Tp> 1240*58b9f456SAndroid Build Coastguard Workersinh(const complex<_Tp>& __x) 1241*58b9f456SAndroid Build Coastguard Worker{ 1242*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isinf_or_builtin(__x.real()) && !__libcpp_isfinite_or_builtin(__x.imag())) 1243*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__x.real(), _Tp(NAN)); 1244*58b9f456SAndroid Build Coastguard Worker if (__x.real() == 0 && !__libcpp_isfinite_or_builtin(__x.imag())) 1245*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__x.real(), _Tp(NAN)); 1246*58b9f456SAndroid Build Coastguard Worker if (__x.imag() == 0 && !__libcpp_isfinite_or_builtin(__x.real())) 1247*58b9f456SAndroid Build Coastguard Worker return __x; 1248*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(sinh(__x.real()) * cos(__x.imag()), cosh(__x.real()) * sin(__x.imag())); 1249*58b9f456SAndroid Build Coastguard Worker} 1250*58b9f456SAndroid Build Coastguard Worker 1251*58b9f456SAndroid Build Coastguard Worker// cosh 1252*58b9f456SAndroid Build Coastguard Worker 1253*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 1254*58b9f456SAndroid Build Coastguard Workercomplex<_Tp> 1255*58b9f456SAndroid Build Coastguard Workercosh(const complex<_Tp>& __x) 1256*58b9f456SAndroid Build Coastguard Worker{ 1257*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isinf_or_builtin(__x.real()) && !__libcpp_isfinite_or_builtin(__x.imag())) 1258*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(abs(__x.real()), _Tp(NAN)); 1259*58b9f456SAndroid Build Coastguard Worker if (__x.real() == 0 && !__libcpp_isfinite_or_builtin(__x.imag())) 1260*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(_Tp(NAN), __x.real()); 1261*58b9f456SAndroid Build Coastguard Worker if (__x.real() == 0 && __x.imag() == 0) 1262*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(_Tp(1), __x.imag()); 1263*58b9f456SAndroid Build Coastguard Worker if (__x.imag() == 0 && !__libcpp_isfinite_or_builtin(__x.real())) 1264*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(abs(__x.real()), __x.imag()); 1265*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(cosh(__x.real()) * cos(__x.imag()), sinh(__x.real()) * sin(__x.imag())); 1266*58b9f456SAndroid Build Coastguard Worker} 1267*58b9f456SAndroid Build Coastguard Worker 1268*58b9f456SAndroid Build Coastguard Worker// tanh 1269*58b9f456SAndroid Build Coastguard Worker 1270*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 1271*58b9f456SAndroid Build Coastguard Workercomplex<_Tp> 1272*58b9f456SAndroid Build Coastguard Workertanh(const complex<_Tp>& __x) 1273*58b9f456SAndroid Build Coastguard Worker{ 1274*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isinf_or_builtin(__x.real())) 1275*58b9f456SAndroid Build Coastguard Worker { 1276*58b9f456SAndroid Build Coastguard Worker if (!__libcpp_isfinite_or_builtin(__x.imag())) 1277*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(_Tp(1), _Tp(0)); 1278*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(_Tp(1), copysign(_Tp(0), sin(_Tp(2) * __x.imag()))); 1279*58b9f456SAndroid Build Coastguard Worker } 1280*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isnan_or_builtin(__x.real()) && __x.imag() == 0) 1281*58b9f456SAndroid Build Coastguard Worker return __x; 1282*58b9f456SAndroid Build Coastguard Worker _Tp __2r(_Tp(2) * __x.real()); 1283*58b9f456SAndroid Build Coastguard Worker _Tp __2i(_Tp(2) * __x.imag()); 1284*58b9f456SAndroid Build Coastguard Worker _Tp __d(cosh(__2r) + cos(__2i)); 1285*58b9f456SAndroid Build Coastguard Worker _Tp __2rsh(sinh(__2r)); 1286*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isinf_or_builtin(__2rsh) && __libcpp_isinf_or_builtin(__d)) 1287*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__2rsh > _Tp(0) ? _Tp(1) : _Tp(-1), 1288*58b9f456SAndroid Build Coastguard Worker __2i > _Tp(0) ? _Tp(0) : _Tp(-0.)); 1289*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__2rsh/__d, sin(__2i)/__d); 1290*58b9f456SAndroid Build Coastguard Worker} 1291*58b9f456SAndroid Build Coastguard Worker 1292*58b9f456SAndroid Build Coastguard Worker// asin 1293*58b9f456SAndroid Build Coastguard Worker 1294*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 1295*58b9f456SAndroid Build Coastguard Workercomplex<_Tp> 1296*58b9f456SAndroid Build Coastguard Workerasin(const complex<_Tp>& __x) 1297*58b9f456SAndroid Build Coastguard Worker{ 1298*58b9f456SAndroid Build Coastguard Worker complex<_Tp> __z = asinh(complex<_Tp>(-__x.imag(), __x.real())); 1299*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__z.imag(), -__z.real()); 1300*58b9f456SAndroid Build Coastguard Worker} 1301*58b9f456SAndroid Build Coastguard Worker 1302*58b9f456SAndroid Build Coastguard Worker// acos 1303*58b9f456SAndroid Build Coastguard Worker 1304*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 1305*58b9f456SAndroid Build Coastguard Workercomplex<_Tp> 1306*58b9f456SAndroid Build Coastguard Workeracos(const complex<_Tp>& __x) 1307*58b9f456SAndroid Build Coastguard Worker{ 1308*58b9f456SAndroid Build Coastguard Worker const _Tp __pi(atan2(+0., -0.)); 1309*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isinf_or_builtin(__x.real())) 1310*58b9f456SAndroid Build Coastguard Worker { 1311*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isnan_or_builtin(__x.imag())) 1312*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__x.imag(), __x.real()); 1313*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isinf_or_builtin(__x.imag())) 1314*58b9f456SAndroid Build Coastguard Worker { 1315*58b9f456SAndroid Build Coastguard Worker if (__x.real() < _Tp(0)) 1316*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(_Tp(0.75) * __pi, -__x.imag()); 1317*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(_Tp(0.25) * __pi, -__x.imag()); 1318*58b9f456SAndroid Build Coastguard Worker } 1319*58b9f456SAndroid Build Coastguard Worker if (__x.real() < _Tp(0)) 1320*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__pi, signbit(__x.imag()) ? -__x.real() : __x.real()); 1321*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(_Tp(0), signbit(__x.imag()) ? __x.real() : -__x.real()); 1322*58b9f456SAndroid Build Coastguard Worker } 1323*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isnan_or_builtin(__x.real())) 1324*58b9f456SAndroid Build Coastguard Worker { 1325*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isinf_or_builtin(__x.imag())) 1326*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__x.real(), -__x.imag()); 1327*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__x.real(), __x.real()); 1328*58b9f456SAndroid Build Coastguard Worker } 1329*58b9f456SAndroid Build Coastguard Worker if (__libcpp_isinf_or_builtin(__x.imag())) 1330*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__pi/_Tp(2), -__x.imag()); 1331*58b9f456SAndroid Build Coastguard Worker if (__x.real() == 0 && (__x.imag() == 0 || isnan(__x.imag()))) 1332*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__pi/_Tp(2), -__x.imag()); 1333*58b9f456SAndroid Build Coastguard Worker complex<_Tp> __z = log(__x + sqrt(__sqr(__x) - _Tp(1))); 1334*58b9f456SAndroid Build Coastguard Worker if (signbit(__x.imag())) 1335*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(abs(__z.imag()), abs(__z.real())); 1336*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(abs(__z.imag()), -abs(__z.real())); 1337*58b9f456SAndroid Build Coastguard Worker} 1338*58b9f456SAndroid Build Coastguard Worker 1339*58b9f456SAndroid Build Coastguard Worker// atan 1340*58b9f456SAndroid Build Coastguard Worker 1341*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 1342*58b9f456SAndroid Build Coastguard Workercomplex<_Tp> 1343*58b9f456SAndroid Build Coastguard Workeratan(const complex<_Tp>& __x) 1344*58b9f456SAndroid Build Coastguard Worker{ 1345*58b9f456SAndroid Build Coastguard Worker complex<_Tp> __z = atanh(complex<_Tp>(-__x.imag(), __x.real())); 1346*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__z.imag(), -__z.real()); 1347*58b9f456SAndroid Build Coastguard Worker} 1348*58b9f456SAndroid Build Coastguard Worker 1349*58b9f456SAndroid Build Coastguard Worker// sin 1350*58b9f456SAndroid Build Coastguard Worker 1351*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 1352*58b9f456SAndroid Build Coastguard Workercomplex<_Tp> 1353*58b9f456SAndroid Build Coastguard Workersin(const complex<_Tp>& __x) 1354*58b9f456SAndroid Build Coastguard Worker{ 1355*58b9f456SAndroid Build Coastguard Worker complex<_Tp> __z = sinh(complex<_Tp>(-__x.imag(), __x.real())); 1356*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__z.imag(), -__z.real()); 1357*58b9f456SAndroid Build Coastguard Worker} 1358*58b9f456SAndroid Build Coastguard Worker 1359*58b9f456SAndroid Build Coastguard Worker// cos 1360*58b9f456SAndroid Build Coastguard Worker 1361*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 1362*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 1363*58b9f456SAndroid Build Coastguard Workercomplex<_Tp> 1364*58b9f456SAndroid Build Coastguard Workercos(const complex<_Tp>& __x) 1365*58b9f456SAndroid Build Coastguard Worker{ 1366*58b9f456SAndroid Build Coastguard Worker return cosh(complex<_Tp>(-__x.imag(), __x.real())); 1367*58b9f456SAndroid Build Coastguard Worker} 1368*58b9f456SAndroid Build Coastguard Worker 1369*58b9f456SAndroid Build Coastguard Worker// tan 1370*58b9f456SAndroid Build Coastguard Worker 1371*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp> 1372*58b9f456SAndroid Build Coastguard Workercomplex<_Tp> 1373*58b9f456SAndroid Build Coastguard Workertan(const complex<_Tp>& __x) 1374*58b9f456SAndroid Build Coastguard Worker{ 1375*58b9f456SAndroid Build Coastguard Worker complex<_Tp> __z = tanh(complex<_Tp>(-__x.imag(), __x.real())); 1376*58b9f456SAndroid Build Coastguard Worker return complex<_Tp>(__z.imag(), -__z.real()); 1377*58b9f456SAndroid Build Coastguard Worker} 1378*58b9f456SAndroid Build Coastguard Worker 1379*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp, class _CharT, class _Traits> 1380*58b9f456SAndroid Build Coastguard Workerbasic_istream<_CharT, _Traits>& 1381*58b9f456SAndroid Build Coastguard Workeroperator>>(basic_istream<_CharT, _Traits>& __is, complex<_Tp>& __x) 1382*58b9f456SAndroid Build Coastguard Worker{ 1383*58b9f456SAndroid Build Coastguard Worker if (__is.good()) 1384*58b9f456SAndroid Build Coastguard Worker { 1385*58b9f456SAndroid Build Coastguard Worker ws(__is); 1386*58b9f456SAndroid Build Coastguard Worker if (__is.peek() == _CharT('(')) 1387*58b9f456SAndroid Build Coastguard Worker { 1388*58b9f456SAndroid Build Coastguard Worker __is.get(); 1389*58b9f456SAndroid Build Coastguard Worker _Tp __r; 1390*58b9f456SAndroid Build Coastguard Worker __is >> __r; 1391*58b9f456SAndroid Build Coastguard Worker if (!__is.fail()) 1392*58b9f456SAndroid Build Coastguard Worker { 1393*58b9f456SAndroid Build Coastguard Worker ws(__is); 1394*58b9f456SAndroid Build Coastguard Worker _CharT __c = __is.peek(); 1395*58b9f456SAndroid Build Coastguard Worker if (__c == _CharT(',')) 1396*58b9f456SAndroid Build Coastguard Worker { 1397*58b9f456SAndroid Build Coastguard Worker __is.get(); 1398*58b9f456SAndroid Build Coastguard Worker _Tp __i; 1399*58b9f456SAndroid Build Coastguard Worker __is >> __i; 1400*58b9f456SAndroid Build Coastguard Worker if (!__is.fail()) 1401*58b9f456SAndroid Build Coastguard Worker { 1402*58b9f456SAndroid Build Coastguard Worker ws(__is); 1403*58b9f456SAndroid Build Coastguard Worker __c = __is.peek(); 1404*58b9f456SAndroid Build Coastguard Worker if (__c == _CharT(')')) 1405*58b9f456SAndroid Build Coastguard Worker { 1406*58b9f456SAndroid Build Coastguard Worker __is.get(); 1407*58b9f456SAndroid Build Coastguard Worker __x = complex<_Tp>(__r, __i); 1408*58b9f456SAndroid Build Coastguard Worker } 1409*58b9f456SAndroid Build Coastguard Worker else 1410*58b9f456SAndroid Build Coastguard Worker __is.setstate(ios_base::failbit); 1411*58b9f456SAndroid Build Coastguard Worker } 1412*58b9f456SAndroid Build Coastguard Worker else 1413*58b9f456SAndroid Build Coastguard Worker __is.setstate(ios_base::failbit); 1414*58b9f456SAndroid Build Coastguard Worker } 1415*58b9f456SAndroid Build Coastguard Worker else if (__c == _CharT(')')) 1416*58b9f456SAndroid Build Coastguard Worker { 1417*58b9f456SAndroid Build Coastguard Worker __is.get(); 1418*58b9f456SAndroid Build Coastguard Worker __x = complex<_Tp>(__r, _Tp(0)); 1419*58b9f456SAndroid Build Coastguard Worker } 1420*58b9f456SAndroid Build Coastguard Worker else 1421*58b9f456SAndroid Build Coastguard Worker __is.setstate(ios_base::failbit); 1422*58b9f456SAndroid Build Coastguard Worker } 1423*58b9f456SAndroid Build Coastguard Worker else 1424*58b9f456SAndroid Build Coastguard Worker __is.setstate(ios_base::failbit); 1425*58b9f456SAndroid Build Coastguard Worker } 1426*58b9f456SAndroid Build Coastguard Worker else 1427*58b9f456SAndroid Build Coastguard Worker { 1428*58b9f456SAndroid Build Coastguard Worker _Tp __r; 1429*58b9f456SAndroid Build Coastguard Worker __is >> __r; 1430*58b9f456SAndroid Build Coastguard Worker if (!__is.fail()) 1431*58b9f456SAndroid Build Coastguard Worker __x = complex<_Tp>(__r, _Tp(0)); 1432*58b9f456SAndroid Build Coastguard Worker else 1433*58b9f456SAndroid Build Coastguard Worker __is.setstate(ios_base::failbit); 1434*58b9f456SAndroid Build Coastguard Worker } 1435*58b9f456SAndroid Build Coastguard Worker } 1436*58b9f456SAndroid Build Coastguard Worker else 1437*58b9f456SAndroid Build Coastguard Worker __is.setstate(ios_base::failbit); 1438*58b9f456SAndroid Build Coastguard Worker return __is; 1439*58b9f456SAndroid Build Coastguard Worker} 1440*58b9f456SAndroid Build Coastguard Worker 1441*58b9f456SAndroid Build Coastguard Workertemplate<class _Tp, class _CharT, class _Traits> 1442*58b9f456SAndroid Build Coastguard Workerbasic_ostream<_CharT, _Traits>& 1443*58b9f456SAndroid Build Coastguard Workeroperator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __x) 1444*58b9f456SAndroid Build Coastguard Worker{ 1445*58b9f456SAndroid Build Coastguard Worker basic_ostringstream<_CharT, _Traits> __s; 1446*58b9f456SAndroid Build Coastguard Worker __s.flags(__os.flags()); 1447*58b9f456SAndroid Build Coastguard Worker __s.imbue(__os.getloc()); 1448*58b9f456SAndroid Build Coastguard Worker __s.precision(__os.precision()); 1449*58b9f456SAndroid Build Coastguard Worker __s << '(' << __x.real() << ',' << __x.imag() << ')'; 1450*58b9f456SAndroid Build Coastguard Worker return __os << __s.str(); 1451*58b9f456SAndroid Build Coastguard Worker} 1452*58b9f456SAndroid Build Coastguard Worker 1453*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11 1454*58b9f456SAndroid Build Coastguard Worker// Literal suffix for complex number literals [complex.literals] 1455*58b9f456SAndroid Build Coastguard Workerinline namespace literals 1456*58b9f456SAndroid Build Coastguard Worker{ 1457*58b9f456SAndroid Build Coastguard Worker inline namespace complex_literals 1458*58b9f456SAndroid Build Coastguard Worker { 1459*58b9f456SAndroid Build Coastguard Worker constexpr complex<long double> operator""il(long double __im) 1460*58b9f456SAndroid Build Coastguard Worker { 1461*58b9f456SAndroid Build Coastguard Worker return { 0.0l, __im }; 1462*58b9f456SAndroid Build Coastguard Worker } 1463*58b9f456SAndroid Build Coastguard Worker 1464*58b9f456SAndroid Build Coastguard Worker constexpr complex<long double> operator""il(unsigned long long __im) 1465*58b9f456SAndroid Build Coastguard Worker { 1466*58b9f456SAndroid Build Coastguard Worker return { 0.0l, static_cast<long double>(__im) }; 1467*58b9f456SAndroid Build Coastguard Worker } 1468*58b9f456SAndroid Build Coastguard Worker 1469*58b9f456SAndroid Build Coastguard Worker 1470*58b9f456SAndroid Build Coastguard Worker constexpr complex<double> operator""i(long double __im) 1471*58b9f456SAndroid Build Coastguard Worker { 1472*58b9f456SAndroid Build Coastguard Worker return { 0.0, static_cast<double>(__im) }; 1473*58b9f456SAndroid Build Coastguard Worker } 1474*58b9f456SAndroid Build Coastguard Worker 1475*58b9f456SAndroid Build Coastguard Worker constexpr complex<double> operator""i(unsigned long long __im) 1476*58b9f456SAndroid Build Coastguard Worker { 1477*58b9f456SAndroid Build Coastguard Worker return { 0.0, static_cast<double>(__im) }; 1478*58b9f456SAndroid Build Coastguard Worker } 1479*58b9f456SAndroid Build Coastguard Worker 1480*58b9f456SAndroid Build Coastguard Worker 1481*58b9f456SAndroid Build Coastguard Worker constexpr complex<float> operator""if(long double __im) 1482*58b9f456SAndroid Build Coastguard Worker { 1483*58b9f456SAndroid Build Coastguard Worker return { 0.0f, static_cast<float>(__im) }; 1484*58b9f456SAndroid Build Coastguard Worker } 1485*58b9f456SAndroid Build Coastguard Worker 1486*58b9f456SAndroid Build Coastguard Worker constexpr complex<float> operator""if(unsigned long long __im) 1487*58b9f456SAndroid Build Coastguard Worker { 1488*58b9f456SAndroid Build Coastguard Worker return { 0.0f, static_cast<float>(__im) }; 1489*58b9f456SAndroid Build Coastguard Worker } 1490*58b9f456SAndroid Build Coastguard Worker } 1491*58b9f456SAndroid Build Coastguard Worker} 1492*58b9f456SAndroid Build Coastguard Worker#endif 1493*58b9f456SAndroid Build Coastguard Worker 1494*58b9f456SAndroid Build Coastguard Worker_LIBCPP_END_NAMESPACE_STD 1495*58b9f456SAndroid Build Coastguard Worker 1496*58b9f456SAndroid Build Coastguard Worker#endif // _LIBCPP_COMPLEX 1497