summaryrefslogtreecommitdiff
path: root/Examples/ruby/exception_class
diff options
context:
space:
mode:
Diffstat (limited to 'Examples/ruby/exception_class')
-rw-r--r--Examples/ruby/exception_class/Makefile19
-rw-r--r--Examples/ruby/exception_class/example.h51
-rw-r--r--Examples/ruby/exception_class/example.i46
-rw-r--r--Examples/ruby/exception_class/runme.rb45
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