From 72f0e1bcba34d826d667cb1311b48fe4c5130cc6 Mon Sep 17 00:00:00 2001 From: Gudmundur Adalsteinsson Date: Wed, 3 Apr 2019 13:56:11 +0000 Subject: [PATCH] Problem: message_t move and copy are mutating but take const Solution: Deprecate old functions and add overloads taking non-const references --- tests/message.cpp | 17 ++++++++++++++++- zmq.hpp | 16 ++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/tests/message.cpp b/tests/message.cpp index 693e607e..9dc9d388 100644 --- a/tests/message.cpp +++ b/tests/message.cpp @@ -150,7 +150,22 @@ TEST_CASE("message is shared", "[message]") size_t msg_sz = 1024; // large enough to be a type_lmsg zmq::message_t msg1(msg_sz); zmq::message_t msg2; - msg2.copy(&msg1); + msg2.copy(msg1); + CHECK(msg1.get(ZMQ_SHARED) == 1); CHECK(msg2.get(ZMQ_SHARED) == 1); + CHECK(msg1.size() == msg_sz); + CHECK(msg2.size() == msg_sz); +} + +TEST_CASE("message move is not shared", "[message]") +{ + size_t msg_sz = 1024; // large enough to be a type_lmsg + zmq::message_t msg1(msg_sz); + zmq::message_t msg2; + msg2.move(msg1); + CHECK(msg1.get(ZMQ_SHARED) == 0); + CHECK(msg2.get(ZMQ_SHARED) == 0); + CHECK(msg2.size() == msg_sz); + CHECK(msg1.size() == 0); } #endif diff --git a/zmq.hpp b/zmq.hpp index fc3b8849..95ddae13 100644 --- a/zmq.hpp +++ b/zmq.hpp @@ -335,6 +335,7 @@ class message_t throw error_t(); } + ZMQ_DEPRECATED("from 4.3.1, use move taking non-const reference instead") void move(message_t const *msg_) { int rc = zmq_msg_move(&msg, const_cast(&(msg_->msg))); @@ -342,6 +343,14 @@ class message_t throw error_t(); } + void move(message_t &msg_) + { + int rc = zmq_msg_move(&msg, &msg_.msg); + if (rc != 0) + throw error_t(); + } + + ZMQ_DEPRECATED("from 4.3.1, use copy taking non-const reference instead") void copy(message_t const *msg_) { int rc = zmq_msg_copy(&msg, const_cast(&(msg_->msg))); @@ -349,6 +358,13 @@ class message_t throw error_t(); } + void copy(message_t &msg_) + { + int rc = zmq_msg_copy(&msg, &msg_.msg); + if (rc != 0) + throw error_t(); + } + bool more() const ZMQ_NOTHROW { int rc = zmq_msg_more(const_cast(&msg));