Program Listing for File IteratorCompound.h

Program Listing for File IteratorCompound.h#

Return to documentation for file (src/util/support/IteratorCompound.h)

#ifndef ITERATORS_COMPOUND
#define ITERATORS_COMPOUND

template <class T, class TU, class Iterator, class Select>
class SelectIterator
{
  Iterator iter;
  Select sel;
  void SetIterator()
   {
     while (!iter.ReachEnd() && !sel(iter.Current()) )
       iter.Advance();
   }
 public:
  SelectIterator( Iterator it, const Select& s)
         : iter(it), sel(s) { SetIterator(); }
  SelectIterator( const Iterator& it) : iter(it), sel() { SetIterator(); }
  SelectIterator( const SelectIterator<T,TU,Iterator,Select>& that)
    : iter(that.iter), sel(that.sel) {}
  ~SelectIterator() {}

  void Advance() { iter.Advance(); SetIterator(); }
  void Reset() { iter.Reset(); SetIterator(); }
  T Current() const { return iter.Current(); }
  TU Current() { return iter.Current(); }
  void operator++() { Advance(); }
  void operator++(int) { Advance(); }
//Boolean ReachEnd() const { return iter.ReachEnd(); }
  int ReachEnd() const { return iter.ReachEnd(); }
};

template <class T1, class T2, class Iterator1, class Cross>
class SingleCrossIterator
{
  Iterator1 iter;
  Cross cross;
 public:
  SingleCrossIterator(Iterator1 it, Cross c) : iter(it), cross(c) {}
  SingleCrossIterator(Iterator1 it) : iter(it), cross() {}
  SingleCrossIterator(const SingleCrossIterator& that)
     : iter(that.iter), cross(that.cross)  {}
  T2 Current() const { return cross(iter.Current()); }
  void Reset() { iter.Reset(); }
  void Advance() { iter.Advance(); }
  void operator++() { Advance(); }
  void operator++(int) { Advance(); }
//Boolean ReachEnd() const { return iter.ReachEnd(); }
  int ReachEnd() const { return iter.ReachEnd(); }
};

template <class T, class Iterator1, class Iterator2, class Cross>
class MultiCrossIterator
{
  Iterator1 iter1;
  Iterator2 iter2;
  Cross cross;
  void SetIterator()
   {
     while (!iter1.ReachEnd()) {
      iter2 = cross(iter1.Current());
      if (!iter2.ReachEnd()) break;
      iter1.Advance();
     }
   }

 public:
  MultiCrossIterator( Iterator1 it, Cross c)
     : iter1(it), cross(c) { SetIterator(); }
  MultiCrossIterator( Iterator1 it) : iter1(it),cross() { SetIterator(); }
  MultiCrossIterator( const MultiCrossIterator& that)
      : iter1(that.iter1), iter2(that.iter2), cross(that.cross)
       {  SetIterator(); }
  ~MultiCrossIterator() {}

  void Advance()
   {
     iter2.Advance();
     if (iter2.ReachEnd()) {
       iter1.Advance();
       SetIterator();
     }
   }
  void operator++() { Advance(); }
  void operator++(int) { Advance(); }
  void Reset() { iter1.Reset(); SetIterator(); }
  T Current()  const { return iter2.Current(); }
//Boolean ReachEnd() const { return iter1.ReachEnd() && iter2.ReachEnd(); }
  int ReachEnd() const { return iter1.ReachEnd() && iter2.ReachEnd(); }
};

template <class T, class TU, class Iterator>
class MultiIterator
{
  Iterator iter, next;
 public:
  MultiIterator(Iterator impl1, Iterator impl2)
     : iter(impl1), next(impl2) {}
  MultiIterator(const MultiIterator& that)
     : iter(that.iter), next(that.next) {}
  ~MultiIterator() {}

  void Advance()
     { if (!iter.ReachEnd()) iter.Advance();
       else next.Advance();
     }
  void operator++() { Advance(); }
  void operator++(int) { Advance(); }
  void Reset() { iter.Reset(); next.Reset(); }
  T Current() const
   { return (iter.ReachEnd())? next.Current() : iter.Current(); }
  TU Current() { return (iter.ReachEnd())? next.Current() : iter.Current(); }
//Boolean ReachEnd() const { return iter.ReachEnd() && next.ReachEnd();}
  int ReachEnd() const { return iter.ReachEnd() && next.ReachEnd();}
};

#endif