diff options
Diffstat (limited to 'Examples/ruby/exception_class')
-rw-r--r-- | Examples/ruby/exception_class/Makefile | 19 | ||||
-rw-r--r-- | Examples/ruby/exception_class/example.h | 51 | ||||
-rw-r--r-- | Examples/ruby/exception_class/example.i | 46 | ||||
-rw-r--r-- | Examples/ruby/exception_class/runme.rb | 45 |
4 files changed, 161 insertions, 0 deletions
diff --git a/Examples/ruby/exception_class/Makefile b/Examples/ruby/exception_class/Makefile new file mode 100644 index 0000000..016a5ad --- /dev/null +++ b/Examples/ruby/exception_class/Makefile @@ -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 diff --git a/Examples/ruby/exception_class/example.h b/Examples/ruby/exception_class/example.h new file mode 100644 index 0000000..9facde4 --- /dev/null +++ b/Examples/ruby/exception_class/example.h @@ -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; + } +}; + + + + + + + diff --git a/Examples/ruby/exception_class/example.i b/Examples/ruby/exception_class/example.i new file mode 100644 index 0000000..5094b7a --- /dev/null +++ b/Examples/ruby/exception_class/example.i @@ -0,0 +1,46 @@ +/* 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. */ +%catches(EmptyError) *::dequeue(); + + +/* What the catches 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>; diff --git a/Examples/ruby/exception_class/runme.rb b/Examples/ruby/exception_class/runme.rb new file mode 100644 index 0000000..c198c14 --- /dev/null +++ b/Examples/ruby/exception_class/runme.rb @@ -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 |