#pragma once

#include "ROSMessageGroups.h"

//! @brief Abstract base class for all ROS Messages Types.
//!
//! Abstract base class for all ROS Messages Types. This class defines a basic interface
//! every class must fullfill if it takes advantages of the \class ROSJsonFactory.
//! Every class must define the public typedef Group, which associates it to a message Group (\see ROSMessageGroups). The Group type
//! is used by the \class ROSJsonFactory to determine the type of the message it creates. The
//! ROSMessageType belongs to the \struct EmptyGroup. Passing a class belonging to the \struct EmptyGroup to the
//! \class ROSJsonFactory will yield an error.
template <typename StringType>
class ROSMessageType{
public:
    typedef EmptyGroup Group;

    ROSMessageType() {};
    ~ROSMessageType() {};
    // Avoid sliceing (copy with ROSMessage::Clone)!
    ROSMessageType(const ROSMessageType &) = delete;
    ROSMessageType& operator=(const ROSMessageType &) = delete;

    virtual ROSMessageType* Clone() const = 0;
};
