Skip to content

Commit

Permalink
* add message::append() method
Browse files Browse the repository at this point in the history
* add message::operator<< for message (AKA append) and for frame
* tests for new methods
* fix indent
  • Loading branch information
Pavel Orekhov authored and Pavel Orekhov committed Jan 25, 2018
1 parent 0b90458 commit 8eb457b
Show file tree
Hide file tree
Showing 3 changed files with 109 additions and 5 deletions.
75 changes: 75 additions & 0 deletions src/tests/test_message.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 )
{
Expand Down Expand Up @@ -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;
Expand Down
18 changes: 13 additions & 5 deletions src/zmqpp/message.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<signal>(v);
assert(sizeof(signal) == size(part));
int64_t v;
get(v, part);

sig = static_cast<signal>(v);
}

void message::get(uint8_t& unsigned_integer, size_t const part) const
Expand Down Expand Up @@ -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; part<to; ++part)
push_back(source.raw_data(part), source.size(part));
}

// Used for internal tracking
void message::sent(size_t const part)
{
Expand Down
21 changes: 21 additions & 0 deletions src/zmqpp/message.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,12 @@ class ZMQPP_EXPORT message
_parts.push_back( frame( part, data_size ) );
}

//specialization for common add_raw. Add copy
void add_raw(frame const *a_frame)
{
_parts.push_back( a_frame->copy() );
}

// 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.
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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);

Expand Down

0 comments on commit 8eb457b

Please sign in to comment.