1 /* -----------------------------------------------------------------------------
2 * See the LICENSE file for information on copyright, usage and redistribution
3 * of SWIG, and the README file for authors - http://www.swig.org/release.html.
7 * Users can derive form the OctSwigIterator to implemet their
8 * own iterators. As an example (real one since we use it for STL/STD
9 * containers), the template OctSwigIterator_T does the
10 * implementation for generic C++ iterators.
11 * ----------------------------------------------------------------------------- */
13 %include <std_common.i>
15 %fragment("OctSwigIterator","header") {
17 struct stop_iteration {
20 struct OctSwigIterator {
25 OctSwigIterator(octave_value seq) : _seq(seq)
30 virtual ~OctSwigIterator() {}
32 virtual octave_value value() const = 0;
34 virtual OctSwigIterator *incr(size_t n = 1) = 0;
36 virtual OctSwigIterator *decr(size_t n = 1)
38 throw stop_iteration();
41 virtual ptrdiff_t distance(const OctSwigIterator &x) const
43 throw std::invalid_argument("operation not supported");
46 virtual bool equal (const OctSwigIterator &x) const
48 throw std::invalid_argument("operation not supported");
51 virtual OctSwigIterator *copy() const = 0;
55 octave_value obj = value();
60 octave_value previous()
66 OctSwigIterator *advance(ptrdiff_t n)
68 return (n > 0) ? incr(n) : decr(-n);
71 bool operator == (const OctSwigIterator& x) const
76 bool operator != (const OctSwigIterator& x) const
78 return ! operator==(x);
81 OctSwigIterator* operator ++ () {
86 OctSwigIterator* operator -- () {
91 OctSwigIterator* operator + (ptrdiff_t n) const
93 return copy()->advance(n);
96 OctSwigIterator* operator - (ptrdiff_t n) const
98 return copy()->advance(-n);
101 ptrdiff_t operator - (const OctSwigIterator& x) const
103 return x.distance(*this);
106 static swig_type_info* descriptor() {
108 static swig_type_info* desc = 0;
110 desc = SWIG_TypeQuery("swig::OctSwigIterator *");
119 %fragment("OctSwigIterator_T","header",fragment="OctSwigIterator",fragment="StdTraits",fragment="StdIteratorTraits") {
121 template<typename OutIterator>
122 class OctSwigIterator_T : public OctSwigIterator
125 typedef OutIterator out_iterator;
126 typedef typename std::iterator_traits<out_iterator>::value_type value_type;
127 typedef OctSwigIterator_T<out_iterator> self_type;
129 OctSwigIterator_T(out_iterator curr, octave_value seq)
130 : OctSwigIterator(seq), current(curr)
134 const out_iterator& get_current() const
140 bool equal (const OctSwigIterator &iter) const
142 const self_type *iters = dynamic_cast<const self_type *>(&iter);
144 return (current == iters->get_current());
146 throw std::invalid_argument("bad iterator type");
150 ptrdiff_t distance(const OctSwigIterator &iter) const
152 const self_type *iters = dynamic_cast<const self_type *>(&iter);
154 return std::distance(current, iters->get_current());
156 throw std::invalid_argument("bad iterator type");
161 out_iterator current;
164 template <class ValueType>
167 typedef const ValueType& argument_type;
168 typedef octave_value result_type;
169 result_type operator()(argument_type v) const
171 return swig::from(v);
175 template<typename OutIterator,
176 typename ValueType = typename std::iterator_traits<OutIterator>::value_type,
177 typename FromOper = from_oper<ValueType> >
178 class OctSwigIteratorOpen_T : public OctSwigIterator_T<OutIterator>
182 typedef OutIterator out_iterator;
183 typedef ValueType value_type;
184 typedef OctSwigIterator_T<out_iterator> base;
185 typedef OctSwigIteratorOpen_T<OutIterator, ValueType, FromOper> self_type;
187 OctSwigIteratorOpen_T(out_iterator curr, octave_value seq)
188 : OctSwigIterator_T<OutIterator>(curr, seq)
192 octave_value value() const {
193 return from(static_cast<const value_type&>(*(base::current)));
196 OctSwigIterator *copy() const
198 return new self_type(*this);
201 OctSwigIterator *incr(size_t n = 1)
209 OctSwigIterator *decr(size_t n = 1)
218 template<typename OutIterator,
219 typename ValueType = typename std::iterator_traits<OutIterator>::value_type,
220 typename FromOper = from_oper<ValueType> >
221 class OctSwigIteratorClosed_T : public OctSwigIterator_T<OutIterator>
225 typedef OutIterator out_iterator;
226 typedef ValueType value_type;
227 typedef OctSwigIterator_T<out_iterator> base;
228 typedef OctSwigIteratorClosed_T<OutIterator, ValueType, FromOper> self_type;
230 OctSwigIteratorClosed_T(out_iterator curr, out_iterator first, out_iterator last, octave_value seq)
231 : OctSwigIterator_T<OutIterator>(curr, seq), begin(first), end(last)
235 octave_value value() const {
236 if (base::current == end) {
237 throw stop_iteration();
239 return from(static_cast<const value_type&>(*(base::current)));
243 OctSwigIterator *copy() const
245 return new self_type(*this);
248 OctSwigIterator *incr(size_t n = 1)
251 if (base::current == end) {
252 throw stop_iteration();
260 OctSwigIterator *decr(size_t n = 1)
263 if (base::current == begin) {
264 throw stop_iteration();
277 template<typename OutIter>
278 inline OctSwigIterator*
279 make_output_iterator(const OutIter& current, const OutIter& begin,const OutIter& end, octave_value seq = octave_value())
281 return new OctSwigIteratorClosed_T<OutIter>(current, begin, end, seq);
284 template<typename OutIter>
285 inline OctSwigIterator*
286 make_output_iterator(const OutIter& current, octave_value seq = octave_value())
288 return new OctSwigIteratorOpen_T<OutIter>(current, seq);
294 %fragment("OctSwigIterator");
297 // Throw a StopIteration exception
298 %ignore stop_iteration;
299 struct stop_iteration {};
301 %typemap(throws) stop_iteration {
302 error("stop_iteration exception");
306 // Mark methods that return new objects
307 %newobject OctSwigIterator::copy;
308 %newobject OctSwigIterator::operator + (ptrdiff_t n) const;
309 %newobject OctSwigIterator::operator - (ptrdiff_t n) const;
311 %nodirector OctSwigIterator;
313 %catches(swig::stop_iteration) OctSwigIterator::value() const;
314 %catches(swig::stop_iteration) OctSwigIterator::incr(size_t n = 1);
315 %catches(swig::stop_iteration) OctSwigIterator::decr(size_t n = 1);
316 %catches(std::invalid_argument) OctSwigIterator::distance(const OctSwigIterator &x) const;
317 %catches(std::invalid_argument) OctSwigIterator::equal (const OctSwigIterator &x) const;
318 %catches(swig::stop_iteration) OctSwigIterator::next();
319 %catches(swig::stop_iteration) OctSwigIterator::previous();
320 %catches(swig::stop_iteration) OctSwigIterator::advance(ptrdiff_t n);
321 %catches(swig::stop_iteration) OctSwigIterator::operator += (ptrdiff_t n);
322 %catches(swig::stop_iteration) OctSwigIterator::operator -= (ptrdiff_t n);
323 %catches(swig::stop_iteration) OctSwigIterator::operator + (ptrdiff_t n) const;
324 %catches(swig::stop_iteration) OctSwigIterator::operator - (ptrdiff_t n) const;
327 struct OctSwigIterator
330 OctSwigIterator(octave_value seq);
333 virtual ~OctSwigIterator();
335 virtual octave_value value() const = 0;
337 virtual OctSwigIterator *incr(size_t n = 1) = 0;
339 virtual OctSwigIterator *decr(size_t n = 1);
341 virtual ptrdiff_t distance(const OctSwigIterator &x) const;
343 virtual bool equal (const OctSwigIterator &x) const;
345 virtual OctSwigIterator *copy() const = 0;
348 octave_value previous();
349 OctSwigIterator *advance(ptrdiff_t n);
351 bool operator == (const OctSwigIterator& x) const;
352 bool operator != (const OctSwigIterator& x) const;
353 OctSwigIterator* operator ++ ();
354 OctSwigIterator* operator -- ();
355 OctSwigIterator* operator + (ptrdiff_t n) const;
356 OctSwigIterator* operator - (ptrdiff_t n) const;
357 ptrdiff_t operator - (const OctSwigIterator& x) const;