stdcpp/src/complex.cpp
changeset 0 e4d67989cc36
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stdcpp/src/complex.cpp	Tue Feb 02 02:01:42 2010 +0200
@@ -0,0 +1,406 @@
+/*
+ * © Portions copyright (c) 2006-2007 Nokia Corporation.  All rights reserved.
+ *
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+# include "stlport_prefix.h"
+// Complex division and square roots.
+
+#include "complex_impl.h"
+#ifdef __ARMCC__
+#undef _STLP_TEMPLATE_NULL
+#define _STLP_TEMPLATE_NULL 
+#endif
+_STLP_BEGIN_NAMESPACE
+
+// Absolute value
+#ifdef __SYMBIAN32__
+
+float abs_l(const complex<float>& __z)
+{
+  return _STLP_HYPOTF(__z._M_re, __z._M_im);
+}
+
+double _STLP_CALL abs_l(const complex<double>& __z)
+{
+  return _STLP_HYPOT(__z._M_re, __z._M_im);
+}
+
+#ifndef _STLP_NO_LONG_DOUBLE
+long double _STLP_CALL abs_l(const complex<long double>& __z)
+{
+  return _STLP_HYPOTL(__z._M_re, __z._M_im);
+}
+#endif
+#else
+_STLP_TEMPLATE_NULL
+_STLP_EXP_DECLSPEC float _STLP_CALL abs(const complex<float>& __z)
+{
+  return _STLP_HYPOTF(__z._M_re, __z._M_im);
+}
+_STLP_TEMPLATE_NULL
+_STLP_EXP_DECLSPEC double _STLP_CALL abs(const complex<double>& __z)
+{
+  return _STLP_HYPOT(__z._M_re, __z._M_im);
+}
+
+#ifndef _STLP_NO_LONG_DOUBLE
+_STLP_TEMPLATE_NULL
+_STLP_EXP_DECLSPEC long double _STLP_CALL abs(const complex<long double>& __z)
+{
+  return _STLP_HYPOTL(__z._M_re, __z._M_im);
+}
+#endif
+#endif
+
+// Phase
+#ifdef __SYMBIAN32__
+
+float _STLP_CALL arg_l(const complex<float>& __z) 
+{
+  return _STLP_ATAN2F(__z._M_im, __z._M_re);
+}
+
+
+double _STLP_CALL arg_l(const complex<double>& __z) 
+{
+  return _STLP_ATAN2(__z._M_im, __z._M_re);
+}
+
+#ifndef _STLP_NO_LONG_DOUBLE
+long double _STLP_CALL arg_l(const complex<long double>& __z) 
+{
+  return _STLP_ATAN2L(__z._M_im, __z._M_re);
+}
+#endif
+#else
+
+_STLP_TEMPLATE_NULL 
+_STLP_EXP_DECLSPEC float _STLP_CALL arg(const complex<float>& __z) 
+{
+  return _STLP_ATAN2F(__z._M_im, __z._M_re);
+}
+
+_STLP_TEMPLATE_NULL 
+_STLP_EXP_DECLSPEC double _STLP_CALL arg(const complex<double>& __z) 
+{
+  return _STLP_ATAN2(__z._M_im, __z._M_re);
+}
+
+#ifndef _STLP_NO_LONG_DOUBLE
+_STLP_TEMPLATE_NULL
+_STLP_EXP_DECLSPEC long double _STLP_CALL arg(const complex<long double>& __z) 
+{
+  return _STLP_ATAN2L(__z._M_im, __z._M_re);
+}
+#endif
+#endif
+
+// Construct a complex number from polar representation
+#ifdef __SYMBIAN32__
+complex<float> _STLP_CALL polar_l(const float& __rho, const float& __phi) 
+{
+  return complex<float>(__rho * _STLP_COSF(__phi), __rho * _STLP_SINF(__phi));
+}
+
+complex<double> _STLP_CALL polar_l(const double& __rho, const double& __phi) 
+{
+  return complex<double>(__rho * _STLP_COS(__phi), __rho * _STLP_SIN(__phi));
+}
+
+#ifndef _STLP_NO_LONG_DOUBLE
+complex<long double> _STLP_CALL polar_l(const long double& __rho, const long double& __phi)
+{
+  return complex<long double>(__rho * _STLP_COSL(__phi), __rho * _STLP_SINL(__phi));
+}
+#endif
+
+#else
+_STLP_TEMPLATE_NULL
+_STLP_EXP_DECLSPEC complex<float> _STLP_CALL polar(const float& __rho, const float& __phi) 
+{
+  return complex<float>(__rho * _STLP_COSF(__phi), __rho * _STLP_SINF(__phi));
+}
+_STLP_TEMPLATE_NULL
+_STLP_EXP_DECLSPEC complex<double> _STLP_CALL polar(const double& __rho, const double& __phi) 
+{
+  return complex<double>(__rho * _STLP_COS(__phi), __rho * _STLP_SIN(__phi));
+}
+
+#ifndef _STLP_NO_LONG_DOUBLE
+_STLP_TEMPLATE_NULL 
+_STLP_EXP_DECLSPEC complex<long double> _STLP_CALL polar(const long double& __rho, const long double& __phi)
+{
+  return complex<long double>(__rho * _STLP_COSL(__phi), __rho * _STLP_SINL(__phi));
+}
+#endif
+
+#endif
+// Division
+
+void  _STLP_EXP_DECLSPEC
+complex<float>::_div(const float& __z1_r, const float& __z1_i,
+		     const float& __z2_r, const float& __z2_i,
+		     float& __res_r, float& __res_i) {
+  float __ar = __z2_r >= 0 ? __z2_r : -__z2_r;
+  float __ai = __z2_i >= 0 ? __z2_i : -__z2_i;
+
+  if (__ar <= __ai) {
+    float __ratio = __z2_r / __z2_i;
+    float __denom = __z2_i * (1 + __ratio * __ratio);
+    __res_r = (__z1_r * __ratio + __z1_i) / __denom;
+    __res_i = (__z1_i * __ratio - __z1_r) / __denom;
+  }
+  else {
+    float __ratio = __z2_i / __z2_r;
+    float __denom = __z2_r * (1 + __ratio * __ratio);
+    __res_r = (__z1_r + __z1_i * __ratio) / __denom;
+    __res_i = (__z1_i - __z1_r * __ratio) / __denom;
+  }
+}
+
+void  _STLP_EXP_DECLSPEC
+complex<float>::_div(const float& __z1_r,
+                     const float& __z2_r, const float& __z2_i,
+                     float& __res_r, float& __res_i) {
+  float __ar = __z2_r >= 0 ? __z2_r : -__z2_r;
+  float __ai = __z2_i >= 0 ? __z2_i : -__z2_i;
+
+  if (__ar <= __ai) {
+    float __ratio = __z2_r / __z2_i;
+    float __denom = __z2_i * (1 + __ratio * __ratio);
+    __res_r = (__z1_r * __ratio) / __denom;
+    __res_i = - __z1_r / __denom;
+  }
+  else {
+    float __ratio = __z2_i / __z2_r;
+    float __denom = __z2_r * (1 + __ratio * __ratio);
+    __res_r = __z1_r / __denom;
+    __res_i = - (__z1_r * __ratio) / __denom;
+  }
+}
+
+
+void  _STLP_EXP_DECLSPEC
+complex<double>::_div(const double& __z1_r, const double& __z1_i,
+                      const double& __z2_r, const double& __z2_i,
+                      double& __res_r, double& __res_i) {
+  double __ar = __z2_r >= 0 ? __z2_r : -__z2_r;
+  double __ai = __z2_i >= 0 ? __z2_i : -__z2_i;
+
+  if (__ar <= __ai) {
+    double __ratio = __z2_r / __z2_i;
+    double __denom = __z2_i * (1 + __ratio * __ratio);
+    __res_r = (__z1_r * __ratio + __z1_i) / __denom;
+    __res_i = (__z1_i * __ratio - __z1_r) / __denom;
+  }
+  else {
+    double __ratio = __z2_i / __z2_r;
+    double __denom = __z2_r * (1 + __ratio * __ratio);
+    __res_r = (__z1_r + __z1_i * __ratio) / __denom;
+    __res_i = (__z1_i - __z1_r * __ratio) / __denom;
+  }
+}
+
+void _STLP_EXP_DECLSPEC
+complex<double>::_div(const double& __z1_r,
+                      const double& __z2_r, const double& __z2_i,
+                      double& __res_r, double& __res_i) {
+  double __ar = __z2_r >= 0 ? __z2_r : -__z2_r;
+  double __ai = __z2_i >= 0 ? __z2_i : -__z2_i;
+
+  if (__ar <= __ai) {
+    double __ratio = __z2_r / __z2_i;
+    double __denom = __z2_i * (1 + __ratio * __ratio);
+    __res_r = (__z1_r * __ratio) / __denom;
+    __res_i = - __z1_r / __denom;
+  }
+  else {
+    double __ratio = __z2_i / __z2_r;
+    double __denom = __z2_r * (1 + __ratio * __ratio);
+    __res_r = __z1_r / __denom;
+    __res_i = - (__z1_r * __ratio) / __denom;
+  }
+}
+
+#ifndef _STLP_NO_LONG_DOUBLE
+void  _STLP_CALL
+complex<long double>::_div(const long double& __z1_r, const long double& __z1_i,
+                           const long double& __z2_r, const long double& __z2_i,
+                           long double& __res_r, long double& __res_i) {
+  long double __ar = __z2_r >= 0 ? __z2_r : -__z2_r;
+  long double __ai = __z2_i >= 0 ? __z2_i : -__z2_i;
+
+  if (__ar <= __ai) {
+    long double __ratio = __z2_r / __z2_i;
+    long double __denom = __z2_i * (1 + __ratio * __ratio);
+    __res_r = (__z1_r * __ratio + __z1_i) / __denom;
+    __res_i = (__z1_i * __ratio - __z1_r) / __denom;
+  }
+  else {
+    long double __ratio = __z2_i / __z2_r;
+    long double __denom = __z2_r * (1 + __ratio * __ratio);
+    __res_r = (__z1_r + __z1_i * __ratio) / __denom;
+    __res_i = (__z1_i - __z1_r * __ratio) / __denom;
+  }
+}
+
+
+void _STLP_CALL
+complex<long double>::_div(const long double& __z1_r,
+                           const long double& __z2_r, const long double& __z2_i,
+                           long double& __res_r, long double& __res_i) {
+  long double __ar = __z2_r >= 0 ? __z2_r : -__z2_r;
+  long double __ai = __z2_i >= 0 ? __z2_i : -__z2_i;
+
+  if (__ar <= __ai) {
+    long double __ratio = __z2_r / __z2_i;
+    long double __denom = __z2_i * (1 + __ratio * __ratio);
+    __res_r = (__z1_r * __ratio) / __denom;
+    __res_i = - __z1_r / __denom;
+  }
+  else {
+    long double __ratio = __z2_i / __z2_r;
+    long double __denom = __z2_r * (1 + __ratio * __ratio);
+    __res_r = __z1_r / __denom;
+    __res_i = - (__z1_r * __ratio) / __denom;
+  }
+}
+#endif
+
+//----------------------------------------------------------------------
+// Square root
+
+
+_STLP_EXP_DECLSPEC complex<float> _STLP_CALL
+sqrt(const complex<float>& z) {
+  float re = z._M_re;
+  float im = z._M_im;
+  float mag = _STLP_HYPOTF(re, im);
+  complex<float> result;
+
+  if (mag == 0.) {
+    result._M_re = result._M_im = 0.f;
+  } else if (re > 0.f) {
+    result._M_re = _STLP_SQRTF(0.5f * (mag + re));
+    result._M_im = im/result._M_re/2.f;
+  } else {
+    result._M_im = _STLP_SQRTF(0.5f * (mag - re));
+    if (im < 0.f)
+      result._M_im = - result._M_im;
+    result._M_re = im/result._M_im/2.f;
+  }
+  return result;
+}
+
+
+_STLP_EXP_DECLSPEC complex<double>  _STLP_CALL
+sqrt(const complex<double>& z) {
+  double re = z._M_re;
+  double im = z._M_im;
+  double mag = _STLP_HYPOT(re, im);
+  complex<double> result;
+
+  if (mag == 0.) {
+    result._M_re = result._M_im = 0.;
+  } else if (re > 0.) {
+    result._M_re = _STLP_SQRT(0.5 * (mag + re));
+    result._M_im = im/result._M_re/2;
+  } else {
+    result._M_im = _STLP_SQRT(0.5 * (mag - re));
+    if (im < 0.)
+      result._M_im = - result._M_im;
+    result._M_re = im/result._M_im/2;
+  }
+  return result;
+}
+
+#ifndef _STLP_NO_LONG_DOUBLE
+_STLP_EXP_DECLSPEC complex<long double> _STLP_CALL
+sqrt(const complex<long double>& z) {
+  long double re = z._M_re;
+  long double im = z._M_im;
+  long double mag = _STLP_HYPOTL(re, im);
+  complex<long double> result;
+
+  if (mag == 0.L) {
+    result._M_re = result._M_im = 0.L;
+  } else if (re > 0.L) {
+    result._M_re = _STLP_SQRTL(0.5L * (mag + re));
+    result._M_im = (im/result._M_re) * .5L;
+  } else {
+    result._M_im = _STLP_SQRTL(0.5L * (mag - re));
+    if (im < 0.L)
+      result._M_im = - result._M_im;
+    result._M_re = (im/result._M_im) * .5L;
+  }
+  return result;
+}
+#endif
+
+#ifdef __SYMBIAN32__
+template <class _Tp>
+_STLP_EXP_DECLSPEC _Tp  _STLP_CALL abs_tp(const complex<_Tp>& val)
+    {
+    return abs_l(val);
+    }
+
+template <class _Tp>
+_STLP_EXP_DECLSPEC _Tp  _STLP_CALL arg_tp(const complex<_Tp>& val)
+    {
+    return arg_l(val);
+    }
+    
+template <class _Tp>
+_STLP_EXP_DECLSPEC complex<_Tp> _STLP_CALL polar_tp(const _Tp& __rho, const _Tp& __phi)
+    {
+    return polar_l(__rho, __phi);
+    }
+
+ 
+void dummy_instantiate_func()
+{
+    const complex<float> val;
+    float fval;
+    abs_tp(val);
+    arg_tp(val);
+    polar_tp(fval, fval);
+    const complex<double> dval;
+    double dv;
+    abs_tp(dval);
+    arg_tp(dval);
+    polar_tp(dv, dv);
+
+#ifndef _STLP_NO_LONG_DOUBLE
+    const complex<long double> lval;
+    long double lv;
+    abs_tp(lval);
+    arg_tp(lval);
+    polar_tp(lv, lv);
+#endif
+}
+
+
+#endif
+//template <>
+//_STLP_EXP_DECLSPEC float  _STLP_CALL abs_tp(const complex<float>& val);
+
+_STLP_END_NAMESPACE
+
+#ifdef __ARMCC__
+#undef _STLP_TEMPLATE_NULL
+#endif