From a1d10b8e39ac879ce3ea064d5565ec8a07657459 Mon Sep 17 00:00:00 2001 From: Marcelo Matus Date: Wed, 30 Nov 2005 21:54:26 +0000 Subject: [PATCH] add more std::exception typemaps git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@7906 626c5289-ae23-0410-ae9c-e8d60b6d4f22 --- Lib/std/std_except.i | 61 +++++++++++++++++++++++++++++++++++++ Lib/std_except.i | 35 ++++++++++++++++++++- Lib/typemaps/std_except.swg | 5 +-- 3 files changed, 96 insertions(+), 5 deletions(-) diff --git a/Lib/std/std_except.i b/Lib/std/std_except.i index c04fe5432..50deaf1a7 100644 --- a/Lib/std/std_except.i +++ b/Lib/std/std_except.i @@ -1,3 +1,64 @@ %{ #include %} + +#if defined(SWIG_STD_EXCEPTIONS_AS_CLASSES) + +namespace std { + struct exception + { + virtual ~exception() throw(); + virtual const char* what() const throw(); + }; + + struct bad_exception : exception + { + }; + + struct logic_error : exception + { + logic_error(const string& msg); + }; + + struct domain_error : logic_error + { + domain_error(const string& msg); + }; + + struct invalid_argument : logic_error + { + invalid_argument(const string& msg); + }; + + struct length_error : logic_error + { + length_error(const string& msg); + }; + + struct out_of_range : logic_error + { + out_of_range(const string& msg); + }; + + struct runtime_error : exception + { + runtime_error(const string& msg); + }; + + struct range_error : runtime_error + { + range_error(const string& msg); + }; + + struct overflow_error : runtime_error + { + overflow_error(const string& msg); + }; + + struct underflow_error : runtime_error + { + underflow_error(const string& msg); + }; +} + +#endif diff --git a/Lib/std_except.i b/Lib/std_except.i index c71f7eb2f..de7cac9f5 100644 --- a/Lib/std_except.i +++ b/Lib/std_except.i @@ -8,5 +8,38 @@ // %include -%typemap(throws) std::out_of_range %{ SWIG_exception(SWIG_IndexError, $1.what()); %} + +/* + Mark all of std exception classes as "exception classes" via + the "exceptionclass" feature. + + If needed, you can disable it by using %noexceptionclass. +*/ + +%define %std_exception_map(Exception, Code) + %exceptionclass Exception; +#if !defined(SWIG_STD_EXCEPTIONS_AS_CLASSES) + %typemap(throws,noblock=1) Exception { + SWIG_exception(Code, $1.what()); + } + %ignore Exception; + struct Exception { + }; +#endif +%enddef + +namespace std { + %std_exception_map(bad_exception, SWIG_SystemError); + %std_exception_map(domain_error, SWIG_ValueError); + %std_exception_map(exception, SWIG_SystemError); + %std_exception_map(invalid_argument, SWIG_ValueError); + %std_exception_map(length_error, SWIG_IndexError); + %std_exception_map(logic_error, SWIG_RuntimeError); + %std_exception_map(out_of_range, SWIG_IndexError); + %std_exception_map(overflow_error, SWIG_OverflowError); + %std_exception_map(range_error, SWIG_OverflowError); + %std_exception_map(runtime_error, SWIG_RuntimeError); + %std_exception_map(underflow_error, SWIG_OverflowError); +} + diff --git a/Lib/typemaps/std_except.swg b/Lib/typemaps/std_except.swg index 13a1fbd66..f04d8b937 100644 --- a/Lib/typemaps/std_except.swg +++ b/Lib/typemaps/std_except.swg @@ -1,8 +1,5 @@ %include - -%{ -#include -%} +%include /* Mark all of std exception classes as "exception classes" via