diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index e87402745f98aeca1ee99bf455cc41648829ab5d..3b689a41f9ce69e2d1b919ca7d72030ca3a7849e 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,14 @@ +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. + 2008-05-21 Paolo Carlini <paolo.carlini@oracle.com> * include/std/bitset (bitset<>::bitset(const char*)): Add per DR 778. diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4 index db3c7b19b252dca31d707a5be1b51fe7b4a4c16f..a68ab9be2a8f46ce417a4f2538b2d39d3297f95d 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 dddf05b863086a36cba4df3515b7fad9df29610e..0343427e4e99b224f7d77a432f40d3284915cd01 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 3be651a5ad4f342612e891aa19abc5e1cc15a0d4..578d303a3965795a2bd2d891acfe40e0d26be0c2 100644 --- a/libstdc++-v3/doc/xml/manual/intro.xml +++ b/libstdc++-v3/doc/xml/manual/intro.xml @@ -634,6 +634,12 @@ </term> <listitem><para>Add it. </para></listitem></varlistentry> + + <varlistentry><term><ulink url="lwg-active.html#781">781</ulink>: + <emphasis>std::complex should add missing C99 functions</emphasis> + </term> + <listitem><para>In C++0x mode, add std::proj. + </para></listitem></varlistentry> </variablelist> </sect2> diff --git a/libstdc++-v3/include/std/complex b/libstdc++-v3/include/std/complex index f2d9e9346eee95373c9415e9a84ff1ab7c508945..e3feef0918f707b2b7012887e86a5cca6f0b093a 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 */ diff --git a/libstdc++-v3/include/tr1/complex b/libstdc++-v3/include/tr1/complex index a0a849116989ae9b875281500e2008e69855b9f4..8d14681e9557b980de94101bd9b5a9af962016be 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<typename _Tp, typename _Up> + inline std::complex<typename __gnu_cxx::__promote_2<_Tp, _Up>::__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 e7d433edc68777900a3f7c14703f03afee12b948..8b4f97401f60376ed846fc3269e22c48cac305b3 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<typename _Tp, typename _Up> - inline std::complex<typename __gnu_cxx::__promote_2<_Tp, _Up>::__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<typename _Tp> + inline typename __gnu_cxx::__promote<_Tp>::__type + real(_Tp __x) + { return __x; } + template<typename _Tp, typename _Up> inline std::complex<typename __gnu_cxx::__promote_2<_Tp, _Up>::__type> pow(const std::complex<_Tp>& __x, const _Up& __y) @@ -366,11 +363,6 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 std::complex<__type>(__y)); } - template<typename _Tp> - 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 0000000000000000000000000000000000000000..b93422a8ae65aa4adea5c245534cf9e7c406f309 --- /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 <paolo.carlini@oracle.com> +// +// 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 <complex> +#include <testsuite_hooks.h> +#include <testsuite_tr1.h> + +// DR 781. std::complex should add missing C99 functions. +void test01() +{ + using __gnu_test::check_ret_type; + + typedef std::complex<float> cmplx_f_type; + typedef std::complex<double> cmplx_d_type; + typedef std::complex<long double> 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<cmplx_f_type>(std::proj(c_f1)); + check_ret_type<cmplx_d_type>(std::proj(c_d1)); + check_ret_type<cmplx_ld_type>(std::proj(c_ld1)); + + check_ret_type<cmplx_f_type>(std::proj(f1)); + check_ret_type<cmplx_d_type>(std::proj(d1)); + check_ret_type<cmplx_d_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<cmplx_ld_type>(std::proj(ld1)); +} + +int main() +{ + test01(); + return 0; +}