#ifndef __JLANG__JOBJECTREADER__
#define __JLANG__JOBJECTREADER__

#include "JLang/JAbstractObjectReader.hh"
#include "JLang/JSharedPointer.hh"


/**
 * \author mdejong
 */

namespace JLANG {}
namespace JPP { using namespace JLANG; }

namespace JLANG {

  /**
   * Auxiliary class for object reading.
   *
   * This class implements the JAbstractObjectReader interface.
   */
  template<class T>
  struct JObjectReader :
    public virtual JObjectIterator<T>,
    public JAbstractObjectReader<T>,
    public JSharedPointer< JObjectIterator<T> >
  {

    typedef JSharedPointer< JObjectIterator<T> >                 helper_type;
    typedef typename JObjectIterator<T>::pointer_type            pointer_type;

    /**
     * Default constructor.
     */
    JObjectReader()
    {}


    /**
     * Get helper.
     *
     * \return            helper
     */
    virtual JObjectIterator<T>* getHelper() const override 
    {
      return this->get();
    }
  };


  /**
   * Auxiliary class for object reading with rewinding.
   *
   * This class implements the JAbstractRewindableObjectReader interface.
   */
  template<class T>
  struct JRewindableObjectReader :
    public virtual JRewindableObjectIterator<T>,
    public JAbstractRewindableObjectReader<T>,
    public JSharedPointer< JRewindableObjectIterator<T> >
  {

    typedef JSharedPointer< JRewindableObjectIterator<T> >       helper_type;
    typedef typename JObjectIterator<T>::pointer_type            pointer_type;

    /**
     * Default constructor.
     */
    JRewindableObjectReader()
    {}


    /**
     * Get helper.
     *
     * \return            helper
     */
    virtual JRewindableObjectIterator<T>* getHelper() const override 
    {
      return this->get();
    }
  };

  
  /**
   * Auxiliary class for object reading with named access.
   *
   * This class implements the JAbstractAccessibleObjectReader interface.
   */
  template<class T>
  struct JAccessibleObjectReader :
    public virtual JAccessibleObjectIterator<T>,
    public JAbstractAccessibleObjectReader<T>,
    public JSharedPointer< JAccessibleObjectIterator<T> >
  {

    typedef JSharedPointer< JAccessibleObjectIterator<T> >       helper_type;
    typedef typename JObjectIterator<T>::pointer_type            pointer_type;

    /**
     * Default constructor.
     */
    JAccessibleObjectReader()
    {}


    /**
     * Get helper.
     *
     * \return            helper
     */
    virtual JAccessibleObjectIterator<T>* getHelper() const override 
    {
      return this->get();
    }
  };
}

#endif