Skip to content

Commit 9d9642c

Browse files
committed
client: use universal reference in data decoder
Our MsgPack decoder allows to pass rvalue reference - it is needed to use tags like `mpp::as_raw` or handy `std::forward_as_tuple` helper. However, we accept only lvalues in the data decoder, hence, client cannot use those features of MsgPack decoder. Let's accept universal reference instead to accept both lvalues and rvalues in client data decoder - do not forget to use `std::forward` for perfect passing. Closes #106
1 parent f8e2cee commit 9d9642c

File tree

2 files changed

+13
-2
lines changed

2 files changed

+13
-2
lines changed

src/Client/ResponseReader.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,10 +102,10 @@ struct Data {
102102

103103
/** Unpacks tuples to passed container. */
104104
template<class T>
105-
bool decode(T& tuples)
105+
bool decode(T&& tuples)
106106
{
107107
it_t itr = iters.first;
108-
bool ok = mpp::decode(itr, tuples);
108+
bool ok = mpp::decode(itr, std::forward<T>(tuples));
109109
assert(!ok || itr == iters.second);
110110
return ok;
111111
}

test/ClientTest.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1125,6 +1125,17 @@ response_decoding(Connector<BUFFER, NetProvider> &client)
11251125
fail_if(response->body.data->decode(arr_of_str));
11261126
/* We should successfully decode data after all. */
11271127
fail_unless(response->body.data->decode(arr_of_num));
1128+
fail_unless(std::get<0>(arr_of_num) == 666);
1129+
1130+
TEST_CASE("decode data to rvalue object");
1131+
num = 0;
1132+
fail_unless(response->body.data->decode(std::forward_as_tuple(num)));
1133+
fail_unless(num == 666);
1134+
1135+
TEST_CASE("decode data to object with an mpp tag");
1136+
std::get<0>(arr_of_num) = 0;
1137+
fail_unless(response->body.data->decode(mpp::as_arr(arr_of_num)));
1138+
fail_unless(std::get<0>(arr_of_num) == 666);
11281139

11291140
client.close(conn);
11301141
}

0 commit comments

Comments
 (0)