Source · fairmq/zeromq/
ZMsg.hheader
1/********************************************************************************2 * Copyright (C) 2023 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *3 * *4 * This software is distributed under the terms of the *5 * GNU Lesser General Public Licence (LGPL) version 3, *6 * copied verbatim in the file "LICENSE" *7 ********************************************************************************/8 9#ifndef FAIR_MQ_ZMQ_ZMSG_H10#define FAIR_MQ_ZMQ_ZMSG_H11 12#include <cstddef> // for std::size_t13#include <fairmq/Error.h> // for assertm14#include <new> // for std::bad_alloc15#include <zmq.h> // for zmq_*16 17namespace fair::mq::zmq {18 19// Wraps a `zmq_msg_t` C object as a C++ type:20// * `zmq_msg_init` -> C++ default ctor21// * `zmq_msg_init_size` -> C++ ctor22// * `zmq_msg_init_data` -> C++ ctor23// * `zmq_msg_init_size` + `memcpy` -> C++ copy ctor24// * `zmq_msg_close` + `zmq_msg_init_size` + `memcpy` -> C++ copy assignment25// * `zmq_msg_init` + `zmq_msg_move`` -> C++ move ctor26// * `zmq_msg_move` -> C++ move assignment27// * `zmq_msg_close` -> C++ dtor28// * access the underlying `zmq_msg_t` via `Msg() [const] -> zmq_msg_t*`29// the const overload does a `const_cast<zmq_msg_t*>`, because the30// C interfaces do not model constness31// * `zmq_msg_data` -> `Data() -> void*`32// * `zmq_msg_size` -> `Size() -> std::size_t`33struct ZMsg34{35 ZMsg() noexcept36 {37 [[maybe_unused]] auto const rc = zmq_msg_init(Msg());38 assertm(rc == 0, "msg init successful"); // NOLINT39 }40 explicit ZMsg(std::size_t size)41 {42 auto const rc = zmq_msg_init_size(Msg(), size);43 if (rc == -1) {44 throw std::bad_alloc{};45 }46 }47 explicit ZMsg(void* data,48 std::size_t size,49 zmq_free_fn* freefn = nullptr,50 void* hint = nullptr)51 {52 auto const rc = zmq_msg_init_data(Msg(), data, size, freefn, hint);53 if (rc == -1) {54 throw std::bad_alloc{};55 }56 }57 ~ZMsg() noexcept58 {59 [[maybe_unused]] auto const rc = zmq_msg_close(Msg());60 assertm(rc == 0, "msg close successful"); // NOLINT61 }62 ZMsg(const ZMsg& other) = delete;63 ZMsg(ZMsg&& other) noexcept64 {65 [[maybe_unused]] auto rc = zmq_msg_init(Msg());66 assertm(rc == 0, "msg init successful"); // NOLINT67 rc = zmq_msg_move(Msg(), other.Msg());68 assertm(rc == 0, "msg move successful"); // NOLINT69 }70 ZMsg& operator=(const ZMsg& rhs) = delete;71 ZMsg& operator=(ZMsg&& rhs) noexcept72 {73 [[maybe_unused]] auto const rc = zmq_msg_move(Msg(), rhs.Msg());74 assertm(rc == 0, "msg move successful"); // NOLINT75 return *this;76 }77 78 zmq_msg_t* Msg() noexcept { return &fMsg; }79 zmq_msg_t* Msg() const noexcept80 {81 return const_cast<zmq_msg_t*>(&fMsg); // NOLINT(cppcoreguidelines-pro-type-const-cast)82 }83 void* Data() const noexcept { return zmq_msg_data(Msg()); }84 std::size_t Size() const noexcept { return zmq_msg_size(Msg()); }85 86 private:87 zmq_msg_t fMsg{};88};89 90} // namespace fair::mq::zmq91 92#endif /* FAIR_MQ_ZMQ_ZMSG_H */