/* * eth_ecat_packer.hpp * * Created on: Jun 5, 2023 * Author: algin */ #ifndef FREE_RTOS_ETHERNET_INDUSTRY_ETH_ECAT_PACKER_HPP_ #define FREE_RTOS_ETHERNET_INDUSTRY_ETH_ECAT_PACKER_HPP_ #include namespace free_rtos { struct Padding { size_t size; }; struct PackFunctorBase { uint8_t *raw; template void operator()(DataT& data) { DataT *data_p = new(raw) DataT{data}; (void)data_p; raw += sizeof(DataT); } void operator()() { } }; // Функтор для обхода и упаковки элементов custom_tuple struct PackFunctor : public PackFunctorBase { PackFunctor(uint8_t *raw) : PackFunctorBase{raw} { } using PackFunctorBase::operator (); template void operator()(std::vector& data) { size_t size = data.size() * sizeof(DataT); memcpy(raw, data.data(), size); raw += size; } void operator()(Padding& padding) { raw += padding.size; } }; struct UnpackFunctorBase { uint8_t *raw; template void operator()(DataT& data) { DataT *p_data = reinterpret_cast(raw); data = *p_data; raw += sizeof(DataT); } void operator()() { } }; // Функтор для обхода и распаковки элементов custom_tuple struct UnpackFunctor : public UnpackFunctorBase { UnpackFunctor(uint8_t *raw) : UnpackFunctorBase{raw} { } using UnpackFunctorBase::operator (); template void operator()(std::vector& data) { size_t size = data.size() * sizeof(DataT); memcpy(data.data(), raw, size); raw += size; } void operator()(Padding& padding) { raw += padding.size; } }; } #endif /* FREE_RTOS_ETHERNET_INDUSTRY_ETH_ECAT_PACKER_HPP_ */