From 3cd54fc92dfe972cdf4969ea2426b6af3a2f6685 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Thu, 22 May 2008 11:44:00 +0000 Subject: [PATCH] complex (proj(const std::complex<>&), proj(_Tp)): Add per DR 781. 2008-05-22 Paolo Carlini * 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. From-SVN: r135757 --- libstdc++-v3/ChangeLog | 11 ++++ libstdc++-v3/acinclude.m4 | 3 + libstdc++-v3/configure | 6 ++ libstdc++-v3/doc/xml/manual/intro.xml | 6 ++ libstdc++-v3/include/std/complex | 54 ++++++++++++++++- libstdc++-v3/include/tr1/complex | 13 +++- libstdc++-v3/include/tr1_impl/complex | 20 ++----- .../testsuite/26_numerics/complex/dr781.cc | 60 +++++++++++++++++++ 8 files changed, 156 insertions(+), 17 deletions(-) create mode 100644 libstdc++-v3/testsuite/26_numerics/complex/dr781.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index e87402745f9..3b689a41f9c 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,14 @@ +2008-05-22 Paolo Carlini + + * 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. + 2008-05-21 Paolo Carlini * include/std/bitset (bitset<>::bitset(const char*)): Add per DR 778. diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4 index db3c7b19b25..a68ab9be2a8 100644 --- a/libstdc++-v3/acinclude.m4 +++ b/libstdc++-v3/acinclude.m4 @@ -860,6 +860,7 @@ AC_DEFUN([GLIBCXX_ENABLE_C99], [ tmpf = ctanf(tmpf); tmpf = ctanhf(tmpf); tmpf = cpowf(tmpf, tmpf); + tmpf = cprojf(tmpf); d = cabs(tmpd); d = carg(tmpd); tmpd = ccos(tmpd); @@ -872,6 +873,7 @@ AC_DEFUN([GLIBCXX_ENABLE_C99], [ tmpd = ctan(tmpd); tmpd = ctanh(tmpd); tmpd = cpow(tmpd, tmpd); + tmpd = cproj(tmpd); ld = cabsl(tmpld); ld = cargl(tmpld); tmpld = ccosl(tmpld); @@ -884,6 +886,7 @@ AC_DEFUN([GLIBCXX_ENABLE_C99], [ tmpld = ctanl(tmpld); tmpld = ctanhl(tmpld); tmpld = cpowl(tmpld, tmpld); + tmpld = cprojl(tmpld); ],[glibcxx_cv_c99_complex=yes], [glibcxx_cv_c99_complex=no]) fi AC_MSG_RESULT($glibcxx_cv_c99_complex) diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure index dddf05b8630..0343427e4e9 100755 --- a/libstdc++-v3/configure +++ b/libstdc++-v3/configure @@ -16398,6 +16398,7 @@ f = cabsf(tmpf); tmpf = ctanf(tmpf); tmpf = ctanhf(tmpf); tmpf = cpowf(tmpf, tmpf); + tmpf = cprojf(tmpf); d = cabs(tmpd); d = carg(tmpd); tmpd = ccos(tmpd); @@ -16410,6 +16411,7 @@ f = cabsf(tmpf); tmpd = ctan(tmpd); tmpd = ctanh(tmpd); tmpd = cpow(tmpd, tmpd); + tmpd = cproj(tmpd); ld = cabsl(tmpld); ld = cargl(tmpld); tmpld = ccosl(tmpld); @@ -16422,6 +16424,7 @@ f = cabsf(tmpf); tmpld = ctanl(tmpld); tmpld = ctanhl(tmpld); tmpld = cpowl(tmpld, tmpld); + tmpld = cprojl(tmpld); ; return 0; @@ -16494,6 +16497,7 @@ f = cabsf(tmpf); tmpf = ctanf(tmpf); tmpf = ctanhf(tmpf); tmpf = cpowf(tmpf, tmpf); + tmpf = cprojf(tmpf); d = cabs(tmpd); d = carg(tmpd); tmpd = ccos(tmpd); @@ -16506,6 +16510,7 @@ f = cabsf(tmpf); tmpd = ctan(tmpd); tmpd = ctanh(tmpd); tmpd = cpow(tmpd, tmpd); + tmpd = cproj(tmpd); ld = cabsl(tmpld); ld = cargl(tmpld); tmpld = ccosl(tmpld); @@ -16518,6 +16523,7 @@ f = cabsf(tmpf); tmpld = ctanl(tmpld); tmpld = ctanhl(tmpld); tmpld = cpowl(tmpld, tmpld); + tmpld = cprojl(tmpld); ; return 0; diff --git a/libstdc++-v3/doc/xml/manual/intro.xml b/libstdc++-v3/doc/xml/manual/intro.xml index 3be651a5ad4..578d303a396 100644 --- a/libstdc++-v3/doc/xml/manual/intro.xml +++ b/libstdc++-v3/doc/xml/manual/intro.xml @@ -634,6 +634,12 @@ Add it. + + 781: + std::complex should add missing C99 functions + + In C++0x mode, add std::proj. + 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 std::complex<_Tp> proj(const std::complex<_Tp>&); + + template + 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 + inline std::complex<_Tp> + proj(const std::complex<_Tp>& __z) + { return __complex_proj(__z.__rep()); } +#else + template + inline std::complex<_Tp> + proj(const std::complex<_Tp>& __z) + { return __complex_proj(__z); } +#endif + + template + inline std::complex::__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 */ diff --git a/libstdc++-v3/include/tr1/complex b/libstdc++-v3/include/tr1/complex index a0a84911698..8d14681e955 100644 --- a/libstdc++-v3/include/tr1/complex +++ b/libstdc++-v3/include/tr1/complex @@ -1,6 +1,6 @@ // TR1 complex -*- C++ -*- -// Copyright (C) 2006, 2007 Free Software Foundation, Inc. +// Copyright (C) 2006, 2007, 2008 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -65,8 +65,17 @@ namespace tr1 using std::imag; using std::norm; using std::polar; - using std::pow; + + template + inline std::complex::__type> + polar(const _Tp& __rho, const _Up& __theta) + { + typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; + return std::polar(__type(__rho), __type(__theta)); + } + using std::real; + using std::pow; } } diff --git a/libstdc++-v3/include/tr1_impl/complex b/libstdc++-v3/include/tr1_impl/complex index e7d433edc68..8b4f97401f6 100644 --- a/libstdc++-v3/include/tr1_impl/complex +++ b/libstdc++-v3/include/tr1_impl/complex @@ -1,6 +1,6 @@ // TR1 complex -*- C++ -*- -// Copyright (C) 2007 Free Software Foundation, Inc. +// Copyright (C) 2007, 2008 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -333,14 +333,11 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 return __type(__x) * __type(__x); } - template - inline std::complex::__type> - polar(const _Tp& __rho, const _Up& __theta) - { - typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type; - return std::polar(__type(__rho), __type(__theta)); - } - + template + inline typename __gnu_cxx::__promote<_Tp>::__type + real(_Tp __x) + { return __x; } + template inline std::complex::__type> pow(const std::complex<_Tp>& __x, const _Up& __y) @@ -366,11 +363,6 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 std::complex<__type>(__y)); } - template - inline typename __gnu_cxx::__promote<_Tp>::__type - real(_Tp __x) - { return __x; } - #endif _GLIBCXX_END_NAMESPACE_TR1 diff --git a/libstdc++-v3/testsuite/26_numerics/complex/dr781.cc b/libstdc++-v3/testsuite/26_numerics/complex/dr781.cc new file mode 100644 index 00000000000..b93422a8ae6 --- /dev/null +++ b/libstdc++-v3/testsuite/26_numerics/complex/dr781.cc @@ -0,0 +1,60 @@ +// { dg-options "-std=gnu++0x" } +// 2008-05-22 Paolo Carlini +// +// Copyright (C) 2008 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 2, or (at your option) +// any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING. If not, write to the Free +// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +// USA. + +#include +#include +#include + +// DR 781. std::complex should add missing C99 functions. +void test01() +{ + using __gnu_test::check_ret_type; + + typedef std::complex cmplx_f_type; + typedef std::complex cmplx_d_type; + typedef std::complex cmplx_ld_type; + + const int i1 = 1; + const float f1 = 1.0f; + const double d1 = 1.0; + const long double ld1 = 1.0l; + + const cmplx_f_type c_f1(f1, f1); + const cmplx_d_type c_d1(d1, d1); + const cmplx_ld_type c_ld1(ld1, ld1); + + check_ret_type(std::proj(c_f1)); + check_ret_type(std::proj(c_d1)); + check_ret_type(std::proj(c_ld1)); + + check_ret_type(std::proj(f1)); + check_ret_type(std::proj(d1)); + check_ret_type(std::proj(i1)); + VERIFY( std::proj(i1) == std::proj(double(i1)) ); + VERIFY( std::proj(i1) == std::proj(cmplx_d_type(double(i1))) ); + check_ret_type(std::proj(ld1)); +} + +int main() +{ + test01(); + return 0; +} -- 2.30.2