diff --git a/examples/multipart/CMakeLists.txt b/examples/multipart/CMakeLists.txt index 1fa0e960..160ac71e 100644 --- a/examples/multipart/CMakeLists.txt +++ b/examples/multipart/CMakeLists.txt @@ -32,15 +32,15 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/fairmq-start-ex-multipart.sh.in ${CMA configure_file(${CMAKE_CURRENT_SOURCE_DIR}/test-ex-multipart.sh.in ${CMAKE_CURRENT_BINARY_DIR}/test-ex-multipart.sh) add_test(NAME Example.Multipart.zeromq COMMAND ${CMAKE_CURRENT_BINARY_DIR}/test-ex-multipart.sh zeromq) -set_tests_properties(Example.Multipart.zeromq PROPERTIES TIMEOUT "30" RUN_SERIAL true PASS_REGULAR_EXPRESSION "Received message with 2 parts") +set_tests_properties(Example.Multipart.zeromq PROPERTIES TIMEOUT "30" RUN_SERIAL true PASS_REGULAR_EXPRESSION "Received message with 5 parts") if(BUILD_NANOMSG_TRANSPORT) add_test(NAME Example.Multipart.nanomsg COMMAND ${CMAKE_CURRENT_BINARY_DIR}/test-ex-multipart.sh nanomsg) - set_tests_properties(Example.Multipart.nanomsg PROPERTIES TIMEOUT "30" RUN_SERIAL true PASS_REGULAR_EXPRESSION "Received message with 2 parts") + set_tests_properties(Example.Multipart.nanomsg PROPERTIES TIMEOUT "30" RUN_SERIAL true PASS_REGULAR_EXPRESSION "Received message with 5 parts") endif() add_test(NAME Example.Multipart.shmem COMMAND ${CMAKE_CURRENT_BINARY_DIR}/test-ex-multipart.sh shmem) -set_tests_properties(Example.Multipart.shmem PROPERTIES TIMEOUT "30" RUN_SERIAL true PASS_REGULAR_EXPRESSION "Received message with 2 parts") +set_tests_properties(Example.Multipart.shmem PROPERTIES TIMEOUT "30" RUN_SERIAL true PASS_REGULAR_EXPRESSION "Received message with 5 parts") # install diff --git a/examples/multipart/Sampler.cxx b/examples/multipart/Sampler.cxx index 8c61f36b..3ebecc5b 100644 --- a/examples/multipart/Sampler.cxx +++ b/examples/multipart/Sampler.cxx @@ -53,6 +53,13 @@ bool Sampler::ConditionalRun() parts.AddPart(NewSimpleMessage(header)); parts.AddPart(NewMessage(1000)); + // create more data parts, testing the FairMQParts in-place constructor + FairMQParts auxData{ NewMessage(500), NewMessage(600), NewMessage(700) }; + assert(auxData.Size() == 3); + parts.AddPart(std::move(auxData)); + assert(auxData.Size() == 0); + assert(parts.Size() == 5); + LOG(info) << "Sending body of size: " << parts.At(1)->GetSize(); Send(parts, "data"); @@ -74,4 +81,4 @@ Sampler::~Sampler() { } -} // namespace example_multipart \ No newline at end of file +} // namespace example_multipart diff --git a/fairmq/FairMQParts.h b/fairmq/FairMQParts.h index 1ae08d47..8cb7c212 100644 --- a/fairmq/FairMQParts.h +++ b/fairmq/FairMQParts.h @@ -31,6 +31,9 @@ class FairMQParts FairMQParts(FairMQParts&& p) = default; /// Assignment operator FairMQParts& operator=(const FairMQParts&) = delete; + /// Constructor from argument pack of std::unique_ptr rvalues + template + FairMQParts(Ts&&... messages) : fParts() {AddPart(std::forward(messages)...);} /// Default destructor ~FairMQParts() {}; @@ -41,14 +44,6 @@ class FairMQParts fParts.push_back(std::unique_ptr(msg)); } - /// Adds part (std::unique_ptr&) to the container (move) - /// @param msg unique pointer to FairMQMessage - /// lvalue ref (move not required when passing argument) - // inline void AddPart(std::unique_ptr& msg) - // { - // fParts.push_back(std::move(msg)); - // } - /// Adds part (std::unique_ptr&) to the container (move) /// @param msg unique pointer to FairMQMessage /// rvalue ref (move required when passing argument) @@ -57,6 +52,23 @@ class FairMQParts fParts.push_back(std::move(msg)); } + /// Add variable list of parts to the container (move) + template + void AddPart(std::unique_ptr&& first, Ts&&... remaining) + { + AddPart(std::move(first)); + AddPart(std::forward(remaining)...); + } + + /// Add content of another object by move + void AddPart(FairMQParts&& other) + { + container parts = std::move(other.fParts); + for (auto& part : parts) { + fParts.push_back(std::move(part)); + } + } + /// Get reference to part in the container at index (without bounds check) /// @param index container index FairMQMessage& operator[](const int index) { return *(fParts[index]); }