xref: /freebsd-12.1/contrib/libc++/include/complex (revision b5893f02)
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