/******************************************************************************** * Copyright (C) 2014 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH * * * * This software is distributed under the terms of the * * GNU Lesser General Public Licence version 3 (LGPL) version 3, * * copied verbatim in the file "LICENSE" * ********************************************************************************/ #ifndef FAIRMQPARTS_H_ #define FAIRMQPARTS_H_ #include "FairMQTransportFactory.h" #include "FairMQMessage.h" #include #include // unique_ptr /// FairMQParts is a lightweight convenience wrapper around a vector of unique pointers to FairMQMessage, used for sending multi-part messages class FairMQParts { private: using container = std::vector>; public: /// Default constructor FairMQParts() : fParts() {}; /// Copy Constructor FairMQParts(const FairMQParts&) = delete; /// Move constructor FairMQParts(FairMQParts&& p) = default; /// Assignment operator FairMQParts& operator=(const FairMQParts&) = delete; /// Default destructor ~FairMQParts() {}; /// Adds part (FairMQMessage) to the container /// @param msg message pointer (for example created with NewMessage() method of FairMQDevice) void AddPart(FairMQMessage* msg) { 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) void AddPart(std::unique_ptr&& msg) { fParts.push_back(std::move(msg)); } /// Get reference to part in the container at index (without bounds check) /// @param index container index FairMQMessage& operator[](const int index) { return *(fParts[index]); } /// Get reference to unique pointer to part in the container at index (with bounds check) /// @param index container index std::unique_ptr& At(const int index) { return fParts.at(index); } // ref version FairMQMessage& AtRef(const int index) { return *(fParts.at(index)); } /// Get number of parts in the container /// @return number of parts in the container int Size() const { return fParts.size(); } container fParts; // forward container iterators using iterator = container::iterator; using const_iterator = container::const_iterator; auto begin() -> decltype(fParts.begin()) { return fParts.begin(); } auto end() -> decltype(fParts.end()) { return fParts.end(); } auto cbegin() -> decltype(fParts.cbegin()) { return fParts.cbegin(); } auto cend() -> decltype(fParts.cend()) { return fParts.cend(); } }; #endif /* FAIRMQPARTS_H_ */