/* Copyright 2013 The MathWorks, Inc. */ #ifndef coder_tgtsvc_Message_hpp #define coder_tgtsvc_Message_hpp #include #include #include #include #include "coder_target_services_spec.h" #include"MessageStorage.hpp" namespace coder { namespace tgtsvc { class CODER_TARGET_SERVICES_EXPORT_CLASS Message : public MessageStorage { public: enum Priority { NORMAL_PRIORITY = 0, HIGH_PRIORITY = 1 }; enum { ABSOLUTE_MINIMUM_PAYLOAD = 48, ABSOLUTE_MAXIMUM_PAYLOAD = 2032 }; Message() {} ~Message() {} void *operator new(size_t size); void operator delete(void *ptr) throw(); void *operator new(size_t size, const std::nothrow_t ¬hrow_value) throw(); void operator delete (void* ptr, const std::nothrow_t& nothrow_constant) throw(); void *operator new(size_t size, void *place) throw() { return ::operator new(size, place); } void operator delete(void *ptr, void *place) throw() { return ::operator delete(ptr, place); } static Message *alloc(uint16_t payloadSize); uint16_t payloadCapacity() const; static uint16_t maxPayloadCapacity(); const MessageHeader &header() const { assert(sizeof(MessageHeader) == 4); const MessageHeader *p = reinterpret_cast(payload() - sizeof(MessageHeader)); assert((reinterpret_cast(p) & 3) == 0); return *p; } MessageHeader &header() { return const_cast(static_cast(this)->header()); } void header(const MessageHeader &h) { MessageHeader &mine = header(); mine = h; } uint16_t payloadSize() const { return header().payloadSize(); } void payloadSize(uint16_t v) { header().payloadSize(v); } uint8_t appId() const { return header().appId(); } void appId(uint8_t v) { header().appId(v); } uint8_t appFun() const { return header().appFun(); } void appFun(uint8_t v) { header().appFun(v); } const uint8_t *payload() const { const uint8_t *ret = reinterpret_cast(this+1); assert((size_t)ret % sizeof(void*) == 0); return ret; } uint8_t *payload() { return const_cast(static_cast(this)->payload()); } uint16_t transmitSize() const { return header().payloadSize() + (uint16_t)sizeof(MessageHeader); } const uint8_t *transmitStart() const { return payload() - sizeof(MessageHeader); } uint8_t *transmitStart() { return const_cast(static_cast(this)->transmitStart()); } static uint16_t memoryNeeded(uint16_t payloadSize) { return sizeof(Message) + payloadSize; } private: void* operator new[] (std::size_t size); void operator delete[] (void* ptr) throw(); void* operator new[] (std::size_t size, const std::nothrow_t& nothrow_value) throw(); void operator delete[] (void* ptr, const std::nothrow_t& nothrow_constant) throw(); void* operator new[] (std::size_t size, void* ptr) throw(); void operator delete[] (void* ptr, void* voidptr2) throw(); }; }} #endif