1/* -----------------------------------------------------------------------------
2 * rubyiterators.swg
3 *
4 * Implement a C++ 'output' iterator for Ruby.
5 *
6 * Users can derive form the Iterator to implement their
7 * own iterators. As an example (real one since we use it for STL/STD
8 * containers), the template Iterator_T does the
9 * implementation for generic C++ iterators.
10 * ----------------------------------------------------------------------------- */
11
12%include <std_common.i>
13
14
15%fragment("ConstIterator","header",fragment="<stddef.h>",fragment="GC_VALUE_definition") {
16namespace swig {
17  struct stop_iteration {
18  };
19
20  /**
21   * Abstract base class used to represent all iterators of STL containers.
22   */
23  struct ConstIterator {
24  public:
25    typedef ConstIterator self_type;
26
27  protected:
28    GC_VALUE _seq;
29
30  protected:
31    ConstIterator(VALUE seq) : _seq(seq)
32    {
33    }
34
35    // Random access iterator methods, but not required in Ruby
36    virtual ptrdiff_t distance(const ConstIterator &x) const
37    {
38      throw std::invalid_argument("distance not supported");
39    }
40
41    virtual bool equal (const ConstIterator &x) const
42    {
43      throw std::invalid_argument("equal not supported");
44    }
45
46    virtual self_type* advance(ptrdiff_t n)
47    {
48      throw std::invalid_argument("advance not supported");
49    }
50
51  public:
52    virtual ~ConstIterator() {}
53
54    // Access iterator method, required by Ruby
55    virtual VALUE value() const {
56      throw std::invalid_argument("value not supported");
57      return Qnil;
58    };
59
60    virtual VALUE setValue( const VALUE& v ) {
61      throw std::invalid_argument("value= not supported");
62      return Qnil;
63    }
64
65    virtual self_type* next( size_t n = 1 )
66    {
67      return this->advance( n );
68    }
69
70    virtual self_type* previous( size_t n = 1 )
71    {
72      ptrdiff_t nn = n;
73      return this->advance( -nn );
74    }
75
76    virtual VALUE to_s() const {
77      throw std::invalid_argument("to_s not supported");
78      return Qnil;
79    }
80
81    virtual VALUE inspect() const {
82      throw std::invalid_argument("inspect not supported");
83      return Qnil;
84    }
85
86    virtual ConstIterator *dup() const
87    {
88      throw std::invalid_argument("dup not supported");
89      return NULL;
90    }
91
92    //
93    // C++ common/needed methods.  We emulate a bidirectional
94    // operator, to be compatible with all the STL.
95    // The iterator traits will then tell the STL what type of
96    // iterator we really are.
97    //
98    ConstIterator() : _seq( Qnil )
99    {
100    }
101
102    ConstIterator( const self_type& b ) : _seq( b._seq )
103    {
104    }
105
106    self_type& operator=( const self_type& b )
107    {
108      _seq = b._seq;
109      return *this;
110    }
111
112    bool operator == (const ConstIterator& x)  const
113    {
114      return equal(x);
115    }
116
117    bool operator != (const ConstIterator& x) const
118    {
119      return ! operator==(x);
120    }
121
122    // Pre-decrement operator
123    self_type& operator--()
124    {
125      return *previous();
126    }
127
128    // Pre-increment operator
129    self_type& operator++()
130    {
131      return *next();
132    }
133
134    // Post-decrement operator
135    self_type operator--(int)
136    {
137      self_type r = *this;
138      previous();
139      return r;
140    }
141
142    // Post-increment operator
143    self_type operator++(int)
144    {
145      self_type r = *this;
146      next();
147      return r;
148    }
149
150    ConstIterator& operator += (ptrdiff_t n)
151    {
152      return *advance(n);
153    }
154
155    ConstIterator& operator -= (ptrdiff_t n)
156    {
157      return *advance(-n);
158    }
159
160    ConstIterator* operator + (ptrdiff_t n) const
161    {
162      return dup()->advance(n);
163    }
164
165    ConstIterator* operator - (ptrdiff_t n) const
166    {
167      return dup()->advance(-n);
168    }
169
170    ptrdiff_t operator - (const ConstIterator& x) const
171    {
172      return x.distance(*this);
173    }
174
175    static swig_type_info* descriptor() {
176      static int init = 0;
177      static swig_type_info* desc = 0;
178      if (!init) {
179	desc = SWIG_TypeQuery("swig::ConstIterator *");
180	init = 1;
181      }
182      return desc;
183    }
184  };
185
186
187  /**
188   * Abstract base class used to represent all non-const iterators of STL containers.
189   *
190   */
191  struct Iterator : public ConstIterator {
192  public:
193    typedef Iterator self_type;
194
195  protected:
196    Iterator(VALUE seq) : ConstIterator(seq)
197    {
198    }
199
200    virtual self_type* advance(ptrdiff_t n)
201    {
202      throw std::invalid_argument("operation not supported");
203    }
204
205  public:
206    static swig_type_info* descriptor() {
207      static int init = 0;
208      static swig_type_info* desc = 0;
209      if (!init) {
210	desc = SWIG_TypeQuery("swig::Iterator *");
211	init = 1;
212      }
213      return desc;
214    }
215
216    virtual Iterator *dup() const
217    {
218      throw std::invalid_argument("dup not supported");
219      return NULL;
220    }
221
222    virtual self_type* next( size_t n = 1 )
223    {
224      return this->advance( n );
225    }
226
227    virtual self_type* previous( size_t n = 1 )
228    {
229      ptrdiff_t nn = n;
230      return this->advance( -nn );
231    }
232
233    bool operator == (const ConstIterator& x)  const
234    {
235      return equal(x);
236    }
237
238    bool operator != (const Iterator& x) const
239    {
240      return ! operator==(x);
241    }
242
243    Iterator& operator += (ptrdiff_t n)
244    {
245      return *advance(n);
246    }
247
248    Iterator& operator -= (ptrdiff_t n)
249    {
250      return *advance(-n);
251    }
252
253    Iterator* operator + (ptrdiff_t n) const
254    {
255      return dup()->advance(n);
256    }
257
258    Iterator* operator - (ptrdiff_t n) const
259    {
260      return dup()->advance(-n);
261    }
262
263    ptrdiff_t operator - (const Iterator& x) const
264    {
265      return x.distance(*this);
266    }
267  };
268
269}
270}
271
272
273%fragment("ConstIterator_T","header",fragment="<stddef.h>",fragment="ConstIterator",fragment="StdTraits",fragment="StdIteratorTraits") {
274namespace swig {
275
276  /**
277   * Templated base classes for all custom const_iterators.
278   *
279   */
280  template<typename OutConstIterator>
281  class ConstIterator_T :  public ConstIterator
282  {
283  public:
284    typedef OutConstIterator const_iter;
285    typedef typename std::iterator_traits<const_iter>::value_type value_type;
286    typedef ConstIterator_T<const_iter> self_type;
287
288  protected:
289
290
291    virtual bool equal (const ConstIterator &iter) const
292    {
293      const self_type *iters = dynamic_cast<const self_type *>(&iter);
294      if (iters) {
295	return (current == iters->get_current());
296      } else {
297	throw std::invalid_argument("bad iterator type");
298      }
299    }
300
301    virtual ptrdiff_t distance(const ConstIterator &iter) const
302    {
303      const self_type *iters = dynamic_cast<const self_type *>(&iter);
304      if (iters) {
305	return std::distance(current, iters->get_current());
306      } else {
307	throw std::invalid_argument("bad iterator type");
308      }
309    }
310
311    virtual ConstIterator* advance(ptrdiff_t n)
312    {
313      std::advance( current, n );
314      return this;
315    }
316
317  public:
318    ConstIterator_T() : ConstIterator(Qnil)
319    {
320    }
321
322    ConstIterator_T(const_iter curr, VALUE seq = Qnil)
323      : ConstIterator(seq), current(curr)
324    {
325    }
326
327    const const_iter& get_current() const
328    {
329      return current;
330    }
331
332    const value_type& operator*() const
333    {
334      return *current;
335    }
336
337    virtual VALUE inspect() const
338    {
339      VALUE ret = rb_str_new2("#<");
340      ret = rb_str_cat2( ret, rb_obj_classname(_seq) );
341      ret = rb_str_cat2( ret, "::const_iterator " );
342      VALUE cur = value();
343      ret = rb_str_concat( ret, rb_inspect(cur) );
344      ret = rb_str_cat2( ret, ">" );
345      return ret;
346    }
347
348    virtual VALUE to_s()    const
349    {
350      VALUE ret = rb_str_new2( rb_obj_classname(_seq) );
351      ret = rb_str_cat2( ret, "::const_iterator " );
352      VALUE cur = value();
353      ret = rb_str_concat( ret, rb_obj_as_string(cur) );
354      return ret;
355    }
356
357  protected:
358    const_iter current;
359  };
360
361
362  /**
363   * Templated base classes for all custom non-const iterators.
364   *
365   */
366  template<typename InOutIterator>
367  class Iterator_T :  public Iterator
368  {
369  public:
370    typedef InOutIterator nonconst_iter;
371
372    // Make this class iterator STL compatible, by using iterator_traits
373    typedef typename std::iterator_traits<nonconst_iter >::iterator_category iterator_category;
374    typedef typename std::iterator_traits<nonconst_iter >::value_type        value_type;
375    typedef typename std::iterator_traits<nonconst_iter >::difference_type   difference_type;
376    typedef typename std::iterator_traits<nonconst_iter >::pointer           pointer;
377    typedef typename std::iterator_traits<nonconst_iter >::reference         reference;
378
379    typedef Iterator                         base;
380    typedef Iterator_T< nonconst_iter > self_type;
381
382  protected:
383
384    virtual bool equal (const ConstIterator &iter) const
385    {
386      const self_type *iters = dynamic_cast<const self_type *>(&iter);
387      if (iters) {
388	return (current == iters->get_current());
389      } else {
390	throw std::invalid_argument("bad iterator type");
391      }
392    }
393
394    virtual ptrdiff_t distance(const ConstIterator &iter) const
395    {
396      const self_type *iters = dynamic_cast<const self_type *>(&iter);
397      if (iters) {
398	return std::distance(current, iters->get_current());
399      } else {
400	throw std::invalid_argument("bad iterator type");
401      }
402    }
403
404    virtual Iterator* advance(ptrdiff_t n)
405    {
406      std::advance( current, n );
407      return this;
408    }
409
410  public:
411
412    Iterator_T(nonconst_iter curr, VALUE seq = Qnil)
413      : Iterator(seq), current(curr)
414    {
415    }
416
417    const nonconst_iter& get_current() const
418    {
419      return current;
420    }
421
422    self_type& operator=( const self_type& b )
423    {
424      base::operator=( b );
425      return *this;
426    }
427
428    self_type& operator=( const value_type& b )
429    {
430      *current = b;
431      return *this;
432    }
433
434    const value_type& operator*() const
435    {
436      return *current;
437    }
438
439    value_type& operator*()
440    {
441      return *current;
442    }
443
444    virtual VALUE inspect() const
445    {
446      VALUE ret = rb_str_new2("#<");
447      ret = rb_str_cat2( ret, rb_obj_classname(_seq) );
448      ret = rb_str_cat2( ret, "::iterator " );
449      VALUE cur = value();
450      ret = rb_str_concat( ret, rb_inspect(cur) );
451      ret = rb_str_cat2( ret, ">" );
452      return ret;
453    }
454
455    virtual VALUE to_s()    const
456    {
457      VALUE ret = rb_str_new2( rb_obj_classname(_seq) );
458      ret = rb_str_cat2( ret, "::iterator " );
459      VALUE cur = value();
460      ret = rb_str_concat( ret, rb_obj_as_string(cur) );
461      return ret;
462    }
463
464  protected:
465    nonconst_iter current;
466  };
467
468
469  /**
470   * Auxiliary functor to store the value of a ruby object inside
471   * a reference of a compatible C++ type.  ie: Ruby -> C++
472   *
473   */
474  template <class ValueType>
475  struct asval_oper
476  {
477    typedef ValueType    value_type;
478    typedef bool        result_type;
479    bool operator()(VALUE obj, value_type& v) const
480    {
481      return ( swig::asval< value_type >(obj, &v) == SWIG_OK );
482    }
483  };
484
485  /**
486   * Auxiliary functor to return a ruby object from a C++ type.
487   * ie: C++ -> Ruby
488   *
489   */
490  template <class ValueType>
491  struct from_oper
492  {
493    typedef const ValueType& argument_type;
494    typedef VALUE result_type;
495    result_type operator()(argument_type v) const
496    {
497      return swig::from(v);
498    }
499  };
500
501
502  /**
503   * ConstIterator class for a const_iterator with no end() boundaries.
504   *
505   */
506  template<typename OutConstIterator,
507	   typename ValueType = typename std::iterator_traits<OutConstIterator>::value_type,
508	   typename FromOper = from_oper<ValueType> >
509  class ConstIteratorOpen_T :  public ConstIterator_T<OutConstIterator>
510  {
511  public:
512    FromOper from;
513    typedef OutConstIterator const_iter;
514    typedef ValueType value_type;
515    typedef ConstIterator_T<const_iter>  base;
516    typedef ConstIteratorOpen_T<OutConstIterator, ValueType, FromOper> self_type;
517
518    ConstIteratorOpen_T(const_iter curr, VALUE seq = Qnil)
519      : ConstIterator_T<OutConstIterator>(curr, seq)
520    {
521    }
522
523    virtual VALUE value() const {
524      return from(static_cast<const value_type&>(*(base::current)));
525    }
526
527    ConstIterator *dup() const
528    {
529      return new self_type(*this);
530    }
531  };
532
533  /**
534   * Iterator class for an iterator with no end() boundaries.
535   *
536   */
537  template<typename InOutIterator,
538	   typename ValueType = typename std::iterator_traits<InOutIterator>::value_type,
539	   typename FromOper = from_oper<ValueType>,
540	   typename AsvalOper = asval_oper<ValueType> >
541  class IteratorOpen_T :  public Iterator_T<InOutIterator>
542  {
543  public:
544    FromOper  from;
545    AsvalOper asval;
546    typedef InOutIterator nonconst_iter;
547    typedef ValueType value_type;
548    typedef Iterator_T<nonconst_iter>  base;
549    typedef IteratorOpen_T<InOutIterator, ValueType, FromOper, AsvalOper> self_type;
550
551  public:
552    IteratorOpen_T(nonconst_iter curr, VALUE seq = Qnil)
553      : Iterator_T<InOutIterator>(curr, seq)
554    {
555    }
556
557    virtual VALUE value() const {
558      return from(static_cast<const value_type&>(*(base::current)));
559    }
560
561    virtual VALUE setValue( const VALUE& v )
562    {
563      value_type& dst = *base::current;
564      if ( asval(v, dst) ) return v;
565      return Qnil;
566    }
567
568    Iterator *dup() const
569    {
570      return new self_type(*this);
571    }
572  };
573
574  /**
575   * ConstIterator class for a const_iterator where begin() and end() boundaries are known.
576   *
577   */
578  template<typename OutConstIterator,
579	   typename ValueType = typename std::iterator_traits<OutConstIterator>::value_type,
580	   typename FromOper = from_oper<ValueType> >
581  class ConstIteratorClosed_T :  public ConstIterator_T<OutConstIterator>
582  {
583  public:
584    FromOper from;
585    typedef OutConstIterator const_iter;
586    typedef ValueType value_type;
587    typedef ConstIterator_T<const_iter>  base;
588    typedef ConstIteratorClosed_T<OutConstIterator, ValueType, FromOper> self_type;
589
590  protected:
591    virtual ConstIterator* advance(ptrdiff_t n)
592    {
593      std::advance( base::current, n );
594      if ( base::current == end )
595	throw stop_iteration();
596      return this;
597    }
598
599  public:
600    ConstIteratorClosed_T(const_iter curr, const_iter first,
601			  const_iter last, VALUE seq = Qnil)
602      : ConstIterator_T<OutConstIterator>(curr, seq), begin(first), end(last)
603    {
604    }
605
606    virtual VALUE value() const {
607      if (base::current == end) {
608	throw stop_iteration();
609      } else {
610	return from(static_cast<const value_type&>(*(base::current)));
611      }
612    }
613
614    ConstIterator *dup() const
615    {
616      return new self_type(*this);
617    }
618
619
620  private:
621    const_iter begin;
622    const_iter end;
623  };
624
625  /**
626   * Iterator class for a iterator where begin() and end() boundaries are known.
627   *
628   */
629  template<typename InOutIterator,
630	   typename ValueType = typename std::iterator_traits<InOutIterator>::value_type,
631	   typename FromOper = from_oper<ValueType>,
632	   typename AsvalOper = asval_oper<ValueType> >
633  class IteratorClosed_T :  public Iterator_T<InOutIterator>
634  {
635  public:
636    FromOper   from;
637    AsvalOper asval;
638    typedef InOutIterator nonconst_iter;
639    typedef ValueType value_type;
640    typedef Iterator_T<nonconst_iter>  base;
641    typedef IteratorClosed_T<InOutIterator, ValueType, FromOper, AsvalOper> self_type;
642
643  protected:
644    virtual Iterator* advance(ptrdiff_t n)
645    {
646      std::advance( base::current, n );
647      if ( base::current == end )
648	throw stop_iteration();
649      return this;
650    }
651
652  public:
653    IteratorClosed_T(nonconst_iter curr, nonconst_iter first,
654		     nonconst_iter last, VALUE seq = Qnil)
655      : Iterator_T<InOutIterator>(curr, seq), begin(first), end(last)
656    {
657    }
658
659    virtual VALUE value() const {
660      if (base::current == end) {
661	throw stop_iteration();
662      } else {
663	return from(static_cast<const value_type&>(*(base::current)));
664      }
665    }
666
667    // Iterator setter method, required by Ruby
668    virtual VALUE setValue( const VALUE& v )
669    {
670      if (base::current == end)
671	throw stop_iteration();
672
673      value_type& dst = *base::current;
674      if ( asval( v, dst ) ) return v;
675      return Qnil;
676    }
677
678    Iterator *dup() const
679    {
680      return new self_type(*this);
681    }
682
683  private:
684    nonconst_iter begin;
685    nonconst_iter end;
686  };
687
688  /* Partial specialization for bools which don't allow de-referencing */
689  template< typename InOutIterator, typename FromOper, typename AsvalOper >
690  class IteratorOpen_T< InOutIterator, bool, FromOper, AsvalOper > :
691    public Iterator_T<InOutIterator>
692  {
693  public:
694    FromOper   from;
695    AsvalOper asval;
696    typedef InOutIterator nonconst_iter;
697    typedef bool value_type;
698    typedef Iterator_T<nonconst_iter>  base;
699    typedef IteratorOpen_T<InOutIterator, bool, FromOper, AsvalOper> self_type;
700
701    IteratorOpen_T(nonconst_iter curr, VALUE seq = Qnil)
702      : Iterator_T<InOutIterator>(curr, seq)
703    {
704    }
705
706    virtual VALUE value() const {
707      return from(static_cast<const value_type&>(*(base::current)));
708    }
709
710    virtual VALUE setValue( const VALUE& v )
711    {
712      bool tmp = *base::current;
713      if ( asval( v, tmp ) )
714	{
715	  *base::current = tmp;
716	  return v;
717	}
718      return Qnil;
719    }
720
721    Iterator *dup() const
722    {
723      return new self_type(*this);
724    }
725
726  };
727
728  /* Partial specialization for bools which don't allow de-referencing */
729  template< typename InOutIterator, typename FromOper, typename AsvalOper >
730  class IteratorClosed_T< InOutIterator, bool, FromOper, AsvalOper > :
731    public Iterator_T<InOutIterator>
732  {
733  public:
734    FromOper   from;
735    AsvalOper asval;
736    typedef InOutIterator nonconst_iter;
737    typedef bool value_type;
738    typedef Iterator_T<nonconst_iter>  base;
739    typedef IteratorClosed_T<InOutIterator, bool, FromOper, AsvalOper> self_type;
740
741  protected:
742    virtual Iterator* advance(ptrdiff_t n)
743    {
744      std::advance( base::current, n );
745      if ( base::current == end )
746	throw stop_iteration();
747      return this;
748    }
749
750  public:
751    IteratorClosed_T(nonconst_iter curr, nonconst_iter first,
752		     nonconst_iter last, VALUE seq = Qnil)
753      : Iterator_T<InOutIterator>(curr, seq), begin(first), end(last)
754    {
755    }
756
757    virtual VALUE value() const {
758      if (base::current == end) {
759	throw stop_iteration();
760      } else {
761	return from(static_cast<const value_type&>(*(base::current)));
762      }
763    }
764
765    virtual VALUE setValue( const VALUE& v )
766    {
767      if (base::current == end)
768	throw stop_iteration();
769
770      bool tmp = *base::current;
771      if ( asval( v, tmp ) )
772	{
773	  *base::current = tmp;
774	  return v;
775	}
776      return Qnil;
777    }
778
779    Iterator *dup() const
780    {
781      return new self_type(*this);
782    }
783
784  private:
785    nonconst_iter begin;
786    nonconst_iter end;
787  };
788
789
790  /**
791   * Helper function used to wrap a bounded const_iterator.  This is to be used in
792   * a %typemap(out), for example.
793   *
794   */
795  template<typename InOutIter>
796  inline Iterator*
797  make_nonconst_iterator(const InOutIter& current, const InOutIter& begin,
798			 const InOutIter& end, VALUE seq = Qnil)
799  {
800    return new IteratorClosed_T<InOutIter>(current, begin, end, seq);
801  }
802
803  /**
804   * Helper function used to wrap an unbounded const_iterator.  This is to be used in
805   * a %typemap(out), for example.
806   *
807   */
808  template<typename InOutIter>
809  inline Iterator*
810  make_nonconst_iterator(const InOutIter& current, VALUE seq = Qnil)
811  {
812    return new IteratorOpen_T<InOutIter>(current, seq);
813  }
814
815  /**
816   * Helper function used to wrap a bounded const_iterator.  This is to be used in
817   * a %typemap(out), for example.
818   *
819   */
820  template<typename OutIter>
821  inline ConstIterator*
822  make_const_iterator(const OutIter& current, const OutIter& begin,
823                       const OutIter& end, VALUE seq = Qnil)
824  {
825    return new ConstIteratorClosed_T<OutIter>(current, begin, end, seq);
826  }
827
828  /**
829   * Helper function used to wrap an unbounded const_iterator.  This is to be used in
830   * a %typemap(out), for example.
831   *
832   */
833  template<typename OutIter>
834  inline ConstIterator*
835  make_const_iterator(const OutIter& current, VALUE seq = Qnil)
836  {
837    return new ConstIteratorOpen_T<OutIter>(current, seq);
838  }
839}
840}
841
842
843%fragment("ConstIterator");
844
845
846//
847// This part is just so SWIG is aware of the base abstract iterator class.
848//
849namespace swig
850{
851  /*
852    Throw a StopIteration exception
853  */
854  %ignore stop_iteration;
855  struct stop_iteration {};
856
857  %typemap(throws) stop_iteration {
858    (void)$1;
859    SWIG_Ruby_ExceptionType(NULL, Qnil);
860    SWIG_fail;
861  }
862
863  /*
864     Mark methods that return new objects
865  */
866  %newobject ConstIterator::dup;
867  %newobject ConstIterator::operator + (ptrdiff_t n) const;
868  %newobject ConstIterator::operator - (ptrdiff_t n) const;
869
870  %nodirector ConstIterator;
871
872  %catches(swig::stop_iteration)  ConstIterator::value() const;
873  %catches(swig::stop_iteration)  ConstIterator::incr(size_t n = 1);
874  %catches(swig::stop_iteration)  ConstIterator::decr(size_t n = 1);
875  %catches(std::invalid_argument) ConstIterator::distance(const ConstIterator &x) const;
876  %catches(std::invalid_argument) ConstIterator::equal (const ConstIterator &x) const;
877  %catches(swig::stop_iteration)  ConstIterator::next();
878  %catches(swig::stop_iteration)  ConstIterator::previous();
879  %catches(swig::stop_iteration)  ConstIterator::advance(ptrdiff_t n);
880  %catches(swig::stop_iteration)  ConstIterator::operator += (ptrdiff_t n);
881  %catches(swig::stop_iteration)  ConstIterator::operator -= (ptrdiff_t n);
882  %catches(swig::stop_iteration)  ConstIterator::operator + (ptrdiff_t n) const;
883  %catches(swig::stop_iteration)  ConstIterator::operator - (ptrdiff_t n) const;
884
885
886  struct ConstIterator
887  {
888  protected:
889    ConstIterator(VALUE seq);
890
891  public:
892    virtual ~ConstIterator();
893
894    // Access iterator method, required by Ruby
895    virtual VALUE value() const;
896
897    // C++ common/needed methods
898    virtual ConstIterator *dup() const;
899
900    virtual VALUE inspect()    const;
901    virtual VALUE to_s()    const;
902
903    virtual ConstIterator* next(size_t n = 1);
904    virtual ConstIterator* previous(size_t n = 1);
905
906    bool operator == (const ConstIterator& x)  const;
907    ConstIterator* operator + (ptrdiff_t n) const;
908    ConstIterator* operator - (ptrdiff_t n) const;
909    ptrdiff_t operator - (const ConstIterator& x) const;
910  };
911
912  struct Iterator : public ConstIterator
913  {
914    %rename("value=") setValue( const VALUE& v );
915    virtual VALUE setValue( const VALUE& v );
916
917    virtual Iterator *dup() const;
918
919    virtual Iterator* next(size_t n = 1);
920    virtual Iterator* previous(size_t n = 1);
921
922    virtual VALUE inspect()    const;
923    virtual VALUE to_s()    const;
924
925    bool operator == (const Iterator& x)  const;
926    Iterator* operator + (ptrdiff_t n) const;
927    Iterator* operator - (ptrdiff_t n) const;
928    ptrdiff_t operator - (const Iterator& x) const;
929  };
930
931}
932
933