complex (proj(const std::complex<>&), proj(_Tp)): Add per DR 781.
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
This commit is contained in:
parent
f8b52c2ff7
commit
3cd54fc92d
8 changed files with 156 additions and 17 deletions
|
@ -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.
|
||||
|
|
|
@ -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)
|
||||
|
|
6
libstdc++-v3/configure
vendored
6
libstdc++-v3/configure
vendored
|
@ -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;
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
60
libstdc++-v3/testsuite/26_numerics/complex/dr781.cc
Normal file
60
libstdc++-v3/testsuite/26_numerics/complex/dr781.cc
Normal file
|
@ -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;
|
||||
}
|
Loading…
Add table
Reference in a new issue