#ifndef NBTMODIFIER_NBT_PAYLOAD_ABSTRACTNUMERIC_H #define NBTMODIFIER_NBT_PAYLOAD_ABSTRACTNUMERIC_H #include #include "IPayload.h" namespace NBT { namespace Payload { /** * NBT "numeric" payload (Byte, Short, Int, Long, Float, Double) */ template class AbstractNumeric : public IPayload { static_assert( std::is_same::value || std::is_same::value || std::is_same::value || std::is_same::value || std::is_same::value || std::is_same::value, "The \"AbstractNumeric\" payload must be type of qint8 (Byte), qint16 (Short), qint32 (Int), qint64 (Long), float or double" ); public: /** * New payload * * @param value The payload value */ AbstractNumeric (T const value = 0); /** * The payload value * * @return The payload value */ const T value () const; /** * Change the payload value * * @param value The new value */ void setValue (T const value); virtual void readFromData (QDataStream &stream) override; virtual void writeToData (QDataStream &stream) const override; private: T m_value; }; #define IMPLEMENTS_ABSTRACTNUMERIC(className, templateType, id) class className : public AbstractNumeric { virtual inline quint8 const ID () const override { return id; } }; IMPLEMENTS_ABSTRACTNUMERIC(Byte, qint8, 1) IMPLEMENTS_ABSTRACTNUMERIC(Short, qint16, 2) IMPLEMENTS_ABSTRACTNUMERIC(Int, qint32, 3) IMPLEMENTS_ABSTRACTNUMERIC(Long, qint64, 4) IMPLEMENTS_ABSTRACTNUMERIC(Float, float, 5) IMPLEMENTS_ABSTRACTNUMERIC(Double, double, 6) } } #include "AbstractNumeric.tpp" #endif //NBTMODIFIER_NBT_PAYLOAD_ABSTRACTNUMERIC_H