complex (proj(const std::complex<>&), proj(_Tp)): Add per DR 781.
authorPaolo Carlini <paolo.carlini@oracle.com>
Thu, 22 May 2008 11:44:00 +0000 (11:44 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Thu, 22 May 2008 11:44:00 +0000 (11:44 +0000)
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.

From-SVN: r135757

libstdc++-v3/ChangeLog
libstdc++-v3/acinclude.m4
libstdc++-v3/configure
libstdc++-v3/doc/xml/manual/intro.xml
libstdc++-v3/include/std/complex
libstdc++-v3/include/tr1/complex
libstdc++-v3/include/tr1_impl/complex
libstdc++-v3/testsuite/26_numerics/complex/dr781.cc [new file with mode: 0644]

index e87402745f98aeca1ee99bf455cc41648829ab5d..3b689a41f9ce69e2d1b919ca7d72030ca3a7849e 100644 (file)
@@ -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.
index db3c7b19b252dca31d707a5be1b51fe7b4a4c16f..a68ab9be2a8f46ce417a4f2538b2d39d3297f95d 100644 (file)
@@ -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)
index dddf05b863086a36cba4df3515b7fad9df29610e..0343427e4e99b224f7d77a432f40d3284915cd01 100755 (executable)
@@ -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;
index 3be651a5ad4f342612e891aa19abc5e1cc15a0d4..578d303a3965795a2bd2d891acfe40e0d26be0c2 100644 (file)
     </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>
index f2d9e9346eee95373c9415e9a84ff1ab7c508945..e3feef0918f707b2b7012887e86a5cca6f0b093a 100644 (file)
@@ -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 */
index a0a849116989ae9b875281500e2008e69855b9f4..8d14681e9557b980de94101bd9b5a9af962016be 100644 (file)
@@ -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;
 }
 }
 
index e7d433edc68777900a3f7c14703f03afee12b948..8b4f97401f60376ed846fc3269e22c48cac305b3 100644 (file)
@@ -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 (file)
index 0000000..b93422a
--- /dev/null
@@ -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;
+}