diff options
author | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-05-22 11:44:00 +0000 |
---|---|---|
committer | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-05-22 11:44:00 +0000 |
commit | df2fcd57a0d36fe257b6e75ee53cd1ac953f04d7 (patch) | |
tree | 9e2d6af57d9f02cf4dc711a80839eb7e6dac1cf7 /libstdc++-v3/include/std/complex | |
parent | 8aee17d5b2c7300749620cfd7f2fcb421070c990 (diff) | |
download | gcc-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/complex | 54 |
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 */ |