types: deserialize tuple types from FragmentedView

A part of the transition of deserialize from bytes_view to FragmentedView.
This commit is contained in:
Michał Chojnowski
2020-11-22 02:08:19 +01:00
parent 507883f808
commit 898cea4cde
2 changed files with 22 additions and 6 deletions

View File

@@ -1833,19 +1833,22 @@ static void serialize(const abstract_type& t, const void* value, bytes::iterator
return ::serialize(t, value, out, cql_serialization_format::internal());
}
static data_value deserialize_aux(const tuple_type_impl& t, bytes_view v) {
template <FragmentedView View>
data_value deserialize_aux(const tuple_type_impl& t, View v) {
tuple_type_impl::native_type ret;
ret.reserve(t.all_types().size());
auto ti = t.all_types().begin();
auto vi = tuple_deserializing_iterator::start(v);
while (ti != t.all_types().end() && vi != tuple_deserializing_iterator::finish(v)) {
while (ti != t.all_types().end() && v.size_bytes()) {
data_value obj = data_value::make_null(*ti);
if (*vi) {
obj = (*ti)->deserialize(**vi);
std::optional<View> e = read_tuple_element(v);
if (e) {
// FIXME: don't linearize
with_linearized(*e, [&] (bytes_view bv) {
obj = (*ti)->deserialize(bv);
});
}
ret.push_back(std::move(obj));
++ti;
++vi;
}
while (ti != t.all_types().end()) {
ret.push_back(data_value::make_null(*ti++));
@@ -1853,6 +1856,10 @@ static data_value deserialize_aux(const tuple_type_impl& t, bytes_view v) {
return data_value::make(t.shared_from_this(), std::make_unique<tuple_type_impl::native_type>(std::move(ret)));
}
data_value deserialize_aux(const tuple_type_impl& t, bytes_view v) {
return deserialize_aux(t, single_fragmented_view(v));
}
template<FragmentedView View>
utils::multiprecision_int deserialize_value(const varint_type_impl&, View v) {
bool negative = v.current_fragment().front() < 0;

View File

@@ -93,6 +93,15 @@ private:
}
};
template <FragmentedView View>
std::optional<View> read_tuple_element(View& v) {
auto s = read_simple<int32_t>(v);
if (s < 0) {
return std::nullopt;
}
return read_simple_bytes(v, s);
}
class tuple_type_impl : public concrete_type<std::vector<data_value>> {
using intern = type_interning_helper<tuple_type_impl, std::vector<data_type>>;
protected: