Examples update to support C++17: exception specification throw removal
This commit is contained in:
parent
4e0b2f1402
commit
c9a10eb726
10 changed files with 40 additions and 119 deletions
|
|
@ -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
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue