IAP GITLAB

Skip to content
Snippets Groups Projects
StackIterator.h 2.19 KiB
#ifndef _include_StackIterator_h__
#define _include_StackIterator_h__

#include <iostream>
#include <iomanip>

namespace stack {

  template<class Stack, class Particle> class StackIteratorInfo;

  /**
     The main interface to iterator over objects on a stack. 
   */
  
  template<typename Stack, typename Particle>
    class StackIterator : public Particle
  {
    friend Stack;
    friend Particle;
    friend StackIteratorInfo<Stack,Particle>;
    
  private:
    int fIndex;
    
    //#warning stacks should not be copied because of this:
    Stack* fData;
    
  public:
    StackIterator() : fData(0), fIndex(0) { }
    StackIterator(Stack& data, const int index) : fData(&data), fIndex(index) { }
    StackIterator(const StackIterator& mit) : fData(mit.fData), fIndex(mit.fIndex) { }
    
    StackIterator& operator++() { ++fIndex; return *this; }
    StackIterator operator++(int) { StackIterator tmp(*this); ++fIndex; return tmp; }
    bool operator==(const StackIterator& rhs) { return fIndex == rhs.fIndex; }
    bool operator!=(const StackIterator& rhs) { return fIndex != rhs.fIndex; }
    
    StackIterator& operator*() { return *this; }
    const StackIterator& operator*() const { return *this; }
    
  protected:
    int GetIndex() const { return fIndex; }
    Stack& GetStack() { return *fData; }
    const Stack& GetStack() const { return *fData; }
    
    inline StackIterator<Stack,Particle>& base_ref() { return static_cast<StackIterator<Stack, Particle>&>(*this); }
    inline const StackIterator<Stack,Particle>& base_ref() const { return static_cast<const StackIterator<Stack, Particle>&>(*this); }
  };
  
  
  /**
     Internal helper class for StackIterator     
   */
  
  template<class _Stack, class Particle>
    class StackIteratorInfo {
    
    friend Particle;  
  private:
    StackIteratorInfo() {}
    
  protected:
    inline _Stack& Stack() { return static_cast<StackIterator<_Stack, Particle>*>(this)->GetStack(); }
    inline int Index() const { return static_cast<const StackIterator<_Stack, Particle>*>(this)->GetIndex(); }
    inline const _Stack& Stack() const { return static_cast<const StackIterator<_Stack, Particle>*>(this)->GetStack(); }
  };

} // end namespace stack
  
#endif