From 8eb457bf8004554d0077b03d4e23e021fa430426 Mon Sep 17 00:00:00 2001 From: Pavel Orekhov Date: Thu, 25 Jan 2018 17:39:41 +0300 Subject: [PATCH] * add message::append() method * add message::operator<< for message (AKA append) and for frame * tests for new methods * fix indent --- src/tests/test_message.cpp | 75 ++++++++++++++++++++++++++++++++++++++ src/zmqpp/message.cpp | 18 ++++++--- src/zmqpp/message.hpp | 21 +++++++++++ 3 files changed, 109 insertions(+), 5 deletions(-) diff --git a/src/tests/test_message.cpp b/src/tests/test_message.cpp index 488dce16..50f2ab7c 100644 --- a/src/tests/test_message.cpp +++ b/src/tests/test_message.cpp @@ -136,6 +136,52 @@ BOOST_AUTO_TEST_CASE( copyable ) BOOST_CHECK_EQUAL("string", second.get(0)); } +BOOST_AUTO_TEST_CASE( append_all ) +{ + zmqpp::message second; + second.add("second"); + BOOST_CHECK_EQUAL(1, second.parts()); + + { + zmqpp::message first; + first.add("string"); + first.add("string2"); + first.add("string3"); + BOOST_CHECK_EQUAL(3, first.parts()); + + second.append(first); + } + + BOOST_REQUIRE_EQUAL(4, second.parts()); + BOOST_CHECK_EQUAL(strlen("second"), second.size(0)); + BOOST_CHECK_EQUAL("second", second.get(0)); + BOOST_CHECK_EQUAL("string", second.get(1)); + BOOST_CHECK_EQUAL("string2", second.get(2)); + BOOST_CHECK_EQUAL("string3", second.get(3)); +} + +BOOST_AUTO_TEST_CASE( append_partial ) +{ + zmqpp::message second; + second.add("second"); + BOOST_CHECK_EQUAL(1, second.parts()); + + { + zmqpp::message first; + first.add("string"); + first.add("string2"); + first.add("string3"); + BOOST_CHECK_EQUAL(3, first.parts()); + + second.append(first,1,2); + } + + BOOST_REQUIRE_EQUAL(2, second.parts()); + BOOST_CHECK_EQUAL(strlen("second"), second.size(0)); + BOOST_CHECK_EQUAL("second", second.get(0)); + BOOST_CHECK_EQUAL("string2", second.get(1)); +} + #ifndef ZMQPP_IGNORE_LAMBDA_FUNCTION_TESTS BOOST_AUTO_TEST_CASE( move_part ) { @@ -365,6 +411,35 @@ BOOST_AUTO_TEST_CASE( stream_copy_input_string ) BOOST_CHECK_EQUAL("test part", message.get(0)); } +BOOST_AUTO_TEST_CASE( stream_copy_input_message ) +{ + zmqpp::message message("test msg1", "test msg1.2"); + zmqpp::message message2("test msg2", "test msg2.1"); + + message << message2; + + BOOST_REQUIRE_EQUAL(4, message.parts()); + BOOST_CHECK_EQUAL(strlen("test msg1"), message.size(0)); + BOOST_CHECK_EQUAL("test msg1", message.get(0)); + BOOST_CHECK_EQUAL("test msg1.2", message.get(1)); + BOOST_CHECK_EQUAL("test msg2", message.get(2)); + BOOST_CHECK_EQUAL("test msg2.1", message.get(3)); +} + +BOOST_AUTO_TEST_CASE( stream_copy_input_frame ) +{ + zmqpp::message message("test msg1", "test msg1.2"); + zmqpp::frame aframe("test msg2.1",strlen("test msg2.1")); + + message << aframe; + + BOOST_REQUIRE_EQUAL(3, message.parts()); + BOOST_CHECK_EQUAL(strlen("test msg1"), message.size(0)); + BOOST_CHECK_EQUAL("test msg1", message.get(0)); + BOOST_CHECK_EQUAL("test msg1.2", message.get(1)); + BOOST_CHECK_EQUAL("test msg2.1", message.get(2)); +} + BOOST_AUTO_TEST_CASE( stream_multiple_parts ) { zmqpp::message message; diff --git a/src/zmqpp/message.cpp b/src/zmqpp/message.cpp index e0e13f80..51152497 100644 --- a/src/zmqpp/message.cpp +++ b/src/zmqpp/message.cpp @@ -152,11 +152,11 @@ void message::get(int64_t& integer, size_t const part) const void message::get(signal &sig, size_t const part) const { - assert(sizeof(signal) == size(part)); - int64_t v; - get(v, part); - - sig = static_cast(v); + assert(sizeof(signal) == size(part)); + int64_t v; + get(v, part); + + sig = static_cast(v); } void message::get(uint8_t& unsigned_integer, size_t const part) const @@ -466,6 +466,14 @@ void message::copy(message const& source) //_strings = source._strings } +void message::append(message const& source, size_t from, size_t to) +{ + if(to == 0) to = source.parts(); + _parts.reserve( _parts.size() + to - from ); + for(size_t part=from; partcopy() ); + } + // Use exact data past, neither zmqpp nor 0mq will copy, alter or delete // this data. It must remain as valid for at least the lifetime of the // 0mq message, recommended only with const data. @@ -266,6 +272,17 @@ class ZMQPP_EXPORT message message& operator<<(char const* c_string); message& operator<<(std::string const& string); + message& operator<<(frame const& c_frame) + { + add_raw(c_frame.data(), c_frame.size()); + return *this; + } + message& operator<<(message const& c_message) + { + append(c_message); + return *this; + } + // Queue manipulation void push_front(void const* part, size_t const size); @@ -313,6 +330,10 @@ class ZMQPP_EXPORT message message copy() const; void copy(message const& source); + // Append (like copy) frames[from..to-1] of source to self + // to == 0 -- append till end + void append(message const& source, size_t from = 0, size_t to = 0); + // Used for internal tracking void sent(size_t const part);