Examples update to support C++17: exception specification throw removal

This commit is contained in:
William S Fulton 2018-05-03 19:20:42 +01:00
commit c9a10eb726
10 changed files with 40 additions and 119 deletions

View file

@ -16,34 +16,26 @@ public:
char msg[256]; char msg[256];
}; };
#if defined(_MSC_VER)
#pragma warning(disable: 4290) // C++ exception specification ignored except to indicate a function is not __declspec(nothrow)
#endif
#if __GNUC__ >= 7
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated" // dynamic exception specifications are deprecated in C++11
#endif
class Test { class Test {
public: public:
int simple() throw(int) { int simple() {
throw(37); throw(37);
return 1; return 1;
} }
int message() throw(const char *) { int message() {
throw("I died."); throw("I died.");
return 1; return 1;
} }
int hosed() throw(Exc) { int hosed() {
throw(Exc(42,"Hosed")); throw(Exc(42,"Hosed"));
return 1; return 1;
} }
int unknown() throw(A*) { int unknown() {
static A a; static A a;
throw &a; throw &a;
return 1; return 1;
} }
int multi(int x) throw(int, const char *, Exc) { int multi(int x) {
if (x == 1) throw(37); if (x == 1) throw(37);
if (x == 2) throw("Bleah!"); if (x == 2) throw("Bleah!");
if (x == 3) throw(Exc(42,"No-go-diggy-die")); if (x == 3) throw(Exc(42,"No-go-diggy-die"));
@ -51,10 +43,3 @@ public:
} }
}; };
#if defined(_MSC_VER)
#pragma warning(default: 4290) // C++ exception specification ignored except to indicate a function is not __declspec(nothrow)
#endif
#if __GNUC__ >= 7
#pragma GCC diagnostic pop
#endif

View file

@ -7,6 +7,12 @@
%include "std_string.i" %include "std_string.i"
%catches(int) Test::simple();
%catches(const char *) Test::message();
%catches(Exc) Test::hosed();
%catches(A*) Test::unknown();
%catches(int, const char *, Exc) Test::multi(int x);
/* Let's just grab the original header file here */ /* Let's just grab the original header file here */
%include "example.h" %include "example.h"

View file

@ -1,6 +1,6 @@
/* File : example.h */ /* File : example.h */
#include <string> #include <string.h>
#ifndef SWIG #ifndef SWIG
struct A { struct A {
}; };
@ -16,34 +16,26 @@ public:
char msg[256]; char msg[256];
}; };
#if defined(_MSC_VER)
#pragma warning(disable: 4290) // C++ exception specification ignored except to indicate a function is not __declspec(nothrow)
#endif
#if __GNUC__ >= 7
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated" // dynamic exception specifications are deprecated in C++11
#endif
class Test { class Test {
public: public:
int simple() throw(int) { int simple() {
throw(37); throw(37);
return 1; return 1;
} }
int message() throw(const char *) { int message() {
throw("I died."); throw("I died.");
return 1; return 1;
} }
int hosed() throw(Exc) { int hosed() {
throw(Exc(42,"Hosed")); throw(Exc(42,"Hosed"));
return 1; return 1;
} }
int unknown() throw(A*) { int unknown() {
static A a; static A a;
throw &a; throw &a;
return 1; return 1;
} }
int multi(int x) throw(int, const char *, Exc) { int multi(int x) {
if (x == 1) throw(37); if (x == 1) throw(37);
if (x == 2) throw("Bleah!"); if (x == 2) throw("Bleah!");
if (x == 3) throw(Exc(42,"No-go-diggy-die")); if (x == 3) throw(Exc(42,"No-go-diggy-die"));
@ -51,10 +43,3 @@ public:
} }
}; };
#if defined(_MSC_VER)
#pragma warning(default: 4290) // C++ exception specification ignored except to indicate a function is not __declspec(nothrow)
#endif
#if __GNUC__ >= 7
#pragma GCC diagnostic pop
#endif

View file

@ -12,6 +12,12 @@
// note: only works if Exc is copyable // note: only works if Exc is copyable
%apply SWIGTYPE EXCEPTION_BY_VAL {Exc}; %apply SWIGTYPE EXCEPTION_BY_VAL {Exc};
%catches(int) Test::simple();
%catches(const char *) Test::message();
%catches(Exc) Test::hosed();
%catches(A*) Test::unknown();
%catches(int, const char *, Exc) Test::multi(int x);
/* Let's just grab the original header file here */ /* Let's just grab the original header file here */
%include "example.h" %include "example.h"

View file

@ -1,6 +1,6 @@
/* File : example.h */ /* File : example.h */
#include <string> #include <string.h>
#ifndef SWIG #ifndef SWIG
struct A { struct A {
}; };
@ -16,34 +16,26 @@ public:
char msg[256]; char msg[256];
}; };
#if defined(_MSC_VER)
#pragma warning(disable: 4290) // C++ exception specification ignored except to indicate a function is not __declspec(nothrow)
#endif
#if __GNUC__ >= 7
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated" // dynamic exception specifications are deprecated in C++11
#endif
class Test { class Test {
public: public:
int simple() throw(int) { int simple() {
throw(37); throw(37);
return 1; return 1;
} }
int message() throw(const char *) { int message() {
throw("I died."); throw("I died.");
return 1; return 1;
} }
int hosed() throw(Exc) { int hosed() {
throw(Exc(42,"Hosed")); throw(Exc(42,"Hosed"));
return 1; return 1;
} }
int unknown() throw(A*) { int unknown() {
static A a; static A a;
throw &a; throw &a;
return 1; return 1;
} }
int multi(int x) throw(int, const char *, Exc) { int multi(int x) {
if (x == 1) throw(37); if (x == 1) throw(37);
if (x == 2) throw("Bleah!"); if (x == 2) throw("Bleah!");
if (x == 3) throw(Exc(42,"No-go-diggy-die")); if (x == 3) throw(Exc(42,"No-go-diggy-die"));
@ -51,10 +43,3 @@ public:
} }
}; };
#if defined(_MSC_VER)
#pragma warning(default: 4290) // C++ exception specification ignored except to indicate a function is not __declspec(nothrow)
#endif
#if __GNUC__ >= 7
#pragma GCC diagnostic pop
#endif

View file

@ -7,6 +7,12 @@
%include "std_string.i" %include "std_string.i"
%catches(int) Test::simple();
%catches(const char *) Test::message();
%catches(Exc) Test::hosed();
%catches(A*) Test::unknown();
%catches(int, const char *, Exc) Test::multi(int x);
/* Let's just grab the original header file here */ /* Let's just grab the original header file here */
%include "example.h" %include "example.h"

View file

@ -8,14 +8,6 @@ class FullError {
FullError(int m) : maxsize(m) { } FullError(int m) : maxsize(m) { }
}; };
#if defined(_MSC_VER)
#pragma warning(disable: 4290) // C++ exception specification ignored except to indicate a function is not __declspec(nothrow)
#endif
#if __GNUC__ >= 7
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated" // dynamic exception specifications are deprecated in C++11
#endif
template<typename T> class Queue { template<typename T> class Queue {
int maxsize; int maxsize;
T *items; T *items;
@ -31,7 +23,7 @@ template<typename T> class Queue {
~Queue() { ~Queue() {
delete [] items; delete [] items;
} }
void enqueue(T x) throw(FullError) { void enqueue(T x) {
if (nitems == maxsize) { if (nitems == maxsize) {
throw FullError(maxsize); throw FullError(maxsize);
} }
@ -51,11 +43,3 @@ template<typename T> class Queue {
} }
}; };
#if defined(_MSC_VER)
#pragma warning(default: 4290) // C++ exception specification ignored except to indicate a function is not __declspec(nothrow)
#endif
#if __GNUC__ >= 7
#pragma GCC diagnostic pop
#endif

View file

@ -20,29 +20,12 @@
the header file, the enqueue method throws FullError and the header file, the enqueue method throws FullError and
the dequeue method throws EmptyError. Since we don't the dequeue method throws EmptyError. Since we don't
want to define an exception handler for everything, we want to define an exception handler for everything, we
simply write a handler each method individually. simply write a handler for each method individually.
Note: the *::enqueue syntax means that we simply define Note: the *::enqueue syntax means that we simply define
the handler for any class with this method defined. the handler for any class with this method defined.
*/ */
/*
First we need to 'disable' the default swig throw mechanism for the
FullError class. We do this by rethrowing the exception.
Note that this is necessary since the class appears in a throw
declaration:
void enqueue(T x) throw(FullError);
hence, swig recognizes it as an exception class and it will generate
the necessary code to catch it and rethrow it to the python side.
*/
%typemap(throws) FullError "(void)$1; throw;";
%exception *::enqueue { %exception *::enqueue {
try { try {
$action $action
@ -76,7 +59,7 @@
*/ */
/* /*
Now, the EmpytError doesn't appear in a throw declaration, and hence Now, the EmptyError doesn't appear in a throw declaration, and hence
we need to 'mark' it as an exception class. In python, classes that we need to 'mark' it as an exception class. In python, classes that
are used as exception are 'special', and need to be wrapped as are used as exception are 'special', and need to be wrapped as
'classic' ones. 'classic' ones.

View file

@ -8,14 +8,6 @@ class FullError {
FullError(int m) : maxsize(m) { } FullError(int m) : maxsize(m) { }
}; };
#if defined(_MSC_VER)
#pragma warning(disable: 4290) // C++ exception specification ignored except to indicate a function is not __declspec(nothrow)
#endif
#if __GNUC__ >= 7
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated" // dynamic exception specifications are deprecated in C++11
#endif
template<typename T> class Queue { template<typename T> class Queue {
int maxsize; int maxsize;
T *items; T *items;
@ -31,7 +23,7 @@ template<typename T> class Queue {
~Queue() { ~Queue() {
delete [] items; delete [] items;
} }
void enqueue(T x) throw(FullError) { void enqueue(T x) {
if (nitems == maxsize) { if (nitems == maxsize) {
throw FullError(maxsize); throw FullError(maxsize);
} }
@ -51,15 +43,3 @@ template<typename T> class Queue {
} }
}; };
#if defined(_MSC_VER)
#pragma warning(default: 4290) // C++ exception specification ignored except to indicate a function is not __declspec(nothrow)
#endif
#if __GNUC__ >= 7
#pragma GCC diagnostic pop
#endif

View file

@ -17,6 +17,7 @@
/* The EmpytError doesn't appear in a throw declaration, and hence /* The EmpytError doesn't appear in a throw declaration, and hence
we need to tell SWIG that the dequeue method throws it. This can we need to tell SWIG that the dequeue method throws it. This can
now be done via the %catchs feature. */ now be done via the %catchs feature. */
%catches(FullError) *::enqueue;
%catches(EmptyError) *::dequeue(); %catches(EmptyError) *::dequeue();