%module python_annotations_c

// Tests the C/C++ annotations that were automatically added by using -py3 before swig-4.1.0
// In swig-4.1.0 and later, the feature below is needed as the -py3 option was dropped
%feature("python:annotations", "c") mymethod;
%feature("python:annotations", "c") makeT<short>;
%feature("python:annotations", "c") global_ints;
%feature("python:annotations", "c") suppressed_none;
%feature("python:annotations", "c") suppressed_one;
%feature("python:annotations", "c") global_overloaded;
%feature("python:annotations", "c") global_overloaded_differ;

%inline %{
namespace Space {
template<class T>
struct Template {
  void mymethod(int, Template* tt) {}
};
}
template<typename T>
Space::Template<T> makeT(int x) {
  return Space::Template<T>();
}
int *global_ints(int &ri, Space::Template<short> t) { return &ri; }
int *global_overloaded(int &ri) { return &ri; }
int *global_overloaded() { return NULL; }
/* Overloads returning different types have no one C/C++ type to annotate them with. */
int global_overloaded_differ(int x) { return x; }
double global_overloaded_differ(double x, double y) { return x + y; }
int *no_annotations(int &ri, const char *c) { return NULL; }
%}
%template(TemplateShort) Space::Template<short>;
%template(MakeShort) makeT<short>;

/* An out typemap declaring numoutputs=0 leaves nothing to return, which is annotated the way a
   void function is rather than with the suppressed C return type. */
%typemap(out, numoutputs=0) MyErr ""
%typemap(ret) MyErr %{
  if ($1 != 0) {
    PyErr_Format(PyExc_RuntimeError, "error code %d", (int)$1);
    SWIG_fail;
  }
%}

%typemap(in, numinputs=0) short *OutAppend (short temp) { $1 = &temp; }
%typemap(argout) short *OutAppend {
  $result = SWIG_AppendOutput($result, PyLong_FromLong(*$1));
}

%inline %{
typedef int MyErr;
MyErr suppressed_none(int code) { return code; }
MyErr suppressed_one(int code, short *OutAppend) { *OutAppend = 42; return code; }
%}

%inline %{
#ifdef SWIGPYTHON_BUILTIN
int is_python_builtin() { return 1; }
#else
int is_python_builtin() { return 0; }
#endif

#if defined SWIGPYTHON_FASTPROXY
int is_python_fastproxy() { return 1; }
#else
int is_python_fastproxy() { return 0; }
#endif
%}
