17a984708SDavid Chisnall// -*- C++ -*- 27a984708SDavid Chisnall//===--------------------------- complex ----------------------------------===// 37a984708SDavid Chisnall// 47a984708SDavid Chisnall// The LLVM Compiler Infrastructure 57a984708SDavid Chisnall// 67a984708SDavid Chisnall// This file is dual licensed under the MIT and the University of Illinois Open 77a984708SDavid Chisnall// Source Licenses. See LICENSE.TXT for details. 87a984708SDavid Chisnall// 97a984708SDavid Chisnall//===----------------------------------------------------------------------===// 107a984708SDavid Chisnall 117a984708SDavid Chisnall#ifndef _LIBCPP_COMPLEX 127a984708SDavid Chisnall#define _LIBCPP_COMPLEX 137a984708SDavid Chisnall 147a984708SDavid Chisnall/* 157a984708SDavid Chisnall complex synopsis 167a984708SDavid Chisnall 177a984708SDavid Chisnallnamespace std 187a984708SDavid Chisnall{ 197a984708SDavid Chisnall 207a984708SDavid Chisnalltemplate<class T> 217a984708SDavid Chisnallclass complex 227a984708SDavid Chisnall{ 237a984708SDavid Chisnallpublic: 247a984708SDavid Chisnall typedef T value_type; 257a984708SDavid Chisnall 264f7ab58eSDimitry Andric complex(const T& re = T(), const T& im = T()); // constexpr in C++14 274f7ab58eSDimitry Andric complex(const complex&); // constexpr in C++14 284f7ab58eSDimitry Andric template<class X> complex(const complex<X>&); // constexpr in C++14 297a984708SDavid Chisnall 304f7ab58eSDimitry Andric T real() const; // constexpr in C++14 314f7ab58eSDimitry Andric T imag() const; // constexpr in C++14 327a984708SDavid Chisnall 337a984708SDavid Chisnall void real(T); 347a984708SDavid Chisnall void imag(T); 357a984708SDavid Chisnall 367a984708SDavid Chisnall complex<T>& operator= (const T&); 377a984708SDavid Chisnall complex<T>& operator+=(const T&); 387a984708SDavid Chisnall complex<T>& operator-=(const T&); 397a984708SDavid Chisnall complex<T>& operator*=(const T&); 407a984708SDavid Chisnall complex<T>& operator/=(const T&); 417a984708SDavid Chisnall 427a984708SDavid Chisnall complex& operator=(const complex&); 437a984708SDavid Chisnall template<class X> complex<T>& operator= (const complex<X>&); 447a984708SDavid Chisnall template<class X> complex<T>& operator+=(const complex<X>&); 457a984708SDavid Chisnall template<class X> complex<T>& operator-=(const complex<X>&); 467a984708SDavid Chisnall template<class X> complex<T>& operator*=(const complex<X>&); 477a984708SDavid Chisnall template<class X> complex<T>& operator/=(const complex<X>&); 487a984708SDavid Chisnall}; 497a984708SDavid Chisnall 507a984708SDavid Chisnalltemplate<> 517a984708SDavid Chisnallclass complex<float> 527a984708SDavid Chisnall{ 537a984708SDavid Chisnallpublic: 547a984708SDavid Chisnall typedef float value_type; 557a984708SDavid Chisnall 567a984708SDavid Chisnall constexpr complex(float re = 0.0f, float im = 0.0f); 577a984708SDavid Chisnall explicit constexpr complex(const complex<double>&); 587a984708SDavid Chisnall explicit constexpr complex(const complex<long double>&); 597a984708SDavid Chisnall 607a984708SDavid Chisnall constexpr float real() const; 617a984708SDavid Chisnall void real(float); 627a984708SDavid Chisnall constexpr float imag() const; 637a984708SDavid Chisnall void imag(float); 647a984708SDavid Chisnall 657a984708SDavid Chisnall complex<float>& operator= (float); 667a984708SDavid Chisnall complex<float>& operator+=(float); 677a984708SDavid Chisnall complex<float>& operator-=(float); 687a984708SDavid Chisnall complex<float>& operator*=(float); 697a984708SDavid Chisnall complex<float>& operator/=(float); 707a984708SDavid Chisnall 717a984708SDavid Chisnall complex<float>& operator=(const complex<float>&); 727a984708SDavid Chisnall template<class X> complex<float>& operator= (const complex<X>&); 737a984708SDavid Chisnall template<class X> complex<float>& operator+=(const complex<X>&); 747a984708SDavid Chisnall template<class X> complex<float>& operator-=(const complex<X>&); 757a984708SDavid Chisnall template<class X> complex<float>& operator*=(const complex<X>&); 767a984708SDavid Chisnall template<class X> complex<float>& operator/=(const complex<X>&); 777a984708SDavid Chisnall}; 787a984708SDavid Chisnall 797a984708SDavid Chisnalltemplate<> 807a984708SDavid Chisnallclass complex<double> 817a984708SDavid Chisnall{ 827a984708SDavid Chisnallpublic: 837a984708SDavid Chisnall typedef double value_type; 847a984708SDavid Chisnall 857a984708SDavid Chisnall constexpr complex(double re = 0.0, double im = 0.0); 867a984708SDavid Chisnall constexpr complex(const complex<float>&); 877a984708SDavid Chisnall explicit constexpr complex(const complex<long double>&); 887a984708SDavid Chisnall 897a984708SDavid Chisnall constexpr double real() const; 907a984708SDavid Chisnall void real(double); 917a984708SDavid Chisnall constexpr double imag() const; 927a984708SDavid Chisnall void imag(double); 937a984708SDavid Chisnall 947a984708SDavid Chisnall complex<double>& operator= (double); 957a984708SDavid Chisnall complex<double>& operator+=(double); 967a984708SDavid Chisnall complex<double>& operator-=(double); 977a984708SDavid Chisnall complex<double>& operator*=(double); 987a984708SDavid Chisnall complex<double>& operator/=(double); 997a984708SDavid Chisnall complex<double>& operator=(const complex<double>&); 1007a984708SDavid Chisnall 1017a984708SDavid Chisnall template<class X> complex<double>& operator= (const complex<X>&); 1027a984708SDavid Chisnall template<class X> complex<double>& operator+=(const complex<X>&); 1037a984708SDavid Chisnall template<class X> complex<double>& operator-=(const complex<X>&); 1047a984708SDavid Chisnall template<class X> complex<double>& operator*=(const complex<X>&); 1057a984708SDavid Chisnall template<class X> complex<double>& operator/=(const complex<X>&); 1067a984708SDavid Chisnall}; 1077a984708SDavid Chisnall 1087a984708SDavid Chisnalltemplate<> 1097a984708SDavid Chisnallclass complex<long double> 1107a984708SDavid Chisnall{ 1117a984708SDavid Chisnallpublic: 1127a984708SDavid Chisnall typedef long double value_type; 1137a984708SDavid Chisnall 1147a984708SDavid Chisnall constexpr complex(long double re = 0.0L, long double im = 0.0L); 1157a984708SDavid Chisnall constexpr complex(const complex<float>&); 1167a984708SDavid Chisnall constexpr complex(const complex<double>&); 1177a984708SDavid Chisnall 1187a984708SDavid Chisnall constexpr long double real() const; 1197a984708SDavid Chisnall void real(long double); 1207a984708SDavid Chisnall constexpr long double imag() const; 1217a984708SDavid Chisnall void imag(long double); 1227a984708SDavid Chisnall 1237a984708SDavid Chisnall complex<long double>& operator=(const complex<long double>&); 1247a984708SDavid Chisnall complex<long double>& operator= (long double); 1257a984708SDavid Chisnall complex<long double>& operator+=(long double); 1267a984708SDavid Chisnall complex<long double>& operator-=(long double); 1277a984708SDavid Chisnall complex<long double>& operator*=(long double); 1287a984708SDavid Chisnall complex<long double>& operator/=(long double); 1297a984708SDavid Chisnall 1307a984708SDavid Chisnall template<class X> complex<long double>& operator= (const complex<X>&); 1317a984708SDavid Chisnall template<class X> complex<long double>& operator+=(const complex<X>&); 1327a984708SDavid Chisnall template<class X> complex<long double>& operator-=(const complex<X>&); 1337a984708SDavid Chisnall template<class X> complex<long double>& operator*=(const complex<X>&); 1347a984708SDavid Chisnall template<class X> complex<long double>& operator/=(const complex<X>&); 1357a984708SDavid Chisnall}; 1367a984708SDavid Chisnall 1377a984708SDavid Chisnall// 26.3.6 operators: 1387a984708SDavid Chisnalltemplate<class T> complex<T> operator+(const complex<T>&, const complex<T>&); 1397a984708SDavid Chisnalltemplate<class T> complex<T> operator+(const complex<T>&, const T&); 1407a984708SDavid Chisnalltemplate<class T> complex<T> operator+(const T&, const complex<T>&); 1417a984708SDavid Chisnalltemplate<class T> complex<T> operator-(const complex<T>&, const complex<T>&); 1427a984708SDavid Chisnalltemplate<class T> complex<T> operator-(const complex<T>&, const T&); 1437a984708SDavid Chisnalltemplate<class T> complex<T> operator-(const T&, const complex<T>&); 1447a984708SDavid Chisnalltemplate<class T> complex<T> operator*(const complex<T>&, const complex<T>&); 1457a984708SDavid Chisnalltemplate<class T> complex<T> operator*(const complex<T>&, const T&); 1467a984708SDavid Chisnalltemplate<class T> complex<T> operator*(const T&, const complex<T>&); 1477a984708SDavid Chisnalltemplate<class T> complex<T> operator/(const complex<T>&, const complex<T>&); 1487a984708SDavid Chisnalltemplate<class T> complex<T> operator/(const complex<T>&, const T&); 1497a984708SDavid Chisnalltemplate<class T> complex<T> operator/(const T&, const complex<T>&); 1507a984708SDavid Chisnalltemplate<class T> complex<T> operator+(const complex<T>&); 1517a984708SDavid Chisnalltemplate<class T> complex<T> operator-(const complex<T>&); 1524f7ab58eSDimitry Andrictemplate<class T> bool operator==(const complex<T>&, const complex<T>&); // constexpr in C++14 1534f7ab58eSDimitry Andrictemplate<class T> bool operator==(const complex<T>&, const T&); // constexpr in C++14 1544f7ab58eSDimitry Andrictemplate<class T> bool operator==(const T&, const complex<T>&); // constexpr in C++14 1554f7ab58eSDimitry Andrictemplate<class T> bool operator!=(const complex<T>&, const complex<T>&); // constexpr in C++14 1564f7ab58eSDimitry Andrictemplate<class T> bool operator!=(const complex<T>&, const T&); // constexpr in C++14 1574f7ab58eSDimitry Andrictemplate<class T> bool operator!=(const T&, const complex<T>&); // constexpr in C++14 1587a984708SDavid Chisnall 1597a984708SDavid Chisnalltemplate<class T, class charT, class traits> 1607a984708SDavid Chisnall basic_istream<charT, traits>& 1617a984708SDavid Chisnall operator>>(basic_istream<charT, traits>&, complex<T>&); 1627a984708SDavid Chisnalltemplate<class T, class charT, class traits> 1637a984708SDavid Chisnall basic_ostream<charT, traits>& 1647a984708SDavid Chisnall operator<<(basic_ostream<charT, traits>&, const complex<T>&); 1657a984708SDavid Chisnall 1667a984708SDavid Chisnall// 26.3.7 values: 1677a984708SDavid Chisnall 1684f7ab58eSDimitry Andrictemplate<class T> T real(const complex<T>&); // constexpr in C++14 1694f7ab58eSDimitry Andric long double real(long double); // constexpr in C++14 1704f7ab58eSDimitry Andric double real(double); // constexpr in C++14 1714f7ab58eSDimitry Andrictemplate<Integral T> double real(T); // constexpr in C++14 1724f7ab58eSDimitry Andric float real(float); // constexpr in C++14 1737a984708SDavid Chisnall 1744f7ab58eSDimitry Andrictemplate<class T> T imag(const complex<T>&); // constexpr in C++14 1754f7ab58eSDimitry Andric long double imag(long double); // constexpr in C++14 1764f7ab58eSDimitry Andric double imag(double); // constexpr in C++14 1774f7ab58eSDimitry Andrictemplate<Integral T> double imag(T); // constexpr in C++14 1784f7ab58eSDimitry Andric float imag(float); // constexpr in C++14 1797a984708SDavid Chisnall 1807a984708SDavid Chisnalltemplate<class T> T abs(const complex<T>&); 1817a984708SDavid Chisnall 1827a984708SDavid Chisnalltemplate<class T> T arg(const complex<T>&); 1837a984708SDavid Chisnall long double arg(long double); 1847a984708SDavid Chisnall double arg(double); 1857a984708SDavid Chisnalltemplate<Integral T> double arg(T); 1867a984708SDavid Chisnall float arg(float); 1877a984708SDavid Chisnall 1887a984708SDavid Chisnalltemplate<class T> T norm(const complex<T>&); 1897a984708SDavid Chisnall long double norm(long double); 1907a984708SDavid Chisnall double norm(double); 1917a984708SDavid Chisnalltemplate<Integral T> double norm(T); 1927a984708SDavid Chisnall float norm(float); 1937a984708SDavid Chisnall 1947a984708SDavid Chisnalltemplate<class T> complex<T> conj(const complex<T>&); 1957a984708SDavid Chisnall complex<long double> conj(long double); 1967a984708SDavid Chisnall complex<double> conj(double); 1977a984708SDavid Chisnalltemplate<Integral T> complex<double> conj(T); 1987a984708SDavid Chisnall complex<float> conj(float); 1997a984708SDavid Chisnall 2007a984708SDavid Chisnalltemplate<class T> complex<T> proj(const complex<T>&); 2017a984708SDavid Chisnall complex<long double> proj(long double); 2027a984708SDavid Chisnall complex<double> proj(double); 2037a984708SDavid Chisnalltemplate<Integral T> complex<double> proj(T); 2047a984708SDavid Chisnall complex<float> proj(float); 2057a984708SDavid Chisnall 2064ba319b5SDimitry Andrictemplate<class T> complex<T> polar(const T&, const T& = T()); 2077a984708SDavid Chisnall 2087a984708SDavid Chisnall// 26.3.8 transcendentals: 2097a984708SDavid Chisnalltemplate<class T> complex<T> acos(const complex<T>&); 2107a984708SDavid Chisnalltemplate<class T> complex<T> asin(const complex<T>&); 2117a984708SDavid Chisnalltemplate<class T> complex<T> atan(const complex<T>&); 2127a984708SDavid Chisnalltemplate<class T> complex<T> acosh(const complex<T>&); 2137a984708SDavid Chisnalltemplate<class T> complex<T> asinh(const complex<T>&); 2147a984708SDavid Chisnalltemplate<class T> complex<T> atanh(const complex<T>&); 2157a984708SDavid Chisnalltemplate<class T> complex<T> cos (const complex<T>&); 2167a984708SDavid Chisnalltemplate<class T> complex<T> cosh (const complex<T>&); 2177a984708SDavid Chisnalltemplate<class T> complex<T> exp (const complex<T>&); 2187a984708SDavid Chisnalltemplate<class T> complex<T> log (const complex<T>&); 2197a984708SDavid Chisnalltemplate<class T> complex<T> log10(const complex<T>&); 2207a984708SDavid Chisnall 2217a984708SDavid Chisnalltemplate<class T> complex<T> pow(const complex<T>&, const T&); 2227a984708SDavid Chisnalltemplate<class T> complex<T> pow(const complex<T>&, const complex<T>&); 2237a984708SDavid Chisnalltemplate<class T> complex<T> pow(const T&, const complex<T>&); 2247a984708SDavid Chisnall 2257a984708SDavid Chisnalltemplate<class T> complex<T> sin (const complex<T>&); 2267a984708SDavid Chisnalltemplate<class T> complex<T> sinh (const complex<T>&); 2277a984708SDavid Chisnalltemplate<class T> complex<T> sqrt (const complex<T>&); 2287a984708SDavid Chisnalltemplate<class T> complex<T> tan (const complex<T>&); 2297a984708SDavid Chisnalltemplate<class T> complex<T> tanh (const complex<T>&); 2307a984708SDavid Chisnall 2317a984708SDavid Chisnalltemplate<class T, class charT, class traits> 2327a984708SDavid Chisnall basic_istream<charT, traits>& 2337a984708SDavid Chisnall operator>>(basic_istream<charT, traits>& is, complex<T>& x); 2347a984708SDavid Chisnall 2357a984708SDavid Chisnalltemplate<class T, class charT, class traits> 2367a984708SDavid Chisnall basic_ostream<charT, traits>& 2377a984708SDavid Chisnall operator<<(basic_ostream<charT, traits>& o, const complex<T>& x); 2387a984708SDavid Chisnall 2397a984708SDavid Chisnall} // std 2407a984708SDavid Chisnall 2417a984708SDavid Chisnall*/ 2427a984708SDavid Chisnall 2437a984708SDavid Chisnall#include <__config> 2447a984708SDavid Chisnall#include <type_traits> 2457a984708SDavid Chisnall#include <stdexcept> 2467a984708SDavid Chisnall#include <cmath> 2477a984708SDavid Chisnall#include <sstream> 248*b5893f02SDimitry Andric#include <version> 2497a984708SDavid Chisnall 2507a984708SDavid Chisnall#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 2517a984708SDavid Chisnall#pragma GCC system_header 2527a984708SDavid Chisnall#endif 2537a984708SDavid Chisnall 2547a984708SDavid Chisnall_LIBCPP_BEGIN_NAMESPACE_STD 2557a984708SDavid Chisnall 256aed8d94eSDimitry Andrictemplate<class _Tp> class _LIBCPP_TEMPLATE_VIS complex; 2577a984708SDavid Chisnall 2587a984708SDavid Chisnalltemplate<class _Tp> complex<_Tp> operator*(const complex<_Tp>& __z, const complex<_Tp>& __w); 2597a984708SDavid Chisnalltemplate<class _Tp> complex<_Tp> operator/(const complex<_Tp>& __x, const complex<_Tp>& __y); 2607a984708SDavid Chisnall 2617a984708SDavid Chisnalltemplate<class _Tp> 262aed8d94eSDimitry Andricclass _LIBCPP_TEMPLATE_VIS complex 2637a984708SDavid Chisnall{ 2647a984708SDavid Chisnallpublic: 2657a984708SDavid Chisnall typedef _Tp value_type; 2667a984708SDavid Chisnallprivate: 2677a984708SDavid Chisnall value_type __re_; 2687a984708SDavid Chisnall value_type __im_; 2697a984708SDavid Chisnallpublic: 2704f7ab58eSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 2717a984708SDavid Chisnall complex(const value_type& __re = value_type(), const value_type& __im = value_type()) 2727a984708SDavid Chisnall : __re_(__re), __im_(__im) {} 2734f7ab58eSDimitry Andric template<class _Xp> _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 2747a984708SDavid Chisnall complex(const complex<_Xp>& __c) 2757a984708SDavid Chisnall : __re_(__c.real()), __im_(__c.imag()) {} 2767a984708SDavid Chisnall 2774f7ab58eSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 value_type real() const {return __re_;} 2784f7ab58eSDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 value_type imag() const {return __im_;} 2797a984708SDavid Chisnall 2807a984708SDavid Chisnall _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;} 2817a984708SDavid Chisnall _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;} 2827a984708SDavid Chisnall 28394e3ee44SDavid Chisnall _LIBCPP_INLINE_VISIBILITY complex& operator= (const value_type& __re) 28494e3ee44SDavid Chisnall {__re_ = __re; __im_ = value_type(); return *this;} 2857a984708SDavid Chisnall _LIBCPP_INLINE_VISIBILITY complex& operator+=(const value_type& __re) {__re_ += __re; return *this;} 2867a984708SDavid Chisnall _LIBCPP_INLINE_VISIBILITY complex& operator-=(const value_type& __re) {__re_ -= __re; return *this;} 2877a984708SDavid Chisnall _LIBCPP_INLINE_VISIBILITY complex& operator*=(const value_type& __re) {__re_ *= __re; __im_ *= __re; return *this;} 2887a984708SDavid Chisnall _LIBCPP_INLINE_VISIBILITY complex& operator/=(const value_type& __re) {__re_ /= __re; __im_ /= __re; return *this;} 2897a984708SDavid Chisnall 2907a984708SDavid Chisnall template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c) 2917a984708SDavid Chisnall { 2927a984708SDavid Chisnall __re_ = __c.real(); 2937a984708SDavid Chisnall __im_ = __c.imag(); 2947a984708SDavid Chisnall return *this; 2957a984708SDavid Chisnall } 2967a984708SDavid Chisnall template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c) 2977a984708SDavid Chisnall { 2987a984708SDavid Chisnall __re_ += __c.real(); 2997a984708SDavid Chisnall __im_ += __c.imag(); 3007a984708SDavid Chisnall return *this; 3017a984708SDavid Chisnall } 3027a984708SDavid Chisnall template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c) 3037a984708SDavid Chisnall { 3047a984708SDavid Chisnall __re_ -= __c.real(); 3057a984708SDavid Chisnall __im_ -= __c.imag(); 3067a984708SDavid Chisnall return *this; 3077a984708SDavid Chisnall } 3087a984708SDavid Chisnall template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c) 3097a984708SDavid Chisnall { 3104f7ab58eSDimitry Andric *this = *this * complex(__c.real(), __c.imag()); 3117a984708SDavid Chisnall return *this; 3127a984708SDavid Chisnall } 3137a984708SDavid Chisnall template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c) 3147a984708SDavid Chisnall { 3154f7ab58eSDimitry Andric *this = *this / complex(__c.real(), __c.imag()); 3167a984708SDavid Chisnall return *this; 3177a984708SDavid Chisnall } 3187a984708SDavid Chisnall}; 3197a984708SDavid Chisnall 320aed8d94eSDimitry Andrictemplate<> class _LIBCPP_TEMPLATE_VIS complex<double>; 321aed8d94eSDimitry Andrictemplate<> class _LIBCPP_TEMPLATE_VIS complex<long double>; 3227a984708SDavid Chisnall 3237a984708SDavid Chisnalltemplate<> 324aed8d94eSDimitry Andricclass _LIBCPP_TEMPLATE_VIS complex<float> 3257a984708SDavid Chisnall{ 3267a984708SDavid Chisnall float __re_; 3277a984708SDavid Chisnall float __im_; 3287a984708SDavid Chisnallpublic: 3297a984708SDavid Chisnall typedef float value_type; 3307a984708SDavid Chisnall 331936e9439SDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(float __re = 0.0f, float __im = 0.0f) 3327a984708SDavid Chisnall : __re_(__re), __im_(__im) {} 3337c82a1ecSDimitry Andric _LIBCPP_INLINE_VISIBILITY 334936e9439SDimitry Andric explicit _LIBCPP_CONSTEXPR complex(const complex<double>& __c); 3357c82a1ecSDimitry Andric _LIBCPP_INLINE_VISIBILITY 336936e9439SDimitry Andric explicit _LIBCPP_CONSTEXPR complex(const complex<long double>& __c); 3377a984708SDavid Chisnall 338936e9439SDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR float real() const {return __re_;} 339936e9439SDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR float imag() const {return __im_;} 3407a984708SDavid Chisnall 3417a984708SDavid Chisnall _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;} 3427a984708SDavid Chisnall _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;} 3437a984708SDavid Chisnall 34494e3ee44SDavid Chisnall _LIBCPP_INLINE_VISIBILITY complex& operator= (float __re) 34594e3ee44SDavid Chisnall {__re_ = __re; __im_ = value_type(); return *this;} 3467a984708SDavid Chisnall _LIBCPP_INLINE_VISIBILITY complex& operator+=(float __re) {__re_ += __re; return *this;} 3477a984708SDavid Chisnall _LIBCPP_INLINE_VISIBILITY complex& operator-=(float __re) {__re_ -= __re; return *this;} 3487a984708SDavid Chisnall _LIBCPP_INLINE_VISIBILITY complex& operator*=(float __re) {__re_ *= __re; __im_ *= __re; return *this;} 3497a984708SDavid Chisnall _LIBCPP_INLINE_VISIBILITY complex& operator/=(float __re) {__re_ /= __re; __im_ /= __re; return *this;} 3507a984708SDavid Chisnall 3517a984708SDavid Chisnall template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c) 3527a984708SDavid Chisnall { 3537a984708SDavid Chisnall __re_ = __c.real(); 3547a984708SDavid Chisnall __im_ = __c.imag(); 3557a984708SDavid Chisnall return *this; 3567a984708SDavid Chisnall } 3577a984708SDavid Chisnall template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c) 3587a984708SDavid Chisnall { 3597a984708SDavid Chisnall __re_ += __c.real(); 3607a984708SDavid Chisnall __im_ += __c.imag(); 3617a984708SDavid Chisnall return *this; 3627a984708SDavid Chisnall } 3637a984708SDavid Chisnall template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c) 3647a984708SDavid Chisnall { 3657a984708SDavid Chisnall __re_ -= __c.real(); 3667a984708SDavid Chisnall __im_ -= __c.imag(); 3677a984708SDavid Chisnall return *this; 3687a984708SDavid Chisnall } 3697a984708SDavid Chisnall template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c) 3707a984708SDavid Chisnall { 3714f7ab58eSDimitry Andric *this = *this * complex(__c.real(), __c.imag()); 3727a984708SDavid Chisnall return *this; 3737a984708SDavid Chisnall } 3747a984708SDavid Chisnall template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c) 3757a984708SDavid Chisnall { 3764f7ab58eSDimitry Andric *this = *this / complex(__c.real(), __c.imag()); 3777a984708SDavid Chisnall return *this; 3787a984708SDavid Chisnall } 3797a984708SDavid Chisnall}; 3807a984708SDavid Chisnall 3817a984708SDavid Chisnalltemplate<> 382aed8d94eSDimitry Andricclass _LIBCPP_TEMPLATE_VIS complex<double> 3837a984708SDavid Chisnall{ 3847a984708SDavid Chisnall double __re_; 3857a984708SDavid Chisnall double __im_; 3867a984708SDavid Chisnallpublic: 3877a984708SDavid Chisnall typedef double value_type; 3887a984708SDavid Chisnall 389936e9439SDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(double __re = 0.0, double __im = 0.0) 3907a984708SDavid Chisnall : __re_(__re), __im_(__im) {} 3917c82a1ecSDimitry Andric _LIBCPP_INLINE_VISIBILITY 392936e9439SDimitry Andric _LIBCPP_CONSTEXPR complex(const complex<float>& __c); 3937c82a1ecSDimitry Andric _LIBCPP_INLINE_VISIBILITY 394936e9439SDimitry Andric explicit _LIBCPP_CONSTEXPR complex(const complex<long double>& __c); 3957a984708SDavid Chisnall 396936e9439SDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR double real() const {return __re_;} 397936e9439SDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR double imag() const {return __im_;} 3987a984708SDavid Chisnall 3997a984708SDavid Chisnall _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;} 4007a984708SDavid Chisnall _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;} 4017a984708SDavid Chisnall 40294e3ee44SDavid Chisnall _LIBCPP_INLINE_VISIBILITY complex& operator= (double __re) 40394e3ee44SDavid Chisnall {__re_ = __re; __im_ = value_type(); return *this;} 4047a984708SDavid Chisnall _LIBCPP_INLINE_VISIBILITY complex& operator+=(double __re) {__re_ += __re; return *this;} 4057a984708SDavid Chisnall _LIBCPP_INLINE_VISIBILITY complex& operator-=(double __re) {__re_ -= __re; return *this;} 4067a984708SDavid Chisnall _LIBCPP_INLINE_VISIBILITY complex& operator*=(double __re) {__re_ *= __re; __im_ *= __re; return *this;} 4077a984708SDavid Chisnall _LIBCPP_INLINE_VISIBILITY complex& operator/=(double __re) {__re_ /= __re; __im_ /= __re; return *this;} 4087a984708SDavid Chisnall 4097a984708SDavid Chisnall template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c) 4107a984708SDavid Chisnall { 4117a984708SDavid Chisnall __re_ = __c.real(); 4127a984708SDavid Chisnall __im_ = __c.imag(); 4137a984708SDavid Chisnall return *this; 4147a984708SDavid Chisnall } 4157a984708SDavid Chisnall template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c) 4167a984708SDavid Chisnall { 4177a984708SDavid Chisnall __re_ += __c.real(); 4187a984708SDavid Chisnall __im_ += __c.imag(); 4197a984708SDavid Chisnall return *this; 4207a984708SDavid Chisnall } 4217a984708SDavid Chisnall template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c) 4227a984708SDavid Chisnall { 4237a984708SDavid Chisnall __re_ -= __c.real(); 4247a984708SDavid Chisnall __im_ -= __c.imag(); 4257a984708SDavid Chisnall return *this; 4267a984708SDavid Chisnall } 4277a984708SDavid Chisnall template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c) 4287a984708SDavid Chisnall { 4294f7ab58eSDimitry Andric *this = *this * complex(__c.real(), __c.imag()); 4307a984708SDavid Chisnall return *this; 4317a984708SDavid Chisnall } 4327a984708SDavid Chisnall template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c) 4337a984708SDavid Chisnall { 4344f7ab58eSDimitry Andric *this = *this / complex(__c.real(), __c.imag()); 4357a984708SDavid Chisnall return *this; 4367a984708SDavid Chisnall } 4377a984708SDavid Chisnall}; 4387a984708SDavid Chisnall 4397a984708SDavid Chisnalltemplate<> 440aed8d94eSDimitry Andricclass _LIBCPP_TEMPLATE_VIS complex<long double> 4417a984708SDavid Chisnall{ 4427a984708SDavid Chisnall long double __re_; 4437a984708SDavid Chisnall long double __im_; 4447a984708SDavid Chisnallpublic: 4457a984708SDavid Chisnall typedef long double value_type; 4467a984708SDavid Chisnall 447936e9439SDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(long double __re = 0.0L, long double __im = 0.0L) 4487a984708SDavid Chisnall : __re_(__re), __im_(__im) {} 4497c82a1ecSDimitry Andric _LIBCPP_INLINE_VISIBILITY 450936e9439SDimitry Andric _LIBCPP_CONSTEXPR complex(const complex<float>& __c); 4517c82a1ecSDimitry Andric _LIBCPP_INLINE_VISIBILITY 452936e9439SDimitry Andric _LIBCPP_CONSTEXPR complex(const complex<double>& __c); 4537a984708SDavid Chisnall 454936e9439SDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR long double real() const {return __re_;} 455936e9439SDimitry Andric _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR long double imag() const {return __im_;} 4567a984708SDavid Chisnall 4577a984708SDavid Chisnall _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;} 4587a984708SDavid Chisnall _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;} 4597a984708SDavid Chisnall 46094e3ee44SDavid Chisnall _LIBCPP_INLINE_VISIBILITY complex& operator= (long double __re) 46194e3ee44SDavid Chisnall {__re_ = __re; __im_ = value_type(); return *this;} 4627a984708SDavid Chisnall _LIBCPP_INLINE_VISIBILITY complex& operator+=(long double __re) {__re_ += __re; return *this;} 4637a984708SDavid Chisnall _LIBCPP_INLINE_VISIBILITY complex& operator-=(long double __re) {__re_ -= __re; return *this;} 4647a984708SDavid Chisnall _LIBCPP_INLINE_VISIBILITY complex& operator*=(long double __re) {__re_ *= __re; __im_ *= __re; return *this;} 4657a984708SDavid Chisnall _LIBCPP_INLINE_VISIBILITY complex& operator/=(long double __re) {__re_ /= __re; __im_ /= __re; return *this;} 4667a984708SDavid Chisnall 4677a984708SDavid Chisnall template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c) 4687a984708SDavid Chisnall { 4697a984708SDavid Chisnall __re_ = __c.real(); 4707a984708SDavid Chisnall __im_ = __c.imag(); 4717a984708SDavid Chisnall return *this; 4727a984708SDavid Chisnall } 4737a984708SDavid Chisnall template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c) 4747a984708SDavid Chisnall { 4757a984708SDavid Chisnall __re_ += __c.real(); 4767a984708SDavid Chisnall __im_ += __c.imag(); 4777a984708SDavid Chisnall return *this; 4787a984708SDavid Chisnall } 4797a984708SDavid Chisnall template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c) 4807a984708SDavid Chisnall { 4817a984708SDavid Chisnall __re_ -= __c.real(); 4827a984708SDavid Chisnall __im_ -= __c.imag(); 4837a984708SDavid Chisnall return *this; 4847a984708SDavid Chisnall } 4857a984708SDavid Chisnall template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c) 4867a984708SDavid Chisnall { 4874f7ab58eSDimitry Andric *this = *this * complex(__c.real(), __c.imag()); 4887a984708SDavid Chisnall return *this; 4897a984708SDavid Chisnall } 4907a984708SDavid Chisnall template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c) 4917a984708SDavid Chisnall { 4924f7ab58eSDimitry Andric *this = *this / complex(__c.real(), __c.imag()); 4937a984708SDavid Chisnall return *this; 4947a984708SDavid Chisnall } 4957a984708SDavid Chisnall}; 4967a984708SDavid Chisnall 4977c82a1ecSDimitry Andricinline 498936e9439SDimitry Andric_LIBCPP_CONSTEXPR 4997a984708SDavid Chisnallcomplex<float>::complex(const complex<double>& __c) 5007a984708SDavid Chisnall : __re_(__c.real()), __im_(__c.imag()) {} 5017a984708SDavid Chisnall 5027c82a1ecSDimitry Andricinline 503936e9439SDimitry Andric_LIBCPP_CONSTEXPR 5047a984708SDavid Chisnallcomplex<float>::complex(const complex<long double>& __c) 5057a984708SDavid Chisnall : __re_(__c.real()), __im_(__c.imag()) {} 5067a984708SDavid Chisnall 5077c82a1ecSDimitry Andricinline 508936e9439SDimitry Andric_LIBCPP_CONSTEXPR 5097a984708SDavid Chisnallcomplex<double>::complex(const complex<float>& __c) 5107a984708SDavid Chisnall : __re_(__c.real()), __im_(__c.imag()) {} 5117a984708SDavid Chisnall 5127c82a1ecSDimitry Andricinline 513936e9439SDimitry Andric_LIBCPP_CONSTEXPR 5147a984708SDavid Chisnallcomplex<double>::complex(const complex<long double>& __c) 5157a984708SDavid Chisnall : __re_(__c.real()), __im_(__c.imag()) {} 5167a984708SDavid Chisnall 5177c82a1ecSDimitry Andricinline 518936e9439SDimitry Andric_LIBCPP_CONSTEXPR 5197a984708SDavid Chisnallcomplex<long double>::complex(const complex<float>& __c) 5207a984708SDavid Chisnall : __re_(__c.real()), __im_(__c.imag()) {} 5217a984708SDavid Chisnall 5227c82a1ecSDimitry Andricinline 523936e9439SDimitry Andric_LIBCPP_CONSTEXPR 5247a984708SDavid Chisnallcomplex<long double>::complex(const complex<double>& __c) 5257a984708SDavid Chisnall : __re_(__c.real()), __im_(__c.imag()) {} 5267a984708SDavid Chisnall 5277a984708SDavid Chisnall// 26.3.6 operators: 5287a984708SDavid Chisnall 5297a984708SDavid Chisnalltemplate<class _Tp> 5307a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY 5317a984708SDavid Chisnallcomplex<_Tp> 5327a984708SDavid Chisnalloperator+(const complex<_Tp>& __x, const complex<_Tp>& __y) 5337a984708SDavid Chisnall{ 5347a984708SDavid Chisnall complex<_Tp> __t(__x); 5357a984708SDavid Chisnall __t += __y; 5367a984708SDavid Chisnall return __t; 5377a984708SDavid Chisnall} 5387a984708SDavid Chisnall 5397a984708SDavid Chisnalltemplate<class _Tp> 5407a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY 5417a984708SDavid Chisnallcomplex<_Tp> 5427a984708SDavid Chisnalloperator+(const complex<_Tp>& __x, const _Tp& __y) 5437a984708SDavid Chisnall{ 5447a984708SDavid Chisnall complex<_Tp> __t(__x); 5457a984708SDavid Chisnall __t += __y; 5467a984708SDavid Chisnall return __t; 5477a984708SDavid Chisnall} 5487a984708SDavid Chisnall 5497a984708SDavid Chisnalltemplate<class _Tp> 5507a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY 5517a984708SDavid Chisnallcomplex<_Tp> 5527a984708SDavid Chisnalloperator+(const _Tp& __x, const complex<_Tp>& __y) 5537a984708SDavid Chisnall{ 5547a984708SDavid Chisnall complex<_Tp> __t(__y); 5557a984708SDavid Chisnall __t += __x; 5567a984708SDavid Chisnall return __t; 5577a984708SDavid Chisnall} 5587a984708SDavid Chisnall 5597a984708SDavid Chisnalltemplate<class _Tp> 5607a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY 5617a984708SDavid Chisnallcomplex<_Tp> 5627a984708SDavid Chisnalloperator-(const complex<_Tp>& __x, const complex<_Tp>& __y) 5637a984708SDavid Chisnall{ 5647a984708SDavid Chisnall complex<_Tp> __t(__x); 5657a984708SDavid Chisnall __t -= __y; 5667a984708SDavid Chisnall return __t; 5677a984708SDavid Chisnall} 5687a984708SDavid Chisnall 5697a984708SDavid Chisnalltemplate<class _Tp> 5707a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY 5717a984708SDavid Chisnallcomplex<_Tp> 5727a984708SDavid Chisnalloperator-(const complex<_Tp>& __x, const _Tp& __y) 5737a984708SDavid Chisnall{ 5747a984708SDavid Chisnall complex<_Tp> __t(__x); 5757a984708SDavid Chisnall __t -= __y; 5767a984708SDavid Chisnall return __t; 5777a984708SDavid Chisnall} 5787a984708SDavid Chisnall 5797a984708SDavid Chisnalltemplate<class _Tp> 5807a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY 5817a984708SDavid Chisnallcomplex<_Tp> 5827a984708SDavid Chisnalloperator-(const _Tp& __x, const complex<_Tp>& __y) 5837a984708SDavid Chisnall{ 5847a984708SDavid Chisnall complex<_Tp> __t(-__y); 5857a984708SDavid Chisnall __t += __x; 5867a984708SDavid Chisnall return __t; 5877a984708SDavid Chisnall} 5887a984708SDavid Chisnall 5897a984708SDavid Chisnalltemplate<class _Tp> 5907a984708SDavid Chisnallcomplex<_Tp> 5917a984708SDavid Chisnalloperator*(const complex<_Tp>& __z, const complex<_Tp>& __w) 5927a984708SDavid Chisnall{ 5937a984708SDavid Chisnall _Tp __a = __z.real(); 5947a984708SDavid Chisnall _Tp __b = __z.imag(); 5957a984708SDavid Chisnall _Tp __c = __w.real(); 5967a984708SDavid Chisnall _Tp __d = __w.imag(); 5977a984708SDavid Chisnall _Tp __ac = __a * __c; 5987a984708SDavid Chisnall _Tp __bd = __b * __d; 5997a984708SDavid Chisnall _Tp __ad = __a * __d; 6007a984708SDavid Chisnall _Tp __bc = __b * __c; 6017a984708SDavid Chisnall _Tp __x = __ac - __bd; 6027a984708SDavid Chisnall _Tp __y = __ad + __bc; 603c4394386SDimitry Andric if (__libcpp_isnan_or_builtin(__x) && __libcpp_isnan_or_builtin(__y)) 6047a984708SDavid Chisnall { 6057a984708SDavid Chisnall bool __recalc = false; 606c4394386SDimitry Andric if (__libcpp_isinf_or_builtin(__a) || __libcpp_isinf_or_builtin(__b)) 6077a984708SDavid Chisnall { 608c4394386SDimitry Andric __a = copysign(__libcpp_isinf_or_builtin(__a) ? _Tp(1) : _Tp(0), __a); 609c4394386SDimitry Andric __b = copysign(__libcpp_isinf_or_builtin(__b) ? _Tp(1) : _Tp(0), __b); 610c4394386SDimitry Andric if (__libcpp_isnan_or_builtin(__c)) 6117a984708SDavid Chisnall __c = copysign(_Tp(0), __c); 612c4394386SDimitry Andric if (__libcpp_isnan_or_builtin(__d)) 6137a984708SDavid Chisnall __d = copysign(_Tp(0), __d); 6147a984708SDavid Chisnall __recalc = true; 6157a984708SDavid Chisnall } 616c4394386SDimitry Andric if (__libcpp_isinf_or_builtin(__c) || __libcpp_isinf_or_builtin(__d)) 6177a984708SDavid Chisnall { 618c4394386SDimitry Andric __c = copysign(__libcpp_isinf_or_builtin(__c) ? _Tp(1) : _Tp(0), __c); 619c4394386SDimitry Andric __d = copysign(__libcpp_isinf_or_builtin(__d) ? _Tp(1) : _Tp(0), __d); 620c4394386SDimitry Andric if (__libcpp_isnan_or_builtin(__a)) 6217a984708SDavid Chisnall __a = copysign(_Tp(0), __a); 622c4394386SDimitry Andric if (__libcpp_isnan_or_builtin(__b)) 6237a984708SDavid Chisnall __b = copysign(_Tp(0), __b); 6247a984708SDavid Chisnall __recalc = true; 6257a984708SDavid Chisnall } 626c4394386SDimitry Andric if (!__recalc && (__libcpp_isinf_or_builtin(__ac) || __libcpp_isinf_or_builtin(__bd) || 627c4394386SDimitry Andric __libcpp_isinf_or_builtin(__ad) || __libcpp_isinf_or_builtin(__bc))) 6287a984708SDavid Chisnall { 629c4394386SDimitry Andric if (__libcpp_isnan_or_builtin(__a)) 6307a984708SDavid Chisnall __a = copysign(_Tp(0), __a); 631c4394386SDimitry Andric if (__libcpp_isnan_or_builtin(__b)) 6327a984708SDavid Chisnall __b = copysign(_Tp(0), __b); 633c4394386SDimitry Andric if (__libcpp_isnan_or_builtin(__c)) 6347a984708SDavid Chisnall __c = copysign(_Tp(0), __c); 635c4394386SDimitry Andric if (__libcpp_isnan_or_builtin(__d)) 6367a984708SDavid Chisnall __d = copysign(_Tp(0), __d); 6377a984708SDavid Chisnall __recalc = true; 6387a984708SDavid Chisnall } 6397a984708SDavid Chisnall if (__recalc) 6407a984708SDavid Chisnall { 6417a984708SDavid Chisnall __x = _Tp(INFINITY) * (__a * __c - __b * __d); 6427a984708SDavid Chisnall __y = _Tp(INFINITY) * (__a * __d + __b * __c); 6437a984708SDavid Chisnall } 6447a984708SDavid Chisnall } 6457a984708SDavid Chisnall return complex<_Tp>(__x, __y); 6467a984708SDavid Chisnall} 6477a984708SDavid Chisnall 6487a984708SDavid Chisnalltemplate<class _Tp> 6497a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY 6507a984708SDavid Chisnallcomplex<_Tp> 6517a984708SDavid Chisnalloperator*(const complex<_Tp>& __x, const _Tp& __y) 6527a984708SDavid Chisnall{ 6537a984708SDavid Chisnall complex<_Tp> __t(__x); 6547a984708SDavid Chisnall __t *= __y; 6557a984708SDavid Chisnall return __t; 6567a984708SDavid Chisnall} 6577a984708SDavid Chisnall 6587a984708SDavid Chisnalltemplate<class _Tp> 6597a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY 6607a984708SDavid Chisnallcomplex<_Tp> 6617a984708SDavid Chisnalloperator*(const _Tp& __x, const complex<_Tp>& __y) 6627a984708SDavid Chisnall{ 6637a984708SDavid Chisnall complex<_Tp> __t(__y); 6647a984708SDavid Chisnall __t *= __x; 6657a984708SDavid Chisnall return __t; 6667a984708SDavid Chisnall} 6677a984708SDavid Chisnall 6687a984708SDavid Chisnalltemplate<class _Tp> 6697a984708SDavid Chisnallcomplex<_Tp> 6707a984708SDavid Chisnalloperator/(const complex<_Tp>& __z, const complex<_Tp>& __w) 6717a984708SDavid Chisnall{ 6727a984708SDavid Chisnall int __ilogbw = 0; 6737a984708SDavid Chisnall _Tp __a = __z.real(); 6747a984708SDavid Chisnall _Tp __b = __z.imag(); 6757a984708SDavid Chisnall _Tp __c = __w.real(); 6767a984708SDavid Chisnall _Tp __d = __w.imag(); 6777a984708SDavid Chisnall _Tp __logbw = logb(fmax(fabs(__c), fabs(__d))); 678c4394386SDimitry Andric if (__libcpp_isfinite_or_builtin(__logbw)) 6797a984708SDavid Chisnall { 6807a984708SDavid Chisnall __ilogbw = static_cast<int>(__logbw); 6817a984708SDavid Chisnall __c = scalbn(__c, -__ilogbw); 6827a984708SDavid Chisnall __d = scalbn(__d, -__ilogbw); 6837a984708SDavid Chisnall } 6847a984708SDavid Chisnall _Tp __denom = __c * __c + __d * __d; 6857a984708SDavid Chisnall _Tp __x = scalbn((__a * __c + __b * __d) / __denom, -__ilogbw); 6867a984708SDavid Chisnall _Tp __y = scalbn((__b * __c - __a * __d) / __denom, -__ilogbw); 687c4394386SDimitry Andric if (__libcpp_isnan_or_builtin(__x) && __libcpp_isnan_or_builtin(__y)) 6887a984708SDavid Chisnall { 689c4394386SDimitry Andric if ((__denom == _Tp(0)) && (!__libcpp_isnan_or_builtin(__a) || !__libcpp_isnan_or_builtin(__b))) 6907a984708SDavid Chisnall { 6917a984708SDavid Chisnall __x = copysign(_Tp(INFINITY), __c) * __a; 6927a984708SDavid Chisnall __y = copysign(_Tp(INFINITY), __c) * __b; 6937a984708SDavid Chisnall } 694c4394386SDimitry Andric else if ((__libcpp_isinf_or_builtin(__a) || __libcpp_isinf_or_builtin(__b)) && __libcpp_isfinite_or_builtin(__c) && __libcpp_isfinite_or_builtin(__d)) 6957a984708SDavid Chisnall { 696c4394386SDimitry Andric __a = copysign(__libcpp_isinf_or_builtin(__a) ? _Tp(1) : _Tp(0), __a); 697c4394386SDimitry Andric __b = copysign(__libcpp_isinf_or_builtin(__b) ? _Tp(1) : _Tp(0), __b); 6987a984708SDavid Chisnall __x = _Tp(INFINITY) * (__a * __c + __b * __d); 6997a984708SDavid Chisnall __y = _Tp(INFINITY) * (__b * __c - __a * __d); 7007a984708SDavid Chisnall } 701c4394386SDimitry Andric else if (__libcpp_isinf_or_builtin(__logbw) && __logbw > _Tp(0) && __libcpp_isfinite_or_builtin(__a) && __libcpp_isfinite_or_builtin(__b)) 7027a984708SDavid Chisnall { 703c4394386SDimitry Andric __c = copysign(__libcpp_isinf_or_builtin(__c) ? _Tp(1) : _Tp(0), __c); 704c4394386SDimitry Andric __d = copysign(__libcpp_isinf_or_builtin(__d) ? _Tp(1) : _Tp(0), __d); 7057a984708SDavid Chisnall __x = _Tp(0) * (__a * __c + __b * __d); 7067a984708SDavid Chisnall __y = _Tp(0) * (__b * __c - __a * __d); 7077a984708SDavid Chisnall } 7087a984708SDavid Chisnall } 7097a984708SDavid Chisnall return complex<_Tp>(__x, __y); 7107a984708SDavid Chisnall} 7117a984708SDavid Chisnall 7127a984708SDavid Chisnalltemplate<class _Tp> 7137a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY 7147a984708SDavid Chisnallcomplex<_Tp> 7157a984708SDavid Chisnalloperator/(const complex<_Tp>& __x, const _Tp& __y) 7167a984708SDavid Chisnall{ 7177a984708SDavid Chisnall return complex<_Tp>(__x.real() / __y, __x.imag() / __y); 7187a984708SDavid Chisnall} 7197a984708SDavid Chisnall 7207a984708SDavid Chisnalltemplate<class _Tp> 7217a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY 7227a984708SDavid Chisnallcomplex<_Tp> 7237a984708SDavid Chisnalloperator/(const _Tp& __x, const complex<_Tp>& __y) 7247a984708SDavid Chisnall{ 7257a984708SDavid Chisnall complex<_Tp> __t(__x); 7267a984708SDavid Chisnall __t /= __y; 7277a984708SDavid Chisnall return __t; 7287a984708SDavid Chisnall} 7297a984708SDavid Chisnall 7307a984708SDavid Chisnalltemplate<class _Tp> 7317a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY 7327a984708SDavid Chisnallcomplex<_Tp> 7337a984708SDavid Chisnalloperator+(const complex<_Tp>& __x) 7347a984708SDavid Chisnall{ 7357a984708SDavid Chisnall return __x; 7367a984708SDavid Chisnall} 7377a984708SDavid Chisnall 7387a984708SDavid Chisnalltemplate<class _Tp> 7397a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY 7407a984708SDavid Chisnallcomplex<_Tp> 7417a984708SDavid Chisnalloperator-(const complex<_Tp>& __x) 7427a984708SDavid Chisnall{ 7437a984708SDavid Chisnall return complex<_Tp>(-__x.real(), -__x.imag()); 7447a984708SDavid Chisnall} 7457a984708SDavid Chisnall 7467a984708SDavid Chisnalltemplate<class _Tp> 7474f7ab58eSDimitry Andricinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 7487a984708SDavid Chisnallbool 7497a984708SDavid Chisnalloperator==(const complex<_Tp>& __x, const complex<_Tp>& __y) 7507a984708SDavid Chisnall{ 7517a984708SDavid Chisnall return __x.real() == __y.real() && __x.imag() == __y.imag(); 7527a984708SDavid Chisnall} 7537a984708SDavid Chisnall 7547a984708SDavid Chisnalltemplate<class _Tp> 7554f7ab58eSDimitry Andricinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 7567a984708SDavid Chisnallbool 7577a984708SDavid Chisnalloperator==(const complex<_Tp>& __x, const _Tp& __y) 7587a984708SDavid Chisnall{ 7597a984708SDavid Chisnall return __x.real() == __y && __x.imag() == 0; 7607a984708SDavid Chisnall} 7617a984708SDavid Chisnall 7627a984708SDavid Chisnalltemplate<class _Tp> 7634f7ab58eSDimitry Andricinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 7647a984708SDavid Chisnallbool 7657a984708SDavid Chisnalloperator==(const _Tp& __x, const complex<_Tp>& __y) 7667a984708SDavid Chisnall{ 7677a984708SDavid Chisnall return __x == __y.real() && 0 == __y.imag(); 7687a984708SDavid Chisnall} 7697a984708SDavid Chisnall 7707a984708SDavid Chisnalltemplate<class _Tp> 7714f7ab58eSDimitry Andricinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 7727a984708SDavid Chisnallbool 7737a984708SDavid Chisnalloperator!=(const complex<_Tp>& __x, const complex<_Tp>& __y) 7747a984708SDavid Chisnall{ 7757a984708SDavid Chisnall return !(__x == __y); 7767a984708SDavid Chisnall} 7777a984708SDavid Chisnall 7787a984708SDavid Chisnalltemplate<class _Tp> 7794f7ab58eSDimitry Andricinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 7807a984708SDavid Chisnallbool 7817a984708SDavid Chisnalloperator!=(const complex<_Tp>& __x, const _Tp& __y) 7827a984708SDavid Chisnall{ 7837a984708SDavid Chisnall return !(__x == __y); 7847a984708SDavid Chisnall} 7857a984708SDavid Chisnall 7867a984708SDavid Chisnalltemplate<class _Tp> 7874f7ab58eSDimitry Andricinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 7887a984708SDavid Chisnallbool 7897a984708SDavid Chisnalloperator!=(const _Tp& __x, const complex<_Tp>& __y) 7907a984708SDavid Chisnall{ 7917a984708SDavid Chisnall return !(__x == __y); 7927a984708SDavid Chisnall} 7937a984708SDavid Chisnall 7947a984708SDavid Chisnall// 26.3.7 values: 7957a984708SDavid Chisnall 796aed8d94eSDimitry Andrictemplate <class _Tp, bool = is_integral<_Tp>::value, 797aed8d94eSDimitry Andric bool = is_floating_point<_Tp>::value 798aed8d94eSDimitry Andric > 799aed8d94eSDimitry Andricstruct __libcpp_complex_overload_traits {}; 800aed8d94eSDimitry Andric 801aed8d94eSDimitry Andric// Integral Types 802aed8d94eSDimitry Andrictemplate <class _Tp> 803aed8d94eSDimitry Andricstruct __libcpp_complex_overload_traits<_Tp, true, false> 804aed8d94eSDimitry Andric{ 805aed8d94eSDimitry Andric typedef double _ValueType; 806aed8d94eSDimitry Andric typedef complex<double> _ComplexType; 807aed8d94eSDimitry Andric}; 808aed8d94eSDimitry Andric 809aed8d94eSDimitry Andric// Floating point types 810aed8d94eSDimitry Andrictemplate <class _Tp> 811aed8d94eSDimitry Andricstruct __libcpp_complex_overload_traits<_Tp, false, true> 812aed8d94eSDimitry Andric{ 813aed8d94eSDimitry Andric typedef _Tp _ValueType; 814aed8d94eSDimitry Andric typedef complex<_Tp> _ComplexType; 815aed8d94eSDimitry Andric}; 816aed8d94eSDimitry Andric 8177a984708SDavid Chisnall// real 8187a984708SDavid Chisnall 8197a984708SDavid Chisnalltemplate<class _Tp> 8204f7ab58eSDimitry Andricinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 8217a984708SDavid Chisnall_Tp 8227a984708SDavid Chisnallreal(const complex<_Tp>& __c) 8237a984708SDavid Chisnall{ 8247a984708SDavid Chisnall return __c.real(); 8257a984708SDavid Chisnall} 8267a984708SDavid Chisnall 8277a984708SDavid Chisnalltemplate <class _Tp> 8284f7ab58eSDimitry Andricinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 829aed8d94eSDimitry Andrictypename __libcpp_complex_overload_traits<_Tp>::_ValueType 8307a984708SDavid Chisnallreal(_Tp __re) 8317a984708SDavid Chisnall{ 8327a984708SDavid Chisnall return __re; 8337a984708SDavid Chisnall} 8347a984708SDavid Chisnall 8357a984708SDavid Chisnall// imag 8367a984708SDavid Chisnall 8377a984708SDavid Chisnalltemplate<class _Tp> 8384f7ab58eSDimitry Andricinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 8397a984708SDavid Chisnall_Tp 8407a984708SDavid Chisnallimag(const complex<_Tp>& __c) 8417a984708SDavid Chisnall{ 8427a984708SDavid Chisnall return __c.imag(); 8437a984708SDavid Chisnall} 8447a984708SDavid Chisnall 8457a984708SDavid Chisnalltemplate <class _Tp> 8464f7ab58eSDimitry Andricinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 847aed8d94eSDimitry Andrictypename __libcpp_complex_overload_traits<_Tp>::_ValueType 848aed8d94eSDimitry Andricimag(_Tp) 8497a984708SDavid Chisnall{ 8507a984708SDavid Chisnall return 0; 8517a984708SDavid Chisnall} 8527a984708SDavid Chisnall 8537a984708SDavid Chisnall// abs 8547a984708SDavid Chisnall 8557a984708SDavid Chisnalltemplate<class _Tp> 8567a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY 8577a984708SDavid Chisnall_Tp 8587a984708SDavid Chisnallabs(const complex<_Tp>& __c) 8597a984708SDavid Chisnall{ 8607a984708SDavid Chisnall return hypot(__c.real(), __c.imag()); 8617a984708SDavid Chisnall} 8627a984708SDavid Chisnall 8637a984708SDavid Chisnall// arg 8647a984708SDavid Chisnall 8657a984708SDavid Chisnalltemplate<class _Tp> 8667a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY 8677a984708SDavid Chisnall_Tp 8687a984708SDavid Chisnallarg(const complex<_Tp>& __c) 8697a984708SDavid Chisnall{ 8707a984708SDavid Chisnall return atan2(__c.imag(), __c.real()); 8717a984708SDavid Chisnall} 8727a984708SDavid Chisnall 873aed8d94eSDimitry Andrictemplate <class _Tp> 8747a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY 875aed8d94eSDimitry Andrictypename enable_if< 876aed8d94eSDimitry Andric is_same<_Tp, long double>::value, 8777a984708SDavid Chisnall long double 878aed8d94eSDimitry Andric>::type 879aed8d94eSDimitry Andricarg(_Tp __re) 8807a984708SDavid Chisnall{ 8817a984708SDavid Chisnall return atan2l(0.L, __re); 8827a984708SDavid Chisnall} 8837a984708SDavid Chisnall 8847a984708SDavid Chisnalltemplate<class _Tp> 8857a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY 8867a984708SDavid Chisnalltypename enable_if 8877a984708SDavid Chisnall< 888aed8d94eSDimitry Andric is_integral<_Tp>::value || is_same<_Tp, double>::value, 8897a984708SDavid Chisnall double 8907a984708SDavid Chisnall>::type 8917a984708SDavid Chisnallarg(_Tp __re) 8927a984708SDavid Chisnall{ 8937a984708SDavid Chisnall return atan2(0., __re); 8947a984708SDavid Chisnall} 8957a984708SDavid Chisnall 896aed8d94eSDimitry Andrictemplate <class _Tp> 8977a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY 898aed8d94eSDimitry Andrictypename enable_if< 899aed8d94eSDimitry Andric is_same<_Tp, float>::value, 9007a984708SDavid Chisnall float 901aed8d94eSDimitry Andric>::type 902aed8d94eSDimitry Andricarg(_Tp __re) 9037a984708SDavid Chisnall{ 9047a984708SDavid Chisnall return atan2f(0.F, __re); 9057a984708SDavid Chisnall} 9067a984708SDavid Chisnall 9077a984708SDavid Chisnall// norm 9087a984708SDavid Chisnall 9097a984708SDavid Chisnalltemplate<class _Tp> 9107a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY 9117a984708SDavid Chisnall_Tp 9127a984708SDavid Chisnallnorm(const complex<_Tp>& __c) 9137a984708SDavid Chisnall{ 914c4394386SDimitry Andric if (__libcpp_isinf_or_builtin(__c.real())) 9157a984708SDavid Chisnall return abs(__c.real()); 916c4394386SDimitry Andric if (__libcpp_isinf_or_builtin(__c.imag())) 9177a984708SDavid Chisnall return abs(__c.imag()); 9187a984708SDavid Chisnall return __c.real() * __c.real() + __c.imag() * __c.imag(); 9197a984708SDavid Chisnall} 9207a984708SDavid Chisnall 9217a984708SDavid Chisnalltemplate <class _Tp> 9227a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY 923aed8d94eSDimitry Andrictypename __libcpp_complex_overload_traits<_Tp>::_ValueType 9247a984708SDavid Chisnallnorm(_Tp __re) 9257a984708SDavid Chisnall{ 926aed8d94eSDimitry Andric typedef typename __libcpp_complex_overload_traits<_Tp>::_ValueType _ValueType; 927aed8d94eSDimitry Andric return static_cast<_ValueType>(__re) * __re; 9287a984708SDavid Chisnall} 9297a984708SDavid Chisnall 9307a984708SDavid Chisnall// conj 9317a984708SDavid Chisnall 9327a984708SDavid Chisnalltemplate<class _Tp> 9337a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY 9347a984708SDavid Chisnallcomplex<_Tp> 9357a984708SDavid Chisnallconj(const complex<_Tp>& __c) 9367a984708SDavid Chisnall{ 9377a984708SDavid Chisnall return complex<_Tp>(__c.real(), -__c.imag()); 9387a984708SDavid Chisnall} 9397a984708SDavid Chisnall 9407a984708SDavid Chisnalltemplate <class _Tp> 9417a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY 942aed8d94eSDimitry Andrictypename __libcpp_complex_overload_traits<_Tp>::_ComplexType 9437a984708SDavid Chisnallconj(_Tp __re) 9447a984708SDavid Chisnall{ 945aed8d94eSDimitry Andric typedef typename __libcpp_complex_overload_traits<_Tp>::_ComplexType _ComplexType; 946aed8d94eSDimitry Andric return _ComplexType(__re); 9477a984708SDavid Chisnall} 9487a984708SDavid Chisnall 949aed8d94eSDimitry Andric 9507a984708SDavid Chisnall 9517a984708SDavid Chisnall// proj 9527a984708SDavid Chisnall 9537a984708SDavid Chisnalltemplate<class _Tp> 9547a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY 9557a984708SDavid Chisnallcomplex<_Tp> 9567a984708SDavid Chisnallproj(const complex<_Tp>& __c) 9577a984708SDavid Chisnall{ 9587a984708SDavid Chisnall std::complex<_Tp> __r = __c; 959c4394386SDimitry Andric if (__libcpp_isinf_or_builtin(__c.real()) || __libcpp_isinf_or_builtin(__c.imag())) 9607a984708SDavid Chisnall __r = complex<_Tp>(INFINITY, copysign(_Tp(0), __c.imag())); 9617a984708SDavid Chisnall return __r; 9627a984708SDavid Chisnall} 9637a984708SDavid Chisnall 964aed8d94eSDimitry Andrictemplate <class _Tp> 9657a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY 966aed8d94eSDimitry Andrictypename enable_if 967aed8d94eSDimitry Andric< 968aed8d94eSDimitry Andric is_floating_point<_Tp>::value, 969aed8d94eSDimitry Andric typename __libcpp_complex_overload_traits<_Tp>::_ComplexType 970aed8d94eSDimitry Andric>::type 971aed8d94eSDimitry Andricproj(_Tp __re) 9727a984708SDavid Chisnall{ 973c4394386SDimitry Andric if (__libcpp_isinf_or_builtin(__re)) 9747a984708SDavid Chisnall __re = abs(__re); 975aed8d94eSDimitry Andric return complex<_Tp>(__re); 9767a984708SDavid Chisnall} 9777a984708SDavid Chisnall 9787a984708SDavid Chisnalltemplate <class _Tp> 9797a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY 9807a984708SDavid Chisnalltypename enable_if 9817a984708SDavid Chisnall< 9827a984708SDavid Chisnall is_integral<_Tp>::value, 983aed8d94eSDimitry Andric typename __libcpp_complex_overload_traits<_Tp>::_ComplexType 9847a984708SDavid Chisnall>::type 9857a984708SDavid Chisnallproj(_Tp __re) 9867a984708SDavid Chisnall{ 987aed8d94eSDimitry Andric typedef typename __libcpp_complex_overload_traits<_Tp>::_ComplexType _ComplexType; 988aed8d94eSDimitry Andric return _ComplexType(__re); 9897a984708SDavid Chisnall} 9907a984708SDavid Chisnall 9917a984708SDavid Chisnall// polar 9927a984708SDavid Chisnall 9937a984708SDavid Chisnalltemplate<class _Tp> 9947a984708SDavid Chisnallcomplex<_Tp> 9954ba319b5SDimitry Andricpolar(const _Tp& __rho, const _Tp& __theta = _Tp()) 9967a984708SDavid Chisnall{ 997c4394386SDimitry Andric if (__libcpp_isnan_or_builtin(__rho) || signbit(__rho)) 9987a984708SDavid Chisnall return complex<_Tp>(_Tp(NAN), _Tp(NAN)); 999c4394386SDimitry Andric if (__libcpp_isnan_or_builtin(__theta)) 10007a984708SDavid Chisnall { 1001c4394386SDimitry Andric if (__libcpp_isinf_or_builtin(__rho)) 10027a984708SDavid Chisnall return complex<_Tp>(__rho, __theta); 10037a984708SDavid Chisnall return complex<_Tp>(__theta, __theta); 10047a984708SDavid Chisnall } 1005c4394386SDimitry Andric if (__libcpp_isinf_or_builtin(__theta)) 10067a984708SDavid Chisnall { 1007c4394386SDimitry Andric if (__libcpp_isinf_or_builtin(__rho)) 10087a984708SDavid Chisnall return complex<_Tp>(__rho, _Tp(NAN)); 10097a984708SDavid Chisnall return complex<_Tp>(_Tp(NAN), _Tp(NAN)); 10107a984708SDavid Chisnall } 10117a984708SDavid Chisnall _Tp __x = __rho * cos(__theta); 1012c4394386SDimitry Andric if (__libcpp_isnan_or_builtin(__x)) 10137a984708SDavid Chisnall __x = 0; 10147a984708SDavid Chisnall _Tp __y = __rho * sin(__theta); 1015c4394386SDimitry Andric if (__libcpp_isnan_or_builtin(__y)) 10167a984708SDavid Chisnall __y = 0; 10177a984708SDavid Chisnall return complex<_Tp>(__x, __y); 10187a984708SDavid Chisnall} 10197a984708SDavid Chisnall 10207a984708SDavid Chisnall// log 10217a984708SDavid Chisnall 10227a984708SDavid Chisnalltemplate<class _Tp> 10237a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY 10247a984708SDavid Chisnallcomplex<_Tp> 10257a984708SDavid Chisnalllog(const complex<_Tp>& __x) 10267a984708SDavid Chisnall{ 10277a984708SDavid Chisnall return complex<_Tp>(log(abs(__x)), arg(__x)); 10287a984708SDavid Chisnall} 10297a984708SDavid Chisnall 10307a984708SDavid Chisnall// log10 10317a984708SDavid Chisnall 10327a984708SDavid Chisnalltemplate<class _Tp> 10337a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY 10347a984708SDavid Chisnallcomplex<_Tp> 10357a984708SDavid Chisnalllog10(const complex<_Tp>& __x) 10367a984708SDavid Chisnall{ 10377a984708SDavid Chisnall return log(__x) / log(_Tp(10)); 10387a984708SDavid Chisnall} 10397a984708SDavid Chisnall 10407a984708SDavid Chisnall// sqrt 10417a984708SDavid Chisnall 10427a984708SDavid Chisnalltemplate<class _Tp> 10437a984708SDavid Chisnallcomplex<_Tp> 10447a984708SDavid Chisnallsqrt(const complex<_Tp>& __x) 10457a984708SDavid Chisnall{ 1046c4394386SDimitry Andric if (__libcpp_isinf_or_builtin(__x.imag())) 10477a984708SDavid Chisnall return complex<_Tp>(_Tp(INFINITY), __x.imag()); 1048c4394386SDimitry Andric if (__libcpp_isinf_or_builtin(__x.real())) 10497a984708SDavid Chisnall { 10507a984708SDavid Chisnall if (__x.real() > _Tp(0)) 1051c4394386SDimitry Andric return complex<_Tp>(__x.real(), __libcpp_isnan_or_builtin(__x.imag()) ? __x.imag() : copysign(_Tp(0), __x.imag())); 1052c4394386SDimitry Andric return complex<_Tp>(__libcpp_isnan_or_builtin(__x.imag()) ? __x.imag() : _Tp(0), copysign(__x.real(), __x.imag())); 10537a984708SDavid Chisnall } 10547a984708SDavid Chisnall return polar(sqrt(abs(__x)), arg(__x) / _Tp(2)); 10557a984708SDavid Chisnall} 10567a984708SDavid Chisnall 10577a984708SDavid Chisnall// exp 10587a984708SDavid Chisnall 10597a984708SDavid Chisnalltemplate<class _Tp> 10607a984708SDavid Chisnallcomplex<_Tp> 10617a984708SDavid Chisnallexp(const complex<_Tp>& __x) 10627a984708SDavid Chisnall{ 10637a984708SDavid Chisnall _Tp __i = __x.imag(); 1064c4394386SDimitry Andric if (__libcpp_isinf_or_builtin(__x.real())) 10657a984708SDavid Chisnall { 10667a984708SDavid Chisnall if (__x.real() < _Tp(0)) 10677a984708SDavid Chisnall { 1068c4394386SDimitry Andric if (!__libcpp_isfinite_or_builtin(__i)) 10697a984708SDavid Chisnall __i = _Tp(1); 10707a984708SDavid Chisnall } 1071c4394386SDimitry Andric else if (__i == 0 || !__libcpp_isfinite_or_builtin(__i)) 10727a984708SDavid Chisnall { 1073c4394386SDimitry Andric if (__libcpp_isinf_or_builtin(__i)) 10747a984708SDavid Chisnall __i = _Tp(NAN); 10757a984708SDavid Chisnall return complex<_Tp>(__x.real(), __i); 10767a984708SDavid Chisnall } 10777a984708SDavid Chisnall } 1078c4394386SDimitry Andric else if (__libcpp_isnan_or_builtin(__x.real()) && __x.imag() == 0) 10797a984708SDavid Chisnall return __x; 10807a984708SDavid Chisnall _Tp __e = exp(__x.real()); 10817a984708SDavid Chisnall return complex<_Tp>(__e * cos(__i), __e * sin(__i)); 10827a984708SDavid Chisnall} 10837a984708SDavid Chisnall 10847a984708SDavid Chisnall// pow 10857a984708SDavid Chisnall 10867a984708SDavid Chisnalltemplate<class _Tp> 10877a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY 10887a984708SDavid Chisnallcomplex<_Tp> 10897a984708SDavid Chisnallpow(const complex<_Tp>& __x, const complex<_Tp>& __y) 10907a984708SDavid Chisnall{ 10917a984708SDavid Chisnall return exp(__y * log(__x)); 10927a984708SDavid Chisnall} 10937a984708SDavid Chisnall 10947a984708SDavid Chisnalltemplate<class _Tp, class _Up> 10957a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY 10967a984708SDavid Chisnallcomplex<typename __promote<_Tp, _Up>::type> 10977a984708SDavid Chisnallpow(const complex<_Tp>& __x, const complex<_Up>& __y) 10987a984708SDavid Chisnall{ 10997a984708SDavid Chisnall typedef complex<typename __promote<_Tp, _Up>::type> result_type; 11007a984708SDavid Chisnall return _VSTD::pow(result_type(__x), result_type(__y)); 11017a984708SDavid Chisnall} 11027a984708SDavid Chisnall 11037a984708SDavid Chisnalltemplate<class _Tp, class _Up> 11047a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY 11057a984708SDavid Chisnalltypename enable_if 11067a984708SDavid Chisnall< 11077a984708SDavid Chisnall is_arithmetic<_Up>::value, 11087a984708SDavid Chisnall complex<typename __promote<_Tp, _Up>::type> 11097a984708SDavid Chisnall>::type 11107a984708SDavid Chisnallpow(const complex<_Tp>& __x, const _Up& __y) 11117a984708SDavid Chisnall{ 11127a984708SDavid Chisnall typedef complex<typename __promote<_Tp, _Up>::type> result_type; 11137a984708SDavid Chisnall return _VSTD::pow(result_type(__x), result_type(__y)); 11147a984708SDavid Chisnall} 11157a984708SDavid Chisnall 11167a984708SDavid Chisnalltemplate<class _Tp, class _Up> 11177a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY 11187a984708SDavid Chisnalltypename enable_if 11197a984708SDavid Chisnall< 11207a984708SDavid Chisnall is_arithmetic<_Tp>::value, 11217a984708SDavid Chisnall complex<typename __promote<_Tp, _Up>::type> 11227a984708SDavid Chisnall>::type 11237a984708SDavid Chisnallpow(const _Tp& __x, const complex<_Up>& __y) 11247a984708SDavid Chisnall{ 11257a984708SDavid Chisnall typedef complex<typename __promote<_Tp, _Up>::type> result_type; 11267a984708SDavid Chisnall return _VSTD::pow(result_type(__x), result_type(__y)); 11277a984708SDavid Chisnall} 11287a984708SDavid Chisnall 11294ba319b5SDimitry Andric// __sqr, computes pow(x, 2) 11304ba319b5SDimitry Andric 11314ba319b5SDimitry Andrictemplate<class _Tp> 11324ba319b5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY 11334ba319b5SDimitry Andriccomplex<_Tp> 11344ba319b5SDimitry Andric__sqr(const complex<_Tp>& __x) 11354ba319b5SDimitry Andric{ 11364ba319b5SDimitry Andric return complex<_Tp>((__x.real() - __x.imag()) * (__x.real() + __x.imag()), 11374ba319b5SDimitry Andric _Tp(2) * __x.real() * __x.imag()); 11384ba319b5SDimitry Andric} 11394ba319b5SDimitry Andric 11407a984708SDavid Chisnall// asinh 11417a984708SDavid Chisnall 11427a984708SDavid Chisnalltemplate<class _Tp> 11437a984708SDavid Chisnallcomplex<_Tp> 11447a984708SDavid Chisnallasinh(const complex<_Tp>& __x) 11457a984708SDavid Chisnall{ 11467a984708SDavid Chisnall const _Tp __pi(atan2(+0., -0.)); 1147c4394386SDimitry Andric if (__libcpp_isinf_or_builtin(__x.real())) 11487a984708SDavid Chisnall { 1149c4394386SDimitry Andric if (__libcpp_isnan_or_builtin(__x.imag())) 11507a984708SDavid Chisnall return __x; 1151c4394386SDimitry Andric if (__libcpp_isinf_or_builtin(__x.imag())) 11527a984708SDavid Chisnall return complex<_Tp>(__x.real(), copysign(__pi * _Tp(0.25), __x.imag())); 11537a984708SDavid Chisnall return complex<_Tp>(__x.real(), copysign(_Tp(0), __x.imag())); 11547a984708SDavid Chisnall } 1155c4394386SDimitry Andric if (__libcpp_isnan_or_builtin(__x.real())) 11567a984708SDavid Chisnall { 1157c4394386SDimitry Andric if (__libcpp_isinf_or_builtin(__x.imag())) 11587a984708SDavid Chisnall return complex<_Tp>(__x.imag(), __x.real()); 11597a984708SDavid Chisnall if (__x.imag() == 0) 11607a984708SDavid Chisnall return __x; 11617a984708SDavid Chisnall return complex<_Tp>(__x.real(), __x.real()); 11627a984708SDavid Chisnall } 1163c4394386SDimitry Andric if (__libcpp_isinf_or_builtin(__x.imag())) 11647a984708SDavid Chisnall return complex<_Tp>(copysign(__x.imag(), __x.real()), copysign(__pi/_Tp(2), __x.imag())); 11654ba319b5SDimitry Andric complex<_Tp> __z = log(__x + sqrt(__sqr(__x) + _Tp(1))); 11667a984708SDavid Chisnall return complex<_Tp>(copysign(__z.real(), __x.real()), copysign(__z.imag(), __x.imag())); 11677a984708SDavid Chisnall} 11687a984708SDavid Chisnall 11697a984708SDavid Chisnall// acosh 11707a984708SDavid Chisnall 11717a984708SDavid Chisnalltemplate<class _Tp> 11727a984708SDavid Chisnallcomplex<_Tp> 11737a984708SDavid Chisnallacosh(const complex<_Tp>& __x) 11747a984708SDavid Chisnall{ 11757a984708SDavid Chisnall const _Tp __pi(atan2(+0., -0.)); 1176c4394386SDimitry Andric if (__libcpp_isinf_or_builtin(__x.real())) 11777a984708SDavid Chisnall { 1178c4394386SDimitry Andric if (__libcpp_isnan_or_builtin(__x.imag())) 11797a984708SDavid Chisnall return complex<_Tp>(abs(__x.real()), __x.imag()); 1180c4394386SDimitry Andric if (__libcpp_isinf_or_builtin(__x.imag())) 11811e0896acSDavid Chisnall { 11827a984708SDavid Chisnall if (__x.real() > 0) 11837a984708SDavid Chisnall return complex<_Tp>(__x.real(), copysign(__pi * _Tp(0.25), __x.imag())); 11847a984708SDavid Chisnall else 11857a984708SDavid Chisnall return complex<_Tp>(-__x.real(), copysign(__pi * _Tp(0.75), __x.imag())); 11861e0896acSDavid Chisnall } 11877a984708SDavid Chisnall if (__x.real() < 0) 11887a984708SDavid Chisnall return complex<_Tp>(-__x.real(), copysign(__pi, __x.imag())); 11897a984708SDavid Chisnall return complex<_Tp>(__x.real(), copysign(_Tp(0), __x.imag())); 11907a984708SDavid Chisnall } 1191c4394386SDimitry Andric if (__libcpp_isnan_or_builtin(__x.real())) 11927a984708SDavid Chisnall { 1193c4394386SDimitry Andric if (__libcpp_isinf_or_builtin(__x.imag())) 11947a984708SDavid Chisnall return complex<_Tp>(abs(__x.imag()), __x.real()); 11957a984708SDavid Chisnall return complex<_Tp>(__x.real(), __x.real()); 11967a984708SDavid Chisnall } 1197c4394386SDimitry Andric if (__libcpp_isinf_or_builtin(__x.imag())) 11987a984708SDavid Chisnall return complex<_Tp>(abs(__x.imag()), copysign(__pi/_Tp(2), __x.imag())); 11994ba319b5SDimitry Andric complex<_Tp> __z = log(__x + sqrt(__sqr(__x) - _Tp(1))); 12007a984708SDavid Chisnall return complex<_Tp>(copysign(__z.real(), _Tp(0)), copysign(__z.imag(), __x.imag())); 12017a984708SDavid Chisnall} 12027a984708SDavid Chisnall 12037a984708SDavid Chisnall// atanh 12047a984708SDavid Chisnall 12057a984708SDavid Chisnalltemplate<class _Tp> 12067a984708SDavid Chisnallcomplex<_Tp> 12077a984708SDavid Chisnallatanh(const complex<_Tp>& __x) 12087a984708SDavid Chisnall{ 12097a984708SDavid Chisnall const _Tp __pi(atan2(+0., -0.)); 1210c4394386SDimitry Andric if (__libcpp_isinf_or_builtin(__x.imag())) 12117a984708SDavid Chisnall { 12127a984708SDavid Chisnall return complex<_Tp>(copysign(_Tp(0), __x.real()), copysign(__pi/_Tp(2), __x.imag())); 12137a984708SDavid Chisnall } 1214c4394386SDimitry Andric if (__libcpp_isnan_or_builtin(__x.imag())) 12157a984708SDavid Chisnall { 1216c4394386SDimitry Andric if (__libcpp_isinf_or_builtin(__x.real()) || __x.real() == 0) 12177a984708SDavid Chisnall return complex<_Tp>(copysign(_Tp(0), __x.real()), __x.imag()); 12187a984708SDavid Chisnall return complex<_Tp>(__x.imag(), __x.imag()); 12197a984708SDavid Chisnall } 1220c4394386SDimitry Andric if (__libcpp_isnan_or_builtin(__x.real())) 12217a984708SDavid Chisnall { 12227a984708SDavid Chisnall return complex<_Tp>(__x.real(), __x.real()); 12237a984708SDavid Chisnall } 1224c4394386SDimitry Andric if (__libcpp_isinf_or_builtin(__x.real())) 12257a984708SDavid Chisnall { 12267a984708SDavid Chisnall return complex<_Tp>(copysign(_Tp(0), __x.real()), copysign(__pi/_Tp(2), __x.imag())); 12277a984708SDavid Chisnall } 12287a984708SDavid Chisnall if (abs(__x.real()) == _Tp(1) && __x.imag() == _Tp(0)) 12297a984708SDavid Chisnall { 12307a984708SDavid Chisnall return complex<_Tp>(copysign(_Tp(INFINITY), __x.real()), copysign(_Tp(0), __x.imag())); 12317a984708SDavid Chisnall } 12327a984708SDavid Chisnall complex<_Tp> __z = log((_Tp(1) + __x) / (_Tp(1) - __x)) / _Tp(2); 12337a984708SDavid Chisnall return complex<_Tp>(copysign(__z.real(), __x.real()), copysign(__z.imag(), __x.imag())); 12347a984708SDavid Chisnall} 12357a984708SDavid Chisnall 12367a984708SDavid Chisnall// sinh 12377a984708SDavid Chisnall 12387a984708SDavid Chisnalltemplate<class _Tp> 12397a984708SDavid Chisnallcomplex<_Tp> 12407a984708SDavid Chisnallsinh(const complex<_Tp>& __x) 12417a984708SDavid Chisnall{ 1242c4394386SDimitry Andric if (__libcpp_isinf_or_builtin(__x.real()) && !__libcpp_isfinite_or_builtin(__x.imag())) 12437a984708SDavid Chisnall return complex<_Tp>(__x.real(), _Tp(NAN)); 1244c4394386SDimitry Andric if (__x.real() == 0 && !__libcpp_isfinite_or_builtin(__x.imag())) 12457a984708SDavid Chisnall return complex<_Tp>(__x.real(), _Tp(NAN)); 1246c4394386SDimitry Andric if (__x.imag() == 0 && !__libcpp_isfinite_or_builtin(__x.real())) 12477a984708SDavid Chisnall return __x; 12487a984708SDavid Chisnall return complex<_Tp>(sinh(__x.real()) * cos(__x.imag()), cosh(__x.real()) * sin(__x.imag())); 12497a984708SDavid Chisnall} 12507a984708SDavid Chisnall 12517a984708SDavid Chisnall// cosh 12527a984708SDavid Chisnall 12537a984708SDavid Chisnalltemplate<class _Tp> 12547a984708SDavid Chisnallcomplex<_Tp> 12557a984708SDavid Chisnallcosh(const complex<_Tp>& __x) 12567a984708SDavid Chisnall{ 1257c4394386SDimitry Andric if (__libcpp_isinf_or_builtin(__x.real()) && !__libcpp_isfinite_or_builtin(__x.imag())) 12587a984708SDavid Chisnall return complex<_Tp>(abs(__x.real()), _Tp(NAN)); 1259c4394386SDimitry Andric if (__x.real() == 0 && !__libcpp_isfinite_or_builtin(__x.imag())) 12607a984708SDavid Chisnall return complex<_Tp>(_Tp(NAN), __x.real()); 12617a984708SDavid Chisnall if (__x.real() == 0 && __x.imag() == 0) 12627a984708SDavid Chisnall return complex<_Tp>(_Tp(1), __x.imag()); 1263c4394386SDimitry Andric if (__x.imag() == 0 && !__libcpp_isfinite_or_builtin(__x.real())) 12647a984708SDavid Chisnall return complex<_Tp>(abs(__x.real()), __x.imag()); 12657a984708SDavid Chisnall return complex<_Tp>(cosh(__x.real()) * cos(__x.imag()), sinh(__x.real()) * sin(__x.imag())); 12667a984708SDavid Chisnall} 12677a984708SDavid Chisnall 12687a984708SDavid Chisnall// tanh 12697a984708SDavid Chisnall 12707a984708SDavid Chisnalltemplate<class _Tp> 12717a984708SDavid Chisnallcomplex<_Tp> 12727a984708SDavid Chisnalltanh(const complex<_Tp>& __x) 12737a984708SDavid Chisnall{ 1274c4394386SDimitry Andric if (__libcpp_isinf_or_builtin(__x.real())) 12757a984708SDavid Chisnall { 1276c4394386SDimitry Andric if (!__libcpp_isfinite_or_builtin(__x.imag())) 12777a984708SDavid Chisnall return complex<_Tp>(_Tp(1), _Tp(0)); 12787a984708SDavid Chisnall return complex<_Tp>(_Tp(1), copysign(_Tp(0), sin(_Tp(2) * __x.imag()))); 12797a984708SDavid Chisnall } 1280c4394386SDimitry Andric if (__libcpp_isnan_or_builtin(__x.real()) && __x.imag() == 0) 12817a984708SDavid Chisnall return __x; 12827a984708SDavid Chisnall _Tp __2r(_Tp(2) * __x.real()); 12837a984708SDavid Chisnall _Tp __2i(_Tp(2) * __x.imag()); 12847a984708SDavid Chisnall _Tp __d(cosh(__2r) + cos(__2i)); 1285936e9439SDimitry Andric _Tp __2rsh(sinh(__2r)); 1286c4394386SDimitry Andric if (__libcpp_isinf_or_builtin(__2rsh) && __libcpp_isinf_or_builtin(__d)) 1287936e9439SDimitry Andric return complex<_Tp>(__2rsh > _Tp(0) ? _Tp(1) : _Tp(-1), 1288936e9439SDimitry Andric __2i > _Tp(0) ? _Tp(0) : _Tp(-0.)); 1289936e9439SDimitry Andric return complex<_Tp>(__2rsh/__d, sin(__2i)/__d); 12907a984708SDavid Chisnall} 12917a984708SDavid Chisnall 12927a984708SDavid Chisnall// asin 12937a984708SDavid Chisnall 12947a984708SDavid Chisnalltemplate<class _Tp> 12957a984708SDavid Chisnallcomplex<_Tp> 12967a984708SDavid Chisnallasin(const complex<_Tp>& __x) 12977a984708SDavid Chisnall{ 12987a984708SDavid Chisnall complex<_Tp> __z = asinh(complex<_Tp>(-__x.imag(), __x.real())); 12997a984708SDavid Chisnall return complex<_Tp>(__z.imag(), -__z.real()); 13007a984708SDavid Chisnall} 13017a984708SDavid Chisnall 13027a984708SDavid Chisnall// acos 13037a984708SDavid Chisnall 13047a984708SDavid Chisnalltemplate<class _Tp> 13057a984708SDavid Chisnallcomplex<_Tp> 13067a984708SDavid Chisnallacos(const complex<_Tp>& __x) 13077a984708SDavid Chisnall{ 13087a984708SDavid Chisnall const _Tp __pi(atan2(+0., -0.)); 1309c4394386SDimitry Andric if (__libcpp_isinf_or_builtin(__x.real())) 13107a984708SDavid Chisnall { 1311c4394386SDimitry Andric if (__libcpp_isnan_or_builtin(__x.imag())) 13127a984708SDavid Chisnall return complex<_Tp>(__x.imag(), __x.real()); 1313c4394386SDimitry Andric if (__libcpp_isinf_or_builtin(__x.imag())) 13147a984708SDavid Chisnall { 13157a984708SDavid Chisnall if (__x.real() < _Tp(0)) 13167a984708SDavid Chisnall return complex<_Tp>(_Tp(0.75) * __pi, -__x.imag()); 13177a984708SDavid Chisnall return complex<_Tp>(_Tp(0.25) * __pi, -__x.imag()); 13187a984708SDavid Chisnall } 13197a984708SDavid Chisnall if (__x.real() < _Tp(0)) 13207a984708SDavid Chisnall return complex<_Tp>(__pi, signbit(__x.imag()) ? -__x.real() : __x.real()); 13217a984708SDavid Chisnall return complex<_Tp>(_Tp(0), signbit(__x.imag()) ? __x.real() : -__x.real()); 13227a984708SDavid Chisnall } 1323c4394386SDimitry Andric if (__libcpp_isnan_or_builtin(__x.real())) 13247a984708SDavid Chisnall { 1325c4394386SDimitry Andric if (__libcpp_isinf_or_builtin(__x.imag())) 13267a984708SDavid Chisnall return complex<_Tp>(__x.real(), -__x.imag()); 13277a984708SDavid Chisnall return complex<_Tp>(__x.real(), __x.real()); 13287a984708SDavid Chisnall } 1329c4394386SDimitry Andric if (__libcpp_isinf_or_builtin(__x.imag())) 13307a984708SDavid Chisnall return complex<_Tp>(__pi/_Tp(2), -__x.imag()); 13317c82a1ecSDimitry Andric if (__x.real() == 0 && (__x.imag() == 0 || isnan(__x.imag()))) 13327a984708SDavid Chisnall return complex<_Tp>(__pi/_Tp(2), -__x.imag()); 13334ba319b5SDimitry Andric complex<_Tp> __z = log(__x + sqrt(__sqr(__x) - _Tp(1))); 13347a984708SDavid Chisnall if (signbit(__x.imag())) 13357a984708SDavid Chisnall return complex<_Tp>(abs(__z.imag()), abs(__z.real())); 13367a984708SDavid Chisnall return complex<_Tp>(abs(__z.imag()), -abs(__z.real())); 13377a984708SDavid Chisnall} 13387a984708SDavid Chisnall 13397a984708SDavid Chisnall// atan 13407a984708SDavid Chisnall 13417a984708SDavid Chisnalltemplate<class _Tp> 13427a984708SDavid Chisnallcomplex<_Tp> 13437a984708SDavid Chisnallatan(const complex<_Tp>& __x) 13447a984708SDavid Chisnall{ 13457a984708SDavid Chisnall complex<_Tp> __z = atanh(complex<_Tp>(-__x.imag(), __x.real())); 13467a984708SDavid Chisnall return complex<_Tp>(__z.imag(), -__z.real()); 13477a984708SDavid Chisnall} 13487a984708SDavid Chisnall 13497a984708SDavid Chisnall// sin 13507a984708SDavid Chisnall 13517a984708SDavid Chisnalltemplate<class _Tp> 13527a984708SDavid Chisnallcomplex<_Tp> 13537a984708SDavid Chisnallsin(const complex<_Tp>& __x) 13547a984708SDavid Chisnall{ 13557a984708SDavid Chisnall complex<_Tp> __z = sinh(complex<_Tp>(-__x.imag(), __x.real())); 13567a984708SDavid Chisnall return complex<_Tp>(__z.imag(), -__z.real()); 13577a984708SDavid Chisnall} 13587a984708SDavid Chisnall 13597a984708SDavid Chisnall// cos 13607a984708SDavid Chisnall 13617a984708SDavid Chisnalltemplate<class _Tp> 13627a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY 13637a984708SDavid Chisnallcomplex<_Tp> 13647a984708SDavid Chisnallcos(const complex<_Tp>& __x) 13657a984708SDavid Chisnall{ 13667a984708SDavid Chisnall return cosh(complex<_Tp>(-__x.imag(), __x.real())); 13677a984708SDavid Chisnall} 13687a984708SDavid Chisnall 13697a984708SDavid Chisnall// tan 13707a984708SDavid Chisnall 13717a984708SDavid Chisnalltemplate<class _Tp> 13727a984708SDavid Chisnallcomplex<_Tp> 13737a984708SDavid Chisnalltan(const complex<_Tp>& __x) 13747a984708SDavid Chisnall{ 13757a984708SDavid Chisnall complex<_Tp> __z = tanh(complex<_Tp>(-__x.imag(), __x.real())); 13767a984708SDavid Chisnall return complex<_Tp>(__z.imag(), -__z.real()); 13777a984708SDavid Chisnall} 13787a984708SDavid Chisnall 13797a984708SDavid Chisnalltemplate<class _Tp, class _CharT, class _Traits> 13807a984708SDavid Chisnallbasic_istream<_CharT, _Traits>& 13817a984708SDavid Chisnalloperator>>(basic_istream<_CharT, _Traits>& __is, complex<_Tp>& __x) 13827a984708SDavid Chisnall{ 13837a984708SDavid Chisnall if (__is.good()) 13847a984708SDavid Chisnall { 13857a984708SDavid Chisnall ws(__is); 13867a984708SDavid Chisnall if (__is.peek() == _CharT('(')) 13877a984708SDavid Chisnall { 13887a984708SDavid Chisnall __is.get(); 13897a984708SDavid Chisnall _Tp __r; 13907a984708SDavid Chisnall __is >> __r; 13917a984708SDavid Chisnall if (!__is.fail()) 13927a984708SDavid Chisnall { 13937a984708SDavid Chisnall ws(__is); 13947a984708SDavid Chisnall _CharT __c = __is.peek(); 13957a984708SDavid Chisnall if (__c == _CharT(',')) 13967a984708SDavid Chisnall { 13977a984708SDavid Chisnall __is.get(); 13987a984708SDavid Chisnall _Tp __i; 13997a984708SDavid Chisnall __is >> __i; 14007a984708SDavid Chisnall if (!__is.fail()) 14017a984708SDavid Chisnall { 14027a984708SDavid Chisnall ws(__is); 14037a984708SDavid Chisnall __c = __is.peek(); 14047a984708SDavid Chisnall if (__c == _CharT(')')) 14057a984708SDavid Chisnall { 14067a984708SDavid Chisnall __is.get(); 14077a984708SDavid Chisnall __x = complex<_Tp>(__r, __i); 14087a984708SDavid Chisnall } 14097a984708SDavid Chisnall else 14107a984708SDavid Chisnall __is.setstate(ios_base::failbit); 14117a984708SDavid Chisnall } 14127a984708SDavid Chisnall else 14137a984708SDavid Chisnall __is.setstate(ios_base::failbit); 14147a984708SDavid Chisnall } 14157a984708SDavid Chisnall else if (__c == _CharT(')')) 14167a984708SDavid Chisnall { 14177a984708SDavid Chisnall __is.get(); 14187a984708SDavid Chisnall __x = complex<_Tp>(__r, _Tp(0)); 14197a984708SDavid Chisnall } 14207a984708SDavid Chisnall else 14217a984708SDavid Chisnall __is.setstate(ios_base::failbit); 14227a984708SDavid Chisnall } 14237a984708SDavid Chisnall else 14247a984708SDavid Chisnall __is.setstate(ios_base::failbit); 14257a984708SDavid Chisnall } 14267a984708SDavid Chisnall else 14277a984708SDavid Chisnall { 14287a984708SDavid Chisnall _Tp __r; 14297a984708SDavid Chisnall __is >> __r; 14307a984708SDavid Chisnall if (!__is.fail()) 14317a984708SDavid Chisnall __x = complex<_Tp>(__r, _Tp(0)); 14327a984708SDavid Chisnall else 14337a984708SDavid Chisnall __is.setstate(ios_base::failbit); 14347a984708SDavid Chisnall } 14357a984708SDavid Chisnall } 14367a984708SDavid Chisnall else 14377a984708SDavid Chisnall __is.setstate(ios_base::failbit); 14387a984708SDavid Chisnall return __is; 14397a984708SDavid Chisnall} 14407a984708SDavid Chisnall 14417a984708SDavid Chisnalltemplate<class _Tp, class _CharT, class _Traits> 14427a984708SDavid Chisnallbasic_ostream<_CharT, _Traits>& 14437a984708SDavid Chisnalloperator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __x) 14447a984708SDavid Chisnall{ 14457a984708SDavid Chisnall basic_ostringstream<_CharT, _Traits> __s; 14467a984708SDavid Chisnall __s.flags(__os.flags()); 14477a984708SDavid Chisnall __s.imbue(__os.getloc()); 14487a984708SDavid Chisnall __s.precision(__os.precision()); 14497a984708SDavid Chisnall __s << '(' << __x.real() << ',' << __x.imag() << ')'; 14507a984708SDavid Chisnall return __os << __s.str(); 14517a984708SDavid Chisnall} 14527a984708SDavid Chisnall 14534f7ab58eSDimitry Andric#if _LIBCPP_STD_VER > 11 14544f7ab58eSDimitry Andric// Literal suffix for complex number literals [complex.literals] 14554f7ab58eSDimitry Andricinline namespace literals 14564f7ab58eSDimitry Andric{ 14574f7ab58eSDimitry Andric inline namespace complex_literals 14584f7ab58eSDimitry Andric { 14594f7ab58eSDimitry Andric constexpr complex<long double> operator""il(long double __im) 14604f7ab58eSDimitry Andric { 14614f7ab58eSDimitry Andric return { 0.0l, __im }; 14624f7ab58eSDimitry Andric } 14634f7ab58eSDimitry Andric 14644f7ab58eSDimitry Andric constexpr complex<long double> operator""il(unsigned long long __im) 14654f7ab58eSDimitry Andric { 14664f7ab58eSDimitry Andric return { 0.0l, static_cast<long double>(__im) }; 14674f7ab58eSDimitry Andric } 14684f7ab58eSDimitry Andric 14694f7ab58eSDimitry Andric 14704f7ab58eSDimitry Andric constexpr complex<double> operator""i(long double __im) 14714f7ab58eSDimitry Andric { 14724f7ab58eSDimitry Andric return { 0.0, static_cast<double>(__im) }; 14734f7ab58eSDimitry Andric } 14744f7ab58eSDimitry Andric 14754f7ab58eSDimitry Andric constexpr complex<double> operator""i(unsigned long long __im) 14764f7ab58eSDimitry Andric { 14774f7ab58eSDimitry Andric return { 0.0, static_cast<double>(__im) }; 14784f7ab58eSDimitry Andric } 14794f7ab58eSDimitry Andric 14804f7ab58eSDimitry Andric 14814f7ab58eSDimitry Andric constexpr complex<float> operator""if(long double __im) 14824f7ab58eSDimitry Andric { 14834f7ab58eSDimitry Andric return { 0.0f, static_cast<float>(__im) }; 14844f7ab58eSDimitry Andric } 14854f7ab58eSDimitry Andric 14864f7ab58eSDimitry Andric constexpr complex<float> operator""if(unsigned long long __im) 14874f7ab58eSDimitry Andric { 14884f7ab58eSDimitry Andric return { 0.0f, static_cast<float>(__im) }; 14894f7ab58eSDimitry Andric } 14904f7ab58eSDimitry Andric } 14914f7ab58eSDimitry Andric} 14924f7ab58eSDimitry Andric#endif 14934f7ab58eSDimitry Andric 14947a984708SDavid Chisnall_LIBCPP_END_NAMESPACE_STD 14957a984708SDavid Chisnall 14967a984708SDavid Chisnall#endif // _LIBCPP_COMPLEX 1497