summaryrefslogtreecommitdiff
path: root/libstdc++-v3/include/std/complex
diff options
context:
space:
mode:
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2008-05-22 11:44:00 +0000
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2008-05-22 11:44:00 +0000
commitdf2fcd57a0d36fe257b6e75ee53cd1ac953f04d7 (patch)
tree9e2d6af57d9f02cf4dc711a80839eb7e6dac1cf7 /libstdc++-v3/include/std/complex
parent8aee17d5b2c7300749620cfd7f2fcb421070c990 (diff)
downloadgcc-df2fcd57a0d36fe257b6e75ee53cd1ac953f04d7.tar.gz
2008-05-22 Paolo Carlini <paolo.carlini@oracle.com>
* include/std/complex (proj(const std::complex<>&), proj(_Tp)): Add per DR 781. * include/tr1_impl/complex(polar(const _Tp&, const _Up&)): Move to... * include/tr1/complex: ... here. * doc/xml/manual/intro.xml: Add an entry for DR 781. * testsuite/26_numerics/complex/dr781.cc: Add. * acinclude.m4 ([GLIBCXX_ENABLE_C99]): Update. * configure: Regenerate. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@135757 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/include/std/complex')
-rw-r--r--libstdc++-v3/include/std/complex54
1 files changed, 53 insertions, 1 deletions
diff --git a/libstdc++-v3/include/std/complex b/libstdc++-v3/include/std/complex
index f2d9e9346ee..e3feef0918f 100644
--- a/libstdc++-v3/include/std/complex
+++ b/libstdc++-v3/include/std/complex
@@ -1,7 +1,7 @@
// The template and inlines for the -*- C++ -*- complex number classes.
// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
-// 2006, 2007
+// 2006, 2007, 2008
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@@ -1552,6 +1552,58 @@ _GLIBCXX_END_NAMESPACE
# undef _GLIBCXX_BEGIN_NAMESPACE_TR1
# undef _GLIBCXX_INCLUDE_AS_CXX0X
# endif
+
+_GLIBCXX_BEGIN_NAMESPACE(std)
+
+ // Forward declarations.
+ // DR 781.
+ template<typename _Tp> std::complex<_Tp> proj(const std::complex<_Tp>&);
+
+ template<typename _Tp>
+ std::complex<_Tp>
+ __complex_proj(const std::complex<_Tp>& __z)
+ {
+ const _Tp __den = (__z.real() * __z.real()
+ + __z.imag() * __z.imag() + _Tp(1.0));
+
+ return std::complex<_Tp>((_Tp(2.0) * __z.real()) / __den,
+ (_Tp(2.0) * __z.imag()) / __den);
+ }
+
+#if _GLIBCXX_USE_C99_COMPLEX
+ inline __complex__ float
+ __complex_proj(__complex__ float __z)
+ { return __builtin_cprojf(__z); }
+
+ inline __complex__ double
+ __complex_proj(__complex__ double __z)
+ { return __builtin_cproj(__z); }
+
+ inline __complex__ long double
+ __complex_proj(const __complex__ long double& __z)
+ { return __builtin_cprojl(__z); }
+
+ template<typename _Tp>
+ inline std::complex<_Tp>
+ proj(const std::complex<_Tp>& __z)
+ { return __complex_proj(__z.__rep()); }
+#else
+ template<typename _Tp>
+ inline std::complex<_Tp>
+ proj(const std::complex<_Tp>& __z)
+ { return __complex_proj(__z); }
+#endif
+
+ template<typename _Tp>
+ inline std::complex<typename __gnu_cxx::__promote<_Tp>::__type>
+ proj(_Tp __x)
+ {
+ typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
+ return std::proj(std::complex<__type>(__x));
+ }
+
+_GLIBCXX_END_NAMESPACE
+
#endif
#endif /* _GLIBCXX_COMPLEX */