%module(directors="1") director_exception

%warnfilter(SWIGWARN_TYPEMAP_DIRECTOROUT_PTR) return_const_char_star;

%{
#include <string>

// define dummy director exception classes to prevent spurious errors 
// in target languages that do not support directors.

#ifndef SWIG_DIRECTORS
namespace Swig {
  class DirectorException {};
  class DirectorMethodException: public Swig::DirectorException {};
}
#endif /* !SWIG_DIRECTORS */
%}

%include "std_string.i"

#ifdef SWIGPHP

%feature("director:except") {
  if ($error == FAILURE) {
    Swig::DirectorMethodException::raise("$symname");
  }
}

%exception {
  try { $action }
  catch (Swig::DirectorException &) { SWIG_fail; }
}

#endif

#ifdef SWIGPYTHON

%feature("director:except") {
  if ($error != NULL) {
    Swig::DirectorMethodException::raise("$symname");
  }
}

%exception {
  try { $action }
  catch (Swig::DirectorException &) { SWIG_fail; }
}

#endif

#ifdef SWIGJAVA

// Default for director exception warns about unmapped exceptions now in java
// Suppress warnings for this older test
// %warnfilter(476) Bar;

// Default for java is to throw Swig::DirectorException if no
// direct:except feature.  Since methods below have exception specification
// cannot throw director exception.

// Change back to old 2.0 default behavior

%feature("director:except") {
  jthrowable $error = jenv->ExceptionOccurred();
  if ($error) {
    // Dont clear exception, still be active when return to java execution
    // Essentially ignore exception occurred -- old behavior.
    return $null;
  }
}

#endif

#ifdef SWIGRUBY

%feature("director:except") {
  Swig::DirectorMethodException::raise($error);
}

%exception {
  try { $action }
  catch (Swig::DirectorException &e) { rb_exc_raise(e.getError()); }
}

#endif

%feature("director") Foo;

%inline {

class Foo {
public:
  virtual ~Foo() {}
  virtual std::string ping() { return "Foo::ping()"; }
  virtual std::string pong(int val=3) { return "Foo::pong();" + ping(); }
};

Foo *launder(Foo *f) {
  return f;
}

}


%{
  struct Unknown1
  {
  };

  struct Unknown2
  {
  };
%}

%feature("director") Bar;
%feature("director") ReturnAllTypes;

%{
// throw is deprecated in C++11 and invalid in C++17 and later
#if defined(__cplusplus) && __cplusplus >= 201103L
#define throw(TYPE1, TYPE2, TYPE3)
#else
#define throw(TYPE1, TYPE2, TYPE3) throw(TYPE1, TYPE2, TYPE3)
#if defined(_MSC_VER)
  #pragma warning(disable: 4290) // C++ exception specification ignored except to indicate a function is not __declspec(nothrow)
#endif
#endif
%}

%inline %{
  struct Exception1
  {
  };

  struct Exception2
  {
  };

  class Base 
  {
  public:
    virtual ~Base() {}
  };
  

  class Bar : public Base
  {
  public:
    virtual std::string ping() throw(Exception1, Exception2&, double) { return "Bar::ping()"; }
    virtual std::string pong() throw(Unknown1, int, Unknown2&) { return "Bar::pong();" + ping(); }
  };
  
  // Class to allow regression testing SWIG/PHP not checking if an exception
  // had been thrown in directorout typemaps.
  class ReturnAllTypes
  {
  public:
    int call_int() { return return_int(); }
    double call_double() { return return_double(); }
    const char * call_const_char_star() { return return_const_char_star(); }
    std::string call_std_string() { return return_std_string(); }
    Bar call_Bar() { return return_Bar(); }

    virtual int return_int() { return 0; }
    virtual double return_double() { return 0.0; }
    virtual const char * return_const_char_star() { return ""; }
    virtual std::string return_std_string() { return std::string(); }
    virtual Bar return_Bar() { return Bar(); }
    virtual ~ReturnAllTypes() {}
  };

#ifdef SWIGPYTHON_BUILTIN
bool is_python_builtin() { return true; }
#else
bool is_python_builtin() { return false; }
#endif
%}
