#ifndef __JDAQEVENT_IO__
#define __JDAQEVENT_IO__

#include "km3net-dataformat/online/JDAQEvent.hh"

#include "JIO/JSerialisable.hh"
#include "JIO/JSTDIO.hh"

#include "JDAQ/JDAQSizeof.hh"
#include "JDAQ/JDAQPreambleIO.hh"
#include "JDAQ/JDAQEventHeaderIO.hh"
#include "JDAQ/JDAQKeyHitIO.hh"
#include "JDAQ/JDAQTriggeredHitIO.hh"

/**
 * \author mdejong
 */
namespace KM3NETDAQ {

  /**
   * Get size of object.
   *
   * \param  object        DAQ event
   * \return               number of bytes
   */
  inline size_t getSizeof(const JDAQEvent& object)
  { 
    return (getSizeof<JDAQPreamble>()                                          +
	    sizeof(Version_t)                                                  +
	    getSizeof<JDAQEventHeader>()                                       +
	    getSizeof(static_cast<const JDAQEvent&>(object).triggeredHits)     +
	    getSizeof(static_cast<const JDAQEvent&>(object).snapshotHits));
  }


  /**
   * Read DAQ event from input.
   *
   * \param  in             reader
   * \param  object         DAQ event
   * \return                reader
   */
  inline JReader& operator>>(JReader& in, JDAQEvent& object)
  {
    Version_t version;

    in >> static_cast<JDAQPreamble&>   (object);
    in >> version;
    in >> static_cast<JDAQEventHeader&>(object);
    in >> object.triggeredHits;
    in >> object.snapshotHits;
       
    return in;
  }


  /**
   * Write DAQ event to output.
   *
   * \param  out           writer
   * \param  object        DAQ event
   * \return               writer
   */
  inline JWriter& operator<<(JWriter& out, const JDAQEvent& object)
  {
    out << JDAQPreamble::getDAQPreamble(object);
    out << JDAQEvent::Class_Version();
    out << static_cast<const JDAQEventHeader&>(object);
    out << object.triggeredHits;
    out << object.snapshotHits;

    return out;
  }
}

#endif