Commit 994385fb authored by Dominik Charousset's avatar Dominik Charousset

Support appending tuples in message builder

parent 858cd36d
......@@ -22,8 +22,8 @@
#include <vector>
#include "caf/fwd.hpp"
#include "caf/make_message.hpp"
#include "caf/message.hpp"
#include "caf/message_handler.hpp"
#include "caf/type_erased_value.hpp"
namespace caf {
......@@ -76,6 +76,27 @@ public:
return append_all(std::forward<Ts>(xs)...);
}
template <size_t N, class... Ts>
message_builder& append_tuple(std::integral_constant<size_t, N>,
std::integral_constant<size_t, N>,
std::tuple<Ts...>&) {
// end of recursion
}
template <size_t I, size_t N, class... Ts>
message_builder& append_tuple(std::integral_constant<size_t, I>,
std::integral_constant<size_t, N> e,
std::tuple<Ts...>& xs) {
append(std::move(std::get<I>(xs)));
append_tuple(std::integral_constant<size_t, I + 1>{}, e, xs);
}
template <class... Ts>
message_builder& append_tuple(std::tuple<Ts...> xs) {
append_tuple(std::integral_constant<size_t, 0>{},
std::integral_constant<size_t, sizeof...(Ts)>{}, xs);
}
/// Converts the buffer to an actual message object without
/// invalidating this message builder (nor clearing it).
message to_message() const;
......@@ -87,9 +108,7 @@ public:
message move_to_message();
/// @copydoc message::extract
inline message extract(message_handler f) const {
return to_message().extract(std::move(f));
}
message extract(message_handler f) const;
/// @copydoc message::extract_opts
inline message::cli_res extract_opts(std::vector<message::cli_arg> xs,
......
......@@ -67,10 +67,15 @@ message message_builder::to_message() const {
message message_builder::move_to_message() {
message result;
result.vals().reset(static_cast<detail::dynamic_message_data*>(data_.detach()), false);
using pointer = detail::dynamic_message_data*;
result.vals().reset(static_cast<pointer>(data_.detach()), false);
return result;
}
message message_builder::extract(message_handler f) const {
return to_message().extract(std::move(f));
}
optional<message> message_builder::apply(message_handler handler) {
// avoid detaching of data_ by moving the data to a message object,
// calling message::apply and moving the data back
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment