
/* These map the primitive C types to the appropriate R type
   for use in class representations. 
 */

%typemap("rtype") int, int *, int &      "numeric";
%apply int {size_t}
%apply int {std::size_t}
%apply int {ptrdiff_t}
%apply int {std::ptrdiff_t}

%typemap("rtype") long, long *    "numeric";
%typemap("rtype") unsigned long, 
                  unsigned long * "numeric";
%typemap("rtype") unsigned int, 
                  unsigned int *  "numeric";
%typemap("rtype") double, double*, double & "numeric";
%typemap("rtype") float, float *, float &  "numeric";
%typemap("rtype") char *, char ** "character";
%typemap("rtype") char            "character";
%typemap("rtype") string, string *, string & "character";
%typemap("rtype") std::string, std::string *, std::string & "character";
%typemap("rtype") bool, bool *    "logical";
%typemap("rtype") enum SWIGTYPE   "character";
%typemap("rtype") enum SWIGTYPE *   "character";
%typemap("rtype") enum SWIGTYPE &  "character";
%typemap("rtype") SWIGTYPE * "$R_class";
%typemap("rtype") SWIGTYPE & "$R_class";
%typemap("rtype") SWIGTYPE "$&R_class";



/* Have to be careful that as(x, "numeric") is different from as.numeric(x).  
   The latter makes a REALSXP, whereas the former leaves an INTSXP as an
   INTSXP.
*/


%typemap(scoercein) int, int *, int &
  %{  $input = as($input, "integer");     %}
%typemap(scoercein) ptrdiff_t, ptrdiff_t *, ptrdiff_t &
  %{  $input = as($input, "integer");     %}
%typemap(scoercein) unsigned long, unsigned long *, unsigned long &
  %{  $input = as($input, "integer");     %}
%typemap(scoercein) unsigned int, unsigned int *, unsigned int &
  %{  $input = as($input, "integer");     %}
%typemap(scoercein) double, double *, double &
  %{  $input = as($input, "numeric");     %}
%typemap(scoercein) float, float *, float &
  %{  $input = as($input, "numeric");     %}
%typemap(scoercein) char, char *, char &
  %{  $input = as($input, "character");     %}
%typemap(scoercein) string, string *, string &
  %{  $input = as($input, "character");     %}
%typemap(scoercein) std::string, std::string *, std::string &
  %{  $input = as($input, "character");     %}
%typemap(scoercein) enum SWIGTYPE 
  %{  $input = enumToInteger($input, "$R_class") %}
%typemap(scoercein) enum SWIGTYPE &
  %{  $input = enumToInteger($input, "$R_class") %}
%typemap(scoercein) enum SWIGTYPE *
  %{  $input = enumToInteger($input, "$R_class") %}

%typemap(scoercein) SWIGTYPE * 
  %{ $input = coerceIfNotSubclass($input, "$R_class") %}

%typemap(scoercein) SWIGTYPE & 
  %{ $input = coerceIfNotSubclass($input, "$R_class") %}

%typemap(scoercein) SWIGTYPE  
  %{ $input = coerceIfNotSubclass($input, "$&R_class") %}


%typemap(scoercein) SWIGTYPE[ANY]  
 %{
    if(is.list($input))
      assert(all(sapply($input, class) == "$R_class"))     
 %}


/* **************************************************************** */

%typemap(scoercein) bool, bool *, bool & 
		    "$input = as.logical($input) ";

%typemap(scoercein) int, 
                    int *, 
		    int &,
                    int[ANY],
		    size_t,
		    std::size_t,
		    size_t &,
		    std::size_t &
  "$input = as.integer($input) ";


%typemap(scoercein) unsigned int, 
                    unsigned long,
                    double, 
                    float,
                    long,
                    long long,
     	            unsigned int[], 
                    unsigned long[],
                    double[], 
                    float[],
                    long[],
                    long long[],
     	            unsigned int[ANY], 
                    unsigned long[ANY],
                    double[ANY], 
                    float[ANY],
                    long[ANY],
                    long long[ANY],
     	            unsigned int *, 
                    unsigned long *,
                    double*, 
                    float*,
                    long*,
                    long long *
%{  $input = as.numeric($input) %}


%typemap(scoercein) char *, string, std::string,
string &, std::string &
%{  $input = as($input, "character") %}

%typemap(scoerceout) enum SWIGTYPE 
  %{  $result = enumFromInteger($result, "$R_class") %}

%typemap(scoerceout) enum SWIGTYPE &
  %{  $result = enumFromInteger($result, "$R_class") %}

%typemap(scoerceout) enum SWIGTYPE *
  %{  $result = enumToInteger($result, "$R_class") %}


%typemap(scoerceout) SWIGTYPE 
  %{ class($result) <- "$&R_class" %}

%typemap(scoerceout) SWIGTYPE & 
  %{ class($result) <- "$R_class" %}

%typemap(scoerceout) SWIGTYPE * 
  %{ class($result) <- "$R_class" %}

/* Override the SWIGTYPE * above. */
%typemap(scoerceout) char,
		     char *,
		     char &,
		     unsigned int, 
		     unsigned int &, 
                     unsigned long,
                     unsigned long &,
		     double, 
		     double &,
                     float,
		     float &,
                     long,
		     long &,
                     long long,
		     long long &,
                     int,
		     int &,
                     bool,
		     bool &,
		     string,
		     std::string,
		     string &,
		     std::string &, 
		     size_t,
		     std::size_t,
		     size_t &,
		     std::size_t &,
		     void
 %{    %}


#if 0
 Just examining the values for a SWIGTYPE.

%typemap(scoerceout) SWIGTYPE  %{

  name = $1_name
  type = $1_type
  ltype = $1_ltype

  mangle = $1_mangle
  descriptor = $1_descriptor

  pointer type = $*1_type
  pointer ltype = $*1_ltype

  pointer descriptor = $*1_descriptor
  basetype = $*_basetype

%}
#endif


