/*
  Defines the As/From converters for double/float complex, you need to
  provide complex Type, the Name you want to use in the converters,
  the complex Constructor method, and the Real and Imag complex
  accessor methods.

  See the std_complex.i and ccomplex.i for concrete examples.
*/

/* the common from converter */
%define %swig_fromcplx_conv(Type, Real, Imag)
%fragment(SWIG_From_frag(Type),"header",
          fragment=SWIG_From_frag(double))
{
SWIGINTERNINLINE JSObjectRef
#if defined(__cplusplus)
SWIG_From_dec(Type)(const Type& c)
#else
SWIG_From_dec(Type)(Type c)
#endif
{
  JSValueRef vals[2];
  vals[0] =  SWIG_From(double)(Real(c));
  vals[1] =  SWIG_From(double)(Imag(c));
  return JSObjectMakeArray(context, 2, vals, NULL);
}
}
%enddef

/* the double case */
%define %swig_cplxdbl_conv(Type, Constructor, Real, Imag)
%fragment(SWIG_AsVal_frag(Type),"header",
	  fragment=SWIG_AsVal_frag(double))
{
SWIGINTERN int
SWIG_AsVal_dec(Type) (JSValueRef o, Type* val)
{
  if (JSValueIsObject(context, o)) {
    JSObjectRef array;
    JSValueRef exception, js_re, js_im;
    double re, im;
    int res;
    
    exception = 0;
    res = 0;

    array = JSValueToObject(context, o, &exception);
    if(exception != 0)
      return SWIG_TypeError;
    
    js_re = JSObjectGetPropertyAtIndex(context, array, 0, &exception);
    if(exception != 0)
      return SWIG_TypeError;

    js_im = JSObjectGetPropertyAtIndex(context, array, 1, &exception);
    if(exception != 0)
      return SWIG_TypeError;

    res = SWIG_AsVal(double)(js_re, &re);
    if(!SWIG_IsOK(res)) {
      return SWIG_TypeError;
    }
    
    res = SWIG_AsVal(double)(js_im, &im);
    if(!SWIG_IsOK(res)) {
      return SWIG_TypeError;
    }
    
    if (val) *val = Constructor(re, im);
    return SWIG_OK;
  } else {
    double d;
    int res = SWIG_AddCast(SWIG_AsVal(double)(o, &d));
    if (SWIG_IsOK(res)) {
      if (val) *val = Constructor(d, 0.0);
      return res;
    }
  }
  return SWIG_TypeError;
}
}
%swig_fromcplx_conv(Type, Real, Imag);
%enddef

/* the float case */
%define %swig_cplxflt_conv(Type, Constructor, Real, Imag)
%fragment(SWIG_AsVal_frag(Type),"header",
          fragment=SWIG_AsVal_frag(float)) {
SWIGINTERN int
SWIG_AsVal_dec(Type)(JSValueRef o, Type *val)
{
  if (JSValueIsObject(context, o)) {
    JSObjectRef array;
    JSValueRef exception, js_re, js_im;
    double re, im;
    int res;
    
    exception = 0;
    res = 0;

    array = JSValueToObject(context, o, &exception);
    if(exception != 0)
      return SWIG_TypeError;
    
    js_re = JSObjectGetPropertyAtIndex(context, array, 0, &exception);
    if(exception != 0)
      return SWIG_TypeError;

    js_im = JSObjectGetPropertyAtIndex(context, array, 1, &exception);
    if(exception != 0)
      return SWIG_TypeError;

    res = SWIG_AsVal(double)(js_re, &re);
    if(!SWIG_IsOK(res)) {
      return SWIG_TypeError;
    }
    
    res = SWIG_AsVal(double)(js_im, &im);
    if(!SWIG_IsOK(res)) {
      return SWIG_TypeError;
    }

    if ((-FLT_MAX <= re && re <= FLT_MAX) && (-FLT_MAX <= im && im <= FLT_MAX)) {
      if (val) *val = Constructor(%numeric_cast(re, float),
                                  %numeric_cast(im, float));
      return SWIG_OK;
    } else {
      return SWIG_OverflowError;
    }    
  } else {
    float re;
    int res = SWIG_AddCast(SWIG_AsVal(float)(o, &re));
    if (SWIG_IsOK(res)) {
      if (val) *val = Constructor(re, 0.0f);
      return res;
    }
  }
  return SWIG_TypeError;
}
}

%swig_fromcplx_conv(Type, Real, Imag);
%enddef

#define %swig_cplxflt_convn(Type, Constructor, Real, Imag) \
%swig_cplxflt_conv(Type, Constructor, Real, Imag)


#define %swig_cplxdbl_convn(Type, Constructor, Real, Imag) \
%swig_cplxdbl_conv(Type, Constructor, Real, Imag)
