#ifndef BYTE_BUFFER_HPP_7NOEQO4F #define BYTE_BUFFER_HPP_7NOEQO4F #include #include #include namespace vanetza { typedef std::vector ByteBuffer; /** * Cast byte buffer to a POD object * \param buffer byte buffer containing requested object * \return pointer to object or nullptr if cast is impossible */ template MASK* buffer_cast(ByteBuffer& buffer) { static_assert(std::is_standard_layout::value, "MASK has to be standard layout type"); static_assert(std::is_trivially_copyable::value, "MASK has to be trivially copyable"); static_assert(std::is_object::value, "MASK has to be an object"); MASK* mask = nullptr; if (sizeof(MASK) <= buffer.size()) { mask = reinterpret_cast(&buffer[0]); } return mask; } template const MASK* buffer_cast(const ByteBuffer& buffer) { // const_cast is safe, const qualifier is added to return type return buffer_cast(const_cast(buffer)); } /** * Create byte buffer with copy of POD object * \param obj POD object * \return ByteBuffer object with copy */ template ByteBuffer buffer_copy(const T& object) { static_assert(std::is_standard_layout::value, "T has to be standard layout type"); auto ptr = reinterpret_cast(&object); return ByteBuffer(ptr, ptr + sizeof(T)); } } // namespace vanetza #endif /* BYTE_BUFFER_HPP_7NOEQO4F */