summaryrefslogtreecommitdiff
path: root/libstdc++-v3
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
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')
-rw-r--r--libstdc++-v3/ChangeLog11
-rw-r--r--libstdc++-v3/acinclude.m43
-rwxr-xr-xlibstdc++-v3/configure6
-rw-r--r--libstdc++-v3/doc/xml/manual/intro.xml6
-rw-r--r--libstdc++-v3/include/std/complex54
-rw-r--r--libstdc++-v3/include/tr1/complex13
-rw-r--r--libstdc++-v3/include/tr1_impl/complex20
-rw-r--r--libstdc++-v3/testsuite/26_numerics/complex/dr781.cc60
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;
+}