New example showing use of %catchs and %

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@8355 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Charlie Savage 2006-01-10 22:45:58 +00:00
commit 650ea1c873
4 changed files with 160 additions and 0 deletions

View file

@ -0,0 +1,19 @@
TOP = ../..
SWIG = $(TOP)/../preinst-swig
CXXSRCS =
TARGET = example
INTERFACE = example.i
LIBS = -lm
all::
$(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \
TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' ruby_cpp
static::
$(MAKE) -f $(TOP)/Makefile CXXSRCS='$(CXXSRCS)' SWIG='$(SWIG)' \
TARGET='myruby' INTERFACE='$(INTERFACE)' ruby_cpp_static
clean::
$(MAKE) -f $(TOP)/Makefile ruby_clean
check: all

View file

@ -0,0 +1,51 @@
/* File : example.h */
// A simple exception
class EmptyError { };
class FullError {
public:
int maxsize;
FullError(int m) : maxsize(m) { }
};
template<typename T> class Queue {
int maxsize;
T *items;
int nitems;
int last;
public:
Queue(int size) {
maxsize = size;
items = new T[size];
nitems = 0;
last = 0;
}
~Queue() {
delete [] items;
}
void enqueue(T x) throw(FullError) {
if (nitems == maxsize) {
throw FullError(maxsize);
}
items[last] = x;
last = (last + 1) % maxsize;
nitems++;
}
T dequeue() {
T x;
if (nitems == 0) throw EmptyError();
x = items[(last + maxsize - nitems) % maxsize];
nitems--;
return x;
}
int length() {
return nitems;
}
};

View file

@ -0,0 +1,45 @@
/* This example illustrates the use of the %exceptionclass feature. By
default, if a method has a throws specification then SWIG will generate
code to catch the exception and pass it on the scripting language.
If a method does not have a throws specification, but does throw
an exception, then the %exceptionclass feature can be used to tell
SWIG about the exception class so it can be properly added to Ruby.
This is done by making the exception class inherit from rb_eRuntimeError.*/
%module example
%{
#include "example.h"
%}
/* The EmpytError doesn't appear in a throw declaration, and hence
we need to tell SWIG that the dequeue method throws it. This can
now be done via the %catchs feature. */
%catchs(EmptyError) *::dequeue();
/* What the catchs clause is doing under the covers is this:
%exceptionclass EmptyError;
%exception *::dequeue {
try {
$action
} catch(EmptyError& e) {
// Create a new instance of the EmptyError, wrap it as a Ruby object that Ruby owns,
// and return it as the exception. For this to work EmtpyError must inherit from
// a standard Ruby exception class such as rb_eRuntimeError. SWIG automatically does
// this when the class is marked as %exceptionclass or is a throws specification.
%raise(SWIG_NewPointerObj(new EmptyError(e), SWIGTYPE_p_EmptyError, SWIG_POINTER_OWN), "EmptyError", SWIGTYPE_p_EmptyError);
}
}
*/
/* Grab the original header file */
%include "example.h"
/* Instantiate a few templates */
%template(IntQueue) Queue<int>;
%template(DoubleQueue) Queue<double>;

View file

@ -0,0 +1,45 @@
require 'example'
q = Example::IntQueue.new(10)
puts "Inserting items into intQueue"
begin
0.upto(100) do |i|
q.enqueue(i)
end
rescue Example::FullError => e
puts "Maxsize is: #{e.maxsize}"
end
puts "Removing items"
begin
loop do
q.dequeue()
end
rescue Example::EmptyError => e
## do nothing
end
q = Example::DoubleQueue.new(1000)
puts "Inserting items into doubleQueue"
begin
0.upto(100) do |i|
q.enqueue(i*1.5)
end
rescue Example::FullError => e
puts "Maxsize is: #{e.maxsize}"
end
puts "Removing items"
begin
loop do
q.dequeue()
end
rescue Example::EmptyError => e
# do nothing
end