/* */


%insert("header") "swiglabels.swg"

%insert("header") "swigerrors.swg"
%insert("init") "swiginit.swg"
%insert("runtime") "swigrun.swg"
%insert("runtime") "rrun.swg"

%init %{
SWIGEXPORT void SWIG_init(void) {
%}

%include <rkw.swg>

#define %Rruntime %insert("s")

#define SWIG_Object SEXP
#define VOID_Object R_NilValue

#define %append_output(obj) SET_VECTOR_ELT($result, $n, obj)

%define %set_constant(name, obj) %begin_block
   SEXP _obj = obj;
   assign(name, _obj);
%end_block %enddef

%define %raise(obj,type,desc) 
return R_NilValue;
%enddef

%insert("sinit") "srun.swg"

%insert("sinitroutine") %{
SWIG_init();
SWIG_InitializeModule(0);
%}

%include <typemaps/swigmacros.swg>
%typemap(in) (double *x, int len) %{
   $1 = REAL(x);
   $2 = Rf_length(x);
%}

/* XXX
   Need to worry about inheritance, e.g. if B extends A 
   and we are looking for an A[], then B elements are okay.
*/
%typemap(scheck) SWIGTYPE[ANY]  
  %{ 
#      assert(length($input) > $1_dim0)
      assert(all(sapply($input, class) == "$R_class"));
  %}

%typemap(out) void "";

%typemap(in) int *, int[ANY],
	     signed int *, signed int[ANY],
	     unsigned int *, unsigned int[ANY],
             short *, short[ANY],
             signed short *, signed short[ANY],
             unsigned short *, unsigned short[ANY],
             long *, long[ANY],
             signed long *, signed long[ANY],
             unsigned long *, unsigned long[ANY],
             long long *, long long[ANY],
             signed long long *, signed long long[ANY],
             unsigned long long *, unsigned long long[ANY]
             
{
{ int _rswigi;
  int _rswiglen = LENGTH($input);
  $1 = %static_cast(calloc(sizeof($1_basetype), _rswiglen), $1_ltype);
  for (_rswigi=0; _rswigi< _rswiglen; _rswigi++) {
     $1[_rswigi] = INTEGER($input)[_rswigi];
  }
}
} 

%typemap(in) float *, float[ANY],
             double *, double[ANY]
             
{
{  int _rswigi;
  int _rswiglen = LENGTH($input);
  $1 = %static_cast(calloc(sizeof($1_basetype), _rswiglen), $1_ltype);
  for (_rswigi=0; _rswigi<_rswiglen; _rswigi++) {
     $1[_rswigi] = REAL($input)[_rswigi];
  }
}
}

%typemap(freearg,noblock=1) int *, int[ANY], 
	     signed int *, signed int[ANY],
	     unsigned int *, unsigned int[ANY],
             short *, short[ANY],
             signed short *, signed short[ANY],
             unsigned short *, unsigned short[ANY],
             long *, long[ANY],
             signed long *, signed long[ANY],
             unsigned long *, unsigned long[ANY],
             long long *, long long[ANY],
             signed long long *, signed long long[ANY],
             unsigned long long *, unsigned long long[ANY],
             float *, float[ANY],
             double *, double[ANY]
%{             
  free($1);
%}

%typemap(freearg, noblock=1) int *OUTPUT,
signed int *OUTPUT,
unsigned int *OUTPUT,
short *OUTPUT,
signed short *OUTPUT,
long *OUTPUT,
signed long *OUTPUT,
long long *OUTPUT,
unsigned long long *OUTPUT,
float *OUTPUT,
double *OUTPUT {}



/* Should we recycle to make the length correct.
   And warn if length() > the dimension. 
*/
%typemap(scheck) SWIGTYPE [ANY] %{
#  assert(length($input) >= $1_dim0)
%}

/* Handling vector case to avoid warnings,
   although we just use the first one. */
%typemap(scheck) unsigned int %{
  assert(length($input) == 1 && $input >= 0, "All values must be non-negative");
%}


%typemap(scheck) int, long %{
  if(length($input) > 1) {
     warning("using only the first element of $input");
  };
%}

%include <typemaps/fragments.swg>
%include <rfragments.swg>
%include <ropers.swg>
%include <typemaps/swigtypemaps.swg>
%include <rtype.swg>

%typemap(in,noblock=1) enum SWIGTYPE[ANY] {
   $1 = %reinterpret_cast(INTEGER($input), $1_ltype);
}

%typemap(in,noblock=1,fragment="SWIG_strdup") char * {
   $1 = %reinterpret_cast(SWIG_strdup(CHAR(STRING_ELT($input, 0))), $1_ltype);
}

%typemap(freearg,noblock=1) char * {
   free($1);
}

%typemap(in,noblock=1,fragment="SWIG_strdup") char *[ANY]  {
   $1 = %reinterpret_cast(SWIG_strdup(CHAR(STRING_ELT($input, 0))), $1_ltype);
}

%typemap(freearg,noblock=1) char *[ANY]  {
   free($1);
}

%typemap(in,noblock=1,fragment="SWIG_strdup") char[ANY] {
    $1 = SWIG_strdup(CHAR(STRING_ELT($input, 0)));
}

%typemap(freearg,noblock=1) char[ANY] {
    free($1);
}

%typemap(in,noblock=1,fragment="SWIG_strdup") char[] {
    $1 = SWIG_strdup(CHAR(STRING_ELT($input, 0)));
}

%typemap(freearg,noblock=1) char[] {
    free($1);
}


%typemap(memberin) char[] %{
if ($input) strcpy($1, $input);
else
strcpy($1, "");
%}

%typemap(globalin) char[] %{
if ($input) strcpy($1, $input);
else
strcpy($1, "");
%}

%typemap(out,noblock=1) char * 
 {  $result = $1 ? Rf_mkString(%reinterpret_cast($1,char *)) : R_NilValue; }

%typemap(in,noblock=1) char {
$1 = %static_cast(CHAR(STRING_ELT($input, 0))[0],$1_ltype);
}

%typemap(out) char 
 { 
    char tmp[2] = "x";
    tmp[0] = $1;    
    $result = Rf_mkString(tmp); 
 }


%typemap(in,noblock=1) int, long
{
  $1 = %static_cast(INTEGER($input)[0], $1_ltype);
}

%typemap(out,noblock=1) int, long
  "$result = Rf_ScalarInteger($1);";


%typemap(in,noblock=1) bool 
  "$1 = LOGICAL($input)[0] ? true : false;";


%typemap(out,noblock=1) bool 
  "$result = Rf_ScalarLogical($1);";

%typemap(in,noblock=1) 
             float, 
             double
{
  $1 = %static_cast(REAL($input)[0], $1_ltype); 
}

/* Why is this here ? */
/* %typemap(out,noblock=1) unsigned int *
  "$result = ScalarReal(*($1));"; */

%Rruntime %{
setMethod('[', "ExternalReference",
function(x,i,j, ..., drop=TRUE) 
if (!is.null(x$"__getitem__")) 
sapply(i, function(n) x$"__getitem__"(i=as.integer(n-1))))

setMethod('[<-' , "ExternalReference",
function(x,i,j, ..., value) 
if (!is.null(x$"__setitem__")) {
sapply(1:length(i), function(n) 
x$"__setitem__"(i=as.integer(i[n]-1), x=value[n]))
x
})

setAs('ExternalReference', 'character',
function(from) {if (!is.null(from$"__str__")) from$"__str__"()})

setMethod('print', 'ExternalReference',
function(x) {print(as(x, "character"))})
%}



