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 | |
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')
-rw-r--r-- | libstdc++-v3/ChangeLog | 11 | ||||
-rw-r--r-- | libstdc++-v3/acinclude.m4 | 3 | ||||
-rwxr-xr-x | libstdc++-v3/configure | 6 | ||||
-rw-r--r-- | libstdc++-v3/doc/xml/manual/intro.xml | 6 | ||||
-rw-r--r-- | libstdc++-v3/include/std/complex | 54 | ||||
-rw-r--r-- | libstdc++-v3/include/tr1/complex | 13 | ||||
-rw-r--r-- | libstdc++-v3/include/tr1_impl/complex | 20 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/26_numerics/complex/dr781.cc | 60 |
8 files changed, 156 insertions, 17 deletions
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 <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 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 @@ </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 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 */ 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<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 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<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 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 <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; +} |