xref: /aosp_15_r20/external/libcxx/include/complex (revision 58b9f456b02922dfdb1fad8a988d5fd8765ecb80)
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