summaryrefslogtreecommitdiff
path: root/share/swig/2.0.11/lua/_std_common.i
diff options
context:
space:
mode:
Diffstat (limited to 'share/swig/2.0.11/lua/_std_common.i')
-rw-r--r--share/swig/2.0.11/lua/_std_common.i93
1 files changed, 93 insertions, 0 deletions
diff --git a/share/swig/2.0.11/lua/_std_common.i b/share/swig/2.0.11/lua/_std_common.i
new file mode 100644
index 0000000..567e68b
--- /dev/null
+++ b/share/swig/2.0.11/lua/_std_common.i
@@ -0,0 +1,93 @@
+/* -----------------------------------------------------------------------------
+ * _std_common.i
+ *
+ * std::helpers for LUA
+ * ----------------------------------------------------------------------------- */
+
+%include <std_except.i> // the general exceptions
+
+/*
+The basic idea here, is instead of trying to feed SWIG all the
+horribly templated STL code, to give it a neatened version.
+
+These %defines cover some of the more common methods
+so the class declarations become just a set of %defines
+
+*/
+
+/* #define for basic container features
+note: I allow front(), back() & pop_back() to throw exceptions
+upon empty containers, rather than coredump
+(as we haven't defined the methods, we can use %extend to add with
+new features)
+
+*/
+%define %STD_CONTAINER_METHODS(CLASS,T)
+public:
+ CLASS();
+ CLASS(const CLASS&);
+ unsigned int size() const;
+ unsigned int max_size() const;
+ bool empty() const;
+ void clear();
+ %extend { // the extra stuff which must be checked
+ T front()const throw (std::out_of_range){ // only read front & back
+ if (self->empty())
+ throw std::out_of_range("in "#CLASS"::front()");
+ return self->front();
+ }
+ T back()const throw (std::out_of_range){ // not write to them
+ if (self->empty())
+ throw std::out_of_range("in "#CLASS"::back()");
+ return self->back();
+ }
+ }
+%enddef
+
+/* push/pop for front/back
+also note: front & back are read only methods, not used for writing
+*/
+%define %STD_FRONT_ACCESS_METHODS(CLASS,T)
+public:
+ void push_front(const T& val);
+ %extend { // must check this
+ void pop_front() throw (std::out_of_range){
+ if (self->empty())
+ throw std::out_of_range("in "#CLASS"::pop_front()");
+ self->pop_back();
+ }
+ }
+%enddef
+
+%define %STD_BACK_ACCESS_METHODS(CLASS,T)
+public:
+ void push_back(const T& val);
+ %extend { // must check this
+ void pop_back() throw (std::out_of_range){
+ if (self->empty())
+ throw std::out_of_range("in "#CLASS"::pop_back()");
+ self->pop_back();
+ }
+ }
+%enddef
+
+/*
+Random access methods
+*/
+%define %STD_RANDOM_ACCESS_METHODS(CLASS,T)
+ %extend // this is a extra bit of SWIG code
+ {
+ // [] is replaced by __getitem__ & __setitem__
+ // simply throws a string, which causes a lua error
+ T __getitem__(unsigned int idx) throw (std::out_of_range){
+ if (idx>=self->size())
+ throw std::out_of_range("in "#CLASS"::__getitem__()");
+ return (*self)[idx];
+ }
+ void __setitem__(unsigned int idx,const T& val) throw (std::out_of_range){
+ if (idx>=self->size())
+ throw std::out_of_range("in "#CLASS"::__setitem__()");
+ (*self)[idx]=val;
+ }
+ };
+%enddef