1899
|
1 /* -----------------------------------------------------------------------------
|
|
2 * _std_common.i
|
|
3 *
|
|
4 * std::helpers for LUA
|
|
5 * ----------------------------------------------------------------------------- */
|
|
6
|
|
7 %include <std_except.i> // the general exceptions
|
|
8
|
|
9 /*
|
|
10 The basic idea here, is instead of trying to feed SWIG all the
|
|
11 horribly templated STL code, to give it a neatened version.
|
|
12
|
|
13 These %defines cover some of the more common methods
|
|
14 so the class declarations become just a set of %defines
|
|
15
|
|
16 */
|
|
17
|
|
18 /* #define for basic container features
|
|
19 note: I allow front(), back() & pop_back() to throw exceptions
|
|
20 upon empty containers, rather than coredump
|
|
21 (as we haven't defined the methods, we can use %extend to add with
|
|
22 new features)
|
|
23
|
|
24 */
|
|
25 %define %STD_CONTAINER_METHODS(CLASS,T)
|
|
26 public:
|
|
27 CLASS();
|
|
28 CLASS(const CLASS&);
|
|
29 unsigned int size() const;
|
|
30 unsigned int max_size() const;
|
|
31 bool empty() const;
|
|
32 void clear();
|
|
33 %extend { // the extra stuff which must be checked
|
|
34 T front()const throw (std::out_of_range){ // only read front & back
|
|
35 if (self->empty())
|
|
36 throw std::out_of_range("in "#CLASS"::front()");
|
|
37 return self->front();
|
|
38 }
|
|
39 T back()const throw (std::out_of_range){ // not write to them
|
|
40 if (self->empty())
|
|
41 throw std::out_of_range("in "#CLASS"::back()");
|
|
42 return self->back();
|
|
43 }
|
|
44 }
|
|
45 %enddef
|
|
46
|
|
47 /* push/pop for front/back
|
|
48 also note: front & back are read only methods, not used for writing
|
|
49 */
|
|
50 %define %STD_FRONT_ACCESS_METHODS(CLASS,T)
|
|
51 public:
|
|
52 void push_front(const T& val);
|
|
53 %extend { // must check this
|
|
54 void pop_front() throw (std::out_of_range){
|
|
55 if (self->empty())
|
|
56 throw std::out_of_range("in "#CLASS"::pop_front()");
|
|
57 self->pop_back();
|
|
58 }
|
|
59 }
|
|
60 %enddef
|
|
61
|
|
62 %define %STD_BACK_ACCESS_METHODS(CLASS,T)
|
|
63 public:
|
|
64 void push_back(const T& val);
|
|
65 %extend { // must check this
|
|
66 void pop_back() throw (std::out_of_range){
|
|
67 if (self->empty())
|
|
68 throw std::out_of_range("in "#CLASS"::pop_back()");
|
|
69 self->pop_back();
|
|
70 }
|
|
71 }
|
|
72 %enddef
|
|
73
|
|
74 /*
|
|
75 Random access methods
|
|
76 */
|
|
77 %define %STD_RANDOM_ACCESS_METHODS(CLASS,T)
|
|
78 %extend // this is a extra bit of SWIG code
|
|
79 {
|
|
80 // [] is replaced by __getitem__ & __setitem__
|
|
81 // simply throws a string, which causes a lua error
|
|
82 T __getitem__(unsigned int idx) throw (std::out_of_range){
|
|
83 if (idx>=self->size())
|
|
84 throw std::out_of_range("in "#CLASS"::__getitem__()");
|
|
85 return (*self)[idx];
|
|
86 }
|
|
87 void __setitem__(unsigned int idx,const T& val) throw (std::out_of_range){
|
|
88 if (idx>=self->size())
|
|
89 throw std::out_of_range("in "#CLASS"::__setitem__()");
|
|
90 (*self)[idx]=val;
|
|
91 }
|
|
92 };
|
|
93 %enddef
|