Skip to content

Source · fairmq/zeromq/

ZMsg.hheader

fairmq/zeromq/ZMsg.h92 lines · C++GitHub ↗
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 */